diff --git a/.gitignore b/.gitignore
index 9a9bbe0aafd..861b69b8be0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ data/
/_maps/map_files/**/*.dmm.backup
/_maps/quicksave/*
/nano/debug.html
+**/__pycache__/*
*.db
stddef.dm
.atom-build.json
diff --git a/.travis.yml b/.travis.yml
index af2cfc45cc9..b52a729c45c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,8 +7,9 @@ git:
env:
global:
- - BYOND_MAJOR="510"
- - BYOND_MINOR="1346"
+ - BYOND_MAJOR="511"
+ - BYOND_MINOR="1380"
+ - BYOND_MACRO_COUNT=2
matrix:
- DM_MAPFILE="cyberiad"
- DM_MAPFILE="metastation"
@@ -29,6 +30,7 @@ before_script:
- chmod +x ./install-byond.sh
- ./install-byond.sh
script:
+ - (num=`grep -E '\\\\(red|blue|green|black|italic|bold|b|i[^mc])' **/*.dm | wc -l`; echo "$num BYOND text macros (expecting ${BYOND_MACRO_COUNT} or fewer)"; [ $num -le ${BYOND_MACRO_COUNT} ])
- source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup
- bash dm.sh -M${DM_MAPFILE} paradise.dme
diff --git a/README.md b/README.md
index 6f8195ab8ea..dade37afd8e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,14 @@
# Paradise
+[](https://travis-ci.org/ParadiseSS13/Paradise)
+[](http://isitmaintained.com/project/paradisess13/paradise "Average time to resolve an issue")
+[](http://isitmaintained.com/project/paradisess13/paradise "Percentage of issues still open")
+[](http://www.krihelinator.xyz)
-[Website](http://www.nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [IRC](http://www.nanotrasen.se/phpBB3/viewtopic.php?f=10&t=1113)
+[](http://forthebadge.com)
+[](http://forthebadge.com)
+[](http://forthebadge.com)
+
+[Website](http://www.nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/gXZMc?utm_source=Discord%20Widget&utm_medium=Connect)
---
diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index 0b450df9848..bd90e0be9f0 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -60,7 +60,7 @@ CREATE TABLE `characters` (
`eyes_blue` smallint(4) NOT NULL,
`underwear` mediumtext NOT NULL,
`undershirt` mediumtext NOT NULL,
- `backbag` smallint(4) NOT NULL,
+ `backbag` mediumtext NOT NULL,
`b_type` varchar(45) NOT NULL,
`alternate_option` smallint(4) NOT NULL,
`job_support_high` mediumint(8) NOT NULL,
@@ -88,6 +88,7 @@ CREATE TABLE `characters` (
`socks` mediumtext NOT NULL,
`body_accessory` mediumtext NOT NULL,
`gear` mediumtext NOT NULL,
+ `autohiss` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -274,6 +275,8 @@ CREATE TABLE `player` (
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
+ `windowflashing` smallint(4) DEFAULT '1',
+ `ghost_anonsay` tinyint(1) NOT NULL DEFAULT '0',
`exp` mediumtext,
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index 2489e6cb325..94010ad1b74 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -60,7 +60,7 @@ CREATE TABLE `SS13_characters` (
`eyes_blue` smallint(4) NOT NULL,
`underwear` mediumtext NOT NULL,
`undershirt` mediumtext NOT NULL,
- `backbag` smallint(4) NOT NULL,
+ `backbag` mediumtext NOT NULL,
`b_type` varchar(45) NOT NULL,
`alternate_option` smallint(4) NOT NULL,
`job_support_high` mediumint(8) NOT NULL,
@@ -88,6 +88,7 @@ CREATE TABLE `SS13_characters` (
`socks` mediumtext NOT NULL,
`body_accessory` mediumtext NOT NULL,
`gear` mediumtext NOT NULL,
+ `autohiss` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -273,6 +274,8 @@ CREATE TABLE `SS13_player` (
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
+ `windowflashing` smallint(4) DEFAULT '1',
+ `ghost_anonsay` tinyint(1) NOT NULL DEFAULT '0',
`exp` mediumtext,
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm
index 434cc79eb52..3e03a5036e7 100644
--- a/_maps/cyberiad.dm
+++ b/_maps/cyberiad.dm
@@ -23,7 +23,7 @@ z7 = empty
#include "map_files\cyberiad\z7.dmm"
#define MAP_FILE "cyberiad.dmm"
- #define MAP_NAME "NSS Cyberiad"
+ #define MAP_NAME "Cyberiad"
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL,STATION_CONTACT,REACHABLE,AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 89a73aceaaf..a7cfe6afb3e 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -1,11 +1,11 @@
"aaa" = (/turf/space,/area/space)
"aab" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_n"; name = "north of station"; width = 18},/turf/space,/area/space)
-"aac" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
+"aac" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
"aad" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
"aae" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"aaf" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"aag" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
-"aah" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
+"aah" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
"aai" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
"aaj" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aak" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -29,7 +29,7 @@
"aaC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aaD" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
"aaE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
-"aaF" = (/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
+"aaF" = (/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
"aaG" = (/obj/structure/closet/syndicate/suits,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aaH" = (/obj/effect/landmark{name = "Syndicate-Uplink"; tag = ""},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aaI" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -54,7 +54,7 @@
"abb" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abc" = (/obj/item/device/radio/intercom/syndicate{pixel_x = -28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abd" = (/obj/structure/grille,/turf/space,/area/space)
-"abe" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/space,/area/space)
+"abe" = (/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space)
"abf" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
"abg" = (/obj/machinery/recharge_station/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abh" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -115,13 +115,13 @@
"ack" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison)
"acl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/twohanded/required/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acm" = (/obj/machinery/biogenerator,/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Prison Hydroponics"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"acn" = (/obj/item/seeds/ambrosiavulgarisseed,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acn" = (/obj/item/seeds/ambrosia,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aco" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prison)
"acp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acr" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"acs" = (/obj/item/seeds/glowshroom,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"act" = (/obj/item/weapon/minihoe,/obj/item/seeds/carrotseed,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acs" = (/obj/item/seeds/glowshroom,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"act" = (/obj/item/weapon/cultivator,/obj/item/seeds/carrot,/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acu" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_2)
"acv" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/pod_2)
"acw" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_2)
@@ -129,7 +129,7 @@
"acy" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_nw"; name = "northwest of SS13"; width = 19},/turf/space,/area/space)
"acz" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating/airless/catwalk,/area/solar/auxport)
"acA" = (/turf/simulated/wall/r_wall,/area/prison/solitary{name = "Prisoner Education Chamber"})
-"acB" = (/obj/item/device/analyzer/plant_analyzer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acB" = (/obj/item/device/plant_analyzer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acD" = (/turf/simulated/floor/plasteel,/area/security/prison)
"acE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
@@ -181,7 +181,7 @@
"ady" = (/obj/structure/table,/obj/structure/bedsheetbin,/obj/structure/window/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/prison)
"adz" = (/turf/simulated/floor/plating,/area/security/prison)
"adA" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/security/prison)
-"adB" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison)
+"adB" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/security/prison)
"adC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/auxstarboard)
"adD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/auxstarboard)
"adE" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk,/area/solar/auxstarboard)
@@ -207,7 +207,7 @@
"adY" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"adZ" = (/obj/machinery/vending/sustenance{desc = "A vending machine normally reserved for work camps."; name = "\improper sustenance vendor"; product_slogans = "Enjoy your meal.;Enough calories to support any worker."},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aea" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/security/prison)
-"aeb" = (/obj/machinery/light/small,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison)
+"aeb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/prison)
"aec" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/security/prison)
"aed" = (/obj/machinery/door/airlock/external{name = "Security External Airlock"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/security/prison)
"aee" = (/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/security/prison)
@@ -226,7 +226,7 @@
"aer" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Justice Chamber"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor{dir = 1; name = "Justice Chamber"; req_access_txt = "3"},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "executionfireblast"; layer = 2.9; name = "blast door"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"aes" = (/obj/machinery/light/small{dir = 4},/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison)
"aet" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 2; pixel_y = 1},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison)
-"aeu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"aeu" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt2"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aev" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/prison)
"aew" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aex" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
@@ -248,7 +248,7 @@
"aeN" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aeO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/device/taperecorder{pixel_x = -3; pixel_y = 0},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"aeP" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/security/prison)
-"aeQ" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison)
+"aeQ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 3"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aeR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/prison)
"aeS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aeT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = -4; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/bottle/morphine{name = "chloral hydrate bottle"},/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = 5; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/facid{name = "fluorosulfuric acid bottle"; pixel_x = -3; pixel_y = 6},/obj/item/weapon/reagent_containers/syringe{pixel_y = 5},/obj/item/weapon/reagent_containers/dropper,/obj/item/device/assembly/signaler{pixel_x = -3; pixel_y = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 4; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = -24; req_access = "0"; req_one_access = "0"},/obj/machinery/door_control{dir = 2; id = "SecJusticeChamber"; layer = 4; name = "Justice Vent Control"; pixel_x = -26; pixel_y = 25; req_access_txt = "3"},/obj/machinery/door_control{id = "executionfireblast"; name = "Justice Area Lockdown"; pixel_x = -38; pixel_y = 25; req_access_txt = "2"},/obj/machinery/ignition_switch{id = "executionburn"; name = "Justice Ignition Switch"; pixel_x = -25; pixel_y = 36; req_access_txt = "1"},/obj/machinery/ignition_switch{id = "justiceflash"; name = "Justice Flash Control"; pixel_x = -38; pixel_y = 36; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
@@ -261,7 +261,7 @@
"afa" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 4; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = -5; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/prison)
"afb" = (/turf/simulated/wall,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"afc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Prisoner Education Chamber APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/injection{name = "educational injections"; pixel_x = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
-"afd" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/space)
+"afd" = (/obj/structure/table/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/clothing/head/beret/sec,/obj/item/clothing/suit/jacket/pilot,/obj/machinery/alarm{pixel_y = 24},/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"afe" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southwest_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"aff" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox)
"afg" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/vox)
@@ -290,7 +290,7 @@
"afD" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison)
"afE" = (/obj/structure/stool/bed,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison)
"afF" = (/obj/structure/closet/emcloset,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"afG" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_3)
+"afG" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_3)
"afH" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/pod_3)
"afI" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_3)
"afJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
@@ -308,10 +308,10 @@
"afV" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt3"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"afW" = (/obj/structure/stool/bed,/obj/machinery/camera{c_tag = "Prison Cell 2"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"afX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"afY" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt2"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/security/prison)
+"afY" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosspace"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/hos)
"afZ" = (/obj/structure/stool/bed,/obj/machinery/camera{c_tag = "Prison Cell 1"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"aga" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt1"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"agb" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/security/prison)
+"agb" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosspace"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/hos)
"agc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison)
"agd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison)
"age" = (/obj/machinery/flasher{id = "insaneflash"; pixel_x = 26},/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison)
@@ -327,7 +327,7 @@
"ago" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "justice gas pump"},/obj/machinery/door/window/westleft{base_state = "right"; dir = 1; icon_state = "right"; name = "gas ports"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"agp" = (/obj/structure/table,/obj/item/weapon/storage/backpack/duffel/security{contents = newlist(/obj/item/weapon/scalpel,/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/item/weapon/surgical_drapes,/obj/item/clothing/mask/surgical); desc = "A large duffelbag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools."; name = "duffelbag"; pixel_y = 5},/obj/item/clothing/mask/balaclava,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"agq" = (/obj/machinery/door_control{id = "prisonereducation"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
-"agr" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 3"; pixel_x = -28},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison)
+"agr" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosspace"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/hos)
"ags" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"agt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/wall,/area/security/prison)
"agu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/flasher{id = "PCell 2"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
@@ -336,18 +336,18 @@
"agx" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 1"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"agy" = (/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison)
"agz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison)
-"agA" = (/obj/structure/stool/bed/roller,/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison)
+"agA" = (/obj/structure/stool/bed/roller,/obj/structure/stool/bed/roller,/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison)
"agB" = (/turf/simulated/wall/r_wall,/area/security/warden)
"agC" = (/turf/simulated/wall/r_wall,/area/security/hos)
"agD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"agE" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"})
-"agF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "hosspace"; name = "space shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"agF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
"agG" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"agH" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_3)
+"agH" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_3)
"agI" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_3)
"agJ" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"agK" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"agL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "hosspace"; name = "space shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"agL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
"agM" = (/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"agN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"agO" = (/obj/item/weapon/tank/oxygen{pixel_x = -4; pixel_y = -1},/obj/item/weapon/tank/oxygen{pixel_x = 4; pixel_y = -1},/obj/item/weapon/tank/anesthetic{pixel_x = 2},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/machinery/atmospherics/pipe/manifold/visible,/obj/item/weapon/wrench,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"})
@@ -358,10 +358,10 @@
"agT" = (/obj/machinery/door/airlock/glass_security{name = "Long-Term Cell 2"; req_access_txt = "2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"agU" = (/obj/machinery/door/airlock/glass_security{name = "Long-Term Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"agV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Insanity Ward"; req_access_txt = "2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prison)
-"agW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "hosspace"; name = "space shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"agW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"agX" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"agY" = (/obj/structure/closet/secure_closet{name = "contraband locker"; req_access_txt = "3"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
-"agZ" = (/obj/structure/table/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/clothing/head/beret/sec,/obj/item/clothing/suit/jacket/pilot,/obj/machinery/alarm{pixel_y = 24},/obj/item/device/spacepod_key,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"agZ" = (/obj/structure/table/woodentable,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 23},/obj/machinery/door_control{id = "hosspace"; name = "Space Shutters Control"; pixel_x = -26; pixel_y = 34},/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aha" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"ahb" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"ahc" = (/obj/machinery/computer/secure_data,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
@@ -416,7 +416,7 @@
"ahZ" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aia" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aib" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aic" = (/obj/machinery/light{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 29},/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/rig/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aic" = (/obj/machinery/light{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 29},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aid" = (/turf/simulated/wall/r_wall,/area/security/podbay)
"aie" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/engine,/area/security/podbay)
"aif" = (/obj/machinery/ai_status_display,/turf/simulated/wall/r_wall,/area/security/podbay)
@@ -459,7 +459,7 @@
"aiQ" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 29},/obj/machinery/deployable/barrier,/obj/machinery/deployable/barrier,/obj/machinery/deployable/barrier,/obj/machinery/deployable/barrier,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"aiR" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/security/warden)
"aiS" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aiT" = (/mob/living/simple_animal/bot/secbot{health = 35; name = "Sergeant-at-Armsky "; on = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aiT" = (/mob/living/simple_animal/bot/secbot/armsky,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"aiU" = (/obj/structure/rack,/obj/item/weapon/shield/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot{pixel_x = 3; pixel_y = -3},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"aiV" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/briefcase{pixel_x = -2},/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/cartridge/detective,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aiW" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
@@ -468,7 +468,7 @@
"aiZ" = (/obj/item/weapon/phone{desc = "Supposedly a direct line to NanoTrasen Central Command. It's not even plugged in."; pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/hos)
"aja" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"ajb" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"ajc" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"ajc" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
"ajd" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/security/range)
"aje" = (/obj/structure/target_stake,/obj/item/target/syndicate,/turf/simulated/floor/plasteel,/area/security/range)
"ajf" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/security/range)
@@ -490,13 +490,13 @@
"ajv" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajw" = (/obj/structure/rack,/obj/item/weapon/gun/dartgun/vox/raider,/obj/item/weapon/gun/dartgun/vox/medical,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajx" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"ajy" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"ajy" = (/obj/item/weapon/vending_refill/coffee,/turf/simulated/floor/plating,/area/maintenance/disposal)
"ajz" = (/obj/machinery/bodyscanner,/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajA" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajB" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
"ajC" = (/obj/machinery/power/solar_control{id = "foreport"; name = "Fore Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"ajD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarport)
-"ajE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/auxsolarport)
+"ajE" = (/obj/machinery/power/apc{dir = 8; name = "Fore Port Solar APC"; pixel_x = -25; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"ajF" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
"ajG" = (/obj/structure/rack,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
"ajH" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 4; pixel_y = 2},/obj/item/weapon/pen,/obj/item/weapon/storage/box/prisoner,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
@@ -538,15 +538,15 @@
"akr" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aks" = (/obj/structure/rack,/obj/item/weapon/pneumatic_cannon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/tank/nitrogen,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"akt" = (/turf/simulated/wall,/area/maintenance/disposal)
-"aku" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/ammo_box/shotgun/rubbershot,/obj/item/ammo_box/shotgun/rubbershot,/obj/item/ammo_box/shotgun/rubbershot,/obj/item/ammo_box/shotgun/rubbershot,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 2; pixel_y = -1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden)
+"aku" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/storage/box/rubbershot,/obj/item/weapon/storage/box/rubbershot,/obj/item/weapon/storage/box/rubbershot,/obj/item/weapon/storage/box/rubbershot,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 2; pixel_y = -1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden)
"akv" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"akw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"akx" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aky" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"akz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
-"akA" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/brig)
+"akz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
+"akA" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/brig)
"akB" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig)
-"akC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/brig)
+"akC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/brig)
"akD" = (/turf/simulated/wall,/area/security/brig)
"akE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/security/brig)
"akF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/security/brig)
@@ -568,7 +568,7 @@
"akV" = (/obj/machinery/photocopier,/obj/machinery/power/apc{dir = 4; name = "Head of Security's Office APC"; pixel_x = 24},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door_control{id = "hosprivacy"; name = "Privacy Shutters Control"; pixel_x = 26; pixel_y = -26},/obj/machinery/camera{c_tag = "Head of Security's Office"; dir = 8; network = list("SS13")},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/hos)
"akW" = (/obj/item/clothing/head/festive,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fore)
"akX" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/fore)
-"akY" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fore)
+"akY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
"akZ" = (/obj/structure/table,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore)
"ala" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore)
"alb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -584,18 +584,18 @@
"all" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l"; icon_state = "propulsion_l"},/turf/space,/area/shuttle/vox)
"alm" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aln" = (/obj/structure/rack,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"alo" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"alo" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/disposal)
"alp" = (/obj/machinery/mass_driver{dir = 8; id_tag = "trash"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/disposal)
"alq" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"alr" = (/turf/simulated/floor/plating,/area/maintenance/disposal)
-"als" = (/obj/item/weapon/vending_refill/coffee,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/disposal)
+"als" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
"alt" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"alu" = (/obj/machinery/power/apc{dir = 8; name = "Fore Port Solar APC"; pixel_x = -25; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/auxsolarport)
+"alu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
"alv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/auxsolarport)
"alw" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"alx" = (/obj/structure/table,/obj/item/stack/medical/ointment{pixel_x = 3; pixel_y = -2},/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/restraints/handcuffs/cable/pink,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aly" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"alz" = (/obj/item/weapon/soap/deluxe,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/kitchen/rollingpin,/obj/structure/closet/crate,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/monkeysuit,/obj/item/clothing/head/xenos,/obj/item/clothing/mask/gas/monkeymask,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aly" = (/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/kitchen/rollingpin,/obj/structure/closet/crate,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/monkeysuit,/obj/item/clothing/head/xenos,/obj/item/clothing/mask/gas/monkeymask,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"alz" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"alA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/hos)
"alB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig)
"alC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Security - EVA Storage"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig)
@@ -612,7 +612,7 @@
"alN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/warden)
"alO" = (/obj/machinery/door/poddoor/shutters{dir = 2},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"alP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/main)
-"alQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"alQ" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig)
"alR" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/command{name = "Head of Security's Office"; req_access = null; req_access_txt = "58"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/carpet,/area/security/hos)
"alS" = (/turf/simulated/wall/r_wall,/area/security/range)
"alT" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/security/range)
@@ -635,19 +635,19 @@
"amk" = (/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
"aml" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"amm" = (/obj/machinery/conveyor{dir = 2; id = "garbage"; layer = 2.7},/obj/machinery/door/poddoor/preopen{id_tag = "Disposal Exit"; layer = 3.1; name = "disposal exit vent"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"amn" = (/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"amo" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/disposal)
+"amn" = (/obj/machinery/door_control{id = "trash"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"amo" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fore)
"amp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"amq" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"amr" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"ams" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
"amt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/mop,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"amu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"amu" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"amv" = (/obj/item/weapon/vending_refill/snack,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"amw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"amw" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"; tag = "icon-whitehall (WEST)"},/area/security/brig)
"amx" = (/turf/simulated/wall/r_wall,/area/security/brig)
"amy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"amz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
+"amz" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"amA" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"amB" = (/obj/structure/closet{name = "Evidence Closet 2"},/obj/item/weapon/storage/backpack{name = "Evidence Bag 2"},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden)
"amC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
@@ -707,7 +707,7 @@
"anE" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"anF" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"anG" = (/obj/item/weapon/vending_refill/cola,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"anH" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"anH" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/power/apc{dir = 1; name = "Fore Maintenance APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/fore)
"anI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/accessory/red{pixel_x = -5; pixel_y = 3},/obj/item/clothing/accessory/horrible,/obj/item/clothing/accessory/blue{pixel_x = 5; pixel_y = -2},/obj/item/weapon/dice/d8,/obj/item/device/healthanalyzer,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"anJ" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security's Office"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"anK" = (/obj/structure/table,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 26},/obj/machinery/light/small{dir = 1},/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig)
@@ -740,13 +740,13 @@
"aol" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/security/podbay)
"aom" = (/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "secpodbay"},/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/security/podbay)
"aon" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
-"aoo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range)
+"aoo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/range)
"aop" = (/obj/structure/rack{pixel_y = 2},/obj/item/weapon/gun/energy/laser/practice{pixel_x = 2; pixel_y = -2},/obj/item/weapon/gun/energy/laser/practice{pixel_x = -3; pixel_y = 3},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Firing Range"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/security/range)
"aoq" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fore)
-"aor" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fore)
+"aor" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera{c_tag = "Brig - Infirmary"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/closet/secure_closet/brigdoc,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/security/brig)
"aos" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fore)
"aot" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
-"aou" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig)
+"aou" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/fyellow,/obj/effect/spawner/lootdrop/maintenance,/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aov" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"})
"aow" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aox" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -816,9 +816,9 @@
"apJ" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "secpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
"apK" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/engine,/area/security/podbay)
"apL" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/range)
-"apM" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range)
+"apM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range)
"apN" = (/obj/item/target,/obj/item/target,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/structure/closet/crate/secure{desc = "A secure crate containing various materials for building a customised test-site."; name = "Firing Range Gear Crate"; req_access_txt = "1"},/obj/machinery/power/apc{cell_type = 2500; dir = 4; name = "Shooting Range APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/security/range)
-"apO" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plating,/area/maintenance/fore)
+"apO" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
"apP" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
"apQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fore)
"apR" = (/obj/machinery/prize_counter,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -844,15 +844,15 @@
"aql" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine,/area/space)
"aqm" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aqn" = (/obj/item/clothing/head/collectable/xenom,/obj/item/clothing/head/chicken,/obj/item/weapon/aiModule/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aqo" = (/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aqp" = (/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"aqo" = (/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"aqp" = (/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aqq" = (/obj/machinery/light/small{dir = 8},/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aqr" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aqs" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Danger: Conveyor Access"; req_access_txt = "12"},/obj/machinery/conveyor{dir = 9; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aqt" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/disposal)
-"aqu" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/storage/box/lights/mixed,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aqu" = (/mob/living/simple_animal/bot/cleanbot{name = "Mopfficer Sweepsky"; on = 0},/turf/simulated/floor/plating,/area/maintenance/fore)
"aqv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aqw" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aqw" = (/obj/structure/closet/crate,/obj/item/bodybag,/obj/item/device/radio,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aqx" = (/obj/structure/table/reinforced,/obj/machinery/light_construct/small{dir = 8},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/window/reinforced,/obj/item/weapon/contraband/poster/legit,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aqy" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; name = "windoor"; req_access_txt = "0"},/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/tape/random,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aqz" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -862,7 +862,7 @@
"aqD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aqE" = (/obj/machinery/door/airlock/glass_security{name = "N2O Storage"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aqF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/brig)
-"aqG" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/structure/morgue,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"; tag = "icon-whitehall (WEST)"},/area/security/brig)
+"aqG" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
"aqH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/brig)
"aqI" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"; tag = "icon-whitehall (WEST)"},/area/security/brig)
"aqJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/brig)
@@ -871,7 +871,7 @@
"aqM" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHEAST)"; icon_state = "vault"; dir = 6},/area/security/warden)
"aqN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden)
"aqO" = (/obj/structure/filingcabinet/security{pixel_x = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/security/warden)
-"aqP" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/lockbox/loyalty,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
+"aqP" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/lockbox/mindshield,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
"aqQ" = (/obj/structure/rack,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
"aqR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/warden)
"aqS" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
@@ -889,7 +889,7 @@
"are" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plasteel,/area/security/main)
"arf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"arg" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Security Office APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"arh" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/range)
+"arh" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/range)
"ari" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fore)
"arj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/fore)
"ark" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -26},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -906,7 +906,7 @@
"arv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"arw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"arx" = (/obj/structure/AIcore,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"ary" = (/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"ary" = (/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"arz" = (/obj/item/weapon/storage/box/zipties,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"arA" = (/turf/simulated/floor/plating/airless,/area/space)
"arB" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
@@ -927,15 +927,15 @@
"arQ" = (/obj/machinery/light{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/recharger/wallcharger{pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"arR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fore)
"arS" = (/obj/effect/landmark/start{name = "Brig Physician"},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/brig)
-"arT" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"arT" = (/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"arU" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"arV" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "whitered"},/area/security/brig)
+"arV" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "whitered"},/area/security/brig)
"arW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fore)
"arX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/brig)
"arY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/security/brig)
"arZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/brig)
"asa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Evidence Storage"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden)
-"asb" = (/obj/structure/table/woodentable,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 23},/obj/machinery/door_control{id = "hosspace"; name = "Space Shutters Control"; pixel_x = -26; pixel_y = 34},/obj/item/device/spacepod_key,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"asb" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "qm_mine_warehouse"; name = "Warehouse Shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"asc" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_security{name = "Secure Gear Storage"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden)
"asd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/warden)
"ase" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
@@ -952,15 +952,15 @@
"asp" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"asq" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Delivery"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
"asr" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/main)
-"ass" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fore)
-"ast" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
-"asu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fore)
-"asv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/fore)
-"asw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"asx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"asy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"asz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"asA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"ass" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fore)
+"ast" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/fore)
+"asu" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"asv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"asw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"asx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"asy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"asz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"asA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"asB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"asC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"asD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -971,8 +971,8 @@
"asI" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/starboard)
"asJ" = (/turf/simulated/floor/plating,/area/maintenance/starboard)
"asK" = (/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/effect/decal/cleanable/cobweb,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"asL" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/belt{desc = "Can hold quite a lot of stuff."; name = "mutli-belt"},/obj/item/clothing/gloves/color/fyellow,/obj/effect/spawner/lootdrop/maintenance,/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"asM" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
+"asL" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; dir = 1; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = -30},/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
+"asM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/closet/wardrobe/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
"asN" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{desc = "Takes you to a whole new level of thinking."; name = "Meta-Cider"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"asO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
"asP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
@@ -984,7 +984,7 @@
"asV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarstarboard)
"asW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"asX" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
-"asY" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/machinery/camera{c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13")},/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/head/helmet/space/rig/security,/turf/simulated/floor/plasteel,/area/security/podbay)
+"asY" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/machinery/camera{c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13")},/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel,/area/security/podbay)
"asZ" = (/turf/simulated/floor/engine,/area/security/podbay)
"ata" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating/airless,/area/space)
"atb" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Disposals"},/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 2; id = "garbage"},/obj/machinery/door/window/northright{dir = 2; name = "delivery door"; pixel_y = 0; req_access_txt = "31"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/disposal)
@@ -993,14 +993,14 @@
"ate" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atf" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ath" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"ath" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor/plating,/area/maintenance/starboard)
"ati" = (/obj/machinery/light_construct/small{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atj" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fore)
"atm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/fore)
-"atn" = (/mob/living/simple_animal/bot/cleanbot{name = "Mopfficer Sweepsky"; on = 0},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fore)
-"ato" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
+"atn" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
+"ato" = (/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fore)
"atp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/brig)
"atq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/brig)
"atr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/brig)
@@ -1012,7 +1012,7 @@
"atx" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 22},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/closet/secure_closet/warden,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"aty" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"atz" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "0"; req_one_access_txt = "1;4"},/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/security/main)
-"atA" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/obj/item/weapon/tank/air,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"atA" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"atB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/reagent_dispensers/peppertank{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
"atC" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plasteel,/area/security/main)
"atD" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel,/area/security/main)
@@ -1021,9 +1021,9 @@
"atG" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/security/main)
"atH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/recharger/wallcharger{pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"atI" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/security/main)
-"atJ" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
+"atJ" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/wall,/area/security/brig)
"atK" = (/turf/simulated/wall/r_wall,/area/security/main)
-"atL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore)
+"atL" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"atM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Cryodorms"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"atN" = (/obj/structure/closet/lasertag/red,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"atO" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/accessory/red,/obj/item/clothing/head/soft/red,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -1040,7 +1040,7 @@
"atZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aua" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aub" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"auc" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"auc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aud" = (/obj/item/device/mmi{name = "man-machine interface"},/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"aue" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/gravitygenerator)
"auf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/gravitygenerator)
@@ -1050,16 +1050,16 @@
"auj" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"auk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aul" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
+"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/Doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
"aun" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/security/podbay)
"auo" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
-"aup" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"aup" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space)
"auq" = (/obj/machinery/space_heater,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aur" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aur" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aus" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aut" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auu" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"auv" = (/obj/machinery/space_heater,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"auv" = (/obj/machinery/camera{c_tag = "Engineering - Storage"; dir = 2; network = list("SS13")},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"auw" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auy" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -1069,12 +1069,12 @@
"auC" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auD" = (/obj/machinery/light_construct/small,/obj/item/weapon/toolbox_tiles_sensor,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auE" = (/obj/item/weapon/vending_refill/cigarette,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"auF" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"auF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Labor Camp Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/fore)
"auG" = (/obj/structure/closet/crate,/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/syndicatebomb/training,/turf/simulated/floor/plasteel,/area/security/main)
"auI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fore)
-"auJ" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/fore)
-"auK" = (/obj/structure/closet/crate,/obj/item/weapon/restraints/handcuffs,/obj/item/bodybag,/obj/item/device/radio,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"auJ" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"auK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"auL" = (/obj/effect/decal/cleanable/blood,/obj/structure/stool/bed/chair,/obj/item/weapon/restraints/handcuffs,/obj/effect/decal/remains/human,/obj/item/clothing/under/soviet,/turf/simulated/floor/plating,/area/maintenance/fore)
"auM" = (/obj/machinery/computer/security{name = "Labor Camp Monitoring"; network = list("Labor")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"auN" = (/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/obj/item/weapon/razor{pixel_x = -6},/obj/item/weapon/paper{desc = ""; info = "Labor Camp Facility Operation Guide Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals. To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long. Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area. In the case of dangerous prisoners, surveilance may be needed. To that end, there is a prisoner monitoring room on the mining station, equipped with a remote flasher and a lockdown button. The mine itself is patrolled by a securibot, so the nearby security records console can also be used to secure hostile prisoners on the mine."; name = "Labor Camp Operating Guide"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
@@ -1096,7 +1096,7 @@
"avd" = (/obj/machinery/computer/security,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"ave" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"avf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/security/main)
-"avg" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; dir = 1; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = -30},/obj/machinery/door_control{id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = 0; pixel_y = 7; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Cell Window Control"; normaldoorcontrol = 0; pixel_x = -5; pixel_y = -3; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/door_control{id = "briglockdown"; name = "Brig Lockdown Control"; pixel_x = 5; pixel_y = -3; req_access_txt = "0"},/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
+"avg" = (/obj/structure/table,/obj/machinery/computer/guestpass,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"avh" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"avi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
"avj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
@@ -1104,7 +1104,7 @@
"avl" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main)
"avm" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main)
"avn" = (/obj/item/weapon/phone{desc = "Supposedly a direct line to NanoTrasen Central Command. It's not even plugged in."; pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/obj/structure/table/woodentable,/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main)
-"avo" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"avo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"avp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"avq" = (/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"avr" = (/turf/simulated/wall,/area/crew_quarters/mrchangs)
@@ -1113,11 +1113,11 @@
"avu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Recreation Area"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"avv" = (/turf/simulated/wall,/area/crew_quarters/sleep)
"avw" = (/obj/structure/closet,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"avx" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
+"avx" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/primary)
"avy" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"avz" = (/obj/structure/rack,/obj/effect/landmark/costume,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"avA" = (/obj/structure/rack,/obj/item/clothing/suit/poncho,/obj/item/clothing/head/sombrero,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"avB" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"avB" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom)
"avC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/starboard)
"avD" = (/obj/structure/rack,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/starboard)
"avE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
@@ -1126,28 +1126,28 @@
"avH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/gravitygenerator)
"avI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/terminal,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
"avJ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/gravitygenerator)
-"avK" = (/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/auxsolarstarboard)
+"avK" = (/obj/machinery/conveyor{dir = 8; id = "QMLoad2"; movedir = 8},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"avL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/auxsolarstarboard)
"avM" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"avN" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/pod_4)
"avO" = (/obj/item/device/radio/intercom/department/security,/turf/simulated/wall/r_wall,/area/security/podbay)
"avP" = (/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
-"avQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"avR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"avS" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avQ" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"; req_one_access_txt = "48;50"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"avT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"avU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"avV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"avW" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"avX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"avY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"avZ" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"awa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"awb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"awc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avW" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avX" = (/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avY" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"avZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"awa" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"awb" = (/obj/machinery/conveyor{dir = 8; id = "QMLoad2"; movedir = 8},/obj/structure/plasticflaps,/turf/simulated/floor/plating,/area/quartermaster/storage)
+"awc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"awd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark/start{name = "Warden"},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
-"awe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"awf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"awe" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
+"awf" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fore)
"awg" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fore)
"awh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Brig Maintenance"; req_access_txt = "0"; req_one_access_txt = "63;12"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
"awi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/camera{c_tag = "Labor Shuttle Control Desk"; dir = 4},/obj/machinery/computer/shuttle/labor,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
@@ -1163,7 +1163,7 @@
"aws" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"awt" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"awu" = (/obj/machinery/vending/security,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
-"awv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
+"awv" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aww" = (/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/engine,/area/security/podbay)
"awx" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/engine,/area/security/podbay)
"awy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
@@ -1177,9 +1177,9 @@
"awG" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main)
"awH" = (/obj/structure/stool/bed/chair,/obj/machinery/computer/security/telescreen{desc = "Used for watching proceedings in the interrogation room."; dir = 1; layer = 4; name = "interrogation monitor"; network = list("interrogation"); pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main)
"awI" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/woodentable,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1424; listening = 1; name = "Interrogation Intercom"; pixel_x = 0; pixel_y = -31},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/main)
-"awJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fore)
-"awK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"awL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
+"awJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "10"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
+"awK" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
+"awL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"awM" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
"awN" = (/obj/machinery/light/small{dir = 8},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"awO" = (/obj/machinery/vending/chinese,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
@@ -1196,13 +1196,13 @@
"awZ" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
"axa" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
"axb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
-"axc" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"axc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange,/turf/simulated/floor/wood,/area/lawoffice)
"axd" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"axe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"axf" = (/obj/structure/rack,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
"axg" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"axh" = (/turf/simulated/wall/r_wall,/area/maintenance/starboard)
-"axi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"axi" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/maintenance/starboard)
"axj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"axk" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"axl" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -1243,7 +1243,7 @@
"axU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/fore)
"axV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel,/area/security/brig)
"axW" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/security/main)
-"axX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fore)
+"axX" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"axY" = (/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"axZ" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "supplybridge"},/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aya" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
@@ -1255,7 +1255,7 @@
"ayg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/sleep)
"ayh" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/sleep)
"ayi" = (/turf/simulated/floor/carpet,/area/crew_quarters/sleep)
-"ayj" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"ayj" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/structure/plasticflaps,/turf/simulated/floor/plating,/area/quartermaster/storage)
"ayk" = (/obj/structure/closet/crate/hydroponics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"ayl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aym" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -1266,28 +1266,28 @@
"ayr" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"},/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/gravitygenerator)
"ays" = (/obj/structure/closet/secure_closet/security,/obj/item/device/spacepod_equipment/weaponry/laser,/obj/machinery/power/apc{dir = 4; name = "Security Podbay APC"; pixel_x = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"ayt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"ayu" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"ayu" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/locker)
"ayv" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"ayw" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel,/area/security/podbay)
"ayx" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"ayy" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/turf/simulated/floor/plating/airless,/area/space)
"ayz" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ayA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"ayA" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ayB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ayC" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"ayC" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"ayD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ayE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ayF" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
"ayG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore)
"ayH" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
-"ayI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fore)
+"ayI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
"ayJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"ayK" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"ayL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/brig)
"ayM" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/siberia)
"ayN" = (/obj/machinery/computer/shuttle/labor,/obj/structure/reagent_dispensers/peppertank{pixel_x = -31; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
"ayO" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
-"ayP" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
+"ayP" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/primary)
"ayQ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/brig)
"ayR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/junction,/turf/simulated/floor/plasteel,/area/security/brig)
"ayS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/brig)
@@ -1312,7 +1312,7 @@
"azl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep)
"azm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/crew_quarters/sleep)
"azn" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboard)
-"azo" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"azo" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ceprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"azp" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/starboard)
"azq" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"azr" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
@@ -1324,8 +1324,8 @@
"azx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"azy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"azz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/brig)
-"azA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
-"azB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"azA" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
+"azB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azC" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"azD" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbay"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"azE" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
@@ -1336,12 +1336,12 @@
"azJ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azL" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"azM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"azM" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/engine/engineering)
"azN" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;50"},/turf/simulated/floor/plating,/area/maintenance/fore)
-"azQ" = (/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fore)
-"azR" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fore)
+"azQ" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"azR" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/sorting{name = "\improper Warehouse"})
"azS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Office"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"azU" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
@@ -1388,8 +1388,8 @@
"aAJ" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/machinery/alarm{pixel_y = 23},/obj/item/clothing/under/assistantformal,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aAK" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aAL" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"aAM" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
-"aAN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "10"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
+"aAM" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/port)
+"aAN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Holding Cell"; name = "Holding Cell"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aAO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboard)
"aAP" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aAQ" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/mining)
@@ -1449,16 +1449,16 @@
"aBS" = (/obj/structure/stool/bed/chair/wood/normal{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aBT" = (/obj/item/weapon/caution,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"aBU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"aBV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"aBV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
"aBW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aBX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
-"aBY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"aBY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
"aBZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aCa" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aCb" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/starboard)
"aCc" = (/obj/machinery/door/window/southright{dir = 4; name = "Engineering Deliveries"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aCd" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
-"aCe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"aCe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aCf" = (/obj/machinery/light_switch{pixel_x = 23},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
"aCg" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
"aCh" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -1466,7 +1466,7 @@
"aCj" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aCk" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aCl" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"aCm" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aCm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aCn" = (/obj/structure/closet/crate,/obj/item/stack/sheet/glass{amount = 10},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/space)
"aCo" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining)
"aCp" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/mining)
@@ -1475,7 +1475,7 @@
"aCs" = (/turf/simulated/wall,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aCt" = (/obj/machinery/door/airlock/maintenance{name = "Mining Dock Maintenance"; req_access_txt = "48"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aCu" = (/turf/simulated/wall,/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aCv" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aCv" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aCw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aCx" = (/obj/structure/closet/secure_closet/freezer/money,/obj/item/clothing/head/bearpelt,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
"aCy" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage)
@@ -1484,7 +1484,7 @@
"aCB" = (/obj/structure/filingcabinet,/obj/item/weapon/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
"aCC" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aCD" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"aCE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
+"aCE" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aCF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "Secure Gate"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig)
"aCG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aCH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "Secure Gate"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig)
@@ -1493,7 +1493,7 @@
"aCK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aCL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{id_tag = "innerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aCM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
-"aCN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Holding Cell"; name = "Holding Cell"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
+"aCN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aCO" = (/turf/simulated/wall/r_wall,/area/security/detectives_office)
"aCP" = (/obj/structure/grille,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/security/detectives_office)
"aCQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Detective's Office"; req_access = null; req_access_txt = "4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel,/area/security/detectives_office)
@@ -1501,7 +1501,7 @@
"aCS" = (/turf/simulated/wall,/area/security/detectives_office)
"aCT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "whitered"},/area/security/brig)
"aCU" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{pixel_y = 26},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
-"aCV" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera{c_tag = "Brig - Infirmary"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/closet/secure_closet/brigdoc,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/security/brig)
+"aCV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
"aCW" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/sign/chinese{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aCX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep)
"aCY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
@@ -1509,8 +1509,8 @@
"aDa" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/starboard)
"aDb" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/wrench,/obj/machinery/light{dir = 8},/obj/item/weapon/hand_labeler,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aDc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"aDd" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aDe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
+"aDd" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aDe" = (/obj/structure/disposalpipe/sortjunction{sortType = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aDf" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"aDg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"aDh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
@@ -1534,15 +1534,15 @@
"aDz" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aDA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aDB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aDC" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aDD" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aDC" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Far"; dir = 8; network = list("Singulo")},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aDD" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aDE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
"aDF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage)
"aDG" = (/obj/machinery/nuclearbomb,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
"aDH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage)
"aDI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
"aDJ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"aDK" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
+"aDK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
"aDL" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
"aDM" = (/obj/machinery/flasher{id = "Cell 1"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/brig)
"aDN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/brig)
@@ -1565,8 +1565,8 @@
"aEe" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/safe{pixel_x = 32},/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aEf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/fore)
"aEg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
-"aEh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fore)
-"aEi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aEh" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
+"aEi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aEj" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aEk" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aEl" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -1577,7 +1577,7 @@
"aEq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aEr" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aEs" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
-"aEt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"aEt" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
"aEu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aEv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aEw" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -1586,12 +1586,12 @@
"aEz" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/machinery/camera{c_tag = "Engineering - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aEA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aEB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"aEC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 4},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aEC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aED" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aEE" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"aEF" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aEG" = (/obj/item/device/radio/off,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"aEH" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Far"; dir = 8; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aEH" = (/obj/structure/closet/crate,/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aEI" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "0"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/shuttle/plating,/area/shuttle/mining)
"aEJ" = (/obj/machinery/door/airlock/external{name = "Mining Dock Airlock"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aEK" = (/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
@@ -1601,11 +1601,11 @@
"aEO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aEP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aEQ" = (/obj/machinery/door_control{id = "qm_mine_warehouse"; name = "Warehouse Door Control"; pixel_x = 24; pixel_y = 28; req_access_txt = "48"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
-"aER" = (/obj/machinery/door/poddoor/shutters{id_tag = "qm_mine_warehouse"; name = "Warehouse Shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
+"aER" = (/obj/structure/table/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/item/device/radio/off,/obj/machinery/door/poddoor/shutters/preopen{dir = 8; id_tag = "briglockdown"; name = "brig shutters"},/obj/machinery/door/window/westleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 4; name = "Security Desk"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aES" = (/obj/structure/disposalpipe/segment,/obj/machinery/door_control{id = "qm_mine_warehouse"; name = "Warehouse Door Control"; pixel_x = -24; pixel_y = 28; req_access_txt = "48"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aET" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aEU" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aEV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aEV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/carpet,/area/security/detectives_office)
"aEW" = (/obj/structure/closet/crate,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aEX" = (/obj/structure/closet/crate{name = "Gold Crate"},/obj/item/stack/sheet/mineral/gold{pixel_x = -1; pixel_y = 5},/obj/item/stack/sheet/mineral/gold{pixel_y = 2},/obj/item/stack/sheet/mineral/gold{pixel_x = 1; pixel_y = -2},/obj/item/weapon/storage/belt/champion,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
"aEY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage)
@@ -1634,10 +1634,10 @@
"aFv" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/hand_labeler,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aFw" = (/obj/effect/landmark/start{name = "Detective"},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aFx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/secure_data,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"aFy" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore)
-"aFz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
-"aFA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
-"aFB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aFy" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aFz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aFA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aFB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aFC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "briglockdown"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig)
"aFD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aFE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -1649,21 +1649,21 @@
"aFK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/pods{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aFL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aFM" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"aFN" = (/obj/item/clothing/head/helmet/space/rig/engineering,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aFN" = (/obj/structure/table/woodentable,/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 1},/obj/machinery/photocopier/faxmachine/longrange,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"aFO" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"aFP" = (/obj/machinery/camera{c_tag = "Engineering - Storage"; dir = 2; network = list("SS13")},/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aFP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ceprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"aFQ" = (/obj/item/stack/sheet/plasteel{amount = 10; pixel_x = -2; pixel_y = 2},/obj/structure/table,/obj/item/stack/sheet/rglass{amount = 30; pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFR" = (/turf/simulated/wall,/area/engine/engineering)
"aFS" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
"aFT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"aFU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/engine/engineering)
-"aFV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aFV" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
"aFW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aFX" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
"aFY" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
"aFZ" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Near"; dir = 4; network = list("Singulo")},/turf/space,/area/space)
"aGa" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"})
-"aGb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aGb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aGc" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aGd" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/camera{c_tag = "Mining Dock"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aGe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall,/area/quartermaster/miningdock{name = "\improper Mining Office"})
@@ -1673,7 +1673,7 @@
"aGi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aGj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aGk" = (/obj/structure/closet/crate/freezer,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aGl" = (/obj/structure/closet/crate,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/ore/glass,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aGl" = (/obj/item/stack/sheet/cardboard,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aGm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/apc_electronics,/obj/item/weapon/stock_parts/cell{maxcharge = 2000},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aGn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
"aGo" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
@@ -1681,7 +1681,7 @@
"aGq" = (/obj/machinery/camera/motion{c_tag = "Vault"; dir = 1; network = list("MiniSat")},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
"aGr" = (/obj/structure/safe,/obj/item/weapon/storage/secure/briefcase{contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/suppressor,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/weapon/soap/nanotrasen)},/obj/item/weapon/storage/backpack/duffel{contents = newlist(/obj/item/clothing/under/lawyer,/obj/item/clothing/accessory/waistcoat,/obj/item/clothing/shoes/laceup,/obj/item/clothing/gloves/color/black,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/head/fedora); desc = "A large duffelbag for holding extra things. There is a NanoTrasen logo on the back."; icon_state = "duffel-syndieammo"; item_state = "duffel-syndieammo"},/obj/item/weapon/card/id/silver{access = list(12); assignment = "Reaper"; name = "Thirteen's ID Card (Reaper)"; registered_name = "Thirteen"},/obj/item/weapon/lazarus_injector,/obj/item/weapon/gun/energy/gun/advtaser,/obj/item/weapon/gun/projectile/revolver/russian,/obj/item/ammo_box/a357,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/book{desc = "An undeniably handy book."; icon_state = "bookknock"; name = "A Simpleton's Guide to Safe-cracking with Stethoscopes"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
"aGs" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/shuttle/plating,/area/shuttle/siberia)
-"aGt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Labor Camp Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/fore)
+"aGt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ceprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"aGu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"})
"aGv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering)
"aGw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/construction)
@@ -1692,12 +1692,12 @@
"aGB" = (/obj/machinery/door/airlock/security{name = "Court Cell"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aGC" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/apc{dir = 8; name = "Detective APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/device/taperecorder{pixel_x = 3; pixel_y = 0},/obj/item/weapon/storage/box/evidence,/obj/item/device/flashlight/seclite,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aGD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aGE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"aGE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aGF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aGG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aGH" = (/obj/machinery/computer/med_data,/obj/machinery/newscaster{pixel_x = 28},/turf/simulated/floor/carpet,/area/security/detectives_office)
-"aGI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore)
-"aGJ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aGI" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"aGJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aGK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aGL" = (/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aGM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
@@ -1717,9 +1717,9 @@
"aHa" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
"aHb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"})
"aHc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aHd" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aHe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aHf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aHd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
+"aHe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
+"aHf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering)
"aHg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aHh" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
"aHi" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
@@ -1737,7 +1737,7 @@
"aHu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aHw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aHx" = (/obj/item/stack/sheet/cardboard,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aHx" = (/obj/machinery/power/grounding_rod{anchored = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aHy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aHz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/security/nuke_storage)
"aHA" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/wall/r_wall,/area/security/nuke_storage)
@@ -1763,16 +1763,16 @@
"aHU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/flasher_button{id = "holdingflash"; name = "holding cell flasher button"; pixel_x = 23; pixel_y = 23; req_access_txt = "1"},/obj/machinery/camera{c_tag = "Brig - Desk"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aHV" = (/obj/machinery/requests_console{department = "Detective's office"; pixel_x = -30; pixel_y = 0},/obj/structure/table/woodentable,/obj/machinery/light/small{dir = 8},/obj/item/weapon/book/manual/security_space_law,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detective's camera"; pictures_left = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aHW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aHX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aHY" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aHZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"aHX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aHY" = (/obj/structure/closet/crate/internals,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aHZ" = (/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/security/detectives_office)
"aIa" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/secure/briefcase{pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aIb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fore)
+"aIb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
"aIc" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/door_control{id = "Toilet3"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aId" = (/obj/machinery/door/airlock{id_tag = "Toilet3"; name = "Unit 3"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
-"aIe" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
-"aIf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
-"aIg" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
+"aIe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
+"aIf" = (/obj/structure/lattice,/turf/space,/area/engine/engineering)
+"aIg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore)
"aIh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aIi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aIj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
@@ -1794,13 +1794,13 @@
"aIz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Storage"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aIA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
"aIB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aIC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering)
+"aIC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aID" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"aIE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"aIF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
"aIG" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/construction)
-"aIH" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aII" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aIH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
+"aII" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/fore)
"aIJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aIK" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/mining)
"aIL" = (/obj/structure/shuttle/engine/propulsion/burst,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/shuttle/plating,/area/shuttle/mining)
@@ -1813,7 +1813,7 @@
"aIS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aIT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aIU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/item/weapon/paper,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
-"aIV" = (/obj/structure/closet/crate/internals,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aIV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aIW" = (/obj/machinery/power/apc{dir = 4; name = "Warehouse APC"; pixel_x = 27; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aIX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/construction/Storage{name = "Storage Wing"})
"aIY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/construction/Storage{name = "Storage Wing"})
@@ -1832,17 +1832,17 @@
"aJl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"aJm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=1-BrigCells"; location = "0-SecurityDesk"},/mob/living/simple_animal/bot/secbot/beepsky,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"aJn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aJo" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 4; name = "Security Desk"; req_access_txt = "1"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/item/device/radio/off,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "briglockdown"; name = "brig shutters"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"aJo" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/sorting{name = "\improper Warehouse"})
"aJp" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aJq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aJr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aJs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/bodybag,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office)
"aJt" = (/obj/machinery/door/window{dir = 1; name = "glass door"; pixel_y = 0; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office)
-"aJu" = (/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/security/detectives_office)
+"aJu" = (/obj/machinery/door/airlock/maintenance{name = "Law Office Maintenance"; req_access_txt = "38"},/turf/simulated/floor/plating,/area/lawoffice)
"aJv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Restrooms"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aJw" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aJx" = (/obj/machinery/light/small,/obj/machinery/power/apc{dir = 2; name = "Restrooms APC"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
-"aJy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
+"aJy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore)
"aJz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aJA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aJB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
@@ -1867,26 +1867,26 @@
"aJU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aJV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/crowbar,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aJW" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space)
-"aJX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/space)
-"aJY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
-"aJZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aKa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aJX" = (/turf/simulated/floor/wood,/area/lawoffice)
+"aJY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.9; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge)
+"aJZ" = (/obj/machinery/door/window/westleft{dir = 4; name = "Bridge Deliveries"; req_access_txt = "19"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.6; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge)
+"aKa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
"aKb" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Mining"; departmentType = 0; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aKc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aKd" = (/obj/structure/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aKe" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aKf" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
-"aKg" = (/obj/machinery/door/poddoor/shutters{id_tag = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/sorting{name = "\improper Warehouse"})
+"aKg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Vault Storage"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/construction/Storage{name = "Storage Wing"})
"aKh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/quartermaster/sorting{name = "\improper Warehouse"})
"aKi" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aKj" = (/turf/simulated/wall,/area/construction/Storage{name = "Storage Wing"})
"aKk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/hallway/primary/fore)
"aKl" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/storage)
"aKm" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/fore)
-"aKn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Vault Storage"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/construction/Storage{name = "Storage Wing"})
+"aKn" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
"aKo" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/fore)
"aKp" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"aKq" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/storage/primary)
+"aKq" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hop"; layer = 2.9; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
"aKr" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/obj/machinery/camera{c_tag = "Storage Wing - Security Access Door"; dir = 4; network = list("SS13")},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/fore)
"aKs" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/fore)
"aKt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/fore)
@@ -1914,10 +1914,10 @@
"aKP" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aKQ" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office)
"aKR" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/detectives_office)
-"aKS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore)
-"aKT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/fore)
-"aKU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fore)
-"aKV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aKS" = (/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aKT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aKU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"aKV" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/lawoffice)
"aKW" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/effect/landmark{name = "blobstart"},/obj/machinery/door_control{id = "Toilet2"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aKX" = (/obj/machinery/door/airlock{id_tag = "Toilet2"; name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aKY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
@@ -1946,11 +1946,11 @@
"aLv" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aLw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
"aLx" = (/obj/item/weapon/wirecutters,/obj/structure/lattice,/turf/space,/area/space)
-"aLy" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/construction)
+"aLy" = (/obj/machinery/computer/guestpass{pixel_x = 30},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"aLz" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel,/area/construction)
"aLA" = (/obj/machinery/light_construct{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/construction)
"aLB" = (/turf/simulated/floor/plating,/area/construction)
-"aLC" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/construction)
+"aLC" = (/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aLD" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plasteel,/area/construction)
"aLE" = (/obj/structure/table,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/construction)
"aLF" = (/obj/structure/closet/toolcloset,/obj/machinery/light_construct{dir = 1},/turf/simulated/floor/plasteel,/area/construction)
@@ -1988,7 +1988,7 @@
"aMl" = (/turf/simulated/wall/r_wall,/area/crew_quarters/courtroom)
"aMm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Court Cell"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"aMn" = (/turf/simulated/wall,/area/lawoffice)
-"aMo" = (/obj/machinery/door/airlock/maintenance{name = "Law Office Maintenance"; req_access_txt = "38"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/lawoffice)
+"aMo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aMp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light_switch{pixel_x = -26},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aMq" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aMr" = (/obj/machinery/door/airlock{id_tag = "Toilet4"; name = "Unit 4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
@@ -2003,7 +2003,7 @@
"aMA" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aMB" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 29; pixel_y = 1},/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aMC" = (/obj/structure/closet,/obj/item/weapon/storage/box/donkpockets,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"aMD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
+"aMD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"aME" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
"aMF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/engine/engineering)
"aMG" = (/obj/structure/table,/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
@@ -2060,7 +2060,7 @@
"aNF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/secure/briefcase{pixel_x = 2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/wood,/area/lawoffice)
"aNG" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Law Office APC"; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-21"; layer = 4.1; tag = "icon-plant-21"},/turf/simulated/floor/wood,/area/lawoffice)
"aNH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/lawoffice)
-"aNI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
+"aNI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
"aNJ" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/effect/landmark{name = "blobstart"},/obj/machinery/door_control{id = "Toilet1"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aNK" = (/obj/machinery/door/airlock{id_tag = "Toilet1"; name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aNL" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 4},/obj/machinery/newscaster{pixel_x = 32},/obj/machinery/door_control{id = "Toilet4"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
@@ -2074,7 +2074,7 @@
"aNT" = (/obj/machinery/field/generator{anchored = 0; state = 2},/turf/simulated/floor/plating,/area/engine/engineering)
"aNU" = (/obj/machinery/shieldgen,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Engineering - Secure Storage"; dir = 2; network = list("SS13")},/turf/simulated/floor/plating,/area/engine/engineering)
"aNV" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engine/engineering)
-"aNW" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
+"aNW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aNX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering)
"aNY" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
"aNZ" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
@@ -2090,7 +2090,7 @@
"aOj" = (/obj/item/weapon/crowbar,/turf/space,/area/space)
"aOk" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/construction)
"aOl" = (/obj/machinery/door/airlock/engineering{name = "Arrivals Expansion Area"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction)
-"aOm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aOm" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
"aOn" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/supply)
"aOo" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/crew_quarters/courtroom)
"aOp" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/conveyor{dir = 2; id = "QMLoad2"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
@@ -2106,8 +2106,8 @@
"aOz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aOA" = (/turf/simulated/wall,/area/storage/primary)
"aOB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/preopen{id_tag = "lawyer_blast"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/lawoffice)
-"aOC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
-"aOD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
+"aOC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
+"aOD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor/plasteel,/area/storage/tools)
"aOE" = (/mob/living/carbon/slime,/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"aOF" = (/turf/simulated/wall/r_wall,/area/storage/primary)
"aOG" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
@@ -2126,18 +2126,18 @@
"aOT" = (/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/wood,/area/lawoffice)
"aOU" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/law,/turf/simulated/floor/wood,/area/lawoffice)
"aOV" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/wood,/area/lawoffice)
-"aOW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/lawoffice)
-"aOX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/lawoffice)
-"aOY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "1;4;38;12"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aOW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering)
+"aOX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
+"aOY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aOZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aPa" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aPb" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/crew_quarters/sleep)
"aPc" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
-"aPd" = (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/rh{pixel_x = 2; pixel_y = 1},/obj/structure/table,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aPd" = (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh{pixel_x = 2; pixel_y = 1},/obj/structure/table,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aPe" = (/obj/machinery/biogenerator,/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aPf" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/machinery/light{dir = 1},/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aPf" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/machinery/light{dir = 1},/obj/item/device/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aPg" = (/obj/machinery/seed_extractor,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aPh" = (/obj/item/seeds/appleseed,/obj/item/seeds/bananaseed,/obj/item/seeds/cocoapodseed,/obj/item/seeds/grapeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/structure/table,/obj/item/seeds/towermycelium,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aPh" = (/obj/item/seeds/apple,/obj/item/seeds/banana,/obj/item/seeds/cocoapod,/obj/item/seeds/grape,/obj/item/seeds/orange,/obj/item/seeds/sugarcane,/obj/item/seeds/wheat,/obj/item/seeds/watermelon,/obj/structure/table,/obj/item/seeds/tower,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aPi" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aPj" = (/mob/living/simple_animal/chicken{name = "Featherbottom"; real_name = "Featherbottom"},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aPk" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/wirecutters,/obj/item/weapon/weldingtool,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -2158,11 +2158,11 @@
"aPz" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/space)
"aPA" = (/obj/machinery/light_construct{dir = 8},/turf/simulated/floor/plating,/area/construction)
"aPB" = (/obj/item/weapon/crowbar/red,/turf/simulated/floor/plating,/area/construction)
-"aPC" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/construction)
+"aPC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hop"; layer = 2.9; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
"aPD" = (/obj/machinery/light_construct{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/construction)
"aPE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/shuttle/plating,/area/shuttle/supply)
-"aPF" = (/obj/machinery/conveyor{dir = 8; id = "QMLoad2"; movedir = 8},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"aPG" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 8; id = "QMLoad2"; movedir = 8},/turf/simulated/floor/plating,/area/quartermaster/storage)
+"aPF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hop"; layer = 2.9; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
+"aPG" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hop"; layer = 2.9; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
"aPH" = (/obj/machinery/conveyor{dir = 10; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aPI" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
"aPJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -2176,7 +2176,7 @@
"aPR" = (/obj/machinery/door/window/northleft{dir = 8; name = "MuleBot Supply Access"; req_access_txt = "50"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aPS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aPT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aPU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aPU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_command{layer = 2.9; name = "Bridge Access"; req_access_txt = "19"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.7; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"aPV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aPW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aPX" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
@@ -2206,7 +2206,7 @@
"aQv" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aQw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/lawoffice)
"aQx" = (/obj/machinery/photocopier,/obj/machinery/camera{c_tag = "Law Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/lawoffice)
-"aQy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
+"aQy" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aQz" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/under/assistantformal,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
"aQA" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/light/small{dir = 1},/obj/item/clothing/under/assistantformal,/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
"aQB" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/under/assistantformal,/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
@@ -2225,15 +2225,15 @@
"aQO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/hallway/secondary/construction{name = "\improper Garden"})
"aQP" = (/obj/machinery/door/firedoor/border_only{density = 1; dir = 8; icon_state = "door_closed"; name = "Animal Pen A"; opacity = 1},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aQQ" = (/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aQR" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"aQR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_command{layer = 2.9; name = "Bridge Access"; open_layer = 2.9; req_access_txt = "19"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.7; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"aQS" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engine/engineering)
"aQT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/engine/engineering)
"aQU" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/engine/engineering)
-"aQV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aQW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/engine/engineering)
-"aQX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
-"aQY" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"aQZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
+"aQV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
+"aQW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker)
+"aQX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aQY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aQZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aRa" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"aRb" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering)
"aRc" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/engine/engineering)
@@ -2243,7 +2243,7 @@
"aRg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"aRh" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/space)
"aRi" = (/obj/machinery/pipedispenser,/turf/simulated/floor/plating,/area/construction)
-"aRj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aRj" = (/obj/machinery/door/airlock/glass_command{layer = 2.9; name = "Bridge Access"; req_access_txt = "19"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.7; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"aRk" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/shuttle/plating,/area/shuttle/supply)
"aRl" = (/obj/machinery/door/airlock/external{name = "Supply Dock Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aRm" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/quartermaster/storage)
@@ -2275,10 +2275,10 @@
"aRM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/lawoffice)
"aRN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/lawoffice)
"aRO" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/lawoffice)
-"aRP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
-"aRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
-"aRR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
-"aRS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker)
+"aRP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aRQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"aRR" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/storage/primary)
+"aRS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aRT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aRU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aRV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
@@ -2287,7 +2287,7 @@
"aRY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=14.5-Recreation"; location = "14.3-Lockers-Dorms"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aRZ" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
"aSa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aSb" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aSb" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aSc" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
"aSd" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/mob/living/simple_animal/chicken{name = "Kentucky"; real_name = "Kentucky"},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aSe" = (/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
@@ -2296,7 +2296,7 @@
"aSh" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/item/device/gps,/turf/simulated/floor/plating,/area/engine/engineering)
"aSi" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating,/area/engine/engineering)
"aSj" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
-"aSk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aSk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"aSl" = (/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = -2; pixel_y = 3},/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aSm" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/engine/engineering)
"aSn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering)
@@ -2368,12 +2368,12 @@
"aTB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"})
"aTC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aTD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aTE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aTE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/disposalpipe/sortjunction{sortType = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering)
"aTF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
"aTG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aTH" = (/obj/machinery/power/apc{dir = 4; name = "Garden APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/disposal,/obj/machinery/camera{c_tag = "Garden"; dir = 8; network = list("SS13")},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
"aTI" = (/obj/machinery/power/apc{cell_type = 10000; dir = 8; name = "Engine Room APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"aTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aTJ" = (/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/extinguisher_cabinet{pixel_x = -31; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"aTK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aTL" = (/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/book/manual/engineering_singularity_safety{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aTM" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/space)
@@ -2381,7 +2381,7 @@
"aTO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"aTP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/construction)
"aTQ" = (/obj/machinery/light_construct{dir = 4},/turf/simulated/floor/plasteel,/area/construction)
-"aTR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aTR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"aTS" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply,/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/shuttle/plating,/area/shuttle/supply)
"aTT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aTU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/storage)
@@ -2398,7 +2398,7 @@
"aUf" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/item/weapon/cartridge/lawyer,/obj/item/weapon/pen/multi,/turf/simulated/floor/wood,/area/lawoffice)
"aUg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/storage/primary)
"aUh" = (/obj/structure/table,/obj/item/weapon/wirecutters,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/requests_console{department = "Tool Storage"; departmentType = 0; pixel_x = 30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/camera{c_tag = "Tool Storage"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/storage/primary)
-"aUi" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/crew_quarters/locker)
+"aUi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_command{layer = 2.9; name = "Bridge Access"; req_access_txt = "19"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; layer = 2.7; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"aUj" = (/obj/structure/table,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/aiModule/quarantine,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aUk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"aUl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
@@ -2410,9 +2410,9 @@
"aUr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"aUs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"; req_access_txt = "42"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"aUt" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint2{name = "Customs"})
-"aUu" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/storage/primary)
+"aUu" = (/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aUv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Law Office"; req_access_txt = "38"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/lawoffice)
-"aUw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"aUw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Inner Pipe Access"; req_access_txt = "24"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/atmos)
"aUx" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light/small{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aUy" = (/obj/structure/table,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"aUz" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
@@ -2421,11 +2421,11 @@
"aUC" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 4; pixel_y = -4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aUD" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aUF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"aUG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUH" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUI" = (/obj/structure/rack,/obj/item/clothing/gloves/color/fyellow,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"aUJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"aUJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "kitchenwindow"; layer = 2.9; name = "kitchen shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"aUK" = (/obj/machinery/computer/atmos_alert,/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering)
"aUL" = (/obj/machinery/computer/station_alert,/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering)
"aUM" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/computer/monitor{name = "Engineering Power Monitoring Console"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering - Power Monitoring"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering)
@@ -2433,19 +2433,19 @@
"aUO" = (/obj/machinery/vending/engivend,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aUP" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aUQ" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
-"aUR" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/black,/obj/item/weapon/extinguisher{pixel_x = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
-"aUS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aUR" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aUT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/crowbar,/obj/item/stack/cable_coil,/obj/item/weapon/screwdriver,/obj/item/weapon/weldingtool,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"aUU" = (/obj/structure/window/reinforced,/turf/space,/area/space)
"aUV" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space)
"aUW" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
-"aUX" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/construction)
+"aUX" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "kitchenwindow"; layer = 2.9; name = "kitchen shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"aUY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/construction)
"aUZ" = (/obj/structure/table,/obj/item/stack/cable_coil{amount = 5},/obj/item/device/flashlight,/turf/simulated/floor/plasteel,/area/construction)
-"aVa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aVa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aVb" = (/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/plating,/area/shuttle/supply)
-"aVc" = (/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"aVd" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage)
+"aVc" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aVd" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos)
"aVe" = (/obj/machinery/conveyor{dir = 9; id = "QMLoad"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aVf" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage)
"aVg" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
@@ -2460,10 +2460,10 @@
"aVp" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/qm{pixel_x = 0; pixel_y = 0},/obj/machinery/status_display{density = 0; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"aVq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aVr" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/storage/primary)
-"aVs" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Magistrate's Office"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom)
+"aVs" = (/obj/machinery/camera{c_tag = "NT Representative's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/newscaster/security_unit{pixel_y = -32},/obj/machinery/photocopier/faxmachine/longrange,/turf/simulated/floor/wood,/area/ntrep)
"aVt" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/storage/primary)
"aVu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aVv" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/item/clothing/gloves/color/yellow,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/storage/primary)
+"aVv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"aVw" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aVx" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Upload APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Port"; dir = 1; network = list("SS13","RD","AIUpload")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"aVy" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
@@ -2495,7 +2495,7 @@
"aVY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aVZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aWa" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aWb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aWb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"aWc" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 6},/area/hallway/secondary/construction{name = "\improper Garden"})
"aWd" = (/obj/machinery/door/firedoor/border_only{density = 1; dir = 8; icon_state = "door_closed"; name = "Animal Pen B"; opacity = 1},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aWe" = (/mob/living/simple_animal/cow{name = "Betsy"; real_name = "Betsy"},/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
@@ -2507,11 +2507,11 @@
"aWk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
"aWl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"aWm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/engine/engineering)
-"aWn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aWo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/disposalpipe/sortjunction{sortType = 5},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering)
-"aWp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"aWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"aWr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"aWn" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Engineering - Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"aWo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aWp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aWq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aWr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"aWs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
"aWt" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
"aWu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering)
@@ -2559,11 +2559,11 @@
"aXk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"aXl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/crew_quarters/locker)
"aXm" = (/obj/structure/rack,/obj/item/weapon/storage/briefcase,/obj/item/weapon/storage/briefcase{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker)
-"aXn" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/paper/hydroponics,/obj/item/weapon/coin/silver,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXo" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXp" = (/obj/structure/table,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXr" = (/obj/structure/table,/obj/machinery/light,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXn" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/paper/hydroponics,/obj/item/weapon/coin/silver,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXo" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/device/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXp" = (/obj/structure/table,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aXr" = (/obj/structure/table,/obj/machinery/light,/obj/item/device/plant_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"})
"aXs" = (/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"aXt" = (/obj/machinery/power/terminal,/obj/structure/cable,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/engine/engineering)
"aXu" = (/obj/machinery/power/terminal,/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
@@ -2573,10 +2573,10 @@
"aXy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aXz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"aXA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aXB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aXC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aXD" = (/turf/simulated/floor/plasteel,/area/engine/engineering)
-"aXE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aXB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aXC" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aXD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aXE" = (/obj/machinery/camera/emp_proof{c_tag = "Aft Arm - Far"; dir = 8; network = list("Singulo")},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"aXF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aXG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"aXH" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
@@ -2587,7 +2587,7 @@
"aXM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"aXN" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
"aXO" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"aXP" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/hallway/secondary/entry{name = "Arrivals"})
+"aXP" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating,/area/maintenance/starboard)
"aXQ" = (/obj/machinery/light/small,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/hallway/secondary/entry{name = "Arrivals"})
"aXR" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/hallway/secondary/entry{name = "Arrivals"})
"aXS" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
@@ -2643,18 +2643,18 @@
"aYQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aYR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aYS" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker)
-"aYT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aYT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"aYU" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/chiefs_office)
"aYV" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -24},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/chiefs_office)
"aYW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
"aYX" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"aYY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"aYZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"aZa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"aZb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"aZc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/machinery/camera{c_tag = "Engineering - Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"aZd" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/engine/engineering)
-"aZe" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"aZa" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
+"aZb" = (/obj/machinery/light/small,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"aZc" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aZd" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"aZe" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/hardsuit/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/elite,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"aZf" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"aZg" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering)
"aZh" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/space,/area/space)
@@ -2664,7 +2664,7 @@
"aZl" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"aZm" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"aZn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Arrivals Expansion Area"; req_access_txt = "32"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
-"aZo" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aZo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/break_room)
"aZp" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/supply)
"aZq" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/shuttle/supply)
"aZr" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/plating,/area/shuttle/supply)
@@ -2710,8 +2710,8 @@
"baf" = (/obj/machinery/vending/clothing,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
"bag" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/locker)
"bah" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bai" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
-"baj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
+"bai" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/library)
+"baj" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics)
"bak" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bal" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bam" = (/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
@@ -2722,11 +2722,11 @@
"bar" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"bas" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"bat" = (/obj/machinery/light_switch,/turf/simulated/wall,/area/engine/engineering)
-"bau" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"bau" = (/obj/item/clothing/head/fedora,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bav" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"baw" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/engine/engineering)
"bax" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"bay" = (/obj/machinery/camera/emp_proof{c_tag = "Aft Arm - Far"; dir = 8; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"bay" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"})
"baz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
"baA" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-13"; layer = 4.1; tag = "icon-plant-13"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"baB" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -2741,7 +2741,7 @@
"baK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"baL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"})
"baM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry{name = "Arrivals"})
-"baN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
+"baN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"baO" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/hallway/secondary/entry{name = "Arrivals"})
"baP" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/simulated/shuttle/plating,/area/shuttle/supply)
"baQ" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating,/area/shuttle/supply)
@@ -2757,9 +2757,9 @@
"bba" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/checkpoint/supply{name = "Security Post - Cargo"})
"bbb" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/security/checkpoint/supply{name = "Security Post - Cargo"})
"bbc" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/supply{name = "Security Post - Cargo"})
-"bbd" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/hallway/primary/port)
-"bbe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
-"bbf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
+"bbd" = (/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_y = 28},/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/atmos)
+"bbe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bbf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Foyer"; req_access_txt = "0"; req_one_access_txt = "32;19;70"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/engine/break_room)
"bbg" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
"bbh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
"bbi" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
@@ -2795,9 +2795,9 @@
"bbM" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/command{name = "Chief Engineer's Office"; req_access_txt = "56"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/chiefs_office)
"bbN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/engineering)
"bbO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"bbP" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
-"bbQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"bbR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
+"bbP" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/atmos)
+"bbQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/weapon/storage/pill_bottle/dice,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bbS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"bbT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"bbU" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/emitter{anchored = 1; dir = 1; state = 2},/turf/simulated/floor/plating/airless,/area/engine/engineering)
@@ -2836,7 +2836,7 @@
"bcB" = (/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/reinforced,/obj/machinery/camera{c_tag = "Security Post - Cargo"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint/supply{name = "Security Post - Cargo"})
"bcC" = (/obj/item/weapon/book/manual/security_space_law,/obj/machinery/newscaster{hitstaken = 1; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint/supply{name = "Security Post - Cargo"})
"bcD" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/checkpoint/supply{name = "Security Post - Cargo"})
-"bcE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bcE" = (/obj/machinery/power/apc{dir = 8; name = "Aft Port Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"bcF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/trash/popcorn,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bcG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bcH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -2869,7 +2869,7 @@
"bdi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bdj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bdk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bdl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"bdl" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bdm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/starboard)
"bdn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bdo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -2915,7 +2915,7 @@
"bec" = (/obj/machinery/camera{c_tag = "Cargo Bay - Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/quartermaster/storage)
"bed" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/quartermaster/storage)
"bee" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/quartermaster/storage)
-"bef" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge)
+"bef" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/maintenance/starboard)
"beg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"beh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bei" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -2957,7 +2957,7 @@
"beS" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 29},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint/engineering)
"beT" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 5},/obj/item/weapon/pen,/obj/machinery/newscaster/security_unit{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint/engineering)
"beU" = (/obj/machinery/door/airlock/external{name = "South Containment Arm Access"},/turf/simulated/floor/plating,/area/engine/engineering)
-"beV" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/engine/engineering)
+"beV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"beW" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"beX" = (/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"beY" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
@@ -2972,9 +2972,9 @@
"bfh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bfi" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"bfj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bfk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bfk" = (/obj/machinery/light_construct,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"bfl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bfm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bfm" = (/obj/structure/noticeboard{pixel_y = 32},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -5; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/screwdriver{pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
"bfn" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bfo" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bfp" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/quartermaster/storage)
@@ -3025,7 +3025,7 @@
"bgi" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/storage/tools)
"bgj" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bgk" = (/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/obj/machinery/vending/artvend,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/storage/primary)
-"bgl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"bgl" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
"bgm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/storage/tech)
"bgn" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bgo" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
@@ -3047,9 +3047,9 @@
"bgE" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/security/checkpoint/engineering)
"bgF" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/light{dir = 4},/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/engineering)
"bgG" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/engine/engineering)
-"bgH" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/engine/engineering)
-"bgI" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/engine/engineering)
-"bgJ" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/engine/engineering)
+"bgH" = (/obj/structure/closet/secure_closet/medical3,/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
+"bgI" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
+"bgJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bgK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering)
"bgL" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering)
"bgM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/space)
@@ -3065,8 +3065,8 @@
"bgW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"bgX" = (/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"})
"bgY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bgZ" = (/obj/item/stack/sheet/cardboard,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bha" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/turf/simulated/floor/plating,/area/bridge)
+"bgZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"bha" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bhb" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/conveyor{backwards = 1; dir = 2; forwards = 2; id = "packageSort2"},/turf/simulated/floor/plasteel{icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bhc" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"})
"bhd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
@@ -3087,7 +3087,7 @@
"bhs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/janitor)
"bht" = (/turf/simulated/wall,/area/maintenance/maintcentral{name = "Central Maintenance"})
"bhu" = (/obj/machinery/door/airlock{name = "Central Emergency Storage"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
-"bhv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge)
+"bhv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"bhw" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bhx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bhy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
@@ -3099,7 +3099,7 @@
"bhE" = (/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 8; network = list("SS13")},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/storage/tools)
"bhF" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bhG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bhH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/turf/simulated/floor/plating,/area/bridge)
+"bhH" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8; name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/structure/extinguisher_cabinet{pixel_x = 31; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"bhI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
"bhJ" = (/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
"bhK" = (/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/janitor)
@@ -3119,7 +3119,7 @@
"bhY" = (/obj/machinery/power/apc{dir = 8; name = "Engineering Security APC"; pixel_x = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint/engineering)
"bhZ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/security/checkpoint/engineering)
"bia" = (/obj/machinery/computer/secure_data,/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the singularity engine safely."; dir = 8; name = "Singularity Monitor"; network = list("Singulo"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/engineering)
-"bib" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/engine/engineering)
+"bib" = (/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/weapon/wrench,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"bic" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bid" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai)
"bie" = (/obj/machinery/camera{c_tag = "Mini Satellite AI Chamber North"; dir = 2; network = list("SS13","MiniSat")},/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 2; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = 0; pixel_y = 20},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
@@ -3145,7 +3145,7 @@
"biy" = (/obj/machinery/computer/card,/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/camera{c_tag = "Customs Checkpoint"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2{name = "Customs"})
"biz" = (/obj/machinery/computer/secure_data,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2{name = "Customs"})
"biA" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint2{name = "Customs"})
-"biB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"biB" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"biC" = (/obj/machinery/light/small{dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"biD" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"})
"biE" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/structure/disposaloutlet{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
@@ -3158,13 +3158,13 @@
"biL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
"biM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
"biN" = (/obj/machinery/computer/supplycomp,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
-"biO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/turf/simulated/floor/plating,/area/bridge)
+"biO" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"biP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/port)
"biQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"biR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"biS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"biT" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/hallway/primary/port)
-"biU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge)
+"biU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"biV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central)
"biW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 22},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"biX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
@@ -3194,13 +3194,13 @@
"bjv" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/storage/tech)
"bjw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bjx" = (/obj/machinery/vending/assist,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
-"bjy" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
+"bjy" = (/obj/structure/table,/obj/item/device/plant_analyzer,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bjz" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/healthanalyzer,/obj/machinery/camera/autoname{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bjA" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/device/multitool,/obj/item/clothing/glasses/meson,/obj/machinery/light_switch{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bjB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
"bjC" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bjD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
-"bjE" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/shoes/magboots/advance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
+"bjE" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bjF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/secure/briefcase,/obj/item/clothing/mask/cigarette/cigar,/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat","tcomm"); pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"bjG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson,/obj/machinery/door_control{id = "ceprivacy"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"bjH" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
@@ -3231,7 +3231,7 @@
"bkg" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"bkh" = (/obj/machinery/camera{c_tag = "Arrivals Shuttle"; dir = 2; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"bki" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/arrival/station)
-"bkj" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
+"bkj" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4)
"bkk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/tools)
"bkl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2{name = "Customs"})
"bkm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/checkpoint2{name = "Customs"})
@@ -3249,7 +3249,7 @@
"bky" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort2"; pixel_x = -2; pixel_y = 12},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bkz" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Cargo - Office"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bkA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
-"bkB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
+"bkB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/mob/living/simple_animal/pet/sloth/paperwork,/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
"bkC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/office{name = "\improper Cargo Office"})
"bkD" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bkE" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/port)
@@ -3266,14 +3266,14 @@
"bkP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"bkQ" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"bkR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/tools)
-"bkS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "ceprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"bkT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "ceprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"bkS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
+"bkT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"bkU" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/checkpoint/engineering)
"bkV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/checkpoint/engineering)
"bkW" = (/turf/simulated/wall/r_wall,/area/bridge)
-"bkX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge)
-"bkY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge)
-"bkZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Internal Affairs Office"},/turf/simulated/floor/wood,/area/lawoffice)
+"bkX" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"bkY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/binary/valve{dir = 2; name = "output gas to space"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"bkZ" = (/obj/machinery/light/small{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"bla" = (/obj/effect/landmark/start{name = "Captain"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/comfy/brown{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"blb" = (/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"blc" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
@@ -3283,7 +3283,7 @@
"blg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/central)
"blh" = (/obj/structure/sign/directions/security{dir = 4; pixel_y = 8},/obj/structure/sign/directions/engineering{dir = 4},/turf/simulated/wall,/area/janitor)
"bli" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/mechanic_workshop)
-"blj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor/plasteel,/area/storage/tools)
+"blj" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"blk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint2{name = "Customs"})
"bll" = (/obj/structure/closet/emcloset,/obj/structure/sign/double/map/left{icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/starboard)
"blm" = (/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; icon_state = "map-right-MS"; pixel_y = 32},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/starboard)
@@ -3291,19 +3291,19 @@
"blo" = (/turf/simulated/wall,/area/hallway/primary/starboard)
"blp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/storage/tech)
"blq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{icon = 'icons/obj/doors/Dooreng.dmi'; name = "Tech Storage"; req_access_txt = "0"; req_one_access_txt = "23;30"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
-"blr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/turf/simulated/floor/plating,/area/bridge)
+"blr" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"bls" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/break_room)
"blt" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/break_room)
"blu" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/break_room)
"blv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
"blw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Engineering Security Post"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/checkpoint/engineering)
"blx" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
-"bly" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4)
+"bly" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_4)
"blz" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f10"; layer = 2},/area/shuttle/pod_4)
"blA" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
"blB" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/pod_4)
"blC" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/civilian/barber)
-"blD" = (/obj/machinery/camera/motion{c_tag = "Mini Satellite AI Chamber"; dir = 2; network = list("SS13","MiniSat")},/obj/machinery/door/window/southright{dir = 4; name = "AI Core Door"; req_access = null; req_access_txt = "16"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "vault"},/area/turret_protected/ai)
+"blD" = (/obj/machinery/camera/motion{c_tag = "Mini Satellite AI Chamber"; dir = 2; network = list("SS13","MiniSat"); start_active = 1},/obj/machinery/door/window/southright{dir = 4; name = "AI Core Door"; req_access = null; req_access_txt = "16"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "vault"},/area/turret_protected/ai)
"blE" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"blF" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/flasher{id = "AI"; pixel_x = 24; pixel_y = -24},/obj/machinery/requests_console{department = "AI"; departmentType = 5; name = "AI Requests Console"; pixel_x = 32; pixel_y = 32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"},/area/turret_protected/ai)
"blG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/turret_protected/ai)
@@ -3321,7 +3321,7 @@
"blS" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"blT" = (/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"blU" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
-"blV" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
+"blV" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_r"; tag = "icon-burst_r (WEST)"},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"blW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"blX" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint2{name = "Customs"})
"blY" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2{name = "Customs"})
@@ -3353,7 +3353,7 @@
"bmy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-j1"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bmz" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/hallway/primary/port)
"bmA" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/hallway/primary/port)
-"bmB" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bmB" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bmC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/lizard{name = "Wags-His-Tail"; real_name = "Wags-His-Tail"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark/start{name = "Janitor"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
"bmE" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
@@ -3369,7 +3369,7 @@
"bmO" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"bmP" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/clipboard,/obj/item/weapon/paper/monitorkey,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/engine/chiefs_office)
"bmQ" = (/obj/machinery/power/apc{dir = 8; name = "Custodial Closet APC"; pixel_x = -24},/obj/structure/table,/obj/item/clothing/gloves/color/orange,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/key/janitor,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor)
-"bmR" = (/obj/structure/table/woodentable,/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 1},/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
+"bmR" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/clothing/mask/gas,/obj/item/device/multitool{pixel_x = 3},/obj/machinery/computer/guestpass{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/lab)
"bmS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bmT" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/camera{c_tag = "Mini Satellite AI Chamber South"; dir = 2; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"bmU" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -4},/obj/item/device/camera{pixel_y = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (Captain)"; pixel_x = -28},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
@@ -3409,11 +3409,11 @@
"bnC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/break_room)
"bnD" = (/obj/machinery/disposal{pixel_x = 2; pixel_y = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/break_room)
"bnE" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{aidisabled = 0; cell_type = 5000; dir = 1; name = "AI Core APC"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"bnF" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_4)
+"bnF" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"; tag = "icon-propulsion (WEST)"},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"bnG" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/obj/docking_port/mobile/pod{dir = 4; id = "pod4"; name = "escape pod 4"},/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
"bnH" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_4)
"bnI" = (/obj/machinery/door/airlock/external{name = "Escape Pod Four"; req_access = null; req_access_txt = "32"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bnJ" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/maintenance/starboard)
+"bnJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "AI Chamber Entrance Shutters"; name = "AI Chamber Entrance Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/flasher{id = "AI"; pixel_x = -25; pixel_y = 0},/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Chamber"; req_access_txt = "16"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"bnK" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bnL" = (/obj/machinery/porta_turret{dir = 8},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai)
"bnM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
@@ -3431,7 +3431,7 @@
"bnY" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"})
"bnZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"})
"boa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/security{name = "Customs Desk"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/checkpoint2{name = "Customs"})
-"bob" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads)
+"bob" = (/obj/machinery/ignition_switch{id = "Turbine_igniter"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "turbine_control"; name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "0"; tag_exterior_door = "gas_turbine_exterior"; tag_interior_door = "gas_turbine_interior"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"boc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
"bod" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"boe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -3457,7 +3457,7 @@
"boy" = (/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"boz" = (/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"boA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/civilian/barber)
-"boB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/card,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
+"boB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/modular_computer/console/preset/command,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"boC" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"boD" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"boE" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
@@ -3595,7 +3595,7 @@
"brg" = (/obj/machinery/door/window/eastright{dir = 4; name = "MiniSat Walkway Access"; req_access_txt = "13;75"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"brh" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bri" = (/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior{name = "\improper MiniSat Central Foyer"})
-"brj" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
+"brj" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plating/airless,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"brk" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"brl" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/pen/multi,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"brm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/ai_status_display{pixel_y = -32},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
@@ -3606,7 +3606,7 @@
"brr" = (/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = -32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"brs" = (/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"brt" = (/obj/machinery/requests_console{department = "Arrival shuttle"; pixel_y = -30},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"bru" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
+"bru" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_l"; tag = "icon-burst_l (WEST)"},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"brv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"brw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"brx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
@@ -3634,7 +3634,7 @@
"brT" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"brU" = (/obj/item/device/radio/off,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/maintcentral{name = "Central Maintenance"})
"brV" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Bridge"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/maintcentral{name = "Central Maintenance"})
-"brW" = (/obj/machinery/door/window/westleft{dir = 4; name = "Bridge Deliveries"; req_access_txt = "19"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; name = "bridge blast door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge)
+"brW" = (/obj/structure/disposalpipe/segment,/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"brX" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/hallway/primary/port)
"brY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"brZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
@@ -3651,8 +3651,8 @@
"bsk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bsl" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/central)
"bsm" = (/turf/simulated/wall,/area/civilian/barber)
-"bsn" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
-"bso" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Barber Shop"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/civilian/barber)
+"bsn" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating/airless,/area/construction/hallway{name = "\improper MiniSat Exterior"})
+"bso" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass{name = "Barber Shop"},/turf/simulated/floor/plasteel,/area/civilian/barber)
"bsp" = (/turf/simulated/wall,/area/crew_quarters/bar)
"bsq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bsr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/maintenance/starboard)
@@ -3661,7 +3661,7 @@
"bsu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
"bsv" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/starboard)
"bsw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
-"bsx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Foyer"; req_access_txt = "0"; req_one_access_txt = "32;19"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"bsx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"bsy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
"bsz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel,/area/engine/break_room)
"bsA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
@@ -3678,13 +3678,13 @@
"bsL" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/space,/area/space)
"bsM" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"})
"bsN" = (/obj/structure/transit_tube{tag = "icon-D-NW"; icon_state = "D-NW"},/turf/space,/area/space)
-"bsO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Chamber"; req_access_txt = "16"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "AI Chamber Entrance Shutters"; name = "AI Chamber Entrance Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/flasher{id = "AI"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"bsO" = (/obj/structure/table/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hop"; layer = 3.1; name = "privacy shutters"; opacity = 0},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/machinery/door/window/northleft{dir = 2; icon_state = "left"; name = "Reception Window"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bsP" = (/obj/structure/transit_tube{icon_state = "D-SE"; tag = "icon-D-SW"},/obj/structure/lattice,/turf/space,/area/space)
"bsQ" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
"bsR" = (/obj/structure/transit_tube{icon_state = "E-SW"; tag = "icon-E-NW"},/obj/structure/lattice,/turf/space,/area/space)
"bsS" = (/obj/structure/transit_tube{icon_state = "W-SE"},/turf/space,/area/space)
"bsT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
-"bsU" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
+"bsU" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating/airless,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bsV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/teleport/station,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"})
"bsW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"})
"bsX" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"})
@@ -3700,7 +3700,7 @@
"bth" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"bti" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station)
"btj" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
-"btk" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/library)
+"btk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/blueshield)
"btl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"btm" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"btn" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port)
@@ -3727,10 +3727,10 @@
"btI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Port Primary Hallway"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/port)
"btJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"btK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=4-Customs"; location = "3-Central-Port"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"btL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads)
+"btL" = (/obj/machinery/light/small,/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 8; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 0; pixel_y = -29},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"btM" = (/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"btN" = (/obj/effect/landmark/start{name = "Head of Personnel"},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"btO" = (/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 0},/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/structure/table/woodentable,/obj/item/weapon/storage/box/ids,/obj/item/weapon/storage/box/ids,/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"btO" = (/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 0},/obj/machinery/computer/security/mining,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"btP" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"btQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"btR" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 29},/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
@@ -3753,7 +3753,7 @@
"bui" = (/obj/structure/rack,/obj/item/weapon/cane,/turf/simulated/floor/plating,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"buj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Central Primary Hallway - Starboard - Art Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"buk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central)
-"bul" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads)
+"bul" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/door_control{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "12"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"bum" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/secure/briefcase,/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bun" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/civilian/barber)
"buo" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/civilian/barber)
@@ -3805,7 +3805,7 @@
"bvi" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bvj" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/camera{c_tag = "Arrivals - Station Entrance"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bvk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"bvl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"bvl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/blueshield)
"bvm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Transit Tube"; req_one_access_txt = "32;19"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/break_room)
"bvn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "transittube"; name = "Transit Tube Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/break_room)
"bvo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/break_room)
@@ -3817,8 +3817,8 @@
"bvu" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
"bvv" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/obj/structure/transit_tube{tag = "icon-D-NE"; icon_state = "D-NE"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"bvw" = (/obj/structure/transit_tube,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"bvx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads)
-"bvy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/clothing/head/fedora,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bvx" = (/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "12"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"bvy" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/ntrep)
"bvz" = (/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bvA" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera{c_tag = "Arrivals - Lounge"; dir = 4; network = list("SS13")},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port)
"bvB" = (/turf/simulated/floor/carpet,/area/hallway/primary/port)
@@ -3845,9 +3845,9 @@
"bvW" = (/obj/structure/window/reinforced,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bvX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/window{dir = 2; name = "HoP's Desk"; pixel_y = 0; req_access_txt = "57"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bvY" = (/obj/structure/filingcabinet/chestdrawer{pixel_y = 6},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"bvZ" = (/obj/machinery/vending/cart{req_access_txt = "57"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"bwa" = (/obj/machinery/computer/security/mining,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"bwb" = (/obj/machinery/computer/ordercomp,/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"bvZ" = (/obj/machinery/vending/cart{req_access_txt = "57"},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"bwa" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/dogbed/ian,/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"bwb" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/computer/ordercomp,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bwc" = (/obj/structure/closet/secure_closet/hop,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bwd" = (/turf/simulated/wall,/area/crew_quarters/heads)
"bwe" = (/obj/structure/window/reinforced,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
@@ -3884,7 +3884,7 @@
"bwJ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = 19},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard)
"bwK" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bwL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
-"bwM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"bwM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
"bwN" = (/obj/item/device/assembly/prox_sensor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bwO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bwP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard)
@@ -3991,10 +3991,10 @@
"byM" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"byN" = (/obj/structure/closet/gmcloset{desc = "It's a storage unit."; icon_state = "black"; name = "spare gear"},/obj/item/weapon/wrench,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"byO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"byP" = (/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"byP" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_exterior"; locked = 1; name = "Incinerator Exterior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
"byQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"byR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"byS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
+"byS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab)
"byT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/hallway/primary/starboard)
"byU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard)
"byV" = (/obj/machinery/door/airlock/maintenance{name = "Engineering Foyer Maintenance"; req_access_txt = "0"; req_one_access_txt = "32;19"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/break_room)
@@ -4050,7 +4050,7 @@
"bzT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bzU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bzV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bzW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
+"bzW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bzX" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bzY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bzZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
@@ -4071,7 +4071,7 @@
"bAo" = (/turf/simulated/floor/carpet{tag = "icon-carpet14-10"; icon_state = "carpet14-10"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bAp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet{tag = "icon-carpet14-10"; icon_state = "carpet14-10"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bAq" = (/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/carpet{tag = "icon-carpet10-8"; icon_state = "carpet10-8"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
-"bAr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/maintcentral{name = "Central Maintenance"})
+"bAr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
"bAs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bAt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bAu" = (/obj/machinery/vending/boozeomat,/turf/simulated/wall,/area/crew_quarters/bar)
@@ -4091,9 +4091,9 @@
"bAI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard)
"bAJ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bAK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"bAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
"bAM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bAN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"bAN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telelab"; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/explab)
"bAO" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/engine/break_room)
"bAP" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/break_room)
"bAQ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/break_room)
@@ -4187,7 +4187,7 @@
"bCA" = (/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = 0; pixel_y = 28},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bCB" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Bar APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bCC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bCD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bCD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/ntrep)
"bCE" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Club - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bCF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bCG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -4253,10 +4253,10 @@
"bDO" = (/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
"bDP" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
"bDQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
-"bDR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bDR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bDS" = (/obj/effect/spawner/lootdrop{loot = list(/obj/item/weapon/gun/projectile/revolver/russian,/obj/item/clothing/mask/cigarette/cigar/cohiba,/obj/item/toy/cards/deck/syndicate); name = "gambling valuables spawner"},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bDT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos)
-"bDU" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 2; icon_state = "left"; name = "Reception Window"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hop"; layer = 3.1; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bDU" = (/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "hopqueue"; name = "HoP Queue Shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bDV" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bDW" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/obj/machinery/firealarm{pixel_y = 28},/obj/item/weapon/book/manual/security_space_law{pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bDX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Council Chamber"; req_access = null; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
@@ -4414,7 +4414,7 @@
"bGT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bGU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bGV" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Telecoms Control Room APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/computer/telecomms/server{network = "tcommsat"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
-"bGW" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
+"bGW" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
"bGX" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport)
"bGY" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport)
"bGZ" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/transport)
@@ -4443,9 +4443,9 @@
"bHw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/library)
"bHx" = (/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor/wood,/area/library)
"bHy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "council blast"; layer = 2.9; name = "Council Blast Doors"; opacity = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/bridge)
-"bHz" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "hopqueue"; name = "HoP Queue Shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
+"bHz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "hopqueue"; name = "HoP Queue Shutters"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "loadingarea"; tag = "loading"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bHA" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/bar)
-"bHB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "hopqueue"; name = "HoP Queue Shutters"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "loadingarea"; tag = "loading"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
+"bHB" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bHC" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard)
"bHD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Access Blast Door Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bHE" = (/obj/structure/disposalpipe/segment,/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -4463,7 +4463,7 @@
"bHQ" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bHR" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/crew_quarters/bar)
"bHS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bHT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/weapon/storage/pill_bottle/dice,/obj/structure/table/woodentable/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bHT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bHU" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bHV" = (/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Mime"},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bHW" = (/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
@@ -4507,11 +4507,11 @@
"bII" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bIJ" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bIK" = (/obj/structure/stool/bed/chair,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
-"bIL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/blueshield)
+"bIL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bIM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bIN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bIO" = (/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; name = "bridge blast door"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_command{name = "Bridge Access"; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
-"bIP" = (/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
+"bIO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telelab"; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/explab)
+"bIP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telelab"; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/explab)
"bIQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bIR" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bIS" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -4559,9 +4559,9 @@
"bJI" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bJK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Club"; opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"bJL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bJL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bJM" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bJN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/blueshield)
+"bJN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bJO" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bJP" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick{pixel_y = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/obj/item/device/guitar,/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"bJQ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/starboard)
@@ -4586,7 +4586,7 @@
"bKj" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 31},/obj/item/weapon/folder/blue,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bKk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bKl" = (/turf/simulated/wall/r_wall,/area/tcommsat/server)
-"bKm" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep)
+"bKm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bKn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bKo" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bKp" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
@@ -4597,7 +4597,7 @@
"bKu" = (/obj/machinery/door/airlock/external{name = "Transport Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"bKv" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/hallway/secondary/entry{name = "Arrivals"})
"bKw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bKx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bKx" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/insulated,/turf/space,/area/space)
"bKy" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bKz" = (/obj/machinery/light_construct{dir = 8},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bKA" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -4617,7 +4617,7 @@
"bKO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bKP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bKQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
-"bKR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; name = "bridge blast door"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge Access"; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
+"bKR" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Turbine_igniter"; luminosity = 2; on = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator)
"bKS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/camera{c_tag = "Command Hallway - Port"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bKT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bKU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
@@ -4628,7 +4628,7 @@
"bKZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bLa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bLb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"})
-"bLc" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"})
+"bLc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bLd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bLe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bLf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
@@ -4654,15 +4654,15 @@
"bLz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bLA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bLB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Club"; opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"bLC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bLD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bLE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep)
+"bLC" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
+"bLD" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bLE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bLF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bLG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/bar)
"bLH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bLI" = (/obj/structure/stool/bed/chair/wood/wings{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bLJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
-"bLK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
+"bLK" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bLL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"bLM" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre)
"bLN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
@@ -4670,7 +4670,7 @@
"bLP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/starboard)
"bLQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard)
"bLR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Atmospherics"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/atmos)
-"bLS" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/atmos)
+"bLS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery)
"bLT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/atmos)
"bLU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/atmos)
"bLV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "blackcorner"},/area/atmos)
@@ -4699,14 +4699,14 @@
"bMs" = (/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bMt" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/camera/motion{c_tag = "Mini Satellite Exterior South East"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bMu" = (/obj/machinery/telecomms/processor/preset_three,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
-"bMv" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
+"bMv" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
"bMw" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/transport)
"bMx" = (/obj/structure/closet/crate,/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bMy" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bMz" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bMA" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bMB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bMC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bMC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bMD" = (/obj/structure/table/woodentable,/obj/item/weapon/folder,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bME" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bMF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -4718,7 +4718,7 @@
"bML" = (/obj/machinery/door/airlock/maintenance{name = "Library Maintenance"; req_access_txt = "0"; req_one_access_txt = "12;37"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bMM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/carpet,/area/library)
"bMN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/library)
-"bMO" = (/turf/simulated/floor/wood{tag = "icon-wood-broken7"; icon_state = "wood-broken7"},/area/library)
+"bMO" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery)
"bMP" = (/obj/machinery/bookbinder,/turf/simulated/floor/wood,/area/library)
"bMQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bMR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central)
@@ -4741,9 +4741,9 @@
"bNi" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/gateway)
"bNj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Gateway Atrium"; req_access_txt = "62"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/gateway)
"bNk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/gateway)
-"bNl" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/gateway)
-"bNm" = (/obj/machinery/vending/cigarette,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -29},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/gateway)
-"bNn" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/gateway)
+"bNl" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
+"bNm" = (/obj/machinery/vending/cigarette,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -29},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
+"bNn" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "kitchen"; name = "Serving Hatch"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bNo" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;17"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"bNp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bNq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -4753,13 +4753,13 @@
"bNu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bNv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bNw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"bNx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bNy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bNz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bNA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
-"bNB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
-"bNC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
-"bND" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
+"bNx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bNy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bNz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bNA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bNB" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen Cold Room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bNC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -26},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bND" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Kitchen - Coldroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bNE" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/light/small{dir = 4},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"bNF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bNG" = (/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
@@ -4777,7 +4777,7 @@
"bNS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/gateway)
"bNT" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/gateway)
"bNU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/gateway)
-"bNV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "kitchenwindow"; name = "kitchen shutters"},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
+"bNV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery)
"bNW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"bNX" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bNY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
@@ -4788,7 +4788,7 @@
"bOd" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport)
"bOe" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry{name = "Arrivals"})
"bOf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bOg" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bOg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
"bOh" = (/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bOi" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/security/vacantoffice)
"bOj" = (/obj/item/weapon/folder/white,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/vacantoffice)
@@ -4836,13 +4836,13 @@
"bOZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bPa" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Kitchen Hatch"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"bPb" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"bPc" = (/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; name = "bridge blast door"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge Access"; req_access_txt = "19"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
+"bPc" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"bPd" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Theatre Stage"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bPe" = (/obj/machinery/light_switch{pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light,/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bPf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/carpet,/area/crew_quarters/theatre)
"bPg" = (/obj/structure/table/woodentable,/obj/machinery/light/small,/obj/item/clothing/glasses/regular/hipster{name = "Hipster Glasses"},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"bPh" = (/obj/item/device/violin,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre)
-"bPi" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"bPi" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"bPj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "yellow"},/area/hallway/primary/starboard)
"bPk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellow"},/area/hallway/primary/starboard)
"bPl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/hallway/primary/starboard)
@@ -4874,7 +4874,7 @@
"bPL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"bPM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"bPN" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bPO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bPO" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/foodcart,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bPP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bPQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bPR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -4883,7 +4883,7 @@
"bPU" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/carpet,/area/security/vacantoffice)
"bPV" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bPW" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/library)
-"bPX" = (/turf/simulated/floor/wood{tag = "icon-wood-broken5"; icon_state = "wood-broken5"},/area/library)
+"bPX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"bPY" = (/obj/machinery/door/window/northright{base_state = "left"; dir = 8; icon_state = "left"; name = "Library Desk Door"; pixel_x = 3; req_access_txt = "37"},/turf/simulated/floor/wood,/area/library)
"bPZ" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/wood,/area/library)
"bQa" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/library/checkout,/turf/simulated/floor/wood,/area/library)
@@ -4907,12 +4907,12 @@
"bQs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/ntrep)
"bQt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/ntrep)
"bQu" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/ntrep)
-"bQv" = (/obj/machinery/door/poddoor/preopen{id_tag = "kitchenwindow"; name = "kitchen shutters"},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
+"bQv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"bQw" = (/obj/structure/closet/l3closet/scientist,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway)
"bQx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/gateway)
"bQy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/gateway)
"bQz" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway)
-"bQA" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/hydroponics)
+"bQA" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator)
"bQB" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/gateway)
"bQC" = (/obj/machinery/gateway{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway)
"bQD" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/gateway)
@@ -4921,11 +4921,11 @@
"bQG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bQH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bQI" = (/turf/simulated/wall,/area/crew_quarters/kitchen)
-"bQJ" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "kitchen"; name = "Serving Hatch"},/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bQK" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "kitchen"; name = "Serving Hatch"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/reagent_containers/food/snacks/pie,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bQJ" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "kitchen"; name = "Serving Hatch"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/reagent_containers/food/snacks/pie,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bQK" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bQL" = (/obj/machinery/computer/security/telescreen/entertainment,/turf/simulated/wall,/area/crew_quarters/kitchen)
-"bQM" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bQN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bQM" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bQN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"bQO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bQP" = (/obj/machinery/vending/snack,/obj/machinery/newscaster{pixel_y = -29},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"bQQ" = (/obj/machinery/vending/coffee,/turf/simulated/floor/carpet,/area/crew_quarters/bar)
@@ -4937,7 +4937,7 @@
"bQW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/maintenance/atmos_control{name = "Telecoms Storage"})
"bQX" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/engineering{name = "Telecoms Storage"; req_access_txt = "61"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/maintenance/atmos_control{name = "Telecoms Storage"})
"bQY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/atmos)
-"bQZ" = (/obj/item/weapon/storage/toolbox/emergency,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bQZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator)
"bRa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"bRb" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 2},/turf/simulated/floor/plasteel,/area/atmos)
"bRc" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel,/area/atmos)
@@ -4963,7 +4963,7 @@
"bRw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bRx" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bRy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Arrivals - Aft Arm"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bRz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bRz" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "tox_airlock_control"; name = "Toxin Mixing Console"; pixel_x = -24; pixel_y = 0; req_access_txt = "0"; tag_airpump = "tox_airlock_apump"; tag_chamber_sensor = "tox_airlock_sensor"; tag_exterior_door = "tox_airlock_exterior"; tag_exterior_sensor = null; tag_interior_door = "tox_airlock_interior"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"bRA" = (/obj/machinery/power/apc{dir = 8; name = "Vacant Office APC"; pixel_x = -25},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bRB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bRC" = (/obj/machinery/light_construct{dir = 4},/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -5001,7 +5001,7 @@
"bSi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/gateway)
"bSj" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/gateway)
"bSk" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway)
-"bSl" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/hallway/primary/central)
+"bSl" = (/obj/machinery/door/poddoor{id_tag = "auxincineratorvent"; name = "Auxiliary Incinerator Vent"},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator)
"bSm" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway)
"bSn" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
"bSo" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway)
@@ -5028,7 +5028,7 @@
"bSJ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/atmos)
"bSK" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/atmos)
"bSL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
-"bSM" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
+"bSM" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/obj/structure/reagent_dispensers/watertank/high,/turf/simulated/floor/plasteel,/area/atmos)
"bSN" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/obj/machinery/camera{c_tag = "Atmospherics - Central"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/atmos)
"bSO" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel,/area/atmos)
"bSP" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
@@ -5058,7 +5058,7 @@
"bTn" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bTo" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bTp" = (/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/jade{pixel_x = 2; pixel_y = 2},/obj/item/weapon/lipstick/purple{pixel_x = -2; pixel_y = -2},/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bTq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bTq" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/cryo)
"bTr" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/rack_parts,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bTs" = (/obj/machinery/light/small,/obj/machinery/power/apc{dir = 8; name = "Library APC"; pixel_x = -25},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/wood,/area/library)
"bTt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/library)
@@ -5122,7 +5122,7 @@
"bUz" = (/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bUA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/eastright{dir = 2; name = "MiniSat Walkway Access"; req_access_txt = "13;75"},/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/camera/motion{c_tag = "AI Satellite Exterior South East 2"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bUB" = (/obj/machinery/door/airlock/external{name = "Auxiliary Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
-"bUC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bUC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bUD" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bUE" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/white,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bUF" = (/obj/item/toy/cards/deck,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -5154,7 +5154,7 @@
"bVf" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -1; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway)
"bVg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/gateway)
"bVh" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/gateway)
-"bVi" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
+"bVi" = (/obj/structure/closet/secure_closet/CMO,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 26},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"bVj" = (/obj/machinery/telecomms/server/presets/common,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bVk" = (/obj/machinery/telecomms/server/presets/engineering,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bVl" = (/obj/machinery/telecomms/server/presets/medical,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
@@ -5202,16 +5202,16 @@
"bWb" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Telecoms Server Room APC"; pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Telecoms - Server Room - Aft-Starboard"; dir = 8; network = list("SS13","tcomm")},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bWc" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/hallway/secondary/entry{name = "Arrivals"})
"bWd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bWe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bWf" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bWe" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab)
+"bWf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen)
"bWg" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bWh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bWh" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
"bWi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/item/trash/candy,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bWj" = (/obj/machinery/door/airlock/maintenance{name = "Vacant Office Maintenance"; req_access_txt = "32"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/security/vacantoffice)
"bWk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/horsehead,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bWl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bWm" = (/obj/structure/rack,/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bWn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bWn" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bWo" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bWp" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/library)
"bWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/library)
@@ -5245,11 +5245,11 @@
"bWS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/gateway)
"bWT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/gateway)
"bWU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/gateway)
-"bWV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorcomglass.dmi'; name = "Gateway Chamber"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/gateway)
+"bWV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/airlock/glass{name = "Gateway Chamber"},/turf/simulated/floor/plasteel,/area/gateway)
"bWW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway)
"bWX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/gateway)
"bWY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway)
-"bWZ" = (/obj/machinery/door/airlock/maintenance{name = "Gateway Maintenance"; req_access_txt = "17"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/gateway)
+"bWZ" = (/obj/machinery/door/airlock/maintenance{name = "Gateway Maintenance"; req_access_txt = "62"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/gateway)
"bXa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/maintcentral{name = "Central Maintenance"})
"bXb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bXc" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
@@ -5258,7 +5258,7 @@
"bXf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bXg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bXh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bXi" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"bXi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bXj" = (/obj/machinery/requests_console{department = "Kitchen"; departmentType = 2; pixel_x = 30; pixel_y = 0},/obj/machinery/processor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bXk" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/clothing/head/chefhat,/obj/item/clothing/under/rank/chef,/obj/item/weapon/storage/box/mousetraps{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/item/clothing/under/waiter,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bXl" = (/obj/effect/landmark/start{name = "Chef"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
@@ -5270,7 +5270,7 @@
"bXr" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"bXs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bXt" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bXu" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos)
+"bXu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery)
"bXv" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/atmos)
"bXw" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"bXx" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/atmos)
@@ -5290,7 +5290,7 @@
"bXL" = (/obj/machinery/hologram/holopad,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/wood,/area/library)
"bXM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/library)
"bXN" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/library)
-"bXO" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/library)
+"bXO" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Turbine Vent"; dir = 4; network = list("Turbine"); use_power = 0},/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/space,/area/space)
"bXP" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/library)
"bXQ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/invisible,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
"bXR" = (/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera,/obj/item/device/radio/intercom{pixel_y = -25},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
@@ -5309,7 +5309,7 @@
"bYe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/blueshield)
"bYf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/wood,/area/blueshield)
"bYg" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/ntrep)
-"bYh" = (/obj/machinery/camera{c_tag = "NT Representative's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "NT Representative's Office"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/newscaster/security_unit{pixel_y = -32},/turf/simulated/floor/wood,/area/ntrep)
+"bYh" = (/obj/structure/cable,/obj/machinery/power/turbine,/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator)
"bYi" = (/obj/machinery/door_control{id = "representative"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "73"},/obj/machinery/computer/secure_data,/turf/simulated/floor/wood,/area/ntrep)
"bYj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet/secure_closet/ntrep,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep)
"bYk" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway)
@@ -5325,18 +5325,18 @@
"bYu" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bYv" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/power/apc{dir = 2; name = "Kitchen APC"; pixel_y = -24},/obj/structure/cable/yellow,/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bYw" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/kitchen/rollingpin,/obj/machinery/camera{c_tag = "Kitchen"; dir = 1; network = list("SS13")},/obj/machinery/door_control{id = "kitchenhydro"; name = "Service Shutter Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bYx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bYy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bYz" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen Cold Room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bYA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bYB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Kitchen - Coldroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bYC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -26},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bYD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bYx" = (/obj/structure/disposalpipe/sortjunction{dir = 2; sortType = 20},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
+"bYy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bYz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/hydroponics)
+"bYA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics)
+"bYB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics)
+"bYC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics)
+"bYD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Hydroponics Backroom"; req_access_txt = "35"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics)
"bYE" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bYF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"bYF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"bYG" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bYH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bYI" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"bYI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "rdprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bYJ" = (/obj/structure/closet/fireaxecabinet{pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Atmospherics - Port"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/atmos)
"bYK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/atmos)
"bYL" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11},/obj/item/weapon/wrench,/turf/simulated/floor/plasteel,/area/atmos)
@@ -5344,15 +5344,15 @@
"bYN" = (/obj/machinery/atmospherics/trinary/filter{dir = 1; on = 1},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/atmos)
"bYO" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"bYP" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Toxins"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
-"bYQ" = (/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Telecoms - Server Room - Aft"; dir = 1; network = list("SS13","tcomm")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
+"bYQ" = (/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Telecoms - Server Room - Aft"; dir = 1; network = list("SS13","tcomm")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/ntnet_relay,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bYR" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bYS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bYT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bYU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bYV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bYW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bYX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"bYY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"bYX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "rdprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"bYY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "rdprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bYZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bZa" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bZb" = (/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/library)
@@ -5363,27 +5363,27 @@
"bZg" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/wood,/area/library)
"bZh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bZi" = (/obj/structure/sign/directions/evac,/obj/structure/sign/directions/medical{pixel_y = 8},/obj/structure/sign/directions/science{pixel_y = -8},/turf/simulated/wall,/area/civilian/barber)
-"bZj" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{id_tag = "evashutter"; name = "E.V.A. Storage Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
-"bZk" = (/obj/machinery/door/poddoor/shutters{id_tag = "teleshutter"; name = "Teleporter Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"})
+"bZj" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "evashutter"; name = "E.V.A. Storage Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
+"bZk" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "teleshutter"; name = "Teleporter Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"})
"bZl" = (/turf/simulated/wall/r_wall,/area/blueshield)
"bZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/command{name = "Blueshield's Office"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield)
"bZn" = (/turf/simulated/wall/r_wall,/area/ntrep)
"bZo" = (/obj/machinery/door/airlock/command{name = "NT Representative's Office"; req_access_txt = "73"},/turf/simulated/floor/wood,/area/ntrep)
"bZp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/ntrep)
-"bZq" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{id_tag = "gateshutter"; name = "Gateway Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/gateway)
+"bZq" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "gateshutter"; name = "Gateway Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/gateway)
"bZr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;17"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"bZs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bZt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"},/area/hallway/primary/central)
"bZu" = (/turf/simulated/wall,/area/hallway/primary/central)
"bZv" = (/turf/simulated/wall,/area/hydroponics)
-"bZw" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "kitchenhydro"; name = "Service Shutter"},/obj/machinery/door/airlock/glass_medical{icon = 'icons/obj/doors/Doorglass.dmi'; id_tag = ""; name = "Service Door"; req_access_txt = "0"; req_one_access_txt = "35;28"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/hydroponics)
+"bZw" = (/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "kitchenhydro"; name = "Service Shutter"},/obj/machinery/door/airlock/glass{name = "Service Door"; req_one_access_txt = "35;28"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/hydroponics)
"bZx" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{dir = 1; name = "Kitchen Window"; req_access_txt = "28"; req_one_access_txt = "0"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/paper,/obj/machinery/door/window/eastleft{dir = 2; name = "Hydroponics Window"; req_access_txt = "0"; req_one_access_txt = "30;35"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics)
"bZy" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/hydroponics)
"bZz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen)
-"bZA" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen)
-"bZB" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
-"bZC" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
-"bZD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bZA" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics)
+"bZB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bZC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bZD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 21},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
"bZE" = (/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Starboard Maintenance APC"; pixel_x = -1; pixel_y = 26},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"bZF" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"bZG" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -5447,30 +5447,30 @@
"caM" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
"caN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
"caO" = (/obj/machinery/chem_master/condimaster{name = "BrewMaster 4000"; pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
-"caP" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
-"caQ" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
-"caR" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
+"caP" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/reagent_dispensers/watertank/high,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
+"caQ" = (/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 29},/obj/structure/reagent_dispensers/watertank/high,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
+"caR" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hydroponics)
"caS" = (/obj/structure/closet{name = "spare parts locker"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/rack_parts,/obj/item/weapon/rack_parts,/obj/item/weapon/wrench,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen)
"caT" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/window/eastright{dir = 1; name = "Kitchen Delivery"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen)
"caU" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Kitchen"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/crew_quarters/kitchen)
-"caV" = (/obj/structure/disposalpipe/sortjunction{dir = 2; sortType = 20},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
-"caW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"caV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/hydroponics)
+"caW" = (/obj/item/trash/candy,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"caX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"caY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"caY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "rdprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"caZ" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/starboard)
"cba" = (/obj/item/device/radio/intercom{pixel_y = -25},/obj/machinery/camera{c_tag = "Kitchen"; dir = 1; network = list("SS13")},/obj/machinery/kitchen_machine/grill,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"cbb" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/kitchen_machine/oven,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"cbc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cbd" = (/obj/machinery/pipedispenser,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/atmos)
-"cbe" = (/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/atmos)
-"cbf" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/atmos)
+"cbe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "isola"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patients_rooms{name = "Patient Room A"})
+"cbf" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "rdprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"cbg" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"cbh" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel,/area/atmos)
"cbi" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
"cbj" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "CO2 to Pure"; on = 0},/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/atmos)
"cbk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"cbl" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
-"cbm" = (/obj/machinery/power/apc{dir = 8; name = "Aft Port Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/portsolar)
+"cbm" = (/obj/structure/closet/crate,/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cbn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/portsolar)
"cbo" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cbp" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -5506,10 +5506,10 @@
"cbT" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics)
"cbU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/starboard)
"cbV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cbW" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"cbW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "isolb"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/exam_room{name = "Patient Room B"})
"cbX" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cbY" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cbZ" = (/obj/structure/closet/crate,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"cbY" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/genetics)
+"cbZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "toxins_blastdoor"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cca" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plasteel{dir = 9; icon_state = "caution"},/area/atmos)
"ccb" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/atmos)
"ccc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/atmos)
@@ -5527,9 +5527,9 @@
"cco" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"ccp" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"ccq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ccr" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/foodcart,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"ccr" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"ccs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cct" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cct" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ccu" = (/turf/simulated/floor/plating{tag = "icon-warnplatecorner (WEST)"; icon_state = "warnplatecorner"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
"ccv" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"ccw" = (/turf/simulated/floor/plating{tag = "icon-warnplatecorner (EAST)"; icon_state = "warnplatecorner"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -5564,18 +5564,18 @@
"ccZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics)
"cda" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/hydroponics)
"cdb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
-"cdc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
-"cdd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
+"cdc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
+"cdd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
"cde" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
"cdf" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
-"cdg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
-"cdh" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
+"cdg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
+"cdh" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
"cdi" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hydroponics)
"cdj" = (/obj/structure/closet/secure_closet/hydroponics,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cdk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"cdl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"cdl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/poddoor/shutters/preopen{dir = 8; id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "toxins_blastdoor"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cdm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cdn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
+"cdn" = (/obj/structure/window/reinforced,/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cdo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cdp" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cdq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
@@ -5596,11 +5596,11 @@
"cdF" = (/obj/structure/rack,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"cdG" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"cdH" = (/obj/structure/closet,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"})
"cdJ" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cdK" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cdL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cdM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cdM" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "toxins_blastdoor"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cdN" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cdO" = (/obj/structure/girder,/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cdP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -5634,7 +5634,7 @@
"cer" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"ces" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
"cet" = (/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
-"ceu" = (/obj/item/seeds/wheatseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/potatoseed,/obj/item/seeds/appleseed,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hydroponics)
+"ceu" = (/obj/item/seeds/wheat,/obj/item/seeds/sugarcane,/obj/item/seeds/potato,/obj/item/seeds/apple,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hydroponics)
"cev" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cew" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cex" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -5644,7 +5644,7 @@
"ceB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/starboard)
"ceC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
"ceD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard)
-"ceE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboard)
+"ceE" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"ceF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/atmos)
"ceG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
"ceH" = (/obj/machinery/atmospherics/unary/portables_connector,/turf/simulated/floor/plasteel,/area/atmos)
@@ -5656,7 +5656,7 @@
"ceN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ceO" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ceP" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"ceQ" = (/obj/machinery/light_construct,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
+"ceQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "toxins_blastdoor"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"ceR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"ceS" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ceT" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -5667,15 +5667,15 @@
"ceY" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/storage/box/donkpockets,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ceZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;25;28"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cfa" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
-"cfb" = (/obj/structure/noticeboard{pixel_y = 32},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -5; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
-"cfc" = (/obj/structure/closet/secure_closet/medical3,/obj/item/weapon/screwdriver{pixel_y = 6},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
-"cfd" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/obj/item/weapon/screwdriver{pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
+"cfb" = (/obj/item/clothing/gloves/color/latex/nitrile,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/breath/medical,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cfc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cfd" = (/obj/machinery/camera{c_tag = "Medbay Hallway Aft"; dir = 4; network = list("SS13","Medbay")},/obj/machinery/computer/guestpass{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"})
"cfe" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 30},/obj/structure/closet/wardrobe/medical_white,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
"cff" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
"cfg" = (/obj/machinery/power/apc{dir = 8; name = "Medical Security Checkpoint APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/alarm{pixel_y = 28},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/security/med,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint/medical)
"cfh" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Security Post - Medbay"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint/medical)
"cfi" = (/obj/item/weapon/pen,/obj/structure/table/reinforced,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/item/weapon/folder/red,/obj/item/weapon/book/manual/security_space_law{pixel_x = 3; pixel_y = 4},/obj/machinery/newscaster/security_unit{pixel_y = 32},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint/medical)
-"cfj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
+"cfj" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
"cfk" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/medbay{name = "Medbay Central"})
"cfl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"})
"cfm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"})
@@ -5684,7 +5684,7 @@
"cfp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cfq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/aft)
"cfr" = (/obj/structure/sign/directions/evac{pixel_y = 6},/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"cfs" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
+"cfs" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cft" = (/obj/structure/sign/science,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"cfu" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"})
"cfv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"})
@@ -5693,13 +5693,13 @@
"cfy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cfz" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"cfA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
-"cfB" = (/obj/item/weapon/minihoe,/obj/item/weapon/crowbar,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
+"cfB" = (/obj/item/weapon/cultivator,/obj/item/weapon/crowbar,/obj/item/device/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"cfC" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics)
"cfD" = (/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
"cfE" = (/obj/machinery/biogenerator,/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hydroponics)
"cfF" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cfG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"cfH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
+"cfH" = (/obj/machinery/door/poddoor{id_tag = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cfI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cfJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cfK" = (/turf/simulated/wall,/area/maintenance/incinerator)
@@ -5755,22 +5755,22 @@
"cgI" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 6},/obj/machinery/newscaster/security_unit{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cgJ" = (/obj/structure/table,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = 0; pixel_y = 7; req_access_txt = "47"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "ResearchFoyer"; name = "Research Door Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cgK" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint/science{name = "Security Post - Research Division"})
-"cgL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cgL" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cgM" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"cgN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"cgO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
-"cgP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{icon = 'icons/obj/doors/Doorglass.dmi'; id_tag = ""; name = "Hydroponics"; req_access_txt = "35"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"cgP" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cgQ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics)
"cgR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/hydroponics)
"cgS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics)
"cgT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics)
-"cgU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/hydroponics)
-"cgV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics)
-"cgW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Hydroponics Backroom"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/hydroponics)
-"cgX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"cgY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"cgZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/hydroponics)
-"cha" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 21},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
+"cgU" = (/obj/machinery/light{dir = 1},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/obj/structure/table,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"})
+"cgV" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
+"cgW" = (/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/engine/insulated/vacuum,/area/maintenance/incinerator)
+"cgX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cgY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cgZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cha" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"chb" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"chc" = (/obj/structure/closet,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"chd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/incinerator)
@@ -5784,13 +5784,13 @@
"chl" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"chm" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "caution"},/area/atmos)
"chn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cho" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cho" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/optable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"chp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"chs" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cht" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light_construct{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"chu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"})
+"chu" = (/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
"chv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chw" = (/obj/machinery/mecha_part_fabricator{dir = 1; id = "0"; name = "counterfeit fabricator"; req_access = "0"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chx" = (/obj/structure/rack,/obj/item/stack/sheet/cardboard,/obj/item/device/radio/off,/obj/machinery/light_construct{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -5800,7 +5800,7 @@
"chB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"chC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
-"chE" = (/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/trash/candy,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
+"chE" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1449; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access_txt = "8"},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
"chF" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/starboard)
"chG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboard)
"chH" = (/obj/machinery/door/airlock{name = "Medbay Emergency Storage"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay2{name = "Medbay Storage"})
@@ -5841,11 +5841,11 @@
"ciq" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
"cir" = (/obj/machinery/disposal{pixel_x = -2; pixel_y = -2},/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hydroponics)
"cis" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hydroponics)
-"cit" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
-"ciu" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
-"civ" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -28},/obj/structure/cable/yellow,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
-"ciw" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
-"cix" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
+"cit" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
+"ciu" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
+"civ" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -28},/obj/structure/cable/yellow,/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
+"ciw" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
+"cix" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
"ciy" = (/obj/item/weapon/wrench,/obj/item/clothing/suit/apron,/obj/item/clothing/accessory/armband/hydro,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hydroponics)
"ciz" = (/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/watertank,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/grenade/chem_grenade/antiweed,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
"ciA" = (/obj/machinery/door/window/eastright{dir = 1; name = "Hydroponics Delivery"; req_access_txt = "35"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hydroponics)
@@ -5922,15 +5922,14 @@
"cjT" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/camera{c_tag = "Security Post - Research Division"; dir = 8; network = list("SS13","RD"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cjU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cjV" = (/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/hydroponics)
-"cjW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
+"cjW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology)
"cjX" = (/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/starboard)
"cjY" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard)
"cjZ" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard)
"cka" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/unary/portables_connector{dir = 4; name = "input gas connector port"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"ckb" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "input port pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"ckc" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"ckd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cke" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/door_control{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cke" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
"ckf" = (/obj/machinery/meter,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"ckg" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/starboard)
"ckh" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
@@ -5951,7 +5950,7 @@
"ckw" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ckx" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cky" = (/obj/structure/rack,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/hand_labeler,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"ckz" = (/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/weapon/wrench,/obj/item/device/flashlight/seclite,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"ckz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/assembly/robotics)
"ckA" = (/obj/structure/rack,/obj/item/stack/rods{amount = 23},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ckB" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ckC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -5970,7 +5969,7 @@
"ckP" = (/obj/machinery/light,/obj/structure/stool/bed/roller,/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 1; network = list("SS13","Medbay")},/obj/machinery/firealarm{dir = 1; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"})
"ckQ" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"})
"ckR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
-"ckS" = (/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
+"ckS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab)
"ckT" = (/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-11"; icon_state = "plant-11"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
"ckU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/medbay2{name = "Medbay Storage"})
"ckV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
@@ -5988,12 +5987,12 @@
"clh" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/light{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cli" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"clk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
+"clk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology)
"cll" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"clm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cln" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cln" = (/obj/structure/closet,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"clp" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
+"clp" = (/obj/structure/cable/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology)
"clq" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"clr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cls" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
@@ -6006,11 +6005,11 @@
"clz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"clA" = (/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
"clB" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
-"clC" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/simulated/floor/plasteel,/area/maintenance/incinerator)
+"clC" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/assembly/robotics)
"clD" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 10},/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
"clE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
"clF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/insulated,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"clG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/toxins/lab)
+"clG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/space)
"clI" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk,/area/solar/port)
"clJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6022,7 +6021,7 @@
"clP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clQ" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"})
"clR" = (/obj/structure/closet/wardrobe/pjs,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"})
-"clS" = (/obj/machinery/computer/med_data,/obj/machinery/light{dir = 1},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"})
+"clS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"clT" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/power/apc{dir = 1; name = "Sleeper Room APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"})
"clU" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 23},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"})
"clV" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/brute{pixel_x = -3; pixel_y = -3},/obj/machinery/power/apc{dir = 2; name = "Medbay Storage APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/machinery/light/small,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"})
@@ -6046,25 +6045,25 @@
"cmn" = (/obj/structure/sign/science,/turf/simulated/wall/r_wall,/area/toxins/lab)
"cmo" = (/turf/simulated/wall/r_wall,/area/toxins/lab)
"cmp" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/toxins/lab)
-"cmq" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "rndshuttersup"; name = "research and development lab shutters"},/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{dir = 2; name = "Research and Development Desk"; req_access_txt = "7"},/turf/simulated/floor/plating,/area/toxins/lab)
+"cmq" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "rndshuttersup"; name = "research and development lab shutters"},/obj/machinery/door/window/eastright{dir = 2; name = "Research and Development Desk"; req_access_txt = "7"},/turf/simulated/floor/plating,/area/toxins/lab)
"cmr" = (/obj/structure/sign/directions/science{pixel_y = -8},/turf/simulated/wall/r_wall,/area/toxins/lab)
-"cms" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/preopen{id_tag = "Biohazard"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
-"cmt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/preopen{id_tag = "Biohazard"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
+"cms" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cmt" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cmu" = (/obj/machinery/power/apc{dir = 8; name = "Security Post - Research Division APC"; pixel_x = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cmv" = (/obj/structure/closet/secure_closet/security/science,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cmw" = (/obj/structure/filingcabinet,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"cmx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cmy" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cmy" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cmz" = (/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
"cmA" = (/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "7"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cmB" = (/turf/simulated/wall/r_wall,/area/toxins/explab)
"cmC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cmD" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cmD" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/structure/table/glass,/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cmE" = (/obj/machinery/power/apc{dir = 8; name = "Incinerator APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cmF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cmG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/binary/valve{dir = 2; name = "output gas to space"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cmG" = (/obj/machinery/chem_master{pixel_x = -2; pixel_y = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cmH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard)
-"cmI" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"cmI" = (/obj/structure/table/glass,/obj/machinery/power/apc{dir = 1; name = "Xenobiology APC"; pixel_x = 0; pixel_y = 27},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cmJ" = (/obj/item/weapon/storage/box/lights/mixed,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cmK" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/space,/area/space)
"cmL" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space)
@@ -6089,10 +6088,10 @@
"cne" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
"cnf" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
"cng" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/medbay2{name = "Medbay Storage"})
-"cnh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
+"cnh" = (/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cni" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/medbay2{name = "Medbay Storage"})
"cnj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
-"cnk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "telelab"; name = "test chamber blast door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/toxins/explab)
+"cnk" = (/obj/structure/sink{pixel_y = 22},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cnl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"})
"cnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"})
"cnn" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_chem,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/chemistry)
@@ -6103,7 +6102,7 @@
"cns" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft)
"cnt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cnu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft)
-"cnv" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/clothing/mask/gas,/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/lab)
+"cnv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sink{pixel_y = 22},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cnw" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/lab)
"cnx" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab)
"cny" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon."; name = "notice board"; pixel_x = 0; pixel_y = 31},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab)
@@ -6127,10 +6126,10 @@
"cnQ" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/cane,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"cnR" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"cnS" = (/obj/structure/closet,/obj/item/device/flashlight,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
-"cnT" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cnU" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/machinery/light/small,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cnV" = (/obj/structure/disposalpipe/segment,/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 8; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 29; pixel_y = 0},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cnW" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Incinerator Exterior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/maintenance/incinerator)
+"cnT" = (/obj/machinery/chem_heater{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cnU" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/obj/structure/table/glass,/obj/item/weapon/extinguisher{pixel_x = -5; pixel_y = 8},/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cnV" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes{pixel_x = -3; pixel_y = 4},/obj/item/weapon/storage/box/monkeycubes{pixel_x = 3; pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cnW" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cnX" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 2},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"cnY" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
"cnZ" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
@@ -6176,7 +6175,7 @@
"coN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/research{name = "Research Division"})
"coO" = (/obj/machinery/power/apc{cell_type = 10000; dir = 1; name = "Research Division APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/camera{c_tag = "Research Division - Airlock"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
"coP" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
-"coQ" = (/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
+"coQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
"coR" = (/obj/structure/stool,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
"coS" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
"coT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
@@ -6187,12 +6186,12 @@
"coY" = (/obj/machinery/r_n_d/experimentor,/turf/simulated/floor/engine,/area/toxins/explab)
"coZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/engine,/area/toxins/explab)
"cpa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/engine,/area/toxins/explab)
-"cpb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cpb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/glass,/obj/item/weapon/folder/white{pixel_y = 4},/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 8},/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"})
-"cpd" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
-"cpe" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
-"cpf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
-"cpg" = (/obj/machinery/door/poddoor{id_tag = "auxincineratorvent"; name = "Auxiliary Incinerator Vent"},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
+"cpd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/glass,/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cpe" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cpf" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cpg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio8"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cph" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"cpi" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"cpj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
@@ -6240,14 +6239,14 @@
"cpZ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"cqa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"cqb" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
-"cqc" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8; name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "turbine_control"; name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"; tag_exterior_door = "gas_turbine_exterior"; tag_interior_door = "gas_turbine_interior"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cqc" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #1"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cqd" = (/obj/machinery/computer/rdconsole/core,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab)
"cqe" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab)
"cqf" = (/obj/machinery/r_n_d/circuit_imprinter{pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab)
"cqg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/toxins/lab)
"cqh" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab)
"cqi" = (/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab)
-"cqj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "telelab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/explab)
+"cqj" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #2"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio8"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cqk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"cql" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cqm" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
@@ -6273,7 +6272,7 @@
"cqG" = (/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/reagentgrinder{pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cqH" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cqI" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/obj/structure/sign/fire{pixel_x = 32},/turf/simulated/floor/engine,/area/maintenance/incinerator)
-"cqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/maintenance/incinerator)
+"cqJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cqK" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"cqL" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"cqM" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
@@ -6287,7 +6286,7 @@
"cqU" = (/turf/simulated/floor/plasteel{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"cqV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"cqW" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/atmos)
-"cqX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/surgery)
+"cqX" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio8"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cqY" = (/obj/structure/closet/secure_closet/bar{pixel_x = -3; pixel_y = -1; req_access_txt = "25"},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
"cqZ" = (/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
"cra" = (/turf/simulated/floor/wood{tag = "icon-wood-broken7"; icon_state = "wood-broken7"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6308,13 +6307,13 @@
"crp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
"crq" = (/obj/machinery/door_control{id = "telelab"; name = "Test Chamber Blast Doors"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/dropper,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
"crr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"crs" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/surgery)
+"crs" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"crt" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
"cru" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"crv" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"crw" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"crx" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
-"cry" = (/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"})
+"cry" = (/obj/structure/stool/bed/roller,/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"})
"crz" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
"crA" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellowcorner"},/area/medical/medbay{name = "Medbay Central"})
"crB" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"})
@@ -6345,16 +6344,16 @@
"csa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/noticeboard{pixel_y = -32},/obj/machinery/light,/obj/machinery/camera{c_tag = "Research Division - Break Room"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
"csb" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"csc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/toxins/explab)
-"csd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/surgery)
-"cse" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
-"csf" = (/obj/machinery/door/poddoor/preopen{id_tag = "telelab"; name = "test chamber blast door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/engine,/area/toxins/explab)
+"csd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cse" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #3"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"csf" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #4"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"csh" = (/obj/machinery/door/airlock/maintenance{icon_state = "door_closed"; locked = 0; name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"csi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
"csj" = (/obj/effect/decal/cleanable/blood,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"csk" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"csl" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"csm" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/space,/area/space)
+"csm" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csn" = (/obj/item/stack/packageWrap,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cso" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/binary/pump/on,/turf/space,/area/space)
"csp" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/space)
@@ -6367,25 +6366,25 @@
"csw" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
"csx" = (/obj/machinery/light_construct/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
"csy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"csz" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
-"csA" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "cmoprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/medical/cmo)
-"csB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "cmoprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/medical/cmo)
+"csz" = (/obj/machinery/door/airlock/maintenance{name = "Experimentation Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/toxins/explab)
+"csA" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"csB" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Observation"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel,/area/medical/surgery)
-"csD" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "cmoprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/medical/cmo)
+"csD" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csE" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/sleeper{name = "Sleepers"})
-"csF" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/cryo)
+"csF" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #5"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csG" = (/obj/machinery/door/firedoor,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"csH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"csI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"csJ" = (/turf/simulated/wall,/area/medical/cmo)
-"csK" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/toxins/lab)
-"csL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/surgery)
-"csM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "cmoprivacy"; name = "privacy shutter"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/medical/cmo)
+"csK" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #6"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"csL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"csM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; layer = 2.5; name = "containment blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csN" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
"csO" = (/obj/machinery/reagentgrinder,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/requests_console{department = "Chemistry"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry)
"csP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"csQ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"csR" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
+"csR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Xenolab"; layer = 2.5; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"csS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/sign/chemistry{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"csT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/sign/science{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/aft)
"csU" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab)
@@ -6397,14 +6396,14 @@
"cta" = (/obj/machinery/door/window/westleft{dir = 2; name = "Research Division Deliveries"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/maintenance/aft{name = "Aft Maintenance"})
"ctb" = (/obj/machinery/door/airlock{name = "Research Emergency Storage"; req_access_txt = "0"; req_one_access_txt = "47"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"ctc" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Break Room"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
-"ctd" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
+"ctd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Xenolab"; layer = 2.5; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cte" = (/turf/simulated/wall,/area/toxins/explab)
"ctf" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
"ctg" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
"cth" = (/obj/structure/table/reinforced,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
"cti" = (/obj/machinery/computer/rdconsole/experiment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
"ctj" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/experimentor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
-"ctk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/door/poddoor/preopen{id_tag = "rdprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"ctk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Xenolab"; layer = 2.5; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"ctl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab)
"ctm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"ctn" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6433,14 +6432,14 @@
"ctK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/medical/cryo)
"ctL" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/cryo)
"ctM" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/cryo)
-"ctN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "rdprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"ctN" = (/obj/machinery/door/window/southleft{dir = 2; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Xenolab"; layer = 2.5; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"ctO" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
"ctP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"ctQ" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"ctR" = (/obj/item/weapon/cartridge/medical{pixel_x = -2; pixel_y = 6},/obj/item/weapon/cartridge/medical{pixel_x = 6; pixel_y = 3},/obj/item/weapon/cartridge/medical,/obj/item/weapon/cartridge/chemistry{pixel_y = 2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"ctS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"ctT" = (/obj/item/weapon/folder/white,/obj/item/weapon/stamp/cmo,/obj/item/clothing/glasses/hud/health,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"ctU" = (/obj/structure/closet/secure_closet/CMO,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 26},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/obj/item/weapon/screwdriver{pixel_y = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"ctU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Xenolab"; layer = 2.5; name = "test chamber blast door"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"ctV" = (/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 4},/obj/item/clothing/glasses/science,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/machinery/camera{c_tag = "Chemistry"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry)
"ctW" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"ctX" = (/obj/machinery/disposal{pixel_x = 5},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
@@ -6456,7 +6455,7 @@
"cuh" = (/obj/structure/disposalpipe/segment,/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"cui" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab)
"cuj" = (/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab)
-"cuk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/poddoor/preopen{id_tag = "rdprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"cuk" = (/obj/machinery/computer/security/telescreen{desc = "Used for monitoring medbay to ensure patient safety."; dir = 8; name = "Medbay Monitor"; network = list("Medbay"); pixel_x = 29; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/structure/table/glass,/obj/item/weapon/stamp/cmo,/obj/item/key/ambulance{name = "spare ambulance key"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"cul" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cum" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cun" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
@@ -6487,10 +6486,10 @@
"cuM" = (/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuO" = (/obj/machinery/power/apc{dir = 4; name = "Surgery APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/surgery)
-"cuP" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cuP" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuR" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cuS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "rdprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"cuS" = (/obj/vehicle/ambulance,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/cryo)
"cuU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/cryo)
"cuV" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/medical/cryo)
@@ -6512,7 +6511,7 @@
"cvl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/hallway/primary/aft)
"cvm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "purple"},/area/hallway/primary/aft)
"cvn" = (/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/hallway/primary/aft)
-"cvo" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "rndshutters"; name = "research and development lab shutters"},/obj/machinery/door/firedoor,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/toxins/lab)
+"cvo" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/firedoor,/obj/item/weapon/pen,/obj/machinery/door/poddoor/shutters/preopen{dir = 8; id_tag = "rndshutters"; name = "research and development lab shutters"},/obj/machinery/door/window/eastright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/turf/simulated/floor/plating,/area/toxins/lab)
"cvp" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab)
"cvq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"cvr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
@@ -6535,20 +6534,20 @@
"cvI" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cvJ" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Experimentation Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/explab)
"cvK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/explab)
-"cvL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cvM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cvN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cvO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cvP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab)
-"cvR" = (/obj/machinery/door/airlock/maintenance{name = "Experimentation Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/toxins/explab)
-"cvS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
+"cvL" = (/obj/structure/stool/bed/amb_trolley,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cvM" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"cvN" = (/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cvO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 1; network = list("SS13","Medbay")},/obj/structure/closet/paramedic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cvP" = (/turf/space,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"cvQ" = (/turf/space,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"cvR" = (/obj/structure/table,/obj/machinery/power/apc{dir = 4; name = "Morgue APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/item/weapon/folder/white,/obj/item/clothing/gloves/color/latex,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/autopsy_scanner,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"cvS" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/item/weapon/restraints/handcuffs/cable/zipties,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology)
"cvT" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"cvU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cvV" = (/obj/structure/barricade/wooden,/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cvW" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cvX" = (/obj/effect/decal/cleanable/blood/gibs/limb,/obj/structure/rack,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cvY" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Turbine Vent"; dir = 4; network = list("Turbine"); use_power = 0},/turf/space,/area/space)
+"cvY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cvZ" = (/obj/structure/stool,/turf/simulated/floor/wood{tag = "icon-wood-broken7"; icon_state = "wood-broken7"},/area/maintenance/aft{name = "Aft Maintenance"})
"cwa" = (/turf/simulated/floor/wood{tag = "icon-wood-broken6"; icon_state = "wood-broken6"},/area/maintenance/aft{name = "Aft Maintenance"})
"cwb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6569,7 +6568,7 @@
"cwq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/cryo)
"cwr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"})
"cws" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
-"cwt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "isola"; name = "privacy shutters"},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/patients_rooms{name = "Patient Room A"})
+"cwt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cwu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"cwv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"cww" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
@@ -6620,7 +6619,7 @@
"cxp" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cxq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cxr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cxs" = (/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cxs" = (/obj/structure/stool/bed/roller,/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cxt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cxu" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cxv" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/cryo)
@@ -6645,13 +6644,13 @@
"cxO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cxP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cxQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cxR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "rdprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"cxR" = (/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access_txt = "47"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cxS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "researchrangeshutters"; name = "blast door"},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"})
-"cxT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "isolb"; name = "privacy shutters"},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/exam_room{name = "Patient Room B"})
+"cxT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cxU" = (/turf/simulated/wall,/area/crew_quarters/hor)
"cxV" = (/turf/simulated/wall/r_wall,/area/toxins/storage)
"cxW" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/storage)
-"cxX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/storage)
+"cxX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/storage)
"cxY" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
"cxZ" = (/obj/structure/closet/radiation,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
"cya" = (/obj/structure/closet/l3closet/scientist{pixel_x = -2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
@@ -6660,7 +6659,7 @@
"cyd" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = 2},/obj/item/clothing/mask/muzzle,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cye" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs/cable/white,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cyf" = (/obj/structure/rack,/obj/item/weapon/hatchet,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cyg" = (/obj/machinery/iv_drip{density = 0},/obj/item/roller,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cyg" = (/obj/machinery/iv_drip,/obj/item/roller,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cyh" = (/obj/structure/rack,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cyi" = (/obj/machinery/light_construct/small,/obj/item/toy/cards/deck,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"})
"cyj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6670,8 +6669,8 @@
"cyn" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"cyo" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/structure/window/reinforced/polarized{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cyp" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/razor{pixel_y = 5},/obj/structure/window/reinforced/polarized{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cyq" = (/obj/structure/cable,/obj/machinery/power/turbine,/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
-"cyr" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cyq" = (/obj/machinery/light{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
+"cyr" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cys" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cyt" = (/turf/simulated/wall,/area/medical/cryo)
"cyu" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Hallway Central"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
@@ -6685,7 +6684,7 @@
"cyC" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
"cyD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cyE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cyF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cyF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cyG" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 11},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cyH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cyI" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 23},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6717,8 +6716,8 @@
"czi" = (/obj/machinery/computer/area_atmos,/obj/machinery/light/small{dir = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/storage)
"czj" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Toxins Storage APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage)
"czk" = (/obj/machinery/portable_atmospherics/scrubber/huge,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
-"czl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
-"czm" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"czl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
+"czm" = (/obj/structure/grille/broken,/turf/space,/area/space)
"czn" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"czo" = (/obj/machinery/vending/assist,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"czp" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/FixOVein,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/surgery)
@@ -6731,7 +6730,7 @@
"czw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"czx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
"czy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"czz" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"czz" = (/obj/machinery/light{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"czA" = (/obj/structure/table/glass,/obj/item/weapon/pen,/obj/item/clothing/accessory/stethoscope,/obj/structure/extinguisher_cabinet{pixel_x = 6; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"czB" = (/turf/simulated/wall/r_wall,/area/medical/genetics)
"czC" = (/turf/simulated/wall,/area/medical/genetics)
@@ -6776,8 +6775,7 @@
"cAp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"cAq" = (/obj/item/weapon/storage/box/rxglasses{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/bodybags,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
"cAr" = (/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/weapon/storage/box/disks{pixel_x = 2; pixel_y = 2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
-"cAs" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/genetics)
-"cAt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
+"cAs" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cAu" = (/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
"cAv" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/genetics)
"cAw" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = -32; pixel_y = 32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/genetics)
@@ -6842,7 +6840,7 @@
"cBD" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/genetics)
"cBE" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/genetics)
"cBF" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/medical/genetics)
-"cBG" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{dir = 8; name = "Genetics Desk"; req_access_txt = "5;9"},/obj/machinery/door/window/southleft{dir = 4; name = "Outer Window"},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "genetics"; name = "genetics desk shutters"},/turf/simulated/floor/plating,/area/medical/genetics)
+"cBG" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "genetics"; name = "genetics desk shutters"},/obj/machinery/door/window/eastright{dir = 8; name = "Genetics Desk"; req_access_txt = "5;9"},/obj/machinery/door/window/southleft{dir = 4; name = "Outer Window"},/turf/simulated/floor/plating,/area/medical/genetics)
"cBH" = (/turf/simulated/floor/plasteel{icon_state = "bluefull"},/area/medical/genetics)
"cBI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft)
"cBJ" = (/turf/simulated/wall,/area/assembly/chargebay)
@@ -6862,9 +6860,7 @@
"cBX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/storage)
"cBY" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
"cBZ" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/storage)
-"cCa" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cCb" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cCc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cCd" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cCe" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/device/flashlight/seclite,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cCf" = (/obj/structure/cable,/obj/machinery/power/solar{id = "aftport"; name = "Aft-Port Solar Array"},/turf/simulated/floor/plating/airless{icon_state = "solarpanel"},/area/solar/port)
@@ -6873,14 +6869,12 @@
"cCi" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Medbay Surgery"; dir = 1; network = list("SS13","Medbay")},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cCj" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/surgery)
"cCk" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel,/area/medical/surgery)
-"cCl" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cCl" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cCm" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cCn" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cCo" = (/obj/structure/stool/bed,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cCp" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/accessory/stethoscope,/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{dir = 8; name = "Patient Room B APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"})
"cCq" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/wallmed1{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room{name = "Patient Room B"})
"cCr" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isolb"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"})
-"cCs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"})
"cCt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"})
"cCu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
"cCv" = (/obj/structure/disposalpipe/segment,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
@@ -6935,13 +6929,12 @@
"cDs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"cDt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/genetics)
"cDu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/medical/genetics)
-"cDv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cDw" = (/obj/item/weapon/folder/white,/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/genetics)
"cDx" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/medical/genetics)
"cDy" = (/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/genetics)
"cDz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cDA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft)
-"cDB" = (/obj/machinery/door/poddoor/shutters{id_tag = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay)
+"cDB" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay)
"cDC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"cDD" = (/turf/simulated/floor/bluegrid{icon_state = "gcircuit"},/area/assembly/chargebay)
"cDE" = (/obj/machinery/camera{c_tag = "Mech Bay"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"},/area/assembly/chargebay)
@@ -6949,13 +6942,10 @@
"cDG" = (/obj/machinery/camera{c_tag = "Research Testing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"})
"cDH" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cDI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/toxins/storage)
-"cDJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
"cDK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cDL" = (/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cDM" = (/obj/machinery/door/airlock/external{req_access_txt = "0"; req_one_access_txt = "13,8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cDN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
-"cDO" = (/turf/simulated/floor/plating/airless/catwalk,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/space,/area/space)
-"cDP" = (/turf/simulated/floor/plating/airless/catwalk,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/space,/area/space)
"cDQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
"cDR" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cDS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6981,7 +6971,7 @@
"cEm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{icon_state = "door_closed"; id_tag = "AuxGenetics"; locked = 0; name = "Genetics Access"; req_access_txt = "9"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/medical/genetics)
"cEn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft)
"cEo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft)
-"cEp" = (/obj/machinery/door/poddoor/shutters{id_tag = "Skynet_launch"; name = "Mech Bay"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay)
+"cEp" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "Skynet_launch"; name = "Mech Bay"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay)
"cEq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"cEr" = (/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"cEs" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/landmark/start{name = "Roboticist"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
@@ -7059,7 +7049,6 @@
"cFM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cFN" = (/turf/simulated/wall,/area/toxins/test_area)
"cFO" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/assembly/chargebay)
-"cFP" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/flashlight,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cFQ" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cFR" = (/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cFS" = (/obj/item/clothing/suit/ianshirt,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7100,7 +7089,6 @@
"cGB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cGC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cGD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
-"cGE" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/poddoor/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment door"},/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
@@ -7110,7 +7098,6 @@
"cGL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Scientist"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cGO" = (/obj/structure/window/reinforced,/obj/machinery/portable_atmospherics/scrubber,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGP" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGQ" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing{name = "\improper Toxins Lab"})
@@ -7146,19 +7133,16 @@
"cHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
"cHw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cHx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"cHy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/virology)
"cHz" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHA" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHB" = (/obj/item/device/assembly/prox_sensor{pixel_x = -4; pixel_y = 1},/obj/item/device/assembly/prox_sensor{pixel_x = 8; pixel_y = 9},/obj/item/device/assembly/prox_sensor{pixel_x = 9; pixel_y = -2},/obj/item/device/assembly/prox_sensor{pixel_x = 0; pixel_y = 2},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHC" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cHD" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cHK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
@@ -7195,7 +7179,6 @@
"cIs" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/aft)
"cIt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/aft)
"cIu" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay)
-"cIv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/virology)
"cIw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"cIx" = (/turf/simulated/wall/r_wall,/area/assembly/robotics)
"cIy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
@@ -7220,7 +7203,6 @@
"cIR" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology)
"cIS" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology)
"cIT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology)
-"cIU" = (/obj/machinery/camera{c_tag = "Medbay Hallway Aft"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"})
"cIV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
"cIW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"})
"cIX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/medical/medbay3{name = "Medbay Aft"})
@@ -7252,12 +7234,12 @@
"cJx" = (/obj/machinery/mass_driver{dir = 4; id_tag = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cJy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cJz" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cJA" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
+"cJA" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cJB" = (/turf/simulated/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/space)
"cJC" = (/turf/simulated/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/toxins/test_area)
"cJD" = (/turf/simulated/floor/plating/airless{dir = 4; icon_state = "warnplate"},/area/toxins/test_area)
"cJE" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"cJF" = (/obj/machinery/botany/extractor,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
+"cJF" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/plantgenes,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
"cJG" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/toxins/test_area)
"cJH" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology)
"cJI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology)
@@ -7266,12 +7248,11 @@
"cJL" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/plating,/area/toxins/server{name = "\improper Research Division Server Room"})
"cJM" = (/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Virology APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitegreen"},/area/medical/virology)
"cJN" = (/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology)
-"cJO" = (/obj/machinery/smartfridge/medbay,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology)
+"cJO" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/smartfridge/secure/chemistry/virology,/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology)
"cJP" = (/obj/machinery/reagentgrinder{pixel_y = 8},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitegreen"},/area/medical/virology)
"cJQ" = (/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer,/obj/item/clothing/glasses/hud/health,/obj/structure/reagent_dispensers/virusfood{density = 0; pixel_x = 0; pixel_y = 30},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology)
"cJR" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cJS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cJT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cJU" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cJV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"cJW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"})
@@ -7288,13 +7269,12 @@
"cKh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cKi" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cKj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
-"cKk" = (/obj/structure/table,/obj/machinery/power/apc{dir = 4; name = "Morgue APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/item/weapon/folder/white,/obj/item/clothing/gloves/color/latex,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cKl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/morgue)
"cKm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/hallway/primary/aft)
"cKn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft)
"cKo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "purple"},/area/hallway/primary/aft)
"cKp" = (/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/assembly/robotics)
-"cKq" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/machinery/door/window/eastright{dir = 4; name = "Robotics Desk"; req_access_txt = "29"},/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "robotics"; name = "robotics lab shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/assembly/robotics)
+"cKq" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{dir = 8; id_tag = "robotics"; name = "robotics lab shutters"},/obj/machinery/door/window/eastright{dir = 4; name = "Robotics Desk"; req_access_txt = "29"},/turf/simulated/floor/plating,/area/assembly/robotics)
"cKr" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/stool/bed/chair/office/light{dir = 8},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/assembly/robotics)
"cKs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"cKt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics)
@@ -7302,16 +7282,11 @@
"cKv" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
"cKw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cKx" = (/obj/structure/lattice,/turf/space,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cKy" = (/obj/machinery/door/poddoor{id_tag = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/plating/airless,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cKz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cKA" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cKB" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cKC" = (/obj/machinery/botany/editor,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
-"cKD" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/embedded_controller/radio/airlock{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"})
+"cKC" = (/obj/machinery/light,/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hydroponics)
"cKE" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cKF" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cKG" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cKH" = (/obj/structure/cable/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/medical/virology)
"cKI" = (/turf/simulated/wall,/area/space)
"cKJ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area)
"cKK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area)
@@ -7328,12 +7303,10 @@
"cKV" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cKW" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"})
"cKX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
-"cKY" = (/obj/machinery/computer/security/telescreen{desc = "Used for monitoring medbay to ensure patient safety."; dir = 8; name = "Medbay Monitor"; network = list("Medbay"); pixel_x = 29; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/structure/table/glass,/obj/item/weapon/stamp/cmo,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"cKZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/medical/medbay3{name = "Medbay Aft"})
"cLa" = (/obj/item/device/healthanalyzer{pixel_x = 1; pixel_y = 4},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"})
"cLb" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/medical/medbay3{name = "Medbay Aft"})
"cLc" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
-"cLd" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cLe" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cLf" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cLg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Morgue"; opacity = 1; req_access_txt = "6"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
@@ -7351,8 +7324,6 @@
"cLs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/camera{c_tag = "Research Division Hallway - Robotics"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cLt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cLu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cLv" = (/turf/simulated/floor/engine,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cLw" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1449; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access_txt = "8"},/turf/simulated/floor/plasteel,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cLx" = (/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume{dir = 2; frequency = 1449; id_tag = "tox_airlock_pump"},/turf/simulated/floor/plasteel,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cLy" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1449; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access_txt = "8"},/turf/simulated/floor/plasteel,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cLz" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/toxins/mixing{name = "\improper Toxins Lab"})
@@ -7366,7 +7337,6 @@
"cLH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
"cLI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
"cLJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
-"cLK" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/item/weapon/restraints/handcuffs,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology)
"cLL" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"cLM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology)
"cLN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
@@ -7378,7 +7348,7 @@
"cLT" = (/obj/structure/sign/biohazard{pixel_y = 32},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
"cLU" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/virology)
"cLV" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/machinery/shower{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology)
-"cLW" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"})
+"cLW" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"})
"cLX" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay3{name = "Medbay Aft"})
"cLY" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-21"; layer = 4.1; pixel_x = -3; pixel_y = 3; tag = "icon-plant-21"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"})
"cLZ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
@@ -7399,12 +7369,10 @@
"cMo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cMp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cMq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cMr" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cMs" = (/obj/machinery/power/apc{dir = 1; name = "Genetics Lab APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/structure/table/glass,/obj/item/device/radio/headset/headset_medsci,/obj/item/device/flashlight/pen,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
"cMt" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/machinery/door_control{id = "mixvent"; name = "Mixing Room Vent Control"; pixel_x = -25; pixel_y = 5; req_access_txt = "7"},/obj/machinery/ignition_switch{id = "mixingsparker"; pixel_x = -25; pixel_y = -5},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cMu" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual inlet valve"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cMv" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cMw" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cMx" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cMy" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/obj/item/target,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/toxins/test_area)
"cMz" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen/red,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology)
@@ -7442,7 +7410,6 @@
"cNf" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics)
"cNg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/assembly/robotics)
"cNh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/rack,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer{pixel_x = 4; pixel_y = -4},/obj/item/device/healthanalyzer{pixel_x = 4; pixel_y = -4},/obj/item/device/healthanalyzer{pixel_x = 4; pixel_y = -4},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
-"cNi" = (/obj/structure/grille,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area/assembly/robotics)
"cNj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
"cNk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cNl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
@@ -7450,9 +7417,8 @@
"cNn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"})
"cNo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"})
"cNp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cNq" = (/obj/machinery/door/airlock/maintenance{name = "Toxins Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/toxins/mixing{name = "\improper Toxins Lab"})
+"cNq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{dir = 2; id_tag = "toxins_blastdoor"; name = "biohazard containment shutters"},/obj/machinery/door/airlock/maintenance{name = "Toxins Lab Maintenance"; req_access_txt = "8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cNr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"})
-"cNs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
"cNt" = (/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/solar/port)
"cNu" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitegreen"},/area/medical/virology)
"cNv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology)
@@ -7478,7 +7444,6 @@
"cNP" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"})
"cNQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/dropper,/obj/structure/sign/biohazard{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"})
"cNR" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cNS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cNT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cNU" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cNV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7502,7 +7467,6 @@
"cOn" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"})
"cOo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 140; on = 1; pressure_checks = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"})
"cOp" = (/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"})
-"cOq" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cOr" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cOs" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/biohazard{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cOt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7521,9 +7485,8 @@
"cOG" = (/obj/structure/closet/l3closet/virology,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology)
"cOH" = (/obj/structure/sign/biohazard{pixel_x = -32},/turf/space,/area/space)
"cOI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cOJ" = (/obj/structure/stool/bed/roller,/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cOJ" = (/obj/structure/stool/bed/roller,/obj/structure/stool/bed/roller,/obj/machinery/iv_drip,/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"})
"cOK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cOL" = (/obj/item/clothing/gloves/color/latex/nitrile,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/breath/medical,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
"cOM" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cON" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/primary/aft)
"cOO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/primary/aft)
@@ -7532,11 +7495,10 @@
"cOR" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/obj/item/weapon/razor{pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/assembly/robotics)
"cOS" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"cOT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"cOU" = (/obj/machinery/requests_console{department = "Genetics"; departmentType = 0; name = "Genetics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/box/monkeycubes,/obj/structure/noticeboard{desc = "A board for pinning important notices upon."; name = "notice board"; pixel_x = -32; pixel_y = 32},/obj/structure/table/glass,/obj/item/weapon/storage/box/farwacubes{pixel_y = -2},/obj/item/weapon/storage/box/neaeracubes{pixel_x = 2},/obj/item/weapon/storage/box/stokcubes{pixel_x = -2},/obj/item/weapon/storage/box/wolpincubes{pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
+"cOU" = (/obj/machinery/requests_console{department = "Genetics"; departmentType = 0; name = "Genetics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/box/monkeycubes,/obj/structure/noticeboard{desc = "A board for pinning important notices upon."; name = "notice board"; pixel_x = -32; pixel_y = 32},/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/farwacubes{pixel_y = -2},/obj/item/weapon/storage/box/monkeycubes/neaeracubes{pixel_x = 2},/obj/item/weapon/storage/box/monkeycubes/stokcubes{pixel_x = -2},/obj/item/weapon/storage/box/monkeycubes/wolpincubes{pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
"cOV" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
"cOW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/borg/upgrade/rename,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
"cOX" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -1; pixel_y = 4},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = -1},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
-"cOY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area/assembly/robotics)
"cOZ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cPa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cPb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
@@ -7549,7 +7511,6 @@
"cPi" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/server{dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"})
"cPj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cPk" = (/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/table/reinforced,/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
-"cPl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"cPn" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"cPo" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
@@ -7559,7 +7520,6 @@
"cPs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/virology)
"cPt" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/medical{name = "Break Room"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology)
"cPu" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cPv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPw" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cPx" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cPy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/ore/slag,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7567,7 +7527,6 @@
"cPA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet/crate,/obj/item/clothing/gloves/color/fyellow,/obj/item/weapon/wrench,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cPB" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cPC" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","RD")},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
-"cPD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
"cPE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"cPF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medical Surplus Storeroom"; req_access_txt = "12"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cPG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/screwdriver{pixel_y = 6},/obj/item/weapon/crowbar,/obj/item/weapon/storage/pill_bottle,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7595,7 +7554,6 @@
"cQc" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/motion{c_tag = "AI Satellite Exterior South"; network = list("SS13","RD","AIUpload")},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"cQd" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"})
"cQe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"})
-"cQf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQg" = (/obj/structure/rack,/obj/effect/landmark/costume,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQi" = (/obj/structure/closet,/obj/item/clothing/glasses/science,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7612,12 +7570,10 @@
"cQt" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/machinery/camera{c_tag = "Virology - Break Room"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
"cQu" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/table/glass,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology)
"cQv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cQw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cQy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cQz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 17},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQA" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cQB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQC" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cQD" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cQE" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
@@ -7637,7 +7593,6 @@
"cQS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{icon_state = "door_closed"; locked = 0; name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cQT" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
"cQU" = (/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cQV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQW" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
"cQX" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cQY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
@@ -7657,7 +7612,6 @@
"cRm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cRn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cRo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"})
-"cRp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
"cRq" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
"cRr" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cRs" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
@@ -7672,15 +7626,12 @@
"cRB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cRC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;7;47;29"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cRD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
-"cRE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"})
"cRF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cRG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cRH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cRI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cRJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cRK" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cRL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cRM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"})
"cRN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cRO" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster/legit,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cRP" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7701,7 +7652,7 @@
"cSe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"cSf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"cSg" = (/obj/machinery/door/morgue{name = "Relic Closet"; req_access_txt = "22"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
-"cSh" = (/obj/structure/table/woodentable,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/internal/heart,/obj/item/device/soulstone,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
+"cSh" = (/obj/structure/table/woodentable,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/internal/heart,/obj/item/device/soulstone/anybody/chaplain,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
"cSi" = (/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance Access "; req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cSj" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Departure Lounge - Port Fore"; dir = 4; network = list("SS13")},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
@@ -7715,7 +7666,6 @@
"cSs" = (/obj/machinery/door/poddoor/preopen{id_tag = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"cSt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"cSu" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/door/poddoor/preopen{id_tag = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
-"cSv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cSw" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "Aft Starboard Solar Maintenance"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cSx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cSy" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
@@ -7759,16 +7709,14 @@
"cTk" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cTl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Secure Lab"; req_access_txt = "47"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cTm" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cTn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cTo" = (/obj/machinery/biogenerator,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cTp" = (/obj/structure/rack{layer = 2.8},/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/grapeseed,/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cTq" = (/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/rack{layer = 2.8},/obj/item/seeds/cornseed,/obj/item/seeds/cabbageseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/seeds/grassseed,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cTr" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/seeds/carrotseed,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cTs" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/obj/item/seeds/cornseed,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cTt" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cTp" = (/obj/structure/rack{layer = 2.8},/obj/item/seeds/wheat,/obj/item/seeds/watermelon,/obj/item/seeds/watermelon,/obj/item/seeds/grape,/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cTq" = (/obj/item/device/plant_analyzer,/obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/rack{layer = 2.8},/obj/item/seeds/corn,/obj/item/seeds/cabbage,/obj/item/seeds/ambrosia,/obj/item/seeds/grass,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cTr" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/carrot,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cTs" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/obj/item/seeds/corn,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
+"cTt" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/device/plant_analyzer,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cTu" = (/obj/machinery/power/solar_control{id = "aftstarboard"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cTv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar)
-"cTw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboardsolar)
"cTx" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space)
"cTy" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"cTz" = (/obj/machinery/camera{c_tag = "Chapel Office - Backroom"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
@@ -7798,8 +7746,7 @@
"cTX" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cTY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cTZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "chapelparlourshutters"; name = "chapel shutters"},/turf/simulated/floor/plating,/area/chapel/main)
-"cUa" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"})
-"cUb" = (/obj/item/seeds/watermelonseed,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cUb" = (/obj/item/seeds/watermelon,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cUc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cUd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cUe" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "chapelspaceshutters"; name = "chapel shutters"},/turf/simulated/floor/plating,/area/chapel/main)
@@ -7834,7 +7781,7 @@
"cUH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cUI" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"cUJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cUK" = (/obj/item/seeds/berryseed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cUK" = (/obj/item/seeds/berry,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cUL" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cUM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"cUN" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
@@ -7851,7 +7798,6 @@
"cUY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"cUZ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cVa" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"cVb" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio3"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVe" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
@@ -7861,14 +7807,12 @@
"cVi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVj" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/sign/electricshock{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVk" = (/turf/simulated/wall,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"cVl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cVm" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio3"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cVo" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cVp" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/weapon/minihoe,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cVq" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/seeds/ambrosiavulgarisseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cVr" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/seeds/watermelonseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
-"cVs" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/item/seeds/berryseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
+"cVo" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
+"cVp" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/weapon/cultivator,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
+"cVq" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/ambrosia,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
+"cVr" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/watermelon,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
+"cVs" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/berry,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"})
"cVt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/chapel/office)
"cVu" = (/obj/machinery/door/airlock/centcom{name = "Chapel Office"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"cVv" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
@@ -7880,13 +7824,11 @@
"cVB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVD" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"cVE" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVF" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVG" = (/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Secure Lab External Airlock"; req_access_txt = "55"},/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "xeno_airlock_control"; pixel_x = -25; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVI" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
-"cVK" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVL" = (/obj/structure/closet/coffin,/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/chapel/main)
"cVM" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/chapel/main)
"cVN" = (/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/item/weapon/storage/fancy/candle_box,/obj/item/weapon/storage/fancy/candle_box{pixel_x = -2; pixel_y = 2},/obj/effect/decal/cleanable/cobweb,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/chapel/main)
@@ -7912,8 +7854,6 @@
"cWh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cWi" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cWj" = (/obj/structure/window/reinforced,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
-"cWk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
-"cWl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cWm" = (/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cWn" = (/obj/structure/closet/coffin,/turf/simulated/floor/plating,/area/chapel/main)
"cWo" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
@@ -7938,16 +7878,15 @@
"cWH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/stool/bed/chair/comfy/beige{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor/wood,/area/medical/psych)
"cWI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/medical/psych)
"cWJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar)
-"cWK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
-"cWL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
+"cWK" = (/turf/space,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
+"cWL" = (/turf/space,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cWM" = (/obj/machinery/door/window/eastleft{dir = 4; name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plating,/area/chapel/main)
"cWN" = (/obj/structure/stool/bed/chair{pixel_y = -2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cWO" = (/obj/structure/stool/bed/chair{pixel_y = -2},/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cWP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"cWR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
+"cWR" = (/turf/space,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cWS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/research)
-"cWT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cWU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cWV" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cWW" = (/obj/item/weapon/storage/bible,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
@@ -7965,22 +7904,17 @@
"cXi" = (/obj/structure/closet/l3closet/scientist,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXj" = (/obj/structure/closet/coffin,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/chapel/main)
"cXk" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Chapel - Funeral Parlour"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"cXl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cXm" = (/obj/item/device/flashlight/lantern{pixel_y = 7},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cXn" = (/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cXo" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/research)
"cXp" = (/obj/machinery/door/airlock/external{id_tag = "emergency_home"; name = "Departure Lounge Airlock"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cXq" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 7},/obj/item/weapon/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cXr" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/structure/table/glass,/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXs" = (/obj/machinery/chem_dispenser,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXt" = (/obj/machinery/chem_master{pixel_x = -2; pixel_y = 1},/obj/structure/noticeboard{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Secure Lab Internal Airlock"; req_access_txt = "55"},/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "xeno_airlock_control"; pixel_x = -25; pixel_y = -10; req_access_txt = "55"; tag_exterior_door = "xeno_airlock_exterior"; tag_interior_door = "xeno_airlock_interior"},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "xeno_airlock_control"; pixel_x = -25; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cXw" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes{pixel_x = 3; pixel_y = 5},/obj/item/weapon/storage/box/monkeycubes{pixel_x = -3; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXx" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Bomb Test Site"; desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."; dir = 8; invuln = 1; light = null; luminosity = 3; name = "Hardened Bomb-Test Camera"; network = list("Toxins","Research","SS13"); use_power = 0},/obj/item/target/alien{anchored = 1},/turf/simulated/shuttle/plating{dir = 4; icon_state = "warnplate"; luminosity = 2; nitrogen = 0.01; oxygen = 0.01; temperature = 2.7},/area/toxins/test_area)
-"cXy" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 8},/obj/machinery/power/apc{dir = 1; name = "Xenobiology APC"; pixel_x = 0; pixel_y = 27},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXz" = (/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cXA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cXB" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research)
"cXC" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/research)
"cXD" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/research)
@@ -8004,22 +7938,20 @@
"cXV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXW" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cXY" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXZ" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/research)
-"cYa" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research)
+"cYa" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/space,/area/shuttle/research)
"cYb" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/research)
"cYc" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cYd" = (/turf/simulated/shuttle/floor,/area/shuttle/research)
"cYe" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/research)
"cYf" = (/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
-"cYg" = (/obj/machinery/portable_atmospherics/hydroponics/soil{pixel_y = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/main)
+"cYg" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/main)
"cYh" = (/obj/machinery/door/morgue{name = "Chapel Garden"; req_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/main)
"cYi" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/door_control{id = "chapelparlourshutters"; name = "Window Shutter Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cYj" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cYk" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cYl" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/driver_button{id_tag = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = -4; pixel_y = -26},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cYm" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/chapel/main)
-"cYn" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYo" = (/obj/structure/table/woodentable,/obj/machinery/computer/med_data/laptop,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/medical/psych)
"cYp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8028,13 +7960,11 @@
"cYt" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cYw" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research)
-"cYy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cYz" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research)
"cYA" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "aftstarboard"; name = "Aft-Starboard Solar Array"},/turf/simulated/floor/plating/airless{icon_state = "solarpanel"},/area/solar/starboard)
"cYB" = (/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
-"cYC" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/turf/simulated/floor/plating,/area/chapel/main)
+"cYC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
"cYD" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
"cYE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"cYF" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/escape)
@@ -8043,10 +7973,7 @@
"cYI" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_closed"; id_tag = "research_dock_outer"; locked = 0; name = "Shuttle Airlock"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cYJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
"cYK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "xenobiology air connector port"},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cYL" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 3},/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYM" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cYN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cYO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYQ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYR" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8054,7 +7981,6 @@
"cYT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/binary/pump/highcap{dir = 8},/turf/simulated/floor/plasteel,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cYU" = (/obj/machinery/monkey_recycler,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYV" = (/obj/machinery/processor{desc = "A machine used to process slimes and retrieve their extract."; name = "Slime Processor"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cYW" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cYY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cYZ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
@@ -8072,6 +7998,8 @@
"cZl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"cZn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"cZo" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"cZp" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"cZq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
"cZr" = (/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8087,42 +8015,39 @@
"cZC" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
"cZD" = (/turf/simulated/shuttle/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
"cZE" = (/turf/simulated/shuttle/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"cZF" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_l"},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"cZG" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cZI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZJ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZL" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZM" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZN" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cZO" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZP" = (/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZQ" = (/obj/structure/bookcase{name = "Holy Bookcase"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cZR" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"cZS" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"cZT" = (/obj/structure/lattice,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cZU" = (/obj/structure/lattice,/obj/machinery/door/airlock/external{id_tag = "emergency_home"; name = "Departure Lounge Airlock"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
+"cZV" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_r"; tag = "icon-propulsion_r (EAST)"},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"cZW" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
-"cZX" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #1"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio3"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZY" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #1"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daa" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dab" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dac" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #2"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dad" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #2"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio8"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"daf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
+"dae" = (/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/obj/item/weapon/storage/box/ids,/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"dag" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/chapel/main)
"dah" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/shuttle/escape)
"dai" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"daj" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
-"dak" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dal" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
"dam" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
-"dao" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dap" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dar" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"das" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dat" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dau" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dav" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daw" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"})
"daz" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/escape)
@@ -8140,55 +8065,41 @@
"daL" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"daM" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"})
"daO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_closed"; id_tag = "research_dock_inner"; locked = 0; name = "Shuttle Airlock"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"daQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daS" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner (WEST)"; icon_state = "warnwhitecorner"; dir = 8},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daT" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"daU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"daV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"daW" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape)
"daX" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
"daY" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"daZ" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"dba" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/escape)
-"dbb" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #3"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio2"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbc" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #3"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbe" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #4"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dbf" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #4"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio7"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbg" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"dbh" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape)
"dbi" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbj" = (/obj/structure/sign/fire{pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
"dbk" = (/obj/structure/table,/obj/item/weapon/storage/fancy,/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"dbl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door/poddoor/preopen{id_tag = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbm" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dbp" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbq" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbr" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbs" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbt" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
-"dbu" = (/obj/machinery/power/apc{dir = 2; name = "Research Shuttle Dock APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"dbv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"dbw" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbx" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -27},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"dby" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "Xenolab"; name = "test chamber blast door"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbz" = (/obj/machinery/light{dir = 1},/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = -24; pixel_y = 24; req_access_txt = "55"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbB" = (/obj/structure/window/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 24; pixel_y = 24; req_access_txt = "55"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dbC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbE" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; width = 18},/turf/space,/area/space)
-"dbF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"dbH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #5"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbI" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #5"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbK" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #6"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dbL" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #6"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio6"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbM" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dbN" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"dbO" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"dbP" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbQ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
@@ -8204,7 +8115,6 @@
"dca" = (/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/solar/starboard)
"dcb" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dcc" = (/obj/structure/closet/crate{name = "lifejackets"},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"dcd" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (EAST)"; icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"dce" = (/obj/machinery/computer/emergency_shuttle,/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dcf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Secure Lab - Aft-Port"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dcg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8238,7 +8148,6 @@
"dcI" = (/obj/machinery/shieldwallgen{req_access = list(55)},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dcJ" = (/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dcK" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"dcL" = (/obj/machinery/door/window/southleft{dir = 2; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "Xenolab"; name = "test chamber blast door"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dcM" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dcN" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dcO" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_sw"; name = "southwest of station"; width = 18},/turf/space,/area/space)
@@ -8311,7 +8220,6 @@
"ded" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/dye_generator,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/civilian/barber)
"dee" = (/obj/machinery/cryopod/right,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"def" = (/obj/machinery/cryopod,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
-"deg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
"deh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/medical/psych)
"dei" = (/turf/simulated/floor/wood,/area/medical/psych)
"dej" = (/obj/structure/closet/secure_closet/psychiatrist,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/medical/psych)
@@ -8332,7 +8240,6 @@
"dey" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/space)
"dez" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera{c_tag = "Secure Lab - Airlock"; dir = 8; network = list("SS13","RD")},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"deA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"deB" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; tag = "icon-sink (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"deC" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"deD" = (/obj/structure/sign/directions/evac,/obj/structure/sign/directions/medical{pixel_y = 8},/obj/structure/sign/directions/science{pixel_y = -8},/turf/simulated/wall,/area/library)
"deE" = (/obj/structure/sign/directions/medical{dir = 4; pixel_y = 8},/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/science{dir = 4; pixel_y = -8},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
@@ -8347,7 +8254,6 @@
"deN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/range)
"deO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"deP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/security/range)
-"deQ" = (/obj/structure/table/glass,/obj/item/weapon/folder/white{pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"deR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/security/main)
"deS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"deT" = (/turf/simulated/shuttle/plating{dir = 4; icon_state = "warning"},/area/shuttle/escape)
@@ -8371,7 +8277,6 @@
"dfl" = (/obj/structure/spacepoddoor,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"dfo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
"dfp" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/escape)
"dfq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/effect/landmark/start{name = "Mechanic"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
@@ -8389,7 +8294,6 @@
"dfD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfE" = (/obj/structure/closet/emcloset,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"dfF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard)
-"dfG" = (/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"},/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"dfH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "Mechanic Workshop APC"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfJ" = (/obj/effect/decal/warning_stripes/west,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
@@ -8411,11 +8315,9 @@
"dfZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bluecorner"},/area/hallway/secondary/entry{name = "Arrivals"})
"dga" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry{name = "Arrivals"})
"dgb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"dgc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"dgd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"dge" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/weapon/book/manual/security_space_law{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"dgf" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "escapepodbay"; name = "Pod Door Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "13"},/turf/simulated/floor/engine,/area/hallway/secondary/entry{name = "Arrivals"})
-"dgg" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"dgh" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"dgi" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"dgj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
@@ -8424,7 +8326,6 @@
"dgm" = (/obj/effect/decal/warning_stripes/yellow/hollow,/obj/structure/closet/emcloset,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"dgn" = (/obj/structure/table,/obj/item/device/flashlight,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"dgo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
-"dgp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"dgq" = (/obj/effect/decal/warning_stripes/yellow/hollow,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"dgr" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry{name = "Arrivals"})
"dgs" = (/obj/effect/decal/warning_stripes/south,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
@@ -8537,147 +8438,147 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyaaaaaaaaaabqabdaaaaaaaaaabqaaaaaaaaaaczaaaaaaaaaabqaaaaaaabqabdaaaaaaabqabqaaaabqabqaaaabqaaaacgactacCacDacEacBacgaaaacGacHacIacHacJaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabfabfabfabfabfabfabfaaaacKaaaabdabfabfabfabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqabLabLabLabLabLabqabXabqabLabLabLabLabLabqaaaacAabqabqabqacgabBacgacgabBacgacgacgacFacNacMacgacgabBacgacHacPacHacQabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidaidaidaidaifaidaidamVamVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaabqabqabqaaaaaaacKabqabqaaaabqabqaaaaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqabUabVabVabVabVabWabXabYabZabZabZabZacaabqaaaacAacLacLacLacgacUacVacWacXacYacZacOadbacqadcadaadeadfacgadgadhadiacQaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidanraieaolapKapJaskaqlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadjadjadjadjadjabqadkabqadjadjadjadjadjabqabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaceaceaceaceaceabqabXabqaceaceaceaceaceabqabqacAacRacSacTacgadoadpacDadqadradsadsadtaduadvadwadxadyacgadzadAadBacQacQacQaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidasYauiasZasZasZaskaqlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqadCadDadDadDadDadEadFadGadHadHadHadHadIaaaabfaaaaaaadJadKadLadMaaaaaaaaaadJaaaaaaaaaadMaaaaaaaaaadJadNadOadMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabfaaaabqaaaabqabqaaaaaaadPaaaaaaaaaabqaaaaaaabqaaaacAadladdadnacgadTacQadUadqadsacDadradVadWadXadqadYadZacgaeaaebaecaedaeeaedadmadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidaunauiavaasZasZaskaqlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabfaaaaaaaehaeiaejaehaaaaaaadJaehaekaelaemaehadMaaaaaaaehaenaeoaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaaaaaaabqabqabqabAaaaaaaaaaabqabqabqabqaaaacAadQadRadSacgaesacQaetaeuacqacqaevaewaexaeyaezadsaeAacgaeBacgacgacgacgacgaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavOavbawxawwawwawwaomaqlaaaaaaaaaabqabeabfabfabfabeabfabfabeaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaaaaaaabqaaaaaaabqaeCaaaaaaaaaabqaaaaaaaaaabeaaaaaaaehaeDaeEaehaaaadJaeFaeGaeHaeIaeJaeGaeFadMaaaaehaeKaeLaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaaaaaaabqaaaabAaaaaaaaaaabqaaaaaaabqabqacAaeqaepaeracgacgacgaePaeQaeRaeSaeMaeUaeVaeWaeXadsaeYacQadzacQaeZafaaeZacgaaaabqaaaaaaaaaabqabqabqabqabqaaaaaaabqaaaaaaaaaaaaabqaaaaaaaidaywaztaztazvazuaidamVamVaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaafbaeNafbafdacJabeabfabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqadjadjadjadjadjabqadFabqadjadjadjadjadjaaaabfaaaaaaaehafeaffafgaaaafhafiaeGaeGafjaeGaeGafiafkaaaaflafmafnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaceaceaceaceaceabqabXabqaceaceaceaceaceabqabqacAacRacSacTacgadoadpacDadqadradsadsadtaduadvadwadxadyacgadzadAadzacQacQacQaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidasYauiasZasZasZaskaqlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqadCadDadDadDadDadEadFadGadHadHadHadHadIaaaabfaaaaaaadJadKadLadMaaaaaaaaaadJaaaaaaaaaadMaaaaaaaaaadJadNadOadMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabfaaaabqaaaabqabqaaaaaaadPaaaaaaaaaabqaaaaaaabqaaaacAadladdadnacgadTacQadUadqadsacDadradVadWadXadqadYadZacgaeaadBaecaedaeeaedadmadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidaunauiavaasZasZaskaqlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabfaaaaaaaehaeiaejaehaaaaaaadJaehaekaelaemaehadMaaaaaaaehaenaeoaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaaaaaaabqabqabqabAaaaaaaaaaabqabqabqabqaaaacAadQadRadSacgaesacQaetaebacqacqaevaewaexaeyaezadsaeAacgaeBacgacgacgacgacgaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavOavbawxawwawwawwaomaqlaaaaaaaaaabqabeabfabfabfabeabfabfabeaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaaaaaaabqaaaaaaabqaeCaaaaaaaaaabqaaaaaaaaaabeaaaaaaaehaeDaeEaehaaaadJaeFaeGaeHaeIaeJaeGaeFadMaaaaehaeKaeLaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaaaaaaabqaaaabAaaaaaaaaaabqaaaaaaabqabqacAaeqaepaeracgacgacgaePadsaeRaeSaeMaeUaeVaeWaeXadsaeYacQadzacQaeZafaaeZacgaaaabqaaaaaaaaaabqabqabqabqabqaaaaaaabqaaaaaaaaaaaaabqaaaaaaaidaywaztaztazvazuaidamVamVaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaafbaeNafbcKIacJabeabfabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqadjadjadjadjadjabqadFabqadjadjadjadjadjaaaabfaaaaaaaehafeaffafgaaaafhafiaeGaeGafjaeGaeGafiafkaaaaflafmafnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqafoafpafpafpafqaaaaaaabqaaaacAaeTaeOaftafuafcafwacQafxacQafyacQafzacQacQacQafAacQacQafBacQafCafDafEacoabqabqabqabqabqabqaaaaaaaaaabqabqabqabqabqabqabqabqabqabqaidaidafragjagjafsaidaidaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaafbafFafGafHafHafIaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadCadDadDadDadDadEadFadGadHadHadHadHadIabqabfaaaaaaaeFafJaeFaaaaaaafKafiaeGafLafMaeGaeGafiafNaaaaaaaeFafJaeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaabqaaaaaaaaaabAaaaaaaabqaaaacAafOafvafQafPafRafTafUadsafVafyafWafXafYacQafZadsagaacQagbacQagcagdageacgagfabqaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaaidagZazCazEazEaBKaysaidabqabqabqabqabqabqabqabqabqabqabqabqabqabqaeNaggaghagiaqSagkaaaabeabfabeabqabqaaaaaaaaaaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabfaaaaaaaeFafJaeFaeFaeFaeFaeFaeFaeFaglaeFaeFaeFaeFaeFaeFaeFafJaeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaabqaaaabqabqabAabqabqabqabqacAagpafSagDagqagEafTagradsagsagtaguagvagwacQagxadsagwacQaeaacQagyagzagAacgaaaabqabqagBagBagBagBagBaaaabqaaaaaaagCagCagLagFagWagCagCavObHcaDgbPLbPLbTgbTfaidabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaaaaaaaaaaafbagGagHafHafHagIaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaabqaaaaaaaaaadFaaaaaaaaaabqaaaaaaaaaabdaaaaaaafhafJagJagJagJagJagJagJaehagKaehagJagJagJagJagJagJafJafkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqaaaabqaaaabqagXagMagXabqaaaaaaacAagmagnagoacAagQafTagRagSacQafyacQagTafyacQagRagUafyacQaeBacQafyagVagRacgabqabqagBagBahiahfagYagBagBabqabqagCagCasbahaahbahcahdagCagCbTjaytbTlbTkdeGdeCaidabqabqabqafbaeNafbaeNaeNaeNafbaeNaeNaeNafbafbahgafbahhahjahjahkahjahjahyaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadjadjadjadjadjabqahlabqadjadjadjadjadjabqabfaaaaaaahmahnahoahpahqahraehaglaeFaglaeFaglaehahsahtahuahvahnahwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaabqaaaaaaaaaabAaaaaaaabqaaaacAafOafvafQafPafRafTafUadsafVafyafWafXaeuacQafZadsagaacQadzacQagcagdageacgagfabqaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaaidafdazCazEazEaBKaysaidabqabqabqabqabqabqabqabqabqabqabqabqabqabqaeNaggaghagiaqSagkaaaabeabfabeabqabqaaaaaaaaaaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabfaaaaaaaeFafJaeFaeFaeFaeFaeFaeFaeFaglaeFaeFaeFaeFaeFaeFaeFafJaeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaabqaaaabqabqabAabqabqabqabqacAagpafSagDagqagEafTaeQadsagsagtaguagvagwacQagxadsagwacQaeaacQagyagzagAacgaaaabqabqagBagBagBagBagBaaaabqaaaaaaagCagCagbafYagragCagCavObHcaDgbPLbPLbTgbTfaidabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaaaaaaaaaaafbagGagHafHafHagIaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaabqaaaaaaaaaadFaaaaaaaaaabqaaaaaaaaaabdaaaaaaafhafJagJagJagJagJagJagJaehagKaehagJagJagJagJagJagJafJafkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqaaaabqaaaabqagXagMagXabqaaaaaaacAagmagnagoacAagQafTagRagSacQafyacQagTafyacQagRagUafyacQaeBacQafyagVagRacgabqabqagBagBahiahfagYagBagBabqabqagCagCagZahaahbahcahdagCagCbTjaytbTlbTkdeGdeCaidabqabqabqafbaeNafbaeNaeNaeNafbaeNaeNaeNafbafbahgafbahhahjahjahkahjahjahyaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadjadjadjadjadjabqahlabqadjadjadjadjadjabqabfaaaaaaahmahnahoahpahqahraehaglaeFaglaeFaglaehahsahtahuahvahnahwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqabqagXahxagXabqabqaaaacAagNagOagPacAahRahzahAahBahCahDahEahFahGahHahIahJahKahLahMahNahOahPahQaiqabqagBagBahSahTahUahUahVagBagBabqagCahWahXahYahZaiaaibaicagCatydePalSalSalSalSaidaaaaaaabqafbaigafbaihaiiaijafbaikailaimafbainaioajbaivairairairairairaivabqabqabqabqabqaaaaaaaaaaaaaaaabfabqadCadDadDadDadDadEadFadGadHadHadHadHadIabqabfaaaaaaafKahnaeGaeGaeGaisaehaeGaeGaeGaeGaeGaehaeGaeGaitaeGahnafNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqagXagXaiuagXagXabqabqacAacAacAacAacgaiMaiwaixaiyaizaiAaiBaiwaiCaiDaiEaiFaiGaiHaiwaiIaiJaiKaiLaiNabqagBaiQaiOaiPaiTaiRaiSaiUagBabqajcaiVaiWaiXaiYaiZajaakcajydeLajMajdajeajfajRdeMajgajgajgafbajhajiajjajkajkajlajkajmajnajoajpajpajpaivairairairairairaivaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabeabqaaaaehajqajrajsajtajuaehajvaeGaeGaeGajwaehajxaeGajzajAajqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaabqajBajCajDajEajBabqaaaaaaaaaabqaaaacgacgajFajGajHacgajIajJajIacQacQacQacQajKajLajSajNajOajPajQacgabqagBajTaiOakuajWajUaiSajVagBabqakzajXajYajZakaakbajYanJakzdeLdeNajdakdajfaheajgajgakeakfafbafbafbakgakhakiakiakjakkaklakmakmaknakoaivairairairairairakpafbafbafbaaaabqaaaaaaaaaaaaaaaabeaaaaaaaaaabqaaaaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaehakqakqaeFaeFaeFaehakraeGaeGaeGaksaehaeFaeFaeFakqakqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaktaktakIakIakIakIakIajBakvakwakxajBabqabqabqabqabqaaaaaaacgacgaiNacgacgacgaiNacgacgakAakBakCakDakEakFakGakHakHakHagBagBagBakOakJakKakLakMakNakRagBabqagCakPakQakTakSalAakUakVagCdeOdeNajdakdajfaheakWajgakXakYakZalaafbalbakhakialcaldaldaldaleakmalfalgalhairairairairairalialjalkaeNaaaabqabqabqabqabqabqabfabqabqabqabqabqaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaflallallafgaaaaaaaehalmaeGaeGaeGalnaehaaaaaaaflallallafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaloalpakIalqalralsaltajBalualvalwajBakyalLakyakyabqabqaaaaaaaaaabqaaaaaaaaaabqabqalMalBalCalBalDalEalFalGakHalHalIalJagBagBagBalKalNagBagBalOagBagBalPagCagCalQamualRamzamwagCagCatzdePalTalUalVaheajgajgalWalWalXalYafbalZakhamaambamcamcamdameamfamgamhaeNairairairairairaeNamiamjaeNaaaabqaaaabqaaaamkamkamkamkamkamkamkabqabqabqadFabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehamlaeGaeGaeGalnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktammaktamnamoampamqajBajBamramsajBalxalyalzakyakyabqabqabqabqabqabqabqabqaaaaaaamxakDakDakDakDamyamEamAakHamBamCamDagBamFamIamGamHamKamJanYanFagBamMamNamOamPamQamRamSamTamOamUdeRdePamWamXamYaheamZalWalWanaanLajgafbanbancandaneanfanfangameamjanhamhaeNairairairairairaeNanianjaeNabqabqabqabqabqamkankanlanmannankamkabqaaaanoanpanoansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehantanuaglantanuaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakIanvanwanxanyanzanAanBanCanDanEakyamtanGamvanIakyabqaaaaaaabqaaaaaaaaaakDakDakDamxaouanKanSanManNanOanPakHanQamCanRagBanTanWanUanVanZanXanYaonaoaaobaocaodaoeaofaogaohaoiaojaokdeUaoHaoLaooaopaheaoqaoraosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGapeaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaapgaoMapgasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaakDapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqoaqpaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktaquaqvaqwakyaqxaqyaqzaqAakyapfapfaqBaqCanEajgajgakDaqFaqEamxaqGarSaqTaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaxfaqYaqUaqVaqWakHaqXdfnaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqDairairairairairaqbarrarsaoGaqeaoGaoGapeaoGamkartaruankarvarwamkabqapgapgaoMapgansaoGaoGaoGafdacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktanHaqvapdapfarIapdapdapdarJapfarKarUarTarNajgatAarWarParRaumazcaCTarVaCVarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassastasuastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKasLasMasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCblyavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgathapdatiapfaoXaElaEjajgajgatlatmatnatoamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYatJakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOatLafbaeNatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfautausausausausausauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEajgauIatmakeauJauKajgauLamxauMauNaqJatqapnauQauPauTauRauSauSauUauVauWauXaqUauYamLakHdfsdfravcauZaveavfaveavhaveaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAawMavCasJavDavEavHavGawZavIavJamkapeansavKavLavMaoGdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqalLavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaawbavUawcbflavUaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatrasSavdawdavgawlawkawmaqUawnaqYawsawtawuasdawvdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLaxjavqavrawNawOawPawoawRawSawTavvawUawVawWavvaoGaoGasJaubavBasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxansansaxdaxeaoGaoGbnIaxhbnJbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxlaxkaxkaxkaxkaxkaxZapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamEaxGaxHaqJaxIaxJaxKaqYawpagBagBagBawrawqasdagBaxPawQakHakHamOaxLaxRaxSaxLamOaxNaxMamOaxOatKatKaxWaxWaxWamOamOaxXafbdeeaAAdefavrayaaybayaawoaycaydayeayfaygayhayiavvayjaoGaykaylaymaynaoGasMaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaoGdfCdgCdfEaoGaoGaoGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayHayGayIajgajgajgaxTaxQaxQaxQaxUajgajgayMayNayOayPayMamEamEakDayQayRapnaySaySayTayUaySaySayVayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYaWvavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmdfobpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaWwaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLazMapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfathaoXapdaoXazNazOazPazRazQaAYajgaaaabqaaaaaaaaaaaaaaaabqaaaaxEazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAdaxVaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDatLafbaxYaWxavqavraABaACaADayJaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGaucaoGaAMaxhaxhawYaANamkaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAOaxhabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPazSapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXajgaCEaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamEamEakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDatLaBIaBIaBIaBIavraBJaPWaBLaBNaBMaBOayeaBPaBQaBRaBSavvaBTaBUaBVaBWaBXaBWaBYaBWaBZaBWdgEaCaaCbaCcaCdaCeaCfaCgaChaCgaCiaCjaCkaCjaClaxhaxhaxhaCiaCjaClaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXazSarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuaCvaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaakDayLaCGazwakDayLaCIazwakDayLaCJazwakDaCKamEaCLakDamEazzaCNamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDatLaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaDdaDeaDfaWyaDfaDhaDiaDjaWzaDkaCjaDlaCjaDmaWzaDjaDiaCmaDnaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLayBazSaqwapfaaaaASaDqaDraDqaASayKaDsaDtaCsaDuaDvaDwaDxaDyaCsaDzaDAaDBaDCaDDaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaDKayMaAfaAfamxaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaEdaEeaCSaEfaEgaEgaEhaEgaEiaBIaRtaEkaRyaBIaEmaEnaEmavvaEoaEpaEqaEraEsaEtaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaExaExaEyaEzaEAaEBaECaEDaCgaCgaCgabqabqaEEaEFaDiaDiaDiaDiaDiaEGaEEaDiaEHaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyazSapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQaERaESaETaEUaEVaEWaCuaCwajgaaaaBbaEXaEYaEZaFaaFbaBbaaaayMaFcaCCaCCaFdaFeaFfamxaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaFkaFlaFmakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSaFyaFzaFzaFzaFAaFBaBIaTeaFDaThaBIaFFaFGaFGaFHaFIaFJaFKavvavvavvavvavvaoGaFLaxhaFMaFNaFOaFPaFQaFRaFSaFTaFTaFTaFTaFUaFVaFWaFXaFYaCgaFZabqabqaaaaaaaaaabqabqaaaaaaabqaaaaaaaWAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaGbalLaaaaaaaASaDraDraDraASayKaGcaGdaGeaEMaEKaGfaGgaGhaCsaGiaGjaGkaGlaGmaCuaCwajgabqaBbaGnaGoaGpaGqaGraBbaaaayMaGsaGsaGsayMaAfaGtamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaGCaGDaGEaGFaGGaGHaCSaGIajgajgajgaGJajgaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaGTaGUawWavvaGVaGWaxhaGXaGYaGZaGZaHaaCMaDcaHcaHdaHeaHeaHeaHfaHgaHhaHiaDLarAaMKaMJaOhaMJaMJaOhaMJaMJaOhaMJaMJaPwabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqaHkaHlaHkabfaaaabqaaaabqapfaHmaHnanEazSapfapfaaaaCoaHoaHpaHqaCoayKayKayKaCsaHraEKaHsaGgaHtaCsaHuaHvaHwaHxaHyaCuaCwajgaaaaBbaHzaHAaHBaHCaBbaBbaaaaHDaHEaHEaHEaHFaHGaHHaHGaHIaHJaHIaHKaHIaHJaHIaHLaHIaHJaHMaHNaHOaHPaHQaFCaHSaHTaHUamxazeaCSaHVaHWaHXaHYaHZaIaaCSaIbaBIaIcaIdaIeaIfaIfaIgaIhaIiaIjaIkaIlaImaInaIoaIpayeaIqaIraIsaItavvaucaGWaxhaIuaIvaIwaIxaIyaIzaIAaIBaICaIDaIDaIDaIEaIFaHhaHiaDLaMIaPxarAaPyarAarAaPyarAarAaPyarAarAaPxaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqaaaaHkaIGaHkabqabqabqabqabqapfaIHapdapdaIIaIJapfaaaaIKaARaILaARaIMabqabqabqayKaINaIOaIPaIQaIRaCsaISaITaIUaIVaIWaCuaCwajgaaaabqaaaaGaaIYaGuaaaabqaaaaHGaAfaAfaAfaHGaHGaJaaJbaJcaJdaJeaJfaJgaJhaJhaJiaJhaJjaJgaJkaJlaJmaJnaJoaJpaJqaJramxazeaCSaCSaJsaJtaCSaJuaCSaCSaGIaBIaBIaBIaJvaJwaJxaJyaJzaJAaJBaJCaJDaJEaJFaJFaJGaJHavvavvavvavvavvaubaGWaxhaJIaJJaJKaJLaJMaGvaJOaJPaJQaJRaJSaJTaJUaJVaHhaHiaDLaDLaPxaJWaaaaaaaaaaaaaJWaaaaaaaJWarAaPxabqaCgaJXabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaabqaaaaHkaHlaHkaHkaGwaGwaGwaHkaHkaHkaHkaHkaJZaKaapfaaaaaaaaaaaaaaaaaaaaaaaaabqayKaKbaKcaKdaKeaKfaCsaKgaKhaCuaCuaCuaCuaKiajgaKjaGyaHjaHbaKnaHRaIZaIXaKjaHGaKraKsaKsaKtaKuaKvaKwaKxaKyaKzaKAaKBaTiaKDaKEaKCaKFaKGaKHaKIaKJaKKaJNaKMaKNaKOamxazeaKPaCSaKQaKRaCSaKSaKTaKUaKVaBIaKWaKXaKYaKZaBIaLaaLbaLcaBIaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmavvasJaGWaxhaLnaLoaLpaLqaLraFRaLsaLtaJQaLuaCgaCgaLvaLwaCgaDLaDLaDLaPxaaaaaaaaaaaaaaaaLxaaaaaaaaaaTMaRgabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaHkaLyaLzaLAaLBaLBaLCaLDaLEaLFaLGaHkaHkazSapfaaaaLHaLIaLIaLIaLIaLIaLJabqaCsaCsaCsaJYazTaCsaCsaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLWaLZaMaaMbaHGaMcaMdaMeaMfaMfaKkaMfaMfaMfaMfaMfaMfaMfaMfaKkaMfaMhaMiaMjaMkaMkaMkaMlaMlaMlaMlaMlaMkaMmaMkaMnaMnaMnaMnaMoaMnaGIaBIaBIaBIaMpaMqaBIaMraBIaMsaBIaMtaMuaMvazlaMwaMxaMyazlaMzaMAaMBavvaMCaMDaxhaCgaCgaCgaCgaCgaFRaMEaMFaJQaMGaCgaMHaXGaWubssaWuddkaDLaPxaaaaaaabqabqabqabqabqaaaaaaarAaPxarAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaHkaMLaMLaMLaLBaLBaLBaLBaLBaLBaMLaMLaMMaHkazSalLaaaaMNaMOaMOaMOaMOaMOaMNabqabqaKlaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZaNaaNbaNcaLRaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaKmaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaKoaNraNsaNtaMkaNuaNvaNwaNxaNyaNzaNAaNBaNCaMkaNDaUfaNFaNGaNHaMnaNIaBIaNJaNKaJwaMqaBIaNLaBIaNMaBIaNNaNOaNPaNQaNQaNQaNQaNQaNQaNQaNQaNQaoGaNRaxhaNSaNTaNUaNVaCgaNWaIvaMFaNXaNYaNZaOaaObaOcaOdaOeddRaDLaPxaJWabqabqaOgddSaOiabqaOjaaaarAaPxataaCgaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaHkaOkaLBaLBaLBaLBaLBaLBaLBaLBaMLaMLaMLaOlaOmapfaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaOpaOqaOraOraOsaOtaOuaOvaOwaOxapfaOyapfapfapfapfaOzaOAaKqaOCaODaKqaOAaOAaOAaOAaOFaaaaaaaOGaOGaOGaOGaOGaOGaOGaaaaaaaMfaOHaOIaOJaOKaOLaNAaOMaONaOOaVsaOQaORaOSaMkaOTaOUaOVaOWaOXaMnaOYaBIaBIaBIaOZaOZaBIaBIaBIaBIaBIaPaaPbaPcaNQaPdaPeaPfaPgaPhaPiaPjaNQaPkaGWaxhaNTaNTaPlaOdaPmaGYaPnaPoaPpaPqaCgaPraPsaPtaPuaPvddUaKLddVaaaaaaabqddWcspaPzabqaaaaaaaTMaRgaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHaXIaWBaXJaWBaXKaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaPAaLBaLBaLBaLBaPBaLBaPCaLBaLBaMLaPDaHkaGbapfaaaaMNaMOaMOaMOaMOaMOaPEaPFaPGaPFaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaPRaPSaPTaPTaPUaPTaPVaOAaYOaPXaPYaPZaQaaQbaQcbeBaQeaQfaQgaQgaQhaQiaQjaQkaQlaQmaQmaQnaQoaQpaKGaNtaMkaQqaNAaQraNAaQsaNAaQtaNAaNAaMkaQubeLaOVaQwaQxaMnaQyaQzaQAaQBaQCaQDaQEaQFaQGaQHaQIaQJaQKaQLaNQaQMaQNaQNaQNaQOaQPaQQaNQaQRaGWaxhaQSaQSaQTaOdaPmaJJaQUaQVaQWaQXaQYaQZaRaaRbaRcaRdaOfaDLaPxaaaaReabqaRfddXaRhabqabqaJWarAaPxabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUVaXNbbXbbWbbYbbWbbZbgUaUVaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGwaLBaLBaLBaLBaLBaLBaLBaLBaLBaLBaRiaHkaHkaRjapfabqaMNaMOaMOaMOaMOaMOaRkaRlaRmaRlaRnaPIaRoaRoaRpaRoaOuaRqaRraRsapfapfapfapfapfapfazSaOAbgkaRuaRvaRwaRxaRxaRxbgyaOFaaaaOGaRzaRAaRAaRAaRAaRAaRBaOGaaaaMfaRCaMiaMjaMkaRDaREaRFaNAaRGaNAaRHaRIaNAaRJaRKaRLaRMaRNaROaMnaRPaRQaRRaRRaRRaRSaRTaRTaRUaRUaRVaRWaRXaRYaRZaSaaSbaSbaSbaScaSdaSeaNQaSfaGWaxhaQSaSgaShaSiaCgaSjaIvaSkaJQaSlaCgaSmaSnaSoaSoaSoaSpaDLaPxaaaaaaabqabqabqabqabqaaaaaaarAaPxabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbcbbcabcabcabcabcabzhbzhbdJbzhbzhbcabcabcabcabcaaXKaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSqaSraSsaaaaGwaLBaLBaLBaLBaLyaLBaStaSuaSuaSvaSwaHkaqBazSapfabqaMNaMOaMOaMOaMOaSxaMNaKpaKlaKlaSyaPIaSzaSAaSBaSCaSDaSEaSFaSGaLKaSIaSJaSKaSLapfaSMaOAaSNaRuaSOaSPaSQaSQaSRaSSaOFaaaaMgaSUaRAaSVaSWaSXaRAaSYaMgaaaaMfaMhaMiaMjaMkaSZaTaaTbaTcaTdaTcbjbaTfaTgaMkbmIbkZaTjaTkaTlaMnaTmaTnaToaTpaTqaTraTsaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaTDaTEaTFaTGaTHaNQasIaGWaxhaCgaCgaCgaCgaCgaFRaTIaTJaTKaTLaCgaCgaLvaLwaCgaDLaDLaDLaPxaaaaaaaaaabqaaaaaaaaaaaaaaaaTMaRgabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbdKbdNbdNbdNbdNbdNbdNbdObdNbdNbdNbdNbdNbdNbdPbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaTNbBmaTNacJaHkaLBaLBaLBaLBaLBaLBaLBaLBaLBaTPaTQaHkauAaTRapfaaaaMNaMOaMOaMOaMOaMOaTSaRlaTTaRlaRnaPIaRoaRoaRpaRoaOuaOvaTUaTVaTWaTXaTYaTZaUaapfaUbaUcaUdaRuaRuaUebmJaRuaUgaUhaOFaaaaMPaUjaUkaUlaUmaUlaUkaUnaNpaaaaMfaMhaUpaUqaMkaNqaNqaNqaNqaUsaNqaNqaOoaNqaMkaMnaOBaUvaSHaMnaMnaUxaTnaTpaTqaUyaUzaTnaToaTqaTqaTpaUAaUBaUCaUDaUEaSbaSbaUFaScaUGaUHaNQaUIaUJaxhaUKaULaUMaSTaUOaUPaIvaSkaJQaUQaJSaURaUSaUTaHhaHiaDLaDLaPxaJWaaaaaaaJWaaaaaaaaaaaaaJWarAaPxabqaCgaJXabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdaTNaUWaTNafdaHkaPAaMLaLBaLBaLBaLBaLBaUXaLBaUYaUZaHkaVaaAWapfaaaaMNaMOaMOaMOaMOaMOaVbaVcaVdaVcaVeaPIaRoaVfaVgaVhaViaVjaOuaVkaVlaVmaVnaVoaVpapfaVqaOAaVraRuaRubmKaVtaVuaUgaVvaOFaaaaOGaVwaVxaUkaVyaRAaVzaVAaOGaaaaMfaVBaOIaOJaVCaVDaVEaVEaVEaNCaVEaVEaVFaVGaMkaVHaVIaVJaVKaVLaVMaVKaVNaVOaVOaVPaVQaVRaVSaVTaVUaVVaVSaVWaVXaNQaVYaVZaWaaWbaWcaWdaWeaNQasJaWfaxhaWgaWhaWiaTOaWkaWlaWmaWnaWoaWpaWqaWqaWraWsaHhaWtaDLbeZaPxarAddZarAarAddZarAarAddZarAarAaPxaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXbeXbeXbeXaXLaXLaXMaXLaXLbeXbeXbeXbeXbeYbdMaXOabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaWDaWEaWFaWGaWDaHkaLCaMLaWHaWIaWJaLBaLBaLBaLBaUYaWKaHkazSapdalLaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaWLaPIaRoaRoaRpaRoaOuaVjaWMaWNaVlaWOaWPaWQaWRapfazMaOAaWSaWTaWTaWUaWVaRuaUgaWWaOFabqaOGaOGaOGaWXaWYaWZaOGaOGaOGabqaMfaOHaXaaMjaXbaXcaVEaVEaVEaXdaVEaVEaXeaNCaXbaQCaXfaXgaXhaToaUiaToaTnaTpaToaXjaToaXkaTpaTqaToaTqaTpaXlaXmaNQaXnaXoaXpaXqaXraPiaQQaNQaXsaGWaxhaXtaXuaXvaXwaXxaXyaXzaXAaXBaXCaXDaXDaXEaXFaHhaHiaDLarAdeaaMJdebaMJaMJdebaMJaMJdebaMJaMJdecabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabdaaabgMbdMbeWbeXbeXaXLaXLaXLaXLbfabpvaXLaXLaXLbeXbeXbeYbdMbMnaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaXPaXQaXRaXSaHkaXTaMLaXUaXVaXWaMLaMLaMLaXXaXYaXZaHkaYaaYbapfabqaYcaYdaMOaMOaMOaYeaYfabqabqaKlaWLaYgaPJaPKaYhaYiaYjaYkaYlaYmaYnaYnaYnaYnaYnapfaYoaYpaYqaYraYraYsaYtaYuaYvaYwaUoaaaaaaaaaaOGaOGaYyaOGaOGaaaaaaaaaaKoaNraYzaMjaYAaYBaYCaYDaYEaNCaNCaYFaYGaNCaYAaQCaYHaYIaYJaYKaYLaYKaYMaYNbmLaYPaYKaYKaYKaYKaYKaYKaYQaYRaYSaNQaNQaNQaNQaYTaNQaNQaNQaNQaoGaGWaxhaYVaYUaYUaSTaYWaYXaYYaYZaZaaZbaZcaZdaZeaZfaFXaZgaCgaaaabqabqaaaaaaaaaaaaabqaaaaaaabqabqarAaDiaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbcbbfcbfbbgNaXLaXLbdIbdIbdIbgPbgObdIbdIaXLaXLbgNbgQbgSbgRaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaWDaZiaZjaWDaWDaWDaZkaWDaWDaZlaZmaWDaWDaWDaZnaWDaWDaZoapfapfabqaZpaZqaZraZraZraZqaZsabqabqaZtaZuaPIaRoaRoaRpaRoaOuaZvaOuaZwaYnaZxaZyaZzaZAapfazSaOAaZBaZCaZDaZEaZFaZGaZHaZIaOFaZJaUraZJaZLaZMaZNaZOaZLaZJaUraZJaMfaZPaZQaZRaZSaMkaMkaMkaMkaZTaZUaZVaNCaZWaMkaQCaZXaTraZYaZZaZZaZZaZZaoGaoGaoGbaababbacbadbaebafaZZbagbagaoGbahazAazybaiazybajazybakazybalaxhbambambambambanbaobapbaqbarbasbataIvbaubavaCgaCgaCgabqabqbawbaxaDiaDiaDiaDiaDiaDibawaDibayaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbgTbicbeXbeXaXLbdIbidbifbiebihbigbiibidbdIaXLbeXbeXbijbgTaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbaAbaBbaCbaDbaEbaBbaFbaGbaHbaGbaIbaJbaGbaKbaLbaMbaNbaOapfaaaaaabaPbaQbaQbaQbaRaaaabqaZtbaSaWLaPIaRoaRobaTbaUaOubaVbaWbaXbaYbaZbbabbbbbcapfazSaOAaOAaOAaKqaKqaUuaOFbbebbfaOFbbgbbhbbiaZLbbjbbkbblaZLbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwaMkaMkaYAaLLaYAaMkaMkaUibbybbzaUibbAbbBbbCbbDbbEbbFaoGaoGaoGaoGbbGaoGaoGaoGaoGaoGaoGaGWasIasJbbHbbHbbHbbHbbHbbHbbHbambbIbbJbbKbamaUwbbMbambbNbbOaFRaFRbbPbbQbbRaDfbbSaDfbbTaDibbUaDiaCiaCjbbVaCjaClaDibbUaDiaCmaDnaDoabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbdIbikbilbdLbnQbimbjPbjObdIaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaUNbcdbcebcebcfbcebcebcebcgbchbcibcjbckbckbckbclbcmbcnbcoapfaaaaaaabqabqaaaaaaabqabqabqaZtbcpbcqbcrbcsaRobctbcubcvbcwbcxbcybczbcAbcBbcCbcDapfbcEbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbcQbcPbcRbcSbcTbcUbcVbcPbcWbcXbcXbcYbcZbdabcXbcXbdbbdcbdcbdcbddbdebdcbdcbdfbdcbdgbdhbdcbdcbdcbdibdjaoGbdkbdlbdmbdnbdobdpbdobdqbdobdrazBbakbalaubasJbbHbdsbdtbdubdvbdwbdxbambdybdzbdzbdAbdzbdBbambdCbarbdDbdEbdEbdEbdEbdEbdFaCgbdGaCjbdHaCjaDmaCgaCgaCgbdGaCjaDmaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLaXLbdIbjQbilbdIbjRbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbdQaUNaWDaUNbdRaUNbcdbcebdSbdTaUNbdRaUNbdUbdVbdWbdXapfapfapfapfalLalLalLapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnaWjapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgbeVaCgaCgaCgaCgaCgaLwaCgabqarBbjUabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbjWbjVbjYbjXblFblDblIblGblJbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNabqaaaabqaaaaUNbfdaUNbfebfebffbfgaUNbfdaUNaUNaWDbfhbfibfjavTavUbfkavUbflavUbfmbfnavVbfobfpbfqbfqbfrbfsbftbfubfvbfwbfxbfybfwbfzbfAbfwbfBbfCbfDbfEbfFbfGbfHbfIbfJbfKbfKbfLbfMbfNbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbgabfWbfVbfVbgbbgcbgdbezbgebgfbggbghbgibezbgjbmOaoGbglaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxbmPbgzbambgAbgBbgCbdEbgDbgEbgFbdEbgGaOdaOdbgHaOdbgIaOdaOdaOdbgJaOdbgKbgLbgKbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXaXLaXLbdIblKbilbdIblLbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbgVbgWbgXbgXbgXbgXbgXbgXbgXbgXbgYbgZbfwbfwaXibhbaXibfwbfwbfwbhcbfwbhdbhebhfbhgbhhbhibhjbhkbhlbhmbhnbfGbhobfIbhpblhbhqbhrbhqbhsbhqbhtbhubhtaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxbhwbhwbhxbhwbhwbhwbhwbhwbrNbhybfIbhzbezbhAbhBbhCbhDbhEbezbhFbhGaoGaGWapeaaaaZKbhIbhJbbxbhLbhMbhNbhObhPbhQbambhRbhSbhTbhTbhUbhVbambhWbhXbhWbdEbhYbhZbiabdEbibaCgaCgaCgaCgaCgaCgaCgaCgaCgaDLaFRaFRbdFaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaabdaaabgMbdMbeWbeXaXLaXLbdIbikbilbdIbdIbdIbjTbjObdIbdIaXLbeXbeYbdMbMnaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbiBbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbazbiPbiQbiRbiSbiTbbdbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDbjEbjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUblMaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTbnLbnEbnMbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkibkjaUNbgVbgWbbLbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDaXibkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbccabqabqbefbhvbhabhHbkWbiObhvbhHbkWbiObhabhabiUabqabqbhwbmRblablbblcblbbldblebhwblfbfIblgbwlbezbkkbljbkRbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambambkTbkSbambltblubltbdEbkUblwbkVbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaWwaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWwbnRblEbnTbnSbnUbicbeXbeXaXLaXLbdIbpsbptbdLbqZbpubrbbrabdIbdIaXLbeXbeXbrcbijbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVaUNbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqbkXboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbkYabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDblidfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaWwbnRblEbnKbrgbrhbeWbrjbeXaXLaXLbdIbrlbrmbifbrIbrnbrQbrKbdIbdIaXLbeXbeXbeXbeYbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVaUNbnWbnXbnYbnZboablkaUtblkbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbbdbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWblrbkWbsbboCboDboEboDboFboDboEboDboGbscbkWblrbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAdfGdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdblMbsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbsObdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUblVaUNbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMblsbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqbsPbsRbsQbsSbrdcKIaXNbsfbsTbsUaXLbsWbsVbsXbribsZbsYbtbbtabtcbrkbtebtdbtgbtfaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibruaUNbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGaXibrHblvbfwbfwbfwbfwbfwaXibrJblxbfwbfwbbdbrLbrMbbdbbdbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZiblCbsoblCbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbmBaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabuLbudbuMabqbuObuNbuQbuPbuSbuRbuTbBebuVbuUbuWbribuYbuXbvabuZbvcbvbbvebvdbvgbvfaXLbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbvjbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJbobbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukboAdedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGaxcbuDaoGbuEbuFbuGbqNbuHbuHbuHbuIbuJbqSbqSbuKbvlbvkbvnbvmbvpbvobvrbvqbvsbvsbvvbvtbvwbvwbvwbxlbxmbvwbvwbvwbvwbvwbxlbvwbvwbvwbvwbvwbvwbxlbvwbxmbxobxnbxpbxpbxrbxqbxtbxsbxvbxubxxbxwbxzbxybxBbxAbxDbxCbzebxEbzgbzfbzjbzibzlbzkbznbzmbzpbzoaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbzqbzsbzrbfGbvAbvBbvCbvBbvDbfGbvEbvFbvGbvHbvHbvIbvJbvHbvHbvKbvLbvMbvNbvHbvHbvObvHbvHbvHbvPbvQbvRbvRbvSbvTbvUbvVbqcbyobvXbvYbqcbvZbwabwbbwcbwdboEbtQboEbypbywbwhbwibwjbwibwkbyJbyxbAbbyQbAkbwqbhwbwrbwsbwtbwubwvbhwbhwbhwbhybwwbwxbsmbwybwzbwAbsmbwBbwCbwDbwEbwFbwGbwHbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSaoGbsubwTbwUbntbwVbwWbwXbwYbwZbxabxbbxcbxdbqUbxebxfbxgbxhbxiaWCaaaaaabxjbsNabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabxkbztbsLabqbBbbzubBdbBcbBgbBfbBibBhbBnbBjbCWbBobCYbCXbDabCZbDibDcbFdbDjbFfbFeaXLbrcbFgbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNabqaaaabqaaaaUNbxGaUNbxHbxIbfebxJaUNbxGaUNaUNaWDbgVbxKbxLbfGbxMbvBbxNbvBbxObfGbxPbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabxTbxTbxTbybbxTbycbydbxVbyebxTbxTbyfbygbyhbvVbqcbyibyjbykbylbymbynbymbymbwdbAjbAebyqbyqbyqbyrbysbytbyubyvbyqbyqbyqbBWbCcbkWbhwbyybyzbyAbyBbyCbhwbyDbyEbyFbyGbwxblCbyHbyIbCdbsmbyKbyLbyMbyNbspbspaoGaoGbyOaoGaoGaoGbyPbCeaoGaoGbyRbySaoGbyTbwTbyUbntbjNbjNbjNbjNbyVbjNbjNbyWbyXbyYbntbntbyZbzabzbbzcaaabqYbzdaaaabqaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaaaabxkbBabFkbGNbGMcKIbsebGSbGObrcaXLbsMbsMbsMbribribICbBkbribribrkbrkbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNaUNbdQaUNaWDaUNbdRaUNbzvbaBbzwbzxaUNbdRaUNbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbtkbzMbzNbtkbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbThbAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqaaaaaaabdaZhbIEbeWbeXbeXbIFaXLbBlbDbbKjbDdbDebDfbDgbDhbBlaXLbIFbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXbqcbBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCDbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaaaaaaaaaabdaXHbsfbKkbvhbeXbeXaXLbBlbFhbFibFjbKnbFlbFmbFnbBlaXLbeXbeXbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLanHbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcbtLbqcbqcbqcbvxbulbDUbqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbvybvzbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbzLbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbKpbKobKqbfbbgNaXLbBlbGPbGQbGRbMpbGTbGUbGVbBlaXLbgNbgQbMtbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbDRbDSbCHbEvbGlbGmbGnbGobGpbGqbEGbySaoGbGrbGsbGtbDTbGvbGwbGxbGybGzbCMbGAbGBbGCbGDbzLbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbNYbdMbeWbeXaXLbBlbIybIzbIAbPJbIBbRobIDbBlaXLbeXbeYbdMbRpbsdbPHaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabGWbGXbGXbGYbGXbGXbGXbGZbGXbGXbHaabqaUNbHbdfOdfPapfbINbHJbHdbFpbHebHfbHgbHhbHibHjbFpbHkbHkbHlbHmbHnbHobBKbFubHpbzKbHqbHrbBQbBRbHsbHtbFwbHubHvbHwbHxbtkbzPbfIbkJbFBbEwbHzbExbExbExbExbExbHBbFIbKRbIObkWbkWbkWbETbGkbGjbHybGubkWbkWbkWbPcbKRbhwbhwbEhbhwbhwbhwbhxbhwbHKbhtbHLbHMbhzbHAbHObHObHObHPbHObHQbHObHRbEvbEvbHSbEvbEvbCHbHEbHUbHVbHWbHXbHYbEGbCIaoGbHZbGsbIabIbbIcbIdbIebIfbIgbHFbIibIjbIkbIlbzLbImbInbIobIpbIqbIrbIsbHGbIubIvbIwbIxbIxbGLabqaaabFcaaabFbaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdaXHbdMbeWbeXaXLbKlbKlbKlbHNbRqbHNbKlbKlbKlaXLbeXbeYbdMaXOabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGWbIGbIHbIIbIJbIJbIKbIJbIJbIJbIKbGYbHHaUNaUNdfQbIMapfbFubQZbIPbFpbIQbHfbHgbIRbISbITbFpbIUbIVbIWbIXbBKbBKbBKbFuatjbzKbIYbIZbBQbBRbBQbBQbBQbBQbBQbJabBQbzMbJbbJcbJdbJebJfbJgbJfbJhbJfbJgbJfbJibCibJkbJjbJmbJlbJpbJnbJnbJqbKYbJrbJsbJtbJubJvbJwbJxbJobJybJzbJobJAbJBbJobJCbJDbJEbJFbwxbJGbCybJHbCybJIbCybJJbCybJKbEvbEvbJLbEvbEvbJMbHIbHUbJObECbHXbJPbEGbCIaoGbJQbJRbyUbDTbJSbIdbJTbIdbJUbJVbJWbJXbJYbJZbzLbKabKbbKcbKdbKebKfbKgbzLabqbzLbKhbIxbKibGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbMobRrbMqbHNbRsbHNbMsbSXbMuaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKrbKsbKsbKsbKsbKsbKsbKsbKsbKsbKsbKtbKubKvbKudfQbKwapfbKxbKyanEbFpbKzbHfbHgbKAbHfbKBbFpbBKbKCbBKbHmbKDbKEbBKbFuathbzKbKFbHrbKGbKHbKIbKIbKIbKIbKIbKJbKIbKKbygbKLbKMbKNbKObKPbKObKQbSrbKSbKTbKUbKVbKWbKXbKOcnjbKZbLabLbbLcbLdcpcbLebLfbLgbLhbLibLjbLkbLlbLmbLnbLobLpbLibLqbLrbLsbLtbLubLvbLwbLxbLybLybLzbLAbLwbLBbLCbLDbHTbCHbLFbCHbIhbLHbLIbLJbLKbLLbLMbLNaoGbLObLPbLQbLRbLSbLTbLUbLVbLWbzLbLXbLYbLZbMabMbbMcbIobMdbMebMfbMgbMhbItbMjbMkbMlbIxbMmbGLabqaaabFcaaabFbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbNZbOabObbHNbRqbHNbObbOabOcaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMvbMwbMxbMybMzbMzbMAbMzbMzbMzbMAbGYaUNaUNaUNdfQbMBapfbMCapfapfbFpbMDbMEbMFbHfbHfbHfbFpbMGbMHbBKbMIbBKbBKbBKbMJbMKbMLbFwbFwbJabMMbMNbFwbFwbFwbFwbMObMPbtkbzPbMQbMRbMSbMSbMTbMUbMVbMSbMSbMWbMWbMXbMYbMWbMZbILbNbbJNbMZbNdbNdbKmbNfbLEbNdbNhbNibNjbNkbNhbNhbNlbNmbNnbNhbNobhtbNpbNqbNrbLGbNtbNubNtbNvbNwbCybCybHRbHSbEvbNxbNybNzbNybLDbNAbNBbNCbNDbNEbEGbNFaoGbNGbNHbNIbNJbNKbNLbNMbNNbNObNPbNQbNRbGIbGFbzLbMibNcbNabNcbNabNgbNebzLabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcabfabeabqabeabfabfabeabeaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXaXLbPIbOabOabOabSZbSYbOabOabPKaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabMvbGXbGXbGYbGXbGXbGXbGZbGXbGXbOdabqaUNbOedfQbOfapfbFuatjbOgbFpbOhbHgbOibOjbKBbHfbFpbOkbOlbBKbIUbOmbOnbBKbFuapdbzKbOobOobJabBRbOpbOpbOqbOrbOsbOtbzKbzKbJbbOubOvbMSbOwbOxbOybOzbOAbOBbOCbODbOEbOFbMWbOGbOHbOIbOJbOKbNdbOLbOMbONbOObOPbNhbOQbORbOSbOTbNhbNhbNhbNhbNhbOUbhtbNpbOVbOWbspbOXbOYbHObOZbPabHObPbbspbSsbTZbEvbEvbEvbEvbEvbPdbPebPfbPgbPhbEGbPiaxhbPjbPkbPlbPmbPnbPobPpbPqbPrbPsbPtbPubPvbPwbPwbPxbPybPzbIpbPAbPBbPCbHGbIubIvbPDbPEbPEbGLabqabqbPFabqbPGabqbFcaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbRnbTabTcbOabTebTdbUzbUybRtaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDdfRbPMbPNbPObPPbPQbFpbPRbPSbOibPTbPUbPVbFpbBKbBKbBKbBKbBKbBKbBKbFuanHbzKbPWbPXbJabBRbFwbFwbPYbFwbPZbQabzKbQbbzPbfIbQcbMSbQdbQebQfbQgbQhbOBbQibQjbQkbQlbNsbQnbQobQobQobQpbQqbQrbQsbQtbQsbQubNSbQwbQxbQybQzbNTbQBbQCbQDbNhbQEbhtbQFbQGbQHbQIbQIbQIbQJbQKbQLbQMbQNbQIbQObQIbQPbQQbQRbQSbQTbEGbEGbQUbEGbEGbEGbNFbQVbQWbQXbQVbCMbCMbCMbCMbCMbQYbNObVpbRabRbbGGbRcbRdbRebRfbInbRgbRhbRibzLabqbzLbRjbRkbRlbGLabqaaabFcaaabFbaaabRmarBarBarBarBabearBarBarBaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbUAbfbbgNaXLbKlbVjbVkbOabTbbTdbVXbVlbKlaXLbgNbgQbVYaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbRubzzbaCbRvbaCbaBbaBbRwbaBbzzbaBbRxbzzbaBdfSbRyapfbRzaoXatkbFpbRAbRBbHfbHfbHfbRCbFpbRDbREbRFbRGbRHbRIapfbFuauCbzKbRJbRKbJabRLbRMbRMbRNbFwbFwbRObzKbRPbzPbfIbOvbMSbRQbRRbRSbRTbRUbOBbRVbRWbRXbRYbMWbRZbSabSbbSabScbNdbSdbSebSfbSebSgbNhbShbSibSjbSkbNUbSmbSnbSobNhbSpbhtbSqbbrbOWbQIbVrbVsbStbSubSvbSwbSwbSxbSybQIbQIbQIbQIbQIbQIbQIbEGbSzbSAbSBbEGbSCbQVbSDbSEbSFbQVbSGbSHasMbSIbCMbSJbSKbSLbSMbSNbSObSPbSQbSRbSSbRgbSTbSUbItbMjbMkbSVbPEbSWbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbUxbOabOabWabVZbXCbWbbKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebcebcedfUdfTdfWdfVdfYdfXdgadfZdgcdgbbTmapfbgYauyatkbFpbHhbTnbHfbHfbTnbTobFpbTparJarLbTqbPQbRHapfbFubTrbzKbTsbTtbTubTvbFwbTwbTxbTybTzbTAbzKbTBbzPbfIbTCbMSbTDbTEbTFbTGbOBbOBbTHbTIbTJbTKbMWbRZbSabSabSabTLbNdbSdbSebTMbTNbTObNhbTPbSibTQbTRbNhbTSbTTbTUbNhbTVbhtbTWbbrbTXbNVbUabUabUbbUcbUdbStbStbUebUfbQIbUgbUhbUibUhbUjbQIbUkbUlbUmbUnbEGbNFbQVbUobUpbUqbQVavBasJasJbUrbCMbSJbUsbUtbCNbCNbCNbUubGGbUvbGGbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbXDbXFbXEbYQbXGcckbZObKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbUBbUBaUNaUNbNWaWDdggdgRdggdfNaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGathapdatjbUHbXJapfbFuaoXbzKbzKbtkbUIbUJbtkbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbQmcclcdBccmbNhbVmbhtbVnbbrbOWbQvbVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbHGbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXbeXaXLaXLbKlbKlcepbKlbKlaXLaXLbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbWcbfdaUNdghdgjdgibBtdgkbBtdgldgmapfbWdbWebWfbWgbWhbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkdeJdeHapdbWlbWmapfbWnbWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWbQvbYubXdbXdbXebXfbXgbXhbXibXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRabXubXvbVQbXwbInbSPbXxbRgbXybRibzLabqbzLbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbIFbIFceqbIFbIFbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUNbUBbUBaUNdgndgjbBtbBtdgobBtdgpdgqapfbXHavUavUavUbDLathatkaoXaqBayBanHbXIauyauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbXObXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdbYhbYibYjbNhbYkbYlbYmbYnbNUbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbYxbYybYzbYAbYBbYCbYDccrbQIbEGbEGbEGbEGbEGbYFaoGbYGbUraucasJchGchFbYIasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbItbMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabredgrdgtdgsdgvdgudgxdgwdgyapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVdfibYWbYXbYVbYTbYVbYYbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbZAbZBbZCbZDbZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbKkbvhbvhbvhbvhbvhbvhbdObvhbvhbvhbvhbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgfdgzdgzdgzdgzdgzdgAaaaabqaaabZPbZPbZQbZRbZSapfbZTapfapfapfaYabZUbZUbZUbZUbZUbZUbZUapdbZVbZWbZXbzKbZYbZZcaacabbHrbWscaccadcaeayBapfcafbzPcagcahcaicajcakcakcakcalcamcancaocakcapcaqcaicaicarcascarcarcatcarcaucavcavcawcaxcaycazcaAcaBcakcakcakcaCcaDcavcaEbbrcaFcaGbQAcaIcaJcaKcaLcaMcaNcaKcaOcaPcaQcaRbQIcaScaTcaUcaVcaWcaXcaYbZGcaZaoGaoGaoGaoGaoGcmHbXtbCMbCMbCMcbcbJWbNRcbdcbecbfbKacbgcbhcbibVScbjbPCbHGbIubIvcbkcblcblbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHcerbMrbMrbMrbMrbMrcLLcLLcQccLLcLLbMrbMrbMrbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgJdgzdgzdgzdgzdgDdgraaaabqaaabZScbmcbncbobZSapdcbpbPQcbqapfcbrbZUcbscbtcbucbvcbwbZUapdaoXbZWaoXbzKbzKbzKbzKbzKbzKbzKbzKbzKaxqaoXapfcbxbzPcbycbzbekbekbekbekbekbekbenbekcbAcbBcbCbembekbekbekbvTcbDcbEcbFbekbekbekbekbekcbGcbHbekbekbenbekbekbekbekcbIbekcbAcbJcbKcbLcbMcbNcbOcbNcbPcbPcbQcbRcbScbPcbOcbTbQIbQIbQIbQIcbUcbVasIarrcbWcbXasIcbXcbYcbZaoGayoaoGbCMccaccbcccccdcceccfccfccfbMcbGGbGGbGGbRgccgbRibzLabqbzLcchcciccjbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbsdbsdbsdbPHbNYbbXcUIcUMcUIbbZaXOabqaaaaaaaaaabqaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgzdgzdgzdgzdgzdgzdgraaaabqabqbZSccnccoccpbZSapdccqcmIapfapfccsbZUcctccuccvccwccxbZUapdapdccybYVbYTbYVbYYbYVcczccAccAccAccAccBbcGccCccDccEccFccGccHccIccJccGccGccGccKccGbdabcXccLbcYbcXbcXbcXccMccNbcZbcYbcXbcXbcXbdbccOccPccQccQccQccRccQccQccQccSccTccOccUccVccWccXccYccZcdacdbcdccddcdecdfcdgcdhcdecdibZvcdjcdkbZvcdlcbVasIasIasIasIasIcdmcdncdocdpcdqcdrcdscdtcducdvcdwcdxbGGbGGbGGbGGbGGbInbGGbRgcdybSUbItbMjbMkcdzcblcdAbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHcerbzhcWjbzhbNXaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgrdgBdgFdgFdgFdgrdgraaaabqaaabZScdCcdDcdEbZScdFapdcdGapfcdHcdIbZUcdJcdKcdLcdMcdNbZUbZUbZUbZUbZUbZUcdObZUbZUcdPcdQcdRaoXauycdSauCcdTcdTcdTcdTcdTcdTcdTcdUcdUcdUcdUcdUcdVcdWcdWcdXcdYcdWcdZcdWceacebbbrceccedceecefceecegcehceeceeceibZubbgbbibbicejbZucekbZubSlcembSlbZvcenceocfDcdhcitcescdfcixcdhcetceubZvcevcewbZvcexceycezcdocdocdocdoceAceBceCceDceCceEbPmceFceGceHbGGceIbPwbPwbPwbPwbPwceJbGGbRgbUwceKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabsdbsdbsdbsdbsdaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgGdgHdgHdgHdgHdgHdgHdgGaaaabeaaabZSbTYceMbTYbZSapfapfapfapfbZUceNbZUceOcePceQceRceSbZUceTceUceVbZUceWceXceYbZUceZbZUbZUbZUbZUbZUbZUcdTcfacfbcfccfdcfecffcdUcfgcfhcficdUcfjcfkcfjcflcfmcfjcfkcfjcfncfocfpcfqcfrbVicftbVicfucfvbVicftbVicfwcfxcfxcfxcfxcfxcfybZucfzcfAcfBbQAcfCcbOcdfcdhcdhcdecfDcdhcdhcdecfEbZvcfFcfGbZvcbUcfHcfIceCceCceEceCceCcfJcfKcfLcfKcfKbCMcfMcfNcfOcfPcfQbInbGGbGGceIbPwcfRbSSbRgcfSbRibCMabqabqabqabqabqabqabqabqbPFabqbPGabqbRmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaabTYcfTbTYaaaabqaaaaaaaaabZUceNbZUbZUbZUbZUcfUbZUbZUcfVcfWcfVbZUbZUbZUbZUbZUcfXcfYbZUcfZcgacgbcgccgdcgecgfcggcgfcghcgicgjcgkcglcgmbVocgocgpcgqcgrcgscgtcgucgvcfkcgwcgxcgycftcgzcgAcgBcgCcgDcgEcgFcgGcgHcfxcgIcgJcgKcfxcgLbZucgMcgNcgOcgPcgQcgRcgScgTcgUcgRcgScgTcgTcgRcgVcgWcgXcgYcgZchacbVasIchbchccfKcfKcfKcfKcfKchdchechfbCMchgchhbGGbGGbSPchibIqbIqchjchkchjbIqchlchmbRibCMbCMbCMaUVaUUaUVaUUaUVaaabFcaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqbTYceMbTYabqabqabqabqabqbZUchnchochpbZUchqchrchsbZUchtchuchvchwchxchychzbZUchAchBchCchDchEcmJcoQchHchIchJchKchLchMchNchOcdUchPchQcaHchSchTchUchVchWchXchYchZciacgwcgxcgycibciccidciecifcigcihcihciiciicelcikcilcimcfxcinbZuciocipciqbQAcircisciuciucivciuciwciucKCcJFciybZvcizciAciBciCcfJaoGaoGaoGcfKciDciEciFciGciHciIciJbCMciKciLciMciNciOciPciQciRciSciTciUciVciWciXbRiciYciZciYcjacjacjacjacjbabqabeaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaacjcaaaaaaabqaaaabqaaabZUbZUbZUceNbZUcjdcjecjfcjgcjhcjicjjchychychscjkbZUcjlcjmbZUcdNcjncjocjpcdTcjqcjrcjscjtcjucjvcjwcjxcjxcjycjxcjzcjAcjBcjBcjCcjDcjEcjFcjGcjHcjIcjJcibciccicciccjKcjLcjMcjNcjOcjPceLcjRcjScjTcfxcjUbZubZubZubZubZvbZvcjVbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvcjWcjXaoGcjYcjZcfKckackbckcckdckeckfcqcbCMckhckhckickhckjckhckickkckjckjbRickhcklckmcknbCMbCMbCMckockpcjackqckoaaabFcaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckyckzchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRckSckTcfscgwckVcgybVickWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljclkcljcllclmclncljcljclocljcljcljcljclpclqclrboccdocltcluclvclwbVKcfKclxclyclzclAclBclCclDbCMbCMbCMcgnbzLchRbzLcgnbzLchRchRcijbzLcijbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRclSclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcjQcmjcjQcmkcmlckVcmmcmncmocmocmocmocmpcmqcmrcmscmtcfxcmucmvcmwcfxcmxcmycmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCaoGaucasJasJasJaoGasJazocfKcmEcmFcmGclAcqrcqJcqIclAabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchnchocjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngckUcnicdTcjxcrjclEcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmocnvcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCaoGclsasIcnPcnQaoGcnRcnScfKcnTcnUcnVctucnXcnWcNmctuabqbGLcnYbzLcnYbGLcnYbzLcnYbGLcnZbzLcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbaoGaoGaoGaoGaoGaoGaoGaoGcfKcfKcfKclFctucpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcjQcnsckVcrWcmocqdcqecqfcqgcqhcqiclGcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqFcqEcqHcqGbZUcsoctuctucsRctuctuabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacmicqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrocnhcrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccnkcqjcqjcmBcsfcmBcsgcshcsicsjbZUcskchychychycdKcslbZUcsmcynctucyqctucspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacmicsvcrccqZcswcpycsxbZUbZUcsycoecrscqXcrscsdcrscoecrscsCcrscoeckEcsecsEcszckEckEcsGcsHcsIcsJcsJcsAcsDcsBcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttdbjctvdbjarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacmictwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMcsFctOcgrctPcsJctQctRcABctTctUcsJccvcmgctVctWctXctYcjQctZcuacubcuccudcuecufcugcuhcuicujcsKculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcmiabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacmicmicqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRcsLcuTcuUcuVcuWcuXcuYcuZcgrcgscsAcvacvbcvccvdcvecsJchscmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcvLcvMcvNcvOcvPcvQcvRcvSbZUcvTcvUcvVcbvctqchychycvWcvXbZUcvYabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqabqaaaaaaarBaaacjcaaaaaaaaaaaaabqaaacmicvZcqZcwacqZcqZcsxbZUbZUcwbcwccwdcuLcwecuNcwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscjAcsMcwucwvcwwcwxcwwcwycwzcmgcwAcwBcwCcwDcjQcvkcvlckVcvmcwEcmpcwFcwGcwHcwIcwJcsKcwKcwLcwMcwNcwOcwPcwQcwRcihcihcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecmBcmCbZUcxfcxgcxhcsicxicuHcmDchycxjcmiaaaabqaaaaaaaaaabqabqabebFbbFbbFbbFbbFbbFbabebFbbFcbFbbPGabqbFcabqabqabebRmbRmbRmabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaaaaaarBaaackraaaaaaabqabqabqaaacmicxkcpycracpycxlchscxmbZUcodcoecxncxocxpcxqcxrcoecxscxtcxucoecxvcxwcxxcxycxzcsFcxAcgrcxBcsJcxCcxDcxEcxFcxGcsJcxHcmgcmgcxIcmgcmgcmgcmgcxJcxKcxLcmocmocmocmocmocxMcxNcmocmzcmzcxOcxPcxQctNctkcukcxUcxUcxUcxUcxVcxWcxXcxVcmBcmBcmBcxYcxZcyacybcmBcmCbZUcvTcycbZUcydcyecyfcygcygcyhbZUabqabqabqabqabqabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaabFcaaaaaaabqaaaaaaabqaaaabqabqaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBabqabearBaaaabearBarBabqabqabqckrabqabqabqaaaabqabqcmicpycxlcpycyictqcyjcykcylcymcoecAMcuLcyocypcCScoecyrcxtcyscoecoecoecytcytcytcytcyucyvcywcyxcyycyzcyAcyBcKYcsJcyDcyEcyFcyGcyHcyIchBcyJcyKcyLcyMcyNcyOcyEcyPcyQcyRcyScyTcyUcyVcyWcyXcyYcuSczaczbczcczdczeczfcxVczgczhcziczjczkcmBcmBcmBcmBcmBcmBczlbZUbZUbZUbZUbZUbZUbZUcmibZUbZUbZUaaaabqaaaaaaaaaabqabqabqabebFcbFcbFcabebFcbFcbFcabebFcbRmbFcbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczmaaaaaaaaaabqaaaaaaaaaabqaaaaaaabqaaaclIaaaaaaabqaaaabqaaacmicmicmibZUbZUcznczobZUbZUcodcoecMbcuLcwdcuNcMXcoecwdcxtcwdcwdczrcoeczscztczuczvcwrczwczxcsJczyczzczAczBczBczBczBczBczBczBczCczDczCczEczFczGczHczIcMYczKczLbZUczMczMczNczMczMczOczPczQcuSczRczSczTczUczVczWcxVczXczYczZcAacAbcrUcfYclPbZUcAccmYcAdbZUcAecfYbZUaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqabqabqcAfcAfcAfcmRcAfaaaarBaaaabqaaaaaaaaaaaabZUbZUbZUbZUbZUcAgcodcwccwdcuLcwecuNcwdcAhcwdcAicwdcwdczrcoecAjcAkcAlcwtcAncAocApcsJcsJcsJcsJczBcAqcArcOUcMscAuczBcAvcAwcAxcAycAzcgxcAAbZUcMZcACcADcAEczMcAFcAGcAHczMcAIcAJcAKcxRcPkcANcAOcAPcAQcARcxVcAScATcAUcAVcAWcrUcAXcAYcAZcBackDcBbcAZcBccvWcmiabqabqabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqabqabqabqabqabqabqabqbZUcFRcFScFRbZUcBjcBkcoecBlcBmcxpcBncBocoecxscwdcwdcwdcBpcoecBqcBrcBrcBrcBscBtcBucBvcBwcBxcByczBcBzcBAcBBcBCcBDczBcBEcBFcBGcBHcAzcgxcBIcBJcBKcBJcBJcBJczMcBLcBMcAGcxScBOcBPcBQcBRcBScBTcBUcBUcBVcAQcxVcBWcATcBXcBYcBZcrUcCacCbbZUcCcchycCdbZUchycCebZUaaaabqaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaDaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaackraaacCfcCfcCfcCfcCfaaaarBaaaaaaaaaaaaabqabqbZUbZUbZUbZUbZUchycBkcoecCgcChcCicCjcCkcoecClcwdcCmcCncCocoecCpcCqcCrcxTcCtcCucCvcBvcCwcCxcCyczBcCzcCAcCBcCCcCDczBcCEcCFczCczCcCGcgxcmmcBJcCHcCIcCJcFoczMcCLcAGcCMczMcCNcCOcCPcxUcCQcCRcPCcCTcCUcCVcxVcCWcCXcCYcCZcBYcrUbZUbZUbZUctmbZUcDabZUbZUbZUbZUabqabqaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqaaaabqabqabqaaacDbaaaabqaaaabqaaaabqaaaarBaaaaaaaaaabqabqaaaabqaefbZUcDcbZUchycBkcoecoecoecoecoecoecoecoecDdcoecoecoecoecDecDfcDgcDhcDicDjcDkcyZcDmcDncDocAmcDqcDrcDscDtcDucAscDwcDxcDyczCcmlcDzcDAcDBcDCcDDcDDcDEczMcDFcDFcDGczMcgCcCOcDHcxUcxUcxUcxUcxUcxUcxUcxVcxVcxVcDIcxVcxVcrUcAccDJcmYcDKbZUchycDLcDMcDNcDMckscksaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqckrabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeaaaaaacDOcDPclJcDQcDRcDQcDScljcljcljcljcljcljcljcljcljcDTcDUcDUcDUcDUcDUcDUcDUcDVcDWcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcEicEjcEkcElcEmcEncgxcEocEpcEqcErcErcEsczMcEtcEucEuczMcEvcEwcExcEycEzcEAcEBcECcEDcEEcEFcEGcEHcEIcEJcEKcfZcELchychybZUbZUcEMbZUbZUbZUbZUabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqaupabqabqabqarBabqabqabqabqbZUcENbZUcdNckDchychycEObZUbZUbZUbZUbZUcEPcEQcDUcERcEScETcEUcEVcDUcEWcEXcEYcBvcEZcFacFbczBcFccFdcFdcFdcFeczBcFfcFgcFhcFicFjcFkcFlcBJcFmcCIcFncWcczMcFpcFqcFrcxScFscFtcFucAtcFwcFxcFycFzcFAcFBcFCcFDcFBcFEcFFcEKbZUcFGbZUcFHcFHcFIcFJcFKcFLcFMabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIabqcCfcCfcCfcCfcCfaaaarBaaaaaaaaaabqaaaaaaaaaaaabZUbZUbZUcfZbZUcjncFPcFQbZUcPGcNacNbbZUcFTcFUcFVcFWcFXcFYcFZcGacGbcGccGdcGecBvcGfcGgcGhczBcGicGjcGkcGlcGmczBcGncGocGoczCcGpcGqcGrcGscGtcGucGvcGwczMcGxcGycGzcGAcGBcGCcGDcGEcGFcGGcGHcGIcGIcGJcGKcGLcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGVcGVcGWcBNabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcGYcFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaabqaaaabqaaaabqaaacmRaaaabqaaaabqabqabqabqaupaaaaaaaaaabqaaaaaaaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUcNOcNPcNQbZUckDcGZcDUcHacHbcHccHdcHecCscHgcHhcHicBvcBvcDlcBvczBczBczBczBczBczBczBcHkczCczCcHlcHmczGczHcHncHocHocHpcHqczMcHrcHscHtcDpcHvcHwcHxcDvcHzcHAcHBcHCcHDcHEcHFcHGcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcBNabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcHVcHWcHXcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqcHYabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeabqcHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaabZUcOJcOKcOLbZUcIbcEQcDUcIccIdcHbcIecIfcDUcIgcIhcIicDUcIjcIkcIlcImcIncIocIncIpcIncIqcIocIrcImcIscnscgxcItcBJcIucFOcIwcIucIxcIxcIxcIxcIxcIycxPcIzcEycIAcIAcIBcICcIDcIEcIFcIGcIHcIIcIJcEKcIKcILcIMcEycINcBNcBNcFHcBNcFHarAabqaaaaaaabqaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqcALcALcIOcIPcIPcIPcIQcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaabqabqarBaaacHZcIRcIScIRcITcIRcHZcHZcFvcHZcFvcHZcHZcPDcPEcPFcjicQKcDUcDUcDUcDUcDUcDUcDUcIUcIVcIWcIXcIYcIZcJacImcJbcJccIncIocIncJdcJecJfcImcJgcnscgxcvmcwEcJhcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcXxcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupabqabqaaaarBabqcHZcJHcJIcJJcJKcJHcGXcJMcJNcJOcJPcJQcHZbZUbZUbZUbZUcJRcJScJScJTcJScJUcJVcJWcJXcJYcJZcKacKbcKccKdcKecKfcKgcKfcKfcKhcKicKjcKkcKlcKmcKncFkcKocKpcKqcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwdgScKxcKycKzcKAdgTcYScKBcKDcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcHfcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcALcALcKJcIPcIPcIPcKKcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaaabqabqabqaaaaaacKLabqaaaaaaabqabqaaaaaaarBaaaaaaaaaabeaaacHZcKMcHjcKOcHucKMcKMcKQcKRcKScKTcKUcHZaaaaaaaaacrUcrUcrUcrUcrUbZUcKVcDUcDUcKWcKXcRocDUcKZcLacLbcImcLccIocIncIocIncLdcLecLfcLgcLhcLicLjcLkcIxcIxcLlcLmcLncLocLpcLqcLrcJpcLscLtcLucBNcKxcKycLvcLvcLwcLxcLycLzcJucLAcEKcdNcLBceNchycLCbZUabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcLDcLEcLFcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcLKcHycLMcLNcLOcLPcLQcLRcIacIacIacLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcKycLvcMrdgTcYTcKBcMtcMucMvcEKcMwchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcMycFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqabqaaaarBaaacFvcMzcMAcMBcMCcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMPcMBcMQcMRcMScMTcMUcMScMVcMWcWGcSCcWIcWHcYocRUcImcImcImcImcImcImcNccImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhcNicNjcNkcNldgVdgUdgUdgUdgUdgUcNocNncNpcNqcNrcEKchychycNschybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaaabqabqabqaaacHZcNucNvcNwcNxcNycIvcNAcNBcNCcNDcNEcHZcFvcFvcFvcHZcNFcNGcNHcHZcNIcNJcDUcNKcNLcNMcNNdegdeidehdejcRUcNRcmVcNScmWcmVcNTcNUcDJcmZcNVcNWcNXcBIcIxcNYcNZcOacOacOacObcOccOdcOecOfcOgcOhcOicOjcOkcOlcJLcOncOocOpcOqcOrcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqaaaaaaaaaabqabqcHZcKHcOzcKMcOAcKHcOBcODcOCcOEcOFcOGcHZcOHaaaaaacrUcrUcrUcrUcrUbZUcOIcDUcDUcDUcDUcDUcRUdeldekdemcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTdeIcOVcOWcLpcOXcOYcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdencPlcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBarBarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacHZcPpcPqcKMcPqcPrcPscKMcKMcPtcKMcKMcHZabqabqabqbZUcjncfZcPucPvcPwcPxcmYcPycPzcPAcPBcRUdepdeodeqcRUcOMbZUcPHcPIcPJbZUcPKcPLcPMbZUcPNcPOcPPcIxcPQcPRcPScPTcPUcPVcLpcPWcIxcPXcPYciccPccPZcQacQbcKNcQdcQecOpchycQfbZUcQgcQhcQibZUcQjcQkcQlbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaacHZcQmcQncKMcQocQpcPscQqcQrcQscQtcQucHZaaaabqaaabZUcQvcQwcQxcQycQzcQAcQBcQAcQAcQCcQfcRUcRUdercRUcRUcOMbZUcQDcQEcQFcQGcQHcQIcQJdescQLcQMcQNcIxcIxcIxcIxcIxcQOcIxcQPcrUcrUcfwcQQcfwcOpcOpcOpcOpcOpcOpcOpcOpchycQRcQScQTcQUcQVcQWcQWcQXcQYcQWaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacHZcQZcRacKMcRacQZcRbcRccRdcRecRfcRgcFvaaaaaacRhbZUcRibZUbZUbZUcRjbZUbZUbZUbZUcRkcRlcRmcRndetcRmcRpcRqcRrcRscRtcRucRvcRwcRxcRycRycRzcRAcRBcRCcRDcREcmYcmYcRFcmYcRGcmZcRHcRIcRJcRIcRKcjNcjNcRLcRMcOtcmYcmYcmYcRNbZUcnOcROcRPcQWcRQcRRcRScQWabqabqabqabqabqabqabqabqabqabqabqabqaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHZcHZcFvcHZcFvcHZdeucRVcRWcRXcRYcRZcHZabqabqcRhcSacSbcRhcSccSdcSecSfcSgcShbZUbZUbZUbZUcSibZUbZUbZUbZUbZUcSjcRtcSkcRtcSlcSmcSncRtcSocSpcSqbZUbZUbZUbZUbZUbZUcCdcSrcfZbZUcSscStcSucfwcicciccSvbZUbZUbZUbZUbZUbZUbZUbZUbZUcuEcQWcSwcSxcSycQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqabqabqcSzcSAdewcKPcSDcSEcSFcSGcSHcHZaaaaaacRhcSIcSJcRhcSKcSLcSMcSNcRhcRhcSOcSPcSQcSRcSScSRcSTcSUcSOdexcSXcRtcSkcRtcSYcSZcTacRtcTbcTccTdcTecTfcTgcThcTibZUcTjbZUbZUbZUcTkcTlcTmcfwcfwcfwcTnbZUcTocTpcTqbZUcTrcTscTtbZUctocQWcTucTvcTwcQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaabqaaaaaacTxabqdeycHZcHZcHZcHZcHZcHZcHZaaaaaacRhcTycTzcRhcTAcTBcTCcTDcRhcTEcTFcTGcTHcTIcTJcTKcTLcTLcTMcTNcTOcTPcTQcRtcSYcTRcTacRtcSocSpcSYcLScTTcRtcTUcTVbZUcTWbZUabqaaacNzcTYcNzaaaaaacOmcWkbZUcmDchychycUacjicUbcjicUccUdcQWcOycUfcOycQWaaaabqaaaabqabqaaaaaaabqaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqabqaaaaaaaaaabqabqabqaaaaaaaaaabqaaaaaaaaacRhcUgcUhcUicUjcUkcUlcUmcRhcUncRhcUocUpcUqcUrcUscTHcTHcUtcUucUvcUwcUxcUycSYcUzcTacRtcSocUAcUBcUCcUDcUEcUFcUGbZUcTjbZUabqabqcNzcUHcNzabqaaacOmcWlbZUchychychycUJcUKcctcULbZUcmicQWcOycWJcWmcWKcWKcWKcWKcWKcWKcWKcWKcWLarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaacRhcTycUNcRhcUOcUPcUQcURcUScUTcRhcUUcUVcUWcUXcUYcUZcVacSOcSWcTacRtcVccVdcVecVfcVgcUwcVhcVicVjcVkcVkcSVcTScVkbZUaefabqaaaaaacNzcVncNzaaaaaacOmcWkbZUcVocVpcVqbZUcVrcVscVqbZUaaaabqcOycOycOyabqaaaabqaaaaaaabqabqaaacWRarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcTXabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacOmcWkbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaaaaaaaaabqabqabqabqabqabqaaaaaacWRarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacOmdafcWTcWTcWTcXlcXAcWScXBcXCcXBcXCcXBcXoaaaaaaabqabqaaaaaaaaaabqaaaaaacWRaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSOcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcTXaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncOmcYccYccYccYccZvcYycXZcXDcYbcXHcYdcYecXZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZjaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncWMcVRcWNcWOcUXcWPcWQcZlcZkcZmcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcYccZvcYycYacYxcYbcYdcYbcYzcXCaaaabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcXrcXscXtcVGcXucXvcVGcVGcXwdeQcXycXzcVGcYccZvcYycXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcXRcXScXTcXUcXVcXVcXWcXXcXYcNzcYccZvcYycYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaabqaaacTXcXpcTXcZUcZTabqabqaaacNzdeBcYpcYqcYrcYrcYscYtcYucYucYucYucYvcYwcNzcYccZvcYycOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaidcbcYFdcbdajcYFcYFcYFdaidakcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLciccWkdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqdaVdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcVbcZJcZKcZLcZMcZNcVlcZPcZPcZPcVGcYcdbudbFdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcZXcZYcZZdaadabdacdadcZPcZPcZPcVGcOmcfwcOmcOmcfwaaaaaaaaaaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddaZcZedcedddcZBcZBdcFcZBcZBcYFdclcYFdcmcYFcZBcYFdcmcYFdclcYFcZBcZBcZBcYFaaacVGaOEcZPcZPcVmdapdaqdardasdatcVEcZHcZHdavcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqagXagXaiuagXagXabqabqacAacAacAacAacgaiMaiwaixaiyaizaiAaiBaiwaiCaiDaiEaiFaiGaiHaiwaiIaiJaiKaiLaiNabqagBaiQaiOaiPaiTaiRaiSaiUagBabqagFaiVaiWaiXaiYaiZajaakcagLdeLajMajdajeajfajRdeMajgajgajgafbajhajiajjajkajkajlajkajmajnajoajpajpajpaivairairairairairaivaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabeabqaaaaehajqajrajsajtajuaehajvaeGaeGaeGajwaehajxaeGajzajAajqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaabqajBajCajDagWajBabqaaaaaaaaaabqaaaacgacgajFajGajHacgajIajJajIacQacQacQacQajKajLajSajNajOajPajQacgabqagBajTaiOakuajWajUaiSajVagBabqajcajXajYajZakaakbajYanJajcdeLdeNajdakdajfaheajgajgakeakfafbafbafbakgakhakiakiakjakkaklakmakmaknakoaivairairairairairakpafbafbafbaaaabqaaaaaaaaaaaaaaaabeaaaaaaaaaabqaaaaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaehakqakqaeFaeFaeFaehakraeGaeGaeGaksaehaeFaeFaeFakqakqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaktaktakIakIakIakIakIajBakvakwakxajBabqabqabqabqabqaaaaaaacgacgaiNacgacgacgaiNacgacgakAakBakCakDakEakFakGakHakHakHagBagBagBakOakJakKakLakMakNakRagBabqagCakPakQakTakSalAakUakVagCdeOdeNajdakdajfaheakWajgakXalWakZalaafbalbakhakialcaldaldaldaleakmalfalgalhairairairairairalialjalkaeNaaaabqabqabqabqabqabqabfabqabqabqabqabqaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaflallallafgaaaaaaaehalmaeGaeGaeGalnaehaaaaaaaflallallafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaloalpakIalqalrajyaltajBajEalvalwajBakyalLakyakyabqabqaaaaaaaaaabqaaaaaaaaaabqabqalMalBalCalBalDalEalFalGakHalHalIalJagBagBagBalKalNagBagBalOagBagBalPagCagCakzakYalRalualsagCagCatzdePalTalUalVaheajgajgalWalWalXalYafbalZakhamaambamcamcamdameamfamgamhaeNairairairairairaeNamiamjaeNaaaabqaaaabqaaaamkamkamkamkamkamkamkabqabqabqadFabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehamlaeGaeGaeGalnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktammaktamnalrampamqajBajBamramsajBalxalzalyakyakyabqabqabqabqabqabqabqabqaaaaaaamxakDakDakDakDamyamEamAakHamBamCamDagBamFamIamGamHamKamJanYanFagBamMamNamOamPamQamRamSamTamOamUdeRdePamWamXamYaheamZalWalWanaanLajgafbanbancandaneanfanfangameamjanhamhaeNairairairairairaeNanianjaeNabqabqabqabqabqamkankanlanmannankamkabqaaaanoanpanoansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehantanuaglantanuaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakIanvanwanxanyanzanAanBanCanDanEakyamtanGamvanIakyabqaaaaaaabqaaaaaaaaaakDakDakDamxalQanKanSanManNanOanPakHanQamCanRagBanTanWanUanVanZanXanYaonaoaaobaocaodaoeaofaogaohaoiaojaokdeUaoHaoLaooaopaheaoqalWaosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGapeaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaapgaoMapgasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaakDapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheamoapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqpaqoaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktamuaqvapdakyaqxaqyaqzaqAakyapfapfaqBaqCanEajgajgakDaqFaqEamxamwarSaqTaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaxfaqYaqUaqVaqWakHaqXdfnaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqDairairairairairaqbarrarsaoGaqeaoGaoGapeaoGamkartaruankarvarwamkabqapgapgaoMapgansaoGaoGaoGcKIacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktapdaqvapdapfarIapdapdapdarJapfarKarUamzarNajganHarWarParRaumazcaCTarVaorarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassaEgaEgaEgastasualfaswasvasvasxasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKaouasJasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCbkjavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgapdapdatiapfaoXaElaEjajgajgatlatmaquapOamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYamLakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOayGafbasyatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayvaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqauCapfautausausausausausauuapfarKauqapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEarJapfauGaNEaFEajgauIatmakeakfaqwajgauLamxauMauNaqJatqapnauQauPauTauRauSauSauUauVauWauXaqUauYanYakHdfsdfravcauZaveavfaveavhaveaviavjavkavlavlavmavnamOayGafbaszavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGaqGavyavzaoGaoGasJaoGavAawMavCasJavDavEavHavGawZavIavJamkapeansarTavLavMaoGdgCdgCblyavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqalLasAavoatLazLapdapdapdapdapdbMKavQavRaoZavWavSatkapdavYavXapdatkaxqajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatrasSavdawdasLawlawkawmaqUawnaqYawsawtawuasdasMdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOayGawaavZaxjavqavrawNawOawPawoawRawSawTavvawUawVawWavvaoGaoGasJaubasJasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxansansaxdaxeaoGaoGbnIaxhaoGbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfawcapfapfaxlaxkaxkaxkaxkaxkaxZapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamEaxGaxHaqJaxIaxJaxKaqYawpagBagBagBawrawqasdagBaxPawQakHakHamOaxLaxRaxSaxLamOaxNaxMamOaxOatKatKaxWaxWaxWamOamOayGafbdeeaAAdefavrayaaybayaawoaycaydayeayfaygayhayiavvathaoGaykaylaymaynaoGasJaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaoGdfCdgCdfEaoGaoGaoGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzatkapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXapdaoXayDayEayFayHayGaAYajgajgajgaxTaxQaxQaxQaxUajgajgayMayNayOatnayMamEamEakDayQayRapnaySaySayTayUaySaySayVayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDayGafbaxYaWvavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIasJawXasJaoGayvaoGazpaoGazqdfFazsbpmawebpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaWwaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLatkapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfapdaoXapdaoXazNazOazPawfatoaAYajgaaaabqaaaaaaaaaaaaaaaabqaaaaxEazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAdaxVaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDayGafbaxYaWxavqavraABaACaADayJaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGasJaoGatAaxhaxhawYawJamkaxhaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAObreabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPatkapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXajgawKaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamEamEakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDayGaBIaBIaBIaBIavraBJaPWaBLaBNaBMaBOayeaBPaBQaBRaBSavvaBTaBUaBWaBWaBXaBWaBWaBWaBZaBWdgEaCaaCbaCcaCdawLaCfaCgaChaCgaCiaCjaCjaCkaCjaxiaxhaxhaCgaCiaCjayAaCjaClaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXatkarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuazRaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaakDayLaCGazwatJayLaCIazwakDayLaCJazwakDaCKamEaCLakDamEazzaANamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDayGaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaCmaCeaDfaWyaDfaDhaDiaDiaDjaWzaDkaCjaDlaCjaDmaWzaDjaDiaCvaDnaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLayBatkapdapfaaaaASaDqaDraDqaASayKaDsaDtaCsaDuaDvaDwaDxaDyaCsaDzaDAaDBaCEaCNaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaucayMaAfaAfamxaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaEdaEeaCSaEfaEgaEgaEgaEgaDdaBIaRtaEkaRyaBIaEmaEnaEmavvaEoaEpaEqaEraEsaEuaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaExaExaEyaEzaEAaEBaDeaEDaCgaCgaCgabqabqaDiaEEaEFaDiaDiaDiaDiaDiaEGaEEaDiaDCbbTaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyatkapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQasbaESaETaEUaETaEWaCuaCwajgaaaaBbaEXaEYaEZaFaaFbaBbaaaayMaFcaCCaCCaFdaFeaFfamxaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaFkaFlaFmakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSayGalWalWalWapPalWaBIaTeaFDaThaBIaFFaFGaFGaFHaFIaFJaFKavvavvavvavvavvaoGaFLaxhaFMauraFOauvaFQaFRaFSaFTaFTaFTaFTaFUaDDaFWaFXaFYaCgaFZabqaaaabqaaaaaaaaaabqabqaaaaaaabqaaaaWAaEibbTaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaECalLaaaaaaaASaDraDraDraASayKaGcaGdaGeaEMaEKaGfaGgaGhaCsaGiaGjaGkaEHaGmaCuaCwajgabqaBbaGnaGoaGpaGqaGraBbaaaayMaGsaGsaGsayMaAfauFamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaGCaGDaEVaGFaGGaGHaCSayGajgajgajgaFyajgaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaGTaGUawWavvaGVaGWaxhaGXaGYaGZaGZaHaaCMaDcaHcaFAaFzaFzaFzaFBaHgaFVaHiaDLarAaMKaMJaMJaOhaMJaMJaOhaMJaMJaOhaMJaMJaPwaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqaHkaHlaHkabfaaaabqaaaabqapfaHmaHnanEatkapfapfaaaaCoaHoaHpaHqaCoayKayKayKaCsaHraEKaHsaGgaHtaCsaHuaHvaHwaGlaHyaCuaCwajgaaaaBbaHzaHAaHBaHCaBbaBbaaaaHDaHEaHEaHEaHFaHGaHHaHGaHIaHJaHIaHKaHIaHJaHIaHLaHIaHJaHMaHNaHOaHPaHQaFCaHSaHTaHUamxazeaCSaHVaHWaEaaGIaGEaIaaCSayGaBIaIcaIdaHdaGJaGJaHeaIhaIiaIjaIkaIlaImaInaIoaIpayeaIqaIraIsaItavvasJaGWaxhaIuaIvaIwaIxaIyaIzaIAaIBaHfaIDaIDaIDaIEaIFaHhaHiaDLaMIaPxarAarAaPyarAarAaPyarAarAaPyarAarAaPxaWAaHxaCgaDoabqaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqaaaaHkaIGaHkabqabqabqabqabqapfauJapdapdaHXaIJapfaaaaIKaARaILaARaIMabqabqabqayKaINaIOaIPaIQaIRaCsaISaITaIUaHYaIWaCuaCwajgaaaabqaaaaGaaIYaGuaaaabqaaaaHGaAfaAfaAfaHGaHGaJaaJbaJcaJdaJeaJfaJgaJhaJhaJiaJhaJjaJgaJkaJlaJmaJnaERaJpaJqaJramxazeaCSaCSaJsaJtaCSaHZaCSaCSayGaBIaBIaBIaJvaJwaJxaIeaJzaJAaJBaJCaJDaJEaJFaJFaJGaJHavvavvavvavvavvaubaGWaxhaJIaJJaJKaJLaJMaGvaJOaJPaJQaJRaJSaJTaJUaJVaHhaHiaDLaDLaPxarAaJWaaaaaaaaaaaaaJWaaaaaaaJWarAaPxaIfaGbaCgaLwabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaabqaaaaHkaHlaHkaHkaGwaGwaGwaHkaHkaHkaHkaHkapdatkapfaaaaaaaaaaaaaaaaaaaaaaaaabqayKaKbaKcaKdaKeaKfaCsaJoaKhaCuaCuaCuaCuaKiajgaKjaGyaHjaHbaKgaHRaIZaIXaKjaHGaKraKsaKsaKtaKuaKvaKwaKxaKyaKzaKAaKBaTiaKDaKEaKCaKFaKGaKHaKIaKJaKKaJNaKMaKNaKOamxazeaKPaCSaKQaKRaCSaIgaIIaICaIVaBIaKWaKXaKYaKZaBIaLaaLbaLcaBIaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmavvasJaGWaxhaLnaLoaLpaLqaLraFRaLsaLtaJQaLuaCgaCgaLvaLwaCgaDLaDLaDLaPxarAaaaaaaaaaaaaaaaaLxaaaaaaaaaaTMaRgaIfaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaHkaLBaLzaLAaLBaLBaLBaLDaLEaLFaLGaHkaHkatkapfaaaaLHaLIaLIaLIaLIaLIaLJabqaCsaCsaCsauKazTaCsaCsaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLWaLZaMaaMbaHGaMcaMdaMeaMfaMfaKkaMfaMfaMfaMfaMfaMfaMfaMfaKkaMfaMhaMiaMjaMkaMkaMkaMlaMlaMlaMlaMlaMkaMmaMkaMnaMnaMnaMnaJuaMnaJyaBIaBIaBIaMpaMqaBIaMraBIaMsaBIaMtaMuaMvazlaMwaMxaMyazlaMzaMAaMBavvaMCaGWaxhaCgaCgaCgaCgaCgaFRaMEaMFaJQaMGaCgaMHaXGaWubssaWuddkaDLaPxarAaaaaaaabqabqabqabqabqaaaaaaarAaPxaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaHkaMLaMLaMLaLBaLBaLBaLBaLBaLBaMLaMLaMMaHkatkalLaaaaMNaMOaMOaMOaMOaMOaMNabqabqaKlaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZaNaaNbaNcaLRaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaKmaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaKoaNraNsaNtaMkaNuaNvaNwaNxaNyaNzaNAaNBaNCaMkaNDaUfaNFaNGaJXaMnaKaaBIaNJaNKaJwaMqaBIaNLaBIaNMaBIaNNaNOaNPaNQaNQaNQaNQaNQaNQaNQaNQaNQaoGaNRaxhaNSaNTaNUaNVaCgavgaIvaMFaNXaNYaNZaOaaObaOcaOdaOeddRaDLaPxarAaJWabqabqaOgddSaOiabqaOjaaaarAaPxaWAaKSaCgaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaHkaOkaLBaLBaLBaLBaLBaLBaLBaLBaMLaMLaMLaOlaKTapfaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaOpaOqaOraOraOsaOtaOuaOvaOwaOxapfaOyapfapfapfapfaOzaOAavxaOCaKnavxaOAaOAaOAaOAaOFaaaaaaaOGaOGaOGaOGaOGaOGaOGaaaaaaaMfaOHaOIaOJaOKaOLaNAaOMaONaOOavBaOQaORaOSaMkaOTaOUaOVaNHaKVaMnaMoaBIaBIaBIaOZaOZaBIaBIaBIaBIaBIaPaaPbaPcaNQaPdaPeaPfaPgaPhaPiaPjaNQaPkaGWaxhaNTaNTaPlaOdaPmaGYaPnaPoaPpaPqaCgaPraPsaPtaPuaPvddUaKLddVarAaaaaaaabqddWcspaPzabqaaaaaaaTMaRgaIfaHxaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHaXIaWBaXJaWBaXKaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaPAaLBaLBaLBaLBaPBaLBaLBaLBaLBaMLaPDaHkaECapfaaaaMNaMOaMOaMOaMOaMOaPEawbavKawbaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaPRaPSaPTaPTaPTaPTaPVaOAaYOaPXaPYaPZaQaaQbaQcbeBaQeaQfaQgaQgaQhaQiaQjaQkaQlaQmaQmaQnaQoaQpaKGaNtaMkaQqaNAaQraNAaQsaNAaQtaNAaNAaMkaQubeLaOVaQwaQxaMnaNIaQzaQAaQBaQCaQDaQEaQFaQGaQHaQIaQJaQKaQLaNQaQMaQNaQNaQNaQOaQPaQQaNQawvaGWaxhaQSaQSaQTaOdaPmaJJaQUaMFaOWaOmaNZaOXaRaaRbaRcaRdaOfaDLaPxarAaaaaReabqaRfddXaRhabqabqaJWarAaPxaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUVaXNbbXbbWbbYbbWbbZbgUaUVaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGwaLBaLBaLBaLBaLBaLBaLBaLBaLBaLBaRiaHkaHkatkapfabqaMNaMOaMOaMOaMOaMOaRkaRlaRmaRlaRnaPIaRoaRoaRpaRoaOuaRqaRraRsapfapfapfapfapfapfazSaOAbgkaRuaRvaRwaRxaRxaRxbgyaOFaaaaOGaRzaRAaRAaRAaRAaRAaRBaOGaaaaMfaRCaMiaMjaMkaRDaREaRFaNAaRGaNAaRHaRIaNAaRJaRKaRLaRMaRNaROaMnaQyaOYaQVaQVaQVaQWaRTaRTaRUaRUaRVaRWaRXaRYaRZaSaaSbaSbaSbaScaSdaSeaNQaSfaGWaxhaQSaSgaShaSiaCgaSjaIvaMFaJQaSlaCgaSmaSnaSoaSoaSoaSpaDLaPxarAaaaaaaabqabqabqabqabqaaaaaaarAaPxaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbcbbcabcabcabcabcabzhbzhbdJbzhbzhbcabcabcabcabcaaXKaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSqaSraSsaaaaGwaLBaLBaLBaLBaLBaLBaStaSuaSuaSvaSwaHkaqBatkapfabqaMNaMOaMOaMOaMOaSxaMNaKpaKlaKlaSyaPIaSzaSAaSBaSCaSDaSEaSFaSGaLKaSIaSJaSKaSLapfaSMaOAaSNaRuaSOaSPaSQaSQaSRaSSaOFaaaaMgaSUaRAaSVaSWaSXaRAaSYaMgaaaaMfaMhaMiaMjaMkaSZaTaaTbaTcaTdaTcbjbaTfaTgaMkbmIaxcaTjaTkaTlaMnaTmaTnaToaTpaTqaTraTsaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaTDaQXaTFaTGaTHaNQasIaGWaxhaCgaCgaCgaCgaCgaFRaTIaQYaTKaTLaCgaCgaLvaLwaCgaDLaDLaDLaPxarAaaaaaaaaaabqaaaaaaaaaaaaaaaaTMaRgaIfaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbdKbdNbdNbdNbdNbdNbdNbdObdNbdNbdNbdNbdNbdNbdPbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaTNbBmaTNacJaHkaLBaLBaLBaLBaLBaLBaLBaLBaLBaTPaTQaHkauAaQZapfaaaaMNaMOaMOaMOaMOaMOaTSaRlaTTaRlaRnaPIaRoaRoaRpaRoaOuaOvaTUaTVaTWaTXaTYaTZaUaapfaUbaUcaUdaRuaRuaUebmJaRuaUgaUhaOFaaaaMPaUjaUkaUlaUmaUlaUkaUnaNpaaaaMfaMhaUpaUqaMkaNqaNqaNqaNqaUsaNqaNqaOoaNqaMkaMnaOBaUvaSHaMnaMnaUxaTnaTpaTqaUyaUzaTnaToaTqaTqaTpaUAaUBaUCaUDaUEaSbaSbaSbaScaUGaUHaNQaUIaGWaxhaUKaULaUMaSTaUOaUPaIvaMFaJQaUQaJSaJTaRPaUTaHhaHiaDLaDLaPxarAaJWaaaaaaaJWaaaaaaaaaaaaaJWarAaPxaIfaGbaCgaLwabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKIaTNaUWaTNcKIaHkaPAaMLaLBaLBaLBaLBaLBaLBaLBaUYaUZaHkatkapdapfaaaaMNaMOaMOaMOaMOaMOaVbayjaxXayjaVeaPIaRoaVfaVgaVhaViaVjaOuaVkaVlaVmaVnaVoaVpapfaVqaOAaVraRuaRubmKaVtaVuaUgaRRaOFaaaaOGaVwaVxaUkaVyaRAaVzaVAaOGaaaaMfaVBaOIaOJaVCaVDaVEaVEaVEaNCaVEaVEaVFaVGaMkaVHaVIaVJaVKaVLaVMaVKaVNaVOaVOaVPaVQaVRaVSaVTaVUaVVaVSaVWaVXaNQaVYaVZaWaaWaaWcaWdaWeaNQasJaWfaxhaWgaWhaWiaTOaWkaWlaWmaRSaTEaSkaTRaTRaUFaWsaHhaWtaDLbeZaPxarAarAddZarAarAddZarAarAddZarAarAaPxaWAaHxaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXbeXbeXbeXaXLaXLaXMaXLaXLbeXbeXbeXbeXbeYbdMaXOabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaWDaWEaWFaWGaWDaHkaLBaMLaWHaWIaWJaLBaLBaLBaLBaUYaWKaHkatkapdalLaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaWLaPIaRoaRoaRpaRoaOuaVjaWMaWNaVlaWOaWPaWQaWRapfazSaOAaWSaWTaWTaWUaWVaRuaUgaWWaOFabqaOGaOGaOGaWXaWYaWZaOGaOGaOGabqaMfaOHaXaaMjaXbaXcaVEaVEaVEaXdaVEaVEaXeaNCaXbaQCaXfaXgaXhaToayuaToaTnaTpaToaXjaToaXkaTpaTqaToaTqaTpaXlaXmaNQaXnaXoaXpaURaXraPiaQQaNQaXsaGWaxhaXtaXuaXvaXwaXxaXyaXzaXAaWoaUSaXqaXqaXBaXFaHhaHiaDLarAdeaaMJaMJdebaMJaMJdebaMJaMJdebaMJaMJdecaWAaGbaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabdaaabgMbdMbeWbeXbeXaXLaXLaXLaXLbfabpvaXLaXLaXLbeXbeXbeYbdMbMnaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDayCaXQaXRaXSaHkaXTaMLaXUaXVaXWaMLaMLaMLaXXaXYaXZaHkaVaaYbapfabqaYcaYdaMOaMOaMOaYeaYfabqabqaKlaWLaYgaPJaPKaYhaYiaYjaYkaYlaYmaYnaYnaYnaYnaYnapfaYoaYpaYqaYraYraYsaYtaYuaYvaYwaUoaaaaaaaaaaOGaOGaYyaOGaOGaaaaaaaaaaKoaNraYzaMjaYAaYBaYCaYDaYEaNCaNCaYFaYGaNCaYAaQCaYHaYIaYJaYKaYLaYKaYMaYNbmLaYPaYKaYKaYKaYKaYKaYKaYQaYRaYSaNQaNQaNQaNQaVcaNQaNQaNQaNQaoGaGWaxhaYVaYUaYUaSTaYWaYXaYYaYZaWbaVvaWnaQUaXCaZfaFXaZgaCgaaaabqaaaabqaaaaaaaaaaaaabqaaaaaaabqabqaWAaWpaDhaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbcbbfcbfbbgNaXLaXLbdIbdIbdIbgPbgObdIbdIaXLaXLbgNbgQbgSbgRaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaWDaZiaZjaWDaWDaWDaZkaWDaWDaZlaZmaWDaWDaWDaZnaWDaWDaWqapfapfabqaZpaZqaZraZraZraZqaZsabqabqaZtaZuaPIaRoaRoaRpaRoaOuaZvaOuaZwaYnaZxaZyaZzaZAapfazSaOAaZBaZCaZDaZEaZFaZGaZHaZIaOFaZJaUraZJaZLaZMaZNaZOaZLaZJaUraZJaMfaZPaZQaZRaZSaMkaMkaMkaMkaZTaZUaZVaNCaZWaMkaQCaZXaTraZYaZZaZZaZZaZZaoGaoGaoGbaababbacbadbaebafaZZbagbagaoGbahazyazyaWrazyazyazybakazybalaxhbambambambambanbaobapbaqbarbasbatayIaXDbavaCgaCgaCgabqabqaDibawbaxaDiaDiaDiaDiaDiaDibawaDiaXEaDhaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbgTbicbeXbeXaXLbdIbidbifbiebihbigbiibidbdIaXLbeXbeXbijbgTaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbaAbaBbaCbaDbaEbaBbaFbaGbaHbaGbaIbaJbaGbaKbaLbaMaYTbaOapfaaaaaabaPbaQbaQbaQbaRaaaabqaZtbaSaWLaPIaRoaRobaTbaUaOubaVbaWbaXbaYbaZbbabbbbbcapfazSaOAaOAaOAavxavxayPaOFbbebbeaOFbbgbbhbbiaZLbbjbbkbblaZLbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwaMkaMkaYAaLLaYAaMkaMkayubbybbzayubbAbbBbbCbbDbbEbbFaoGaoGaoGaoGbbGaoGaoGaoGaoGaoGaoGaGWasIasJbbHbbHbbHbbHbbHbbHbbHbambbIbbJbbKbamazobbMbambbNbbOaFRaFRazAaZbaZaaDfbbSaDfbbTaDiaDibbUaDiaCiaCjbbVaCjaClaDibbUaDiaCvaDnaCgabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbdIbikbilbdLbnQbimbjPbjObdIaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaUNbcdbcebcebcfbcebcebcebcgbchbcibcjbckbckbckbclbcmbcnbcoapfaaaaaaabqabqaaaaaaabqabqabqaZtbcpbcqbcrbcsaRobctbcubcvbcwbcxbcybczbcAbcBbcCbcDapfazBbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbcQbcPbcRbcSbcTbcUbcVbcPbcWbcXbcXbcYbcZbdabcXbcXbdbbdcbdcbdcbddbdebdcbdcbdfbdcbdgbdhbdcbdcbdcbdibdjaoGbdkbdobdmbdnbdobdpbdobdqbdobdrazybakbalaubasJbbHbdsbdtbdubdvbdwbdxbambdybdzbdzbdAbdzbdBbambdCbarbdDbdEbdEbdEbdEbdEbdFaCgbdGaCjaCjbdHaCjaDmaCgaCgaCgbdGaCjaZdaZcaDmaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLaXLbdIbjQbilbdIbjRbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbdQaUNaWDaUNbdRaUNbcdbcebdSbdTaUNbdRaUNbdUbdVbdWbdXapfapfapfapfalLalLalLapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnaWjapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgaCgazMaCgaCgaCgaCgaCgaLwaCgabqbjUabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbjWbjVbjYbjXblFblDblIblGblJbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNabqaaaabqaaaaUNbfdaUNbfebfebffbfgaUNbfdaUNaUNaWDbfhbfibfjavTavUavUavUbflavUavUbfnavVbfobfpbfqbfqbfrbfsbftbfubfvbfwbfxbfybfwbfzbfAbfwbfBbfCbfDbfEbfFbfGbfHbfIbfJbfKbfKbfLbfMbfNbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbgabfWbfVbfVbgbbgcbgdbezbgebgfbggbghbgibezbgjbmOaoGaGWaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxbmPbgzbambgAbgBbgCbdEbgDbgEbgFbdEbgGaOdaOdaOdaOdaOdaOdaOdaOdaOdaOdbgKbgLbgKbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXaXLaXLbdIblKbilbdIblLbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbgVbgWbgXbgXbgXbgXbgXbgXbgXbgXbgYazQbfwbfwaXibhbaXibfwbfwbfwbhcbfwbhdbhebhfbhgbhhbhibhjbhkbhlbhmbhnbfGbhobfIbhpblhbhqbhrbhqbhsbhqbhtbhubhtaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxaYxbhwbhwbhxbhwbhwbhwbhwbhwbrNbhybfIbhzbezbhAbhBbhCbhDbhEbezbhFbhGaoGaGWapeaaaaZKbhIbhJbbxbhLbhMbhNbhObhPbhQbambhRbhSbhTbhTbhUbhVbambhWbhXbhWbdEbhYbhZbiabdEaChaCgaCgaCgaCgaCgaCgaCgaCgaCgaDLaFRaFRbdFaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaabdaaabgMbdMbeWbeXaXLaXLbdIbikbilbdIbdIbdIbjTbjObdIbdIaXLbeXbeYbdMbMnaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbgYbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbazbiPbiQbiRbiSbiTaAMbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDaZebjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUblMaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTbnLbnEbnMbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkiblVaUNbgVbgWbbLbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDaXibkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbccabqabqaBVaCVaBYaDKbkWaEhaCVaDKbkWaEhaBYaBYaEtabqabqbhwaFNblablbblcblbbldblebhwblfbfIblgbwlbezbkkaODbkRbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamaGtaFPbambltblubltbdEbkUblwbkVbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaWwaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWwbnRblEbnTbnSbnUbicbeXbeXaXLaXLbdIbpsbptbdLbqZbpubrbbrabdIbdIaXLbeXbeXbrcbijbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUbnFaUNbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqaIbboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlaIHabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDblidfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaWwbnRblEbnKbrgbrhbeWbrjbeXaXLaXLbdIbrlbrmbifbrIbrnbrQbrKbdIbdIaXLbeXbeXbeXbeYbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUbnFaUNbnWbnXbnYbnZboablkaUtblkbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotaAMbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWaJYbkWbsbboCboDboEboDboFboDboEboDboGbscbkWaJYbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAbljdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdblMbsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbnJbdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUbnFaUNbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMblsbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqbsPbsRbsQbsSbrdcKIaXNbsfbsTbsUaXLbsWbsVbsXbribsZbsYbtbbtabtcbrkbtebtdbtgbtfaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibruaUNbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGaXibrHblvbfwbfwbfwbfwbfwaXibrJblxbfwbfwaAMbrLbrMaAMaAMbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVaJZburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZiblCbsoblCbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbmBaoGaoGaoGbstaoGbsubsvbswbbfbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabuLbudbuMabqbuObuNbuQbuPbuSbuRbuTbBebuVbuUbuWbribuYbuXbvabuZbvcbvbbvebvdbvgbvfaXLbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbvjbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJaKqbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukboAdedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGarrbuDaoGbuEbuFbuGbqNbuHbuHbuHbuIbuJbqSbqSbuKaZobvkbvnbvmbvpbvobvrbvqbvsbvsbvvbvtbvwbvwbvwbxlbxmbvwbvwbvwbvwbvwbxlbvwbvwbvwbvwbvwbvwbxlbvwbxmbxobxnbxpbxpbxrbxqbxtbxsbxvbxubxxbxwbxzbxybxBbxAbxDbxCbzebxEbzgbzfbzjbzibzlbzkbznbzmbzpbzoaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaUNbdRaUNaUNaUNaUNaUNaUNbdRaUNaaaaWDbzqbzsbzrbfGbvAbvBbvCbvBbvDbfGbvEbvFbvGbvHbvHbvIbvJbvHbvHbvKbvLbvMbvNbvHbvHbvObvHbvHbvHbvPbvQbvRbvRbvSbvTbvUbvVbqcbyobvXbvYbqcbvZbwbbwabwcbwdboEbtQboEbypbywbwhbwibwjbwibwkbyJbyxbAbbyQbAkbwqbhwbwrbwsbwtbwubwvbhwbhwbhwbhybwwbwxbsmbwybwzbwAbsmbwBbwCbwDbwEbwFbwGbwHbwIbwJbwKbwLaKUbwNbwObwPbwQbwRbwSaoGbsubwTbwUbntbwVbwWbwXbwYbwZbxabxbbxcbxdbqUbxebxfbxgbxhbxiaWCaaaaaabxjbsNabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabxkbztbsLabqbBbbzubBdbBcbBgbBfbBibBhbBnbBjbCWbBobCYbCXbDabCZbDibDcbFdbDjbFfbFeaXLbrcbFgbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNabqaaaabqaaaaUNbxGaUNbxHbxIbfebxJaUNbxGaUNaUNaWDbgVbxKbxLbfGbxMbvBbxNbvBbxObfGbxPbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabxTbxTbxTbybbxTbycbydbxVbyebxTbxTbyfbygbyhbvVbqcbyibyjbykbylbymbynbymaLybwdbAjbAebyqbyqbyqbyrbysbytbyubyvbyqbyqbyqbBWbCcbkWbhwbyybyzbyAbyBbyCbhwbyDbyEbyFbyGbwxblCbyHbyIbCdbsmbyKbyLbyMbyNbspbspaoGaoGbyOaoGaoGaoGaLCbCeaoGaoGbyRbCIaoGbyTbwTbyUbntbjNbjNbjNbjNbyVbjNbjNbyWbyXbyYbntbntbyZbzabzbbzcaaabqYbzdaaaabqaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaaaabxkbBabFkbGNbGMcKIbsebGSbGObrcaXLbsMbsMbsMbribribICbBkbribribrkbrkbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNaUNbdQaUNaWDaUNbdRaUNbzvbaBbzwbzxaUNbdRaUNbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbaibzMbzNbaibzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbThbAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwaMDbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbAKbAMbAKaNWbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqaaaaaaabdaZhbIEbeWbeXbeXbIFaXLbBlbDbbKjbDdbDebDfbDgbDhbBlaXLbIFbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXdaebBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCCbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaaaaaaaaaabdaXHbsfbKkbvhbeXbeXaXLbBlbFhbFibFjbKnbFlbFmbFnbBlaXLbeXbeXbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLapdbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcaPCbqcbqcbqcaPGaPFbsObqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbaubvzbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbzLbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbKpbKobKqbfbbgNaXLbBlbGPbGQbGRbMpbGTbGUbGVbBlaXLbgNbgQbMtbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbvzbDSbCHbEvbGlbGmbGnbGobGpbGqbEGbCIaoGbGrbGsbGtbDTbGvbGwbGxbGybGzbCMbGAbGBbGCbGDbzLbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbNYbdMbeWbeXaXLbBlbIybIzbIAbPJbIBbRobIDbBlaXLbeXbeYbdMbRpbsdbPHaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabGWbGXbGXbGYbGXbGXbGXbGZbGXbGXbHaabqaUNbHbdfOdfPapfbWdbHJbHdbFpbHebHfbHgbHhbHibHjbFpbHkbHkbHlbHmbHnbHobBKbFubHpbzKbHqbHrbBQbBRbHsbHtbFwbHubHvbHwbHxbaibzPbfIbkJbFBbEwbDUbExbExbExbExbExbHzbFIaQRaPUbkWbkWbkWbETbGkbGjbHybGubkWbkWbkWaRjaUibhwbhwbEhbhwbhwbhwbhxbhwbHKbhtbHLbHMbhzbHAbHObHObHObHPbHObHQbHObHRbEvbEvbEvbEvbEvbCHbHEbHUbHVbHWbHXbHYbEGbCIaoGbHZbGsbIabIbbIcbIdbIebIfbIgbHFbIibIjbIkbIlbzLbImbInbIobIpbIqbIrbIsbHGbIubIvbIwbIxbIxbGLabqaaabFcaaabFbaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdaXHbdMbeWbeXaXLbKlbKlbKlbHNbRqbHNbKlbKlbKlaXLbeXbeYbdMaXOabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGWbIGbIHbIIbIJbIJbIKbIJbIJbIJbIKbGYbHHaUNaUNdfQbIMapfbgYaEjaUubFpbIQbHfbHgbIRbISbITbFpbIUbIVbIWbIXbBKbBKbBKbFuatjbzKbIYbIZbBQbBRbBQbBQbBQbBQbBQbJabBQbzMbJbbJcbJdbJebJfbJgbJfbJhbJfbJgbJfbJibCibJkbJjbJmbJlbJpbJnbJnbJqbKYbJrbJsbJtbJubJvbJwbJxbJobJybJzbJobJAbJBbJobJCbJDbJEbJFbwxbJGbCybJHbCybJIbCybJJbCybJKbEvbEvbCHbEvbEvbJMbHIbHUbJObECbHXbJPbEGbCIaoGbJQbJRbyUbDTbJSbIdbJTbIdbJUbJVbJWbJXbJYbJZbzLbKabKbbKcbKdbKebKfbKgbzLabqbzLbKhbIxbKibGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbMobRrbMqbHNbRsbHNbMsbSXbMuaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKrbKsbKsbKsbKsbKsbKsbKsbKsbKsbKsbKtbKubKvbKudfQbKwapfbgYbKyanEbFpbKzbHfbHgbKAbHfbKBbFpbBKbKCbBKbHmbKDbKEbBKbFuapdbzKbKFbHrbKGbKHbKIbKIbKIbKIbKIbKJbKIbKKbygbKLbKMbKNbKObKPbKObKQbSrbKSbKTbKUbKVbKWbKXbKOcnjbKZbLabLbbaybLdcpcbLebLfbLgbLhbLibLjbLkbLlbLmbLnbLobLpbLibLqbLrbLsbLtbLubLvbLwbLxbLybLybLzbLAbLwbLBbaNbbRbbQbCHbLFbCHbIhbLHbLIbLJbhabLLbLMbLNaoGbLObLPbLQbLRaUwbLTbLUbLVbLWbzLbLXbLYbLZbMabMbbMcbIobMdbMebMfbMgbMhbItbMjbMkbMlbIxbMmbGLabqaaabFcaaabFbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbNZbOabObbHNbRqbHNbObbOabOcaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMvbMwbMxbMybMzbMzbMAbMzbMzbMzbMAbGYaUNaUNaUNdfQbMBapfbjEapfapfbFpbMDbMEbMFbHfbHfbHfbFpbMGbMHbBKbMIbBKbBKbBKbMJbMKbMLbFwbFwbJabMMbMNbFwbFwbFwbFwbFwbMPbaibzPbMQbMRbMSbMSbMTbMUbMVbMSbMSbMWbMWbMXbMYbMWbMZbtkbNbbvlbMZbNdbNdbvybNfbCDbNdbNhbNibNjbNkbNhbNhbHBbNmbNlbNhbNobhtbNpbNqbNrbLGbNtbNubNtbNvbNwbCybCybHRbHSbEvbDRbILbHTbILbbRbJLbINbKmbJNbNEbEGbNFaoGbNGbNHbNIbNJbNKbNLbNMbNNbNObNPbNQbNRbGIbGFbzLbMibNcbNabNcbNabNgbNebzLabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcabfabeabqabeabfabfabeabeaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXaXLbPIbOabOabOabSZbSYbOabOabPKaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabMvbGXbGXbGYbGXbGXbGXbGZbGXbGXbOdabqaUNbOedfQbOfapfbgYatjaqBbFpbOhbHgbOibOjbKBbHfbFpbOkbOlbBKbIUbOmbOnbBKbFuapdbzKbOobOobJabBRbOpbOpbOqbOrbOsbOtbzKbzKbJbbOubOvbMSbOwbOxbOybOzbOAbOBbOCbODbOEbOFbMWbOGbOHbOIbOJbOKbNdbOLbOMbONbOObOPbNhbOQbORbOSbOTbNhbNhbNhbNhbNhbOUbhtbNpbOVbOWbspbOXbOYbHObOZbPabHObPbbspbSsbTZbEvbEvbEvbEvbEvbPdbPebPfbPgbPhbEGbNFaxhbPjbPkbPlbPmbPnbPobPpbPqbPrbPsbPtbPubPvbPwbPwbPxbPybPzbIpbPAbPBbPCbHGbIubIvbPDbPEbPEbGLabqabqbPFabqbPGabqbFcaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLbRnbTabTcbOabTebTdbUzbUybRtaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNaWDaUNbdQaUNaWDaUNaUNaUNaWDaUNaWDaWDaWDdfRbPMbPNbLcbPPbPQbFpbPRbPSbOibPTbPUbPVbFpbBKbBKbBKbBKbBKbBKbBKbFuapdbzKbPWbFwbJabBRbFwbFwbPYbFwbPZbQabzKbQbbzPbfIbQcbMSbQdbQebQfbQgbQhbOBbQibQjbQkbQlbNsbQnbQobQobQobQpbQqbQrbQsbQtbQsbQubNSbQwbQxbQybQzbNTbQBbQCbQDbNhbQEbhtbQFbQGbQHbQIbQIbQIbNnbQJbQLbQMbQKbQIbQObQIbQPbQQbQRbQSbQTbEGbEGbQUbEGbEGbEGbNFbQVbQWbQXbQVbCMbCMbCMbCMbCMbQYbNObVpbRabRbbGGbRcbRdbRebRfbInbRgbRhbRibzLabqbzLbRjbRkbRlbGLabqaaabFcaaabFbaaabRmarBarBarBarBabearBarBarBaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbUAbfbbgNaXLbKlbVjbVkbOabTbbTdbVXbVlbKlaXLbgNbgQbVYaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbRubzzbaCbRvbaCbaBbaBbRwbaBbzzbaBbRxbzzbaBdfSbRyapfbgYaoXatkbFpbRAbRBbHfbHfbHfbRCbFpbRDbREbRFbRGbRHbRIapfbFuauCbzKbRJbRKbJabRLbRMbRMbRNbFwbFwbRObzKbRPbzPbfIbOvbMSbRQbRRbRSbRTbRUbOBbRVbRWbRXbRYbMWbRZbSabSbbSabScbNdbSdbSebSfbSebSgbNhbShbSibSjbSkbNUbSmbSnbSobNhbSpbhtbSqbbrbOWbQIbVrbVsbStbSubSvbSwbSwbSxbSybQIbQIbQIbQIbQIbQIbQIbEGbSzbSAbSBbEGbSCbQVbSDbSEbSFbQVbSGbSHasJbSIbCMbSJbSKbSLbSMbSNbSObSPbSQbSRbSSbRgbSTbSUbItbMjbMkbSVbPEbSWbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbUxbOabOabWabVZbXCbWbbKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNbcdbcebcebcebcedfUdfTdfWdfVdfYdfXdgadfZbLCdgbbTmapfbgYauyatkbFpbHhbTnbHfbHfbTnbTobFpbTparJarLbPPbPQbRHapfbFubTrbzKbTsbTtbTubTvbFwbTwbTxbTybTzbTAbzKbTBbzPbfIbTCbMSbTDbTEbTFbTGbOBbOBbTHbTIbTJbTKbMWbRZbSabSabSabTLbNdbSdbSebTMbTNbTObNhbTPbSibTQbTRbNhbTSbTTbTUbNhbTVbhtbTWbbrbTXaUJbUabUabUbbUcbUdbStbStbUebUfbQIbUgbUhbUibUhbUjbQIbUkbUlbUmbUnbEGbNFbQVbUobUpbUqbQVasJasJasJbUrbCMbSJbUsbUtbCNbCNbCNbUubGGbUvbGGbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbIFbKlbXDbXFbXEbYQbXGcckbZObKlbIFbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbUBbUBaUNaUNbNWaWDbQNdgRbQNdfNaWDapfbLDapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGapdapdatjbUHbXJapfbFuaoXbzKbzKbaibUIbUJbaibzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbQmcclcdBccmbNhbVmbhtbVnbbrbOWaUXbVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbHGbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbdMbeWbeXbeXaXLaXLbKlbKlcepbKlbKlaXLaXLbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbWcbfdaUNdghdgjdgibBtdgkbBtdgldgmapfbLEauJbLKaoXbMCbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkdeJdeHapdbWlbWmapfbFubWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWaUXbYubXdbXdbXebXfbXgbXhbNxbXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRaaVdbXvbVQbXwbInbSPbXxbRgbXybRibzLabqbzLbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbIFbIFceqbIFbIFbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUNbUBbUBaUNdgndgjbBtbBtdgobBtbsxdgqapfbXHavUavUavUbDLapdatkaoXaqBayBapdbXIauyauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbWtbXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdaVsbYibYjbNhbYkbYlbYmbYnbNUbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbNzbNybNBbNAbNDbNCbUCbPObQIbEGbEGbEGbEGbEGbNFaoGbYGbUrasJasJchGchFaXPasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbItbMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXbeXbeXbeXbeXbeXbdObeXbeXbeXbeXbeXbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabredgrdgtdgsdgvdgudgxdgwdgyapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVdfibYWbYVbYVbYTbYVbYVbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbWfbWnbWhbXibZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibzLabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbKkbvhbvhbvhbvhbvhbvhbdObvhbvhbvhbvhbvhbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgfdgzdgzdgzdgzdgzdgAaaaabqaaabZPbZPbZQbZRbZSapfbZTapfapfapfaYabZUbZUbZUbZUbZUbZUbZUapdbZVbZWbZXbzKbZYbZZcaacabbHrbWscaccadcaeayBapfcafbzPcagcahcaicajcakcakcakcalcamcancaocakcapcaqcaicaicarcascarcarcatcarcaucavcavcawcaxcaycazcaAcaBcakcakcakcaCcaDcavcaEbbrcaFcaGbajcaIcaJcaKcaLcaMcaNcaKcaOcaQcaPcaRbQIcaScaTcaUbYxbYycaXcdobZGcaZaoGaoGaoGaoGaoGcmHbXtbCMbCMbCMcbcbJWbNRcbdbbdbbPbKacbgcbhcbibVScbjbPCbHGbIubIvcbkcblcblbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHcerbMrbMrbMrbMrbMrcLLcLLcQccLLcLLbMrbMrbMrbMrbMrbNXaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgJdgzdgzdgzdgzdgDdgraaaabqaaabZSbcEcbncbobZSapdcbpbPQcbqapfcbrbZUcbscbtcbucbvcbwbZUapdaoXbZWaoXbzKbzKbzKbzKbzKbzKbzKbzKbzKaxqaoXapfcbxbzPcbycbzbekbekbekbekbekbekbenbekcbAcbBcbCbembekbekbekbvTcbDcbEcbFbekbekbekbekbekcbGcbHbekbekbenbekbekbekbekcbIbekcbAcbJcbKcbLcbMcbNcbOcbNcbPcbPcbQcbRcbScbPcbOcbTbQIbQIbQIbQIcbUcbVasIarrbdlcbXasIcbXazpbefaoGayoaoGbCMccaccbcccccdcceccfccfccfbMcbGGbGGbGGbRgccgbRibzLabqbzLcchcciccjbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabPHbsdbsdbsdbPHbNYbbXcUIcUMcUIbbZaXOabqaaaaaaaaaabqaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgzdgzdgzdgzdgzdgzdgraaaabqabqbZSccnccoccpbZSapdccqaEjapfapfccsbZUchyccuccvccwccxbZUapdapdccybYVbYTbYVbYVbYVcczccAccAccAccAccBbcGccCccDccEccFccGccHccIccJccGccGccGccKccGbdabcXccLbcYbcXbcXbcXccMccNbcZbcYbcXbcXbcXbdbccOccPccQccQccQccRccQccQccQccSccTccOccUccVccWccXccYccZcdacdbcdccddcdecdfcdgcdhcdecdibZvcdjcdkbZvcbUcbVasIasIasIasIasIcdmcdocdocdpcdqcdrcdscdtcducdvcdwcdxbGGbGGbGGbGGbGGbInbGGbRgcdybSUbItbMjbMkcdzcblcdAbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHcerbzhcWjbzhbNXaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgrdgrdgBdgFdgFdgFdgrdgraaaabqaaabZScdCcdDcdEbZScdFapdcdGapfcdHceNbZUcdJcdKcdLbeVcdNbZUbZUbZUbZUbZUbZUcdObZUbZUcdPcdQcdRaoXauycdSauCcdTcdTcdTcdTcdTcdTcdTcdUcdUcdUcdUcdUcdVcdWcdWcdXcdYcdWcdZcdWceacebbbrceccedceecefceecegcehceeceeceibZubbgbbibbicejbZucekbZuaYxcemaYxbZvcenceocfDcdhcitcescdfcixcdhcetceubZvcevcewbZvcexceycezcdocdocdocdoceAceBceCceDceCceCbPmceFceGceHbGGceIbPwbPwbPwbPwbPwceJbGGbRgbUwceKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaabsdbsdbsdbsdbsdaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgGdgHdgHdgHdgHdgHdgHdgGaaaabeaaabZSbTYceMbTYbZSapfapfapfapfbZUceNbZUceOcePbfkceRceSbZUceTceUceVbZUceWceXceYbZUceZbZUbZUbZUbZUbZUbZUcdTcfabfmbgHbglcfecffcdUcfgcfhcficdUbgIcfkbgIcflcfmbgIcfkbgIcfncfocfpcfqcfrcOmcftcOmcfucfvcOmcftcOmcfwcfxcfxcfxcfxcfxcfybZucfzcfAcfBbajcfCcbOcdfcdhcdhcdecfDcdhcdhcdecfEbZvcfFcfGbZvcbUbgJcfIceCceCceCceCceCcfJcfKcfLcfKcfKbCMcfMcfNcfOcfPcfQbInbGGbGGceIbPwcfRbSSbRgcfSbRibCMabqabqabqabqabqabqabqabqbPFabqbPGabqbRmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaabTYcfTbTYaaaabqaaaaaaaaabZUceNbZUbZUbZUbZUcfUbZUbZUcfVcfWcfVbZUbZUbZUbZUbZUcfXcfYbZUcfZcgacgbcgccgdcgecgfcggcgfcghcgicgjcgkcglcgmbVocgocgpcgqcgrcgscgtcgucgvcfkcgwcgxcgycftcgzcgAcgBcgCcgDcgEcgFcgGcgHcfxcgIcgJcgKcfxcjUbZucgMcgNcgOcgPcgQcgRcgScgTbYAbYzbYCbYBbYBbYzbZAbYDbZCbZBcaVbZDcbVasIchbchccfKcfKcfKcfKcfKchdchechfbCMchgchhbGGbGGbSPchibIqbIqchjchkchjbIqchlchmbRibCMbCMbCMaUVaUUaUVaUUaUVaaabFcaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqbTYceMbTYabqabqabqabqabqbZUchncjechpbZUchqchrchybZUchtbgZchvchwchxchychzbZUchAchBchCchDcaWcmJccrchHchIchJchKchLchMchNchOcdUchPchQcaHchSchTchUchVchWchXchYchZciacgwcgxcgycibciccidciecifcigcihcihciiciicelcikcilcimcfxcinbZuciocipciqbajcircisciuciucivciuciwciucKCcJFciybZvcizciAciBciCcfJaoGaoGaoGcfKciDciEciFciGciHciIciJbCMciKciLciMciNciOciPciQciRciSciTciUciVciWciXbRiciYciZciYcjacjacjacjacjbabqabeaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaacjcaaaaaaabqaaaabqaaabZUbZUbZUceNbZUcjdcjecjfcjgcjhcjicjjchychychycjkbZUcjlcjmbZUcdNcjncjocjpcdTcjqcjrcjscjtcjucjvcjwcjxcjxcjycjxcjzcjAcjBcjBcjCcjDcjEcjFcjGcjHcjIcjJcibciccicciccjKcjLcjMcjNcjOcjPceLcjRcjScjTcfxcjUbZubZubZubZubZvbZvcjVbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvcbUcjXaoGcjYcjZcfKckackbckcaRQbhvckfbhHbCMckhckhckickhckjckhckickkckjckjbRickhcklckmcknbCMbCMbCMckockpcjackqckoaaabFcaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckybibchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRcfjckTbgIcgwckVcgycOmckWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljcljcljcllclmcljcljcljclocljcljcljcljcljclqclrboccdocltcluclvclwbVKcfKclxclyclzclybiBbiUbiObCMbCMbCMcgnbzLchRbzLcgnbzLchRchRcijbzLcijbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRcgUclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcjQcmjcjQcmkcmlckVcmmcmncmocmocmocmocmpcmqcmrbkSbkTcfxcmucmvcmwcfxcmxbkXcmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCaoGasJasJasJasJaoGasJasJcfKcmEcmFbkYclybiBbiUbkZblrabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchncjecjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngckUcnicdTcjxcrjclEcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmobmRcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCaoGclsasIcnPcnQaoGcnRcnScfKaTJbtLbrWbvxbulbiUbobclAabqbGLcnYbzLcnYbGLcnYbzLcnYbGLcnZbzLcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcmCaoGaoGaoGaoGaoGaoGaoGaoGcfKcfKcfKclFclAclBbwMclDclAabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcjQcnsckVcrWcmocqdcqecqfcqgcqhcqibyScqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqFcqEcqHcqGbZUcsoclAcqrbArcqIclAabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacmicqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrobALcrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcscbANbIObIOcmBbIPcmBcsgcshcsicsjbZUcskchychychycdKcslbZUbKxctucnXbyPcNmctuabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacmicsvcrccqZcswcpycsxbZUbZUcsycoebMObLSbMObNVbMOcoebMOcsCbMOcoeckEbOgcsEcgVckEckEcsGcsHcsIcsJcsJbPcbPXbPicsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcbQvcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchychychyctrbZUbKxctubQAbKRbQZbSlabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacmictwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMbTqctOcgrctPcsJctQctRcABctTbVicsJccvcmgctVctWctXctYcjQctZcuacubcuccudcuecufcugcuhcuicujbWeculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcmibKxctuctucgWctuctuabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacmicmicqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRbXucuTcuUcuVcuWcuXcuYcuZcgrcgsbPccvacvbcvccvdcvecsJchycmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcgYcgXchacgZclSckScszcoQbZUcvTcvUcvVcbvchychychycvWcvXbZUbXOcynctubYhctucspaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqabqaaaaaaarBaaacjcaaaaaaaaaaaaabqaaacmicvZcqZcwacqZcqZcsxbZUbZUcwbcwccwdcuLcwecuNcwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscjAbYFcwucwvcwwcwxcwwcwycwzcmgcwAcwBcwCcwDcjQcvkcvlckVcvmcwEcmpcwFcwGcwHcwIcwJbWecwKcwLcwMcwNcwOcwPcwQcwRcihcihcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecmBcmCbZUcxfcxgcxhcsicxicuHchychycxjcmictscttdbjctvdbjarAabqabebFbbFbbFbbFbbFbbFbabebFbbFcbFbbPGabqbFcabqabqabebRmbRmbRmabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaaaaaarBaaackraaaaaaabqabqabqaaacmicxkcpycracpycxlchscxmbZUcodcoecxncxocxpcxqcxrcoecxscxtcxucoecxvcxwcxxcxycxzbTqcxAcgrcxBcsJcxCcxDcxEcxFcxGcsJcxHcmgcmgcxIcmgcmgcmgcmgcxJcxKcxLcmocmocmocmocmocxMcxNcmocmzcmzcxOcxPcxQbYXbYIbYYcxUcxUcxUcxUcxVcxWcxXcxVcmBcmBcmBcxYcxZcyacybcmBcmCbZUcvTcycbZUcydcyecyfcygcygcyhbZUabqabqabqabqabqabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaabFcaaaaaaabqaaaaaaabqaaaabqabqaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBabqabearBaaaabearBarBabqabqabqckrabqabqabqaaaabqabqcmicpycxlcpycyictqcyjcykcylcymcoecAMcuLcyocypcCScoecyrcxtcyscoecoecoecytcytcytcytcyucyvcywcyxcyycyzcyAcyBcukcsJcyDcyEcyEcyGcyHcyIchBcyJcyKcyLcyMcyNcyOcyEcyPcyQcyRcyScyTcyUcyVcyWcyXcyYcaYczaczbczcczdczeczfcxVczgczhcziczjczkcmBcmBcmBcmBcmBcmBcmCbZUbZUbZUbZUbZUbZUbZUcmibZUbZUbZUaaaabqaaaaaaaaaabqabqabqabebFcbFcbFcabebFcbFcbFcabebFcbRmbFcbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczmaaaaaaaaaabqaaaaaaaaaabqaaaaaaabqaaaclIaaaaaaabqaaaabqaaacmicmicmibZUbZUcznczobZUbZUcodcoecMbcuLcwdcuNcMXcoecwdcxtcwdcuScvLcoeczscztczuczvcwrczwczxcsJczycvMczAczBczBczBczBczBczBczBczCczDczCczEczFczGczHczIcMYczKczLbZUczMczMczNczMczMczOczPczQcaYczRczSczTczUczVczWcxVczXczYczZcAacAbcrUcfYclPbZUcAccmYcAdbZUcAecfYbZUaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqabqabqcAfcAfcAfcmRcAfaaaarBaaaabqaaaaaaaaaaaabZUbZUbZUbZUbZUcAgcodcwccwdcuLcwecuNcwdcAhcwdcAicwdcvNczrcoecAjcAkcAlcbecAncAocApcsJcsJcsJcsJczBcAqcArcOUcMscAuczBcAvcAwcAxcAycAzcgxcAAbZUcMZcACcADcAEczMcAFcAGcAHczMcAIcAJcAKcbfcPkcANcAOcAPcAQcARcxVcAScATcAUcAVcAWcrUcAXcAYcAZcBackDcBbcAZcBccvWcmiabqabqabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqabqabqabqabqabqabqabqbZUcFRcFScFRbZUcBjcBkcoecBlcBmcxpcBncBocoecxscwdcwdcwdcBpcoecBqcBrcBrcBrcBscBtcBucBvcBwcBxcByczBcBzcBAcBBcBCcBDczBcBEcBFcBGcBHcAzcgxcBIcBJcBKcBJcBJcBJczMcBLcBMcAGcxScBOcBPcBQcBRcBScBTcBUcBUcBVcAQcxVcBWcATcBXcBYcBZcrUcbmcCbbZUcmCchycCdbZUchycCebZUaaaabqaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaDaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaackraaacCfcCfcCfcCfcCfaaaarBaaaaaaaaaaaaabqabqbZUbZUbZUbZUbZUchycBkcoecCgcChcCicCjcCkcoecClcwdcCmcCncvOcoecCpcCqcCrcbWcCtcCucCvcBvcCwcCxcCyczBcCzcCAcCBcCCcCDczBcCEcCFczCczCcCGcgxcmmcBJcCHcCIcCJcFoczMcCLcAGcCMczMcCNcCOcCPcxUcCQcCRcPCcCTcCUcCVcxVcCWcCXcCYcCZcBYcrUbZUbZUbZUctmbZUcDabZUbZUbZUbZUabqabqaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqaaaabqabqabqaaacDbaaaabqaaaabqaaaabqaaaarBaaaaaaaaaabqabqaaaabqaefbZUcDcbZUchycBkcoecoecoecoecoecoecoecoecDdcoecoecoecoecDecDfcDgcDhcDicDjcDkcyZcDmcDncDocAmcDqcDrcDscDtcDucbYcDwcDxcDyczCcmlcDzcDAcDBcDCcDDcDDcDEczMcDFcDFcDGczMcgCcCOcDHcxUcxUcxUcxUcxUcxUcxUcxVcxVcxVcDIcxVcxVcrUcAccmYcmYcDKbZUchycDLcDMcDNcDMckscksaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqckrabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeaaaaaacvQcvPclJcDQcDRcDQcDScljcljcljcljcljcljcljcljcljcDTcDUcDUcDUcDUcDUcDUcDUcDVcDWcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcEicEjcEkcElcEmcEncgxcEocEpcEqcErcErcEsczMcEtcEucEuczMcEvcEwcExcEycEzcEAcEBcECcEDcEEcEFcEGcEHcEIcEJcEKcfZcELchychybZUbZUcEMbZUbZUbZUbZUabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqaupabqabqabqarBabqabqabqabqbZUcENbZUcdNckDchychycEObZUbZUbZUbZUbZUcEPcEQcDUcERcEScETcEUcEVcDUcEWcEXcEYcBvcEZcFacFbczBcFccFdcFdcFdcFeczBcFfcFgcFhcFicFjcFkcFlcBJcFmcCIcFncWcczMcFpcFqcFrcxScFscFtcFucbZcFwcFxcFycFzcFAcFBcFCcFDcFBcFEcFFcEKbZUcFGbZUcFHcFHcFIcFJcFKcFLcFMabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIabqcCfcCfcCfcCfcCfaaaarBaaaaaaaaaabqaaaaaaaaaaaabZUbZUbZUcfZbZUcjncctcFQbZUcPGcNacNbbZUcFTcFUcFVcFWcFXcFYcFZcGacGbcGccGdcGecBvcGfcGgcGhczBcGicGjcGkcGlcGmczBcGncGocGoczCcGpcGqcGrcGscGtcGucGvcGwczMcGxcGycGzcGAcGBcGCcGDcdlcGFcGGcGHcGIcGIcGJcGKcGLcGMcGNcdncGPcGQcGRcGScGTcGUcGVcGVcGVcGWcBNabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcGYcFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaabqaaaabqaaaabqaaacmRaaaabqaaaabqabqabqabqaupaaaaaaaaaabqaaaaaaaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUcNOcNPcNQbZUckDcGZcDUcHacHbcHccHdcHecdIcHgcHhcHicBvcBvcDlcBvczBczBczBczBczBczBczBcHkczCczCcHlcHmczGczHcHncHocHocHpcHqczMcHrcHscHtcDpcHvcHwcHxcdMcHzcHAcHBcHCceEcHEcHFcHGcHHcHIcHJceQcHLcHMcHNcHOcHPcHQcHRcHScHTcBNabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcHVcHWcHXcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqcHYabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaabeabqcHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaabZUcOJcOKcfbbZUcIbcEQcDUcIccIdcHbcIecIfcDUcIgcIhcIicDUcIjcIkcIlcImcIncIocIncIpcIncIqcIocIrcImcIscnscgxcItcBJcIucFOcIwcIucIxcIxcIxcIxcIxcIycxPcIzcEycIAcIAcIBcICcIDcIEcIFcIGcIHcIIcIJcEKcIKcILcIMcEycINcBNcBNcFHcBNcFHarAabqaaaaaaabqaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqcALcALcIOcIPcIPcIPcIQcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaabqabqarBaaacHZcIRcIScIRcITcIRcHZcHZcFvcHZcFvcHZcHZcfccPEcPFcjicQKcDUcDUcDUcDUcDUcDUcDUcfdcIVcIWcIXcIYcIZcJacImcJbcJccIncIocIncJdcJecJfcImcJgcnscgxcvmcwEcJhcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcXxcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupabqabqaaaarBabqcHZcJHcJIcJJcJKcJHcGXcJMcJNcJOcJPcJQcHZbZUbZUbZUbZUcJRcJScJScJScJScJUcJVcJWcJXcJYcJZcKacKbcKccKdcKecKfcKgcKfcKfcKhcKicKjcvRcKlcKmcKncFkcKocKpcKqcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwdgScKxcfHcfscgLdgTcYScKBbRzcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcHfcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcALcALcKJcIPcIPcIPcKKcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaaabqabqabqaaaaaacKLabqaaaaaaabqabqaaaaaaarBaaaaaaaaaabeaaacHZcKMcHjcKOcHucKMcKMcKQcKRcKScKTcKUcHZaaaaaaaaacrUcrUcrUcrUcrUbZUcKVcDUcDUcKWcKXcRocDUcKZcLacLbcImcLccIocIncIocInchocLecLfcLgcLhcLicLjcLkcIxcIxcLlcLmcLncLocLpcLqcLrcJpcLscLtcLucBNcKxcfHchuchuchEcLxcLycLzcJucLAcEKcdNcLBceNchycLCbZUabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcLDcLEcLFcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcvScjWcLMcLNcLOcLPcLQcLRcIacIacIacLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcMtcMucMvcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcMycFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqabqaaaarBaaacFvcMzcMAcMBcMCcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMPcMBcMQcMRcMScMTcMUcMScMVcMWcWGcSCcWIcWHcYocRUcImcImcImcImcImcImcNccImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhckzcNjcNkcNldgVdgUdgUdgUdgUdgUcNocNncNpcNqcNrcEKchychyceNchybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaaabqabqabqaaacHZcNucNvcNwcNxcNyclkcNAcNBcNCcNDcNEcHZcFvcFvcFvcHZcNFcNGcNHcHZcNIcNJcDUcNKcNLcNMcNNcYCdeidehdejcRUcNRcmVcmVcmWcmVcNTcNUcmYcmZcNVcNWcNXcBIcIxcNYcNZcOacOacOacObcOccOdcOecOfcOgcOhcOicOjcOkcOlcJLcOncOocOpclncOrcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqaaaaaaaaaabqabqcHZclpcOzcKMcOAclpcOBcODcOCcOEcOFcOGcHZcOHaaaaaacrUcrUcrUcrUcrUbZUcOIcDUcDUcDUcDUcDUcRUdeldekdemcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTdeIcOVcOWcLpcOXclCcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdenclGcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBarBarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacHZcPpcPqcKMcPqcPrcPscKMcKMcPtcKMcKMcHZabqabqabqbZUcjncfZcPucmscPwcPxcmYcPycPzcPAcPBcRUdepdeodeqcRUcOMbZUcPHcPIcPJbZUcPKcPLcPMbZUcPNcPOcPPcIxcPQcPRcPScPTcPUcPVcLpcPWcIxcPXcPYciccPccPZcQacQbcKNcQdcQecOpchycPjbZUcQgcQhcQibZUcQjcQkcQlbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaacHZcQmcQncKMcQocQpcPscQqcQrcQscQtcQucHZaaaabqaaabZUcQvcQxcQxcQycQzcQAcQAcQAcQAcQCcPjcRUcRUdercRUcRUcOMbZUcQDcQEcQFcQGcQHcQIcQJdescQLcQMcQNcIxcIxcIxcIxcIxcQOcIxcQPcrUcrUcfwcQQcfwcOpcOpcOpcOpcOpcOpcOpcOpchycQRcQScQTcQUbeVcQWcQWcQXcQYcQWaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacHZcQZcRacKMcRacQZcRbcRccRdcRecRfcRgcFvaaaaaacRhbZUcRibZUbZUbZUcRjbZUbZUbZUbZUcRkcRlcRmcRndetcRmcRmcRqcRrcRscRtcRucRvcRwcRxcRycRycRzcRAcRBcRCcRDcmYcmYcmYcRFcmYcRGcmZcRHcRIcRJcRIcRKcjNcjNcvYcwtcOtcmYcmYcmYcRNbZUcnOcROcRPcQWcRQcRRcRScQWabqabqabqabqabqabqabqabqabqabqabqabqaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHZcHZcFvcHZcFvcHZdeucRVcRWcRXcRYcRZcHZabqabqcRhcSacSbcRhcSccSdcSecSfcSgcShbZUbZUbZUbZUcSibZUbZUbZUbZUbZUcSjcRtcSkcRtcSlcSmcSncRtcSocSpcSqbZUbZUbZUbZUbZUbZUcCdcSrcfZbZUcSscStcSucfwcicciccCObZUbZUbZUbZUbZUbZUbZUbZUbZUcuEcQWcSwcSxcSycQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaabqabqabqcSzcSAdewcKPcSDcSEcSFcSGcSHcHZaaaaaacRhcSIcSJcRhcSKcSLcSMcSNcRhcRhcSOcSPcSQcSRcSScSRcSTcSUcSOdexcSXcRtcSkcRtcSYcSZcTacRtcTbcTccTdcTecTfcTgcThcTibZUcTjbZUbZUbZUcTkcTlcTmcfwcfwcfwcxRbZUcTocTpcTqbZUcTrcTscTtbZUctocQWcTucTvcmtcQWaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaabqaaaaaacTxabqdeycHZcHZcHZcHZcHZcHZcHZaaaaaacRhcTycTzcRhcTAcTBcTCcTDcRhcTEcTFcTGcTHcTIcTJcTKcTLcTLcTMcTNcTOcTPcTQcRtcSYcTRcTacRtcSocSpcSYcLScTTcRtcTUcTVbZUcTWbZUabqaaacNzcTYcNzaaaaaacOmcxTbZUchychychycmycjicUbcjicUccUdcQWcOycUfcOycQWaaaabqaaaabqabqaaaaaaabqaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqabqaaaaaaaaaabqabqabqaaaaaaaaaabqaaaaaaaaacRhcUgcUhcUicUjcUkcUlcUmcRhcUncRhcUocUpcUqcUrcUscTHcTHcUtcUucUvcUwcUxcUycSYcUzcTacRtcSocUAcUBcUCcUDcUEcUFcUGbZUcTjbZUabqabqcNzcUHcNzabqaaacOmcyqbZUchychychycUJcUKchycULbZUcmicQWcOycWJcWmcWKcWKcWKcWKcWKcWKcWKcWKcWLarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaacRhcTycUNcRhcUOcUPcUQcURcUScUTcRhcUUcUVcUWcUXcUYcUZcVacSOcSWcTacRtcVccVdcVecVfcVgcUwcVhcVicVjcVkcVkcSVcTScVkbZUaefabqaaaaaacNzcVncNzaaaaaacOmcxTbZUcVocVpcVqbZUcVrcVscVqbZUaaaabqcOycOycOyabqaaaabqaaaaaaabqabqaaacWRarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcTXabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacOmcxTbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaaaaaaaaabqabqabqabqabqabqaaaaaacWRarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacOmcyFczlczlczlczzcOmcWScXBcXCcXBcXCcXBcXoaaaaaaabqabqaaaaaaaaaabqaaaaaacWRaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSOcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcTXaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncOmcYccYccYccYccxTcOmcXZcXDcYbcXHcYdcYecXZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZjaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncWMcVRcWNcWOcUXcWPcWQcZlcZkcZmcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcYccxTcOmcYacYxcYbcYdcYbcYzcXCaaaabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcmDcXscXtcVGcXucXvcVGcVGcmGcnhcmIcXzcVGcYccxTcOmcXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcnkcXScXTcXUcnvcXVcXWcXXcnTcNzcYccxTcOmcYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaaaaaaacTXcXpcTXcZUcZTabqabqaaacNzcnUcYpcYqcYrcYrcYscYtcYucYucYucYucYvcnVcNzcYccxTcOmcOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOdagcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaicZocYFcZodajcYFcYFcYFdaicZpcYFdcbdalcYEcYJaaacVGcYKcnWcYMcpbcpdcYPcYQcYRdgXdgWcYUcYVcpecVGcYccCOcZvdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLcCOcZvdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqcZFdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcpfcZJcZKcZLcZMcZNcpgcZPcZPcZPcVGcYccAscicdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZSdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcqccZYcZZdaadabdaccqjcZPcZPcZPcVGcOmcfwcOmcOmcfwaaaaaaaaaaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZVdaZcZedcedddcZBcZBdcFcZBcZBcYFdclcYFdcmcYFcZBcYFdcmcYFdclcYFcZBcZBcZBcYFaaacVGaOEcZPcZPcqJdapdaqdardasdatcqXcZHcZHdavcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdbaddmddacZBcZBdcocZBcZBdaCdcpdaCdaCdaCcZBdaCdaCdaCdcpdaCcZBcZBdcqdaiaaacVGcZrcZrcZrcZrdaFdaGdaHdaIdaFcZrcZrcZrcZrcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBabqcZAcZAcZAcZAcZAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaVdaZcZedcrcZBddccZBcZedcJcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcYFaaacVGcZGcZHcZHcVKcZJdaRdaHdaSdaTcYncZPcZPaOEcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaabqaaacYBaaaabqaaaabqabqabqabqaupaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddbOcZedcMdcKdcNcZBcZedcncZBdbQdbQdcQdbQdbQcZBdbQdbQdbYdbQdbQcZBcZBdcRdcoaaacVGcZPcZPcZPdbbdbccZZdbddabdbedbfcZPcZPcZPcVGaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqdbgabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdcGdcScYEdaXddedaWcYEdcUcYFdalcYHdaXcYFdaYcYFdcVdaXcYFdcmdcWdcWdaldbaabqcVGaOEcZPcZPcZIdbmdaqdbndbodatcZOcZHcZHdavcVGaaaaaaabqaaaaaaabqaaaaaaaaaaaaaaaaaaarBabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaVdaZcZeddbcZEddgddfcZeddiddfddjddjcZeddnddlcZBddodaJddpddwddqcZDcZDddDdaJcVGcVGcZrcZrcZrcZrdaFdbrdaHdbsdaFcZrcZrcZrcZrcVGcVGaaaabqabqabqabqaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaadbtaaacZAcZAcZAcZAcZAaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZeddbcZEdalddEddFddiddfddfddGcZedbwcZBcZBdbicYFddHcZEcZEcZEcZEcZDcYFcVGcZGcZHcZHdaocZJdbzdbAdaHdaScZMdbBdaudbDcZPcZPcVGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaabqabqabqaaaaaacVJabqaaaaaaabqabqaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddaZcZeddIcZEcZEddTdbhddYddfddfdevcZedeKcZBcZBcZBdaYdeTcZEcZEcZEcZEcZDcYFcVGcZPcZPcZPdbHdbIdabdabdbJdabdabdbKdbLdbMcZPcZPcVGaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacVJaaaaaaaaaarBarBarBauparBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfpdbadfMcZEcZEddTcZedgedgYdgQdgZcZedbxdhadhcdhbdhedhddhfdamcZWdhgcZqdcocVGcZPcZPcZPdaQdbRdbSdbTdbUdbVdbWdbXdaUdbZcZHdavcVGaaaabqaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBabqdcaabqarBaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZFdaZcZedcrcZBddccZBcZedcJcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcYFaaacVGcZGcZHcZHcrscZJdaRdaHdaSdaTcsdcZPcZPaOEcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaabqaaacYBaaaabqaaaabqabqabqabqaupaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZVdbOcZedcMdcKdcNcZBcZedcncZBdbQdbQdcQdbQdbQcZBdbQdbQdbYdbQdbQcZBcZBdcRdcoaaacVGcZPcZPcZPcsedbccZZdbddabdbecsfcZPcZPcZPcVGaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqdbgabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdcGdcScYEdaXddedaWcYEdcUcYFdalcYHdaXcYFdaYcYFdcVdaXcYFdcmdcWdcWdaldbaabqcVGaOEcZPcZPcsmdbmdaqdbndbodatcsAcZHcZHdavcVGaaaaaaabqaaaaaaabqaaaaaaaaaaaaaaaaaaarBabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZFdaZcZeddbcZEddgddfcZeddiddfddjddjcZeddnddlcZBddodaJddpddwddqcZDcZDddDdaJcVGcVGcZrcZrcZrcZrdaFdbrdaHdbsdaFcZrcZrcZrcZrcVGcVGaaaabqabqabqabqaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaadbtaaacZAcZAcZAcZAcZAaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZSdbOcZeddbcZEdalddEddFddiddfddfddGcZedbwcZBcZBdbicYFddHcZEcZEcZEcZEcZDcYFcVGcZGcZHcZHcsBcZJdbzdbAdaHdaScZMdbBcsDdbDcZPcZPcVGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaabqabqabqaaaaaacVJabqaaaaaaabqabqaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZVdaZcZeddIcZEcZEddTdbhddYddfddfdevcZedeKcZBcZBcZBdaYdeTcZEcZEcZEcZEcZDcYFcVGcZPcZPcZPcsFdbIdabdabdbJdabdabdbKcsKdbMcZPcZPcVGaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacVJaaaaaaaaaarBarBarBauparBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfpdbadfMcZEcZEddTcZedgedgYdgQdgZcZedbxdhadhcdhbdhedhddhfdamcZWdhgcZqdcocVGcZPcZPcZPcsLdbRdbSdbTdbUdbVdbWdbXcsMdbZcZHdavcVGaaaabqaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBabqdcaabqarBaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhhcYFddgddgcYFddxcYEcYFcYFdalddxdaXcYFcYFdalddxcYEdaXcYFcYFdalcYEddycVGcVGcVGcVGcVGdcfdcgdchdcicYRdcjdckcVGcVGcVGcVGcVGaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaabqaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaacVGdcsdctdcudcvdcwdcxdcydczdcAdcBdcCdcDdcEcVGaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBarBarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaacVGcVGdcHcVGdcIdbpdbldcLdbydbCdcIcVGdcDcVGcVGabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaacVGcVGdcHcVGdcIctdcsRctNctkctUdcIcVGdcDcVGcVGabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqcVGdcHcVGcVGdcXdcYcZPdcZdcXcVGcVGdcDcVGaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacVGdcHcVGcZPcZPdcYcZPcZPcZPddhcVGdcDcVGabqaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGdcHcVGddrcZPddscZPddtcZPdducVGdcDcVGabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 59ab53037cc..ad91afe88cd 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -19,13 +19,13 @@
"as" = (/turf/unsimulated/wall{tag = "icon-iron10"; icon_state = "iron10"},/area/space)
"at" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"au" = (/obj/structure/flora/bush,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
-"av" = (/obj/structure/flora/tree/pine{pixel_x = 2},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
-"aw" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
+"av" = (/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
+"aw" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dir = 1; dwidth = 5; height = 14; id = "emergency_syndicate"; name = "404 Not Found"; turf_type = /turf/unsimulated/floor/snow; width = 25},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"ax" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"ay" = (/obj/structure/flora/tree/pine{pixel_x = 0},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
+"ay" = (/obj/machinery/door/airlock/external{id_tag = "syndicate_away"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"az" = (/turf/unsimulated/floor/snow,/area/space)
-"aA" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"aB" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"aA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/syndicate_mothership)
+"aB" = (/turf/unsimulated/wall/fakeglass{dir = 0; icon_state = "fakewindows"; tag = "icon-fakewindows (EAST)"},/area/syndicate_mothership)
"aC" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"aD" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHEAST)"; icon_state = "gravsnow_corner"; dir = 6},/area/syndicate_mothership)
"aE" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
@@ -48,7 +48,7 @@
"aV" = (/turf/unsimulated/wall,/area/vox_station)
"aW" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
"aX" = (/obj/machinery/computer/shuttle/syndicate/recall,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
-"aY" = (/obj/item/device/radio/intercom/syndicate{pixel_x = 0; pixel_y = 25},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"aY" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership)
"aZ" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor{tag = "icon-asteroid"; icon_state = "asteroid"; dir = 2},/area/holodeck/source_desert)
"ba" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid8 (EAST)"; icon_state = "asteroid8"; dir = 4},/area/holodeck/source_desert)
"bb" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea)
@@ -84,10 +84,10 @@
"bF" = (/obj/structure/stool,/turf/simulated/floor/holofloor{tag = "icon-carpet11-12 (EAST)"; icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_theatre)
"bG" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_emptycourt)
"bH" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_emptycourt)
-"bI" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
+"bI" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"bJ" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre)
-"bK" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
-"bL" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"bK" = (/obj/machinery/light{dir = 1; on = 1},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"bL" = (/obj/machinery/light{dir = 4},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"bM" = (/mob/living/simple_animal/pet/cat/Syndi,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"bN" = (/obj/machinery/door/airlock/external{id_tag = "syndicate_away"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"bO" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_away"; name = "syndicate recon outpost"; turf_type = /turf/unsimulated/floor/snow; width = 18},/turf/space,/area/space)
@@ -98,7 +98,7 @@
"bT" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/vox_station)
"bU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"bV" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid1 (EAST)"; icon_state = "asteroid1"; dir = 4},/area/holodeck/source_desert)
-"bW" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"bW" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
"bX" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid3 (EAST)"; icon_state = "asteroid3"; dir = 4},/area/holodeck/source_desert)
"bY" = (/turf/simulated/floor/holofloor{tag = "icon-carpet1-0 (EAST)"; icon_state = "carpet1-0"; dir = 4},/area/holodeck/source_theatre)
"bZ" = (/obj/structure/stool,/turf/simulated/floor/holofloor{tag = "icon-carpet5-1 (EAST)"; icon_state = "carpet5-1"; dir = 4},/area/holodeck/source_theatre)
@@ -116,9 +116,9 @@
"cl" = (/turf/unsimulated/wall{tag = "icon-iron11"; icon_state = "iron11"},/area/space)
"cm" = (/obj/structure/sign/double/map/right{pixel_y = -32},/obj/structure/rack/skeletal_bar/right,/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"cn" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
-"co" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
-"cp" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"cq" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"co" = (/obj/machinery/door/airlock/centcom{name = "Shuttle Dock #2"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"cp" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
+"cq" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"cr" = (/turf/simulated/floor/holofloor{tag = "icon-1 (NORTHEAST)"; icon_state = "1"; dir = 5},/area/holodeck/source_space)
"cs" = (/turf/simulated/floor/holofloor{tag = "icon-17 (NORTHEAST)"; icon_state = "17"; dir = 5},/area/holodeck/source_space)
"ct" = (/turf/simulated/floor/holofloor{tag = "icon-22 (NORTHEAST)"; icon_state = "22"; dir = 5},/area/holodeck/source_space)
@@ -332,7 +332,7 @@
"gt" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"gu" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/suppy)
"gv" = (/obj/structure/closet/crate,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/suppy)
-"gw" = (/obj/item/weapon/mop,/obj/structure/mirror{pixel_x = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"gw" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
"gx" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"gy" = (/obj/structure/toilet{dir = 8},/obj/structure/window/reinforced/tinted{dir = 1},/obj/machinery/door/window{dir = 8; name = "Tactical Toilet"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"gz" = (/turf/unsimulated/wall/fakeglass,/area/centcom/suppy)
@@ -372,13 +372,13 @@
"hh" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"hi" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"hj" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/assault_pod)
-"hk" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"hk" = (/obj/item/weapon/storage/fancy/crayons,/obj/machinery/light{dir = 1; on = 1},/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"hl" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/turf/simulated/floor/plating,/area/shuttle/assault_pod)
"hm" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
-"hn" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"hn" = (/obj/item/device/radio/intercom/syndicate{pixel_x = 0; pixel_y = 25},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ho" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"hp" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
-"hq" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
+"hq" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/effect/landmark{name = "ERT Director"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"hr" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/control)
"hs" = (/obj/machinery/door/window/northleft{dir = 2; name = "Centcom Security"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"ht" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-darkred (SOUTHWEST)"; icon_state = "darkred"; dir = 10},/area/centcom/evac)
@@ -396,7 +396,7 @@
"hF" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
"hG" = (/obj/machinery/computer/shuttle/syndicate/drop_pod,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/assault_pod)
"hH" = (/obj/structure/stool/bed/chair,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
-"hI" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
+"hI" = (/obj/item/weapon/mop,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"hJ" = (/obj/machinery/vending/clothing,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"hK" = (/turf/unsimulated/floor/grass,/area/centcom/control)
"hL" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control)
@@ -407,7 +407,7 @@
"hQ" = (/obj/structure/rack,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
"hR" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
"hS" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/evac)
-"hT" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"hT" = (/obj/structure/flora/tree/pine{pixel_x = 1},/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"hU" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"hV" = (/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"hW" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/obj/docking_port/mobile/assault_pod,/turf/simulated/floor/plating,/area/shuttle/assault_pod)
@@ -437,7 +437,7 @@
"iu" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"iv" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/evac)
"iw" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"ix" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"ix" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard/syndicate,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"iy" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"iz" = (/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"iA" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark{name = "Response Team"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
@@ -515,16 +515,29 @@
"jU" = (/obj/machinery/door/poddoor/preopen{id_tag = "CentComPort"; name = "security door"},/turf/unsimulated/floor{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/area/centcom/control)
"jV" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac)
"jW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac)
+"jX" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"jY" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"jZ" = (/obj/structure/stool,/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/east,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"ka" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"kb" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"kc" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"kd" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "Mission Launch Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "151"},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ke" = (/turf/unsimulated/floor{tag = "icon-darkgreencorners"; icon_state = "darkgreencorners"},/area/centcom/ferry)
"kf" = (/turf/unsimulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/centcom/evac)
"kg" = (/turf/unsimulated/floor{tag = "icon-yellowsiding"; icon_state = "yellowsiding"},/area/centcom/evac)
"kh" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (WEST)"; icon_state = "yellowcornersiding"; dir = 8},/area/centcom/evac)
+"ki" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
"kj" = (/turf/unsimulated/wall/fakeglass,/area/centcom/ferry)
+"kk" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
"kl" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control)
"km" = (/turf/unsimulated/floor{tag = "icon-redcorner (WEST)"; icon_state = "redcorner"; dir = 8},/area/centcom/evac)
"kn" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac)
"ko" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac)
"kp" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (NORTHEAST)"; icon_state = "red"; dir = 5},/area/centcom/evac)
+"kq" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
+"kr" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"ks" = (/obj/structure/stool,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
+"kt" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"ku" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry)
"kv" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/ferry)
"kw" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/ferry)
@@ -532,9 +545,25 @@
"ky" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/evac)
"kz" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
"kA" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/evac)
+"kB" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"kC" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/space/transit,/area/wizard_station)
+"kD" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"},/turf/space/transit,/area/wizard_station)
+"kE" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship)
"kF" = (/obj/structure/dresser,/obj/structure/mirror{pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"kG" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 5},/obj/item/weapon/pen/blue,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
"kH" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"kI" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship)
+"kJ" = (/turf/unsimulated/wall/abductor{icon_state = "alien23"},/area/abductor_ship)
+"kK" = (/turf/unsimulated/wall/abductor{icon_state = "alien22"},/area/abductor_ship)
+"kL" = (/turf/unsimulated/wall/abductor{icon_state = "alien24"},/area/abductor_ship)
+"kM" = (/turf/unsimulated/wall/abductor{icon_state = "alien16"},/area/abductor_ship)
+"kN" = (/obj/machinery/abductor/experiment{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"kO" = (/turf/unsimulated/wall/abductor{icon_state = "alien17"},/area/abductor_ship)
+"kP" = (/obj/machinery/abductor/pad{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"kQ" = (/obj/machinery/abductor/console{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"kR" = (/turf/unsimulated/wall/abductor{icon_state = "alien19"},/area/abductor_ship)
+"kS" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship)
+"kT" = (/obj/machinery/abductor/experiment{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"kU" = (/turf/unsimulated/floor{tag = "icon-darkblue (EAST)"; icon_state = "darkblue"; dir = 4},/area/centcom/ferry)
"kV" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve)
"kW" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/tdome/tdomeobserve)
@@ -542,10 +571,22 @@
"kY" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve)
"kZ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeobserve)
"la" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/tdome/tdomeobserve)
+"lb" = (/obj/machinery/abductor/pad{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lc" = (/obj/machinery/abductor/console{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"ld" = (/turf/unsimulated/wall/abductor{icon_state = "alien14"},/area/abductor_ship)
+"le" = (/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lf" = (/obj/machinery/computer/camera_advanced/abductor{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lg" = (/turf/unsimulated/wall/abductor{icon_state = "alien15"},/area/abductor_ship)
+"lh" = (/obj/structure/closet/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"li" = (/obj/machinery/computer/camera_advanced/abductor{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lj" = (/turf/unsimulated/wall/abductor{icon_state = "alien12"},/area/abductor_ship)
+"lk" = (/obj/effect/landmark/abductor/scientist,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"ll" = (/obj/structure/table/abductor,/obj/item/weapon/retractor/alien,/obj/item/weapon/hemostat/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship)
"lm" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership)
"ln" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership)
"lo" = (/obj/structure/reagent_dispensers/water_cooler,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"lp" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
+"lq" = (/obj/effect/landmark/abductor/agent,/turf/unsimulated/floor/abductor,/area/abductor_ship)
"lr" = (/obj/structure/extinguisher_cabinet{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-darkbrown (EAST)"; icon_state = "darkbrown"; dir = 4},/area/centcom/ferry)
"ls" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"lt" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
@@ -559,31 +600,61 @@
"lB" = (/obj/structure/rack,/obj/item/toy/katana,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
"lC" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
"lD" = (/turf/unsimulated/wall/fakeglass,/area/centcom/evac)
+"lE" = (/obj/machinery/optable/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lF" = (/turf/unsimulated/wall/abductor{icon_state = "alien13"},/area/abductor_ship)
+"lG" = (/obj/structure/table/abductor,/obj/item/weapon/storage/box/alienhandcuffs,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lH" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lI" = (/obj/effect/landmark/abductor/agent{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lJ" = (/turf/unsimulated/wall/abductor{icon_state = "alien10"},/area/abductor_ship)
+"lK" = (/obj/structure/table/abductor,/obj/item/weapon/paper/abductor,/obj/item/weapon/scalpel/alien,/obj/item/weapon/cautery/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lL" = (/turf/unsimulated/wall/abductor{icon_state = "alien11"},/area/abductor_ship)
+"lM" = (/turf/unsimulated/wall/abductor{icon_state = "alien6"},/area/abductor_ship)
+"lN" = (/obj/machinery/abductor/gland_dispenser,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lO" = (/turf/unsimulated/wall/abductor{icon_state = "alien7"},/area/abductor_ship)
"lP" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"lQ" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"lR" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/light{dir = 1; on = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"lR" = (/obj/structure/stool/bed/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship)
"lS" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"lT" = (/obj/structure/table/abductor,/obj/item/weapon/surgicaldrill/alien,/obj/item/weapon/circular_saw/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lU" = (/turf/unsimulated/wall/abductor{icon_state = "alien9"},/area/abductor_ship)
+"lV" = (/turf/unsimulated/wall/abductor{icon_state = "alien8"},/area/abductor_ship)
"lW" = (/turf/unsimulated/floor{tag = "icon-darkred (EAST)"; icon_state = "darkred"; dir = 4},/area/centcom/ferry)
"lX" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"lY" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"lZ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
-"mf" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "small"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/wizard_station)
+"ma" = (/turf/unsimulated/wall/abductor{icon_state = "alien2"},/area/abductor_ship)
+"mb" = (/turf/unsimulated/wall/abductor,/area/abductor_ship)
+"mc" = (/turf/unsimulated/wall/abductor{icon_state = "alien4"},/area/abductor_ship)
+"md" = (/turf/unsimulated/wall/abductor{icon_state = "alien3"},/area/abductor_ship)
+"me" = (/turf/unsimulated/wall/abductor{icon_state = "alien5"},/area/abductor_ship)
+"mf" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "small"},/obj/structure/grille/broken{color = "#008000"},/turf/simulated/floor/plating/airless,/area/wizard_station)
"mg" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 8; icon_state = "fakewindows2"},/area/wizard_station)
"mh" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 4; icon_state = "fakewindows"},/area/wizard_station)
"mi" = (/turf/unsimulated/wall{tag = "icon-uranium2"; icon_state = "uranium2"},/area/wizard_station)
+"mj" = (/obj/machinery/abductor/experiment{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"mk" = (/obj/machinery/abductor/pad{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"ml" = (/obj/machinery/abductor/console{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"mm" = (/obj/machinery/abductor/experiment{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"mn" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"mo" = (/obj/machinery/vending/syndisnack,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"mp" = (/obj/machinery/vending/syndicigs,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"mq" = (/obj/machinery/abductor/pad{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"mr" = (/obj/machinery/abductor/console{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"ms" = (/obj/machinery/computer/camera_advanced/abductor{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"mt" = (/obj/machinery/computer/camera_advanced/abductor{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"mu" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"mv" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"mw" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/tdome/tdomeobserve)
+"mx" = (/obj/effect/landmark/abductor/scientist{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"my" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"mz" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"mA" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"mH" = (/obj/structure/lattice,/turf/space/transit,/area/wizard_station)
"mI" = (/obj/item/weapon/shard{color = "#008000"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station)
"mK" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mL" = (/turf/unsimulated/wall{tag = "icon-uranium5"; icon_state = "uranium5"},/area/wizard_station)
"mM" = (/turf/unsimulated/wall{tag = "icon-uranium10"; icon_state = "uranium10"},/area/wizard_station)
"mR" = (/obj/structure/noticeboard{pixel_x = -32},/obj/item/weapon/paper/syndimemo,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
-"mS" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"mT" = (/mob/living/simple_animal/pet/fox/Syndifox,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"mU" = (/obj/effect/decal/warning_stripes/southeastcorner,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"mV" = (/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
@@ -598,7 +669,6 @@
"np" = (/turf/unsimulated/wall{tag = "icon-uranium3"; icon_state = "uranium3"},/area/wizard_station)
"nu" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"nv" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
-"nx" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/east,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ny" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership)
"nB" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = -5},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey{pixel_x = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"nC" = (/turf/unsimulated/floor{tag = "icon-darkblue"; icon_state = "darkblue"; dir = 2},/area/centcom/ferry)
@@ -631,7 +701,6 @@
"oz" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
"oA" = (/obj/structure/mirror{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"oD" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership)
-"oF" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "Mission Launch Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "151"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"oK" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/wizard_station)
"oL" = (/turf/unsimulated/wall/fakedoor{name = "Squad 4 Pod"},/area/wizard_station)
"oM" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/wizard_station)
@@ -646,7 +715,6 @@
"pb" = (/obj/effect/decal/warning_stripes/north,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pc" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pd" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"ph" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space/transit,/area/wizard_station)
"pi" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating/airless,/area/wizard_station)
"pj" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
"pk" = (/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
@@ -690,10 +758,9 @@
"qz" = (/obj/structure/table/woodentable,/obj/item/weapon/retractor,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qA" = (/obj/structure/table/woodentable,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qB" = (/obj/structure/table/woodentable,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"qC" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"qC" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qD" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qO" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/syndicate_mothership)
-"qP" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
"qQ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"qR" = (/obj/machinery/door/poddoor{id_tag = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"qS" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -705,7 +772,7 @@
"qY" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows"},/area/wizard_station)
"qZ" = (/obj/structure/cult/tome,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ra" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/head/wizard/red,/obj/item/weapon/twohanded/staff,/obj/item/clothing/shoes/sandal,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"rb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack,/obj/item/clothing/suit/space/rig/wizard,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
+"rb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
"rc" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/wizard_station)
"rd" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/wizard_station)
"rj" = (/obj/structure/closet/syndicate/personal,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/syndicate_mothership)
@@ -714,20 +781,19 @@
"rm" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"rn" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station)
"ro" = (/obj/structure/bookcase,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"rp" = (/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station)
+"rp" = (/obj/structure/grille/broken{color = "#008000"},/turf/simulated/floor/plating,/area/wizard_station)
"rr" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/twohanded/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"rs" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"rt" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/airless,/area/wizard_station)
"ru" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
"rv" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station)
"rw" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/wizard_station)
-"rx" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space/transit,/area/wizard_station)
"rC" = (/obj/machinery/camera{pixel_x = 11; pixel_y = -9; network = list("thunder"); c_tag = "Red Team"},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
"rD" = (/turf/simulated/floor/bluegrid,/area/tdome/arena)
"rE" = (/obj/machinery/flasher{id = "tdomeflash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena)
"rF" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"rG" = (/turf/unsimulated/wall/fakeglass{color = "#008000"},/area/wizard_station)
-"rH" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "medium"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station)
+"rH" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "medium"},/obj/structure/grille/broken{color = "#008000"},/turf/simulated/floor/plating,/area/wizard_station)
"rI" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station)
"rJ" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"rK" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/wizard_station)
@@ -967,56 +1033,56 @@ abababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfVabababababababgzgigjgjgjgjgAgvgvgvfVabgkgkgkgkgkgkgkgkgkabababababababababjqjrjrjrjrjrjrjrjsabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfVabababababababfVgFgGgHgjgIfVgvgvgvfVabgkgogkgogkgogkgogkabababababababababjCjEjDjFjFjFjFjGjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfVabababababababfVfVfVfVfVgMfVfVfVfVfVabgkgkgkgkgkgkgkgkgkabgNgNgNgNgNgNababjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfVfVfVfVfVfVfVgOgPgPgPgQgRgQgPgPgPgOabgkgogkgogkgogkgogkabgNgSgTgTgUgNgOgOjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgVgVgVgVgVgOgPgWgPgXgYgXgPgWgPgOabgkgkgkgkgkgkgkgkgkabgZhahahahajHgYjJjIjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgVhbhchdhegVgPgPgPhfgYhfgPgPgPgOabababababababababababgNhahghhhagNgOgOjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgVhphqhchcgVhrgOhrgOgYgOhrgOhrgOabababgNgNgNgNgNgNgNgNgNhshthuhvgNababjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgVhchchchJgVhKgQhLgYgYgYhMhrhKgOabababgNhNhOhOhOhPhQhRhShahahahagNababjCjEjEjEjKjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgVgVgVgVgVgVgVgVgVgVgVgVgVgVgVgVhXgVgVhKgXhYgYgYgYhZgOhrgOgOgOgOgNiaibibibibibibichahahahagNababjLjrjrjrjrjrjrjrjMabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgViiiiiiiiiiiiiiiiiiiiiiiiiiijikilimgVhKgXhYgYgYgYgYgYinioipipiqgNiaibibibibibibirisitiuivgNfYfYababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgViiiDabababababababababiDiiiEikizimgVhKgXhYgYgYgYhMgOhrgOgOipiGgNiaibibibibibiHiIiJibibiKgNfYfYababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababgViDabababababababababababiZjadlizimgVhKhfhYgYgYgYjbhrhKgOjcjdjegNjfibibibibjgjhjiiJibibiKgNfYfYababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamamamamamamatamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVabababababababababababeojtjuikizjvgVjwgVjxgYgYgYhZgOhrgOhrjyhrgNjzibibibibjAjAjAjBibibiKgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamatamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgViDabababababababababababiZjPikiziljQjRjRgYgYgYgYgYgYinjSipjTipjUjVibibibibibibibibibibiKjWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamamamamauamamamamamamamamamamamamavamamatamawamamiSababababababababababababababababababababababababababgViiiDabababababababababiDiiiEikizkegVjwgVhLgYgYgYhMgOhrgOgOgOgOgNkfibibibibkgkgkgkhibibiKgNgNgNgNgNgNgNgNgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamamamamamamamamamamamamamamawamawamamamamawamamamiSababababababababababababababababababababababababababgViiiiiiiiiiiiiiiiiiiiiiiiiikjikilimgVhKgQhYgYgYgYklgQhKgOabababgNkmibibibibknkokpiJibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamamamamamamamamamamamamatamamauamamatawamauamamamiSababababababababababababababababababababababababababgVgVgVgVgVgVgVkukvkvkwgVgVgVgVgVkxgVgVhKgXhYgYgYgYklgXhKgOabababgNkyibibibibibkzkAiJibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamaxaxaxaxaxaxaxamamamamayamamatamayamamamatamamamiSabababababababababababababababababababababababababababababgVilkFilililililililkGkHilililgVhKhfhYgYgYgYklhfhKgOabababgNkyibibibibibibibibibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamazabababababababazatamamamamamaAaxaxaBaxaBamamawamiSabababababababababababababababababababababababababababababgVililililiAiliAililililililkUgVkVkVkWkXkYkZlakVkVkVabababgNkyibibibibibibibiLfZiLiMiLisisisiLfZiLfZiLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamabababababababababaCamamamataDiSiSlmlniSiSaEaxaxaxiSabababababababababababababababababababababababababababababgVloilillplplplpiBililililillrgVlsltlulvlwlxlultltkVabababgNlylzlzlzlAlBlClAicibiciKicabababicibicibicababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamabababababababababaCamamamaWiSiSlPlQlQlRiSiSiSiSiSiSiSiSabababababababababababababababababababababababababababgVlSiliClpjNjOlpilililililillWgVltlXlYlvlwlxlYlZltkVabababgNgNgNgNgNgNgNgNgNlDiNlDiNlDababablDfZlDfZlDababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamfmgmhmiaaaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamabababababababababaCamamauaWiSaXmnmnmnmnaYmompiSgtiwgwiSabababababababababababababababababababababababababababgVmuilillplplplpiBilililililmvgVmwltmwlvlwlxmwltmwkVabababababababababababababababababababababiOabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHaamIgamKmLmMaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamazabababababababazamamamambIiSmRmnmSmSmTmnmUmVpcpdpdgxiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababgVmYililiFiliFilililililililnagVnbltltlvlwlxltltnckVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHnlnmnnmKnonpaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamamabababababbKaxaxamambLaDiSnumSnvixmSmnnxnyiSpdgyiSiSgBgDgCgEgEgJgEgEgKgLiSababababababababababababababababgVnBilililililililnCnDnEnFnanGgVnHnInIlvlwlxnJnJnKkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaanpnXnYnonZoanpaaaaaaaaaaaaaaaaaaaaababababababiSamamamamamamamabababababodoeoeoeoeoelniSmnmSofogmSmnnxnyiSiSiSiSiSgDgChihkhjhlhjhnhmgKiSababababababababababababababababgVgVgVgVgVohgVgVgVgVgVgVgVgVgVgVkVkVkVkVlwkVkVkVkVkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamLmMolomolonooaaaaaaaaaaaaaaaaaaaaababababababiSamamazabababababababababopoqoroqoqoqoqotmnbMmnmnmnmnnxnyiSiSiSiSiSgDhohkhjhwhyhxhjhnhziSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHoooyozoAmLaaaaaaaaaaaaaaaaaaaaaaababababababiSamamababababababababababoDbNlmoeoeoelniSoFmSmSmSmnmnnxnylmoeoeoeoeoeoehjhwhyhAhyhxhjhziSabababababababababababababababababababababababababababababababababababkVkYkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaoKoLoMoNoOoPmKoQmHaaaaaaaaaaaaaaaaaaaaababababababiSamamabababababababababababbOabazamambPiSoXoYoZoYiymnpapbhChBhBhDhBhBhChlhyhEhGhFhyhlhziSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaphpipjpkploOmKnYpmpnmHmHaaaaaaaaaaaaaaaaababababababiSbUamababababababababababababababbWamaWiScfpvpwpxpymnmnmnlmoeoeoeoeoeoehjhwhyhHhyhyhjhziSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaamHaaoMpDpDpEoOmKpFnYpnaapGpHaaaaaaaaaaaaaaababababababiSamamababababababababababababababaCamaWiSiSnypPcgcmiSpSmniSiSiSiSiSgDhohIhjhwhyhxhjhThziSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaoQmHaaaamHpTpUnnpVnnoQmHmHaaaaaaaaaaaaaaaaababababababiSamamababababababababababababababaEamamamiSiSiSiSiSiSqcqcqdqeqfqgiSgDhVhUhIhjhWhjhTidieiSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaonqiqjqkqlqmqlqlqiqnqkqlqlqmqlqlaamHaaaaaaaaaaababababababiSamazabababababababababababababababazamamamcncncobPiSqrqsqsqsqsqsiSifgDhVigigihigigieifiSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaqwqxmKmKqxqwqyqzmKmKmKqAqBqwqCozoQqDmHmHaaaaaaababababababiSamabababababababababababababababababaCamamatamamaWqOqsqsqsqsqsqPiSiSiSiSiSiSiSiSiSiSiSiSabababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaqYqZmKmKqZqYqDqDmKmKmKmKraqYrbrcpDpDrdaaaaaaaaababababababiSamabababababababababababababababababaCamamaucpaBaDiSrjrjrjrjrjrkiSababababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaarnromKnYmKrppFnYmKgbmKmKrrrnrsrtrurvrwrxaaaaaaababababababiSamabababababababababababababababababaCamamaWiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaarGqZmKnnpFrHnnmKmKrImKmKmKrGrJrKrdrLoKaaaaaaaaababababababiSamabababababababababababababababababcqamamamiSababababababababababababababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaamirWmKmKrWmirXmKnYnnmKmKrXmirYrZsasbaaaaaaaaaaababababababiSamabababababababababababababababababaCamamamiSababababababababababababababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaamLqisfqkqlsgqlqiolsholqkqlsgqlqimHmHmHaaaaaaaaababababababiSamabababababamabababababamabababababaCamamamiSababababababababababababababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaapTnYaamHaamHsooPpTaaaamHaaaaaaaamHaaaaaaaaababababababiSamabababababamazabababazamabababababaCamamamiSababababababababababababababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaamHmHaastnYaasusvpTmHaapFaaaaaaaaaaaaaaaaaaababababababiSamazabababazamamamamamamamazabababazamamamamiSabababababababababababababababababababababababababababababababababababababababababababababababababsJsJsJsJsJsJsJsJiPsJsJsJsJsJsJsJsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHaasBnYsCaaaaaamHaaaaaaaaaaaaaaaaababababababiSamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHqmqisIqkqmmHaamHmHaaaaaaaaaaaaaaababababababiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSabababababababababababababababababababababababababababababababababababababababababababababababababiTiQiQiQiUiQiQiQiQiQiQiQiUiQiQiQiTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaqwsMsNsOqwstrcplsPsQmHaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaolsVsWsXolnYsYpksZmKnpaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababsJsxsysysysysysysysysysysysysyszsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaoPmHmitatbtcminntdpksZaamHaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqtqtqtqtqtqtqtqtquqvqvqvqvqvqvqvqvqvqvqvqvqvquqtqtqtqtqtqtqtqtqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqmteqiolqkteqmtftgsZaamHaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqwmKtitjtimKqwaatkaaaamHaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaamHnYtxmKmKmKmKmKtxaaaaaaaanYaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSrCqSqSqTqUqvqvqvqvqvrDrErDqvqvqvqvqvqVqTqWqWrFqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaamHmHoPmKmitBmKmKmKtBmiaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvrDrVrDqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaamHqlqltHtItItItItItJaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamLqitMtMtMqkooaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatPtPtPaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqtqtssssssssssqtquqvqvqvqvqvqvqvqvqvqvqvqvqvquqtssssssssssqtqtqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtswswswswswkVkZqhqhqhqhqhqhqhqhqhqhqhqhqhkXkVsAsAsAsAsAqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababababababfVfVfVfVfVfVfVgOgPgPgPgQgRgQgPgPgPgOabgkgogkgogkgogkgogkabgNgSgTgTgUgNgOgOjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSamamamamamamamamamamamamamamamamamatamamamamamamamamamamamamamamiSababababababababababababababababababababababababababababababababababababgVgVgVgVgVgOgPgWgPgXgYgXgPgWgPgOabgkgkgkgkgkgkgkgkgkabgZhahahahajHgYjJjIjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSamamamamamamatamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababababababababababababgVhbhchdhegVgPgPgPhfgYhfgPgPgPgOabababababababababababgNhahghhhagNgOgOjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSamamamatavamamamavamamamamatamavamamamamamamamatamamavamamamatamiSababababababababababababababababababababababababababababababababababababgVhphqhchcgVhrgOhrgOgYgOhrgOhrgOabababgNgNgNgNgNgNgNgNgNhshthuhvgNababjCjEjEjEjEjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSamavamatamamavamamamavamamamamamatamamavamamamamamamamatavamamamiSababababababababababababababababababababababababababababababababababababgVhchchchJgVhKgQhLgYgYgYhMhrhKgOabababgNhNhOhOhOhPhQhRhShahahahagNababjCjEjEjEjKjEjEjEjCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgVgVgVgVgVgVgVgVgVgVgVgVgVgVgVgVhXgVgVhKgXhYgYgYgYhZgOhrgOgOgOgOgNiaibibibibibibichahahahagNababjLjrjrjrjrjrjrjrjMabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgViiiiiiiiiiiiiiiiiiiiiiiiiiijikilimgVhKgXhYgYgYgYgYgYinioipipiqgNiaibibibibibibirisitiuivgNfYfYababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgViiiDabababababababababiDiiiEikizimgVhKgXhYgYgYgYhMgOhrgOgOipiGgNiaibibibibibiHiIiJibibiKgNfYfYababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgViDabababababababababababiZjadlizimgVhKhfhYgYgYgYjbhrhKgOjcjdjegNjfibibibibjgjhjiiJibibiKgNfYfYababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgVabababababababababababeojtjuikizjvgVjwgVjxgYgYgYhZgOhrgOhrjyhrgNjzibibibibjAjAjAjBibibiKgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgViDabababababababababababiZjPikiziljQjRjRgYgYgYgYgYgYinjSipjTipjUjVibibibibibibibibibibiKjWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgViiiDabababababababababiDiiiEikizkegVjwgVhLgYgYgYhMgOhrgOgOgOgOgNkfibibibibkgkgkgkhibibiKgNgNgNgNgNgNgNgNgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgViiiiiiiiiiiiiiiiiiiiiiiiiikjikilimgVhKgQhYgYgYgYklgQhKgOabababgNkmibibibibknkokpiJibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSabababababababababababababababababababababababgVgVgVgVgVgVgVkukvkvkwgVgVgVgVgVkxgVgVhKgXhYgYgYgYklgXhKgOabababgNkyibibibibibkzkAiJibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVilkFilililililililkGkHilililgVhKhfhYgYgYgYklhfhKgOabababgNkyibibibibibibibibibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVililililiAiliAililililililkUgVkVkVkWkXkYkZlakVkVkVabababgNkyibibibibibibibiLfZiLiMiLisisisiLfZiLfZiLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVloilillplplplpiBililililillrgVlsltlulvlwlxlultltkVabababgNlylzlzlzlAlBlClAicibiciKicabababicibicibicababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamawamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVlSiliClpjNjOlpilililililillWgVltlXlYlvlwlxlYlZltkVabababgNgNgNgNgNgNgNgNgNlDiNlDiNlDababablDfZlDfZlDababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamfmgmhmiaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamiSayiSayiSaCamaWiSayiSayiSaCamamamamamamamatamiSababababababababababababababababababababababababababgVmuilillplplplpiBilililililmvgVmwltmwlvlwlxmwltmwkVabababababababababababababababababababababiOabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHaamIgamKmLmMaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamaAmnaAmnaAaCamaWaAmnaAmnaAaCamamatamamamamamamiSababababababababababababababababababababababababababgVmYililiFiliFilililililililnagVnbltltlvlwlxltltnckVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHnlnmnnmKnonpaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamavamaBmnaBmnaBaEaxaDaBmnaBmnaBaEavaxaxamamavamamamiSababababababababababababababababababababababababababgVnBilililililililnCnDnEnFnanGgVnHnInIlvlwlxnJnJnKkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaanpnXnYnonZoanpaaaaaaaaaaaaaaaaaaaaabababababababiSamavamamatavamamaWiSayiSayiSaYoelniSayiSayiSiSiSiSiSbIamamatamamiSababababababababababababababababababababababababababgVgVgVgVgVohgVgVgVgVgVgVgVgVgVgVkVkVkVkVlwkVkVkVkVkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamLmMolomolonooaaaaaaaaaaaaaaaaaaaaabababababababiSamamavamamamamataWiSbKmnmnmnbKmnmnmnbKmnmnmnbKmnmniSaCamamamavamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHoooyozoAmLaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamavamamamaWiSmnmnmnmnmnmnmnmnmnmnmnmnmnmnmniSaCatamamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVkYkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaoKoLoMoNoOoPmKoQmHaaaaaaaaaaaaaaaaaaaaabababababababiSavamamamamavamavaWiSaYoeoeoeoeoeoeoeoeoeoeoelniSbLiSaCamavamatamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaakCpipjpkploOmKnYpmpnmHmHaaaaaaaaaaaaaaaaabababababababiSamamavatamamaxaxaxbWbWbWbWcncncncncncncncncnbPiSmniSbIamatamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaamHaaoMpDpDpEoOmKpFnYpnaapGpHaaaaaaaaaaaaaaabababababababiSamamamamamazabababababababazatamamavamamaxaxaDiSmniSaCamamamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaoQmHaaaamHpTpUnnpVnnoQmHmHaaaaaaaaaaaaaaaaabababababababiSatavamamamabababababababababbIamamamataDiSiSqOiScoiScpaxcqaxcqaxiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaonqiqjqkqlqmqlqlqiqnqkqlqlqmqlqlaamHaaaaaaaaaaabababababababiSamamamamamabababababababababaCamamamaWiSiSlPlQhkmniSiSiSiSiSiSiSiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaqwqxmKmKqxqwqyqzmKmKmKqAqBqwqCozoQqDmHmHaaaaaaabababababababiSamamamamamabababababababababaCavamauaWiSaXmnmnmnmnhnmompiSgtiwhIiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaqYqZmKmKqZqYqDqDmKmKmKmKraqYrbrcpDpDrdaaaaaaaaabababababababiSamhTamamamazabababababababazamamamamgwiSmRmnjYjYmTmnmUmVpcpdpdgxiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaarnromKnYmKrppFnYmKgbmKmKrrrnrsrtrurvrwkDaaaaaaabababababababiSamamamamamamamabababababcpaxaxaxaxcqaDiSnujYnvixjYmnjZnyiSpdgyiSiSgBgDgCgEgEgJgEgEgKgLiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaarGqZmKnnpFrHnnmKmKrImKmKmKrGrJrKrdrLoKaaaaaaaaabababababababiSamamamavamamamabababababodoeoeoeoeoelniSkajYofogjYmnjZnyiSiSiSiSiSgDgChijXhjhlhjkbhmgKiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaamirWmKmKrWmirXmKnYnnmKmKrXmirYrZsasbaaaaaaaaaaabababababababiSatamazabababababababababopoqoroqoqoqoqotmnbMmnmnmnmnjZnyiSiSiSiSiSgDhojXhjhwhyhxhjkbhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaamLqisfqkqlsgqlqiolsholqkqlsgqlqimHmHmHaaaaaaaaabababababababiSamamababababababababababoDbNlmoeoeoelniSkdjYjYjYkamnjZnylmoeoeoeoeoeoehjhwhyhAhyhxhjhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaapTnYaamHaamHsooPpTaaaamHaaaaaaaamHaaaaaaaaabababababababiSamamabababababababababababbOabazamambPiSoXoYoZoYiymnpapbhChBhBhDhBhBhChlhyhEhGhFhyhlhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaamHmHaastnYaasusvpTmHaapFaaaaaaaaaaaaaaaaaaabababababababiSbUamababababababababababababababkcamaWiScfpvpwpxpymnmnmnlmoeoeoeoeoeoehjhwhyhHhyhyhjhziSabababababababababababababababababababababababababababsJsJsJsJsJsJsJsJiPsJsJsJsJsJsJsJsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHaasBnYsCaaaaaamHaaaaaaaaaaaaaaaaabababababababiSavamababababababababababababababaCamaWiSiSnypPcgcmiSpSmniSiSiSiSiSgDhokihjhwhyhxhjkkhziSabababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHqmqisIqkqmmHaamHmHaaaaaaaaaaaaaaabababababababiSamamababababababababababababababaEamamamiSiSiSiSiSiSqcqcqdqeqfqgiSgDhVhUkihjhWhjkkidieiSabababababababababababababababababababababababababababiTiQiQiQiUiQiQiQiQiQiQiQiUiQiQiQiTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaqwsMsNsOqwstrcplsPsQmHaaaaaaaaaaabababababababiSamazabababababababababababababababazamamamcncnkqbPiSqrqsqsqsqsqsiSifgDhVigigihigigieifiSabababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaolsVsWsXolnYsYpksZmKnpaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamatamamaWqOqsqsqsqsqsksiSiSiSiSiSiSiSiSiSiSiSiSabababababababababababababababababababababababababababsJsxsysysysysysysysysysysysysyszsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaoPmHmitatbtcminntdpksZaamHaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamaukrktaDiSrjrjrjrjrjrkiSababababababababababababababababababababababababababababababqtqtqtqtqtqtqtqtqtquqvqvqvqvqvqvqvqvqvqvqvqvqvquqtqtqtqtqtqtqtqtqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqmteqiolqkteqmtftgsZaamHaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamaWiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqwmKtitjtimKqwaatkaaaamHaaaaaaaaaaabababababababiSamabababababababababababababababababkBavamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaamHnYtxmKmKmKmKmKtxaaaaaaaanYaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSrCqSqSqTqUqvqvqvqvqvrDrErDqvqvqvqvqvqVqTqWqWrFqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaamHmHoPmKmitBmKmKmKtBmiaaaaaaaaaaaaaaaaaaaaabababababababiSamabababababamabababababamabababababaCamamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvrDrVrDqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaamHqlqltHtItItItItItJaaaaaaaaaaaaaaaaaaaaabababababababiSamabababababamazabababazamabababababaCamamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamLqitMtMtMqkooaaaaaaaaaaaaaaaaaaaaabababababababiSamazabababazamamamamamamamazabababazamamavamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatPtPtPaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababababababababababababababababqtqtqtssssssssssqtquqvqvqvqvqvqvqvqvqvqvqvqvqvquqtssssssssssqtqtqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababababababababababababababqtswswswswswkVkZqhqhqhqhqhqhqhqhqhqhqhqhqhkXkVsAsAsAsAsAqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqtqtqtqtqtkViViWiWiWiWiWiXjjiYiWiWiWiWiWiVkVqtqtqtqtqtqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababkViViViVjkiVltltltltltiVjkiViViVkVababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababkVkVjlkVkVkVkVjmjojnkVkVkVkVjlkVkVababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -1039,21 +1105,21 @@ abababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababthtYtYtYtYthababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababththththththababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababkIkEkKkJkLabababkIkEkKkJkLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababkMkOkNkQkPkSkRabkMkOkTlclbkSkRabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababldlflelelelhlgabldlilelelelhlgabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababljlllklElqlGlFabljlllHlElIlGlFabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababablJlKlelelelhlLablJlKlelelelhlLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababablMlOlNlTlRlVlUablMlOlNlTlRlVlUabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababmbmamdmcmeabababmbmamdmcmeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababkIkEkKkJkLabababkIkEkKkJkLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababkMkOmjmlmkkSkRabkMkOmmmrmqkSkRabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababldmslelelelhlgabldmtlelelelhlgabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababljllmxlEmylGlFabljllmzlEmAlGlFabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababablJlKlelelelhlLablJlKlelelelhlLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababablMlOlNlTlRlVlUablMlOlNlTlRlVlUabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababmbmamdmcmeabababmbmamdmcmeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm
index 8a4ae534254..a24c4248811 100644
--- a/_maps/map_files/MetaStation/z3.dmm
+++ b/_maps/map_files/MetaStation/z3.dmm
@@ -3,7 +3,7 @@
"ay" = (/obj/structure/lattice,/turf/space,/area/space)
"be" = (/obj/item/trash/cheesie,/turf/space,/area/space)
"bj" = (/turf/simulated/floor/plating/airless,/area/space)
-"bk" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"bk" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space)
"bl" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"bm" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space)
"bn" = (/turf/simulated/wall/r_wall,/area/space)
@@ -34,7 +34,7 @@
"bM" = (/obj/structure/table,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
"bN" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/plasteel,/area/tcommsat/chamber)
"bO" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
-"bP" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
+"bP" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
"bQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
"bR" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
"bS" = (/obj/item/stack/cable_coil/cut{amount = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
@@ -66,7 +66,7 @@
"cs" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
"ct" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/chamber)
"cu" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/space)
-"cv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/space)
+"cv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/space)
"cw" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
"cx" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"cy" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless{icon_state = "dark"},/area/tcommsat/chamber)
@@ -127,7 +127,7 @@
"dI" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
"dJ" = (/obj/structure/lattice,/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
"dK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber)
-"dM" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"dM" = (/obj/structure/grille/broken,/turf/space,/area/space)
"dO" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/plasteel,/area/tcommsat/chamber)
"dP" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/tcommsat/chamber)
"dQ" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/tcommsat/chamber)
diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm
index 3420a1f102d..127bdac1692 100644
--- a/_maps/map_files/MetaStation/z4.dmm
+++ b/_maps/map_files/MetaStation/z4.dmm
@@ -111,7 +111,7 @@
"cg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/derelict/solar_control)
"ch" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/derelict/solar_control)
"ci" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/solar_control)
-"cj" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/space)
+"cj" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/space)
"ck" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/derelict/bridge/ai_upload)
"cl" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/porta_turret,/turf/simulated/floor/plasteel,/area/derelict/bridge/ai_upload)
"cm" = (/obj/machinery/porta_turret,/turf/simulated/floor/plating/airless,/area/derelict/bridge/ai_upload)
@@ -296,7 +296,7 @@
"fJ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel,/area/derelict/bridge)
"fK" = (/obj/item/stack/rods,/turf/space,/area/space)
"fL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
-"fM" = (/obj/item/weapon/shard,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor/plating/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
+"fM" = (/obj/item/weapon/shard,/obj/structure/grille/broken,/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor/plating/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"fN" = (/obj/item/clothing/suit/space/syndicate/black/engie,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"fO" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"fP" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
@@ -351,6 +351,7 @@
"gM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless{icon_state = "damaged3"},/area/derelict/hallway/primary)
"gN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless{icon_state = "damaged2"},/area/derelict/hallway/primary)
"gO" = (/obj/machinery/door/airlock/bananium,/turf/simulated/floor/plating/airless,/area/space)
+"gP" = (/obj/structure/shuttle/engine/propulsion{color = "#FFFF00"; dir = 4; icon_state = "propulsion_l"},/turf/space,/area/space)
"gQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/derelict/bridge/access)
"gR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/derelict/bridge/access)
"gS" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/bridge/access)
@@ -376,7 +377,7 @@
"hq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"hs" = (/turf/simulated/floor/plating/airless{icon_state = "floorscorched1"},/area/space)
"ht" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
-"hu" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
+"hu" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"hv" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
"hw" = (/turf/simulated/floor/plating/airless,/area/derelict/hallway/primary)
"hx" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating/airless,/area/derelict/hallway/primary)
@@ -413,7 +414,7 @@
"ie" = (/turf/simulated/wall,/area/derelict/medical)
"if" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/derelict/medical)
"ig" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/derelict/medical)
-"ih" = (/obj/item/weapon/shard,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/derelict/medical)
+"ih" = (/obj/item/weapon/shard,/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/derelict/medical)
"ii" = (/turf/simulated/floor/plating/airless,/area/derelict/medical)
"ij" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/derelict/medical)
"ik" = (/obj/machinery/door/airlock/external{name = "External Engineering"},/turf/simulated/floor/plating/airless,/area/space)
@@ -776,7 +777,6 @@
"pv" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/plating/airless,/area/space)
"py" = (/obj/structure/closet/secure_closet{name = "clown locker"; req_access_txt = "46"},/turf/simulated/floor/plating/airless,/area/space)
"pz" = (/obj/structure/shuttle/engine/heater{color = "#FFFF00"; dir = 4; icon_state = "heater"},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 8},/turf/simulated/floor/plating/airless{color = "#FFFF00"},/area/space)
-"pA" = (/obj/structure/shuttle/engine/propulsion{color = "#FFFF00"; dir = 8; icon_state = "propulsion_l"},/turf/space,/area/space)
"pB" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless/asteroid,/area/space)
"pD" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/space)
"pE" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/plating/airless,/area/space)
@@ -999,11 +999,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprpspsprpraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprpraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprpspsaaaagpgpgpgOgOgpgpgpgpgpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprpsgpgpgppspvhchccHcHcZpypzpAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprprprpBhchchchchchchcpzpAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprprprpDpEhcpFhchchchchcpzpAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprpGhcpHhcjXhcpvhchchchcpzpAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprgpgpgphcpIhchccHcHcHhcpzpAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprpsgpgpgppspvhchccHcHcZpypzgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprprprpBhchchchchchchcpzgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprprprpDpEhcpFhchchchchcpzgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprpGhcpHhcjXhcpvhchchchcpzgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprgpgpgphcpIhchccHcHcHhcpzgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprprprgpgpgpgOgOgpgpgpgpgpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprprprprprprprprprprprprprprprprprprprprprprprpraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaprpraaprprprprprpspsprprprprprprprprprprpraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/MetaStation/z5.dmm b/_maps/map_files/MetaStation/z5.dmm
index 186dfe33844..cdfad4b1cb4 100644
--- a/_maps/map_files/MetaStation/z5.dmm
+++ b/_maps/map_files/MetaStation/z5.dmm
@@ -10,8 +10,8 @@
"aj" = (/obj/machinery/light/small,/obj/structure/transit_tube,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/unexplored)
"ak" = (/obj/structure/transit_tube{icon_state = "W-SE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/unexplored)
"al" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"am" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/space,/area/research_outpost/hallway)
-"an" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"am" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/space,/area/research_outpost/hallway)
+"an" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"ao" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "NE-SW"},/turf/space,/area/space)
"ap" = (/obj/structure/transit_tube{icon_state = "D-NW"},/obj/structure/lattice,/turf/space,/area/space)
"aq" = (/turf/simulated/wall/r_wall,/area/research_outpost/spectro)
@@ -21,10 +21,10 @@
"au" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
"av" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
"aw" = (/obj/structure/transit_tube{icon_state = "E-SW"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/unexplored)
-"ax" = (/obj/structure/transit_tube,/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/hallway)
+"ax" = (/obj/structure/transit_tube,/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/hallway)
"ay" = (/obj/structure/transit_tube/station,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/research_outpost/hallway)
"az" = (/obj/structure/transit_tube,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway)
-"aA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"aA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"aB" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space)
"aC" = (/obj/structure/transit_tube{icon_state = "W-SE"},/obj/structure/lattice,/turf/space,/area/space)
"aD" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
@@ -35,7 +35,7 @@
"aI" = (/obj/structure/table,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = 2},/obj/item/device/assembly/igniter{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = -4; pixel_y = -4},/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"aJ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"aK" = (/obj/structure/closet/hydrant{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
-"aL" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/stock_parts/cell,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
+"aL" = (/obj/structure/table,/obj/item/device/plant_analyzer,/obj/item/weapon/stock_parts/cell,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"aM" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
"aN" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
"aO" = (/obj/structure/transit_tube{icon_state = "NE-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
@@ -72,17 +72,17 @@
"bt" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
"bu" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Mass Spectrometry APC"; pixel_x = 24; pixel_y = 0; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/research_outpost/spectro)
"bv" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"bw" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weedkiller/triclopyr,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
+"bw" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"bx" = (/obj/machinery/light/small,/obj/structure/closet/walllocker/emerglocker/north{dir = 1; pixel_y = -32},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"by" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
-"bz" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_access_txt = "0"; req_one_access_txt = "65;12"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/maintstore1)
+"bz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_access_txt = "0"; req_one_access_txt = "65;12"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/maintstore1)
"bA" = (/turf/simulated/floor/plasteel,/area/research_outpost/maintstore1)
"bB" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/research_outpost/maintstore1)
"bC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/camera{c_tag = "Research Outpost Auxiliary Storage"; dir = 8; network = list("Research Outpost")},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/research_outpost/maintstore1)
"bD" = (/obj/structure/table,/turf/simulated/floor/carpet,/area/research_outpost/hallway)
"bE" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/carpet,/area/research_outpost/hallway)
-"bF" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rminingdorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
-"bG" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rdorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
+"bF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "rminingdorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
+"bG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "rdorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
"bH" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/lattice,/turf/space,/area/space)
"bI" = (/turf/simulated/mineral/random,/area/mine/dangerous/unexplored)
"bJ" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SE"},/turf/space,/area/space)
@@ -99,21 +99,21 @@
"bU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/research_outpost/hallway)
"bV" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/research_outpost/hallway)
"bW" = (/turf/simulated/wall/r_wall,/area/research_outpost/atmos)
-"bX" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
-"bY" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
+"bX" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/atmos)
+"bY" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/atmos)
"bZ" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "S-NE"},/turf/space,/area/space)
"ca" = (/obj/machinery/radiocarbon_spectrometer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"},/area/research_outpost/spectro)
"cb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"},/area/research_outpost/spectro)
"cc" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitegreen"},/area/research_outpost/spectro)
-"cd" = (/obj/machinery/door/airlock/research{name = "Chem Storage"; req_access_txt = "65"},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cd" = (/obj/machinery/door/airlock/research{name = "Chem Storage"; req_access_txt = "65"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"ce" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cf" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cg" = (/obj/structure/table,/obj/machinery/light{dir = 1},/obj/machinery/reagentgrinder,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"ch" = (/obj/structure/table,/obj/item/weapon/storage/box/solution_trays,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/sample)
"ci" = (/obj/machinery/door/window/westleft{dir = 1; name = "Sample Preparation Loading"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/research_outpost/sample)
"cj" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/reconstitutor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/research_outpost/sample)
-"ck" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/research_outpost/maintstore1)
-"cl" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/grass,/area/research_outpost/maintstore1)
+"ck" = (/obj/machinery/hydroponics/soil,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/research_outpost/maintstore1)
+"cl" = (/obj/machinery/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/grass,/area/research_outpost/maintstore1)
"cm" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1)
"cn" = (/obj/structure/sink{pixel_y = 30},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
"co" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
@@ -126,7 +126,7 @@
"cv" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/obj/machinery/camera{c_tag = "Research Outpost Atmospherics"; dir = 2; network = list("Research Outpost")},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"cw" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/research_outpost/atmos)
"cx" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/atmos)
-"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/airlock/research{name = "Spectrometry Lab"; req_access_txt = "65"},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
+"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/airlock/research{name = "Spectrometry Lab"; req_access_txt = "65"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
"cz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/research_outpost/spectro)
"cA" = (/obj/machinery/power/apc{dir = 4; name = "Chem Storage APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cB" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
@@ -134,12 +134,12 @@
"cD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cE" = (/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/research_outpost/sample)
"cF" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 2},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
-"cG" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/grass,/area/research_outpost/maintstore1)
+"cG" = (/obj/machinery/hydroponics/soil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/grass,/area/research_outpost/maintstore1)
"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1)
"cI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/research_outpost/hallway)
"cJ" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
"cK" = (/obj/machinery/door_control{id = "rbath"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
-"cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rbath"; name = "Bathroom"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
+"cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "rbath"; name = "Bathroom"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
"cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"cN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"cO" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 5; level = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
@@ -158,7 +158,7 @@
"db" = (/obj/machinery/light/small{dir = 4},/obj/machinery/power/apc{dir = 4; name = "Sample Preparation APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"dc" = (/turf/simulated/wall/r_wall,/area/research_outpost/anomaly)
"dd" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/research_outpost/anomaly)
-"de" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
+"de" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Anomalous Materials Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"df" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dh" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 4},/obj/structure/sign/nosmoking_1{pixel_x = -32},/turf/simulated/floor/plating,/area/research_outpost/atmos)
@@ -166,7 +166,7 @@
"dj" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/research_outpost/atmos)
"dl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"dm" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Chem Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"dm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Chem Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"dn" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"do" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"dp" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
@@ -174,23 +174,23 @@
"dr" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/camera{c_tag = "Research Outpost Sample Preparation"; dir = 1; network = list("Research Outpost")},/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 3; pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
"ds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
"dt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
-"du" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"du" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"dv" = (/obj/machinery/power/apc{dir = 1; name = "Anomalous Materials APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/research_outpost/anomaly)
"dw" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dy" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dz" = (/obj/machinery/light{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dA" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/anomaly)
-"dB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 1; layer = 2.6; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
-"dC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/door/firedoor{dir = 1; layer = 2.6; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
+"dB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
+"dC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dD" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dE" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
-"dI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Chem Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"dI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Chem Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"dJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/sample)
-"dK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
+"dK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"dL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/research_outpost/sample)
"dM" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dN" = (/obj/structure/table,/obj/item/weapon/lighter/random,/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
@@ -200,7 +200,7 @@
"dR" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/structure/plasticflaps,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/anomaly)
"dS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
-"dU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/atmos)
+"dU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dV" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dW" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dX" = (/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/research_outpost/atmos)
@@ -214,7 +214,7 @@
"ef" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/alarm{dir = 2; pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
-"ei" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
+"ei" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"ej" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"ek" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/sign/chemistry{desc = "A warning sign which reads 'SAMPLE PREPARATION'"; name = "\improper SAMPLE PREPARATION"; pixel_y = 32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"el" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/research_outpost/anomaly)
@@ -227,7 +227,7 @@
"es" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"et" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
"eu" = (/turf/simulated/wall/r_wall,/area/research_outpost/power)
-"ev" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plasteel,/area/research_outpost/power)
+"ev" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plasteel,/area/research_outpost/power)
"ew" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"ex" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"ey" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
@@ -242,17 +242,17 @@
"eH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"eK" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock East"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
+"eK" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
"eL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"eM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
-"eN" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"eN" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"eO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/research_outpost/anomaly)
"eP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"eQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"eR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"eS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"eT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
-"eU" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"eU" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"eV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/research_outpost/hallway)
"eW" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
"eX" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/power)
@@ -279,7 +279,7 @@
"fs" = (/obj/machinery/camera{c_tag = "Research Outpost Anomalous Materials Lab"; dir = 8; network = list("Research Outpost")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"ft" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"fu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
-"fv" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
+"fv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
"fw" = (/turf/simulated/floor/plating,/area/research_outpost/power)
"fx" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/research_outpost/power)
"fy" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/power)
@@ -291,17 +291,17 @@
"fE" = (/obj/structure/table,/obj/item/device/camera,/obj/item/weapon/stamp/granted,/turf/simulated/floor/wood,/area/research_outpost/hallway)
"fF" = (/turf/simulated/floor/wood,/area/research_outpost/hallway)
"fG" = (/obj/machinery/vending/snack,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/research_outpost/hallway)
-"fH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"fI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
-"fJ" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"fK" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"fH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
+"fI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"fJ" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"fK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"fL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Research Outpost Hallway Engineering"; dir = 4; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"fM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowcorner"},/area/research_outpost/hallway)
"fN" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/power/apc{dir = 8; name = "Outpost Power APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/research_outpost/power)
"fO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/research_outpost/power)
"fP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/research_outpost/power)
"fQ" = (/obj/machinery/portable_atmospherics/scrubber,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/research_outpost/power)
-"fR" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/power)
+"fR" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/power)
"fS" = (/obj/machinery/mass_driver{dir = 4; id_tag = "Research Outpost"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/unexplored)
"fT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"fU" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 2; name = "Outpost Lobby APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/wood,/area/research_outpost/hallway)
@@ -326,11 +326,11 @@
"gn" = (/obj/machinery/conveyor_switch{id = "archgunc"},/turf/simulated/floor/plating,/area/research_outpost/power)
"go" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/research_outpost/power)
"gp" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/wall,/area/research_outpost/entry)
-"gq" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"gq" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"gr" = (/obj/machinery/door/airlock/external{id_tag = "science_away"; name = "Research Outpost Dock Airlock"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/research_outpost/entry)
"gs" = (/obj/structure/sign/science,/turf/simulated/wall,/area/research_outpost/entry)
-"gt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
-"gu" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"gt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"gu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"gv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/turf/simulated/floor/wood,/area/research_outpost/hallway)
"gw" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/turf/simulated/floor/wood,/area/research_outpost/hallway)
"gx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
@@ -348,11 +348,11 @@
"gJ" = (/obj/machinery/driver_button{id_tag = "Research Outpost"; pixel_x = 6; pixel_y = -26},/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating,/area/research_outpost/power)
"gK" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/power)
"gL" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power)
-"gM" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"gM" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"gN" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
"gO" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
"gP" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
-"gQ" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"gQ" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"gR" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/research_outpost/entry)
"gS" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"gT" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Shuttle Docking Foyer"; dir = 8; network = list("MINE")},/obj/machinery/newscaster{pixel_x = 30; pixel_y = 1},/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/mine/production)
@@ -379,34 +379,34 @@
"ho" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/color/latex,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly)
"hp" = (/obj/machinery/door/window/westleft{dir = 2; name = "Monkey Pen"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"hq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"hr" = (/obj/machinery/door/firedoor{layer = 2.6; name = "\improper Firelock South"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"hs" = (/obj/machinery/door/firedoor{layer = 2.6; name = "\improper Firelock South"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"ht" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
+"hr" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"hs" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"ht" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
"hu" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway)
"hv" = (/obj/structure/transit_tube{icon_state = "E-NW"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway)
"hw" = (/obj/structure/transit_tube/station,/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = 32; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/research_outpost/hallway)
"hx" = (/obj/structure/transit_tube{icon_state = "W-NE"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"hy" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"hz" = (/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
-"hA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/harvesting)
+"hA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/harvesting)
"hB" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
-"hC" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"hC" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"hD" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/research_outpost/entry)
"hE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
-"hF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"hF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"hG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"hH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"hI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
-"hJ" = (/obj/machinery/door/firedoor{dir = 8; layer = 2.6; name = "Firelock West"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Medbay"; req_access_txt = "0"; req_one_access_txt = "65;5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
+"hJ" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Medbay"; req_access_txt = "0"; req_one_access_txt = "65;5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"hK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"hL" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"hM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/conveyor_switch{id = "anotempload"; name = "conveyor switch"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"hN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"hO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
-"hP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
+"hP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Temporary Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"hQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"hR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"hS" = (/obj/machinery/door/firedoor{dir = 8; layer = 2.6; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"hS" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
@@ -419,7 +419,7 @@
"ic" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowcorner"},/area/research_outpost/hallway)
"id" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/research_outpost/hallway)
"ie" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowcorner"},/area/research_outpost/hallway)
-"if" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 8; layer = 2.6; name = "Firelock West"},/obj/machinery/camera{c_tag = "Research Outpost Hallway Starboard"; dir = 2; network = list("Research Outpost"); pixel_x = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"if" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/camera{c_tag = "Research Outpost Hallway Starboard"; dir = 2; network = list("Research Outpost"); pixel_x = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"ig" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/research_outpost/hallway)
"ih" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"ii" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Research Outpost Exotic Particles Airlock"; dir = 2; network = list("Research Outpost")},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
@@ -429,7 +429,7 @@
"im" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/research_outpost/harvesting)
"in" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/research_outpost/harvesting)
"io" = (/obj/machinery/artifact_harvester,/turf/simulated/floor/bluegrid,/area/research_outpost/harvesting)
-"ip" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "D-NE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"ip" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "D-NE"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"iq" = (/obj/structure/transit_tube{icon_state = "S-NW"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/entry)
"ir" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"is" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "Research Outpost Shuttle Dock"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/research_outpost/entry)
@@ -446,7 +446,7 @@
"iD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage)
"iE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"iF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
-"iG" = (/obj/machinery/door/firedoor{dir = 8; layer = 2.6; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
+"iG" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"iH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"iI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"iJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/sign/examroom{desc = "A guidance sign which reads 'ISOLATION ROOM ONE'"; name = "\improper ISOLATION ROOM ONE"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway)
@@ -457,14 +457,14 @@
"iO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway)
"iP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/sign/examroom{desc = "A guidance sign which reads 'ISOLATION ROOM THREE'"; name = "\improper ISOLATION ROOM THREE"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway)
"iQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
-"iR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 8; layer = 2.6; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"iR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"iS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"iT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/biohazard{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"iU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/research_outpost/hallway)
-"iV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Exotic Particles Collection"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
+"iV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Exotic Particles Collection"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"iW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/harvesting)
"iX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
-"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/external{name = "Access Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
+"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{name = "Access Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"iZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
"ja" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/harvesting)
"jb" = (/obj/structure/table,/obj/item/weapon/anodevice{pixel_x = 3; pixel_y = 3},/obj/item/weapon/anodevice,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/harvesting)
@@ -484,7 +484,7 @@
"jp" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage)
"jq" = (/obj/machinery/conveyor{dir = 9; id = "anotempload"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/research_outpost/tempstorage)
"jr" = (/turf/simulated/wall/r_wall,/area/research_outpost/maint)
-"js" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plating,/area/research_outpost/maint)
+"js" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/maint)
"jt" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso1)
"ju" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/iso1)
"jv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Isolation room one"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/iso1)
@@ -494,10 +494,10 @@
"jz" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso3)
"jA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/iso3)
"jB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Isolation Room Three"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/iso3)
-"jC" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_access_txt = "0"; req_one_access_txt = "12;65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
+"jC" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_access_txt = "0"; req_one_access_txt = "12;65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"jD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2)
"jE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/longtermstorage)
-"jF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Long Term Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage)
+"jF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Long Term Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage)
"jG" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"jH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"jI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
@@ -505,13 +505,13 @@
"jK" = (/turf/simulated/wall,/area/mine/dangerous/unexplored)
"jL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space)
"jM" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall,/area/research_outpost/entry)
-"jN" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-SW"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"jN" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/transit_tube{icon_state = "N-SW"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"jO" = (/turf/simulated/wall,/area/research_outpost/entry)
"jP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/research_outpost/entry)
-"jQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Expedition Prep"; req_access_txt = "65"},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"jQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Expedition Prep"; req_access_txt = "65"},/turf/simulated/floor/plating,/area/research_outpost/entry)
"jR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/research_outpost/entry)
"jS" = (/turf/simulated/wall,/area/research_outpost/tempstorage)
-"jT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
+"jT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Temporary Storage Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"jU" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating,/area/research_outpost/maint)
"jV" = (/obj/machinery/conveyor{dir = 5; id = "anosample"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/research_outpost/maint)
"jW" = (/obj/machinery/conveyor{dir = 4; id = "anosample"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/plating,/area/research_outpost/maint)
@@ -545,11 +545,11 @@
"ky" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"kz" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"kA" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
-"kB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Loading area"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/tempstorage)
+"kB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Loading area"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/tempstorage)
"kC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/camera{c_tag = "Research Outpost Loading Area"; dir = 2; network = list("Research Outpost")},/turf/simulated/floor/plasteel,/area/research_outpost/tempstorage)
"kD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/power/apc{dir = 1; name = "Temporary Storage APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/research_outpost/tempstorage)
"kE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/research_outpost/tempstorage)
-"kF" = (/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;65"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/research_outpost/maint)
+"kF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;65"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/research_outpost/maint)
"kG" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/research_outpost/maint)
"kH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/research_outpost/maint)
"kI" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/research_outpost/maint)
@@ -619,7 +619,7 @@
"lU" = (/obj/structure/closet/excavation,/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"lV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"lW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
-"lX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/glass_mining{name = "Equipment storage"; req_access_txt = "47"},/obj/machinery/door/firedoor{dir = 4; layer = 2.6; name = "Firelock"},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
+"lX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/glass_mining{name = "Equipment storage"; req_access_txt = "47"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"lY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"lZ" = (/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"ma" = (/obj/machinery/conveyor_switch{id = "anotempload"},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (NORTH)"; icon_state = "asteroidwarning"; dir = 1},/area/mine/dangerous/explored)
@@ -700,7 +700,7 @@
"nx" = (/obj/machinery/door/window/westleft,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
"ny" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"; tag = "icon-closed (EAST)"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/mine/dangerous/explored)
"nz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space)
-"nA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/gearstore)
+"nA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/gearstore)
"nB" = (/obj/machinery/door/airlock/external,/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"nC" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2)
"nD" = (/obj/structure/transit_tube,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
@@ -742,7 +742,7 @@
"on" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/research_outpost/gearstore)
"oo" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Research Outpost External Airlock"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/research_outpost/gearstore)
"op" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/dangerous/explored)
-"oq" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
+"oq" = (/obj/structure/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"or" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"os" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"ot" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
@@ -779,7 +779,7 @@
"oY" = (/obj/structure/alien/weeds/node,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"oZ" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"pa" = (/turf/space,/area/mine/dangerous/explored)
-"pb" = (/obj/effect/glowshroom,/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
+"pb" = (/obj/structure/glowshroom,/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"pc" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area/space)
"pd" = (/turf/simulated/floor/plating/airless{icon_state = "damaged2"},/area/mine/abandoned)
"pe" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless{icon_state = "floorscorched2"},/area/mine/abandoned)
@@ -820,7 +820,7 @@
"pN" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/mine/abandoned)
"pO" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/abandoned)
"pP" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/abandoned)
-"pQ" = (/obj/structure/table,/obj/item/weapon/paper/crumpled,/obj/item/seeds/cherryseed,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/abandoned)
+"pQ" = (/obj/structure/table,/obj/item/weapon/paper/crumpled,/obj/item/seeds/cherry,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/abandoned)
"pR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"pS" = (/obj/structure/alien/resin/membrane,/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"pT" = (/obj/structure/table,/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel,/area/mine/north_outpost)
@@ -925,7 +925,7 @@
"rO" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"rP" = (/turf/simulated/floor/plating/airless/asteroid{temperature = 273.15},/area/mine/dangerous/explored)
"rQ" = (/obj/machinery/door/airlock/external{name = "External Airlock"; req_access_txt = "0"},/turf/simulated/floor/plating/airless{icon_state = "asteroidfloor"},/area/mine/abandoned)
-"rR" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
+"rR" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"rS" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/dangerous/explored)
"rT" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/explored)
"rU" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/dangerous/explored)
@@ -961,7 +961,7 @@
"sy" = (/obj/item/device/radio/intercom/locked/prison{dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"sz" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"sA" = (/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/dangerous/explored)
-"sB" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/abandoned)
+"sB" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/abandoned)
"sC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/abandoned)
"sD" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"sE" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=7-Sleeper"; location = "6-Vending"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
@@ -1177,8 +1177,8 @@
"wG" = (/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wH" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wI" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel,/area/mine/eva)
-"wJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
-"wK" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wK" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wL" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"wM" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wN" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
@@ -1469,15 +1469,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaabIbIbIadbIaaaabZbMaeaeaeaeaeadaqcacbccaraZaZcdcecfcgchcicjckclcmbjcncobjcpcqcrcsctcucvcwcxbXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaabIbIbIbIbIaaaaaVaaaaaaaaaaaaadaqaqcyczaraZcAarcBcececCcDcEcFcGcHcIcJcKcLcMcNbWcOcPcQcRcScTbXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadaaaaaaaaaaaaaaaabIbIbIbIaaaaaVaaaaaaaaaaaaadaQcUcVcUarcWcXarcCcYcZdadbdcdddcdedcdcdcdcdfdgbWdhcPdidjdkcxbXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadbIbIbIbIbIadadadadadadaaaaaaaaaaaaaabIbIbIaaaeaVaaaaaaaaaaaaadaQcUdlcUdmdndoardpdqdrdsdtdudvdwdxdydzdAdcdBdCbWdDdEdFdGbWbYbXaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadbIbIbIbIbIadadadadadadaaaaaaaaaaaaaabIbIbIaaaeaVaaaaaaaaaaaaadaQcUdlcUdmdndoardpdqdrdsdtdudvdwdxdydzdAdcdCdBbWdDdEdFdGbWbYbXaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadbIbIbIbIbIbIbIbIbIbIadadadadadaaaaaaaaaaaabIbIbIaaaeaVaaaeaeaeaeaeadaQcUdlcUaQdHdIaQbPbPdJdKdLdcdMdNdOdPdQdRdcdSdTdUdVdWdXdYbWdZadaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIadadadadadaaaaaaaabIbIbIaaaaaVaaaaaaaaaaaaaabjebdlcUecedeeefegeheiejekdcelemeneoepeqereseteueueuevewexezeyeyeAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIadadadadadbIaaaaaaaabIaaaaaVaaaaaaaaaaaaaaaneBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeueXeYeZfaeufbadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIadadadbIbIaaaaaaaaaaaaaVaaaaaaaaaaaaaaanfccUfdfefffgfhfifjaQfkflfmfnfofpfqfrfsdcftfufvfwfwfxfyfzfBfAadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadbIbIbIbIbIbIfCbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaaaVaaaaaaaaaaaaaaanfccUfdfefDfEfhfFfGaQfHfIdcfJdcdcdcdcfKdcfLfMeufNfOfPfQfRdZfSacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadbIbIbIbIbIbIfCbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaaaVaaaaaaaaaaaaaaanfccUfdfefDfEfhfFfGaQfIfHdcfJdcdcdcdcfKdcfLfMeufNfOfPfQfRdZfSacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaaaVaaaaaaeaaaaaaabjfTcUfUfefVfWfhfXfYaQfZgagbgcgdgegfdcggghgigjgkglgmgngofRdZadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaagpgqgqgqgrgqgqgqgsgtgubjgvgwaQaQaQaQaQgxgygzgcgAgegBdcgCgDgEgFgGgHgIgJgKgLgMgNaQgObKaBaBaBaBaBaBaCgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadadadadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaagQgRgSgUgUgUgVgWgXgYgZhahbhchdhehfhghhhihjhkhlhmhnhodchphqhrhseueuhteueueuhuhvhwhxhyhzhzhAhzhzhzhBbqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaagpgqgqgqgrgqgqgqgsgugtbjgvgwaQaQaQaQaQgxgygzgcgAgegBdcgCgDgEgFgGgHgIgJgKgLgMgNaQgObKaBaBaBaBaBaBaCgPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadadadadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIaaaaaaaaaaaagQgRgSgUgUgUgVgWgXgYgZhahbhchdhehfhghhhihjhkhlhmhnhodchphqhshreueuhteueueuhuhvhwhxhyhzhzhAhzhzhzhBbqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIadadadaaaaaaaaaahChDgUgUgUgUhEhFhGhHhIhJhKhLhdhMhNhOhPhQhRhShThUhVhWhXhYhVhZiaibicidieibifibhVigihiiijikiliminiohzbHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIadadadaaaaaaaaaaipiqgUgUirgUisitiuiviwixiyizhdiAiBiCiDiEiFiGiHiIiJiKiLiMiNiKiOiLiPiKiLiQiRiSiTiUiViWiXiYiZjajajbhzbHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIbIfCbIbIbIbIadadadadaaaaaaaagqjcgUjdjejfjgjhjijjjkjljmjnhdjojpjqjrjrjrjrjsjtjujvjtjwjxjyjwjzjAjBjzjzjCjDjEjFhzjGjHhzjIjajajJhzbHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
index 0635ad2bcc7..67e6a680f43 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
@@ -43,13 +43,13 @@
"aQ" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
"aR" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aS" = (/obj/machinery/power/apc/worn_out{dir = 8; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/rack,/obj/item/weapon/melee/baton/cattleprod,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
-"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/weapon/tank/emergency_oxygen/double,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/weapon/tank/emergency_oxygen/double,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aU" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/shield/riot,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aV" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aW" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aX" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 3; pixel_y = 5},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 4},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = -3; pixel_y = -1},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aY" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/temperature,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
-"aZ" = (/obj/structure/table/reinforced,/obj/item/weapon/minihoe,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aZ" = (/obj/structure/table/reinforced,/obj/item/weapon/cultivator,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"ba" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"bb" = (/obj/machinery/door/airlock/hatch{name = "Bio-Research Station"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
@@ -89,14 +89,14 @@
"bK" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/space)
"bL" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bM" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
-"bN" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bN" = (/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/ruin/unpowered)
"bO" = (/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/ruin/unpowered)
"bP" = (/obj/structure/lattice,/turf/space,/area/space)
"bQ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/ruin/unpowered)
"bR" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating,/area/space)
"bS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable,/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/ruin/unpowered)
"bT" = (/obj/structure/grille,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/ruin/unpowered)
-"bU" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bU" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/ruin/unpowered)
"bV" = (/obj/machinery/shieldwallgen,/turf/space,/area/space)
"bW" = (/obj/item/weapon/shard,/turf/space,/area/space)
@@ -122,3 +122,4 @@ agbvbvbvbvakbKatbGbGataaakbHbvbObvbPaaaa
abacacacacbQbRaaaaaaaaaabSacbTbUbPaabVaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm
index c53640a6726..ce7c6587e01 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm
@@ -10,7 +10,7 @@
"aj" = (/obj/structure/closet/cardboard,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"ak" = (/obj/structure/closet/cardboard,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/tape/random,/obj/item/device/tape/random,/obj/item/device/tape/random,/obj/item/weapon/storage/box/rxglasses,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"al" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/box/bodybags,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
-"am" = (/obj/structure/closet/cardboard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/kitchen/knife,/obj/item/weapon/hatchet,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"am" = (/obj/structure/closet/cardboard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/kitchen/knife,/obj/item/weapon/hatchet,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"an" = (/obj/structure/closet/cardboard,/obj/item/weapon/defibrillator,/obj/item/weapon/storage/box/autoinjectors,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"ao" = (/obj/structure/closet/cardboard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"ap" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
@@ -64,15 +64,15 @@
"bl" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bm" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bn" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
-"bo" = (/obj/machinery/portable_atmospherics/hydroponics{pixel_y = 9},/obj/machinery/light{dir = 1},/turf/simulated/floor/light,/area/ruin/unpowered)
-"bp" = (/obj/machinery/portable_atmospherics/hydroponics{pixel_y = 9},/turf/simulated/floor/light,/area/ruin/unpowered)
+"bo" = (/obj/machinery/hydroponics/constructable{pixel_y = 9},/turf/simulated/floor/light,/area/ruin/unpowered)
+"bp" = (/obj/machinery/hydroponics/constructable{pixel_y = 9},/obj/machinery/light{dir = 1},/turf/simulated/floor/light,/area/ruin/unpowered)
"bq" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"br" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bs" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/power/smes,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bt" = (/obj/machinery/telecomms/relay/preset/telecomms,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bu" = (/obj/machinery/light/small{dir = 1},/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bv" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
-"bw" = (/obj/machinery/light,/obj/machinery/portable_atmospherics/hydroponics{pixel_y = 9},/turf/simulated/floor/light,/area/ruin/unpowered)
+"bw" = (/obj/machinery/light,/obj/machinery/hydroponics/constructable{pixel_y = 9},/turf/simulated/floor/light,/area/ruin/unpowered)
"bx" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"by" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
"bz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
@@ -152,9 +152,9 @@ aaaaababababababababababababababababababababababababacaQaRaSacaTaUacaVararararar
aaaaaaabababababababababababababababababababababababacaYaZbaacbbaUacacbcbcaubcbcacacaXararbdbdbdacababababababababababababababababababababababababababababababababaaaaaaaa
aaaaaaaaabababababababababababababababababababacacacacacauacacacbeacbfarararararauararararbdbdbdacabababababababababababababababababababababababababababababababababaaaaaa
aaaaaaaaabababababababababababababababababababacbgaracarararbhararararararararbiacacacacacacacacacabababababababababababababababababababababababababababababababababaaaaaa
-aaaaaaaaabababababababababababababababababababacbjarauarararararararbkblbmbnararacbobpbpboacababababababababababababababababababababababababababababababababababababaaaaaa
+aaaaaaaaabababababababababababababababababababacbjarauarararararararbkblbmbnararacbpbobobpacababababababababababababababababababababababababababababababababababababaaaaaa
aaaaaaaaabababababababababababababababababababacacacacacacauacacararacacacacararauararararacabababababababababababababababababababababababababababababababababababababaaaa
-aaaaaaaaaaababababababababababababababababababacbqbrbsbtararbuacarararararararbvacbwbpbpbwacabababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaababababababababababababababababababacbqbrbsbtararbuacarararararararbvacbwbobobwacabababababababababababababababababababababababababababababababababababababaaaa
aaaaaaaaaaaaabababababababababababababababababacbxarbyarararbzacbAbBbCbDbEararbFacacacacacacabababababababababababababababababababababababababababababababababababababaaaa
aaaaaaaaaaaaabababababababababababababababababacbGbHbIarararbJacbKbBbLbMbEararbNacabababababababababababababababababababababababababababababababababababababababababababaa
aaaaaaaaaaaaaaababababababababababababababababacbOararararbPbQacbRbSbBbBbBararbTacabababababababababababababababababababababababababababababababababababababababababababaa
@@ -177,3 +177,4 @@ aaaaaaaaaaaaaaaaaaaaaaabababababababababababababcececececeababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababcececececeababababababababaaaaaaababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababcececececeababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm
index 4c278585ac7..8c167cc4659 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm
@@ -9,7 +9,7 @@
"i" = (/obj/structure/stool/bed/chair,/obj/structure/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
"j" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
"k" = (/obj/effect/spawner/lootdrop/crate_spawner,/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
-"l" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"l" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"; tag = "icon-propulsion (WEST)"},/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
"m" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
"n" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
"o" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
@@ -61,3 +61,4 @@ aaaaaaaaaaaaaabbbbdcccaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaabbcccccaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaabccaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm
index a276d0aa296..04abf4fc800 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm
@@ -2,7 +2,7 @@
"b" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/ruin/powered)
"c" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered)
"d" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/ruin/powered)
-"e" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/ruin/powered)
+"e" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/space,/area/ruin/powered)
"f" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating,/area/ruin/powered)
"g" = (/obj/structure/table/woodentable,/obj/item/clothing/under/shorts/black,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
"h" = (/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
@@ -42,3 +42,4 @@ aefBhhhhccccC
aefnnDhjcaaaa
aaAcccccCaaaa
"}
+
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
new file mode 100644
index 00000000000..07a482523ad
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
@@ -0,0 +1,86 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral,/area/ruin/powered)
+"c" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"d" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"e" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/powered)
+"f" = (/turf/simulated/wall/r_wall,/area/ruin/powered)
+"g" = (/turf/simulated/floor/plating,/area/ruin/powered)
+"h" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/turf/simulated/floor/plating,/area/ruin/powered)
+"i" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"j" = (/turf/simulated/wall,/area/ruin/powered)
+"k" = (/obj/structure/table,/obj/item/weapon/paper/monitorkey,/obj/item/clothing/glasses/regular,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"l" = (/obj/structure/table,/obj/item/device/radio/intercom/pirate{name = "listening post intercom"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"m" = (/turf/simulated/floor/plasteel,/area/ruin/powered)
+"n" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered)
+"o" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/ruin/powered)
+"p" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"q" = (/obj/structure/stool/bed/chair{dir = 4},/mob/living/simple_animal/hostile/syndicate{desc = "A weary looking syndicate operative."; environment_smash = 0; faction = "syndicate"},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"r" = (/obj/structure/table,/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "november report"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"s" = (/obj/structure/table,/obj/item/device/radio/intercom/pirate{name = "listening post intercom"},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"t" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/air,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"w" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"x" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"z" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/mineral,/area/ruin/powered)
+"A" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/mineral,/area/ruin/powered)
+"B" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"C" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"D" = (/obj/structure/table,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"E" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"F" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"G" = (/obj/structure/disposalpipe/segment,/turf/simulated/mineral,/area/ruin/powered)
+"H" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"I" = (/obj/structure/closet,/obj/item/clothing/gloves/boxing,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"J" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."; name = "april report"},/obj/item/weapon/paper{info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."; name = "may report"},/obj/item/weapon/paper{info = "Nanotrasen communications have been noticably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."; name = "june report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "july report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "august report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "september report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "october report"},/obj/item/weapon/paper{info = "1 x Stechtkin pistol - $600 1 x silencer - $200 shipping charge - $4360 total - $5160"; name = "receipt"},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"K" = (/obj/structure/table,/obj/item/weapon/paper{info = "Mission Details : You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."; name = "mission briefing"},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"L" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"M" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/ruin/powered)
+"N" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/mineral,/area/ruin/powered)
+"O" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"P" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/powered)
+"Q" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/powered)
+"R" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/powered)
+"S" = (/obj/structure/toilet{tag = "icon-toilet00 (WEST)"; icon_state = "toilet00"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/powered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabbbbaaaaaaaaaaaaaaaaaaaaaaaaccaccaaaa
+aaabbbbbaaaaaaaaaaaaaaaaacaaaaccccaaaaaa
+aaabbbbbbaaaaaaaaaaaaaabaaaaaaccccaaaaaa
+aaaabbbbaaaaaaaaaaaaaaabbbaaaaaaccaaaaaa
+aaaaabbbaaaaaaaaaaaaaaabbbbaaaaaaaaacaaa
+aaaaaaabbaaaccccaaaaaaaaabbaaaaaaaaaaaaa
+aaaaaaaaaacccccccccaaaaaaaaaaaaabbaaaaaa
+aaaaaaaaccbbccccccccccaaaaaaaaabbbcaaaaa
+aaaaaaadddbbccccccccccccaaaaaaaaabbbaaaa
+aaaaaaddeedccbccccccccccbbaaaaaaaabbbaaa
+aaaaccccdddccbbbbbffffbbbbbaaaaaaaaaaaaa
+aacccccdddcccbbbbbfghfbbbbbbaaaaaaaaaaaa
+accccbddddbccbbbfffijffffaabbaaaaaaaaaaa
+addccddddcbccbbffklmmnognaaaaaaaaaaaaaaa
+aaddddddcccccbbfpqrmmnggnaaaaaaaaaaaaaaa
+aaddddddbbccccbffmsmtffffccbaaaaaaaaaaaa
+aaddddddccccccccfmwmxfbbbbcccaaaaaaaaaaa
+aadddccddccccffffijjjfbzAABaaaaaaaaaaaaa
+aaadccccdccbbfCDjmEmFfbGbbbbcaaaaaaaaaaa
+aaaddcbddccbbfmmimmmHfbGbbcccaaaaaaaaaaa
+aaacccdddccccfIJjKmLMMANbbccaaaaaaaaaaaa
+aaaacddccccccfffffOjfbbbbbcaaaaaaaaaaaaa
+aaaaaacccccbbbbbbfPQfbbbbccccaaaaaaaaaaa
+aaaaaaaccccbbbbbbfRSfbbbbccddaaaaaaaaaaa
+aaaaaaaccbbccbbbbffffbbbbcddaaaaaaaaaaaa
+aaaaaccccbbccccccccccccdddddaaaaaaaaaaaa
+aaaaaacccccccccccccccdddddaaaaaaaaaaaaaa
+aaaaaaaacccccccccccdddddaaaaaaaaaaaaaaaa
+aacbaaaaaacccccccdddddaaaaaaaaaaaaaaaaaa
+aaacbbaaacccbbccddddaaaaaaaaaaaaaaaaaaaa
+aacbbcbaaaaaabcdddaaaaaaaaaaaaaaaaaaaaaa
+accbaabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaabbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aabcbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
+
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
index 482c4eee1a3..39faca5f2c3 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
@@ -110,7 +110,7 @@
"cf" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cg" = (/obj/machinery/light{dir = 1; on = 1},/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"ch" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
-"cj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500{pixel_y = 9},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"ci" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500{pixel_y = 9},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"ck" = (/obj/structure/girder/reinforced,/turf/unsimulated/floor/plating/airless,/area/space)
"cl" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (NORTH)"; icon_state = "pipe-j1"; dir = 1},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
"cm" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/rods,/turf/space,/area/ruin/onehalf/hallway)
@@ -139,7 +139,7 @@
"cJ" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cK" = (/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/obj/machinery/door/airlock/glass_command{name = "Bridge"},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cL" = (/obj/item/weapon/crowbar,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
-"cM" = (/obj/structure/safe/floor,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/suit/space/rig/syndi,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/folder/syndicate/blue,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cM" = (/obj/structure/safe/floor,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/folder/syndicate/blue,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
"cN" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cO" = (/obj/structure/lattice,/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/space,/area/ruin/onehalf/hallway)
"cP" = (/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg2"},/area/ruin/onehalf/hallway)
@@ -161,7 +161,7 @@
"df" = (/obj/structure/lattice,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area/space)
"dg" = (/obj/structure/girder/reinforced,/obj/item/stack/sheet/plasteel,/turf/simulated/floor/plating/airless,/area/space)
"dh" = (/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg2"},/area/space)
-"di" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
+"di" = (/obj/structure/grille/broken,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
"dj" = (/obj/structure/grille,/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/ruin/onehalf/hallway)
"dk" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
"dl" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
@@ -182,7 +182,7 @@ aaaaawajaxaTaUagagaVagagagaWagagaXbyaZbaaZbaaZbabbarararbcararaa
aaaaawbdbebfbgbhbhbibgbgbjbhbkblbmbnbobnbobnbobnbobnbpbqbrbsbtaa
aaaaaabubvbvbwbwbvbxbwbwaLbzbAbBbCbnbDbEbDbnbDbEbFbGarbHbGbIbtaa
aaaaaabJajakbKbLbMbNbObPbXbRbSbTbTbTbTbTbTbTbTbTbTbTararbtararaa
-aaaaaaaabUbVbJakbWbXbYawbXbZcacbaacccdcecfcgchbQcjbTawaaaaaaaaaa
+aaaaaaaabUbVbJakbWbXbYawbXbZcacbaacccdcecfcgchbQcibTawaaaaaaaaaa
aaaaaaaaaaaaaaaackaaaabUaxaxclcmcncocpcqcrcscrcrctcuadaaaaaaaaaa
aaaaaaaaaaaaaacvcwcxaaaabYcyczbTbTbTcAcrcBcrcrcrcCcDaiaaaaaaaaaa
aaaaaaaaaaaaaaaaaaawcEaacFcGcHcIcJcKcrcBcLcMcrcNchcDaiaaaaaaaaaa
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm
index 1bab41147dc..2ef82125aae 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm
@@ -62,7 +62,7 @@
"bj" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
"bk" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
"bl" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
-"bm" = (/obj/effect/glowshroom/single,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bm" = (/obj/structure/glowshroom/single,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
"bn" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered)
"bo" = (/turf/simulated/floor/plating,/area/ruin/powered)
"bp" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/ruin/powered)
diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm
index 500720c279f..491938aa3e0 100644
--- a/_maps/map_files/RandomZLevels/academy.dmm
+++ b/_maps/map_files/RandomZLevels/academy.dmm
@@ -33,30 +33,30 @@
"aG" = (/obj/structure/safe/floor,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aI" = (/obj/structure/table/reinforced,/obj/item/device/laser_pointer/upgraded,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
-"aJ" = (/obj/structure/cult/tome,/obj/item/weapon/twohanded/staff,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
+"aJ" = (/obj/structure/cult/tome,/obj/item/weapon/twohanded/staff,/obj/item/weapon/spellbook/oneuse/charge,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aK" = (/obj/structure/stool/bed/chair/wood/wings{dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
-"aL" = (/obj/item/clothing/suit/space/rig/wizard,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
+"aL" = (/obj/item/clothing/suit/space/hardsuit/wizard,/obj/structure/table/woodentable,/obj/item/stack/sheet/mineral/silver{amount = 20},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aN" = (/obj/structure/table/reinforced,/obj/item/weapon/coin/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
-"aO" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"aO" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aP" = (/obj/structure/lattice,/turf/space,/area/space)
"aQ" = (/obj/machinery/door/airlock/gold{locked = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aR" = (/obj/machinery/door/airlock/gold{locked = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aS" = (/turf/simulated/mineral/random/high_chance,/area/awaymission/academy)
"aT" = (/obj/structure/noticeboard,/turf/simulated/wall,/area/awaymission/academy/headmaster)
"aU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
-"aV" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"aV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aW" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aX" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
-"aZ" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"aZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/awaymission/academy/headmaster)
"ba" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/pen/red,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"bb" = (/obj/structure/table/woodentable,/obj/item/weapon/twohanded/staff,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"bc" = (/obj/structure/table/woodentable,/obj/item/weapon/hand_labeler,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"bd" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/invisible,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"be" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"bf" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
-"bg" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"bg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"bh" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/dice/d20,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"bi" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/tea,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"bj" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
@@ -65,7 +65,7 @@
"bm" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"bn" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"bo" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
-"bp" = (/obj/machinery/door/airlock/gold,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"bp" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"bq" = (/obj/machinery/door/airlock/gold,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"br" = (/turf/simulated/floor/plasteel,/area/awaymission/academy/headmaster)
"bs" = (/turf/simulated/wall/r_wall,/area/awaymission/academy/classrooms)
@@ -191,7 +191,7 @@
"dI" = (/obj/item/seeds/replicapod,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"dJ" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"dK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
-"dL" = (/obj/item/seeds/bluespacetomatoseed,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
+"dL" = (/obj/item/seeds/tomato/blue/bluespace,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"dM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"dN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/academy/classrooms)
"dO" = (/obj/machinery/door/airlock/freezer,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/academy/classrooms)
@@ -233,10 +233,10 @@
"ey" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/academy)
"ez" = (/obj/machinery/door/airlock/glass,/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
"eA" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
-"eB" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
+"eB" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"eC" = (/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
"eD" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
-"eE" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
+"eE" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"eF" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/academy/classrooms)
"eG" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/academy/classrooms)
"eH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/academy/classrooms)
@@ -385,18 +385,18 @@
"hu" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
"hv" = (/obj/machinery/power/smes/magical,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
"hw" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
-"hx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
-"hy" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
-"hz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
-"hA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
-"hB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
-"hC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/academy/academyaft)
+"hx" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
+"hy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
+"hz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"hA" = (/obj/machinery/door/airlock/gold,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
+"hB" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/classrooms)
+"hC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms)
"hD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft)
-"hE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/awaymission/academy/academyaft)
+"hE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/classrooms)
"hF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
-"hG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
-"hH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/weapon/caution,/turf/simulated/floor/plasteel{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/awaymission/academy/academyaft)
-"hI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"hG" = (/obj/machinery/door/airlock/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
+"hH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
+"hI" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"hJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"hK" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
"hL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
@@ -441,7 +441,7 @@
"iy" = (/obj/structure/rack,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"iz" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft)
"iA" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft)
-"iB" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/rack,/obj/item/stack/sheet/metal,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"iB" = (/mob/living/simple_animal/hostile/statue,/turf/simulated/floor/plasteel,/area/awaymission/academy/headmaster)
"iC" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"iD" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft)
"iE" = (/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/awaymission/academy/academyaft)
@@ -483,6 +483,7 @@
"jo" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/academy/academyaft)
"jp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel/airless{tag = "icon-white (EAST)"; icon_state = "white"; dir = 4},/area/awaymission/academy/academyaft)
"jq" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/awaymission/academy/academyaft)
+"jr" = (/mob/living/simple_animal/hostile/mimic/crate,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/academy/classrooms)
"js" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/awaymission/academy/academyaft)
"jt" = (/obj/structure/cult/pylon,/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 10},/area/awaymission/academy/academyaft)
"ju" = (/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/academy/academyaft)
@@ -503,7 +504,7 @@
"jJ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaymission/academy/academyaft)
"jK" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/awaymission/academy/academyaft)
"jL" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaymission/academy/academyaft)
-"jM" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"jM" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"jN" = (/obj/machinery/door/airlock/hatch,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
"jO" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
"jP" = (/turf/simulated/wall/r_wall,/area/awaymission/academy/academygate)
@@ -541,6 +542,67 @@
"kv" = (/mob/living/simple_animal/hostile/mimic/crate,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/awaymission/academy/classrooms)
"kw" = (/mob/living/simple_animal/hostile/mimic/crate,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
"kx" = (/mob/living/simple_animal/hostile/statue,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft)
+"ky" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/academy/classrooms)
+"kz" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/mineral/gold{amount = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/academy/classrooms)
+"kA" = (/obj/structure/bookcase,/obj/item/weapon/spellbook/oneuse/summonitem,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms)
+"kB" = (/mob/living/simple_animal/hostile/carp/megacarp{name = "Elmo"},/turf/simulated/mineral/random/high_chance,/area/awaymission/academy)
+"kC" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/rack,/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"kD" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/engine,/area/awaymission/academy/academyaft)
+"kE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms)
+"kF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/classrooms)
+"kG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/academy/classrooms)
+"kH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms)
+"kI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms)
+"kJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms)
+"kK" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms)
+"kL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
+"kM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/academy/classrooms)
+"kN" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
+"kO" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
+"kP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms)
+"kQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/awaymission/academy/classrooms)
+"kR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/awaymission/academy/classrooms)
+"kS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms)
+"kT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/academy/academyaft)
+"kU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/academyaft)
+"kV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/academyaft)
+"kW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"kX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft)
+"kY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"kZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"la" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"lb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"lc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"ld" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/academy/academyaft)
+"le" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft)
+"lf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/awaymission/academy/academyaft)
+"lg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"lh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"li" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"lj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"lk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/weapon/caution,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/awaymission/academy/academyaft)
+"ll" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"lm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"ln" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"lo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"lp" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"lq" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"lr" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"ls" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
+"lt" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/space)
+"lu" = (/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/space)
+"lv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/space)
+"lw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"lx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft)
+"ly" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/academy/academyaft)
+"lz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"lA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
+"lB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/awaymission/academy/academyaft)
+"lC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/grass,/area/awaymission/academy/academygate)
+"lD" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/grass,/area/awaymission/academy/academygate)
+"lE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/academygate)
+"lF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/academy/academygate)
+"lG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/awaymission/academy/academygate)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -572,81 +634,81 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasaJaKaFaLasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaMahahasasasasasasapahakacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNahahahahaOahalanavahafacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahahahahahapahahahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPababababaQababaRababababaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaTaFaFahaFaFapaFaFasabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaFaFaFahaFaUavaFaFaFabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPacaFahahahaVapahahahaWacaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaXahahaYaZbabbahahbcabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPabbdahbebfbgbhbiahahbjabaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaacaFahahahahbkblahahbmacaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaPaPabaFbnaFaFahapaFaFbnboabaPaPabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaPaaaaabasasasasbpbqasasasasabaaaaaPaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaaPaaaaabbrbrbrbrahapbrbrbrbrabaaaaaPaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsbtbubvbvbwbtbsbsbsbsbsbsbsbsbsbsabbrbxbybrahapbrbxbybrababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaabsbsdvbAbBbBbCdvbDbEbFbGbGbGbGbGbGbHasbIbJbKbrahapbrbJbKbLasbMbNbObPbQbRbSbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbUdvbBbBbBbBbVdvbEbWbXbYbZbZcabZbWasbrcbccbrahapbrbrbrbrabcdcecdasascfbTcgchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscidvbBcjbBbBdvdvbEbWbZbZbZbXbZbZbWasbrbrbrbrahapahahahahckclcmcnascocfbTbScpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscqbVbBbBbBbBdvcrbEcsbZbZbZbZbZbZcsasbrctctbrahapcuahcuahabcdcecdcvcwcxbTbTcyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsczdvbBbBbBbBdvdvbEcAcBbZbZbZbZbZcCasbrcDcDbrahcEanananancFbOcGclcHascfbTbScpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscIdvbBbBcJbBdvbVbEcAcKcKcKcKcKcKcCasbrcLbrbrahapbrbrbrbrabcdclcdclcdcfcgbTchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscMdvcNbBbBcOdvbVbEcPcQcQcQcQcQcQcRascSbxbybrahapbrbxbybLascTcdclcUcVcWbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscXcYcZcZcZcZdadvbEdbdcdcdcdcdcdcddasbrbJbKbrahapbrbJbKbrasasasasasasasasasabbsbsbsbsbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebVbVdvcMdvbEdcdcdfdcdfdcdfdcasbrbrbrbrahapbrbrbrbrasdhdidjdkdidididjdidlbEdmdmdnbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdodpdqbVdvdvcMdrbEdcdcdsdcdsdcdsdcasaFaFaFaFahapaFaFaFaFasdtdudvdvdudvdvdvdvdwbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdxdydzcYcYcYdAdvbEdcdcdcdcdfdcdfdcasaFdBdBaFahapaFdBdBaFasdtdvdvdvdvdvdvdCdDdwdEdmdmdmdFbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdGdpdHbVdvdvcMdvbEdcdcdcdcdsdcdsdcasaFdBdBaFahapaFdBdBaFasdtdudvdvdudIdvdJdKdwbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdedededvbVdvcMdvbEdcdcdcdcdcdcdcdcasaFdBdBaFahapaFdBdBaFasdtdvdvdvdvdvdvdLdMdNdOdPdQdmdRbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbEbEbEdSdTbEbEbEdUdUbEbEbEbEbEasasasasasahapasasasasasdtdudvdvdvdVdvdvdWdwbEdXdYdmdRbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdZdZbseaebecedeeefegeheieieieieiejeiegeieieieiekeleieieieibEemenenenenendvdveoepbEdXdYdmeqbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsererbseseteuedeeeieieieieieieieieveieieieieieieieveieieieibEbEbEbEbEbEbEewewbEbEbEbEexbEbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyezbBbBeAdveBdvdveeeiekekekekekekekelekekekekekekekelekekekeibEeCeCeCeDeEeCeCeCeCeFeGeGeHeGbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeIbsbBbBereJeJeJeKeeeiekeLeMekeLeMekeNeMekeLeMekeLeMeleLeMekeObEeCeCeCePeCeCeCeCeCeFeGeGeHeQbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeIbsbBbBereReReReSeeeiekeTeUekeTeUekeVeUekeTeUekeTeUeleTeUekeieWeCeCeCeXeCeDeCeCeCeFeGeGeHeYbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZezbBbBeAdvfadvdveeeiekekekekekekekelekekekfbfcfcfcfdfcfcfcfefffgfgfgfgfgfhfgfgfgfifjfjfkflbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsererbsfmetfnedeeeieieieieieieieieveieieieveieieieieieieieibEeCfofpfqeCeXeCeCeCeFeGeGeGfrbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdZdZbsfsftfuedfvfwfefefefefxeieifyfefefefzekeieiekekeieieibEeCeCeCeCfAeCeCeCeCeFeGeGeGbsbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbsbsbEdSdTbEbEbEbEbEererererbEbEfBfCfDfBfBfDfDfBbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbsbsaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBbBfEfFfGfHfIfIfJbEfKdcdcdcdcdcbEfLfCfDfLfLfDfDfMbEfNfOfPbzbzkvfQfRfSfTdvdvfUbsbsaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfVfWbBfXfYdvdvdvfZgabEdcgbdcgcgcdcgdgegffDfLfLfDfDfLbEggghgigjggcAdvgkdvdvdvdvbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsglbBbBgmfYdvgndvdvgobEdcdfdcdcdcdcgpfLfDfDfLfLfDfDfLbEgggqggggggcAfQfRdvdvfUbsbsaPaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgrgrgrfXfYdvdudvkwgsbEgtdsdcgcgudcgpfLfDfDfLfLfDfDgvbEgwgqggggggcAdvgxdvgybsbsaPaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgzgzgzfXfYdvgAdvgngobEdcgbdcdcdcdcgBgegCgDfLfLfDfDfLbEgggqdggEgGcAgHfRfUbsbsaPaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaabsbBgIbBgmfYkwdudvdugobEdcdfdcgJgKdcbEfLfDfCfLfLfDfDfLbEgggqgLgLgLcAdvgMbsbsaPaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsgNbBbBfXfYdvgndvgngobEdcdsdcdcdcdcgOfDfDgPgegegCgCgCgQgRgSgGgGgTcAgUbsbsaPaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBgIgVgWgXgYgXgYdmbEdcdcdcdcdcdcbEfLfDfCfLfLfDfDfLbEgggggLgLgLcAbsbsaPaaaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZgZgZgZgZgZgZgZgZgZgZfBfBfBfBfBfBfBfBfBhafBfBhbfBfBfBfBfBfBfBfBfBgZgZgZgZgZgZgZgZgZgZgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchdhehehfhghhhigZhjgZhkhlhlhmhlhlhnfDfDfCfDfDfDfDfDhkhlhlhmhlhlhogZhjgZhphqhrhshthuhchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchvhwhehxhlhyhzhAhBhAhChDhDhDhDhDhEgCgChFhGgCgCgCgChChDhDhDhDhDhHhAhIhAhghJhphlhchchKhcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchLhchchMhphphNgZhOgZhkhPhQhRhShTfBhUhUhUfCfDhUhUhUfBhVhWhXhYhZhngZhOgZiaibhphphchchchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchvhwheicidhliegZgZgZfBfBfBfBfBfBfBhUifhUfCfDhUifhUfBfBfBfBfBfBfBgZgZgZighphphphchchKhcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchLhchcihhphpiegZaagZiiiiiiijiiikfBhUifhUfCfDhUifhUfBiiiiijiiiiiigZaagZilhphlhphchchchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhcimhwhehJhphpingZaagZiiiiiiiiiiiiiohUifhUfCfDhUifhUioiiiiiiiiiiiigZaagZipiqhphphchchKhcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchchchchphlhpirgZaagZisiiiiitfBfBfBiuifhUfCfDhUifivfBfBfBiwiiiiixgZaagZiyhphphphchchchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZhphlidhphphlhNgZaagZiiiiiiiiioizfBhUifhUfCfDhUifhUfBiAioiiiiiiiigZaagZiBhlhphphphlhpgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZhphphlhlhpiCgZaagZisiiiiiifBfBfBhUifhUfCfDhUifhUfBfBfBiiiiiiixgZaagZhlhlhphphlhpgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZhphlhphphlgZaPgZiiiiiiiiioiDfBiEifhUfCfDhUifhUfBiAioiiiiiiiigZaPgZhlhphphpiFgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZgZgZiGgZgZaagZisiiiiitfBfBfBhUifhUfCfDhUifhUfBfBfBiwiiiiixgZaagZgZiGgZgZgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZiHiIiJiJgZaPgZiiiiiiiiioiKfBhUhUiLgffDhUhUhUfBiAioiiiiiiiigZaPgZiJiJiIiMgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaagZiJiJiJiJgZaPgZgZgZfBfBfBfBfBfBfBhafBfBhbfBfBfBfBfBfBfBgZgZgZaPgZiJiJiJiJgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaagZiNiNiNiNgZaaaaaagZiOiPiQgeiRgCgChFgCgCgCgCgCgCgeiSiTiUgZaaaaaagZiNiNiNiNgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaSaSaaaaaaaaaaaaaaaaaagZiViWiWiXgZaaaaaaiYhDiZjafLfCfDfDfDfDfDfDfDfDfDfLjbjcjdjeaaaaaagZiViWiWiXgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjfjgjafLjhfBfBjifBfBjifBfBjjfLjbjkjlgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYhDjmjafLfCfDjnhlkxhlhljofDfDfLjbjpjdjqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgFjsjafLfCfDjtjujujujujvfDfDfLjbjwjxgZjyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjzjafLfCjAfDfDfDfDfDfDjAfDfLjbjzgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjBfLjCetjDfDfDfDfDjEetjDfLjBgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZfLjFjGgCgDfDfDfDfDjHfDfLgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZfLfLfLfLfCfDfDfDfLfLfLfLgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZfLjIjJfLfCfDfDfDfLjKjLfLgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjMgZgZgZjNgZgZjOgZgZgZjMgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjPjQjRjSjSjTjQjPjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajUjSjRjSjSjTjSjUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajUjSjRjSjSjTjSjUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajUjVjWjVjVjXjVjUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjPjTjYjZjZjZkajPjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjPjTjTkbjTjTkckdkejPjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjTjTkfkgkckckckhkijTjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahahahaVahapahahahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPababababaQaZabaRababababaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaTaFaFahbgaFapaFaFasabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaFaFaFahbgaUavaFaFaFabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPacaFahahahbpapahahahaWacaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaXahahaYeBbabbahahbcabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPabbdahbebfeEbhbiahahbjabaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaacaFahahahaVbkblahahbmacaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaPaPabaFhxhyhyhzapaFaFbnboabaPaPabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaPaaaaabasasasashAbqasasasasabaaaaaPaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaaPaaaaabbrbrbrbraVapbrbriBbrabaaaaaPaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsbtbubvbvbwbtbsbsbsbsbsbsbsbsbsbsabbrbxbybraVapbrbxbybrababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaabsbsdvbAbBbBbCdvbDbEbFbGbGbGbGbGbGbHasbIbJbKbraVapbrbJbKbLasbMbNbObPbQbRbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbUdvbBbBbBbBbVdvbEbWbXbYbZbZcabZbWasbrcbccbraVapbrbrbrbrabcdcecdasascfbTcgchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscidvbBcjbBbBdvdvbEbWbZbZbZbXbZbZbWasbrbrbrbraVapahahahahckclcmcnascocfbTbTcpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscqbVbBbBbBbBdvcrbEcsbZbZbZbZbZbZcsasbrctctbraVapcuahcuahabcdcecdcvcwcxbTbTcyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsczdvbBbBbBbBdvkwbEcAcBbZbZbZbZbZcCasbrcDcDbraVcEanananancFbOcGclcHascfbTbScpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscIdvbBbBcJbBdvjrbEcAcKcKcKcKcKcKcCasbrcLbrbraVapbrbrbrbrabcdclcdclcdcfcgbTchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscMdvcNbBbBcOdvjrbEcPcQcQcQcQcQcQcRascSbxbybraVapbrbxbybLascTcdclcUcVcWbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscXcYcZcZcZcZdadvbEdbdcdcdcdcdcdcddasbrbJbKbraVapbrbJbKbrasasasasasasasasasabbsbsbsbsbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebVbVdvcMdvbEdcdcdfdcdfdcdfdcasbrbrbrbraVapbrbrbrbrasdhdidjdkdidididjdidlbEdmdmdnbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdodpdqbVdvdvcMdrbEdcdcdsdcdsdcdsdcasaFaFaFaFaVapaFaFaFaFasdtdudvjMdudvdvdvdvdwbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdxdydzcYcYcYdAdvbEdcdcdcdcdfdcdfdcasaFdBdBaFaVapaFdBdBaFasdtdvdvdvdvdvdvdCdDdwdEdmkydmdFbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdGdpdHbVdvdvcMdvbEdcdcdcdcdsdcdsdcasaFdBdBaFaVapaFdBdBaFasdtdudvdvdudIdvdJdKdwbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdedededvbVdvcMdvbEdcdcdcdcdcdcdcdcasaFdBdBaFaVapaFdBdBaFasdtdvdvdvdvdvdvdLdMdNdOdPdQdmdRbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbEbEbEdSdTbEbEbEdUdUbEbEbEbEbEasasasasasaVapasasasasasdtdudvdvdvdVdvdvdWdwbEdXdYdmdRbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdZdZbseaebecedeeefegeheieieihBeiejeiegeieieieihCeleieieieibEemenenenenendvdveoepbEdXdYdmeqbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsererbseseteuedeeeieieieieieihEeieveieieieieieihEeveieieieibEbEbEbEbEbEbEewewbEbEbEbEexbEbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeyezbBhHhGkEhIkEkEkGkFkHkHkHkHkHkIkHkJkHkHkHkHkHkHkKkJkHkHkHkFkMkLkLkLkOkNkPeCeCeCeFeGeGeHeGbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeIbsbBbBereJeJeJeKeeeiekeLeMekeLeMekeNeMekeLeMekeLkQeleLeMekeObEeCeCeCePeCeCeCeCeCeFeGeGeHeQbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeIbsbBbBereReReReSeeeiekeTeUekeTeUekeVeUekeTeUekeTkReleTeUekeieWeCeCeCeXeCeDeCeCeCeFeGeGeHeYbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZezbBbBeAdvfadvdveeeiekekekekekekekelekekekfbfcfckSfdfcfcfcfefffgfgfgfgfgfhfgfgfgfifjfjfkflbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsererbsfmetfnedeeeieieieieieieieieveieieieveieihEeieieieieibEeCfofpfqeCeXeCeCeCeFeGeGeGfrbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdZdZbsfsftfuedfvfwfefefefefxeieifyfefefefzekeihEekekeieieibEeCeCeCeCfAeCeCeCeCeFeGeGeGbsbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbsbsbEdSdTbEbEbEbEbEererererbEbEfBfCfDfBkTfDfDfBbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbsbsaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBbBfEfFfGfHfIfIfJbEfKdcdcdcdcdcbEfLfCfDfLkUfDfDfMbEfNfOfPbzbzkvfQfRfSfTdvdvfUbsbsaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfVfWbBfXfYdvdvdvfZgabEdcgbdcgcgcdcgdgegffDfLkUfDfDfLbEggghgigjggcAdvgkdvdvdvdvbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsglbBbBgmfYdvgndvdvgobEdcdfdcdcdcdcgpfLfDfDfLkUfDfDfLbEgggqggggggcAfQkzdvdvfUbsbsaPaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgrgrgrfXfYdvdudvdvgsbEgtdsdckAgudcgpfLfDfDfLkUfDfDgvbEgwgqggggggcAdvgxdvgybsbsaPaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkBaSaSaSaaaaaaaaaaaaaaaaaabsgzgzgzfXfYdvgAdvgngobEdcgbdcdcdcdcgBgegCgDfLkUfDfDfLbEgggqdggEgGcAgHfRfUbsbsaPaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaabsbBgIbBgmfYdvdudvdugobEdcdfdcgJgKdcbEfLfDfCfLkUfDfDfLbEgggqgLgLgLcAdvgMbsbsaPaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsgNbBbBfXfYdvgndvgngobEdcdsdcdcdcdcgOfDfDgPgekVgCgCgCgQgRgSgGgGgTcAgUbsbsaPaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBgIgVgWgXgYgXgYdmbEdcdcdcdcdcdcbEfLfDfCfLkUfDfDfLbEgggggLgLgLcAbsbsaPaaaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZgZgZgZgZgZgZgZgZgZgZfBfBfBfBfBfBfBfBfBhafBkThbfBfBfBfBfBfBfBfBfBgZgZgZgZgZgZgZgZgZgZgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchdhehehfhghhhigZhjgZhkhlhlhmhlhlhnfDfDfCfDkWfDfDfDhkhlhlhmhlhlhogZhjgZhphqhrhshthuhchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchvhwhekYkXlakZlclblcldlelelelelelflglglilhljlglglgldlelelelelelklclllclnlmlplohchchKhcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchLhchchMhphphNgZhOgZhkhPhQhRhShTfBhUhUhUfCkWhUhUhUfBhVhWhXhYhZhngZhOgZiaibhplqhchchchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchvhwheicidhliegZgZgZfBfBfBfBfBfBfBhUifhUfCkWhUifhUfBfBfBfBfBfBfBgZgZgZighphplrlshchKhcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchLhchcihhphpiegZaagZiiiiiiijiiikfBhUifhUfCkWhUifhUfBiiiiijiiiiiigZaagZilhplulthchchchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhcimhwhehJhphpingZaagZiiiiiiiiiiiiiohUifhUfCkWhUifhUioiiiiiiiiiiiigZaagZipiqlulvlshchKhcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZhchchchchphlhpirgZaagZisiiiiitfBfBfBiuifhUfCkWhUifivfBfBfBiwiiiiixgZaagZiyhpluluhchchchcgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZhphlidhphphlhNgZaagZiiiiiiiiioizfBhUifhUfCkWhUifhUfBiAioiiiiiiiigZaagZkChlluluhphlhpgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZhphphlhlhpiCgZaagZisiiiiiifBfBfBhUifhUfCkWhUifhUfBfBfBiiiiiiixgZaagZhlhlhphphlhpgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZhphlhphphlgZaPgZiiiiiiiiioiDfBiEifhUfCkWhUifhUfBiAioiiiiiiiigZaPgZhlhphphpiFgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZgZgZiGgZgZaagZisiiiiitfBfBfBhUifhUfCkWhUifhUfBfBfBiwiiiiixgZaagZgZiGgZgZgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZiHiIiJiJgZaPgZiiiiiiiiioiKfBhUhUiLgfkWhUhUhUfBiAioiiiiiiiigZaPgZiJiJiIiMgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaagZiJiJiJiJgZaPgZgZgZfBfBfBfBfBfBfBhafBkThbfBfBfBfBfBfBfBgZgZgZaPgZiJkDiJiJgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaagZiNiNiNiNgZaaaaaagZiOiPiQgeiRgCgChFgClwgCgCgCgCgeiSiTiUgZaaaaaagZiNiNiNiNgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaSaSaaaaaaaaaaaaaaaaaagZiViWiWiXgZaaaaaaiYhDiZjafLfCfDfDfDfDkWfDfDfDfDfLjbjcjdjeaaaaaagZiViWiWiXgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjfjgjafLjhfBfBjifBkTjifBfBjjfLjbjkjlgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYhDjmjafLfCfDjnhlkxlxhljofDfDfLjbjpjdjqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgFjsjafLfCfDjtjujulyjujvfDfDfLjbjwjxgZjyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjzjafLfCjAfDfDfDkWfDfDjAfDfLjbjzgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjBfLjCetjDfDfDkWfDjEetjDfLjBgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZfLjFjGgCgDfDkWfDfDjHfDfLgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZfLfLfLfLfCfDkWfDfLfLfLfLgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZfLjIjJfLfClzlAfDfLjKjLfLgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZgZgZgZjNgZlBjOgZgZgZgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjPjQjRjSlCjTjQjPjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajUjSjRjSlCjTjSjUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajUjSjRjSlCjTjSjUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajUjVjWjVlDjXjVjUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjPjTjYjZlEjZkajPjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjPjTjTkbjTlFkckdkejPjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjTjTkfkgkclGkckhkijTjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjTkckckjkkklkckckcjTjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjTkckckmknkokckckcjTjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajPjTjTkckpkqkrkckcjTjTjPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm
index 04512b660bf..55c36a22cf4 100644
--- a/_maps/map_files/RandomZLevels/beach.dmm
+++ b/_maps/map_files/RandomZLevels/beach.dmm
@@ -2,7 +2,7 @@
"ab" = (/turf/unsimulated/beach/water/deep,/area/awaymission/undersea)
"ac" = (/obj/machinery/poolcontroller/seacontroller,/turf/unsimulated/beach/water/deep,/area/awaymission/undersea)
"ad" = (/turf/unsimulated/beach/water/deep/rock_wall,/area/awaymission/undersea)
-"ae" = (/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
+"ae" = (/obj/structure/ladder/dive_point/anchor{id = "pirate"},/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"af" = (/obj/structure/constructshell,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
"ag" = (/obj/structure/stool/bed/chair/wood/wings,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
"ah" = (/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
@@ -46,8 +46,8 @@
"aT" = (/obj/structure/dresser,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
"aU" = (/obj/structure/ladder/dive_point/anchor,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"aV" = (/obj/structure/barricade/wooden,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
-"aW" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
-"aX" = (/obj/item/weapon/spacecash/c500,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
+"aW" = (/obj/structure/grille/broken,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
+"aX" = (/obj/item/stack/spacecash/c500,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"aY" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"aZ" = (/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
"ba" = (/obj/structure/flora/rock,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
@@ -179,6 +179,64 @@
"dw" = (/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
"dx" = (/turf/unsimulated/beach/water/drop/dense,/area/awaymission/beach)
"dy" = (/turf/unsimulated/beach/water/edge_drop,/area/awaymission/beach)
+"dz" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
+"dA" = (/obj/structure/flora/ausbushes/leafybush,/obj/effect/decal/snow/sand/edge{tag = "icon-gravsnow_corner (NORTHWEST)"; name = "rough sand"; icon_state = "gravsnow_corner"; dir = 9},/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dB" = (/obj/effect/decal/snow/sand/edge{tag = "icon-gravsnow_corner (NORTHEAST)"; name = "rough sand"; icon_state = "gravsnow_corner"; dir = 5},/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dC" = (/obj/effect/decal/snow/sand/edge{tag = "icon-gravsnow_corner (EAST)"; name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dD" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dE" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dF" = (/obj/structure/flora/ausbushes/genericbush,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dG" = (/obj/effect/decal/snow/sand/edge{tag = "icon-gravsnow_corner (EAST)"; name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dH" = (/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dI" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/eyepatch,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dJ" = (/obj/structure/table/woodentable,/obj/item/clothing/head/bandana,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dK" = (/obj/item/ship_in_a_bottle,/obj/structure/table/woodentable,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dL" = (/mob/living/simple_animal/hostile/pirate/ranged{loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged)},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dM" = (/obj/structure/table/woodentable,/obj/item/clothing/head/collectable/pirate,/obj/item/stack/sheet/mineral/diamond{amount = 2},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dN" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/uranium{amount = 20},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dO" = (/obj/structure/stool/bed/chair/office/light,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dP" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dQ" = (/obj/structure/stool/bed/chair/office/light,/mob/living/simple_animal/hostile/pirate/ranged{loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged)},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dR" = (/obj/structure/flora/rock/pile,/obj/structure/flora/ausbushes/palebush,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"dS" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/beach)
+"dT" = (/turf/unsimulated/beach/sand,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/awaymission/beach)
+"dU" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/floor/plating/airless,/area/awaymission/beach)
+"dV" = (/turf/unsimulated/beach/sand,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/awaymission/beach)
+"dW" = (/obj/structure/ladder/dive_point/buoy{id = "pirate"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"dX" = (/obj/structure/closet/crate,/obj/item/weapon/gun/energy/laser/retro,/obj/item/weapon/gun/energy/laser/retro,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dY" = (/obj/effect/decal/snow/sand/edge{tag = "icon-gravsnow_corner (NORTH)"; name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/obj/structure/flora/ausbushes/sunnybush,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"dZ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"ea" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/beach)
+"eb" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"ec" = (/obj/machinery/computer,/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"ed" = (/obj/structure/closet/crate,/obj/item/clothing/under/pirate,/obj/item/clothing/under/pirate,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"ee" = (/obj/structure/closet/crate,/obj/item/clothing/suit/pirate_brown,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"ef" = (/obj/effect/overlay/palmtree_r,/obj/structure/flora/ausbushes/sunnybush,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"eg" = (/mob/living/simple_animal/hostile/pirate{loot = list(/obj/effect/landmark/mobcorpse/pirate)},/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"eh" = (/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"ei" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"ej" = (/obj/structure/table/woodentable,/obj/item/clothing/suit/pirate_black,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"ek" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/obj/structure/flora/ausbushes/sunnybush,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"el" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"em" = (/obj/item/weapon/paper,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"en" = (/mob/living/simple_animal/hostile/pirate{loot = list(/obj/effect/landmark/mobcorpse/pirate)},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"eo" = (/obj/structure/flora/grass/green,/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"ep" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"eq" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"er" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/beach)
+"es" = (/obj/item/weapon/stool,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"et" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/awaymission/beach)
+"eu" = (/obj/structure/table/woodentable,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"ev" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/pie,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"ew" = (/obj/structure/flora/rock,/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
+"ex" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/simulated/floor/plating/airless,/area/awaymission/beach)
+"ey" = (/turf/unsimulated/beach/sand,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/awaymission/beach)
+"ez" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/floor/plating/airless,/area/awaymission/beach)
+"eA" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating/airless,/area/awaymission/beach)
+"eB" = (/turf/unsimulated/beach/sand,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/awaymission/beach)
+"eC" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/blood,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"eD" = (/obj/structure/closet/crate/bin,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"eE" = (/obj/structure/closet/crate,/turf/unsimulated/beach/sand,/area/awaymission/beach)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -217,125 +275,125 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadaeadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadadaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeadadadadadaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadafadagagadafadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahahahahahahahadadahaiadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadadaeaeaeaeadaeaeaeaeaeaeaeaeadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahaiajakaiahahahalahamadadanaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadadadaeaeadaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadafahahahahahahahahafadahaiadaoaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeadaeadaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahapapapapapapahahadadadadanaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeadadaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadahahahahahahahahahahadadadaoaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadaeadadaeadadadadadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadarahapapapapapapahahadadadanaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeadaeadaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahahahahahahahahahadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeadadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahapapapapapapahahadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaqaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeadadaeadaeadaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahahahahahahahahasadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeadaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeahahaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahatahahatahahahaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeadaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeahahahahaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadauauadadadadasaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeahahadadahahaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadasasadadadasasasaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadadaeavadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeahawadadahahaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeahahahahaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeahahaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeadadadadadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaqaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadadaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeadadaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadadadaeadadaeadaeaeadaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadadadadadadadaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeadaeaeadaeaeadaeaeaeadaeaeadaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeadaeaeadaeaeadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadaeadadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaxahahahahayadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadazaAazaAahaBadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahahahahadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahahahahadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadasaeaeaeadadadadaCaCadadadadaeaeaeasadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaDaEaFahadaGadadaHaHaHadaIaEaJahahaIaEaJadaHaHaHadadaGadaKaLahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahadaMaNadaeaeaeadahahahahahahahahadaOaeaeadaMahadahahahaEadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahadaCadadaeaPaeadaIaEaJahahaIaEaJadaeaeaeadadaCadahahahaEadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahaCahaQadaeaeaeadahahahahahahahahadaOaeaeadaRahaCahahahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahadaSaTadaeaeaeadaIaEaJahahaIaEaJadaeaeaeadaSaTadahahahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaUaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaCadadadadadaHaHaHadadaVaVahahaVaVadadaHaWaHadadadadadadaCadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeadadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeasadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadadaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeadaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadaeadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadadaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeadaeaeadaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaqaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeadaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeadadaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeadadaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeadaeaeadaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeadadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeadadadaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeadaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadadadadadadadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeadaeadaeadadadaeadaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeadadaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeadaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaXaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadaeaeaqaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeadaeadaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeadaeaeaeadaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadadaeaeaeadadadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeadadadadadadadadadadadadadadadadadaYadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadavadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadadavavadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavadadadadadavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavadadadavavavavavavavavavavadadavavavavavavavavavavavavavavavavadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadafadagagadafadadadadadadadavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahahahahahahahadadahaiadadavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadadavavavavadavavavavavavavavadadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahaiajakaiahahahalahamadadanavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavadadadavavadavavavavavavadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadafahahahahahahahahafadahaiadaoavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavadavadavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahapapapapapapahahadadadadanavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavadadavavavavavavavavavavavadadavadavadavavavavavavavavavavavavavavavavavavavavavavavavavadadadavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadahahahahahahahahahahadadadaoavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavadadadavavavavavavavavavavavavavavadavavavavavavavavavavadavavavadadadavadadavadadadadadavavavavadavavavavavavavavavavavavavavavavavavadadavavavavavavavavavaqavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadarahapapapapapapahahadadadanavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadadadadadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadadavavavadavadavadadadadavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahahahahahahahahahadadadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadavavadavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavadavavavadavadadavadavavavavavavavavavavavavavavavavadavavavadadadadadadadadadadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahapapapapapapahahadadadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavaqavadadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavadavadadavadavadavadadavavavavavavavavavavavavavavadavavavadadavavavavavavavavavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahahahahahahahahasadadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavadavavavavadadadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadadadavavavavavavadadavavavavavavavavavavavavavavavavavadadavavavavavavahahavavavavadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahatahahatahahahavavadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavadavadadadadadadadadavavavavavavavavavavavavavavavavadavavavavavavavavadavadavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavahahahahavavavavadavavavavavadavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavadadadadadauauadadadadasavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavahahadadahahavavavadavavavavavadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadadadadasasadadadasasasavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadadavavadadadadadavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavahawadadahahavavavadavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavadadavavavavavavavahahahahavavavavadavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavahahavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavadadadavavavavadadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadadadavadavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavadadavavavavavavadadadadadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavadadavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadadadavavavaqavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadadavavavavavavadavavavavadavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavadadadavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavavavavavadadadadavadadavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavadadavadadavavavavavavavavavadavavavavaqavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavadavavavavavavadadavavavavavavavavadavavavavavavavavavavavavavadavadadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavadadadavadadavadavavadavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavadadadadadadadavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaqavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavadavavadavavadavavavadavavadavavadadadavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavadavadavavavavadadadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadavadavavadavavadavavavavavavavadadadavavavavavavavavadavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavadadavavavavavavavavadavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadavadadadavavavavavavavavadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadaxahahahahayadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadazaAazaAahaBadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahahahahadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahahahahadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadasavavavadadadadaCaCadadadadavavavasadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadaDaEaFahadaGadadaHaHaHadaIaEaJahahaIaEaJadaHaHaHadadaGadaKaLahahadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahadaMaNadavavavadahahahahahahahahadaOavavadaMahadahahahaEadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahadaCadadavaPavadaIaEaJahahaIaEaJadavavavadadaCadahahahaEadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahaCahaQadavavavadahahahahahahahahadaOavavadaRahaCahahahahadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahadaSaTadavavavadaIaEaJahahaIaEaJadavavavadaSaTadahahahahadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaUavavavavavavavavavavavavavavavavavavavavadadadaCadadadadadaHaHaHadadaVaVahahaVaVadadaHaWaHadadadadadadaCadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadavadadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavasadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadadavavavavavavavadadavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavaqavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavadavavadavadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaqavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavavavavavadavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavadadavadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavadavavavavavavavavadadavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavadavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavadavavavavavavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavadavadavavavavadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavavavavavavavavavavavavavavavavavadavadavavadavavadavadadavavavavavavavavavavavavavavavavavavavavadadavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavavavavavavavavavavavavavavavavadadavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavadavadavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadavavavavavavavavavavavavavavadavavavavadavavavavaqavavavavadavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadavadavavavavavavavavavavavadavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadadadavavavavavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadavavavavavavavavavavadavavadavavavavavavavadavadadadavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadadavadadavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadadavavavavavavadadavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadadavavavavadavavadavadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadadavavavadadadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavadadadadadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavadavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavavavadavavavavavavavavavadavavavavavavavadavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavavavavavavavavavadavavavadavavavavavavavavadadadavadadavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavadadadavavadavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavadavavavavavavavavadavavavavavavavavavavadadadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavadavavavadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavadavavadadadadadadadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavadadadadadadadadadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavadavadavadavadadadavadavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadavavavavavavavavavadadadavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavadavavadavavavavavavavavavavavavadavadavadadavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavadadadavavaeavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadavavavavavavavavadadadavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadavavavavavavavavadadavavavavavadadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadadadadadavadadadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavadadadadavavavdzavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavadavavavavavavavavavadadadadadadadadadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadadadadadadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavaqavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavadavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavadadadavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadaXavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadavavaqavavadadadadadadadadavavavavavavavavavavavavavavavavavavavadavadadavavadadavavavavavavavavavavavavavavavavavavavavavadavavavadavadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadavavavavavadadadadadadadadadavavavavavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavadavadavadavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadavavavavadadadadadadadadadavavavavavavavavavavavavavavavavavadadavavavavavadadavavavavavavavavavavavavavavavavavavavavavadavavavadavadavavavadavavavaqavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavaqavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadavavadadadadadadadadadadavavavavavavavavavavavavavavavavadadadadavavavadavavavavavavavavavavavavavavavavavavavavavavavadadadavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadavavadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavaqavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavavavavavadavavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadadavavavadadadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadadadadadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavadadadadadadadadadadadadadadadadadaYadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -388,30 +446,30 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aZaZbabbbcbdaZaZaZaZbebfbgaZbaaZaZaZbhaZbebibjbjbkaZaZblbjbkaZaZaZaZaZbmbnbnboaZbpaZaZbebjbjbqaZaZaZbrbqaZaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aZbsaZblbtbkbsbsbsbubjbjbjbvbwbxbxbwbjbwbybsbebjbzbxbwbzbjbkbsaZaZbsbabbaZaZbsbAaZaZaZbBbjbkbsbaaZaZaZbsaZaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bsbubCbjbjbDbwbxbxbjbEbzbzbDbFbjbjbEbzbzbjbwbzbjbEbjbjbzbzbFbwbCbwbwbwbxbGbHbwbwbwbxbxbjbjbyaZaZaZbubwbIaZaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bJbBbjbDbzbEbzbjbFbzbjbzbzbtbjbFbzbjbjbDbFbjbFbzbjbzbjbKbjbjbEbjbjbDbzbEbjbfbjbzbLbjbjbzbzbjbwbxbHbzbjbjbxbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bMbebDbjbDbjbNbtbzbzbDbjbjbEbzbFbzbjbtbjbFbFbKbDbjbjbzbjbKbzbjbDbFbLbjbzbjbLbzbjbjbzbDbzbjbzbjbLbEbjbzbjbObjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aZbBbjbKbjbzbfbjbNbjbLbzbjbfbjbfbzbjbjbNbjbjbLbjbjbPbjbLbjbjbQbjbfbjbNbjbNbjbfbjbNbjbjbLbRbfbNbjbjbLbjbjbjbjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bsbebzbDbSbfbTbUbVbWbXbUbVbWbTbUbXbYbVbWbTbVbXbWbVbXbTbZcabXbTcbbVccbXbWcaccbXbTbVbWccbXcbbXbTcabjbLbzbRbibiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aZbBbzbjbjbjbXcdbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcebjcfcdbjbjbjbjbjbjbjbjbjbjbjbjbjbfbzcfcgchbjbKbkbsaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bscibjbzbzbLbWbjcjckclbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbibibibjbjbibibibjbjbibibibjbWbDbjbjbkbsbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bwbjbjbQbjcmbVbjcncocpbjbjbjbjbKbjbjbjbibicqcrcqbibibibibibibibjcsctcucvbecsctcucvbecsctcucvcwbVbfbzbzbkcxaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bSbzbDbjbFchbXbjcyczcAbjbjbjbjbjbjbjbkctcucucucucucucucucucucvbecBcCcDcCbecBcCcDcCbecBcCcDcCbebWchbzbObkaZaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bjbRbjbzbjbjbWbjbjbjbjbjbjbjbjbjbjbjbkcCcEcFcGcHcIcJcKcLcMcNcCbebkcOcPcObebkcOcPcObebkcOcPcObebXbLbQbKbzbCbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bFbjbNbNbzbLbVbjbjbjbjbjbjbjbjbjbjbjbkcOcQcQcQcQcQcQcQcQcQcQcCbebjbwbwbwbjbjbwbwbwbjbjbwbwbwbjccbjbjbLbzbRbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-cRbzbQbFbzbjbWbjbjbjbjbjbjbjbjbjbjbjbkcScQcQcQcQcQcQcQcQcQcQcCbebjbjbjbjbjbjbjbjbFbjbjbjbjbjbjbVbzbzbjbzbjbiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-cTbebObjbjbfcccdbjbzbjbjbjbjbjbjbjbjbkcUcVcWcIcIcIcIcIcIcIcIcObebjbjbFbjbjcXbjbjbjbjbjbjbjbjbjbWbfbjbzbjbkcTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bMbebzbKbzbfbXcYbjbjbjbjbjbjbjbjbjbjbjbwcZcZcZcZcZcZcZcZcZcZbwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbXbzbRbjbDdaaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aZdbbzbjbjbjbWbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjccbLbjbObjbAbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bxbDbjbzbzdcbXbjbjbjddbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbzbjbjbjbjbjbjbjbjbVbzbKbzbDbdbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bjbjbDbjbjbLbVbjbjbjbjbjbjbFdebjbjbjbjbjbjbjbjbjbjbjbjbjbjbFbjbjbjbjbjdfbjbjbjdebjbjbjbjbjbzbjbXbjbEbSbjbybbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bFbEbFbzbjbjbWbjbjbjcXbjbjbjbjbjbjddbjbjdgbjdgbjdgbjdgbjdgbjdgbjbjbjbjbjbjbjbjbjbjdgbjdgbjbjbjbWbNbjbzbjbFbwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bjbjbjbjbjbjdhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjdibjbjbjbjbjbjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-djdjdjdjdjdjdkdjdldjdjdjdmdjdndjdjdjdjdjdjdodjdjdjdjdpdjdjdjdndjdjdjdjdjdpdjdjdqdjdjdpdjdmdjdjdkdjdjdjdjdjdjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aZaZbabbbcbdaZaZaZaZbebfbgaZbaaZaZaZbhaZbebibjbjbkaZaZblbjbkaZaZaZaZaZbmbnbnboaZbpaZaZbebjbjbqaZaZaZbrbqaZaZaZaZaZaZaZbmbnbnboaZbpaZaZbebjbjbqaZaZaZbrbabbbabbbcbdaZaZaZbabbdAdBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aZbsaZblbtbkbsbsbsbubjbjbjbvbwbxbxbwbjbwbybsbebjbzbxbwbzbjbkbsaZaZbsbabbaZaZbsbAaZaZaZbBbjbkbsbaaZaZaZbsaZaZbsaZaZbsbabbaZaZbsbAaZaZaZbBbjbkbsbaaZaZaZaZblaZblbtbkbsaZbsaZblbtdCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bsbubCbjbjbDbwbxbxbjbEbzbzbDbFbjbjbEbzbzbjbwbzbjbEbjbjbzbzbFbwbCbwbwbwbxbGbHbwbwbwbxbxbjbjbyaZaZaZbubwbIaZaZbwbCbwbwbwbxbGbHbwbwbwbxbxbjbjbyaZaZaZbubwbCbjbCbjbjbDbwbsbubCbjbjdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bJbBbjbDbzbEbzbjbFbzbjbzbzbtbjbFbzbjbjbDbFbjbFbzbjbzbjbKbjbjbEbjbjbDbzbEbjbfbjbzbLbjbjbzbzbjbwbxbHbzbjbjbxbwbEbjbjbDbzbEbjbfbjbzbLbjbjbzbzbjbwbxbHbzbjbjbDbjbDbzbEbzbJbBbjbDbzcxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bMbebDbjbDbjbNbtbzbzbDbjbjbEbzbFbzbjbtbjbFbFbKbDbjbjbzbjbKbzbjbDbFbLbjbzbjbLbzbjbjbzbDbzbjbzbjbLbEbjbzbjbObjbjbDbFbLbjbzbjbLbzbjbjbzbDbzbjbzbjbLbEbjbzbDbjbDbjbDbjbNbMbebDbjbDbjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aZbBbjbKbjbzbfbjbNbjbLbzbjbfbjbfbzbjbjbNbjbjbLbjbjbPbjbLbjbjbQbjbfbjbNbjbNbjbfbjbNbjbjbLbRbfbNbjbjbLbjbjbjbzbQbjbfbjbNbjbNbjbfbjbNbjbjbLbRbfbNbjbjbLbjbjbKbjbKbjbzbfaZbBbjbKbjbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bsbebzbDbSbfbTbUbVbWbXbUbVbWbTbUbXbYbVbWbTbVbXbWbVbXbTbZcabXbTcbbVccbXbWcaccbXbTbVbWccbXcbbXbTcabjbLbzbRbidEbTcbbVccbXbWcaccbXbTbVbWccbXcbbXbTcabjbLbzbzbjbzbDbSbfbTbsbebzbDbSdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aZbBbzbjbjbjbXcdbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcebjcfcdbjbjbjbjbjbjbjbjbjbjbjbjbjbfbzcfcgchbjbKdGbsdHbjbjbjbjbjbjbjctcucucucucucvbjctcucucucucucucucucucucucvaZbBbzbjbjbjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bscibjbzbzbLbWbjcjckclbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbibibibjbjbibibibjbjbibibibjbWbDbjbjbkbsbabjbjbjbjbjbjbjcCdrdrdrdrdrcCbjcCdIdKdJbjcOdLbjdLcCdNdMcCbscibjbzbzbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bwbjbjbQbjcmbVbjcncocpbjbjbjbjbKbjbjbjbibicqcrcqbibibibibibibibjcsctcucvbecsctcucvbecsctcucvcwbVbfbzbzbkcxbAbjbjbjbjbjbjbjcCdrdrdrdrdrcCbjcCdObjbjbjdPbjbjbjcObjdQcCbwbjbjbQbjdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bSbzbDbjbFchbXbjcyczcAbjbjbjbjbjbjbjbkctcucucucucucucucucucucvbecBcCcDcCbecBcCcDcCbecBcCcDcCbebWchbzbObkaZdHbjdTdSdUdSdVbjcCdrdrdWdrdrcCbjcCcucucucucvbjbjbjdPbjdXcCbSbzbDbjbFchaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bjbRbjbzbjbjbWbjbjbjbjbjbjbjbjbjbjbjbkcCcEcFcGcHcIcJcKcLcMcNcCbebkcOcPcObebkcOcPcObebkcOcPcObebXbLbQbKbzbCdYbjeadZecebeabjcCdrdrdrdrdrcCbjcCbjbjedeecCdPdPdPctcucucubjbRbjbzbjaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bFbjbNbNbzbLbVbjbjbjbjbjbjbjbjbjbjbjbkcOcQcQcQcQcQcQcQcQcQcQcCbebjbwbwbwbjbjbwbwbwbjbjbwbwbwbjccbjbjbLbzbRefbjeaegeieheabjcOdrdrdrdrdrcObjcCdLbjbjbjcCbjbjbjcCejbjcCbFbjbNbNbzbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+cRbzbQbFbzbjbWbjbjbjbjbjbjbjbjbjbjbjbkcScQcQcQcQcQcQcQcQcQcQcCbebjbjbjbjbjbjbjbjbFbjbjbjbjbjbjbVbzbzbjbzbjekbjelehehehelbjbjbjbjbjembjbjbjcCbjbjbjbjcCbjenbjcCbjdLcCcRbzbQbFbzaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+cTbebObjbjbfcccdbjbzbjbjbjbjbjbjbjbjbkcUcVcWcIcIcIcIcIcIcIcIcObebjbjbFbjbjcXbjbjbjbjbjbjbjbjbjbWbfbjbzbjbkeobjelehehehelbjbjbjepbjbjbjbjbjcCdPcUcUdPcCbjbjbjcCbjbjcCcTbebObjbjdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bMbebzbKbzbfbXcYbjbjbjbjbjbjbjbjbjbjbjbwcZcZcZcZcZcZcZcZcZcZbwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbXbzbRbjbDdadHbjeaeqehereabjbjbjbjesesbjbjbjcObjbjbjbjcObjbjbjcOdPdPcCbMbebzbKbzbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aZdbbzbjbjbjbWbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjccbLbjbObjbAbsbjeaeteteteabjbjbjeseuevesepbjdPbjbjenbjbjbjbjbjbjbjbjcCaZdbbzbjbjaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bxbDbjbzbzdcbXbjbjbjddbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbzbjbjbjbjbjbjbjbjbVbzbKbzbDbdewbjeyexeAezeBbjbjbjeseueCesbjbjdPbjbjbjbjbjbjbjbjbjbjbjcCbxbDbjbzbzdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bjbjbDbjbjbLbVbjbjbjbjbjbjbFdebjbjbjbjbjbjbjbjbjbjbjbjbjbjbFbjbjbjbjbjdfbjbjbjdebjbjbjbjbjbzbjbXbjbEbSbjbzbDbdbjbjbjbjbjbjbjbjbjbjbjbjbjbjcUcucucucucucucucucueEeDcObjbjbDbjbjbLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bFbEbFbzbjbjbWbjbjbjcXbjbjbjbjbjbjddbjbjdgbjdgbjdgbjdgbjdgbjdgbjbjbjbjbjbjbjbjbjbjdgbjdgbjbjbjbWbNbjbzbzbSbjbybjbfbjbNbjbNbjbfbjbNbjbjbLbRbfbNbjbjbLbjbjbKbjbKbfbNbjbFbEbFbzbjaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bjbjbjbjbjbjdhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbzdibjbjbjbjbzbzbFcbbVccbXbWcaccbXbTbVbWccbXcbbXbTcabjbLbzbzbjbzbDbXbTcabjbjbjbjbjaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+djdjdjdjdjdjdkdjdldjdjdjdmdjdndjdjdjdjdjdjdodjdjdjdjdpdjdjdjdndjdjdjdjdjdpdjdjdqdjdjdpdjdmdjdjdkdjdjdjdjdjdjbCbwbwbwbxbGbHbwbwbwbxbxbjbjbyaZaZaZbubwbCbjbCbjbjbjbDbjbDbzbwbxbHaZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdrbjbjbDbzbEbjbfbjbzbLbjbjbzbzbjbwbxbHbzbjbjbDbjbDbzbDbjbDbjbDbzbwbxbHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdrbDbFbLbjbzbjbLbzbjbjbzbDbzbjbzbjbLbEbjbzbDbjbDbjbDbjbDbjbDbjbDbjbLbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
drdrdrdrdrdrdsdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdrdsdrdrdrdrdrdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
index 8f413b01937..62e480cd89e 100644
--- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
+++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
@@ -7,20 +7,20 @@
"ag" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Fore)
"ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Fore)
"ai" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship/Fore)
-"aj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"ak" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
+"aj" = (/mob/living/simple_animal/hostile/carp,/turf/space,/area/space)
+"ak" = (/obj/machinery/porta_turret{lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"al" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"am" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship/Fore)
-"an" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"ao" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Fore)
-"ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"aq" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
+"am" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"an" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Aft)
+"ao" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"aq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"ar" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"as" = (/obj/structure/lattice,/turf/space,/area/space)
-"at" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"au" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Fore)
-"aw" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Fore)
+"at" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"au" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; equipment = 0; lighting = 0; locked = 0; operating = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
+"av" = (/obj/structure/table,/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
+"aw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 0; equipment = 3; locked = 0; operating = 0; req_access = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Aft)
"ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Aft)
"az" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Aft)
@@ -61,7 +61,7 @@
"bi" = (/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bj" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
"bk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore)
-"bl" = (/obj/item/weapon/spacecash/c500,/obj/item/weapon/spacecash/c100,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
+"bl" = (/obj/item/stack/spacecash/c500,/obj/item/stack/spacecash/c100,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
"bm" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Fore)
"bo" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Fore)
@@ -90,7 +90,7 @@
"bL" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bM" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bN" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"bO" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
+"bO" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
"bP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore)
"bQ" = (/turf/simulated/floor/plasteel{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/awaymission/BMPship/Fore)
"bR" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Fore)
@@ -101,6 +101,7 @@
"bW" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"bX" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"bY" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
+"bZ" = (/obj/machinery/seed_extractor,/obj/item/seeds/plump/walkingmushroom,/turf/simulated/floor/plasteel{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship/Midship)
"ca" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"cb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"cc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
@@ -121,8 +122,8 @@
"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cs" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"ct" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cu" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cv" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cu" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cw" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
@@ -130,7 +131,7 @@
"cA" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore)
"cB" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore)
"cC" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
-"cD" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
+"cD" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"cE" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship/Midship)
"cF" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/item/weapon/screwdriver,/obj/item/weapon/paper{info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"; name = "scribbled note"},/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"cG" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
@@ -187,7 +188,7 @@
"dF" = (/obj/effect/landmark{name = "awaystart"},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/BMPship/Aft)
"dG" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/BMPship/Aft)
"dH" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"dI" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 0; equipment = 3; locked = 0; req_access = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"dI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"dJ" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"dK" = (/obj/structure/table,/obj/item/weapon/paper{info = "I'm no scientist, but judging from the design and components, it seems to be some kind of gateway. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."; name = "Captain's log entry"},/turf/simulated/floor/plasteel{tag = "icon-carpet6-0 (EAST)"; icon_state = "carpet6-0"; dir = 4},/area/awaymission/BMPship/Fore)
"dL" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-carpet14-2 (EAST)"; icon_state = "carpet14-2"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -196,21 +197,21 @@
"dO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
"dP" = (/turf/simulated/floor/plasteel{tag = "icon-green (SOUTHWEST)"; icon_state = "green"; dir = 10},/area/awaymission/BMPship/Midship)
"dQ" = (/turf/simulated/floor/plasteel{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship/Midship)
-"dR" = (/obj/machinery/seed_extractor,/obj/item/seeds/walkingmushroommycelium,/turf/simulated/floor/plasteel{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship/Midship)
+"dR" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"; tag = "icon-propulsion (WEST)"},/turf/space,/area/awaymission/BMPship/Aft)
"dS" = (/turf/simulated/floor/plasteel{tag = "icon-green (SOUTHEAST)"; icon_state = "green"; dir = 6},/area/awaymission/BMPship/Midship)
"dT" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Midship)
"dU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"dV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"dW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"dX" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
-"dY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
+"dY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"dZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ea" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"ec" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"ec" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ed" = (/obj/item/device/multitool,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"ee" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{tag = "icon-engine"; icon_state = "engine"},/area/awaymission/BMPship/Aft)
-"ef" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission/BMPship/Aft)
+"ef" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; operating = 0; req_access = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"eg" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
"eh" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel{tag = "icon-carpet5-0 (EAST)"; icon_state = "carpet5-0"; dir = 4},/area/awaymission/BMPship/Fore)
"ei" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-carpet13-1 (EAST)"; icon_state = "carpet13-1"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -228,7 +229,7 @@
"eu" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"ev" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"ew" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"ex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"ex" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"; outputting = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ey" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ez" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"eA" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
@@ -239,7 +240,7 @@
"eF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"eG" = (/obj/machinery/shieldwallgen,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Midship)
"eH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
-"eI" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; req_access = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
+"eI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eJ" = (/turf/simulated/floor/plasteel{tag = "icon-loadingareadirty2 (EAST)"; icon_state = "loadingareadirty2"; dir = 4},/area/awaymission/BMPship/Midship)
"eK" = (/obj/machinery/conveyor{dir = 4; id = "meatConvey1"},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Midship)
"eL" = (/obj/machinery/conveyor{dir = 4; id = "meatConvey1"},/obj/structure/plasticflaps,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Midship)
@@ -252,9 +253,9 @@
"eS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"eT" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"eU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/BMPship/Aft)
-"eV" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"eV" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"; outputting = 0},/obj/structure/cable,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eW" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"eX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"eX" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eY" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"eZ" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-carpet7-3 (EAST)"; icon_state = "carpet7-3"; dir = 4},/area/awaymission/BMPship/Fore)
"fa" = (/obj/structure/stool/bed/chair/office{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-carpet11-12 (EAST)"; icon_state = "carpet11-12"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -275,7 +276,7 @@
"fp" = (/obj/effect/gibspawner/human,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fq" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fr" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"fs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"fs" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ft" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Aft)
"fu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore)
"fv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -289,7 +290,7 @@
"fD" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fE" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fF" = (/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"fG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"fG" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"fH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"fI" = (/turf/simulated/floor/plasteel{tag = "icon-carpetside (SOUTHWEST)"; icon_state = "carpetside"; dir = 10},/area/awaymission/BMPship/Fore)
"fJ" = (/turf/simulated/floor/plasteel{tag = "icon-carpetside (SOUTHEAST)"; icon_state = "carpetside"; dir = 6},/area/awaymission/BMPship/Fore)
@@ -304,8 +305,8 @@
"fS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"fT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"fU" = (/obj/effect/gibspawner/generic,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
-"fV" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"fW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"fV" = (/obj/machinery/porta_turret{check_synth = 1; lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
+"fW" = (/obj/structure/closet,/obj/item/clothing/head/bio_hood,/obj/item/clothing/suit/bio_suit,/obj/item/clothing/gloves/color/black,/turf/simulated/floor/plating,/area/awaymission)
"fX" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/power/port_gen/pacman/super,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"fY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
"fZ" = (/obj/structure/closet,/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -331,7 +332,7 @@
"gt" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"gu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"gv" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"gw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"gw" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plating,/area/awaymission)
"gx" = (/obj/item/stack/sheet/mineral/uranium{amount = 50},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"gy" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/space)
"gz" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore)
@@ -359,7 +360,7 @@
"gV" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"gW" = (/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"gX" = (/obj/structure/reagent_dispensers,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
-"gY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
+"gY" = (/obj/machinery/porta_turret{check_synth = 1; lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"gZ" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship/Aft)
"ha" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/awaymission/BMPship/Fore)
"hb" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Fore)
@@ -439,19 +440,39 @@
"ix" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iy" = (/obj/item/weapon/caution,/turf/simulated/floor/plating/airless,/area/awaymission)
"iz" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating/airless,/area/awaymission)
-"iA" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
+"iA" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"iB" = (/obj/structure/sink{dir = 2},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iC" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
"iD" = (/obj/item/clothing/gloves/color/yellow,/turf/space,/area/awaymission)
"iE" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission)
"iF" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission)
-"iG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"iH" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"iI" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"iJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore)
-"iK" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore)
-"iL" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
+"iG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"iH" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"iI" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"iJ" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"iK" = (/turf/simulated/floor/plating,/area/awaymission)
+"iL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/awaymission)
"iM" = (/turf/simulated/mineral/random/high_chance_clown,/area/awaymission)
+"iN" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/awaymission)
+"iO" = (/obj/item/ammo_casing{pixel_y = 3},/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plating,/area/awaymission)
+"iP" = (/obj/effect/decal/cleanable/blood/drip,/obj/item/clothing/mask/gas/syndicate,/turf/simulated/floor/plating,/area/awaymission)
+"iQ" = (/obj/machinery/door/airlock/external{name = "Crackden Airlock"},/turf/simulated/floor/plating,/area/awaymission)
+"iR" = (/obj/machinery/door/airlock/external{name = "Plain Airlock"},/turf/simulated/floor/plating,/area/awaymission)
+"iS" = (/mob/living/simple_animal/hostile/carp,/turf/simulated/floor/plating/airless/asteroid,/area/awaymission)
+"iT" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
+"iU" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plating,/area/awaymission)
+"iV" = (/obj/item/ammo_casing{pixel_y = 3},/turf/simulated/floor/plating,/area/awaymission)
+"iW" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"iX" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/turf/simulated/floor/plating,/area/awaymission)
+"iY" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/awaymission)
+"iZ" = (/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/plating,/area/awaymission)
+"ja" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave,/turf/simulated/floor/plating,/area/awaymission)
+"jb" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plating,/area/awaymission)
+"jc" = (/obj/machinery/chem_master,/turf/simulated/floor/plating,/area/awaymission)
+"jd" = (/obj/machinery/floodlight{in_use = 1},/turf/simulated/floor/plating,/area/awaymission)
+"je" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaymission)
+"jf" = (/turf/space,/area/crew_quarters/bar)
+"jg" = (/turf/space,/area/exploration/methlab)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -501,11 +522,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajakalamanaoawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapalalaqararaoawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaatakauamarararavawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaCaxaxayaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamakezdhaoancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaajaaaaaaapezezeybdbdancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaaqakatdhbdbdbdcWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaEaxaxaxaxaxaxaxaxaxayaxaxaxazaAaBaCazazaxaDcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaVaVaVaVaWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasaXaYaHaHaZaHaHaHbaaHaHbbbcbdbdbebdbdbfbgbhbdbibjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -513,42 +534,42 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaEaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYaHbWbYaHaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCcDcCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUcScVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCaucCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUavcVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdododIdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQdRdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVdHdYdZeaebecbbedeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciegegegeheiejekelddemeneoeoeoeoeoeodWcMddcMepcMeqerererererererepcMaPdjesdjdjdjdjdjetaPeuevbdewbdexeyezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAeBeCegcYcZcYcZeDeEeoeFererererereGeHcMeIcMepeJeKeLeKeKeKeKeMeNeOePbbdjeseQeReReSdjdjaPeTeUbdeVeWeXbJezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegfbdtdsdtfcdTcMcMerfdfefdfffgepfhepcMepcMfierererererererepfjfkflfmfnfofpfqdjdjaPfreUbdewbdfscWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdfGcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfIfJegdsfKdsdtcCfLcMcMerfMfdfgfNfgepcMfOcMepcMcMfPcMcMcMcMcMcMfQdVfRfSfTfDfUfofEdjdjaPfFevfofVeWfWbbfXeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUegegegegfYegfZgadTemcMerfdfggbffgcepcMdTcMepcMeqerererererererepgdgeflfmfngffoggdjetaPeuevfobdbddJeyezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaghahagaggigjagagaggkcMcMerfgfgfgglfgepgmddcMepgngogpgqgqgqgqeMeNeOgrbJdjesgsgtgtgudjdjaPdHeUbdgvbdgwbJgxeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdodoawdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQbZdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVcDdIdZeaebdYbbedeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciegegegeheiejekelddemeneoeoeoeoeoeodWcMddcMepcMeqerererererererepcMaPdjesdjdjdjdjdjetaPeuevbdecbdbKeyezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAeBeCegcYcZcYcZeDeEeoeFererererereGeHcMefcMepeJeKeLeKeKeKeKeMeNeOePbbdjeseQeReReSdjdjaPeTeUbdexeWeIbJezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegfbdtdsdtfcdTcMcMerfdfefdfffgepfhepcMepcMfierererererererepfjfkflfmfnfofpfqdjdjaPfreUbdewbdeccWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdewcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfIfJegdsfKdsdtcCfLcMcMerfMfdfgfNfgepcMfOcMepcMcMfPcMcMcMcMcMcMfQdVfRfSfTfDfUfofEdjdjaPfFevfoeVeWeXbbfXeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUegegegegfYegfZgadTemcMerfdfggbffgcepcMdTcMepcMeqerererererererepgdgeflfmfngffoggdjetaPeuevfobdbdbdeyezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaghahagaggigjagagaggkcMcMerfgfgfgglfgepgmddcMepgngogpgqgqgqgqeMeNeOgrbJdjesgsgtgtgudjdjaPdHeUbdgvbdfsbJgxeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygzgAgBgCgDgEgFcEcMcMererererereGgGcMdxcMepcMgHerererererererepcMaPdjgIgJgJgJgKdjgLaPdHevdqdogMgNcWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasgOgPgAgQgRgScEcMcMcMcMcMcMcMcMgTcMdTcMgUeoeoeoeoeoeodVdVdVeFcMdhgVdjdjdjdjesgWgXaPdHgYfogZayaxazftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaasaaaaaaaahahbhcgBgScEcMhdcMcMcMcMhecMhfhecNcMhdcMcMcMhdcMcMcMcMhdcMcMcWaxaAhgaCaAhhaCaxazaAhiaCcnftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaasgOgPgAgQgRgScEcMcMcMcMcMcMcMcMgTcMdTcMgUeoeoeoeoeoeodVdVdVeFcMdhgVdjdjdjfGesgWgXaPdHecfogZayaxazftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaajasaaaaaaaahahbhcgBgScEcMhdcMcMcMcMhecMhfhecNcMhdcMcMcMhdcMcMcMcMhdcMcMcWaxaAhgaCaAhhaCaxazaAhiaCcnftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjacaaasaahkasaahlagaghmhnhoclclclclclclclhphqhrhsclclclclclclclclclclclclclbVdqdqdqdqhtdphuhvhwhtevhxaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacaaaaaaaaaahyakhzcihAhBhChDgzhEgBhFhjhjhjhjhGacachHhIachJhHachKhLhMhNhOaPhPdqbddqdqhQhRhRhRhRhShTaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhUaaaaaaaaaahValalhWhXgOhXhChYhXhChjhjhjhjhjhjhFachZiahHibicididhHhHhHhHbbhudqdqiedqifdqiedqdqdqigaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjacihaaaaaaaaaaiiakalbUgBgBhCgzhCgBhChFhjhjhjhFhjhjhjacijacididididhHhHikiliminininininiodqdqdqaCaxaxbVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaipacafagagiqagirhjhChFhjhjhjhjhjhjhjhjhjhjhjhIhZididibidhHishHhHbJdqdqitiudqiedqiedqiviwixaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhFachZhHhHhKiyiyiyizaPiAiAdqbddqdqdqdqdqbJiBiCftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacaaaaajaaaahyfVhzcihAhBhChDgzhEgBhFhjhjhjhjhGacachHhIachJhHachKhLhMhNhOaPhPdqbddqdqhQhRhRhRhRhShTaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhUajaaaaaaaahValalhWhXgOhXhChYhXhChjhjhjhjhjhjhFachZiahHibicididhHhHhHhHbbhudqdqiedqifdqiedqdqdqigaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjacihaaaaaaaaaaiifValbUgBgBhCgzhCgBhChFhjhjhjhFhjhjhjacijacididididhHhHikiliminininininiodqdqdqaCaxaxbVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaajipacafagagiqagirhjhChFhjhjhjhjhjhjhjhjhjhjhjhIhZididibidhHishHhHbJdqdqitiudqiedqiedqiviwixaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhFachZhHhHhKiyiyiyizaPiAiAdqbddqdqdqdqdqbJiBiCftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiDacacachjhjhjhjhjhjhjhjhjhjhjhFhjhjhjhjhjhjhjhjhFiEiFiFiFiFiFiFiFazaxaxaxayaAhgaCayayazaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaiGakhzciiHariIaviJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaapalalaqarariKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaiLakalbUaniKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaafagagiqagiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjfWhjgwhjhjhjhjhjhjhjacacaaaaaaiGgYiHbbiIbdiJcWftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjiLiKiKiNiPiOiKiQiKiKiRaciSaaaaaaapezezeybdbdiTftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjiUiKiKiViKiKiKiKhjhjhjhjacacaaaaaaiWgYezbJaoiTftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjiXiKiYiKiKiKiKiZiKhjacacacaaajaaaaaCaxaxazaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjjaiKiKjbjciKjdhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjjejdhjhjiKhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjiMhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjhjhjhjiMhjhjhjhjhjhjhjhjhjhjhjacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjiMhjhjiMhjhjhjhjhjhjhjhjhjacacacachjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacachjhjhjhjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjacacacacacachjhjhjhjhjhjhjhjhjhjhjhjacacacachjhjhjhjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacachjhjhjhjhjhjhjhjacacacacaaaaaahjhjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjhjhjhjiMhjhjhjhjhjhjhjhjhjhjhjacacacacaaaaaaaajfaaaaaajgjgaajgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjiMhjhjiMhjhjhjhjhjhjhjhjhjacacacachjhjaaaaaaaaaaaajgjgjgjgjgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacachjhjhjhjhjaaaaaaaaaajgjgjgjgaajgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjacacacacacachjhjhjhjhjhjhjhjhjhjhjhjacacacachjhjhjhjhjaaaaaaaaaajgjgjgjgaajgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacachjhjhjhjhjhjhjhjacacacacaaaaaahjhjhjaaaaaaaaaaaajgjgjgaaaajgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaajgjgjgaaaajgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm
index 2cc70f5d3ee..ead97277ac7 100644
--- a/_maps/map_files/RandomZLevels/centcomAway.dmm
+++ b/_maps/map_files/RandomZLevels/centcomAway.dmm
@@ -13,12 +13,12 @@
"am" = (/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"an" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"ao" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
-"ap" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
+"ap" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"aq" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"ar" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"as" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"at" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/cafe)
-"au" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/cafe)
+"au" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/cafe)
"av" = (/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/cafe)
"aw" = (/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"ax" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/awaymission/centcomAway/cafe)
@@ -40,7 +40,7 @@
"aN" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/centcomAway/cafe)
"aO" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/centcomAway/cafe)
"aP" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
-"aQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/cafe)
+"aQ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"; dir = 2},/area/awaymission/centcomAway/cafe)
"aR" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/cafe)
"aS" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"aT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/maint)
@@ -60,7 +60,7 @@
"bh" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"; dir = 2},/area/awaymission/centcomAway/cafe)
"bi" = (/obj/machinery/door/airlock/freezer,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/awaymission/centcomAway/cafe)
"bj" = (/obj/machinery/chem_dispenser,/obj/item/weapon/storage/box/beakers,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
-"bk" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
+"bk" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"; dir = 2},/area/awaymission/centcomAway/cafe)
"bl" = (/obj/structure/rack,/obj/item/clothing/suit/fire,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"bm" = (/obj/structure/lattice,/turf/space,/area/space)
"bn" = (/obj/machinery/door/poddoor{id_tag = "XCCHangar1"; name = "XCC Main Hangar"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/awaymission/centcomAway/hangar)
@@ -95,14 +95,14 @@
"bQ" = (/obj/structure/disposalpipe/segment,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/awaymission/centcomAway/cafe)
"bR" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/centcomAway/cafe)
"bS" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/awaymission/centcomAway/cafe)
-"bT" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/awaymission/centcomAway/maint)
+"bT" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "centcomawaysolar"; name = "Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/awaymission/centcomAway/maint)
"bU" = (/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
"bV" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/awaymission/centcomAway/hangar)
"bW" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/awaymission/centcomAway/hangar)
"bX" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"bY" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/centcomAway/hangar)
"bZ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
-"ca" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
+"ca" = (/obj/machinery/hydroponics/constructable,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/cafe)
"cb" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"cc" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/awaymission/centcomAway/hangar)
"cd" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f10"; layer = 2},/area/awaymission/centcomAway/hangar)
@@ -115,8 +115,8 @@
"ck" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/centcomAway/cafe)
"cl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"cm" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
-"cn" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating/airless,/area/awaymission/centcomAway/maint)
-"co" = (/turf/simulated/floor/plating/airless,/area/awaymission/centcomAway/maint)
+"cn" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"co" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"cp" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/awaymission/centcomAway/hangar)
"cq" = (/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"cr" = (/obj/item/weapon/pen,/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/awaymission/centcomAway/cafe)
@@ -140,7 +140,7 @@
"cJ" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/centcomAway/cafe)
"cK" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/centcomAway/cafe)
"cL" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/awaymission/centcomAway/hangar)
-"cM" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
+"cM" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/centcomAway/cafe)
"cN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"cO" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"cP" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
@@ -153,7 +153,7 @@
"cW" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/cafe)
"cX" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/awaymission/centcomAway/cafe)
"cY" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
-"cZ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
+"cZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"da" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"db" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/granted,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"dc" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/window/northright,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
@@ -191,7 +191,7 @@
"dI" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"dJ" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"dK" = (/obj/structure/table,/obj/machinery/processor{pixel_x = 0; pixel_y = 10},/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
-"dL" = (/obj/structure/stool/bed,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/centcomAway/hangar)
+"dL" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/awaymission/centcomAway/cafe)
"dM" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/awaymission/centcomAway/cafe)
"dN" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"dO" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/centcomAway/cafe)
@@ -201,7 +201,7 @@
"dS" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/centcomAway/hangar)
"dT" = (/obj/structure/closet/crate,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/centcomAway/hangar)
"dU" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/centcomAway/hangar)
-"dV" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/centcomAway/cafe)
+"dV" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/centcomAway/maint)
"dW" = (/turf/simulated/floor/plating,/area/awaymission/centcomAway/cafe)
"dX" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/cafe)
"dY" = (/turf/simulated/shuttle/wall{icon_state = "swall2"; dir = 2},/area/awaymission/centcomAway/hangar)
@@ -229,7 +229,7 @@
"eu" = (/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"ev" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"ew" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
-"ex" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
+"ex" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"ey" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"ez" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"eA" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
@@ -256,13 +256,13 @@
"eV" = (/obj/structure/table/reinforced,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
"eW" = (/obj/machinery/implantchair,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
"eX" = (/obj/structure/table/reinforced,/obj/item/weapon/extinguisher/mini,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
-"eY" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
-"eZ" = (/obj/machinery/clonepod,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
+"eY" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
+"eZ" = (/obj/machinery/chem_master,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
"fa" = (/obj/machinery/computer/cloning,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
"fb" = (/obj/machinery/dna_scannernew,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
"fc" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"fd" = (/obj/machinery/telecomms/relay/preset/ruskie,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/awaymission/centcomAway/general)
-"fe" = (/obj/machinery/door/airlock/engineering{name = "Engineering Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"fe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"ff" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
"fg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"fh" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
@@ -274,11 +274,11 @@
"fn" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"fo" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"fp" = (/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 10},/area/awaymission/centcomAway/general)
-"fq" = (/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/centcomAway/general)
+"fq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/awaymission/centcomAway/maint)
"fr" = (/obj/structure/table/reinforced,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/centcomAway/general)
"fs" = (/obj/structure/dispenser,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/centcomAway/general)
"ft" = (/turf/simulated/floor/plasteel{tag = "icon-blackcorner (NORTH)"; icon_state = "blackcorner"; dir = 1},/area/awaymission/centcomAway/general)
-"fu" = (/turf/simulated/floor/plasteel{tag = "icon-blackcorner (EAST)"; icon_state = "blackcorner"; dir = 4},/area/awaymission/centcomAway/general)
+"fu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/centcomAway/maint)
"fv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
"fw" = (/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
"fx" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
@@ -286,16 +286,16 @@
"fz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
"fA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
"fB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
-"fC" = (/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"fC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"fD" = (/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
-"fE" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"fE" = (/obj/machinery/power/solar_control{id = "centcomawaysolar"; name = "Solar Control"; track = 1},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/space)
"fF" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
"fG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"fH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"fI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"fJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"fK" = (/obj/structure/sign/redcross,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
-"fL" = (/obj/machinery/door/airlock/glass{name = "Med-Sci"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
+"fL" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/awaymission/centcomAway/cafe)
"fM" = (/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"fN" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"fO" = (/obj/machinery/computer/scan_consolenew,/obj/item/weapon/dnainjector/telemut/darkbundle,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
@@ -308,14 +308,14 @@
"fV" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"fW" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"fX" = (/obj/machinery/door/window/northleft,/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
-"fY" = (/obj/machinery/power/smes,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
-"fZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
-"ga" = (/obj/machinery/power/smes,/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
-"gb" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/centcomAway/general)
-"gc" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general)
-"gd" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/centcomAway/general)
-"ge" = (/turf/simulated/floor/plasteel{tag = "icon-purplecorner (EAST)"; icon_state = "purplecorner"; dir = 4},/area/awaymission/centcomAway/general)
-"gf" = (/turf/simulated/floor/plasteel{tag = "icon-purple (NORTH)"; icon_state = "purple"; dir = 1},/area/awaymission/centcomAway/general)
+"fY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"fZ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
+"ga" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/centcomAway/maint)
+"gb" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/awaymission/centcomAway/maint)
+"gc" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/awaymission/centcomAway/maint)
+"gd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"ge" = (/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Maint APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"gf" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/centcomAway/cafe)
"gg" = (/obj/structure/sign/science,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
"gh" = (/obj/machinery/door/window/eastright,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"gi" = (/obj/machinery/door/window/northleft,/obj/structure/stool/bed/chair,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
@@ -329,7 +329,7 @@
"gq" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
"gr" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"gs" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
-"gt" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/centcomAway/general)
+"gt" = (/turf/space,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gu" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/centcomAway/general)
"gv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"gw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
@@ -337,13 +337,13 @@
"gy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"gz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"gA" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/centcomAway/general)
-"gB" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/centcomAway/general)
+"gB" = (/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Kitchen APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "bar"; dir = 2},/area/awaymission/centcomAway/cafe)
"gC" = (/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"gD" = (/obj/structure/table,/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"gE" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"gF" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"gG" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/centcomAway/hangar)
-"gH" = (/obj/structure/table,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/centcomAway/hangar)
+"gH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
"gI" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"gJ" = (/turf/simulated/floor/plasteel{icon_state = "greencorner"; dir = 4},/area/awaymission/centcomAway/general)
"gK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
@@ -371,19 +371,19 @@
"hg" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"hh" = (/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"hi" = (/obj/structure/closet/crate/trashcart,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
-"hj" = (/turf/simulated/floor/plasteel{tag = "icon-blackcorner (WEST)"; icon_state = "blackcorner"; dir = 8},/area/awaymission/centcomAway/general)
+"hj" = (/obj/machinery/door/airlock/centcom,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"; dir = 2},/area/awaymission/centcomAway/cafe)
"hk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"hl" = (/obj/machinery/computer/robotics,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"hm" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"hn" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"ho" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
-"hp" = (/turf/simulated/floor/plasteel{tag = "icon-blackcorner"; icon_state = "blackcorner"},/area/awaymission/centcomAway/general)
+"hp" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
"hq" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
"hr" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
"hs" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
-"ht" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/awaymission/centcomAway/hangar)
+"ht" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/awaymission/centcomAway/hangar)
"hu" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/awaymission/centcomAway/hangar)
-"hv" = (/obj/structure/table,/obj/item/weapon/paper/ccaMemo,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"hv" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/carpet,/area/awaymission/centcomAway/cafe)
"hw" = (/obj/item/xenos_claw,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"hx" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "103"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"hy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
@@ -395,14 +395,14 @@
"hE" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"hF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
"hG" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
-"hH" = (/obj/structure/table,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"hH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/cafe)
"hI" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"hJ" = (/obj/structure/closet/body_bag,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"hK" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
"hL" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/PDAs,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"hM" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"hN" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
-"hO" = (/obj/machinery/computer/communications,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"hO" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/centcomAway/cafe)
"hP" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"hQ" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/blue,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"hR" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
@@ -412,7 +412,7 @@
"hV" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/courtroom)
"hW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/courtroom)
"hX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
-"hY" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/awaymission/centcomAway/hangar)
+"hY" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/awaymission/centcomAway/hangar)
"hZ" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/awaymission/centcomAway/hangar)
"ia" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
"ib" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
@@ -433,7 +433,7 @@
"iq" = (/obj/structure/rack,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/centcomAway/hangar)
"ir" = (/obj/structure/rack,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
"is" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
-"it" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"it" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
"iu" = (/obj/structure/table,/obj/item/clothing/glasses/welding,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
"iv" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"},/area/awaymission/centcomAway/general)
"iw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/centcomAway/general)
@@ -460,7 +460,7 @@
"iR" = (/obj/structure/rack,/obj/item/clothing/glasses/night,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
"iS" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
"iT" = (/obj/structure/bookcase,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
-"iU" = (/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"iU" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"iV" = (/obj/structure/rack,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
"iW" = (/obj/structure/bookcase,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
"iX" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "XCCsec3"; name = "XCC Main Access Shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/awaymission/centcomAway/general)
@@ -495,7 +495,7 @@
"jA" = (/obj/structure/table/woodentable{dir = 9},/obj/item/clothing/mask/cigarette/cigar/havana,/obj/item/weapon/reagent_containers/food/drinks/sillycup,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
"jB" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
"jC" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/storage/backpack/satchel,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
-"jD" = (/obj/machinery/computer/card/centcom,/obj/item/weapon/card/id/centcom,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"jD" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"jE" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"jF" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "XCCsec3"; name = "XCC Shutter 3 Control"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"jG" = (/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/centcomAway/general)
@@ -511,15 +511,15 @@
"jQ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"jR" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/hangar)
"jS" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
-"jT" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
-"jU" = (/obj/structure/safe/floor,/obj/item/clothing/under/rank/centcom_officer,/obj/item/clothing/suit/storage/det_suit,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"jT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/cafe)
+"jU" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/centcomAway/cafe)
"jV" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"jW" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
-"jX" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
+"jX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHWEST)"; icon_state = "vault"; dir = 9},/area/awaymission/centcomAway/hangar)
"jY" = (/obj/item/weapon/stamp/granted,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/centcomAway/general)
"jZ" = (/obj/structure/table,/obj/item/weapon/firstaid_arm_assembly,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"ka" = (/obj/structure/table,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
-"kb" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
+"kb" = (/obj/structure/stool/bed/chair{dir = 1},/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"kc" = (/obj/structure/table,/obj/item/device/mmi/radio_enabled,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"kd" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"ke" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
@@ -539,8 +539,8 @@
"ks" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"kt" = (/obj/machinery/door/poddoor/shutters{id_tag = "XCCFerry"; name = "XCC Ferry Hangar"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/awaymission/centcomAway/hangar)
"ku" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
-"kv" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/centcomAway/general)
-"kw" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/centcomAway/general)
+"kv" = (/obj/machinery/gibber,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/awaymission/centcomAway/cafe)
+"kw" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/cafe)
"kx" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"ky" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/hangar)
"kz" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet/ccaInfo,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
@@ -569,20 +569,20 @@
"kW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"kX" = (/obj/structure/table,/obj/item/device/flashlight/flare,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
"kY" = (/obj/structure/table,/obj/item/device/flashlight/flare,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
-"kZ" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"kZ" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"la" = (/obj/structure/table/reinforced,/obj/item/weapon/paper/pamphlet/ccaInfo,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/centcomAway/general)
"lb" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "XCCsec1"; name = "XCC Shutter 1 Control"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"lc" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"ld" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/general)
"le" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
-"lf" = (/obj/item/weapon/paper_bin,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"lf" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"lg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"lh" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/awaymission/centcomAway/general)
-"li" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/awaymission/centcomAway/general)
+"li" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
"lj" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/general)
"lk" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"ll" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
-"lm" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/centcomAway/general)
+"lm" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
"ln" = (/obj/item/weapon/clipboard,/obj/structure/table,/obj/item/device/taperecorder,/obj/item/weapon/stamp/granted,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/general)
"lo" = (/obj/machinery/door/window/northright{icon_state = "right"; dir = 2},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"lp" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "XCCsec2"; name = "XCC Shutter 2 Control"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
@@ -592,10 +592,11 @@
"lt" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/awaymission/centcomAway/general)
"lu" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/stamp/granted,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/general)
"lv" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/awaymission/centcomAway/general)
-"lw" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/awaymission/centcomAway/general)
+"lw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
"lx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"ly" = (/obj/structure/table/woodentable,/obj/item/clothing/accessory/medal,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
"lz" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
+"lA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"lB" = (/obj/structure/table/woodentable,/obj/item/clothing/accessory/medal/gold,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
"lC" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"lD" = (/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/thunderdome)
@@ -620,9 +621,10 @@
"lW" = (/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"lX" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"lY" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
-"lZ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
+"lZ" = (/obj/structure/stool/bed,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/centcomAway/hangar)
"ma" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"mb" = (/obj/structure/table,/obj/item/weapon/lipstick,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"mc" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/centcomAway/hangar)
"md" = (/obj/machinery/icecream_vat,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome)
"me" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mf" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
@@ -645,13 +647,13 @@
"mw" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
"mx" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
"my" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
-"mz" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/obj/item/weapon/shield/riot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"mz" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-redfull"; icon_state = "redfull"},/area/awaymission/centcomAway/cafe)
"mA" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
"mB" = (/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
"mC" = (/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
"mD" = (/obj/machinery/door/poddoor{id_tag = "XCCtdome"; name = "XCC Thunderdome"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/awaymission/centcomAway/thunderdome)
"mE" = (/obj/machinery/igniter,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
-"mF" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/obj/item/weapon/shield/riot,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"mF" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"mG" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
"mH" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/awaymission/centcomAway/thunderdome)
"mI" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/centcomAway/thunderdome)
@@ -679,7 +681,7 @@
"ne" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/awaymission/centcomAway/thunderdome)
"nf" = (/obj/machinery/portable_atmospherics/scrubber/huge,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/awaymission/centcomAway/thunderdome)
"ng" = (/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
-"nh" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"nh" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general)
"ni" = (/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nj" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nk" = (/obj/structure/table/woodentable,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
@@ -687,18 +689,157 @@
"nm" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome Administration"; opacity = 1; req_access_txt = "102"},/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nn" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"no" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
-"np" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"np" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/adv,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
"nq" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nr" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"ns" = (/obj/structure/closet/secure_closet/bar,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nt" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
-"nu" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/popcorn,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"nu" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/firstaid,/obj/item/weapon/storage/firstaid,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
"nv" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"nx" = (/obj/machinery/door_control{id = "XCCtdomemelee"; name = "XCC Thunderdome Melee!"},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
"ny" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
"nz" = (/obj/machinery/door_control{id = "XCCtdomeguns"; name = "XCC Thunderdome Guns!"},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
"nA" = (/obj/machinery/door_control{id = "XCCtdome"; name = "XCC Thunderdome Go!"},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
+"nB" = (/obj/machinery/clonepod,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/centcomAway/general)
+"nC" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"nD" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
+"nE" = (/obj/structure/table,/obj/item/device/radio/off,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
+"nF" = (/obj/machinery/door/airlock/glass{name = "Med-Sci"; req_access_txt = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
+"nG" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
+"nH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"nI" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"nJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"nK" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/courtroom)
+"nL" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
+"nM" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
+"nN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
+"nO" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
+"nP" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/centcomAway/courtroom)
+"nQ" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/centcomAway/hangar)
+"nR" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-blackcorner (WEST)"; icon_state = "blackcorner"; dir = 8},/area/awaymission/centcomAway/general)
+"nS" = (/obj/machinery/door/airlock/engineering{name = "Engineering Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"nT" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
+"nU" = (/obj/structure/table,/obj/item/weapon/paper/ccaMemo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"nV" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/courtroom)
+"nW" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/rcd,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"nX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
+"nY" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"nZ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
+"oa" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"ob" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/courtroom)
+"oc" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
+"od" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"oe" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"of" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"og" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
+"oh" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/centcomAway/hangar)
+"oi" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"oj" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
+"ok" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
+"ol" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 9},/area/awaymission/centcomAway/general)
+"om" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 5},/area/awaymission/centcomAway/general)
+"on" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/general)
+"oo" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
+"op" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
+"oq" = (/obj/structure/safe/floor,/obj/item/clothing/suit/storage/det_suit,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"or" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"os" = (/obj/machinery/computer/card,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
+"ot" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/centcomAway/hangar)
+"ou" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
+"ov" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"ow" = (/obj/machinery/vending/coffee,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/centcomAway/general)
+"ox" = (/obj/machinery/vending/cigarette,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/centcomAway/general)
+"oy" = (/obj/structure/flora/ausbushes,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "asteroid6"; name = "sand"; tag = "icon-asteroid6"},/area/awaymission/centcomAway/general)
+"oz" = (/obj/structure/flora/ausbushes,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-asteroid"; name = "plating"; icon_state = "asteroid"},/area/awaymission/centcomAway/general)
+"oA" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"oB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"oC" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/awaymission/centcomAway/general)
+"oD" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/centcomAway/general)
+"oE" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"oF" = (/obj/item/weapon/paper_bin,/obj/structure/table/reinforced,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"oG" = (/obj/machinery/photocopier,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/centcomAway/general)
+"oH" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 2},/area/awaymission/centcomAway/general)
+"oI" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "green"},/area/awaymission/centcomAway/general)
+"oJ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/general)
+"oK" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
+"oL" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"oM" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"oN" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome)
+"oO" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
+"oP" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
+"oQ" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"oR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"oS" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"oT" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"oU" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"oV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"oW" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
+"oX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
+"oY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
+"oZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/thunderdome)
+"pa" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"pb" = (/obj/structure/rack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"pc" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"pd" = (/obj/structure/table,/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"pe" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"pf" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/popcorn,/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"pg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
+"ph" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pi" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
+"pj" = (/obj/structure/table,/obj/item/device/multitool,/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"pk" = (/obj/machinery/door/airlock/centcom,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
+"pl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall,/area/awaymission/centcomAway/courtroom)
+"pm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pn" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/monitor,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/centcomAway/general)
+"po" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 10},/area/awaymission/centcomAway/general)
+"pp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-blackcorner (EAST)"; icon_state = "blackcorner"; dir = 4},/area/awaymission/centcomAway/general)
+"pq" = (/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Court APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/courtroom)
+"pr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"ps" = (/obj/machinery/power/terminal,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pt" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pu" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pv" = (/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Control APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pw" = (/obj/machinery/power/smes{charge = 5e+006; input_level = 200000; inputting = 0; output_level = 100000; outputting = 1},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"px" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/centcomAway/general)
+"py" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general)
+"pz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pA" = (/obj/machinery/light{dir = 1; in_use = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general)
+"pB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/centcomAway/general)
+"pC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-purplecorner (EAST)"; icon_state = "purplecorner"; dir = 4},/area/awaymission/centcomAway/general)
+"pD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pE" = (/obj/machinery/light{dir = 1; in_use = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-purple (NORTH)"; icon_state = "purple"; dir = 1},/area/awaymission/centcomAway/general)
+"pF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-purple (NORTH)"; icon_state = "purple"; dir = 1},/area/awaymission/centcomAway/general)
+"pG" = (/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Hangar APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
+"pH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
+"pI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/hangar)
+"pJ" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
+"pK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/centcomAway/general)
+"pL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/centcomAway/general)
+"pM" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-blackcorner"; icon_state = "blackcorner"},/area/awaymission/centcomAway/general)
+"pN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "greencorner"},/area/awaymission/centcomAway/general)
+"pO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/centcomAway/general)
+"pP" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-blackcorner"; icon_state = "blackcorner"},/area/awaymission/centcomAway/general)
+"pQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-blackcorner (WEST)"; icon_state = "blackcorner"; dir = 8},/area/awaymission/centcomAway/general)
+"pR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
+"pS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
+"pT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
+"pU" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "XCCsec3"; name = "XCC Main Access Shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/awaymission/centcomAway/general)
+"pV" = (/obj/structure/flora/ausbushes,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "asteroid6"; name = "sand"; tag = "icon-asteroid6"},/area/awaymission/centcomAway/general)
+"pW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"pX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "greencorner"; dir = 4},/area/awaymission/centcomAway/general)
+"pY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"},/area/awaymission/centcomAway/general)
+"pZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"qa" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"qb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "green"},/area/awaymission/centcomAway/general)
+"qc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/awaymission/centcomAway/general)
+"qd" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/awaymission/centcomAway/general)
+"qe" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"qf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
+"qg" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
+"qh" = (/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Kitchen APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"qi" = (/obj/structure/rack,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"qj" = (/obj/structure/rack,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -728,94 +869,94 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacadaeaeaeaeaeafacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababagagagagagahaiaiaiaiaiaiaiaiajakalamanaoapaqarasatauavavauakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababagagakakakakakaiaiaiaiaiaiaiaiaiakawaxayazaxaxaxaAaBauaCaDauakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaEagagakaFaGaHakaiaiaIaJaJaiaiaiawaKawaxaLazaxaxaxaMaBauaNaOauakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaPagagakaQaGaGaRaiaiaIaJaJaiaiaiawaSawaxaxazaxaxaxaMaBauaNaOauakabaTaUaUaVababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWagagakakakakakaiaiaiaiaiaiaiaiawaKaXaxaxaYawaZawbabbauaNaOauakagagbcbcagbdababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWbebfbfbfbfbfbfbfbfbgbfbfbfbfbfbfbfbfbfbfbfbfaWagagakaFaGaHakaiaiaiaiaiaiaiaiaIbhawaxaxaYakakbiakakbjaNaObkakblagagagagagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbpbqbrbsbtbfbfbfbfbfbfbfbpbqbrbsbtbfbgbuaWagagakaQaGaGaRaiaiaiaiaiaiaiaiaIbhawaxaxaYbvbwbxbyakbzbAaObBakbCagagagagagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbEbEbEbFbGbHbIbJbGbHbIbKbEbEbEbDbfbfbfaWagagakakakakakaiaiaibLbLaiaiaiaIbhawbMbNaYakbObxbPakbQbRbSbBakakakacababagagabababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbUbUbVbWbXbYbZcacbbYbXcccdbUbUbDbfbfbfaWagagakaFaGaHakaiaiaIcecfaiaiaiaiakakakaKcgakakakakakchciciaKcjckckataaclagagcmagcncococococococococococococoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbUbUcpcqcqbYcqcqcqbYcqcqcpbUbUbDbfbfbfaWagagakaQaGaGaRaiaiaIcraJaiaiaiaiaKcscscsctcucucucucucvcwcwcwcwcwcwaBaacxagagcyababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfczcdbUcAcqbYbYbYbYbYbYbYcqcAbUbVcBbfbfcCaWcDcEakakakakakaiaiaIaJaJaiaiaiaicFcscscGcGcGcscscscscicwcHcIcJcKcwaBaacxagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfczbJcLcMcNcOcPbYcQcqbYcScTbJcBbfbfcUcUcmagagagcVaiaiaiaiaiaIaJaJaiaiaiaiaKcscscscWcucucucucucXcwcwcwcwcwcwaBaacxagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbgbfbfbDcYcZdadbbYcqcqbYcSbDbfbfbfbfbfcUcmagagagcVaiaiaiaiaiaIaJaJaiaiaiaiakakakaKdcakakakakakchciciaKcjckckbbaaddagagcyababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbgcUbfbDdedfdfcPbYcSdgbYcScpdhbfbfdidicCaWaWcEakakakakakaiaiaiaiaiaiaiaiaIbhdjdkdldmakbObxbPakbQdndobBakakakacababagagcmagcmcococococococococococococoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdpdfdfdqbYcSdgbYbYbHbfbfbfbodrdsdtaWagakaFduaHakaiaiaiaiaiaiaiaiaIbhdjaxaxdmdvbwbxbyakdwbAdxbBakbCagagagagagagabababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfcUbgbfbFbJbJbJcLbYcqcqbYcSdybfbfbfbobecUdzaWagakaQaGaGaRaiaiaiaiaiaiaiaiaIbhdjaxaxdmakakbiakakdAdBdxdCakdDagagagagagagabaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYdEbDbYcSdgbYcSdFbfbfbfbobecUdGaWagakakakakakaiaiaIaJdHaiaiaidjaKdIaxaxdmdjdJdjdKataudBdxauakakakakakagagagabaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYdLcpbYcSdgbYcSdybfbfbfbobecUdGaWagakaFduaHakaiaiaIaJaJaiaiaidjdMdjaxaxazaxaxaxdNaBaudBdxauakdOdPdQakagagababaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYbYdRbYbYbYbYbYbHbfbfbfbodSdTdUaWagakaQaGaGaRaiaiaiaiaiaiaiaidjaKdjaxaLazaxaxaxdNaBaudBdxauakdVdWdWdXagagabaaaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYdEdYbYcqcqcqcqdYbfbfbfaWaWaWaWaWagakakdZeaakakakdZebeaakaiaiaiakdjaxayazaxaxaxecaBauedeeauakefegehakagagabaaaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUbDdEbYdEbDbYeiejekbXbDbfbgbfbuaWbdagagagacelemeneneoenepeneqacereseraketeuevewexeyezeAbbauavavauakakakakakagagababababababaTaUaUaVababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUeBeCeCbJeDeEbIbJeCeCcBbfbfbfbfaWagageFeFeFeFeFeFeFeFeFeFeFeFeFeGeGeGeFeFeFeFeFeFeFeFeFeFeFeFeFakakeHeIbdagagageJagagagagagagagagagagabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUcUeBbKeKcSbYeLeMbFcBbfbfbfbfcUaWagageFeNeOeOeOePeFeNeQeReQePeFeGeGeGeFeSeUeUeVeWeFeXeYeZfafbeFagagagagagagagagagagagagagagagagagagagageIabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfcUcUbDekcqfccqeKbDbfbfbfbfcUcUaWagageFeOeOfdeOeOfeeOeOeOeOeOeFfffgffeFeUeUeUeUfhfieUeUeUfhfieFagfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjagbdabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfcUbfbfcUbDfkflfmfnfobDbfbfbfbfcUcUaWagageFeOeOeOeOeOeFfpfqfrfrfseFfteOfueFeSeUeUeUeUfieUeUeUeUfieFagfjfvfwfxfjfyfyfyfjfyfyfyfyfyfyfyfyfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfbfczfzfAfAfAfBcBbfbfbfbfbfcUaWagageFeOfCfDfCeOeFfEfFfGfHfIeFeOeOeOeFfGfHfJfKfLeFfMfNeUfOfPeFagfjfQfQfQfRfyfyfyfSfyfTfUfTfyfVfWfXfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfbfbfbfbfbfbfbfbfbfcUbfbfbfbfaWagageFfpfYfZgagbeFeOgcgcgcgcgdeOeOeOgegfgfgfgfeOggeOgheUfhfieFagfjfjfjfjfjfyfyfyfjgigjfTgkgiglgmgmfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbgbfbfbfbfbfbfbfbgbfbfbfbfbfbfbfaWagageFeFeFeFeFeFeFeOeOgngogogogogogogogogogpeOeOeFeFeFeFeFeFeFagfjgqfQfvfjfyfyfyfjgrgrgrgrgrglgmgmfjaggsabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfaWagagagagagagagagcEgteOgugvgweFgxgygweFgxgzgAeOgBcEagagagagagagagfjgqgCgDfjfyfyfyfjgEgEgCgEgEglgmgmfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogFgFgFgFgFgFgFgFgFgFgFgFgFgGdsdsdsdsgHaWdDbleHageJaggIgIeFeOeOgJgKgLgMgNgOgPgQgRgKgSeOeOgTgTgTgTgTgTgTgUfjgVgCgDfjfyfyfyfjgWgWgCgWgWglgmgmfjagaEabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXgXgXgXgXgXgXgXgXgXgXgXgFbecUcUcUcUgYaWeFeFeFeFeFeFeFeFeFeOeOeOgZeOeOeOhaeOeOeOgZeOeOeOgTfUfUfUfUfUgTgTgTgTfRgTgTgThbgTgTgCgCgCgCgCglgmgmfjaghcabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXgXgXgXgXgXgXgXgXgXgXgXgFbecUcUcUcUgYaWhdhehfhfeFhghhhieFhjeOgnhkhlhmeOeOeOhnhohkgpeOhpgTfyfyfyfyfyfyfSfyfyfyfyfyfyfyfyfSgChqhqhqgCfjfjhrfjcEfjgTgTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXgXgXgXgXhsgXhtbJbJhugXgFbecUcUcUcUhvaWhfhwhfhfhxeGeGeGffeOeOguhyhzeOhAeOhAeOhBhygAeOeOfSfyfyfyfyfyfyfSfyfyfyfyfyfyfyfyfSgChqhqhqgCfjfyfyfyfyfyhCgTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXhtbJbJhugXgXhDhEdghFgXgFbecUcUcUhGhHaWhIhfhfhJhKhgeGhgeFfteOgugKhLhMhNhOhPhQhRgKgAeOfugTgTgTgThShTgTgTgTgThUgTgTgTfRgTgTgChqhqhqgCfjfyfyhVhVfyfyhWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXhDhEdghXgXgXhYbJbJhZgXgFbecUcUcUcUiaaWhIhfhfhJibhgeGhgeFeOeOgueFfGfHfHfHfHfHfJeFgAeOeOicideUeFaaaaaaaagTieifgTfQfQfQfQgTgCfQfQfQgCfjfyigfTfTihfyiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXhYbJbJhZgXgXgXgXgXgXgXgFbecUcUcUcUijaWhIhfhfikeFhgeGhgeFeOeOgJilililililililililgSeOeOimeUineFaaaaaaaagTieifgTfQfUfQfQgTgTgTgTgTgTgTfyigfTfTihfyiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWiogXgXgXgXgXgXgXgXgXgXgXipgFiqirisitiuijaWeFeFeFeFeFeFffeFeFeOeOeOeOeOiviweOiwixeOhpeOhjeOiceUeUeFaaaaaaaagTiyifgTizgEgEgCgTaaaaaaaaaahWfyigfTfTihfyiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWiAaWaWaWaWaWaWaWaWaWiBaWaWaWaWaWaWaWaWaWaWiCeGeGeGiCeFeGeFeFeFeFeFeFeFeFeFiDeFeFeFeFiEeFeFeFeFeFeFaaaaaaaagTiFiGgTgVgWgCgCgTaaaaaaaaaaiHiIfyiJiJfyiKiHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWiLiMiNiOiPiQcCiRcUcUcUiScCaaaaaaaaaaaaeFhghghghghgeFffeFiTiUfDiViWeFeFiXiXiXeFiYfghgiZaabmaaaaaaaaaaaaaagTgTgTgThSjajajbgTbmbmbmbmbmgTgTgTgTgTgTgTgTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOgXiQcCcCcCjgcCcCcCfGfHfHfHfHjheFhgeGjieGhghgeGeFjjjjjjjjjjeFeFfgiDfgeFeFeFiEeFeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcCiLiMiNiOgXdicCjkgXjlgXjkcChghghghghghghghgjmjnjohghgeGjpjjjjjjfDfDeFjqgSeOgJjreFjshgjteFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOiObojgjljujljljljveGeGeGeGeGeGeGeGjmjwjoeGeGeGeFjjjjjjjjfDeFjqeOeOeOjrjxhghgjyeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcCiLiMiNiOiObojgjljljljljljveGeGeGeGeGeGeGeGjmjzjoeGeGeGeFjjjAjBjCjDeFgAeOeOeOgujEjFhgjGeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOgXjHaWgXjIgXjIgXaWhghghghghghghghgjmjJjohghgeGeFjjjKjLjMjLeFjNeOeOeOjOjPjQhgjGeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcCiLiMiNiOgXjRaWgXgXgXgXgXaWfGfHfHfHfHjheFhgeGjSeGhghgeGeFfDjTjUjjjjeFjNixeOivjOjVjWjXjYeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOgXjRaWjZkakbkckdaWaaaaaaaaaaaaeFhghghghghgeFkeeFeFeFeFeFeFeFfHfJkffGfHeFeFeFeFeFeFeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWeFiCeGeGeGiCeFfDeFiYkgkheFkihkkjeOeOeOkkhkiYeFklkmknkoeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWbegXcUcUgXcUcUcUgXgXgXgXgXgXgXgXcUcUgXaWeFeFeFeFeFeFeFkeeFkpkqkreFiYkskjeOeOeOkkkskneFfGfHfHjheFfGjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXgXgXcUcUgXgXgXgXgXhsgXgXgXgXcUgXaWilililililileFeOeOkukueOeFeFeFkveOeOeOkweFeFeFeOkukueOkxfDkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXgXcUgXgXgXgXgXgXgXgXgXgXgXgXgXgXkyeOeOeOeOeOeOiDeOeOkzkzeOiDkAiDeOeOeOeOeOiDkBiDeOeOeOeOkCfHjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXkDkDkDkDgXhshsgXgXgXgXgXgXgXgXgXaWfGfHfHfHfHjheFeOeOkzkzeOeFkAeFkjeOeOeOkkeFkBeFeOeOeOeOkEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXkDkDkDkDgXgXgXgXgXgXgXgXgXgXgXgXaWiYkFiYklkGkleFeOeOkHkHeOfgkAfggAeOeOeOgufgkBfgeOeOeOeOeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXgXcUcUgXgXgXgXgXgXgXgXgXgXgXgXgXaWfGfHfHfHfHjheFeOeOeOeOeOeFkAeFkjeOeOeOkkeFkBeFeOeOeOeOkEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXcUkIkJkKcUgXgXgXgXgXgXgXgXgXcUgXkyeOeOeOeOeOeOiDeOeOeOeOeOiDkAiDeOeOeOeOeOiDkBiDeOeOeOeOkLfHjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXcUcUkMkNkOcUgXgXgXgXcUgXgXgXcUcUgXaWgogogogogogoeFeOeOeOeOeOeFkAeFkjeOeOeOkkeFkBeFeOeOeOeOkxfDkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWkPgXcUgXkQkRkScUcUgXgXgXgXgXgXcUcUcUcUaWeFfGfHfHjheFeFkTkTkTkTkTeFkAkUjNgogogojOkVkBeFeOeOeOeOgxgykWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWiAcUcUcUcUcUcUgXgXcUgXgXgXgXkXkYkZijaWaWbmaaaaaaaaaaeFlajxjEjPjVeFeFeFgvfJeGfGgzeFeFeFeOeOeOeOkxfDkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaabmbmaaaaaaaaeFjGhglblcldeFlelflglheGligKlfleeFkTkTkTkTfGfHjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmaaaaaaeFjGhghghgljeFeOlklelheGlilelleOeFjxjEjPjVeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmaaaaeFlmhghghglneFfglofglheGlifglofgeFjGlplcldeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmaaeFjGhghghgjseFlqeOeOeOhkeOeOeOgueFjGhghgljeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmeFjyjthgjsjsiElrlslsltksivgogojOiEjGjGjslueFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFeFeFeFeFeFeFeFeFlviclweFeFeFeFeFeFeFeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmlxlyhkeGeGeGhklzlxbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmhycRhyeGeGeGhycRhybmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmkscRhyeGeGeGhylBksbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFhylClxlChyeFeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlElFlGlDaaaaaaaaksfDksfDksaaaaaaaalDlElFlGlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlHlIlIlDlDlDlDlDlDlDlDlDlDlJlDlJlDlDlDlDlDlDlDlDlDlDlKlLlMlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlNlNlNlNlNlNlNlNlNlNlNlDlNlNlNlDlNlNlNlNlNlNlNlNlNlNlNlNlNlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlNlNlNlNlNlNlNlNlNlNlNlNlOlNlNlNlOlNlNlNlNlNlNlNlNlNlNlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababagagakakakakakaiaiaiaiaiaiaiaiaQakawaxayazaxaxaxaAaBauaCaDauakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaEagagakaFaGaHakbkaiaIaJaJaiaiaiawaKawaxaLazaxaxaxaMaBauaNaOcaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaPagagakcMaGaGaRaiaiaIaJaJaiaiaiawaSawaxaxazaxaxaxaMaBauaNaOauakabaTaUaUaVababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWcZagakakakakakaiaiaiaiaiaiaiaiawaKaXaxdLaYexaZawbabbauaNaOauakagagbcbcagbdababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWbeeYbfbfbfbfbfbfbfbgeYbfbfbfbfbfbfbfbfbfeYbfaWagagakaFaGaHakaiaiaiaiaiaiaiaiaIbhawaxaxaYakakbiakakbjaNaOeZakblagagagagagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbpbqbrbsbtbfbfbfbfbfbfbfbpbqbrbsbtbfbgbuaWagagakcMaGaGaRaiaiaiaiaiaiaiaiaIbhawaxaxaYbvbwbxfLakbzbAaObBakbCagagagagagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbEbEbEbFbGbHbIbJbGbHbIbKbEbEbEbDbfbfbfaWagagakakakakakbkaiaibLbLaiaiaiaIbhawbMbNaYakbObxbPakbQbRbSbBakakakacababcZagabababbmbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbUbUbVbWbXbYbZfZcbbYbXcccdbUbUbDbfbfbfaWagagakaFaGaHakaiaiaIcecfaiaiaiaQakakakaKcgakakakakakchciciaKcjckckataaclagcocnfedVfufqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDgHbUcpcqcqbYcqcqcqbYcqcqcpbUhpbDbfbfbfaWagagakcMaGhvaRaiaiaIcraJaiaiaiaiaKcscscscthHcucucucucvcwcwcwhOcwcwaBaacxagfCcyababbmbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfczcdbUcAcqbYbYbYbYbYbYbYcqcAbUbVcBbfitcCaWcDcEakakakakakaiaiaIaJaJaiaiaiaicFcscscGcGcGcscscscscicwcHcIcJcKcwaBaacxagfEabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfczbJcLiUcNcOcPbYcQcqbYjDcTbJcBbfbfcUcUcmkZagagcVaiaiaiaiaiaIaJaJaiaiaiaiaKcscscscWjTcucucucucXcwcwcwjUcwcwaBaacxagfCabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnjXbfbgbfbfbDcYkbdadbbYcqcqbYcSbDbfbfbfbfbfcUcmagagagcVaiaiaiaiaiaIaJaJaiaiaiaiakakakaKdcakakakakakchciciaKcjckckbbaaddagfCcyababbmbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbgcUbfbDdedfdfcPbYcSdgbYcScpdhbfbfdidicCaWaWcEakakakakakbkaiaiaiaiaiaiaiaIbhdjdkdldmakbObxkvakbQdndobBakakakacababagfYcnfecngafqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqfqaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdpdfdfdqbYcSdgbYbYbHbfbfbfbodrdsdtaWagakaFduaHakaiaiaiaiaiaiaiaiaIbhdjaxaxdmdvbwbxbyakdwbAdxkwakbCagagagagagfCabababgbbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfcUbgbfbFbJbJbJcLbYcqcqbYcSdybfbfbfbobecUdzaWagakcMaGaGaRaiaiaiaiaiaiaiaiaIbhdjaxaxlfakakbiakakdAdBdxdCakdDagagaglmagfCabaabmgcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYdEbDbYcSdgbYcSdFbfbfbfbobecUdGaWcZakakakakakaiaiaIaJdHaiaiailAaKdIaxaxdmdjdJdjdKataudBdxauakakakakakcZcogdabaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYlZcpmccSdgbYjDdybfbfbfbobecUdGaWagakaFduaHakaiaiaIaJaJaiaiaidjdMdjaxaxazaxaxaxdNaBaudBdxauakdOdPdQakaggeababaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYbYdRbYbYbYbYbYbHbfbfbfbodSdTdUaWagakcMaGaGaRaiaiaiaiaiaiaiaidjaKdjaxaLazaxaxaxdNaBaudBdxcaakgfdWdWdXagfCabaaaabmbmaaaaaaaaaaaaaaaaaaaagtgtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnjXbfbfbfbfbDdEbYdEdYbYcqcqcqcqdYbfbfitaWaWaWaWaWagakakdZeaakakakdZebeaakaiaigBakdjaxayazaxaxaxecaBauedeeauakefegehakagfCabaaaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUbDdEbYdEbDbYeiejekbXbDbfbgbfbuaWbdagagagacelemeneneoenepeneqacereshjaketeuevewmzeyezeAbbauavavauakakakakakagfCababababababaTaUaUaVababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUeBeCeCbJeDeEbIbJeCeCcBbfbfbfbfaWcZageFeFeFeFeFeFeFeFeFeFeFeFeFpgeGlieFeFeFeFeFeFeFeFeFeFeFeFeFakakeHeIbdagagfCeJagagagagagagagagagagabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUcUeBbKeKcSbYeLeMbFcBbfbfbfbfcUaWagageFeNeOmFeOePeFeNnheReQePeFeGeGlweFeSeUnpeVeWeFeXnunBfafbeFcofefefefefenInHnJagagagagagagnCagagagageIabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfcUcUbDnDcqfccqnEbDbfbfbfbfcUcUaWagageFeOeOfdeOofnSpheOeOeOeOeFfffgpkeFeUeUeUeUfhfieUeUeUfhfieFfCfjfjfjfjfjfjfjplfjfjfjfjfjfjfjfjfjfjagbdabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfcUbfbfcUbDfkflfmfnfobDbfbfbfbfcUcUaWagageFeOeOeOeOpmeFpopnfrfrfseFfteOppeFeSeUeUeUeUfieUeUeUeUfieFfCfjfvfwfxfjfyfypqfjfyfyfyfyfyfyfyfyfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfbfczfzfAfAfAfBcBbfbfbfbfbfcUaWagageFeOeOpsprpteFpufFfGfHfIeFeOeOpveFfGfHfJfKnFeFfMfNeUfOfPeFfCfjnGfQfQfRfyfyfyfSfyfTfUfTfyfVfWfXfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnjXbfbfbfbfbfbfbfbfbfbfbfbfbfbfcUbfbfbfbfaWagageFfpeOpwprpxeFpzpypypApypBprprpDpCpFpEpFpFphggeOgheUfhfieFfCfjfjfjfjfjnKfyfyfjgigjfTgkgiglgmnLfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbgbfbfbfbfbfbfbfbgbfbfbfbfbfbfpGaWagageFeFeFeFeFeFeFpmeOgngogogogogogogogogogpeOpmeFeFeFeFeFeFeFfCfjgqfQfvfjfyfyfyfjnMgrgrgrgrglgmgmfjcZgsabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfitnNbfnObfbfbfbfbfbfbfbfbfpHpIfefefefefefefefepJpKeOgugvgweFgxgygweFgxgzgAeOpLpJfefefefefenIgdfjnPgCgDfjfyfyfyfjgEgEgCgEgEglgmgmfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogFgFgFgFgFgFgFgFgFgFgFgFgFgGdsdsdsdsnQaWdDbleHnCeJaggIgIeFeOeOgJgKgLgMgNgOgPgQgRgKgSeOpmgTgTgTgTgTgTgTgUfjgVgCgDfjfyfyfyfjgWgWgCgWgWglgmgmfjagaEabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXgXgXgXgXgXgXgXgXgXgXgXgFbecUcUcUcUgYaWeFeFeFeFeFeFeFeFeFeOeOeOgZeOeOeOhaeOeOeOgZeOeOpmgTfUfUfUfUfUgTgTgTgTfRgTgTgThbgTgTgCgCgCgCgCglgmgmfjaghcabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXgXgXgXgXgXgXgXgXgXgXgXgFbecUcUcUcUgYaWhdhehfhfeFhghhhieFnReOgnhkhlhmeOeOeOhnhohkgpeOpMgTfyfyfyfyfyfyfSfyfyfyfyfyfyfyfyfSgChqhqhqnTfjfjhrfjcEfjgTgTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXgXgXgXgXhsgXhtbJbJhugXgFbecUcUcUcUnUaWhfhwhfhfhxeGeGeGffeOeOguhyhzeOhAeOhAeOhBhygAeOpmfSfyfynVfyfyfyfSfyfyfyfynVfyfyfyfSgChqhqhqgCfjfyfyfyfyfyhCgTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnjXgXhtbJbJhugXgXhDhEdghFgXgFbecUcUcUhGnWaWhIhfhfhJhKnXeGhgeFfteOgugKhLhMhNnYhPhQhRgKgAeOppgTgTgTgThShTgTgTgTgThUgTgTgTfRgTgTgChqhqhqgCfjfyfyhVhVfyfyhWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXhDhEdghXgXgXhYbJbJhZgXgFbecUcUcUcUiaaWhIhfhfhJibhgeGhgeFeOeOgueFfGfHfHfHfHfHfJeFgAeOpmicideUeFaaaaaaaagTieifgTfQfQfQfQgTgCfQfQfQgCfjfyigfTfTihfyiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbogXhYbJbJhZgXgXgXgXgXgXgXgFbecUcUcUcUijaWhInZhfikeFhgeGhgeFeOeOgJilililililililililgSoapmimeUineFaaaaaaaagTieobgTnGfUfQfQgTgTgTgTgTgTgTnKigfTfTihfyiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWiogXgXgXocgXgXgXgXgXgXocipgFiqirisodiuijaWeFeFeFeFeFeFffeFeFeOeOeOoeeOiviweOpOpNprpPprpQpRicogeUeFaaaaaaaagTiyifgTizgEgEgCgTaaaaaaaaaahWfyigfTfTihfyiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWiAaWaWaWaWaWaWaWaWaWiBaWaWaWaWaWaWaWaWaWaWiCeGeGeGiCeFeGeFeFeFeFeFeFeFeFeFiDpSeFeFeFiEeFeFeFeFeFeFaaaaaaaagTiFiGgTgVgWgCgCgTaaaaaaaaaaiHiIfyiJiJfyiKiHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWiLiMiNohiPiQcCiRpTcUcUiScCaaaaaaaaaaaaeFhghghghghgeFffeFiToifDiViWeFeFiXiXpUeFpVfghgiZaabmaaaaaaaaaaaaaagTgTgTgThSjajajbgTbmbmbmbmbmgTgTgTgTgTgTgTgTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOgXiQcCcCcCjgcCcCcCfGfHfHfHfHjheFhgeGjieGhgojeGeFjjjjjjjjjjeFeFfgiDpWeFeFeFiEeFeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcCiLiMiNiOgXdicCjkokjlgXjkcChghghghghghgojhgjmjnjohghgeGjpjjjjjjfDfDeFolgSeOpXomeFonhgjteFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOiObojgjljujljljljveGeGeGooeGeGeGeGjmjwjoeGeGeGeFjjjjjjjjfDeFjqeOeOpmjrjxhghgjyeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcCiLiMiNiOiObojgjljljljljljveGeGeGeGeGeGeGeGjmjzjoeGeGeGeFjjjAjBjCjMeFgAeOeOpmgujEjFhgjGeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOiOgXjHaWgXjIgXjIgXaWhghghghghghgophgjmjJjohghgeGeFjjjKjLjMjLeFjNeOeOpmjOjPjQhgjGeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcCiLiMiNiOgXjRaWgXgXgXgXgXaWfGfHfHfHfHjheFhgeGjSeGhgopeGeFfDoroqjjjjeFjNixeOpYjOjVjWosjYeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajcjdjejfiOotgXjRaWjZkaoukckdaWaaaaaaaaaaaaeFhghghghghgeFkeeFeFeFeFeFeFeFfHfJkfpZfHeFeFeFeFeFeFeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWeFiCeGeGeGiCeFqaeFiYkgkheFkihkkjeOeOpmkkhkiYeFklkmknkoeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWbegXcUovgXcUcUovgXgXgXgXokgXgXgXovcUgXaWeFeFeFeFeFeFeFkeeFkpkqkreFiYkskjeOeOpmkkkskneFfGfHfHjheFfGjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXgXgXcUcUgXgXgXgXgXhsgXgXgXgXcUgXaWilililililileFeOeOkukueOeFeFeFoweOeOpmoxeFeFeFeOkukueOkxfDkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXgXcUgXgXgXgXgXgXgXgXgXgXgXgXgXgXkyeOeOeOeOeOeOiDeOeOkzkzeOiDkAiDeOeOeOpmeOiDkBiDeOeOeOeOkCfHjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXkDkDkDkDgXhshsgXgXgXgXgXgXgXgXpiaWfGfHfHfHfHjheFeOeOkzkzeOeFkAeFkjeOeOpmkkeFkBeFeOeOeOeOkEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXkDkDkDkDgXgXgXgXgXgXgXgXgXgXgXgXaWoykFiYklkGozeFeOeOkHkHeOfgkAfggAeOeOpmgufgkBfgeOeOeOeOeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXgXcUcUgXgXgXgXgXgXgXgXgXgXgXgXpiaWfGfHfHfHfHjheFoAeOeOeOoBeFkAeFoCeOeOpmoDeFkBeFoAeOeOoBkEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXgXcUkIkJkKcUgXgXgXgXgXgXgXgXgXcUgXkyeOeOeOeOeOeOiDeOeOeOeOeOiDkAiDeOeOeOpmeOiDkBiDeOeOoaeOkLfHjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaktbogXcUcUkMkNkOcUgXgXgXgXcUgXgXgXcUcUgXaWgogogogogogoeFeOeOeOeOeOeFkAeFkjeOeOpmkkeFkBeFeOeOeOeOkxfDkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWkPgXcUgXkQkRkScUcUgXgXgXgXgXgXcUcUcUcUaWeFfGfHfHjheFeFkTkTkTkTkTeFkAkUjNgogoqbjOkVkBeFeOeOeOeOgxgykWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWiAcUcUoEcUcUcUocgXcUgXgXocgXkXkYpjijaWaWbmaaaaaaaaaaeFlajxjEjPjVeFeFeFgvfJeGpZgzeFeFeFeOeOeOeOkxfDkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaabmbmaaaaaaaaeFjGhglblcldeFleoFlglheGqcgKoFleeFkTkTkTkTfGfHjhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmaaaaaaeFjGhghghgljeFeOlklelheGqclelleOeFjxjEjPjVeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmaaaaeFoGhghghglneFfglofglheGqcfglofgeFjGlplcldeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmaaeFjGhghghgjseFlqeOeOeOhkpmeOeOgueFjGhghgljeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmeFjyjthgjsjsiElroHlsltkspYgooIjOiEjGjGoJlueFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFeFeFeFeFeFeFeFeFlvicqdeFeFeFeFeFeFeFeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmlxlyhkeGeGlwhklzlxbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmhycRhyeGeGlwhycRhybmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmkscRhyeGoKlwhylBksbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFhylClxqehyeFeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlElFlGlDaaaaaaaaksfDksqfksaaaaaaaalDlElFlGlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlHlIlIlDlDlDlDlDlDlDlDlDlDlJlDqglDlDlDlDlDlDlDlDlDlDlKlLlMlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlNlNlNlNlNlNlNlNlNlNlNlDlNlNqhlDlNlNlNlNlNlNlNlNlNlNlNlNoLlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNoMlNlNlNlNlNlNoMlNlNlNlNlOlNoMlNlOlNlNlNoMlNlNlNlNlNlNlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlPlDlDlDlDlDlDlDlDlDlDlDlQlRlSlDlDlDlDlDlDlDlNlTlTlTlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUlUlUlUlUlVlWlWlWlWlXlWlWlWlWlWlXlYlXlZmalDlNlLlLlLlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUoNlUlUlUlVoOlWlWlWlXoOlWlWlWoOlXlYlXoPmalDlNlLlLlLoQlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUlUlUlUlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmblLlLlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDeTeTmdmdlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmememelNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDeTeTmdmdlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmememeoMlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlDlDlDlDlDlDlDmfmfmfmfmfmfmfmfmfmfmfmfmfmfmflDlDlDlDlDlDlNlNlNlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDmglNlNlDlDmhmhmhmhlDmimjmjmjmjmjmjmjmjmjmjmjmjmjmklDmhmhmhmhlDlNlNlNmllDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDmglNlDlDlDmmmmmmmmlDmnmompmompmomqmrmsmtmumtmumtmvlDmmmmmmmmlDlDlDlNmllDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmwmxmxmylDmglNlDmzmAmBmCmCmCmDmgmrmrmrmrmEmrmrmrmEmrmrmrmrmlmDmCmCmCmBmAmFlDlNmllDmymxmxmxlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmxmxmxmxmGmglNlDmzmAmBmCmCmCmDmgmrmHmrmrmrmqmImsmrmrmrmJmrmlmDmCmCmCmBmAmFlDlNmlmGmxmxmxmKlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmxmymymylDmglNlDmzmAmCmCmCmCmDmgmrmLmrmEmrmLmMmNmrmEmrmNmrmlmDmCmCmCmCmAmFlDlNmllDmymymymxlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmOlDlDlDlDmglNlDmzmAmBmCmCmCmDmgmrmPmrmrmrmQmtmRmrmrmrmSmrmlmDmCmCmCmBmAmFlDlNmllDlDlDlDmTlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmxmUmxmVlDmglNlDmWmAmBmCmCmCmDmgmrmrmrmrmEmrmrmrmEmrmrmrmrmlmDmCmCmCmBmAmXlDlNmllDmYmxmUmxlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmxmxmxmVlDmglNlDmZlDnanananalDnbmIncmIncmImQmrmRndnendnendnflDnanananalDmZlDlNmllDmYmxmxmxlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDmxngmVlDmglNlNlNlDnhnhnhnhlDmimjmjmjmjmjmjmjmjmjmjmjmjmjmklDnhnhnhnhlDlNlNlNmllDmYmxmxlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDmglNlNlNlDlDlDlDlDlDnininjnjnjnjninkninjnjnjnjninilDlDlDlDlDlDlNlNlNmllDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDmglNlNlDlDmhqimhmhlDmimjmjmjmjmjmjmjmjmjmjmjmjmjmklDmhqimhmhlDlNlNlNmllDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDmgoRlDlDlDmmmmmmmmlDmnmompmompmomqmrmsmtmumtmumtmvlDmmmmmmmmlDlDlDlNmllDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmwmxmxmylDmglNlDoSoTmBmCmCmCmDmgmrmrmrmrmEmrmrmrmEmrmrmrmrmlmDmCmCmCmBoToUlDoVmllDmymxmxoWlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDoXmxmxmxmGmglNlDoSmAmBmCmCmCmDmgmrmHmrmrmrmqmImsmrmrmrmJmrmlmDmCmCmCmBmAoUlDlNmlmGmxmxmxmKlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmxmymymylDmglNlDoSmAmCmCmCmCmDmgmrmLmrmEoYmLmMmNoZmEmrmNmrmlmDmCmCmCmCmAoUlDlNmllDmymymymxlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmOlDlDlDlDmglNlDoSmAmBmCmCmCmDmgmrmPmrmrmrmQmtmRmrmrmrmSmrmlmDmCmCmCmBmAoUlDlNmllDlDlDlDmTlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDmxmUmxmVlDmglNlDmWpamBmCmCmCmDmgmrmrmrmrmEmrmrmrmEmrmrmrmrmlmDmCmCmCmBpamXlDlNmllDmYmxmUoWlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDoXmxmxmVlDmgoRlDmZlDnanananalDnbmIncmIncmImQmrmRndnendnendnflDnanananalDmZlDoVmllDmYmxmxmxlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDmxngmVlDmglNlNlNlDpbqjpbpblDmimjmjmjmjmjmjmjmjmjmjmjmjmjmklDpbqjpbpblDlNlNlNmllDmYmxmxlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDmgoMlNlNlDlDlDlDlDlDnininjnjnjnjninkninjnjnjnjninilDlDlDlDlDlDoVlNlNmllDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlNlNlNlNlNlNlNlDninininininininlnininininininilDlNlNlNlNlNlNlNlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlNlNlNlNnmninininnninininininininininininmlNlNlNlNlNlNlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDlDlDnonpnqnqnrninininininsntnunvnwlDlDlDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlNoMlNlNnmninininnninipcnininininininininmlNlNlNlNlNlNlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDlDlDnopdnqnqnrpenininipensntpfnvnwlDlDlDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDlDnxnynzlDlDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDnAlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/challenge.dmm b/_maps/map_files/RandomZLevels/challenge.dmm
deleted file mode 100644
index 397cbe43b65..00000000000
--- a/_maps/map_files/RandomZLevels/challenge.dmm
+++ /dev/null
@@ -1,246 +0,0 @@
-"aa" = (/turf/space,/area/space)
-"ab" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/start)
-"ac" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/start)
-"ad" = (/turf/simulated/floor/plating,/area/awaymission/challenge/start)
-"ae" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/awaymission/challenge/start)
-"af" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"ag" = (/obj/item/clothing/suit/space/syndicate/blue,/obj/item/clothing/head/helmet/space/syndicate/blue,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"ah" = (/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"ai" = (/obj/item/device/flashlight{icon_state = "flashlight-on"; item_state = "flashlight"; on = 1},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"aj" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaymission/challenge/start)
-"ak" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/awaymission/challenge/start)
-"al" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"am" = (/obj/item/clothing/suit/space/syndicate/green,/obj/item/clothing/head/helmet/space/syndicate/green,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"an" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaymission/challenge/start)
-"ao" = (/obj/item/clothing/suit/space/syndicate/orange,/obj/item/clothing/head/helmet/space/syndicate/orange,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"ap" = (/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"aq" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel,/area/awaymission/challenge/start)
-"ar" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"as" = (/obj/effect/decal/remains/robot,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"at" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/awaymission/challenge/start)
-"au" = (/turf/simulated/wall,/area/awaymission/challenge/start)
-"av" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/awaymission/challenge/start)
-"aw" = (/obj/item/stack/rods,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"ax" = (/obj/effect/decal/cleanable/blood/oil,/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plating,/area/awaymission/challenge/start)
-"ay" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"az" = (/obj/item/clothing/suit/space/syndicate/black,/obj/item/clothing/head/helmet/space/syndicate/black,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"aA" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/main)
-"aB" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"aC" = (/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"aD" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaymission/challenge/main)
-"aE" = (/turf/simulated/wall,/area/awaymission/challenge/main)
-"aF" = (/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aG" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/main)
-"aH" = (/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aI" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 2; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aK" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aL" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aM" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aN" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aO" = (/obj/structure/window/reinforced,/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 2; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aP" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aQ" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aR" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/challenge/main)
-"aS" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 4; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aU" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aV" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aW" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 8; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aX" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"ba" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/challenge/main)
-"bb" = (/obj/item/device/multitool,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bc" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bd" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/challenge/main)
-"be" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/challenge/main)
-"bf" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/challenge/main)
-"bg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/awaymission/challenge/main)
-"bh" = (/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
-"bi" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/challenge/main)
-"bj" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"bk" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"bl" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/challenge/main)
-"bm" = (/obj/machinery/door/window/southleft,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bn" = (/obj/machinery/door/window/southright,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bo" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 2; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/challenge/main)
-"bp" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"bq" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"br" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/challenge/main)
-"bs" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bt" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/challenge/main)
-"bv" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/challenge/main)
-"bw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/challenge/main)
-"bx" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 8; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"by" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/challenge/main)
-"bz" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/challenge/main)
-"bA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bB" = (/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/challenge/main)
-"bC" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 8; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bD" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 4; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bE" = (/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bF" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/awaymission/challenge/main)
-"bG" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/awaymission/challenge/main)
-"bH" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaymission/challenge/main)
-"bI" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bL" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bM" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bN" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bO" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bP" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/end)
-"bQ" = (/obj/item/weapon/gun/projectile/revolver/russian,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/awaymission/challenge/main)
-"bR" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end)
-"bS" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching evil areas."; name = "Security Monitor"; network = ""; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/item/device/radio/intercom,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"bT" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching evil areas."; name = "Security Monitor"; network = ""; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"bU" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bV" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaymission/challenge/main)
-"bW" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bX" = (/obj/machinery/light{dir = 1},/obj/structure/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"bY" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching evil areas."; name = "Security Monitor"; network = ""; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"bZ" = (/obj/machinery/door_control{id = "challenge"; name = "Gateway Lockdown"; pixel_x = -4; pixel_y = 26; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"ca" = (/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cb" = (/obj/structure/mirror{pixel_y = 28},/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cc" = (/obj/machinery/light{dir = 1},/obj/structure/rack,/obj/item/clothing/suit/armor/heavy,/obj/item/clothing/head/helmet/space/deathsquad,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cd" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end)
-"ce" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cf" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cg" = (/mob/living/simple_animal/hostile/syndicate/ranged/space{name = "Syndicate Officer"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"ch" = (/obj/machinery/door/airlock/centcom{name = "Airlock"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"ci" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cj" = (/obj/structure/stool/bed/chair/comfy/black,/mob/living/simple_animal/hostile/syndicate{name = "Syndicate Commander"},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"ck" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cl" = (/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cm" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cn" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"co" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"cp" = (/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cq" = (/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"cr" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"cs" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/stamp/granted,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"ct" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "Congratulations, Your station has been selected to carry out the Gateway Project. The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents. --Nanotrasen Blue Space Research"; name = "Confidential Correspondence, Pg 1"; pixel_x = 0; pixel_y = 0},/obj/item/weapon/folder/blue,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cu" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cv" = (/obj/structure/rack,/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cw" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end)
-"cx" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cy" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cz" = (/obj/machinery/door/airlock/centcom{name = "Security"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cA" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"cB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"cC" = (/obj/structure/sign/securearea,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/end)
-"cD" = (/obj/machinery/door/airlock/centcom{name = "Administrator"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cE" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cF" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cG" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cH" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cJ" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
-"cK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"cL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
-"cM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
-"cN" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"cO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cT" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/challenge/end)
-"cU" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"cV" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/challenge/end)
-"cW" = (/obj/machinery/light{dir = 4},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cX" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cY" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"cZ" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"da" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"db" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/challenge/end)
-"dc" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"dd" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/challenge/end)
-"de" = (/obj/structure/window/reinforced,/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"df" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dg" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/space)
-"dh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"di" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dj" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dl" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dm" = (/obj/structure/table,/obj/item/weapon/implanter/explosive,/obj/item/weapon/implanter/explosive{pixel_y = 4},/obj/item/weapon/implanter/explosive{pixel_y = 8},/obj/item/weapon/implanter/explosive{pixel_y = 12},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dn" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/space)
-"do" = (/obj/machinery/door/airlock/centcom{name = "Gateway Access"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"dq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/mob/living/simple_animal/hostile/syndicate{name = "Syndicate Technician"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"ds" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"dt" = (/obj/structure/closet/emcloset,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"du" = (/obj/structure/cable,/obj/machinery/power/smes/magical,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"dv" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"dw" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-
-(1,1,1) = {"
-aaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabacadaeafagahaiahabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabafajakalahalahamabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabananalahalahaladabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabahaoafafapaqarasabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabadafadatauatafavabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabananawafafanavaeabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabaxavavanayazadavabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaAaAaAaAaAaBaCaDaEaAaAaAaAaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFaFaFaFaAaCaGaCaHaAaFaFaFaIaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFaFaIaFaAaJaKaLaMaAaNaFaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaAaAaAaOaPaQaPaAaRaRaRaRaAaPaOaPaPaAaAaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaSaTaHaHaHaHaUaHaHaHaHaUaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaKaHaHaHaHaHaHaHaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaRaRaHaHaHaHaRaRaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaXaFaTaJaHaHaYaZaHaHaHaHaYaZaHaHaMaVaNaXaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHbababbaHaHaHbabaaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHbcaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHaHbdbebfbebebgaHaHaHaHaVaWaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTbhaRaRbhbibjaCaCbkblbhaRaRbhaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaSaTaJaYaZbmaAaAaAaAaAaAbnaYaZaMaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHbabaaHbobpbqbqbpbraHbabaaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFbsaHbtaHaHbubvbvbvbvbwaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHaHaHaKaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaJaHaHaHaHaHaHaHaHaHaHaHaHaMaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaRaRaHaHaHaHaRaRaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaYaZaHaHaHaHaYaZaHaHaHbxaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHbabaaHaHaHaHbabaaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaSaTbyaRaRaRaHaRaRaRaRaHaRaRaRbzaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaYbAbAaZaHaYbAbAaZaHaYbAbAaZaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTbabababaaHbabababaaHbababBbaaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaRaRaHaRaRaHaRaRaHaHaHbCaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaNbDaJaHaHaYaZbmaYaZbnaYaZaHaHaMaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHbEaHbabaaHbabaaHbabaaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHbFbGbGbHaHaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaAaAaAbIbIbIbIbIbJbGbGbKbIbIbIbLbIaAaAaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFbMaFaFaFbNbGbGaVaNaFaFaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFaFaFaIaFaTbGbGbOaFbMaFaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbPbPbPbPbPbPbPaFaTbQbGaVaFbPbPbPbPbPbPbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbRbSbTbTbSbRbPaFbUbVbVbWbMbPbXbYbZcacbccbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcdcecfcgcecdbPbPbPchchbPbPbPcicjckcaclcmbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcdcncfcfcfcdbPcocpcqcqcpcrbPcsctcucaclcvbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcdcdcfcfcwcdbPcocpcfcfcpcrbPclcxclclclcybPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbPbPczczbPbPbPcAcpcfcfcpcBbPbPbPcCcDbPbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcpcEcqcqcpcpcFcpcpcfcfcpcpcFcpcpcfcqcpcpbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcpcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcpcpbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcGcfcfcfcfcfcfcfcfcfcfcfcfcfcfcHcfcfcpcIbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcpcpcpcfcfcpcpcpcpcpcpcpcpcpcpcpcfcfcpcpbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcJcKcpcfcfcpcLcJcJcJcJcJcJcJcMcpcfcfcpcNbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcOcPcPcPcPcPcQcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRcScTcUcVcWcRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRcXcYcZdacXcRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRcXdbdcddcXcRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRdededfdedecRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpdgdhdidjdkdldmdhdncpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcfcqdocfcfdkcfcfdocqcfcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcHcfcpcLdpcfcfdqdrcfdpcMcpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpdscpcpcrdhdtcpdudvdwdhcocpcpdscpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-"}
diff --git a/_maps/map_files/RandomZLevels/clownplanet.dmm b/_maps/map_files/RandomZLevels/clownplanet.dmm
deleted file mode 100644
index b771993de4e..00000000000
--- a/_maps/map_files/RandomZLevels/clownplanet.dmm
+++ /dev/null
@@ -1,510 +0,0 @@
-"aa" = (/turf/space,/area/space)
-"ab" = (/turf/unsimulated/wall,/area/planet/clown)
-"ac" = (/turf/simulated/mineral,/area/planet/clown)
-"ad" = (/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"ae" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (WEST)"; icon_state = "snow_corner"; dir = 8},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"af" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"ag" = (/turf/simulated/mineral/random/high_chance_clown,/area/planet/clown)
-"ah" = (/obj/structure/grille/fence/north_south,/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"ai" = (/obj/structure/flora/tree/dead,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"aj" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"ak" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"al" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"am" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"an" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ao" = (/turf/simulated/wall/r_wall,/area/planet/clown)
-"ap" = (/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"aq" = (/obj/item/weapon/bananapeel,/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ar" = (/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"as" = (/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"at" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"au" = (/obj/item/weapon/bananapeel,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"av" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aw" = (/obj/structure/closet/crate/secure,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ax" = (/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ay" = (/obj/effect/landmark/corpse/clown,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"az" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aA" = (/obj/structure/flora/bush,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"aB" = (/obj/machinery/floodlight,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aC" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aD" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aE" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aF" = (/obj/item/weapon/bananapeel,/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aG" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aH" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aI" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"aJ" = (/obj/structure/flora/grass/brown,/obj/structure/flora/grass/both,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"aK" = (/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"aL" = (/obj/structure/closet/crate/secure/gear,/obj/item/weapon/bikehorn,/obj/item/weapon/bikehorn,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aM" = (/obj/effect/decal/cleanable/blood/oil,/obj/structure/closet/crate/secure,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aN" = (/obj/structure/table/reinforced,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aO" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aP" = (/obj/machinery/doppler_array,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aQ" = (/obj/structure/closet/radiation,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aR" = (/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"aS" = (/obj/structure/rack,/obj/item/weapon/bikehorn,/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/planet/clown)
-"aU" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/planet/clown)
-"aV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/planet/clown)
-"aW" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aX" = (/obj/structure/closet/medical_wall{pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aY" = (/obj/structure/rack,/obj/item/weapon/bikehorn,/obj/item/weapon/bikehorn,/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"aZ" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/planet/clown)
-"ba" = (/obj/machinery/gateway{tag = "icon-off (NORTHWEST)"; icon_state = "off"; dir = 9},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bb" = (/obj/machinery/gateway{tag = "icon-off (NORTH)"; icon_state = "off"; dir = 1},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bc" = (/obj/machinery/gateway{tag = "icon-off (NORTHEAST)"; icon_state = "off"; dir = 5},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bd" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/planet/clown)
-"be" = (/turf/simulated/floor/plasteel{tag = "icon-rampbottom (EAST)"; icon_state = "rampbottom"; dir = 4},/area/planet/clown)
-"bf" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "vault-border"; tag = "icon-vault-border (NORTH)"},/area/planet/clown)
-"bg" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plasteel{dir = 2; icon_state = "vault-border"; tag = "icon-vault-border (NORTH)"},/area/planet/clown)
-"bh" = (/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/corpse/mime,/turf/simulated/floor/plasteel{dir = 2; icon_state = "vault-border"; tag = "icon-vault-border (NORTH)"},/area/planet/clown)
-"bi" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "vault-border"; tag = "icon-vault-border (NORTH)"},/area/planet/clown)
-"bj" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor/plasteel,/area/planet/clown)
-"bk" = (/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/planet/clown)
-"bl" = (/obj/effect/decal/cleanable/blood,/obj/effect/landmark/corpse/mime,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"bm" = (/obj/structure/rack,/obj/item/weapon/bikehorn,/obj/item/weapon/bikehorn,/obj/item/weapon/bananapeel,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bn" = (/obj/machinery/gateway{tag = "icon-off (WEST)"; icon_state = "off"; dir = 8},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bo" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bp" = (/obj/machinery/gateway{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bq" = (/turf/simulated/floor/plasteel{tag = "icon-vault-border (EAST)"; icon_state = "vault-border"; dir = 4},/area/planet/clown)
-"br" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{tag = "icon-vault-border (EAST)"; icon_state = "vault-border"; dir = 4},/area/planet/clown)
-"bs" = (/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel{tag = "icon-vault-border (EAST)"; icon_state = "vault-border"; dir = 4},/area/planet/clown)
-"bt" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-vault-border (EAST)"; icon_state = "vault-border"; dir = 4},/area/planet/clown)
-"bu" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{tag = "icon-vault-border (EAST)"; icon_state = "vault-border"; dir = 4},/area/planet/clown)
-"bv" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/plasteel,/area/planet/clown)
-"bw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"bx" = (/obj/effect/decal/snow/clean/surround{tag = "icon-snow_surround (EAST)"; icon_state = "snow_surround"; dir = 4},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"by" = (/obj/machinery/gateway{tag = "icon-off (SOUTHWEST)"; icon_state = "off"; dir = 10},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bz" = (/obj/machinery/gateway,/turf/simulated/floor/greengrid,/area/planet/clown)
-"bA" = (/obj/machinery/gateway{tag = "icon-off (SOUTHEAST)"; icon_state = "off"; dir = 6},/turf/simulated/floor/greengrid,/area/planet/clown)
-"bB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-vault-border (NORTH)"; icon_state = "vault-border"; dir = 1},/area/planet/clown)
-"bC" = (/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/plasteel{tag = "icon-vault-border (NORTH)"; icon_state = "vault-border"; dir = 1},/area/planet/clown)
-"bD" = (/turf/simulated/floor/plasteel{tag = "icon-vault-border (NORTH)"; icon_state = "vault-border"; dir = 1},/area/planet/clown)
-"bE" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/science{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"bF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/planet/clown)
-"bG" = (/obj/structure/sign/kiddieplaque,/turf/simulated/wall/r_wall,/area/planet/clown)
-"bH" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"bI" = (/obj/structure/rack,/obj/item/weapon/bikehorn,/obj/item/weapon/bikehorn,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bJ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/planet/clown)
-"bK" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/planet/clown)
-"bL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/planet/clown)
-"bM" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bO" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bQ" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"bR" = (/obj/structure/closet/crate/secure/large/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bS" = (/obj/structure/closet/crate/secure,/obj/item/weapon/bananapeel,/obj/item/weapon/bananapeel,/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bT" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bU" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bV" = (/obj/effect/decal/cleanable/crayon,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"bW" = (/obj/structure/snowman,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"bX" = (/obj/effect/decal/remains/human,/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bY" = (/obj/item/weapon/bananapeel,/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"bZ" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (SOUTHEAST)"; icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"ca" = (/obj/effect/landmark/corpse/mime,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"cb" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"cc" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"cd" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/masks,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ce" = (/obj/item/weapon/kitchen/knife,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"cf" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"cg" = (/obj/item/roller,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ch" = (/obj/item/weapon/wirecutters,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ci" = (/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"cj" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"ck" = (/obj/structure/flora/grass/green,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"cl" = (/mob/living/simple_animal/walrus,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"cm" = (/turf/simulated/wall/mineral/clown,/area/planet/clown)
-"cn" = (/mob/living/simple_animal/seal,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"co" = (/turf/simulated/floor/wood,/area/planet/clown)
-"cp" = (/obj/item/flag/clown,/turf/simulated/floor/wood,/area/planet/clown)
-"cq" = (/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/planet/clown)
-"cr" = (/obj/machinery/door/airlock/clown{frozen = 1},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/planet/clown)
-"cs" = (/obj/structure/closet/coffin/sarcophagus,/obj/effect/landmark/corpse/clownking,/turf/simulated/floor/wood,/area/planet/clown)
-"ct" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "rampbottom"; tag = "icon-rampbottom (EAST)"},/area/planet/clown)
-"cu" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "rampbottom"; tag = "icon-rampbottom (EAST)"},/area/planet/clown)
-"cv" = (/obj/structure/tribble_cage,/turf/simulated/floor/wood,/area/planet/clown)
-"cw" = (/obj/structure/stool/bed/chair/comfy/lime{tag = "icon-comfychair_lime (NORTH)"; icon_state = "comfychair_lime"; dir = 1},/obj/item/clothing/head/crown,/turf/simulated/floor/wood,/area/planet/clown)
-"cx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "rampbottom"; tag = "icon-rampbottom (EAST)"},/area/planet/clown)
-"cy" = (/turf/simulated/wall/cult,/area/planet/clown)
-"cz" = (/obj/structure/stool/bed,/turf/simulated/floor/wood,/area/planet/clown)
-"cA" = (/obj/structure/bedsheetbin,/obj/structure/window/reinforced/tinted/frosted{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/planet/clown)
-"cB" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/planet/clown)
-"cC" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/planet/clown)
-"cD" = (/obj/structure/table,/obj/structure/window/reinforced/tinted/frosted{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/planet/clown)
-"cE" = (/obj/structure/window/reinforced/tinted/frosted{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced/tinted/frosted,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/planet/clown)
-"cF" = (/obj/item/flag/mime,/turf/simulated/floor/wood,/area/planet/clown)
-"cG" = (/obj/machinery/door/airlock,/turf/simulated/floor/plating,/area/planet/clown)
-"cH" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (NORTHWEST)"; icon_state = "snow_corner"; dir = 9},/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"cI" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (NORTH)"; icon_state = "snow_corner"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"cJ" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (NORTHEAST)"; icon_state = "snow_corner"; dir = 5},/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"cK" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (WEST)"; icon_state = "snow_corner"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"cL" = (/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"cM" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"cN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/planet/clown)
-"cO" = (/obj/machinery/computer/communications,/turf/simulated/floor/plasteel,/area/planet/clown)
-"cP" = (/turf/simulated/floor/plasteel,/area/planet/clown)
-"cQ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"cR" = (/obj/effect/decal/mecha_wreckage/honker,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"cS" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"cT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/planet/clown)
-"cU" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/planet/clown)
-"cV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/planet/clown)
-"cW" = (/obj/structure/table,/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/planet/clown)
-"cX" = (/obj/effect/landmark/corpse/mime,/turf/simulated/floor/plasteel,/area/planet/clown)
-"cY" = (/obj/structure/rack,/obj/item/clothing/head/bowlerhat,/turf/simulated/floor/plasteel,/area/planet/clown)
-"cZ" = (/obj/effect/landmark/corpse/clown,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"da" = (/obj/structure/table,/obj/item/weapon/gun/launcher/crossbow/french,/turf/simulated/floor/plasteel,/area/planet/clown)
-"db" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"dc" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/baguette,/obj/item/weapon/reagent_containers/food/snacks/baguette,/obj/item/weapon/reagent_containers/food/snacks/baguette,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dd" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/floor/plasteel,/area/planet/clown)
-"de" = (/obj/structure/rack,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"df" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/baguette,/obj/item/weapon/reagent_containers/food/snacks/baguette,/obj/item/weapon/reagent_containers/food/snacks/baguette,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"dg" = (/obj/machinery/transformer/mime/conveyor,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/planet/clown)
-"dh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/planet/clown)
-"di" = (/obj/machinery/vending/security,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dj" = (/obj/structure/rack,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dk" = (/obj/effect/decal/mecha_wreckage/mime{anchored = 1},/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"dl" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (NORTHWEST)"; icon_state = "snow_corner"; dir = 9},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dm" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (NORTH)"; icon_state = "snow_corner"; dir = 1},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dn" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/planet/clown)
-"do" = (/obj/item/trash/raisins,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dp" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dq" = (/obj/item/weapon/bananapeel,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dr" = (/obj/item/flag/clown,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"ds" = (/obj/structure/grille/fence/north_south,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dt" = (/obj/item/flag/mime,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"du" = (/obj/effect/landmark/corpse/clown,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"dv" = (/obj/machinery/door/airlock/vault,/turf/simulated/floor/plating,/area/planet/clown)
-"dw" = (/obj/effect/decal/cleanable/blood,/obj/effect/landmark/corpse/clown,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"dx" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/planet/clown)
-"dy" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/wood,/area/planet/clown)
-"dz" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/wood,/area/planet/clown)
-"dA" = (/turf/simulated/floor/wood{tag = "icon-wood-broken4"; icon_state = "wood-broken4"},/area/planet/clown)
-"dB" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/planet/clown)
-"dC" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/planet/clown)
-"dD" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/planet/clown)
-"dE" = (/obj/item/flag/clown,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"dF" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dG" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dH" = (/turf/simulated/floor/wood{tag = "icon-wood-broken3"; icon_state = "wood-broken3"},/area/planet/clown)
-"dI" = (/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/planet/clown)
-"dJ" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dK" = (/obj/structure/piano,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"dL" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"dM" = (/obj/effect/decal/cleanable/blood,/obj/item/weapon/bananapeel,/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"dN" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/obj/effect/landmark/corpse/mime,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dO" = (/obj/structure/table/reinforced,/turf/simulated/floor/wood,/area/planet/clown)
-"dP" = (/obj/structure/table/reinforced,/obj/item/trash/tray,/turf/simulated/floor/wood,/area/planet/clown)
-"dQ" = (/obj/structure/table/reinforced,/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/planet/clown)
-"dR" = (/obj/structure/falsewall/clown,/turf/simulated/floor/plasteel,/area/planet/clown)
-"dS" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/planet/clown)
-"dT" = (/obj/machinery/door/airlock/clown,/turf/simulated/floor/plating,/area/planet/clown)
-"dU" = (/obj/effect/landmark/corpse/clown,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"dV" = (/obj/machinery/door/airlock/clown,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/planet/clown)
-"dW" = (/obj/effect/decal/snow/clean/edge,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dX" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (SOUTHEAST)"; icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
-"dY" = (/obj/effect/landmark/corpse/clown,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"dZ" = (/obj/machinery/door/airlock{frozen = 1},/turf/simulated/floor/plating,/area/planet/clown)
-"ea" = (/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/planet/clown)
-"eb" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/wood{tag = "icon-wood-broken3"; icon_state = "wood-broken3"},/area/planet/clown)
-"ec" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/planet/clown)
-"ed" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/wood{tag = "icon-wood-broken4"; icon_state = "wood-broken4"},/area/planet/clown)
-"ee" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/wood,/area/planet/clown)
-"ef" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/planet/clown)
-"eg" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/wood,/area/planet/clown)
-"eh" = (/obj/structure/table,/turf/simulated/floor/wood,/area/planet/clown)
-"ei" = (/obj/structure/table,/obj/effect/landmark/costume,/turf/simulated/floor/wood,/area/planet/clown)
-"ej" = (/obj/effect/decal/mecha_wreckage/honker,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"ek" = (/obj/structure/rack,/obj/item/weapon/bikehorn,/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel,/area/planet/clown)
-"el" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/planet/clown)
-"em" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/planet/clown)
-"en" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/planet/clown)
-"eo" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood,/area/planet/clown)
-"ep" = (/obj/effect/decal/cleanable/blood,/obj/effect/landmark/corpse/mime,/turf/simulated/floor/wood,/area/planet/clown)
-"eq" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/planet/clown)
-"er" = (/obj/machinery/vending/cola,/turf/simulated/floor/wood,/area/planet/clown)
-"es" = (/obj/structure/stool/bed/chair/comfy/lime{tag = "icon-comfychair_lime (NORTH)"; icon_state = "comfychair_lime"; dir = 1},/obj/effect/landmark/corpse/clown,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood,/area/planet/clown)
-"et" = (/obj/structure/stool/bed/chair/comfy/lime{tag = "icon-comfychair_lime (NORTH)"; icon_state = "comfychair_lime"; dir = 1},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood,/area/planet/clown)
-"eu" = (/obj/structure/stool/bed/chair/comfy/lime{tag = "icon-comfychair_lime (NORTH)"; icon_state = "comfychair_lime"; dir = 1},/turf/simulated/floor/wood,/area/planet/clown)
-"ev" = (/obj/structure/rack,/obj/item/weapon/bikehorn,/turf/simulated/floor/plasteel,/area/planet/clown)
-"ew" = (/obj/effect/decal/cleanable/blood,/obj/effect/landmark/corpse/mime,/turf/simulated/floor/plasteel,/area/planet/clown)
-"ex" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/planet/clown)
-"ey" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/planet/clown)
-"ez" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/planet/clown)
-"eA" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/planet/clown)
-"eB" = (/obj/machinery/door/airlock/clown{frozen = 1},/turf/simulated/floor/plating,/area/planet/clown)
-"eC" = (/obj/structure/flora/tree/pine/xmas,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-"eD" = (/obj/structure/rack,/obj/item/weapon/bananapeel,/turf/simulated/floor/plasteel,/area/planet/clown)
-"eE" = (/obj/machinery/computer/communications,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/planet/clown)
-"eF" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/turf/simulated/floor/wood,/area/planet/clown)
-"eG" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/wood,/area/planet/clown)
-"eH" = (/obj/structure/table,/obj/item/weapon/gun/energy/clown,/turf/simulated/floor/wood,/area/planet/clown)
-"eI" = (/obj/structure/stool/bed/chair/comfy/lime{tag = "icon-comfychair_lime (NORTH)"; icon_state = "comfychair_lime"; dir = 1},/obj/effect/landmark/corpse/clown,/turf/simulated/floor/wood,/area/planet/clown)
-"eJ" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (SOUTHWEST)"; icon_state = "snow_corner"; dir = 10},/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"eK" = (/obj/item/device/violin,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"eL" = (/obj/effect/decal/snow/clean/edge,/turf/simulated/floor/plasteel{icon_state = "solarpanel"},/area/planet/clown)
-"eM" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/wood,/area/planet/clown)
-"eN" = (/obj/structure/piano{icon_state = "piano"; name = "space piano"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"eO" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"eP" = (/obj/item/flag/mime,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/planet/clown)
-"eQ" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/planet/clown)
-"eR" = (/obj/effect/landmark{name = "awaystart"},/turf/unsimulated/floor/plating/snow,/area/planet/clown)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacadadadadadadadadadadadaeafadadadadadadadadadadadadacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadaiadadadadadadadajadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadakadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagalamamamamanananamamamamamaoaoapapagagagagagadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadajadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagalanananananananananananaqanamaoaoapafadadadadadadadadadadadajadadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagalanananananarananasanananananataoaoapafadadadadadauadadadadakadadadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadajadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagavananananawanananamaxanamayanazaoaoapafadadadadadadadadadadadauaAadadadadadaAadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagananananaBanaCanaDaEaFanaGaHanasaoaoapafakaIakaIaJadadakadaKadadadadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagaganananaLanaMawaLanaNaOanaParanaQaoaoapafaiadaiaRaiadadadadadadadakadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagaSananaTaUaUaUaVananananananaWaXaoaoaoaoaoadadadadadadadadadadadadadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeahadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagaYananaZbabbbcbdbebfbfbgbfbfbhbiaobjbkaoafadblauadadajadadauadadblauaiadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadaeafadadadadadadadadadadadajadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagbmananaZbnbobpbdbebqbqbqbrbsbtbubvbwbwbvapbxadadadadadadadadadadadadadadadadadadajadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadajadadadadadadadaeafadadaiadadadadadajadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagaSananaZbybzbAbdbebBbBbCbDbDbDbDaobEbFbGafadadbHadadadadbHadadadadadaAadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadakaiadadadadaeahadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagbIananbJbKbKbKbLbMbNbNanbOananbPaoaoaoaoaoadadadadadadadadadadadadakadadbQadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagaganananbRbSbTbTbTanamanarbUbNaybPaoaoapafadadadbVadadbWadadaIadaIadadadaKadadadaiadaAadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagaganananbRbOanaCananambXanambYasanaoaoapbZaiadaicaaiaubQadadaAadadadadadadauadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeahadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagancbananananawananccananamanancdaoaoafaIaIakaIaIakadadadadadadadadadadakadadadadakadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagavananananceananbOanaxananbNancfaoaoafaIadadadadadaAadadadadadadadadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagaganancgchanananarananayanananaramaoaoafaIadadadakadadakadadadadadadaiadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeahadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagananananananananananananananamaoaoafaIadadadakadadadadadajadadadadadakadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadaeafadadadadaiadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagciamcjamamanananamamamamagagagagadadadadadadadadadadadadadadadadadadadadajadadadadadadadadagagagabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababagagagadadadadadadadadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadakadadadadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadaeahadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadaAadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadaeafadadadadadadadadadakadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadaAaAadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajadadaiadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadaeafadaiadadadajadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadajadadadadadadadadadadadaAajadadadagagagabababababababababababababababababababababababababababababababababababababababagagagadadadadadadadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadaAadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadckadajadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadaAadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadaiadadaeafadadadadadckadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadaiadadadadadadadadadadajadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagagagadadadadadadadadadadadagagadadadadadadadadadadadakadadaeafadadadakadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajadadadadadadadadajadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaIadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaAadadadadadadadadadakadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadakadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadcladadadadadadadadadadadaiadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadakadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadakadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadaiadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadckadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadadadadcmcmcmcmcmcmcmcmcmcmadadadadadadadadadadaAadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcnadadadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadadadadcmcocococococococpcmadadadadadadadadadadadadadadadadadadaiadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadckckadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadadadadcmcocqcqcqcqcqcqcqcradadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadakadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadajadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadadadadcmcocqcqcqcqcqcqcqcradadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadadadadcmcocqcqcqcqcqcqcqcradadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadcladadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadadadadcmcocqcqcqcocococpcmadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcmcmcmcmcqcqcqcmcmcmcmcmadadbWadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagagagadadadadadadadadadadadadagagagagagagagadadadadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcococococqcqcqcococococmadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagadadadadadadadadagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadagagagagagagagagagadadadadadadadaeafadadadaiadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcocmcscocqcqcqcocscmcocmadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadagagagagagagagagagadadadadadadadaeahadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcococococqcqcqcococococmadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadagagagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcococococqcqcqcococococmadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadagagagagagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcocmcscocqcqcqcocscmcocmadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadaeahadadadadadadajadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcococococqcqcqcococococmadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcococococqcqcqcococococmadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadaeafadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcocmcscocqcqcqcocscmcocmadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadaeahadadadadadadadadadadadadadadagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcococococqcqcqcococococmadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcocococpcqcqcqcpcocococmadadadadadagagagagagagagagagagagagagagagagagagagabababababababababababababababababababababababababababababababababababababababababababababababagagagagagagagagagadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcocococmctctctcmcocococmadadadadadagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadaeahadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadadadcmcocococucvctcobecocococmadadadadagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadaeafadadaiadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadcmcocococucucwbebecocococmadadadadagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadcmcocococucocxcobecocococmadadadadagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeahadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadcmcocococmcxcxcxcmcocococmadadadadagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadcmcocococococococococococmadadadadagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadajadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadcmcmcmcmcmcmcmcmcmcmcmcmcmadadadagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadakadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadakadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadaiadadadadaeahadadadadadadadajadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadakadadadaiadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeahadadadadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadaiadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeahadadadadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadajadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadaeafadadadadadadadadadadadagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeahadadadadadadadadadadadadagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadajadadadaeahadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadaiadadadadadadadadadadadadagagagagabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeahadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagagababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagagababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababagagagagagagagadadadadadadaeahadadadadadadadadadadadadcycycycycycycycyadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadaeafadadadadadadadadadadadadcyczcoczcAcBcCcyadadadaiadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadaeafadadadadadadadadadadadadcyczcoczcDcBcCcyadadadadadadadadadadadadadadadaiadadaiadadaiadadaiadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadaeahadadadadadadadadadadadadcyczcoczcEcBcCcyadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadcyczcocococococyadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadagagababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadajadadadaeafadadadadadadadadadadadadcyczcococococFcyadadadadadadadadadadadadadadadaiadadaiadadaiadadaiadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadcycycycGcycycycyadadadadadadcHcIcIcIcJadadadadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadaiadadaeafadaIadadadadadadadadadadadadadadadadadadadadadadadadcKcLcLcLcMadadadadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadaeafadadadadajadadaIadadadadadadadadadadadadadadadadadadcKcLcLcLcMadadadadadadadadadadadadadadadadadadadadagagababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadcaadadadakadaeahadcycycycycyadadadadadadadadadadadadadcycycycycycyaoaoaoaoaoaoaoadadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadbWadadadadadadadadadadadadadadaiakadadadadaeafadcNcOcPcQcyadadadajcRadcSadadadadadadcycPcTcPcUcPaocBcBcBcBcBaoadadadadadadadadadadadadadadadadadadadagababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadbladaeafadcVcWcXcYcycZadadadadadadadadadaiadadcydacPdbcPdcaocBcBcBcBcBaoadadadadadadadadadadadadadadadadadadadagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadaiadadadadadadadadadadadadadadadadadadadadadadadadadaeahadcVddcPdecycZadadadadadakadadadadadadcydacPcPcPdfaocBcBdgcBcBaoadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaIadadadadadaIajadaeafaddhdidbdjcycZadaiadadadadaddkadadadadcydadbcPdbdcaocBcBcBcBcBaoadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadajakadbladdldmapapdmcycydncycyadadadadadadadadadadadadadcycPdocPdpcPaocBcBcBcBcBaoadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaIadadcaadadaedqdrdsdtapapafadadadadadajadadadadadduadadadcycycycGcycyaoaoaodvaoaoaoadadadadadadadadadadadadadadadadadadagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagadadadadadadadadadadadadcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmadadadadajadadadadadadadadadadadaIaeapapapapapapafadcaauadaddwadadadadadadadadadcycocodxdycydzcocodAcococyadadadadadadadadadadadadadadadadadagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadadadadadadadadadcmcmcPcPdBdCdDcmdEananananananandEcmadadadadadadadadakadadadadadaddkadaeapapdFapapapdGadadaIadadadadaddkadadadadadadcycocodAcodHcocococodIcocyadadadadadadadadadadadadadadadagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadadadadadadadadadadadcmcmcPcPdJcPcPcmdKdLananananananancmadadadadadadadadadadadadaddMaIakadaedFapapapapapdNauadadadcRduadadadadadadadadadcydOdOdOdOdPdOdOdOdQdOcocyadadadadadadagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadadadadadadadadadadadcmcmcmcmcmdRcmcmananananananananancmadaiadadadadadadadadadadadadadadadaeapdrapdtdFapafadadadadadadadadadadadadadadadcydScococodHcococodxcococyadadadadadagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadadadadadadadadadadadcmcmcococococodTanananandUanananancmadadadadadadadadadaIadadadadcycydVcycyapapdWdWdWdXaddYadadadadadadadadadadadadaddZdxcoeadIebecedcoeeefegcyadadadadagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadadadadadadadadadadadcmcmcoeheieicocmananananananananancmadadadadadadadadadadadadejadcyekeldicNaeahadadadadadbQadadaddkadadauadadadduadadcyemcococoeeefencoeeefegcyadadadagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadadadadadadadadadadadcmcmcocococococmcocoeocoepcococococmadadadcaadadadadadadadadadadcydjdbeqcVaeafadadakadauadadaIadadadadadadadadadadadcycococococococococodIcocyadadadagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagadadadadadadadadadadadadadcHcIcIcIcIcmcmcoeieieicocmercoeseteueueseucocmadadadadadadadadadaKadadadadcyevewexcVaeafadadadadadadadadaIadadadcRadadadadadadcyeeefegdHeyezencoeeecegcyadadagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagadadadadadadadadadadadadadcKcLcLcLcLcmcmcmcmcmcmcmcmeAcoeseseteueueucoeBadadadadadadeCadadadadajaIadcyeDcPeEdhaeahadadaiadadadadadadadadadadadadadadadadcyeeefegcoeyeFencoeeefegcyadadagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagadadadadadadadadadadadadadcKcLcLcLcLcmcmcocococoehcmemcoeueueseueseueocmadadadadadadadadadadadadadadcycycycycyaeafadadadadajadadadadadadadadadadadadadadcycocococococococococococyagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadcKcLcLcLcLcmcmeGcococoeHcmdScoeteIeueueueucocmadadadadcaadadadadadadadadadadaKaKadadaeafadadadadadadadadadadadadadadadadadadadcyananananananananananancyagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadeJcLcLcLcLcmcmcocococoeHcmcocococoeococoepcocmadadadadadadadadadadadadadadadadadadadaeahadadadaIadadadadadadadadadadadadadadadcyanananananeKananananancyagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadadeJeLeLeLcmcmeMcococoeHcmcocococococococococmadadadadadadadadadadadadadadadadadadadaeafadadadadadadakadadadadadadadadbWadadadcyananananeNeOananananancyagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadadadadadadcmcmcocococoehcmdOdOdOdOdOdOdOdOcocmadadadadadadadadadadadadadakadadadaiadaeafadadadadadadadadadadadadadadadadadadadcyePanananananananananePcyagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadadadadadadcmcmcocococoeQcmcocococococococococmadadajadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadajadadadadadadadcycycycycycycycycycycycycyagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadadadadadadcmcmcococococodTcocodzdycocococococmadadadadadadadadadadadadadadadadadadadaeafadajadadadakadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadadadadadadadadadadadadadadadadadadcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmcmadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadckadadaeahadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaiadaiadaiadaiadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagadadagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadckadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadadadadadadadadadadadadagadadadadadaiadaiadaiadaiadadadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadcnadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagadadadadagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadaiadaiadaiadaiadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadajadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadadagagagagagagagabababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadadadagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadadagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadadadadadadakadadadadadajadadakadadaeafadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadaeafadadadadadadadakadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadckaeafadadadadadadadakadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadadagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadakadadadadadadadadadaeahadadadadadcladadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadaeafadadadadadadakadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadadadadadadaiadadadadaeafadadadadadakadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadckadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadckadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagadadadadadadadadadakadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadaeafadadadadadadajadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagadadadadadadadadadajadadadaeafadadadaiadadadckadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagadadadadadadadadadadadadadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababagagagagagagagagadadadadadadadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadckadadadaeafadajadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagadadadadaeahadadadadadaiadadadadajadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagadadadajaeahadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadajadadaeahadadadadadadadbWadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadadadagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeahadadadadadadadajadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagadadadadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadajadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadcnadaeahadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeafadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagadadadadadaeahadadadadadadadadadadadadadadadagagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadajadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadajaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadajadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadajadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadeReReRadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadeReReRadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeafadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabagagagagagagagagagagagagadadadaeahadadadadadadadadadadadadadadadadagagagagagagagagagagagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-"}
diff --git a/_maps/map_files/RandomZLevels/evil_santa.dmm b/_maps/map_files/RandomZLevels/evil_santa.dmm
index 7d56e430210..0fc16a7eaa7 100644
--- a/_maps/map_files/RandomZLevels/evil_santa.dmm
+++ b/_maps/map_files/RandomZLevels/evil_santa.dmm
@@ -20,7 +20,7 @@
"at" = (/obj/structure/table/woodentable,/obj/item/weapon/newton,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"au" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
"av" = (/mob/living/simple_animal/hostile/winter/reindeer,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
-"aw" = (/obj/machinery/gun_turret/grenade{desc = "Winterized 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."; faction = "winter"; name = "winterized mounted grenade launcher (40mm)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
+"aw" = (/obj/machinery/porta_turret/syndicate/grenade{desc = "Winterized 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."; faction = "winter"; name = "winterized mounted grenade launcher (40mm)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
"ax" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"ay" = (/obj/structure/table/woodentable,/obj/structure/safe/floor,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/automatic/mini_uzi,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"az" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
@@ -30,7 +30,7 @@
"aD" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"aE" = (/obj/machinery/floodlight,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"aF" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
-"aG" = (/obj/machinery/gun_turret/exterior{desc = "Winterized exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."; faction = "winter"; name = "winterized machine gun turret (7.62)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
+"aG" = (/obj/machinery/porta_turret/syndicate/exterior{desc = "Winterized exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."; faction = "winter"; name = "winterized machine gun turret (7.62)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
"aH" = (/mob/living/simple_animal/hostile/winter/snowman,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
"aI" = (/obj/structure/flora/bush,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
"aJ" = (/obj/item/weapon/pickaxe/gold,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
@@ -73,7 +73,7 @@
"bu" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"bv" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"bw" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
-"bx" = (/obj/machinery/gun_turret/interior{density = 0; desc = "Winterized interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; faction = "winter"; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
+"bx" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Winterized interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; faction = "winter"; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"by" = (/obj/structure/table,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
"bz" = (/obj/item/clothing/head/cone,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
"bA" = (/mob/living/simple_animal/walrus,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
diff --git a/_maps/map_files/RandomZLevels/listeningpost.dmm b/_maps/map_files/RandomZLevels/listeningpost.dmm
deleted file mode 100644
index d3ceb769664..00000000000
--- a/_maps/map_files/RandomZLevels/listeningpost.dmm
+++ /dev/null
@@ -1,152 +0,0 @@
-"a" = (/turf/space,/area/space)
-"b" = (/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"c" = (/turf/simulated/wall/r_wall,/area/awaymission/listeningpost)
-"d" = (/turf/simulated/floor/plating,/area/awaymission/listeningpost)
-"e" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/turf/simulated/floor/plating,/area/awaymission/listeningpost)
-"f" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"g" = (/turf/simulated/wall,/area/awaymission/listeningpost)
-"h" = (/obj/structure/table,/obj/item/weapon/paper/monitorkey,/obj/item/clothing/glasses/regular,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"i" = (/obj/structure/table,/obj/item/device/radio/intercom/pirate{name = "listening post intercom"},/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"j" = (/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"k" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/listeningpost)
-"l" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
-"m" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"n" = (/obj/structure/stool/bed/chair{dir = 4},/mob/living/simple_animal/hostile/syndicate{desc = "A weary looking syndicate operative."; faction = "syndicate"},/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"o" = (/obj/structure/table,/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "november report"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"p" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"q" = (/obj/machinery/door/airlock,/obj/structure/safe/floor,/obj/item/weapon/paper{info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilised your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear it's ugly head again. -Donk Co. Operative #451"; name = "odd report"},/obj/item/weapon/gun/projectile/automatic/pistol,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"r" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"s" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"t" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
-"u" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"v" = (/obj/structure/table,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"w" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"x" = (/obj/structure/disposalpipe/segment,/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"y" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"z" = (/obj/structure/closet,/obj/item/clothing/gloves/boxing,/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"A" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."; name = "april report"},/obj/item/weapon/paper{info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."; name = "may report"},/obj/item/weapon/paper{info = "Nanotrasen communications have been noticably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."; name = "june report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "july report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "august report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "september report"},/obj/item/weapon/paper{info = "Nothing of interest to report."; name = "october report"},/obj/item/weapon/paper{info = "1 x Stechtkin pistol - $600 1 x silencer - $200 shipping charge - $4360 total - $5160"; name = "receipt"},/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"B" = (/obj/structure/table,/obj/item/weapon/paper{info = "Mission Details : You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."; name = "mission briefing"},/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"C" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"D" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/awaymission/listeningpost)
-"E" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"F" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel,/area/awaymission/listeningpost)
-"G" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/listeningpost)
-"H" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/listeningpost)
-"I" = (/obj/structure/toilet{tag = "icon-toilet00 (WEST)"; icon_state = "toilet00"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/listeningpost)
-"J" = (/turf/simulated/mineral/random/high_chance_clown,/area/mine/dangerous/unexplored)
-"K" = (/turf/simulated/shuttle/wall{tag = "icon-wall3"; icon_state = "wall3"},/area/mine/dangerous/explored)
-"L" = (/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"M" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"N" = (/obj/machinery/gateway{tag = "icon-off (NORTH)"; icon_state = "off"; dir = 1},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"O" = (/obj/machinery/gateway{tag = "icon-off (NORTHWEST)"; icon_state = "off"; dir = 9},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"P" = (/obj/machinery/gateway{tag = "icon-off (NORTHEAST)"; icon_state = "off"; dir = 5},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"Q" = (/obj/machinery/gateway/centeraway,/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"R" = (/obj/machinery/gateway{tag = "icon-off (WEST)"; icon_state = "off"; dir = 8},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"S" = (/obj/machinery/gateway{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"T" = (/obj/machinery/gateway,/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"U" = (/obj/machinery/gateway{tag = "icon-off (SOUTHWEST)"; icon_state = "off"; dir = 10},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-"V" = (/obj/machinery/gateway{tag = "icon-off (SOUTHEAST)"; icon_state = "off"; dir = 6},/turf/simulated/floor/plasteel/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/mine/dangerous/explored)
-
-(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaabbbbbbbbbbaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbaaaaaabbbbbbbbbbbbbbbbaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbccccbbbbbaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbcdecbbbbbaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbcccfgccccaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbcchijjkddkaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalbbbbbbbbbbbbbbbbbbcmnojjkddkaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbalbbbbbbbbbbbbbbbbbbccjijjccccaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbllbbbbbbbbbbbbbbbbbbbcjjjpcbbbbaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbblbbbbbbbbbbbbbbbbccccqgggcbsrrtaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcuvgjjjwcbxbbbbbbaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcjjfjjjycbxbbbbbbbaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbczAgBjCDDrEbbbbbaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccFgcbbbbbbbbbaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcGHcbbbbbbbbbaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcGIcbbbbbbbbbbaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccbbbbbbbbbbbaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbblllbbbbbbbbbbbbbbbbbbbbaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbJJbbbbbbbllaaabbbbbbbbbbbbbbbbbaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbJbbJbbblllaaaabbbbbbbbbbbbbbaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbJbbbbbbbbbbbblaaaaabbbbbbbbbbbbbbaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbJJbbbbbbbbbbblaaaabbbbbbbbbbbbbaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbJJbbbbbbbbbbblaabbbbbbbbbbbbbbaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbJbbbbbbaabbbbbbbbbbbbbaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbaaaaaabbbbbbbbbbbbbbbbbbbbJJbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbaaabbbbbbbbbbbbbbbbJbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbJbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbJJbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbblllllbbbbaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbblaaaabbaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbllbaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbKKKKKKKbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbblLMMMMKbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbLONPLKbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbRQSLKbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbblbbbbbbbbbbbbbbLUTVLKbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbllbbbbbbbbbbbbblMMMMKbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbaalbbbbbbbbbbbbllKKKKKbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbblbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbllbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbalbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbaalbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbaaabbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-"}
-
diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
index 38617fb1dd0..0bb35cdaab8 100644
--- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
@@ -22,82 +22,82 @@
"av" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aw" = (/obj/structure/alien/weeds/node,/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"ax" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "darkred"; tag = "icon-darkred (NORTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"ay" = (/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"az" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"; tag = "icon-darkredcorners (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkred"; tag = "icon-darkred (NORTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aB" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredcorners"; tag = "icon-darkredcorners (EAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"ay" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"az" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"; tag = "icon-darkredcorners (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkred"; tag = "icon-darkred (NORTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aB" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredcorners"; tag = "icon-darkredcorners (EAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"aC" = (/obj/structure/alien/weeds/node,/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aD" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/obj/item/clothing/under/rank/security,/obj/item/clothing/suit/armor/vest,/obj/item/weapon/melee/baton/loaded,/obj/item/clothing/head/helmet,/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"aE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"; tag = "icon-darkredcorners (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aF" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aG" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aH" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"; tag = "icon-darkredcorners (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aF" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aG" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aH" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"aI" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aJ" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aK" = (/obj/structure/alien/weeds,/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aL" = (/obj/structure/alien/weeds,/mob/living/simple_animal/hostile/alien/drone{plants_off = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"aM" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aN" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aO" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aQ" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aM" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aN" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aO" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aQ" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"aR" = (/obj/item/weapon/ore/iron{pixel_x = 7; pixel_y = -6},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aS" = (/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/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"aT" = (/turf/simulated/wall,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aU" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"; tag = "icon-darkredcorners (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aV" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aW" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aX" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"; tag = "icon-darkredcorners"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"aY" = (/obj/machinery/gateway{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aU" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"; tag = "icon-darkredcorners (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aV" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aW" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aX" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"; tag = "icon-darkredcorners"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"aY" = (/obj/machinery/gateway{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"aZ" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"ba" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/mob/living/simple_animal/hostile/alien/drone{plants_off = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bb" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bc" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bd" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"be" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkred"; tag = "icon-darkred (SOUTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bg" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkred"; tag = "icon-darkred (SOUTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bh" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"; tag = "icon-darkredcorners"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"be" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkred"; tag = "icon-darkred (SOUTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bg" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkred"; tag = "icon-darkred (SOUTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bh" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"; tag = "icon-darkredcorners"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bi" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/obj/item/clothing/under/syndicate,/obj/item/clothing/glasses/night,/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bj" = (/obj/structure/alien/weeds,/mob/living/simple_animal/hostile/alien/sentinel,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bk" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bl" = (/turf/simulated/mineral/random/high_chance,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"bm" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster{icon_state = "poster17"; pixel_x = -32; pixel_y = 0; serial_number = 17; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bo" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bp" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/device/radio/off{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/off{pixel_x = 2},/turf/simulated/floor/plasteel{ icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"br" = (/obj/machinery/door/window{dir = 1; name = "Gateway Access"; req_access_txt = "150"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1: We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal. Log 2: Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before – They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe. Log 3: Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things."; name = "Personal Log"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bt" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bv" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bw" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bx" = (/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"by" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/obj/item/trash/plate,/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bz" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bm" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster{icon_state = "poster17"; pixel_x = -32; pixel_y = 0; serial_number = 17; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bo" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bp" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/device/radio/off{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/off{pixel_x = 2},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"br" = (/obj/machinery/door/window{dir = 1; name = "Gateway Access"; req_access_txt = "150"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1: We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal. Log 2: Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before – They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe. Log 3: Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things."; name = "Personal Log"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bt" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bv" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bw" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bx" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"by" = (/obj/structure/table,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/obj/item/trash/plate,/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bz" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bA" = (/obj/machinery/light{dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 1; pixel_x = 23; pixel_y = 0; req_access = "150"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 1; pixel_x = 23; pixel_y = 0; req_access = "150"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bE" = (/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bF" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bH" = (/obj/structure/closet/crate/bin,/obj/item/trash/syndi_cakes,/obj/item/trash/sosjerky,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bI" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bJ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bK" = (/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bM" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bN" = (/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bF" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bH" = (/obj/structure/closet/crate/bin,/obj/item/trash/syndi_cakes,/obj/item/trash/sosjerky,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bI" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bJ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bK" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bM" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bN" = (/obj/structure/closet/emcloset,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bO" = (/obj/machinery/door/airlock/glass{name = "Break Room"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bP" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "Gateway"; req_access_txt = "150"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/multitool,/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bS" = (/obj/machinery/power/smes{charge = 0; input_level = 10000; inputting = 0; output_level = 15000; outputting = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor,/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"; tag = "icon-warnplate (NORTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bU" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"; tag = "icon-warnplate (NORTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"bV" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/multitool,/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bS" = (/obj/machinery/power/smes{charge = 0; input_level = 10000; inputting = 0; output_level = 15000; outputting = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bT" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"; tag = "icon-warnplate (NORTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bU" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"; tag = "icon-warnplate (NORTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"bV" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bW" = (/obj/structure/alien/weeds/node,/mob/living/simple_animal/hostile/alien,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bX" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bY" = (/obj/machinery/conveyor{dir = 2; id = "awaysyndie"},/turf/simulated/floor/plating/airless{dir = 4; icon_state = "warnplate"; name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
@@ -110,15 +110,15 @@
"cf" = (/obj/structure/sign/biohazard{pixel_y = 32},/obj/structure/alien/weeds/node,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warningcorner"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cg" = (/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"ch" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "warningcorner"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"ci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light/small{dir = 8},/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/paper{info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while."; name = "Engineering Instructions"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cj" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"ck" = (/obj/structure/stool,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cl" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster{icon_state = "poster10"; pixel_x = 32; pixel_y = 0; serial_number = 10; subtype = 0},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"; tag = "icon-warnplatecorner (EAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"ci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light/small{dir = 8},/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/paper{info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while."; name = "Engineering Instructions"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cj" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"ck" = (/obj/structure/stool,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cl" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster{icon_state = "poster10"; pixel_x = 32; pixel_y = 0; serial_number = 10; subtype = 0},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"; tag = "icon-warnplatecorner (EAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cn" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"co" = (/turf/simulated/floor/plasteel/airless{name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cp" = (/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cq" = (/obj/machinery/door/airlock/glass{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Dormitories"},/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{carbon_dioxide = 0; nitrogen = 0; oxygen = 0; temperature = 2.7},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cq" = (/obj/machinery/door/airlock/glass{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Dormitories"},/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{carbon_dioxide = 0; nitrogen = 0; oxygen = 0; temperature = 2.7},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cr" = (/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cs" = (/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"ct" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel/airless{name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
@@ -128,22 +128,22 @@
"cx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Power Maintenance"; req_access_txt = "150"},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cA" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cA" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cC" = (/obj/machinery/mineral/processing_unit{dir = 1; output_dir = 2},/turf/simulated/floor/plating/airless{dir = 4; icon_state = "warnplate"; name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cD" = (/obj/machinery/mineral/processing_unit_console{machinedir = 8},/turf/simulated/wall,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cF" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cF" = (/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 2; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cI" = (/turf/simulated/floor/plasteel/airless{dir = 10; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cJ" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 1; name = "Worn-out APC"; pixel_x = 0; pixel_y = -25; req_access = "150"; start_charge = 0},/turf/simulated/floor/plasteel/airless{dir = 2; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cK" = (/turf/simulated/floor/plasteel/airless{dir = 2; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cL" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel/airless{dir = 6; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cM" = (/obj/item/weapon/storage/box/lights/mixed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 10; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cN" = (/obj/structure/cable,/obj/effect/decal/cleanable/dirt,/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cO" = (/obj/structure/cable,/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"cP" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 6; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cM" = (/obj/item/weapon/storage/box/lights/mixed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 10; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cN" = (/obj/structure/cable,/obj/effect/decal/cleanable/dirt,/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cO" = (/obj/structure/cable,/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"cP" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 6; icon_state = "warnplate"; tag = "icon-warnplate (SOUTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cQ" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cR" = (/obj/machinery/conveyor_switch/oneway{id = "awaysyndie"; layer = 3.1; name = "mining conveyor"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"cS" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 1; pixel_x = 23; pixel_y = 0; req_access = "150"},/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
@@ -172,7 +172,7 @@
"dp" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1: While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them. Log 2: Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us. Log 3: That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dr" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/suppressor,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/weapon/spacecash/c50,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/stack/spacecash/c50,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dt" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"du" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dv" = (/obj/item/weapon/ore/iron,/obj/item/weapon/ore/iron{pixel_x = -7; pixel_y = -4},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
@@ -207,15 +207,15 @@
"dY" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"dZ" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ea" = (/turf/simulated/wall/r_wall,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eb" = (/obj/structure/grille,/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaybiohazard"; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eb" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"ec" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ed" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ee" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ee" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ef" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eg" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eg" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eh" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ei" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ej" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ej" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ek" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen{locked = 0; req_access = null},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"el" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 9; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"em" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -227,10 +227,10 @@
"es" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"et" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eu" = (/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ev" = (/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ev" = (/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ew" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ey" = (/obj/structure/table/reinforced,/obj/structure/alien/weeds,/obj/machinery/computer/security/telescreen{desc = "Used for watching the contents of the xenobiology containment pen."; dir = 8; name = "xenobiology monitor"; network = list("MO19X")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ey" = (/obj/structure/table/reinforced,/obj/structure/alien/weeds,/obj/machinery/computer/security/telescreen{desc = "Used for watching the contents of the xenobiology containment pen."; dir = 8; name = "xenobiology monitor"; network = list("MO19X")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ez" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable,/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eB" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -243,52 +243,52 @@
"eI" = (/obj/structure/alien/weeds,/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eJ" = (/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eK" = (/turf/simulated/wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eL" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eM" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eN" = (/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/obj/machinery/camera{c_tag = "Xenobiology"; dir = 4; network = list("MO19","MO19R")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eL" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eM" = (/obj/structure/grille,/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eN" = (/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/obj/machinery/camera{c_tag = "Xenobiology"; dir = 4; network = list("MO19","MO19R")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eP" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "Awaylab"; name = "Containment Chamber Blast Doors"; pixel_x = 4; pixel_y = -2; req_access_txt = "201"},/obj/machinery/ignition_switch{id = "awayxenobio"; pixel_x = 4; pixel_y = 8},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eP" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "Awaylab"; name = "Containment Chamber Blast Doors"; pixel_x = 4; pixel_y = -2; req_access_txt = "201"},/obj/machinery/ignition_switch{id = "awayxenobio"; pixel_x = 4; pixel_y = 8},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eQ" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eR" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"eS" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eT" = (/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eU" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = 32; serial_number = 21; subtype = 1},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eV" = (/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eW" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes{charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 15000; outputting = 1},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eX" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"eZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/newspaper,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 5; icon_state = "ltrails_1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "201"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ff" = (/obj/structure/sign/securearea{pixel_x = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fg" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fh" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fi" = (/obj/structure/closet/crate/freezer,/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/obj/item/xenos_claw,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eT" = (/turf/simulated/wall,/area/awaycontent/a7)
+"eU" = (/turf/simulated/wall/rust,/area/awaycontent/a7)
+"eV" = (/turf/simulated/wall/r_wall,/area/awaycontent/a7)
+"eW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eX" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"eY" = (/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"eZ" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = 32; serial_number = 21; subtype = 1},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fa" = (/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a7)
+"fb" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes{charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 200000; outputting = 0},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fc" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 5; icon_state = "ltrails_1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fe" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"ff" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7)
+"fg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/newspaper,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fh" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fi" = (/obj/structure/closet/crate/freezer,/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/obj/item/xenos_claw,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fj" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fk" = (/obj/machinery/door/firedoor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fk" = (/obj/machinery/door/firedoor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fl" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fn" = (/obj/structure/closet/l3closet/scientist,/obj/structure/window/reinforced,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fn" = (/obj/structure/closet/l3closet/scientist,/obj/structure/window/reinforced,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fo" = (/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fp" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/weeds{desc = "A large mottled egg."; health = 100; icon_state = "egg_hatched"; name = "egg"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fq" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fs" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ft" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fw" = (/obj/structure/extinguisher_cabinet{pixel_x = -26},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; icon_state = "ltrails_2"},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Xenobiology Lab"; opacity = 0; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fs" = (/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"ft" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "271"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fu" = (/obj/structure/sign/securearea{pixel_x = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fv" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{amount = 20; layer = 2.9},/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fw" = (/obj/structure/extinguisher_cabinet{pixel_x = -26},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; icon_state = "ltrails_2"},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fy" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/alien/weeds/node,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fE" = (/obj/machinery/atmospherics/pipe/simple/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/item/stack/rods,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fE" = (/obj/machinery/atmospherics/pipe/simple/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/item/stack/rods,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fF" = (/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/machinery/atmospherics/pipe/simple/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/item/stack/rods,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fG" = (/obj/machinery/atmospherics/pipe/simple/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fH" = (/obj/machinery/atmospherics/pipe/simple/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -296,328 +296,328 @@
"fJ" = (/obj/machinery/atmospherics/pipe/simple/visible{desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof Pipe"; unacidable = 1},/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fK" = (/obj/machinery/atmospherics/unary/outlet_injector{desc = "Has a valve and pump attached to it. This one has been applied with an acid-proof coating."; dir = 8; icon_state = "on"; name = "Acid-Proof Air Injector"; on = 1; unacidable = 1},/obj/structure/alien/weeds,/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fL" = (/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/machinery/camera{c_tag = "Xenobiology Containment East"; dir = 8; network = list("MO19X")},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fM" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fO" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fQ" = (/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fS" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fT" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One — 27/05/2554: I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane. Entry Two — 03/06/2554: Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it. Entry Three — 08/06/2554: My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while. Entry Four — 10/06/2554: Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death. Entry Five — 18/06/2554: Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match. Entry Six — 19/06/2554: Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log — Kenneth Cunningham"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fU" = (/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = 32; serial_number = 21; subtype = 1},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fV" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/clothing/suit/armor/vest,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/storage/belt/security,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = -2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fW" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7)
+"fN" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fP" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a7)
+"fQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Xenobiology Lab"; opacity = 0; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/alien/weeds,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fS" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fT" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One — 27/05/2554: I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane. Entry Two — 03/06/2554: Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it. Entry Three — 08/06/2554: My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while. Entry Four — 10/06/2554: Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death. Entry Five — 18/06/2554: Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match. Entry Six — 19/06/2554: Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log — Kenneth Cunningham"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fU" = (/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = 32; serial_number = 21; subtype = 1},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fW" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fX" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fY" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ga" = (/obj/machinery/door/firedoor,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/closet/l3closet/scientist,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fY" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"fZ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"ga" = (/turf/simulated/floor/plating,/area/awaycontent/a7)
+"gb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/closet/l3closet/scientist,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gc" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/item/stack/cable_coil/cut{amount = 1; icon_state = "coil_red1"; item_state = "coil_red1"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gd" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood{color = "red"},/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ge" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gf" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gg" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_impregnated"; item_state = "facehugger_impregnated"; stat = 2},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gh" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gi" = (/obj/effect/decal/cleanable/blood/oil{color = "black"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gj" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gk" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gl" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gm" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gn" = (/obj/machinery/door/airlock/glass_security{name = "Security Post"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"go" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gp" = (/obj/structure/alien/weeds/node,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gq" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/razor{pixel_y = 5},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gr" = (/obj/structure/table,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gs" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"gi" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a7)
+"gj" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/clothing/suit/armor/vest,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/storage/belt/security,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = -2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gk" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gl" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gm" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall/r_wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"go" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gp" = (/obj/structure/alien/weeds/node,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gq" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/razor{pixel_y = 5},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gr" = (/obj/structure/table,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gs" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gt" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gv" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable,/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gw" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gx" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 2; icon_state = "pipe-c"; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gy" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high,/obj/item/device/radio/off,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gz" = (/turf/simulated/mineral/random/labormineral,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"gA" = (/obj/machinery/light/small,/obj/structure/closet/toolcloset,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gB" = (/obj/structure/table,/obj/item/weapon/paper{info = "Ivan Volodin Stories: Entry Won — 28/05/2554: Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble. Entry Too — 05/06/2554: I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy. Entry Tree — 08/06/2554: Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up. Entry Fore — 12/06/2554: Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was? Entry Fiv — 15/06/2554: I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads. Entry Sex: 19/06/2554: Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."; name = "Personal Log — Ivan Volodin"},/obj/item/weapon/pickaxe,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gC" = (/obj/machinery/computer/monitor,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gD" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gE" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gF" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gB" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gD" = (/obj/machinery/door/firedoor,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gE" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gF" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/obj/effect/decal/cleanable/blood/tracks{desc = "Your instincts say you shouldn't be following these."; dir = 8; icon_state = "ltrails_1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gG" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gH" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gI" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gH" = (/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gJ" = (/obj/structure/table,/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gK" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano Date: 04/06/2554 Report: As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate. The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans, they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive nor violent when young, before molting to adulthood. The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers, that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms. It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor."; name = "Larva Xenomorph Social Interactions & Capturing Procedure"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano Date: 04/06/2554 Report: I have studied many interesting and diverse life-forms as a xenobiologist, ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall, and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows. The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed that the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not much slower than it used to be. After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest, that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen. Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours."; name = "Queen Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554 Report: The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape, however, by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain. As for its physiology, the creature has an elongated head, with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has somewhat of an inner mouth, capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip. Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject – would they?"; name = "Adult Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554 Report: When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse, and seemed to get larger very suddenly; this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously-thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is, or will become, as it matures fully. It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology."; name = "Larva Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano Date: 03/06/2554 Report: The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs, leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body. When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off, dead, and curled its legs up like a spider moments after it had finished with the monkey's body. While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours, until we were horrified to discover it screaming out in pain, as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning."; name = "'Facehugger' Xenomorph Physiology & Behavior Observation"},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gL" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Worn-out APC"; pixel_x = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gM" = (/obj/structure/table/reinforced,/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gL" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"gM" = (/obj/structure/table/reinforced,/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gN" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gO" = (/obj/structure/cable,/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/stack/rods,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gQ" = (/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "201"},/obj/machinery/light/small{dir = 8},/obj/machinery/computer/security{desc = "Used to access the various cameras on the outpost."; network = list("MO19R","MO19")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gR" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gP" = (/obj/effect/decal/cleanable/blood/oil{color = "black"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Maintenance APC"; pixel_x = 25; req_access = null; start_charge = 100},/obj/structure/cable,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"gQ" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a7)
+"gR" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gS" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gT" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gU" = (/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gV" = (/obj/machinery/optable,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gW" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gT" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gU" = (/obj/machinery/door/airlock/glass_security{name = "Security Post"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gV" = (/obj/machinery/optable,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gW" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gX" = (/obj/structure/filingcabinet/filingcabinet,/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas Date: 17/06/2554 Report: Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us, instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so. The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?"; name = "The Hivemind Hypothesis"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano Date: 08/06/2554 Report: The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host. The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species."; name = "A Preliminary Study of Alien Behavior"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas Date: 06/06/2554 Report: While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels. Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts. Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability. Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role."; name = "The Xenomorph 'Castes'"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas Date: 04/06/2554 Report: After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy. The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs. We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans."; name = "Larva Xenomorph Autopsy Report"},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gY" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gZ" = (/obj/machinery/computer/operating,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ha" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gZ" = (/obj/machinery/computer/operating,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ha" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hb" = (/obj/structure/disposaloutlet{desc = "An outlet for the pneumatic disposal system. This one has been applied with an acid-proof coating."; dir = 1; name = "Acid-Proof disposal outlet"; unacidable = 1},/obj/structure/disposalpipe/trunk{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 1; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hc" = (/obj/machinery/light{active_power_usage = 0; dir = 2; icon_state = "tube-broken"; status = 2},/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/machinery/camera{c_tag = "Xenobiology Containment South"; dir = 1; network = list("MO19X")},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hd" = (/obj/machinery/sparker{desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; id = "awayxenobio"; name = "Acid-Proof mounted igniter"; pixel_x = 0; pixel_y = -25; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"he" = (/obj/machinery/shieldwallgen{locked = 0; req_access = null},/obj/structure/cable,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hi" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hj" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hk" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hl" = (/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres"; locked = 0; name = "scientist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/storage/labcoat,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hm" = (/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hn" = (/obj/structure/window/reinforced,/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres1"; locked = 1; name = "scientist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/storage/labcoat,/obj/item/weapon/tank/air,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ho" = (/obj/machinery/vending/medical{req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hp" = (/obj/structure/closet/crate/bin,/obj/item/clothing/gloves/color/latex,/obj/item/trash/chips,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hq" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hr" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "201"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/alien/weeds,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hg" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high,/obj/item/device/radio/off,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"hh" = (/obj/machinery/light/small,/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"hi" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hj" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hk" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hl" = (/obj/structure/table,/obj/item/weapon/paper{info = "Ivan Volodin Stories: Entry Won — 28/05/2554: Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble. Entry Too — 05/06/2554: I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy. Entry Tree — 08/06/2554: Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up. Entry Fore — 12/06/2554: Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was? Entry Fiv — 15/06/2554: I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads. Entry Sex: 19/06/2554: Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."; name = "Personal Log — Ivan Volodin"},/obj/item/weapon/pickaxe,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a7)
+"hm" = (/obj/machinery/computer/monitor,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"hn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"ho" = (/obj/structure/closet/crate/bin,/obj/item/clothing/gloves/color/latex,/obj/item/trash/chips,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hp" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hq" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Research APC"; pixel_x = 25; req_access = null; start_charge = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hr" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/structure/alien/weeds,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hs" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ht" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/item/weapon/paper{info = "Personal Log for Research Director Gerald Rosswell Entry One — 17/05/2554: You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of its outposts and thought it would be a cakewalk; there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that I and my science staff would have to pull double duty as medical staff, and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3pt. fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work. Entry Two — 25/05/2554: Well, we all expected it at the outpost: CentComm has decided to completely change what research we are doing. They've decided that we should be researching the species known as 'xenomorphs'. They announced this change 4 days ago, and along with it, sadly, the termination of our current science staff, barring me. Not to mention the constant noise made by the construction detail they sent, to staple on a xenobiology lab, ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse, our current security guard actually died of a heart attack today. Just goes to show, that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established. Entry Three — 27/05/2554: The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station, he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat. Entry Four — 06/06/2554: My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field: a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under-equipped and under-staffed, we are inevitably going to be destroyed, unless we get the equipment and staff we need. Entry Five — 10/06/2554: Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap, with naught but a force field keeping those xenomorphs in. Entry Six — 17/06/2554: The reactions from the specimens today have shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind; while nothing is certain, this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, testing this hypothesis would require many complicated procedures which we will not be able to undertake. Although we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resubmit my request for additional security measures, along with this newfound information."; name = "Personal Log — Gerald Rosswell"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hu" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hw" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/stack/rods,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a7)
+"hv" = (/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "271"},/obj/machinery/light/small{dir = 8},/obj/machinery/computer/security{desc = "Used to access the various cameras on the outpost."; network = list("MO19R","MO19")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hx" = (/obj/structure/grille,/obj/machinery/door/poddoor{id_tag = "AwayRD"; layer = 2.9; name = "privacy shutter"},/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hy" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hz" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hA" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hB" = (/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/oil{color = "black"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer{pixel_x = 6; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -2},/obj/item/robot_parts/l_arm,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hy" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hz" = (/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/oil{color = "black"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer{pixel_x = 6; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -2},/obj/item/robot_parts/l_arm,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hA" = (/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hB" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hC" = (/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Research Director's Office"; opacity = 0; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hF" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hG" = (/obj/structure/noticeboard{dir = 1; pixel_y = -32},/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "
In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediatly. Current Xenobiology Containment Level:Secure RUN "; name = "Evacuation Procedure"},/obj/machinery/camera{c_tag = "Research Division"; dir = 1; network = list("MO19","MO19R")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hI" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hE" = (/obj/machinery/light{active_power_usage = 0; dir = 4; icon_state = "tube-broken"; status = 2},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hF" = (/obj/structure/noticeboard{dir = 1; pixel_y = -32},/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediatly. Current Xenobiology Containment Level:Secure RUN "; name = "Evacuation Procedure"},/obj/machinery/camera{c_tag = "Research Division"; dir = 1; network = list("MO19","MO19R")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"hI" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hJ" = (/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"hK" = (/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"hL" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hM" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"hM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7)
"hN" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hO" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hP" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/turf/simulated/floor/plasteel{ icon_state = "delivery"; name = "floor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hQ" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"hR" = (/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"hS" = (/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"hT" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"hU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/urinal{pixel_y = 29},/obj/structure/mirror{pixel_x = 28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"hV" = (/obj/machinery/shower{pixel_y = 16},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hO" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hP" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"hQ" = (/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hR" = (/obj/structure/urinal{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hS" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hT" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/urinal{pixel_y = 29},/obj/structure/mirror{pixel_x = 28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hU" = (/obj/machinery/shower{pixel_y = 16},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hV" = (/obj/machinery/shower{pixel_y = 16},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"hW" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"hX" = (/obj/machinery/shower{pixel_y = 16},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"hX" = (/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres"; locked = 0; name = "scientist's locker"; req_access_txt = "271"},/obj/item/clothing/suit/storage/labcoat,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hY" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hZ" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ia" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; name = "research monitor"; network = list("MO19X","MO19R")},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ib" = (/obj/machinery/computer/aifixer,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ic" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"id" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ie" = (/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"if" = (/obj/structure/rack,/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ig" = (/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ih" = (/obj/structure/closet/l3closet/general,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ii" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ij" = (/obj/structure/closet/l3closet/general,/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ik" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"il" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"im" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{desc = "Oh no, seven years of bad luck!"; icon_state = "mirror_broke"; pixel_x = 28; shattered = 1},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"in" = (/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"io" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ip" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iq" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "201"},/obj/machinery/door_control{id = "AwayRD"; name = "Privacy Shutter Control"; pixel_x = 0; pixel_y = -2; req_access_txt = "201"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ic" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"id" = (/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ie" = (/obj/structure/rack,/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"if" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ig" = (/obj/structure/closet/l3closet/general,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ih" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ii" = (/obj/structure/closet/l3closet/general,/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ij" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ik" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"il" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{desc = "Oh no, seven years of bad luck!"; icon_state = "mirror_broke"; pixel_x = 28; shattered = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"im" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"in" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"io" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ip" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iq" = (/obj/structure/window/reinforced,/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres1"; locked = 1; name = "scientist's locker"; req_access_txt = "271"},/obj/item/clothing/suit/storage/labcoat,/obj/item/weapon/tank/air,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ir" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"is" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"it" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iu" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/pen,/obj/item/weapon/paper/crumpled{info = "19 06 2554 I fucking knew it. There was a major breach, that idiotic force field failed, and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks. "; name = "Hastily Written Note"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iv" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iw" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ix" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iy" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iz" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iA" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iC" = (/obj/machinery/shower{dir = 8},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iD" = (/obj/structure/table,/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iE" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iF" = (/obj/structure/table,/obj/item/trash/raisins,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iH" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"it" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/pen,/obj/item/weapon/paper/crumpled{info = "19 06 2554 I fucking knew it. There was a major breach, that idiotic force field failed, and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks. "; name = "Hastily Written Note"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iu" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iv" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iw" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ix" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iy" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iz" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iB" = (/obj/machinery/shower{dir = 8},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iC" = (/obj/structure/table,/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iD" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iE" = (/obj/structure/table,/obj/item/trash/raisins,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iF" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iG" = (/obj/machinery/vending/medical{req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iH" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"iI" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/light/small{active_power_usage = 0; dir = 2; icon_state = "bulb-broken"; status = 2},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("MO19","MO19R")},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"iJ" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"iK" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/laser_pointer,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iL" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iM" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iN" = (/obj/structure/table,/obj/item/weapon/storage/secure/briefcase,/obj/item/device/taperecorder{pixel_x = -3},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iO" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iP" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iQ" = (/obj/structure/closet/emcloset,/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iR" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iS" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iT" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a7)
+"iM" = (/obj/structure/table,/obj/item/weapon/storage/secure/briefcase,/obj/item/device/taperecorder{pixel_x = -3},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iN" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iO" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iP" = (/obj/structure/closet/emcloset,/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iQ" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iR" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iS" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iT" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"iU" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 0},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"iV" = (/obj/machinery/vending/boozeomat{req_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iW" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"iX" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iW" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"iX" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"iY" = (/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"iZ" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ja" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ja" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"jb" = (/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"jc" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"jd" = (/obj/structure/table,/obj/item/weapon/book/manual/detective,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"je" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jf" = (/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jc" = (/obj/structure/table,/obj/item/weapon/book/manual/detective,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jd" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"je" = (/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jf" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jg" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jh" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ji" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jj" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jk" = (/obj/structure/closet/crate/bin,/obj/machinery/light/small{dir = 8},/obj/item/trash/cheesie,/obj/item/trash/can,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jl" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jj" = (/obj/structure/closet/crate/bin,/obj/machinery/light/small{dir = 8},/obj/item/trash/cheesie,/obj/item/trash/can,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jl" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jm" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jn" = (/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jn" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jo" = (/obj/effect/decal/cleanable/flour,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jp" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jq" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"js" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jt" = (/obj/item/weapon/twohanded/required/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ju" = (/obj/structure/table,/obj/item/weapon/newspaper,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jr" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "271"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"js" = (/obj/item/weapon/twohanded/required/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jt" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ju" = (/obj/machinery/vending/snack,/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 0; pixel_y = 32; serial_number = 14; subtype = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jv" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jw" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jx" = (/obj/machinery/vending/snack,/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 0; pixel_y = 32; serial_number = 14; subtype = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jy" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jz" = (/obj/structure/sign/science{pixel_x = 0; pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "purple"; tag = "icon-purple (NORTHWEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jA" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "purple"; tag = "icon-purple (NORTHEAST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jx" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jy" = (/obj/structure/sign/science{pixel_x = 0; pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "purple"; tag = "icon-purple (NORTHWEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jz" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "purple"; tag = "icon-purple (NORTHEAST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"jB" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"jC" = (/obj/structure/alien/weeds,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"jD" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/structure/alien/weeds/node,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"jE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "purple"; tag = "icon-purple (NORTH)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jE" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jG" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jH" = (/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jI" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jJ" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 1; locked = 0; name = "Worn-out APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jI" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"jK" = (/obj/structure/noticeboard{pixel_y = 32},/obj/item/weapon/paper{info = "I Can't Believe It's Not Pasta: Half off on Wednesdays Burger night every Friday 6PM-10PM, free drinks with purchase of meal! Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM "; name = "Specials This Week"},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jL" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jM" = (/obj/structure/noticeboard{pixel_y = 32},/obj/item/weapon/paper{info = "I Can't Believe It's Not Pasta: Half off on Wednesdays Burger night every Friday 6PM-10PM, free drinks with purchase of meal! Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM "; name = "Specials This Week"},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jM" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jN" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jO" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jP" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jP" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"jQ" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes{pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jR" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jS" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jT" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"jV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"jZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ka" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kb" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{dir = 4; icon_state = "purplecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "purplecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jX" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"jY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; name = "Research Director's Office"; opacity = 0; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"jZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ka" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"kb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"kc" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7)
"kd" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ke" = (/obj/structure/grille,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kh" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ki" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless{icon_state = "platingdmg1"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kk" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"km" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kn" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"kg" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaybiohazard"; layer = 2.9; name = "Acid-Proof biohazard containment door"; unacidable = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"kh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a7)
+"ki" = (/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "271"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"kj" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{id = "Awaybiohazard"; name = "Biohazard Shutter Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "271"},/obj/machinery/door_control{id = "AwayRD"; name = "Privacy Shutter Control"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"kk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7)
+"kl" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table,/obj/machinery/computer/id_upgrader,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"km" = (/obj/structure/closet/crate/bin,/obj/item/trash/candy,/obj/item/trash/can,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating,/area/awaycontent/a7)
"ko" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kp" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kq" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchen/knife,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kr" = (/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes{pixel_x = 2; pixel_y = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ks" = (/obj/effect/decal/cleanable/fruit_smudge,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ks" = (/obj/effect/decal/cleanable/plant_smudge,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/processor,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ku" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "awaykitchen"; name = "Serving Hatch"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kv" = (/obj/structure/closet/crate/bin,/obj/item/trash/candy,/obj/item/trash/can,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ky" = (/obj/machinery/light/small,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kz" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kA" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ku" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/newspaper,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kv" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kx" = (/obj/machinery/light/small,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ky" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kz" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kA" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kB" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kC" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "purple"; tag = "icon-purple (NORTH)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kD" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 1; locked = 0; name = "Habitat APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kE" = (/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kF" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kG" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kH" = (/obj/effect/decal/cleanable/generic,/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat."},/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kI" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kI" = (/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kJ" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kK" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kL" = (/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kM" = (/obj/effect/decal/cleanable/blood/xeno{color = "green"},/obj/effect/decal/cleanable/blood/gibs/xeno,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kL" = (/obj/effect/decal/cleanable/blood/xeno{color = "green"},/obj/effect/decal/cleanable/blood/gibs/xeno,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kM" = (/obj/effect/decal/cleanable/blood/xeno{color = "green"},/obj/effect/decal/remains/xeno{desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kN" = (/obj/structure/closet/crate/bin,/obj/item/trash/plate,/obj/item/weapon/reagent_containers/food/snacks/badrecipe,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kO" = (/obj/effect/decal/cleanable/blood/xeno{color = "green"},/obj/effect/decal/remains/xeno{desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kP" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kO" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kP" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kQ" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kR" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kS" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kT" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kU" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kS" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7)
+"kU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kV" = (/obj/machinery/door_control{id = "awaydorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kW" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"kX" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kY" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"kZ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"la" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lb" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kY" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"kZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"la" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lb" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lc" = (/obj/structure/extinguisher_cabinet{pixel_x = 26; pixel_y = 0},/obj/machinery/camera{c_tag = "Kitchen"; dir = 8; network = list("MO19")},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ld" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"le" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lf" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lg" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lh" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"li" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lh" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"li" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lj" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lk" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"ll" = (/obj/item/stack/rods,/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lm" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless{icon_state = "platingdmg3"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ln" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ll" = (/obj/item/stack/rods,/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lm" = (/obj/structure/grille/broken,/obj/item/stack/rods,/turf/simulated/floor/plating/airless{icon_state = "platingdmg3"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ln" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lo" = (/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lp" = (/obj/machinery/door/airlock{id_tag = "awaydorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lq" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/chair/wood/normal,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lr" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ls" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/storage/box,/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lt" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lr" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/storage/box,/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ls" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lt" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("MO19")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lu" = (/obj/machinery/door_control{id = "awaykitchen"; name = "Kitchen Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lv" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("MO19")},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lw" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lx" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ly" = (/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lw" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lx" = (/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ly" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lz" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lA" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lB" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/shuttle/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lC" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lD" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "neutral"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lF" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lG" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lH" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lF" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_r"; tag = "icon-burst_r (WEST)"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lG" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lH" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lK" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lL" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lL" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lM" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lN" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lO" = (/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lP" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lQ" = (/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lR" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "purplecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lS" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lT" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lU" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/item/clothing/suit/chaplain_hoodie,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"lV" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"lV" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is sitting upright with its legs tucked in and hands still holding onto its arms."},/obj/item/weapon/gun/projectile/shotgun/sc_pump,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lW" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lX" = (/obj/structure/table,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"lY" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -628,26 +628,26 @@
"md" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"me" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 30},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mf" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mg" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mh" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is sitting upright with its legs tucked in and hands still holding onto its arms."},/obj/item/weapon/gun/projectile/shotgun/sc_pump,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mg" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_l"; tag = "icon-burst_l (WEST)"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mh" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mi" = (/turf/simulated/floor/plasteel/airless{icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mj" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mj" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mk" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/cleanable/dirt,/obj/structure/window/basic{dir = 1},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ml" = (/obj/structure/stool,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ml" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mn" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mo" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mp" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "purplecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mp" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mq" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mr" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ms" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mt" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mu" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mv" = (/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mw" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mx" = (/obj/structure/grille,/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0},/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"my" = (/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"my" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mz" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mA" = (/obj/structure/table/woodentable,/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mB" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mC" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -666,7 +666,7 @@
"mP" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mQ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mR" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mS" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/noticeboard{dir = 8; pixel_x = 32; pixel_y = 0},/obj/item/weapon/paper{info = "
Welcome to Moon Outpost 19! Property of Nanotrasen Inc. Staff Roster: Dr. Gerald Rosswell: Research Director & Acting Captain Dr. Sakuma Sano: Xenobiologist Dr. Mark Douglas: Xenobiologist Kenneth Cunningham: Security Officer Ivan Volodin: Engineer Mathias Kuester: Bartender Sven Edling: Chef Steve: Assistant Please enjoy your stay, and report any abnormalities to an officer."; name = "Welcome Notice"},/obj/machinery/camera{c_tag = "Arrivals South"; dir = 8; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mT" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mU" = (/obj/machinery/door/airlock{id_tag = "awaydorm2"; name = "Dorm 2"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mV" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -674,53 +674,53 @@
"mX" = (/obj/structure/stool/bed/chair,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mY" = (/turf/simulated/shuttle/wall{icon_state = "swall2"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mZ" = (/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"na" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 9; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"na" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nb" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nc" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nd" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/assistantformal,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating/airless{icon_state = "platingdmg1"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ne" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nf" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ng" = (/obj/structure/filingcabinet,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nh" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/small,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ni" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/light/small,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nj" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nk" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nl" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/generic,/obj/structure/window/basic,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nm" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nn" = (/obj/effect/decal/cleanable/dirt,/obj/item/trash/candy,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"no" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"np" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nr" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"ns" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nq" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ns" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nt" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nu" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nv" = (/obj/machinery/camera{c_tag = "Dormitories"; dir = 4; network = list("MO19")},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nu" = (/obj/structure/grille/broken,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nw" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/airless{icon_plating = "asteroidplating"; icon_state = "asteroidplating"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ny" = (/obj/machinery/light/small{dir = 1},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/table,/obj/structure/bedsheetbin,/obj/item/clothing/accessory/black,/obj/item/clothing/under/lawyer/black,/turf/simulated/floor/plasteel/airless{icon_state = "barber"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nz" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel/airless{icon_state = "barber"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nA" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nB" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nC" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nD" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"nE" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel/airless{icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nF" = (/obj/structure/grille{density = 0; destroyed = 1; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless{icon_state = "platingdmg1"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nF" = (/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/shard,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless{icon_state = "platingdmg1"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nG" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nH" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless{icon_state = "platingdmg3"; name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/door_control{id = "awaydorm3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/remains/human{desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle."; layer = 4.1},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nJ" = (/obj/structure/dresser,/obj/item/weapon/paper{info = "Bugs break out. I run to here and lock door. I hear door next to me break open and screams. All nice people here dead now. I no want to be eaten, and bottle always said to be coward way out, but person who say that is stupid. Mira, there is no escape for me, tell Alexis and Elena that father will never come home, and that I love you all. "; name = "Note"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nK" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nK" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nL" = (/obj/structure/sign/vacuum{desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; name = "\improper HOSTILE ATMOSPHERE AHEAD"; pixel_x = -32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nM" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nN" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 6; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nO" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nP" = (/obj/item/weapon/pen,/obj/item/weapon/storage/pill_bottle{pixel_y = 6},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nQ" = (/obj/machinery/door/airlock{icon_state = "door_locked"; id_tag = "awaydorm3"; locked = 1; name = "Dorm 3"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nS" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nT" = (/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "neutral"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"nU" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/suit_jacket/burgundy,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"nU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nV" = (/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nW" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"nX" = (/obj/structure/table,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -736,9 +736,55 @@
"oh" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"oi" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plating/airless,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"oj" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel/airless{icon_plating = "asteroidplating"; icon_state = "asteroidplating"; name = "plating"},/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"ok" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ol" = (/turf/simulated/mineral,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"om" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"on" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"oo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"op" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"or" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"os" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ot" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "awaykitchen"; name = "Serving Hatch"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ou" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ov" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ow" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"ox" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oz" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oA" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oB" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oC" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oE" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oJ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oK" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oL" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oO" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oQ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oS" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/noticeboard{dir = 8; pixel_x = 32; pixel_y = 0},/obj/item/weapon/paper{info = "
Welcome to Moon Outpost 19! Property of Nanotrasen Inc. Staff Roster: Dr. Gerald Rosswell: Research Director & Acting Captain Dr. Sakuma Sano: Xenobiologist Dr. Mark Douglas: Xenobiologist Kenneth Cunningham: Security Officer Ivan Volodin: Engineer Mathias Kuester: Bartender Sven Edling: Chef Steve: Assistant Please enjoy your stay, and report any abnormalities to an officer."; name = "Welcome Notice"},/obj/machinery/camera{c_tag = "Arrivals South"; dir = 8; network = list("MO19")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oT" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oU" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 9; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oW" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oX" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oY" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "neutralcorner"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oZ" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/assistantformal,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pa" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Dormitories"; dir = 4; network = list("MO19")},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pc" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pd" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pe" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pf" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 6; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"pg" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/burgundy,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -768,7 +814,7 @@ aaaaaaaaaaaaaaababababababababababababababababacaqahacblblblblblblblblblblblblbl
aaaaaaaaaaaaaaababababababababababababababababafaoaqafblblblblblblbladacafadacacblblafacaoaqafabababababababababababaTcCcDcEbZcGcFcIcHcKcJcHcLascMcOcNcOcPasababababaZababaZaZababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababababadahaoacadacafafadacafafahaqaoahafadafacahaqafacabababababababababababaTbYcncRcQcSaTaTaTcTaTcUaTasasasasasasasababababaZababaZaZababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababababacahamaqafaqahaoahaqafahaoacafahamaoaqahaoacadababababababababababababaTbYcncWcVcYcXaTcZdaaTdcdbaTababababababababababaZabaZaZabababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababacafaqaoahaqaoahddaoahaqafafadacafacafacadafabababababababababababababaTdedfcEbZcGdgaTdhdiaTdkdjaTababababababababababaZaZaZababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababacafaqaoahaqaoahddaoahaqafafadacafacafacadafabababababababababababababaTdedfebbZcGdgaTdhdiaTdkdjaTababababababababababaZaZaZababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaabababababababababababababababacafadahaqaoahafafadaqaoacacababababababababababababababababababababababaTdmdldnbZdpdoaTdqdraTdtdsaTababababababababababaZaZabababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababadacahahaoacafacadabafahaoafadababababababababababababababababababababababgzaTaTaTduaTaTaTaTaTaTaTaTaTabababababababababaZaZababababababababaZaZdvabababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababacaqaoafadadababababadafahahafacabababababababababababababababababababababababaTdxdwdyaTababababababababababababababaZaZaZaZabababaZaZaZaZaZaZaZaZdzababababababababababaaaaaaaaaaaaaa
@@ -788,41 +834,41 @@ aaaaaaaaaaaaaaabababababababababababababababababababababababababababdAdAdAdAdAdV
aaaaaaaaaaaaaaabababababababababababababababababababababababababababababdAdAdAdAdAdAaZaZaZaZaZaZaZdAdAababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababdAdAdAdAaZaZaZaZaZaZaZdAabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababdAdAdAaZaZaZaZaZdYdAabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababdAdAdAdZeaebebeaabababdZeadZdZeadZeaeaeaeaeceaeaeaeaeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababdAdAdAdZeaeMeMeaabababdZeadZdZeadZeaeaeaeaeceaeaeaeaeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababdAdAdZedeeefeaabababdZehegeiejekeaelemeneoepeqereseaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababeaeteuevdZabababeaewegexeyezeAeBeCeDeEeFeGeHeIeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeJeJeKeKeKeJeKeJeJeJeKeaeaeLeMeaeaeadZeaeJeNeOePezeqeFeHeQeqeQeReSeCeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeJeTeVeUeXeWeJeYfaeZfcfbfefdffeafhfgfjfifkflfmfnfoeEeneSeFeqeEfpenfqeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeJfrfsfbfufteKfveaeadZeaeafwfyfxfzfzfAfAfBfCfDfEfFfGfHfIfJfKeEeDeRfLecabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeKfMfOfNfQfPfSfReafTfVfUfXfWfYdZeueufZeegaflflgbgcgdgegfeFeFeFggeDeIeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeJfMghfNgjgieKfveagkeuglgngmgoeagqgpgsgreKgtflgugvgwgxeDeEeqeqeqeSfpeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeKgygBgAgDgCeKfvdZgEgGgFgHgmgLdZgIflflgJeJgKflgMgOeAgNeCeDeneReneCeEeaabababababdAabababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababababababababeKeKeJeJeJeKeJgPdZgQgSgRfXgTgUdZdZgVgZgWeKgXgYhaheeahbeFeqhchdeqeqeqeaababdAdAdAdAdAdAdAababababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababababeJhffbfbhgfbhheahihkhjfXgThmhleaeadZeaeaeadZdZeaeaeaeaeaeceaeaeaeaeaabdAdAaZaZaZaZaZdAdAdAababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababababeKfveaeaeaeadZeafXfXfXfXgThmhnfXhohpeLhqdZdAdAdAdAdAdAdAdAababababababdAaZaZaZaZaZaZaZaZdAababababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababababeJhveahrhshthuhxhwhwhwhwflhmhyhAhzhmhBhFeadAaZaZaZaZaZaZdAdAabababababdAdAaZaZaZaZaZaZaZdAdAdAababababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababeJeKeJftdZhChChChDhEgTgTgThGhmhHhyhIhmhmhmhLeadAaZaZaZaZaZaZaZhJhJhKhJhJhJhJhJhJaZaZaZaZaZaZaZaZdAdAabababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababeKhOhMfvdZhChDhNhChxhxhxhxeJhPhPhPeJhmhmhHhQeadAaZaZaZaZaZaZaZhJhRhThShUhJhXhVhJhJaZaZaZhWaZaZaZaZdAabababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababeKeYichheahChYhZiaibidifieeaeaigeadZihijiiikdZdAaZaZaZaZaZaZdAhKhKhJilimhJioiniphKisisishKdAdAdAdAdAabababdAdAdAdAdAabababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababeKfveadZeahCiqirhDhCitiviudZiwhmixeadZdZeaeaeaaZaZaZaZhWaZaZdAhKiyizininiAiBiniChKiEiDiFhKhKhKhJhJhKhJhKdAdAaZaZaZdAdAababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababeJiGeaiLiHhDhCiIiJiKiMiOiNdZiPhmiQeadAdAaZaZaZaZohaZhKhKisishKhKhKhKiBinhKiRiRhJhKiTiSiWiUhKiVjaiXiYiZhKdAaZaZaZaZaZdAababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababababababababababeJfvdZjcdZeadZeaeaeadZeaeaeaeJigeJeadAaZaZaZhWaZjbaZhJjejdjijfjgjhhJjjhKhJhJhJhJjkjljljnjmjqiYjoiYiYjphJaZaZaZaZaZaZdAdAabababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababdAdAdAdAdAeJjrdZdZeajtjsjvjujwjsjyjxhKjzjEjAhJhKkdkdkdhJkdkekdhJjGjFjIjHjIjIjJjIjLjKjNjMjOjnjnjnjPjmjTiYjQjRjojSisaZaZaZaZaZaZaZdAdAababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababdAdAdAdAdAdAdAeKjUfbfSjVjWjWjXjXjWjYjXjZkbkajWkckakkkgkfkikhkCkjkDkljWjXjWjWjWkmknjHjHjHjIjIkojnjnjnjnjmkukpkqkrkskthKaZaZaZaZaZaZaZaZdAababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAdAdAdAaZaZaZeJeJeKeKkvkxkwkxkykxkwkwkxkAkzjFjIkIkBkFkEkHkGkGkQkRkJjIjHhJhKhJhJkLkKjIjHjIjHkojnjnkMkOjmjTiYiYkpiYkNhKaZaZaZaZaZdAdAdAdAababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAdAaZaZaZaZaZaZaZaZhJhJisisishJisisishJhJkPjHkShKhJkdlllmhJkdkdkdhKkUkThJkVkWhKkXhKkZkYlblajOlgjPjnjnjmjTiYiYiYlchKhKhJhJhKaZdAdAabababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZaZldlelfaZaZhJlhlnlihKdAaZaZlkljaZaZaZhKlJlElplolqhKlrhKhKhJhKhKhKlsltjnlvhKhKluiYiYiYlwlylxlGhKdAdAababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZaZldlelelzlelAlBlClAlBlDlKlFaZaZislHlLlIhKdAaZaZaZaZaZaZaZhKmymihKlMlNhJlPlOlQlPlVlOkXjnjljnjnlRlSlSlTlSlUhKlylymhhKababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZldlWlXlYlZmambmcmdmemdmflKmgaZaZislHmjisisaZaZaZaZaZaZaZaZhJmymihJhKhKhJlOmkhJhJhJhKhKmlmljlmnhKlSlTlSlSmmhKmpmomwhJababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZlBmqmcmrlDmsmdmtmumtmdmcmvlDismxislHmzisaZaZaZaZaZaZaZaZdAhKmymQhJmAmBhKlOmMhKabababhKmCmCmDhJhKhKmEmFmGhJhJhKhKhJhJababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZlBmHmdmsmImsmsmJmKmJmsmsmsmLmNlPmOjHmShJmPaZaZaZaZaZaZaZdAhJnamRmUmTmVhKlOnbhJabababhKhKhJhJhKdAhKisisishJaZaZaZaZdAababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZlBmWmcmXmYmsmdmtmumtmdmcmZmYisisislHmjisaZaZaZaZaZaZaZdAdAhJnjkQhKncndhKlQnlhJhJhJdKaZaZdAdAdAdAaZaZaZaZljaZaZaZdAdAababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZnenfnglYlZmanhmcmdnimdmflKlFaZaZislHmjisaZaZaZaZaZaZdAdAdAhKnrnkhKhKhKhJnnnmmOnpmOdKaZaZdAdAaZaZaZaZaZaZaZaZaZaZdAabababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZaZnelelenolelAlBlClAlBmYlKmgaZaZisnqmjisaZaZaZaZdAdAolhJhJhKnvmikXlPnslrnunthJlVhJnxaZdAdAdAaZaZaZaZaZaZaZaZaZdAdAabababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZnelenwaZaZhJmOmOhJhJdAdAdAdAdAaZkdnznykRnEhJhKhJhJhKnAhJhJhJaZdAdAabdAdAdAaZaZaZaZaZdAdAdAababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaabababababababababababababababababdAdAdAdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZhJnBlPnChJdAdAaZaZaZnDnFnHnGnNmQhKnInJhKlPlOnKhKaZaZdAdAabababdAdAaZaZaZdAdAababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababdAdAdAdAdAdAdAdAdAdAdAdAaZdAdAdAdAdAdAdAhJnLlOnMhJomaZaZaZaZjbkdnOkGkGnTnQnPlohKlOnRnShKaZaZdAdAababababdAdAdAdAdAabababababababababababababababababababababababaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaababababababababababababababababababababdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAhJmOmOhJhJaZaZaZaZaZaZkdnXkFkGnYhKnUnVhKhJnWhKhKaZaZdAdAababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeTeTeUeUeUeTeUeTeTeTeUeVeVeWeXeaeaeadZeaeJeNeOePezeqeFeHeQeqeQeReSeCeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeTeYfaeZfcfbeTfefgfffsfrftfdfueafhfvfjfifkflfmfnfoeEeneSeFeqeEfpenfqeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeTfxfyfrfNfMeUfOeVeVfPeVeVfwfRfQfzfzfAfAfBfCfDfEfFfGfHfIfJfKeEeDeRfLecabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeUfSfYfVgafZgigheVfTgjfUfXfWgogngygygBgAgDgCgIgbgcgdgegfeFeFeFggeDeIeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeTgagLfVgQgPeUfOeVgkeuglgUgmhfeagqgpgsgreKgtflgugvgwgxeDeEeqeqeqeSfpeaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeUhghlhhhnhmeUfOfPgEgGgFgHgmhqdZhrflflgJeJgKflgMgOeAgNeCeDeneReneCeEeaabababababdAabababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababeUeUeTeTeTeUeThufPhvgSgRfXgThEdZdZgVgZgWeKgXgYhaheeahbeFeqhchdeqeqeqeaababdAdAdAdAdAdAdAababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababeThHfrfrhLfrhMeVhihkhjfXgTifhXeaeadZeaeaeadZdZeaeaeaeaeaeceaeaeaeaeaabdAdAaZaZaZaZaZdAdAdAababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababeUfOeVeVeVeVfPeVfXfXfXfXgTifiqfXiGhoeLhpdZdAdAdAdAdAdAdAdAababababababdAaZaZaZaZaZaZaZaZdAababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababeTiLeVjrhshtjthxjAjAjAjAgCjPjJhAhyflhzhBeadAaZaZaZaZaZaZdAdAabababababdAdAaZaZaZaZaZaZaZdAdAdAababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababeTeUeTfMfPhChChCjXjYgTgTgThFfljZhwkaflflflhIeadAaZaZaZaZaZaZaZhJhJhKhJhJhJhJhJhJaZaZaZaZaZaZaZaZdAdAabababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababeUkckbfOfPhChDhNkfhxhxhxhxeJhOkghOeJflflhGhPeadAaZaZaZaZaZaZaZhJhQhShRhThJhVhUhJhJaZaZaZhWaZaZaZaZdAabababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababeUfekhhMeVhChYhZiaibicieideaeakieadZigiiihijdZdAaZaZaZaZaZaZdAhKhKhJikilhJinimiohKisisishKdAdAdAdAdAabababdAdAdAdAdAabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababeUfOeVfPeVhCkjirhDhCipiuitdZivifiweadZdZeaeaeaaZaZaZaZhWaZaZdAhKixiyimimiziAimiBhKiDiCiEhKhKhKhJhJhKhJhKdAdAaZaZaZdAdAababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababeTkkeViHiFhDhCiIiJiKkliNiMdZiOifiPeadAdAaZaZaZaZohaZhKhKisishKhKhKhKiAimhKiQiQhJhKiSiRiTiUhKiViXiWiYiZhKdAaZaZaZaZaZdAababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababeTfOfPjadZeadZeaeaeadZeaeaeaeJkieJeadAaZaZaZhWaZjbaZhJjdjcjijejgjhhJjfhKhJhJhJhJjjjkjkjljmjqiYjoiYiYjphJaZaZaZaZaZaZdAdAabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababdAdAdAdAdAeTknfPfPeajsjnjvkujwjnjxjuhKjykCjzhJhKkdkdkdhJkdkekdhJjGjFjEjHjEjEkDjEjLjIjMjKjOjljljljNjmjTiYjQjRjojSisaZaZaZaZaZaZaZdAdAababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababdAdAdAdAdAdAdAeUkTfrgijUjWjWjVkUlikWlIlvlRlJmomnlJmpmymwnamznjndnvnrnAlIlililinKnUnNnNokoooooqopopopoporotoskqkrkskthKaZaZaZaZaZaZaZaZdAababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAdAdAdAaZaZaZeTeTeUeUkmkwkvkwkxkwkvkvkwkzkyoujEkAkBkFkEkHovkGkQkRkJowjHhJhKhJhJkIkKjEoxjEjHkojljlkLkMjmjTiYiYkpiYkNhKaZaZaZaZaZdAdAdAdAababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAdAaZaZaZaZaZaZaZaZhJhJisisishJisisishJhJkOoykPhKhJkdlllmhJhJhJhJhKozkShJkVoAhKkXhKkYoBlakZjOlbjNjljljmjTiYiYiYlchKhKhJhJhKaZdAdAabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZaZldlelfaZaZhJlgoClhhKdAaZaZlkljhKnbnbhKoDlElplolqhKlnhKhKhJhKhKhKlrlsjllthKhKluiYiYiYoElxlwlyhKdAdAababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZaZldlelelzlelAlBlClAlBlDlKlFaZaZislGoFlHhKdAaZaZaZaZhJlOlOhKoGmihKlMlNhJlPlOlQlPlLlOkXjljkjljloHlSlSlTlSlUhKlxlxlVhKababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZldlWlXlYlZmambmcmdmemdmflKmgaZaZislGoIisisaZaZaZaZaZhJnBlOoJoGmihJhKhKhJlOmkhJhJhJhKhKmjmjjkmlhKlSlTlSlSmmhKoLoKoMhJababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZlBmqmcmrlDmsmdmtmumtmdmcmvlDismxislGoNisaZaZaZaZaZaZhKoOoQoPoRmQhJmAmBhKlOmMhKabababhKmCmCmDhJhKhKmEmFmGhJhJhKhKhJhJababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZlBmHmdmsmImsmsmJmKmJmsmsmsmLmNlPmOjHoShJmPaZaZaZaZaZhKoTlOhJoUmRmUmTmVhKlOnbhJabababhKhKhJhJhKdAhKisisishJaZaZaZaZdAababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZlBmWmcmXmYmsmdmtmumtmdmcmZmYisisislGoVisaZaZaZaZaZaZhJoWoXhJoYkQhKncoZhKlQnlhJhJhJdKaZaZdAdAdAdAaZaZaZaZljaZaZaZdAdAababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZnenfnglYlZmanhmcmdnimdmflKlFaZaZislGmhisaZaZaZaZaZaZhJpaoXhKpbnkhKhKhKhJnnnmmOnpmOdKaZaZdAdAaZaZaZaZaZaZaZaZaZaZdAabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAaZaZaZaZnelelenolelAlBlClAlBmYlKmgaZaZismSmhisaZaZaZaZdAdAhJhJhJhKpcmikXlPnqlnnunthJlLhJnxaZdAdAdAaZaZaZaZaZaZaZaZaZdAdAabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZnelenwaZaZhJmOmOhJhJdAdAdAdAdAaZkdnznypdnEhJhKhJhJhKpehJhJhJaZdAdAabdAdAdAaZaZaZaZaZdAdAdAababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababdAdAdAdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZhJnBlPnChJdAdAaZaZaZnDnFnHnGpfmQhKnInJhKlPlOnshKaZaZdAdAabababdAdAaZaZaZdAdAababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababdAdAdAdAdAdAdAdAdAdAdAdAaZdAdAdAdAdAdAdAhJnLlOnMhJomaZaZaZaZjbkdnOkGovnTnQnPlohKlOnRnShKaZaZdAdAababababdAdAdAdAdAabababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAhJmOmOhJhJaZaZaZaZaZaZkdnXkFkGnYhKpgnVhKhJnWhKhKaZaZdAdAababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababababababababababababababababdAdAdAdAdAabdAdAdAaZnZdKdKnZaZaZaZaZaZaZaZkdoboakGochJhJhKhKdKoddKonaZaZdAdAababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZkdkdkdoioghJabababdAodaZaZaZaZdAdAababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababdAdAaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZkdkdkdhKababdAdAodaZaZaZaZaZdAababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm
index 3f824e041db..8b0cfa0e30a 100644
--- a/_maps/map_files/RandomZLevels/spacebattle.dmm
+++ b/_maps/map_files/RandomZLevels/spacebattle.dmm
@@ -10,7 +10,7 @@
"aj" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"ak" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"al" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
-"am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
+"am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"an" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"ao" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"ap" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
@@ -56,7 +56,7 @@
"bd" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"be" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating,/area/awaymission/spacebattle/syndicate2)
"bf" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3)
-"bg" = (/obj/structure/table/reinforced,/obj/item/clothing/head/helmet/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
+"bg" = (/obj/structure/table/reinforced,/obj/item/clothing/head/helmet/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"bh" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"bi" = (/obj/structure/table/reinforced,/obj/item/clothing/gloves/combat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"bj" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
@@ -201,7 +201,7 @@
"dS" = (/obj/structure/rack,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/awaymission/spacebattle/cruiser)
"dT" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/awaymission/spacebattle/cruiser)
"dU" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/spacebattle/cruiser)
-"dV" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Andrew Thorn"; name = "Andrew Thorn"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"dV" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Andrew Thorn"; name = "Andrew Thorn"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"dW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
"dX" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
"dY" = (/obj/effect/landmark/corpse/engineer{mobname = "Clay Dawson"; name = "Clay Dawson"},/turf/simulated/floor/plasteel{tag = "icon-damaged5"; icon_state = "damaged5"},/area/awaymission/spacebattle/cruiser)
@@ -237,7 +237,7 @@
"eC" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
"eD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"eE" = (/mob/living/simple_animal/hostile/syndicate/melee/space,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
-"eF" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Peter West"; name = "Peter West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"eF" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Peter West"; name = "Peter West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"eG" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/awaymission/spacebattle/cruiser)
"eH" = (/turf/simulated/shuttle/wall{tag = "icon-swallc4"; icon_state = "swallc4"},/area/awaymission/spacebattle/cruiser)
"eI" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate4)
@@ -256,7 +256,7 @@
"eV" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Kurt Kliest"; name = "Kurt Kliest"},/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/ammo_casing/shotgun,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"eW" = (/obj/item/ammo_casing/shotgun,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"eX" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
-"eY" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Eric Abnett"; name = "Eric Abnett"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"eY" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Eric Abnett"; name = "Eric Abnett"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"eZ" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"fa" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/awaymission/spacebattle/cruiser)
"fb" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/spacebattle/cruiser)
@@ -346,7 +346,7 @@
"gH" = (/mob/living/simple_animal/hostile/syndicate/melee/space,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser)
"gI" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
"gJ" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
-"gK" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; name = "Jeremy Tailor"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"gK" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; name = "Jeremy Tailor"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"gL" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate7)
"gM" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate7)
"gN" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate4)
@@ -364,7 +364,7 @@
"gZ" = (/obj/item/weapon/pickaxe,/obj/item/weapon/gun/energy/plasmacutter,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"ha" = (/obj/item/weapon/circular_saw,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
"hb" = (/obj/item/weapon/paper_bin,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser)
-"hc" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Dan Hedricks"; name = "Dan Hedricks"},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"hc" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Dan Hedricks"; name = "Dan Hedricks"},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"hd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/spacebattle/syndicate7)
"he" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate7)
"hf" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate7)
@@ -373,7 +373,7 @@
"hi" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"hj" = (/obj/structure/closet/crate/secure/plasma,/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"hk" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
-"hl" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig,/obj/item/clothing/head/helmet/space/rig,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
+"hl" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit,/obj/item/clothing/head/helmet/space/hardsuit,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"hm" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/awaymission/spacebattle/cruiser)
"hn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
"ho" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm
index c09808a51f8..b5bd1bdb320 100644
--- a/_maps/map_files/RandomZLevels/spacehotel.dmm
+++ b/_maps/map_files/RandomZLevels/spacehotel.dmm
@@ -483,7 +483,7 @@
"jo" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/soft/red,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
"jp" = (/obj/item/toy/prize/honk,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
"jq" = (/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
-"jr" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jr" = (/obj/item/weapon/grown/bananapeel,/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
"js" = (/obj/structure/barricade/wooden,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
"jt" = (/obj/machinery/door/airlock/glass,/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 3.2},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
"ju" = (/obj/machinery/gateway{dir = 10},/turf/unsimulated/floor{icon_state = "warning"; dir = 10},/area/awaymission/spacehotel)
@@ -565,11 +565,11 @@
"kS" = (/turf/simulated/shuttle/floor,/area/awaymission)
"kT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission)
"kU" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/unsimulated/floor/plating/airless,/area/awaymission)
-"kV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission)
+"kV" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"},/turf/space,/area/awaymission)
"kW" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/space)
"kX" = (/turf/simulated/shuttle/wall/interior,/area/space)
"kY" = (/turf/simulated/shuttle/wall{icon_state = "swall3"},/area/space)
-"kZ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/space)
+"kZ" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"},/turf/space,/area/space)
"la" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
"lb" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/awaymission)
"lc" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm
new file mode 100644
index 00000000000..fbf21c23670
--- /dev/null
+++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm
@@ -0,0 +1,1510 @@
+"aa" = (/turf/unsimulated/wall{icon_state = "rock"; name = "rock"},/area/awaymission/UO71/outside)
+"ab" = (/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"ac" = (/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"ad" = (/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"ae" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"af" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"ag" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"ah" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "weld"; id_tag = "UO71_waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0; welded = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"ai" = (/obj/structure/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"aj" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"ak" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"al" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"am" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"an" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"ao" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"ap" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"aq" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"ar" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"as" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"at" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"au" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"av" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"aw" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"ax" = (/obj/structure/stool/bed/chair/comfy/beige{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"ay" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"az" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aA" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aC" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aD" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"aE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/item/weapon/gun/energy/laser/retro,/obj/item/weapon/paper/terrorspiders8,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aF" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/female,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aG" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aH" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aI" = (/obj/structure/spider/terrorweb,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aJ" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"aK" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aM" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aN" = (/obj/machinery/door/airlock{id_tag = "awaydormE1"; locked = 0; name = "Executive Dorm 1"; req_access_txt = "271"},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aO" = (/obj/structure/spider/terrorweb,/obj/item/weapon/bedsheet,/obj/structure/stool/bed,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aP" = (/obj/structure/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"aQ" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"aR" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"aS" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"aT" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aV" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/item/weapon/lighter{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aW" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aY" = (/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"aZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"ba" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bb" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bc" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bd" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"be" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Arrivals"; dir = 8; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bf" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bg" = (/obj/machinery/light/small{dir = 1},/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/item/weapon/gun/energy/laser/awaymission_aeg,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"bh" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"bi" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bj" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"bm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"bp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bq" = (/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"br" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bs" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bt" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bw" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"by" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bB" = (/obj/machinery/door/airlock{id_tag = "awaydormE2"; locked = 0; name = "Executive Dorm 2"; req_access_txt = "271"},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"bC" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"bD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bF" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"bG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bK" = (/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"bL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"bO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"bT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"bU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/plaza)
+"bV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"bY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"ca" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cd" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"ce" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cf" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cg" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"ch" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"ci" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/pj/blue,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/female,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"ck" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cl" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cn" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"co" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/grille,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cp" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/plaza)
+"cr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"ct" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cu" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{id = "awaydorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"cw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 2},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"cC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"cE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cF" = (/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cG" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"cJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"cK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; locked = 0; name = "Dorm 1"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"cP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"cS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"cU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"cV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"cW" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"cX" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaymission/UO71/plaza)
+"cY" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"cZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"da" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"db" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dc" = (/obj/machinery/seed_extractor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"de" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/plaza)
+"df" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dh" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaymission/UO71/plaza)
+"di" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dm" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dn" = (/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"do" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/UO71/plaza)
+"ds" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "271"},/obj/item/device/plant_analyzer,/obj/item/clothing/mask/bandana,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dt" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/awaymission/UO71/plaza)
+"du" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"dv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/stool/bed/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dw" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/weapon/storage/belt/security,/obj/item/device/flash,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dx" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dz" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"dA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"dB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"dC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"dD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dF" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dG" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dH" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dI" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"dJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"dK" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "271"},/obj/item/clothing/suit/apron,/obj/item/clothing/mask/bandana,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Security Checkpoint Maintenance"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"dM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"dN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dP" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dQ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/awaymission/UO71/plaza)
+"dR" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"dS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"dT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dX" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"dZ" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/obj/machinery/computer/security{network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ea" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/door/window/southleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Security Checkpoint"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"eb" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ec" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ed" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"ee" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/awaymission/UO71/plaza)
+"ef" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/awaymission/UO71/plaza)
+"eg" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"eh" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"ei" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/item/weapon/paper/hydroponics,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"ej" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ek" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/folder/red,/obj/machinery/door/window/southleft{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Checkpoint"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"el" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/plaza)
+"em" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"en" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/awaymission/UO71/plaza)
+"eo" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaymission/UO71/plaza)
+"ep" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"eq" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"er" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"es" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"et" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/plaza)
+"ev" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ew" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ex" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaymission/UO71/plaza)
+"ey" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"ez" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaymission/UO71/plaza)
+"eA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eB" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eD" = (/obj/machinery/camera{c_tag = "Hydroponics"; dir = 1; network = list("UO71")},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 5},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eJ" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"eK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"eL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"eM" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eN" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"eO" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"eP" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"eQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"eR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"eS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"eT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza)
+"eU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"eV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"eW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm3"; name = "Dorm 3"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"eX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door_control{id = "awaydorm3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"eY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"eZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"fa" = (/turf/simulated/wall/rust,/area/awaymission/UO71/outside)
+"fb" = (/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fc" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"fe" = (/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"ff" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaymission/UO71/plaza)
+"fg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"fh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"fi" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{dir = 1; name = "Hydroponics Desk"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall)
+"fj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/centralhall)
+"fk" = (/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fl" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"fm" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza)
+"fn" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"fo" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"fp" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Central Hallway"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"fq" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"fr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"fs" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza)
+"ft" = (/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fw" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fy" = (/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"fz" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza)
+"fA" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fB" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"fF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"fG" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fH" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"fJ" = (/obj/effect/decal/cleanable/dirt,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"fL" = (/turf/simulated/wall,/area/awaymission/UO71/gateway)
+"fM" = (/turf/simulated/wall/rust,/area/awaymission/UO71/gateway)
+"fN" = (/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"fO" = (/turf/simulated/wall,/area/awaymission/UO71/science)
+"fP" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"fQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"fR" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"fS" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fT" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"fU" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fV" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fW" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fY" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fZ" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"ga" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"gb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"gc" = (/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gd" = (/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"ge" = (/obj/structure/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"gf" = (/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO71")},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"gg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gh" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gi" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"gj" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 16; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 23},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"gk" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gl" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"gn" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"go" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gp" = (/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"gq" = (/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO71")},/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"gr" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gs" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"gt" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gu" = (/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gv" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"gw" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/item/robot_parts/l_arm,/obj/item/robot_parts/r_arm,/obj/item/robot_parts/l_leg,/obj/item/robot_parts/r_leg,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"gx" = (/mob/living/simple_animal/hostile/poison/terror_spider/prince,/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"gy" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO71")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"gz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"gA" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"gB" = (/obj/machinery/light/small{dir = 4},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"gC" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"gD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"gE" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gF" = (/obj/machinery/vending/snack,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gG" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gH" = (/obj/structure/table/reinforced,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gI" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gJ" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gK" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gL" = (/obj/machinery/vending/boozeomat{req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gM" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gN" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/applepie,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gP" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Kitchen"; dir = 8; network = list("UO71")},/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gQ" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gR" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gS" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gU" = (/mob/living/simple_animal/hostile/poison/terror_spider/mother,/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"gV" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gW" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/gateway)
+"gX" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"gY" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"gZ" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/UO71/science)
+"ha" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/UO71/science)
+"hb" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/UO71/science)
+"hc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"hd" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"he" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"hf" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"hg" = (/obj/structure/table,/obj/item/trash/chips,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hh" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hi" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hj" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hk" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hl" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "271"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hn" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"ho" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hq" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hr" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"hs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"ht" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"hu" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"hv" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"hw" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"hx" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hy" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hz" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"hA" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"hB" = (/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"hC" = (/obj/machinery/computer/rdconsole/core{id = 3; req_access = null},/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"hD" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"hE" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"hF" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"hG" = (/obj/item/weapon/paper{info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them."; name = "Research Notes"; origin_tech = "combat=2;materials=2;engineering=2;biotech=2"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"hH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"hI" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"hJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"hK" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hL" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hM" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hN" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hO" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hP" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hQ" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hR" = (/obj/machinery/processor,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hS" = (/obj/structure/window/reinforced,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hT" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"hV" = (/obj/machinery/light/small,/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"hW" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"hX" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/dirt,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/window{dir = 2; name = "Gateway Chamber"; req_access_txt = "271"},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"ia" = (/obj/machinery/door/airlock{name = "Emergency Supplies"},/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"ib" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"ic" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"id" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"ie" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0; welded = 1},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"if" = (/obj/machinery/light/small,/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"ig" = (/obj/machinery/atmospherics/unary/vent_pump{icon_state = "weld"; on = 1; welded = 1},/obj/machinery/light/small,/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"ih" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"ii" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"ij" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/awaymission/UO71/science)
+"ik" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"il" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"im" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"in" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"io" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ip" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"ir" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"is" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"it" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/gateway)
+"iu" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"iv" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"iw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"ix" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/gateway)
+"iy" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"iz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"iA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/awaymission/UO71/gateway)
+"iB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"iC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"iD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"iE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"iF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"iG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"iH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump,/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"iI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"iJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"iK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"iL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"iM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"iN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"iO" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mother)
+"iP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"iQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"iR" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/prince)
+"iS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"iT" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"iU" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"iV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iX" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"iZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "weld"; on = 1; welded = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"ja" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Gateway Chamber"; dir = 4; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"jb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"jc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"jd" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"je" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"jf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"jg" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"jh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"ji" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/science)
+"jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{id_tag = "UO71_Start"; name = "UO71 Sealed Facility"},/obj/machinery/door/airlock/research{name = "Gateway Observation"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/gateway)
+"jk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"jl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"jm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/outside)
+"jn" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/mother)
+"jo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"jp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"jq" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/prince)
+"jr" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"js" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"jt" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ju" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jv" = (/obj/machinery/door/window/southright{name = "Bar Door"; req_access_txt = "271"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"jx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"jy" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"jA" = (/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("UO71")},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jB" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/centralhall)
+"jD" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"jE" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"jF" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/item/weapon/paper/terrorspiders1,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"jG" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/science)
+"jH" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"jI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"jJ" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"jK" = (/obj/machinery/door/poddoor{id_tag = "UO71_Containment"; name = "Containment 1"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mother)
+"jL" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"jM" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"jN" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"jO" = (/obj/machinery/door/poddoor{id_tag = "UO71_Containment"; name = "Containment 2"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/prince)
+"jP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"jQ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/centralhall)
+"jR" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jS" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 1; locked = 0; name = "UO71 Bar APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"jY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"jZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"ka" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"kb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"kc" = (/obj/machinery/door/poddoor{id_tag = "UO71_Start"; name = "UO71 Sealed Facility"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"kd" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/command{icon_state = "door_closed"; lockdownbyai = 0; locked = 0; name = "Gateway Chamber"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"ke" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "CONTAINMENT AREA"},/turf/simulated/wall,/area/awaymission/UO71/science)
+"kf" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/UO71/science)
+"kg" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/UO71/science)
+"kh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"ki" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"kj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kk" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/awaymission/UO71/gateway)
+"kl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"km" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/science)
+"kn" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "CONTAINMENT AREA"},/turf/simulated/wall/r_wall,/area/awaymission/UO71/science)
+"ko" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/paper/terrorspiders5,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/UO71/science)
+"kp" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/UO71/science)
+"kq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/spider/cocoon{icon_state = "cocoon_large1"},/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"kr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"ks" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"kt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaymission/UO71/science)
+"ku" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"kv" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"kw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ky" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kB" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"kC" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"kD" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"kE" = (/obj/structure/table,/obj/machinery/computer/id_upgrader,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/gateway)
+"kF" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"kG" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"kH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"kI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kM" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kQ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"kS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"kT" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"kU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"kV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"kW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kX" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"la" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"lb" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"lc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"ld" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"le" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"lf" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/awaymission/UO71/science)
+"lg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lh" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_biohazard"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/science)
+"li" = (/obj/machinery/shower{pixel_y = 15},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"lj" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"lk" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"ll" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"lm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/sign/science{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "purplecorner"; tag = "icon-purplecorner (WEST)"},/area/awaymission/UO71/centralhall)
+"ln" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"lo" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"lp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"lq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ls" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lt" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/eng)
+"lu" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lx" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/structure/sign/nosmoking_2{pixel_x = -32},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/gateway)
+"ly" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"lz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"lA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/camera{c_tag = "Gateway Ready Room"; dir = 2; network = list("UO71")},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"lB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"lC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"lD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"lE" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{id_tag = "UO71_Start"; name = "UO71 Sealed Facility"},/obj/machinery/door/airlock/command{icon_state = "door_closed"; lockdownbyai = 0; locked = 0; name = "Gateway Ready Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"lF" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"lG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"lH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Research Division West"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lM" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/mob/living/simple_animal/hostile/poison/terror_spider/red{ai_ventcrawls = 0; wander = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO71 Research Division APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"lT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lW" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Research Division East"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lX" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lY" = (/obj/structure/sign/directions/medical{pixel_y = -12},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lZ" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"ma" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"mb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "purple"; tag = "icon-purple (WEST)"},/area/awaymission/UO71/centralhall)
+"mc" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"md" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"me" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"mf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"mg" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"mh" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 2; network = list("UO71")},/obj/item/weapon/rcd/combat,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"mi" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/plasma{amount = 26},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"mj" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"mk" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/gateway)
+"ml" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mm" = (/obj/structure/spider/cocoon{contents = newlist(/obj/effect/decal/remains/human); icon_state = "cocoon_large1"},/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"mn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; icon_state = "weld"; on = 1; pressure_checks = 1; welded = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/gateway)
+"mo" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"mp" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/gateway)
+"mq" = (/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"mr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"ms" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"mt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/command{name = "Research Director's Office"; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mu" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"mv" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"mw" = (/obj/structure/closet/firecloset,/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"mx" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"my" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"mz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaymission/UO71/centralhall)
+"mA" = (/obj/structure/table,/obj/item/weapon/newspaper,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"mB" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"mC" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"mD" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"mE" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/obj/item/weapon/reagent_containers/food/pill/haloperidol,/obj/item/weapon/reagent_containers/food/pill/haloperidol,/obj/item/weapon/reagent_containers/food/pill/haloperidol,/obj/item/weapon/reagent_containers/food/pill/haloperidol,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"mF" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/pj/red,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"mG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/stool/bed/chair/wood/normal{dir = 8},/obj/item/weapon/paper/terrorspiders4,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"mH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"mI" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"mJ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"mK" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "UO71_Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 6; pixel_y = -24; req_access_txt = "271"},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"mL" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mM" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mN" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mO" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mP" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO71 Gateway APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/machinery/light/small,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/gun/energy/laser/awaymission_aeg,/obj/item/weapon/gun/energy/laser/awaymission_aeg,/obj/item/weapon/gun/energy/laser/awaymission_aeg,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mQ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"mS" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/awaymission/UO71/gateway)
+"mT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"mU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"mV" = (/obj/structure/table,/obj/item/weapon/paper/terrorspiders6,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"mW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"mX" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "271"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/suit/storage/labcoat/science,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mZ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"na" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nc" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nd" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO71_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -6; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaymission/UO71/science)
+"ne" = (/obj/structure/table,/obj/machinery/newscaster{pixel_x = -30},/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaymission/UO71/science)
+"nf" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaymission/UO71/science)
+"ng" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"nh" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"ni" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{id = "awaydorm5"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"nj" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"nk" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"nl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"nm" = (/obj/machinery/door_control{id = "awaydorm7"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"nn" = (/obj/machinery/atmospherics/unary/vent_pump{icon_state = "weld"; on = 1; welded = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"no" = (/obj/machinery/vending/cola,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"np" = (/turf/simulated/wall,/area/awaymission/UO71/eng)
+"nq" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nr" = (/turf/simulated/wall/r_wall/rust,/area/awaymission/UO71/eng)
+"ns" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nt" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"nv" = (/obj/machinery/door/poddoor{id_tag = "UO71_Secure Storage"; name = "secure storage"},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"nw" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"nx" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"ny" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"nz" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nB" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/paper{info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them."; name = "Research Notes"; origin_tech = "combat=2;materials=2;engineering=2;biotech=2"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nC" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nE" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"nF" = (/obj/machinery/computer/security{network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/science)
+"nG" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 8; name = "research monitor"; network = list("UO71")},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/science)
+"nH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"nI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"nJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"nK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"nL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nN" = (/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall)
+"nO" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall)
+"nP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm5"; name = "Dorm 5"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"nQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm7"; name = "Dorm 7"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"nR" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"nT" = (/turf/simulated/wall/rust,/area/awaymission/UO71/eng)
+"nU" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"nV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"nX" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"nY" = (/obj/machinery/door/window/southleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Chem Testing"; req_access_txt = "271"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"nZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"oa" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"ob" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"oc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"od" = (/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"oe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"of" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/pill/charcoal,/obj/item/weapon/reagent_containers/food/pill/charcoal,/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"og" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"oh" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/laser_pointer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oi" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oj" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"ok" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaymission/UO71/science)
+"ol" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/science)
+"om" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"on" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 2; name = "research monitor"; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"op" = (/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oq" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/science)
+"or" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/science)
+"os" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/science)
+"ot" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"ou" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"ov" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"ow" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"ox" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/camera{c_tag = "Dormitories"; dir = 2; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oy" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"oB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"oH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"oI" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"oJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-y"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oK" = (/mob/living/carbon/human/monkey{name = "George the lab monkey"; toxloss = 193},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"oL" = (/obj/structure/window/reinforced{dir = 4; layer = 2.9},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"oM" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-y (WEST)"; icon_state = "pipe-y"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"oN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"oO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"oP" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 5e+006; input_level = 30000; inputting = 0; output_level = 25000; outputting = 1},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"oQ" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 5e+006; input_level = 10000; inputting = 0; output_level = 25000; outputting = 1},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"oR" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"oS" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"oT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/pill/methamphetamine,/obj/item/weapon/reagent_containers/food/pill/methamphetamine,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"oU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"oV" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oW" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO71_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oX" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oY" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oZ" = (/obj/machinery/computer/aifixer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO71_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "271"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/science)
+"pb" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaymission/UO71/science)
+"pc" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science)
+"pd" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaymission/UO71/science)
+"pe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"pf" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"ph" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"pi" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"po" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"pp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pq" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 6; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"ps" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"pt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"pu" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pv" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "UO71_air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"px" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/item/weapon/wrench,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"py" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"pz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"pA" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"pB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/wall,/area/awaymission/UO71/science)
+"pC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/science)
+"pD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"pE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pF" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"pI" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pJ" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pK" = (/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm4"; name = "Dorm 4"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"pM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm6"; name = "Dorm 6"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"pN" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"pO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"pP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "UO71_air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pQ" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 2; frequency = 1443; id = "UO71_air_in"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"pS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"pT" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/loot)
+"pU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"pV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/medical)
+"pW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"pX" = (/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"pY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"pZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"qa" = (/turf/simulated/wall,/area/awaymission/UO71/medical)
+"qb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"qc" = (/obj/machinery/door/airlock/command{name = "Server Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"qd" = (/obj/machinery/door/poddoor{id_tag = "UO71_SciStorage"; name = "SciStorage Door"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/loot)
+"qe" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/UO71/medical)
+"qf" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Storage"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"qg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"qh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"qi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"qj" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"qk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"ql" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{id = "awaydorm4"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{id = "awaydorm6"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qo" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qp" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qq" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qr" = (/obj/machinery/meter{frequency = 1443; id = "UO71_mair_out_meter"; layer = 3.3; name = "Mixed Air Tank Out"},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"qs" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "UO71_mair_in_meter"; layer = 3.3; name = "Mixed Air Tank In"},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"qt" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"qv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"qw" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qx" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/centralhall)
+"qy" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"qz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass_engineering{name = "SMES Room"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"qA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"qB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"qC" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"qD" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/obj/machinery/light/small{dir = 4},/obj/item/borg/upgrade/vtec,/obj/item/weapon/stock_parts/cell/bluespace,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"qE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"qF" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"qG" = (/obj/machinery/vending/medical{req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"qH" = (/obj/structure/table,/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/hand_labeler,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"qI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/l3closet/general,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"qJ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"qK" = (/obj/machinery/door/poddoor{id_tag = "UO71_Bridge"; name = "Bridge Lockdown Door"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"qL" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qN" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qO" = (/obj/machinery/light/small{dir = 8},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"qP" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qQ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qR" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"qS" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/eng)
+"qT" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/eng)
+"qU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qV" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"qW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qX" = (/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/closet/secure_closet/engineering_personal{req_access = list(201)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qY" = (/obj/structure/closet/secure_closet{icon_broken = "secureengbroken"; icon_closed = "secureeng"; icon_locked = "secureeng1"; icon_off = "secureengoff"; icon_opened = "secureengopen"; icon_state = "secureeng1"; locked = 1; name = "engineer's locker"; req_access_txt = "271"},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qZ" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "UO71_air_in"; name = "Mixed Air Supply Control"; output_tag = "UO71_air_out"; pressure_setting = 2000; sensors = list("UO71_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 9; icon_state = "arrival"; tag = "icon-arrival (NORTHWEST)"},/area/awaymission/UO71/eng)
+"ra" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/r_n_d/server/core{id_with_download_string = "3"; id_with_upload_string = "3"; req_access = null},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"rb" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"rc" = (/obj/machinery/camera{c_tag = "Atmospherics"; dir = 2; network = list("UO71")},/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/item/device/multitool,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/UO71/eng)
+"rd" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"re" = (/obj/machinery/atmospherics/trinary/mixer{dir = 1; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; req_access = null; target_pressure = 4500},/turf/simulated/floor/plasteel{dir = 5; icon_state = "arrival"},/area/awaymission/UO71/eng)
+"rf" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"rg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"rh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/wall,/area/awaymission/UO71/medical)
+"ri" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"rj" = (/obj/machinery/door/airlock/glass_command{name = "Server Room"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"rk" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/chair/office/light,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"rl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"rm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"rn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"ro" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"rp" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"rq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"rr" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"rs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"rt" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"ru" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"rv" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaymission/UO71/centralhall)
+"rw" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"rx" = (/obj/machinery/door/airlock{name = "Unit 2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"ry" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"rz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"rA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"rB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"rC" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"rD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/eng)
+"rE" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"rF" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"rG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"rH" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaymission/UO71/eng)
+"rI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaymission/UO71/eng)
+"rJ" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/newscaster{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaymission/UO71/eng)
+"rK" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 8; locked = 1; name = "UO71 Engineering APC"; pixel_x = -25; pixel_y = 0; req_access = list(201); start_charge = 100},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"rL" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air to Distro"; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"rM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"rN" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"rO" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"rP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"rQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"rR" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"rS" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"rT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/science)
+"rU" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"rV" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/science)
+"rW" = (/obj/mecha/medical/odysseus,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"rX" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"rY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"rZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"sa" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"sb" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"sc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"sd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/science)
+"se" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"sf" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/weapon/gun/energy/laser/awaymission_aeg,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"sg" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"sh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"si" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"sj" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"sl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"sm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/machinery/camera{c_tag = "Engineering Hallway"; dir = 4; network = list("UO71")},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"sn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"so" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"sp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"sq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"sr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"ss" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"st" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"su" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Reception"; req_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"sw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"sz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/eng)
+"sB" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO71_EngineeringOffice"; name = "Privacy Shutters"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/eng)
+"sD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sE" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"sF" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; layer = 2.9; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"sG" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/meter{frequency = 1443; id = "UO71_dloop_atm_meter"; name = "Distribution Loop"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sI" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sJ" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to Distro"; on = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sK" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/meter{layer = 3.3},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"sL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "UO71_waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"sM" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"sN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/loot)
+"sO" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"sQ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/awaymission/UO71/eng)
+"sR" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"sS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 8; locked = 1; name = "UO71 Medical APC"; pixel_x = -25; pixel_y = 0; req_access = list(201); start_charge = 100},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"sT" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"sU" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"sV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"sW" = (/mob/living/simple_animal/hostile/poison/terror_spider/purple,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"sX" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sY" = (/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sZ" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"ta" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"tb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"tc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"td" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"te" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"tf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"tg" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Reception"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"th" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"ti" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"tk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/eng)
+"tm" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO71_EngineeringOffice"; name = "Privacy Shutters"},/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/structure/table,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/eng)
+"to" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tp" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste In"; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"tq" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"ts" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Mix to Filter"; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tt" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tu" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6},/obj/item/weapon/paper/terrorspiders7,/obj/effect/gibspawner,/obj/structure/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tw" = (/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"tx" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "UO71_waste_in"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"ty" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO71_waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"tz" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tA" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tB" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO71_waste_in"; name = "Gas Mix Tank Control"; output_tag = "UO71_waste_out"; sensors = list("UO71_waste_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaymission/UO71/eng)
+"tC" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/wall,/area/awaymission/UO71/science)
+"tD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/science)
+"tE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/medical)
+"tF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"tG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"tH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/medical)
+"tI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"tJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"tK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"tL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"tM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"tN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{id_tag = "UO71_Armory"; name = "Armory Door"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"tO" = (/obj/machinery/door/airlock/command{name = "Bridge"; req_access_txt = "271"},/obj/machinery/door/poddoor{id_tag = "UO71_Bridge"; name = "Bridge Lockdown Door"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"tP" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"tQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"tR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall)
+"tS" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 1; icon_state = "escape"; tag = "icon-escape (NORTH)"},/area/awaymission/UO71/eng)
+"tT" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/awaymission/UO71/eng)
+"tU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"tV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/UO71/eng)
+"tW" = (/obj/machinery/computer/security{network = list("UO71")},/obj/machinery/door_control{desc = "A remote control-switch for the security privacy shutters."; id = "UO71_EngineeringOffice"; name = "Privacy Shutters"; pixel_x = -24; pixel_y = 6; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaymission/UO71/eng)
+"tX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaymission/UO71/eng)
+"tY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"tZ" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"ua" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; layer = 2.9; name = "engineering security door"},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"ub" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"uc" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"ud" = (/obj/machinery/meter{frequency = 1443; id = "UO71_wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"ue" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2 Outlet Pump"; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"uf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"ug" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "O2 Outlet Pump"; on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"uh" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 1},/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"ui" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/engineering{name = "Engineering Maintenance"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"uj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"uk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"ul" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"um" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"un" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"uo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "271"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"up" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"uq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"ur" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "CONTAINMENT AREA"},/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"us" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/awaymission/UO71/science)
+"ut" = (/turf/simulated/wall,/area/awaymission/UO71/outside)
+"uu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"uv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/medical)
+"uw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/item/stack/rods,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"ux" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"uy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; icon_state = "weld"; on = 1; pressure_checks = 1; welded = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"uz" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"uA" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"uB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"uC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"uD" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"uE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "browncorner"},/area/awaymission/UO71/centralhall)
+"uF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/awaymission/UO71/centralhall)
+"uG" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/engineering{name = "Engineering Foyer"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"uH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaymission/UO71/eng)
+"uI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO71_Engineering"; name = "Engineering Lockdown"; pixel_x = 24; pixel_y = 6; req_access_txt = "271"},/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaymission/UO71/eng)
+"uJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/eng)
+"uK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"uL" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to External"; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"uM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "External to Filter"; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"uN" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 2; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaymission/UO71/eng)
+"uO" = (/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5; initialize_directions = 5},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"uP" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"uQ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO71_n2_in"; name = "Nitrogen Supply Control"; output_tag = "UO71_n2_out"; sensors = list("UO71_n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaymission/UO71/eng)
+"uR" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO71_o2_in"; name = "Oxygen Supply Control"; output_tag = "UO71_o2_out"; sensors = list("UO71_o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "blue"},/area/awaymission/UO71/eng)
+"uS" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 1; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/awaymission/UO71/eng)
+"uT" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng)
+"uU" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"uV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/awaymission/UO71/medical)
+"uW" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/outside)
+"uX" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"uY" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/obj/item/weapon/reagent_containers/food/pill/methamphetamine,/obj/item/weapon/storage/toolbox/syndicate,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"uZ" = (/obj/machinery/door/airlock/medical{name = "Medical"; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"va" = (/obj/structure/closet,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"vb" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"vc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"vd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("UO71_n2_sensor" = "Nitrogen", "UO71_o2_sensor" = "Oxygen", "UO71_waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "caution"},/area/awaymission/UO71/eng)
+"ve" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"vf" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vg" = (/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vh" = (/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"vj" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"vk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"vl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "CONTAINMENT AREA"},/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"vm" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating,/area/awaymission/UO71/science)
+"vn" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vo" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vp" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vq" = (/obj/structure/table,/obj/item/weapon/defibrillator,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"vr" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vs" = (/obj/machinery/optable,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vt" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vu" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"vv" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"vw" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/centralhall)
+"vx" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/centralhall)
+"vy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/awaymission/UO71/centralhall)
+"vz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"vA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("UO71_mair_in_meter" = "Mixed Air In", "UO71_air_sensor" = "Mixed Air Supply Tank", "UO71_mair_out_meter" = "Mixed Air Out", "UO71_dloop_atm_meter" = "Distribution Loop", "UO71_wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/awaymission/UO71/eng)
+"vC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"vD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"vE" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "UO71_n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"vF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "UO71_n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"vG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "UO71_o2_in"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"vH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "UO71_o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"vI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"vJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/eng)
+"vK" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/eng)
+"vL" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/eng)
+"vM" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vN" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 10; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vO" = (/obj/structure/sign/deathsposal,/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"vP" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 6; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vQ" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"vR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vS" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vT" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"vU" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/outside)
+"vV" = (/obj/machinery/computer/monitor,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"vW" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch for heavy lockdown doors."; id = "UO71_Queen"; name = "Terror Queen Containment Doors"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"; wires = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"vX" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch for heavy lockdown doors."; id = "UO71_Containment"; name = "Science Containment Doors"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"; wires = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"vY" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch for heavy lockdown doors."; id = "UO71_Armory"; name = "Armory Doors"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"; wires = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"vZ" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"wa" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"wb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"wc" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/awaymission/UO71/centralhall)
+"wd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/awaymission/UO71/centralhall)
+"we" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/awaymission/UO71/centralhall)
+"wf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/awaymission/UO71/eng)
+"wg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wh" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"wl" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO71_n2_sensor"},/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"wm" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"wn" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO71_o2_sensor"},/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"wo" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"wp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"ws" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wt" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/medical)
+"wu" = (/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"wv" = (/turf/simulated/wall,/area/awaymission/UO71/mining)
+"ww" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wx" = (/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wy" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"wz" = (/obj/structure/table,/obj/item/weapon/paper/terrorspiders2,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"wA" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"wB" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_mining{name = "Mining Foyer"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"wC" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_mining{name = "Mining Foyer"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"wD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/noticeboard{dir = 1; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 10; icon_state = "caution"; tag = "icon-caution (SOUTHWEST)"},/area/awaymission/UO71/eng)
+"wF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng)
+"wJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"wK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng)
+"wL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"wM" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"wN" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng)
+"wO" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wP" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"wQ" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wR" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wS" = (/obj/structure/stool/bed,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"wT" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wU" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"wV" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"wW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/mining)
+"wX" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel,/area/awaymission/UO71/bridge)
+"wY" = (/obj/machinery/light/small{dir = 1},/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"wZ" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xb" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/mining)
+"xd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xf" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"xg" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/eng)
+"xh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xj" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm8"; name = "Mining Dorm 1"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door_control{id = "awaydorm8"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xq" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xr" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xu" = (/obj/structure/toilet{pixel_y = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/eng)
+"xv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xw" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xz" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xA" = (/mob/living/simple_animal/hostile/poison/terror_spider/white,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xB" = (/obj/structure/stool/bed/chair/office,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xC" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/eng)
+"xD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xE" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small,/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/eng)
+"xF" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm9"; name = "Mining Dorm 2"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door_control{id = "awaydorm9"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"xJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xK" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xL" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/effect/decal/cleanable/dirt,/obj/item/stack/sheet/plasteel{amount = 50},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xM" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xO" = (/obj/machinery/light/small,/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet,/area/awaymission/UO71/mining)
+"xQ" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO71 Mining APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 1},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/secure_closet/engineering_personal{icon_broken = "miningsecbroken"; icon_closed = "miningsec"; icon_locked = "miningsec1"; icon_off = "miningsecoff"; icon_opened = "miningsecopen"; icon_state = "miningsec"; locked = 0; name = "miner's equipment"; req_access = list(201)},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/gloves/fingerless,/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/awaymission/UO71/mining)
+"xR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/closet/secure_closet/miner{req_access = list(201)},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/awaymission/UO71/mining)
+"xT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/awaymission/UO71/mining)
+"xU" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/cigarettes{pixel_x = -2},/obj/item/weapon/lighter/zippo{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xW" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xX" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/newscaster{pixel_y = -28},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xZ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/mining{name = "Processing Area"; req_access_txt = "271"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"ya" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/mining{name = "Processing Area"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yb" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"yc" = (/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"yd" = (/obj/machinery/light/small,/obj/machinery/computer/atmos_alert,/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO71_Engineering"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -24; req_access_txt = "271"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "UO71_Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 6; pixel_y = -24; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"ye" = (/obj/machinery/conveyor{dir = 2; id = "UO71_mining"},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yf" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/awaymission/UO71/mining)
+"yg" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yj" = (/obj/machinery/conveyor{dir = 2; id = "UO71_mining"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yk" = (/obj/machinery/conveyor_switch/oneway{id = "UO71_mining"; name = "mining conveyor"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yl" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"ym" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yn" = (/obj/machinery/mineral/processing_unit_console{machinedir = 8},/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"yo" = (/obj/machinery/suit_storage_unit/mining,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yp" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"yq" = (/obj/structure/table,/obj/item/weapon/pickaxe,/obj/item/device/radio/off,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/gun/energy/kinetic_accelerator,/obj/item/borg/upgrade/modkit/damage,/obj/item/borg/upgrade/modkit/chassis_mod/orange,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yr" = (/obj/machinery/mineral/processing_unit{dir = 1; output_dir = 2},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"ys" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Mining"; dir = 4; network = list("UO71")},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yv" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"yw" = (/obj/machinery/light/small{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/gun/energy/kinetic_accelerator,/obj/item/borg/upgrade/modkit/tracer,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/mining)
+"yx" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yy" = (/obj/machinery/conveyor{dir = 2; id = "UO71_mining"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yC" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2},/turf/simulated/wall,/area/awaymission/UO71/mining)
+"yD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_mining{name = "Mining EVA"; req_access_txt = "271"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yF" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/mech_bay_recharge_floor,/area/awaymission/UO71/mining)
+"yI" = (/obj/machinery/mech_bay_recharge_port{tag = "icon-recharge_port (WEST)"; icon_state = "recharge_port"; dir = 8},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"yJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 26},/obj/item/stack/sheet/glass{amount = 19},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yM" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/awaymission/UO71/mining)
+"yN" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/awaymission/UO71/mining)
+"yO" = (/obj/machinery/mineral/stacking_machine{dir = 1; input_dir = 8; output_dir = 4},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/sheet/mineral/plasma{amount = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/mining)
+"yQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yR" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"yS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "271"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/mining)
+"yV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/outside)
+"yY" = (/obj/structure/sign/biohazard,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/prince)
+"yZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"za" = (/obj/structure/sign/biohazard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"zb" = (/obj/structure/sign/biohazard,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"zc" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/outside)
+"zd" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/queen)
+"ze" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/queen)
+"zf" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"zg" = (/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/queen)
+"zh" = (/turf/simulated/wall/rust,/area/awaymission/UO71/queen)
+"zi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/queen)
+"zj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"zk" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"zl" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"zm" = (/obj/machinery/door/poddoor{id_tag = "UO71_Queen"; name = "Caves Lockdown Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zn" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zo" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zp" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zr" = (/obj/structure/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/outside)
+"zs" = (/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zt" = (/obj/structure/stool/bed/chair/wood/normal,/obj/item/clothing/shoes/syndigaloshes,/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zu" = (/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zv" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/terrorspiders3,/obj/item/weapon/pen/edagger,/obj/item/stack/telecrystal{amount = 10},/obj/item/device/chameleon,/obj/item/weapon/reagent_containers/glass/bottle/traitor,/obj/item/borg/upgrade/syndicate,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zx" = (/obj/machinery/door/airlock/external{name = "Strange Airlock"; req_access_txt = "271"},/obj/machinery/door/poddoor{id_tag = "UO71_Caves"; name = "Caves Lockdown Door"},/turf/simulated/floor/carpet,/area/awaymission/UO71/loot)
+"zy" = (/turf/simulated/wall,/area/awaymission/UO71/queen)
+"zz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/queen)
+"zA" = (/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zB" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zC" = (/obj/structure/spider/cocoon{icon_state = "cocoon_large1"},/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zD" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/queen)
+"zE" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "271"},/turf/simulated/wall/rust,/area/awaymission/UO71/queen)
+"zF" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zG" = (/obj/machinery/door/poddoor{id_tag = "UO71_Caves"; name = "Caves Lockdown Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zH" = (/mob/living/simple_animal/hostile/poison/terror_spider/green{wander = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zJ" = (/obj/structure/spider/terrorweb,/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/spider/terrorweb,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zL" = (/obj/structure/table,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/queen)
+"zN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zR" = (/obj/machinery/door/poddoor{id_tag = "UO71_Queen"; name = "Caves Lockdown Door"},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zS" = (/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zU" = (/obj/structure/table/holotable/wood,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zV" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zW" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zY" = (/obj/structure/table/holotable/wood,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zZ" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Aa" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ab" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ac" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ad" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ae" = (/mob/living/simple_animal/hostile/poison/terror_spider/queen,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Af" = (/obj/structure/table/holotable/wood,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ag" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ah" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ai" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/awaymission/UO71/science)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababacadacadadadadacadacacacababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababadakajamalalalalanapaoacababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababacaqajalalalararalalasadababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababacacalauatatatatavalacadacacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababacawayaxaAazaCaBaDacaFaEacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababacalayaxaAaAaGaBalacaIaHacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababadadacacacaJaLaKaKaKaKaMalaNaPaOacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababacacacaQaRaQadaSaUaTaWaVaTaXalacacacacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababadaYbaaZbcbbbdawbeacacacacaXbfacbhbgacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababadaYacbiacbjacalblbkbnbmbpboaladbqaHacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababacaYacbradbsadajbtalbvbuarbwalbBbqbCacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababacbFadbxbybzbzbybAbzbHbGbybybzbDbybybEababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababadbIbKbJbMbLbObNbQbPbSbRbPbTbXbUcabZbVababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababadacacacbWcbadbYacbWadawalacbYacbVadccbWababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaccecdcfbWccadchcgciacapaladcjclckaccmbWacadacadacadadacacadadadacacababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaccnbIcpcocqaccscrctacajalaccucrcvadcccxcwcwcwcwcwcwcycAczcDcCcCcEcBababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababadcGcFcGcHcbadaccIacadcJcJacaccMacadcNcacOcKcKcKcLcKcLcLcPbLbNbLcQbWababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaccRcacSbQcTbaajcVaralalalcWalbucXacacadcUaccYdacZdcdbadbVacadaccbbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaccbacacbWadaddedddfalalalaldgdidhatatdkdjdmdldodndodpdrdqdtdsacdubVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababadcbacdwdvdydxalaldAdzdzdzdCdBdEdDdGdFdHbudIardIaldIaldIdJdhdKaccmbWababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaddMdLdOdNdPatdQalaydRdRdRdRdSdTdhdUalaldVdIaldIaldIaldIdWdhdXadccbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababacacacdZdYebeaecaleddRefeedRegdTdhatatalaldIaldIaldIaldIehdheiadccbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadejbvelekecalemdReeendRegdTeodtepeqaldIerdIaldIaldIdTetesacccbWababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadeveuewatexaleydRdRdRdRaBdTezeAepeCeBeBeBeCeDeFeEeHeGeIadadccbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaccUbVadacawaleKeJeJeJeJeLdTeMacacacacacacacadadeNePeOeReQeTeSbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaceVeUeXeWeYeYbHeZeYeYeYfdfgffacabababababababfafbfcfifefbfkfjfhababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadfmflbCacfnalalbvfpfoajfqfsfradababababababababfbftftfwfbfyfxfufvabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadadacacadadaccJfzacacacacacadadababababababababfefAftftfBfkfCfDfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababfbfFfEfbababababababababababababababfefGftfHfbfJfIfKfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababzczczczczczczczczczczcabfbfRfQfbababababababababababababababfefefSfbfbfefbfxfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLfLfLfLfMfLfLabababababababababababababababababababfNfNfOfOababzcfPfPfPfPfPfPfPfPfPzcabfbfTfFfbababababababababababababababfbfVfUfYfWfZfegbfXabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMgggcghgcghfLfLfMfLababababgagagagagagagagagafNfNfOfOgjgifOfOabzcfPgdgdgegfgdgdgdfPzcabfbfRfRfbabababababfbfbfbfbfbfbfbfefbfbgkgkgkgkglfegmfXabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMgggngrgogggsgugtfLfMfLfMfMgagpgpgpgqgpgpgpgafOgvgygwgAgzgBfNabzcfPgdgdgegxgdgdgdfPzcabfegDgCfbabababababfbgEgGgFgIgHgKgJgLfbgNgMgOgkgPfefxfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLghgQgSgRghgsgVgTfMgWgYgXfLgagpgpgpgUgpgpgpgafNgZhbhahdhchefNabzcfPgdgdgdgdgdgegdfPzcabfbhffFfbabababababfbhghhgEhjhihlhkhkhmhohnhqhphshrhtfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLghhuhwhvghgshyhxfMhzhBhAfLgagpgpgpgpgpgpgpgafOhChGhFhdhHhIfNabzcfPhDgegdgegdgdhEfPzcabfbhJfFfbabababababfbhKhLgEhNhMgEgEhOfehPgOhQgkhRfbgbfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMhThShYhXhSgshyhZfLfLiafLfLgahUgphVgpgphVhWgafOibihicijiiikfNabzcidiegdifgdgdiggefPzcabfbhJfTfbabababababfbilhhgEhNimgEgEioiniqipgkgkirfeisfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMiuitiwiviziyiGiEixiHiJiAiBiCiDgagaiOiOgaiFgafNiPiQgAfOfNfNfOabzciIfPfPfPiRiRiKiLiLjmiMiNiSfTfeabababababfbiTgEiohjhMgEgEiUfbiWiVgkfUiXfbiYfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMjaiZjcjbjejdjfjfjjjhjkfMababababjgjnjnjgjifOfOjojpgzfOababababzcyXzczcyYjqjqyYzczczcabfejsjrfefeababababfejtjugEiohMjyjvjAfbfbjBjwjwjxjxjCjzabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLjEjDiwjFjHfLfLfMfMjIjJfMababababjGjKjKjGjifOfOjLjNjMfOabababababjlababjGjOjOjGababababfbjPfRjQfefbfbfbfefejRjShhjThjhjgEgEjUjWjVjYjXkajZkbfeabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMfLfMkdkcfLfLkkkifMklkqfLfOfOfOfOkekfkgkekhfNkrkjktksfOfOfOfOfOfOkmfOfOknkokpkefOfOfNfOfOkufRfRkvfRfFfRfRjrgEgEgEkwiogEkxkykykAkzfbkBkDkCfefbabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLkEiwkFfLkGkRkHixkSkUkTkIkJkKkLkMkJkNkOkPkQlckVleldkJkWkNkJkJkXkYkZlalblglflhfOljlilkfOlmlllllllnlllplojrgEiogElrlqlqlqlulslwlvfbfbfefefeababababababababababababababltltltltltabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLlxlzlylAlylClBlElDlGlFlHlHlIlHlJlHlLlKlNlMlPlOlRlQlTlSlVlUlXlWlXlXlXlYgAlflhlZgAgAgAlZmbmafFmcfbfefbfbfefefbfbfbmdmehhmffbjsmgfeababababababababababababababababababltmimhmjltabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfMmkmmmliwjHjHmnfLmompfMfNfOfOfOfNfOfOmqfOfOmsmrfOfOfOmtfOfOfOfNmumumumumvlflhfOmxmwmyfOmzfEmBmAfbmCmDmCfemEmGmFfefefbfbfefbmImHfeababababababababababababababababababltmKmJmjltabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLmLmNmMmPmOmSmQfMfLfLfLabfOgAgAmTfOmVmUmTfNmRmWfOmXmZmYnbnancfOnendnfmumvlbfOfOfNfOfOfNnhngfefefbninknjfbnlnnnmfenonsnqntfbnumHfbabababababababababababababababababnpltltnvnrnrnpababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLfLfMfMfLfLfMfMfLababababfOgAgAgAfOnwmUnxfOmRnyfOnznBnAnDnanafNnFnEnGmumvnCfNnHnJnInInKnMnLnOnNfbfXnPfbfefXnQfbfbnRfFnSnVnUnZnWfbabababababababababababababababababnToaobobobocnpababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababfOnXnYgAodgAoeoffOkmogfOohojoiooonopfNoroqosmumvlbfNogokolomomouotowovoyoxoAozoCoBoAoDoFoEoHoGoJoIoNoMfbabababababababababababababababababnToOoQoPoQoOnpnpnpnpabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababfOoKoLgAfOoSoRoTfOkmoUfOoVojoWoYoXoZfNpbpapdpcmvlbfOnymRfbfbfbpfpellpgpiphpkpjplphpnpmpppopkpqprfbptpsfeabababababababababababababababababnppwpypxpApznppupvnpabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababfOfOfOfOfOfOfOfOfNpDpCfOpEpFnapGnaoXfOfOpBkmfOmvlafNpHmRfbfbfbpJpIfRpKfbpLfbfhfepMfbfbfepNfbfbpOfbpRmHfbabababababababababababababababababnppSpYpUpYpZnTpPpQnpabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNqbjifOfOfOqcfOpTqdpTpTpVpWpXqfqeqaogkmfbfbfbqiqgqkqjfeqlqmqhqoqnfeqpqtqqqwfeqxfehJmHfbababababababababnTnTnpnpnTababababnpqyqyqzqyqynpqrqsnpnpnpabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOqAkhquqvmuqBqCpTqFqDpTpVqHqGqJqIqaogmRfbfbfbqEfbqKqKfbqLqMfbqOqNfbfbfbqPqQfeqRfbhJmHfbababababababababnTqTqSqSnpnTnTnTnpnpqUqWqVqYqXrcqZrerdrfnpabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOrgjirarbrjrirkpTqFqFpTrhroqJqJrpqarqrlrmrmrmrnrmrsrrfertmCfbrvrufbrwrxqqryfbrzfbrBrAfbfbfbfbfefbfbfbfbnprDrCrFrEnTrHrJrIrGrKrMrLrOrNrNrPrSrRrfnpnpnTnTababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNrTkhqurQmurUrVpTrXrWpTpVrZrYscsbqasdmRsasgsfshsesirrfefefefefbfefbfefesjfbfbskfesmslsosnsqspsrsnstsssvsusxswszsysBsAsDsCsFsEsHsGsJsIsOsOsPsPsQsKsLsMnTababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNrgkhfOfOfOfNfNpTpTsNpTpVsSsRsUsTqaogmRsarrrrsVsarrsWfbabababababfbsXsYqqsZferzfejPtanUtbtctbtdtbtftethtgtititktjtmtltotnsFtptrtqtttstvtutAtztBtwtxtynpababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNtGtFnJtJnInItCtDAitDtDtEtLtKtHtItItMkmsasasatNsatOtOsasasasaababfbtPqqqqsZferzfbtRtQfefbfbfbfefbfbfbfbnptTtStVtUnptWtYtXuatZubtzuducuerFrFuguhnpnpnTnTababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOufuiolomomujulukunumukuouqupuvuuukuwusutsarruyuxrrrruxuzsgsaababfefeuDuAfefeqRfbuFuEfbababababababababnTuBuCuGnpnpuHuJuInpuKuMuLuOuNuQuPuSuRuTnTabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNuXuUuYfOfOfOfOqapVpXpXqauZuVpXfNfNfNfNabsarrrrrrrrrrrrsgrrsaababuWfefefefevarzvbuFuEfbababababababababnTvdvcvivenpqyvjqynpnpvkvfnpvgvhnTvgvhnTnTabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOvnvmvofOabababqavqvpvsvrqJvtpXabababababsarrrrrrrrrrrrrrrrsaababuWuWuWvuvwvvvxfbvyuEfbababababababababnpvBvzvCtivDtitovIvAvJvLvKnpvEvFnpvGvHnpababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOvNvMvPfNabababqavRvQqJqJqJvSvOabababababsavTsgvVrrrrvXvWvYsaababuWuWvUvZwbwawcfewewdfbababababababababnpwfrFwhwgwjwiwpwkwrwqqVwsnpwlwmnpwnwonpababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOfOfNfNfOabababqawwwtqJqJqJwxqaabababababsarrwyrrrrrrwzwyrrsaabababwuwvwvwvwuwAwvwCwBwvababababababababnTwEwDwGwFwIwHwKwJrGwLwNwMnpnpnpnpnpnpnpababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababqawPwOwRwQwTwSqaabababababsawUrrwVwXrrwVrrwUsaabababwuwZwYxawWxcxbxexdwvababababababababnTnTnpxgxfxhnTnpnTnTnpnpnTnTababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababqaqaqaqaqaqaqaqaabababababsasasasasasasasasasaabababwuxjxixlxkxnxmxpxowvabababababababababnpxqxsxrxtnpxunpabababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwvwuwuwuxwxvxyxxwvabababababababababnpxzxBxAxDxCxEnTabababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvxFxixHxGxmxIxpxJwvabababababababababnpxKxMxLxNnpnpnTabababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwZxOxPwWxRxQxTxSwuabababababababababnpxUxWxVxYxXnpababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwuwvwvwvwvwuyaxZwuabababababababababnpybydycnpnpnTababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyeygyfyiyhwvwvwuwuwuabababababnpnTnTnpnpababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyjylykyiymypyoyoyqwuababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyrynysxpytyvyuyxywwvababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyyylyzyByAyEyDyGyFwuababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyeyCyJyLyKypyMyHyIwvababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyeyOyNyQyPwuwuwvwuwuababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwvwuypySyRwuwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyTyVyUyWwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuzfyQzfzfwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwuzjzfzkwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvzlzfzfwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyQzfzfwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuurzfvlwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyZzfwuwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyZzfwuwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuzazfzbwuabababababababababababababababababababababababababababababababababababababababababababababababab
+zczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczdzdzdzezmzdzdzdzdzdzdzdzdzczczczczczczczczczczczczcpTpTpTpTpTzczczczczczczczczczczczczczczczczczczczczczczczc
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababzgzgzhziagzhzhzgzgzgzgzgzgabababababababababababababpTzoznzppTabababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababzgzgzhzqagagzhzgzgzgzgzgzgabababababababababababababpTztzszupTababababababzruWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWabababababzgzgzhzqagagzhzgzgzgzgzgzgabababababababababababababpTzvzszspTababzruWuWuWuWzrabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWabababuWuWuWababababzgzgzhzqagzwzhzgzgzgzgzgzgabababababababababababababpTpTzxpTpTabuWuWuWuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWababzgzgzhzqaiagzhzgzgzgzgzgzgababababababababababababuWuWuWuWabababuWuWabuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWzruWuWuWababababababababababuWuWuWabzgzgzhzqagzAzhzgzgzgzgzgzgabuWuWuWuWuWuWabababababuWababababuWzruWabzruWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababuWababababababababababababababababababababababababababuWuWuWuWababababababababababababuWuWuWzyzyzyzzzBzyzyzyzyzgzgzgzguWuWabababuWuWuWabababuWuWuWuWuWuWuWuWuWabuWuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababuWuWabababababababababababababababababababababababababuWuWuWababababababababababababababuWuWzyzyzyzzagzFzCzAzyzyzyzgzDuWabababababuWababababuWabababuWuWuWabuWuWuWuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababuWuWabababababababababababababababababababababababuWuWzrabababababababababababababababuWuWzEzHzGzqaiagagzAzAzyzyzgzDuWababuWabuWuWabababababababuWuWuWababababuWuWuWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababuWuWuWababababababababababababababababababababuWuWuWabababababababababababababababababuWzyzyzyzIaeahagzAzJzyzyzgzguWababuWabuWabababababababuWuWuWababababababuWuWuWuWzrababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababuWuWuWababababababababuWuWuWuWuWabababababuWuWuWabababababababababababababababababababzyzyzyzKzAagagaizAzyzyzyzyuWababuWuWuWababuWababababuWuWabababababababuWuWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababuWuWababababababuWuWuWuWuWuWuWuWabababuWuWzrabababababababababababababababababababzyzyzyzMzAzAagagagagzyzyzyuWababuWuWabababuWababababuWuWabababababababzruWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababuWuWuWuWuWuWuWuWababababababuWuWuWabuWuWababababababababababababababababababababzyzyzyzMzAzCagagagagzyzyzyuWabababababababuWuWababuWuWababababababababuWuWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababuWuWuWabababababababababababuWuWuWuWababababababababababababababababababababzyzyzyzMzAzAagagagagzGzHzEuWuWuWabababababuWuWababuWuWabababababababababuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababuWuWuWabababababababababababababababuWuWababababababababababababababababababababzyzyzgzMzAagagaizAzgzyzyzyuWuWuWuWuWuWababuWuWababuWuWabababababuWuWuWuWuWuWababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababuWuWababababababababababababababababababuWababababababababababababababababababababzyzyzgzKzAagagagzAzgzgzyzyabuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababuWuWuWuWababababababababababababuWzruWababababuWuWuWabababababababababuWababababababababzyzyzgzKaiagagagzAzAzgzyzyabuWuWuWuWuWuWuWuWuWuWababababababababababuWuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababuWabababababababababababababuWuWuWuWuWuWzrababababuWuWuWuWabababababuWuWababuWabababababzyzyzgafaezNzLagzAzAzgzyzyababuWuWuWuWuWuWuWuWababababababababababuWuWuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababzruWuWuWuWuWuWuWababababababuWuWuWababababuWababuWabababababzyzyzyzqagzAzgagzCagzgzgzyabababuWuWuWuWuWuWuWabababuWuWuWuWabababuWabuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWababababababuWababababuWababuWuWababababzyzyzyzqagagzgagzAzAzgzgzyababuWuWuWuWababuWuWabababuWabababababuWuWuWuWababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWzruWuWuWuWabababuWuWuWababababuWababuWuWabababuWzyzyzyzqzCzgzgzgzAzAzgzgzyababuWuWababababuWuWuWababuWababababuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababuWuWzruWuWuWabuWuWuWzruWuWuWuWuWababababababuWababuWuWabuWuWuWzEagzGzqzAzgzgzgzgzAzgzyzyabuWuWuWuWuWabababuWuWababuWuWabababuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWzyzyzyzqzAagzgzgagagzyzyzyuWuWuWababuWuWababuWuWuWababuWababuWuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWababababzyzyzgzqagzAzgagzAaizGagzEuWuWababababuWabababuWuWababuWuWabuWuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWabababzyzgzgzqagaizFagagagzyzyzyabuWababuWabuWuWababuWuWabababuWuWuWuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWabababuWuWuWuWabababzyzgzgafaeahagaiagagzyzyzyabuWuWuWuWababuWababuWuWuWababuWuWuWuWuWuWababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWabababababuWuWuWababzyzgzgzMagagagagagzgzyzyzyabababababababuWabababuWuWabuWuWuWabuWuWuWababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWabababababababuWuWuWabzyzyzyzMzgagagagzgzgzyzyzyababababababuWuWababababuWuWuWuWabuWuWuWabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWabababababababababuWuWabzgzdzdzezdzRzRzRzdzdzdzdzgababuWuWuWuWuWabababuWuWuWuWabuWuWuWuWababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWabababababababababababuWuWuWzgzdzSzTzUzSzSzSzVzWzSzdzgabababababababababuWuWuWuWuWuWuWabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWabababababababababababababuWuWzgzdzSzXzYzSzSzSzZzYAazdzgabababababababuWuWuWuWuWuWababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWuWabababababababababababababababuWabzgzdzSAbzYzSzSzSzSAczSzdzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababuWuWuWabababababababababababababababababzgzdAdzSzSzSAezSzSzSzSzdzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababuWuWuWabababababababababababababababababzgzdzSzSzSzSzSzSzSzSzSzdzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababuWuWabababababababababababababababababababzgzdzZAfAgzSzSzSAhzSzSzdzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababzgzdzdzdzdzdzdzdzdzdzdzdzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
+
diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
index cb8cb4e6227..9182b9e11df 100644
--- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
@@ -11,82 +11,82 @@
"ak" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{broken = 1; dir = 8; icon_state = "damaged2"; tag = "icon-damaged2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"al" = (/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"am" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"an" = (/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ao" = (/turf/simulated/floor/plasteel{broken = 1; dir = 8; icon_state = "damaged4"; tag = "icon-damaged4 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ap" = (/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"an" = (/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ao" = (/turf/simulated/floor/plasteel{broken = 1; dir = 8; icon_state = "damaged4"; tag = "icon-damaged4 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ap" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aq" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ar" = (/obj/machinery/door_control{desc = "A remote control-switch to send the elevator to the basement floor."; id = "UO45_useless"; name = "B1"; pixel_x = 6; pixel_y = -24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch for the elevator doors."; id = "UO45_Elevator"; name = "Elevator Doors"; pixel_x = -6; pixel_y = -24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch to send the elevator to the ground floor."; id = "UO45_useless"; name = "G1"; pixel_x = 6; pixel_y = -34; req_access_txt = "0"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"as" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "darkblue"; tag = "icon-darkblue"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"at" = (/turf/simulated/floor/plasteel{broken = 1; dir = 8; icon_state = "damaged3"; tag = "icon-damaged3 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ar" = (/obj/machinery/door_control{desc = "A remote control-switch to send the elevator to the basement floor."; id = "UO45_useless"; name = "B1"; pixel_x = 6; pixel_y = -24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch for the elevator doors."; id = "UO45_Elevator"; name = "Elevator Doors"; pixel_x = -6; pixel_y = -24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch to send the elevator to the ground floor."; id = "UO45_useless"; name = "G1"; pixel_x = 6; pixel_y = -34; req_access_txt = "0"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"as" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "darkblue"; tag = "icon-darkblue"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"at" = (/turf/simulated/floor/plasteel{broken = 1; dir = 8; icon_state = "damaged3"; tag = "icon-damaged3 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"au" = (/turf/simulated/floor/plasteel{tag = "icon-darkblue (SOUTHEAST)"; icon_state = "darkblue"; dir = 6},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"av" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swallc3"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aw" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ax" = (/obj/machinery/door/poddoor{id_tag = "UO45_Elevator"; name = "Elevator Door"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ay" = (/obj/machinery/door/poddoor{id_tag = "UO45_Elevator"; name = "Elevator Door"},/turf/simulated/floor/plasteel{ icon_state = "delivery"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ax" = (/obj/machinery/door/poddoor{id_tag = "UO45_Elevator"; name = "Elevator Door"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ay" = (/obj/machinery/door/poddoor{id_tag = "UO45_Elevator"; name = "Elevator Door"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"az" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aA" = (/turf/simulated/shuttle/wall{tag = "icon-swallc4"; icon_state = "swallc4"; dir = 2},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aB" = (/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aC" = (/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aD" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aE" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aD" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aE" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aF" = (/obj/machinery/door_control{desc = "A remote control-switch to call the elevator to your level."; id = "UO45_useless"; name = "Call Elevator"; pixel_x = -6; pixel_y = 24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch for the elevator doors."; id = "UO45_Elevator"; name = "Elevator Doors"; pixel_x = 6; pixel_y = 24; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aG" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aH" = (/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aI" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aJ" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aJ" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aM" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aN" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aN" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aO" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aP" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aQ" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aR" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aQ" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aR" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"aT" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aU" = (/obj/structure/stool/bed/chair/comfy/beige{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aV" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aW" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aX" = (/obj/structure/table/woodentable,/obj/item/weapon/newspaper,/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aY" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"aZ" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ba" = (/obj/structure/sign/vacuum{desc = "A beacon used by a teleporter."; icon = 'icons/obj/radio.dmi'; icon_state = "beacon"; name = "tracking beacon"},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bb" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/ripley_build_and_repair,/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bc" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bd" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aU" = (/obj/structure/stool/bed/chair/comfy/beige{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aV" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aW" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aX" = (/obj/structure/table/woodentable,/obj/item/weapon/newspaper,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aY" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"aZ" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ba" = (/obj/structure/sign/vacuum{desc = "A beacon used by a teleporter."; icon = 'icons/obj/radio.dmi'; icon_state = "beacon"; name = "tracking beacon"},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bb" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/ripley_build_and_repair,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bc" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bd" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"be" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bf" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bh" = (/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bi" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bj" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bk" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bf" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bh" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bi" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bj" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bk" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bl" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bm" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bo" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/item/weapon/lighter{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bp" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{ icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bm" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bo" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/item/weapon/lighter{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bp" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"br" = (/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bs" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bs" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bt" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bu" = (/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bv" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bw" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Arrivals"; dir = 8; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bu" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bv" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bw" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Arrivals"; dir = 8; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"by" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bz" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bA" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bz" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bA" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bB" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bJ" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"bK" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bJ" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"bK" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bL" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -100,22 +100,22 @@
"bV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bX" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"bY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"bY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ca" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cb" = (/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cb" = (/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ce" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ce" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ch" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ci" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ck" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"co" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -131,11 +131,11 @@
"cA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/suit_jacket/female,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cC" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cE" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/grille,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/grille,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cG" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -143,11 +143,11 @@
"cM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{id = "awaydorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 2},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"cT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"cT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/reagent_dispensers/fueltank,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -158,132 +158,132 @@
"db" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"de" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"de" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"df" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"di" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dn" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"do" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dp" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dp" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dr" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ds" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dt" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"du" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dv" = (/obj/machinery/seed_extractor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dr" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ds" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dt" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"du" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dv" = (/obj/machinery/seed_extractor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dy" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dy" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dB" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dB" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dG" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dH" = (/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dL" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dM" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "201"},/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/mask/bandana,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dN" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/stool/bed/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dQ" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/weapon/storage/belt/security,/obj/item/device/flash,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dG" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dH" = (/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dL" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dM" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "201"},/obj/item/device/plant_analyzer,/obj/item/clothing/mask/bandana,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dN" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/stool/bed/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dQ" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/weapon/storage/belt/security,/obj/item/device/flash,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dR" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dT" = (/turf/simulated/floor/plasteel{ icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dW" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dT" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dW" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dY" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ea" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eb" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ec" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ed" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ee" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/apron,/obj/item/clothing/mask/bandana,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ec" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ed" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ee" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "201"},/obj/item/clothing/suit/apron,/obj/item/clothing/mask/bandana,/obj/item/weapon/cultivator,/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ef" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Security Checkpoint Maintenance"; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ei" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ej" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ek" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ei" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ej" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ek" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"el" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"em" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"en" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"em" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"en" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ep" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"er" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"es" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"es" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"et" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ev" = (/turf/simulated/floor/plating{carbon_dioxide = 0; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 0; oxygen = 0; temperature = 2.7},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"ew" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/filingcabinet,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ev" = (/turf/simulated/floor/plating{carbon_dioxide = 0; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 0; oxygen = 0; temperature = 2.7},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"ew" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/filingcabinet,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ex" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/door/window/southleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Security Checkpoint"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ey" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ez" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eA" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ey" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ez" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eA" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eB" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eC" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eD" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eF" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/item/weapon/paper/hydroponics,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eD" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eF" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/item/weapon/paper/hydroponics,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eJ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eK" = (/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"eL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eM" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/folder/red,/obj/machinery/door/window/southleft{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Checkpoint"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eN" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eO" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eN" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eO" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eP" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eQ" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eQ" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eR" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/southleft{base_state = "left"; dir = 4; icon_state = "left"; name = "Hydroponics Desk"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eS" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eT" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"eW" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eY" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"eZ" = (/obj/machinery/computer/security{network = list("UO45")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fa" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fb" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fc" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eY" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"eZ" = (/obj/machinery/computer/security{network = list("UO45")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fa" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fb" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fc" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fd" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/southleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Hydroponics Desk"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fe" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ff" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fh" = (/obj/machinery/camera{c_tag = "Hydroponics"; dir = 1; network = list("UO45")},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fk" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fe" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ff" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fg" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fh" = (/obj/machinery/camera{c_tag = "Hydroponics"; dir = 1; network = list("UO45")},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fk" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fo" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"fp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fq" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ft" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fu" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fv" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fq" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ft" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fu" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fv" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "201"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -292,275 +292,275 @@
"fF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fJ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fK" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 6; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"fL" = (/turf/simulated/wall/r_wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"fM" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"fN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{dir = 1; name = "Hydroponics Desk"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"fN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{dir = 1; name = "Hydroponics Desk"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"fO" = (/turf/simulated/wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"fP" = (/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"fQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fR" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fS" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fT" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fU" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fU" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fV" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fW" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Central Hallway"; dir = 1; network = list("UO45")},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fX" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fZ" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"ga" = (/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gb" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"fX" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fZ" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"ga" = (/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gb" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ge" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall/r_wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gf" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gg" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"gh" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gi" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gi" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gj" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "201"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gn" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"go" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"gn" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"go" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gq" = (/obj/effect/decal/cleanable/dirt,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"gs" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gu" = (/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gv" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gv" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gw" = (/turf/simulated/wall/r_wall,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"gx" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"gy" = (/turf/simulated/wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"gz" = (/turf/simulated/wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"gA" = (/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"gB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gC" = (/obj/structure/alien/resin/wall,/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"gD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gE" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gF" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gG" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gH" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gE" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gF" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gG" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gH" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"gI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"gJ" = (/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gJ" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"gL" = (/turf/simulated/wall,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"gM" = (/turf/simulated/wall/rust,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gN" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"gO" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 16; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 23},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"gP" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gQ" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"gR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"gS" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gT" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gU" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gN" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"gO" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 16; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 23},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"gP" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gQ" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"gR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"gS" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gT" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gU" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"gV" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gW" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gX" = (/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"gY" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"gZ" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"ha" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hb" = (/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hc" = (/obj/machinery/light/small{dir = 4},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"gW" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gX" = (/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"gY" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"gZ" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ha" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hb" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hc" = (/obj/machinery/light/small{dir = 4},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"hd" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"he" = (/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"he" = (/obj/structure/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"hf" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"hg" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"hh" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"hi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"hj" = (/obj/machinery/vending/snack,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hk" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hl" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hm" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hn" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ho" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hp" = (/obj/machinery/vending/boozeomat{req_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hq" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hr" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hs" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ht" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Kitchen"; dir = 8; network = list("UO45")},/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hu" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"hv" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"hw" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"hx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"hy" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"hz" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hj" = (/obj/machinery/vending/snack,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hk" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hl" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hm" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hn" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ho" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hp" = (/obj/machinery/vending/boozeomat{req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hq" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hr" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hs" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ht" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Kitchen"; dir = 8; network = list("UO45")},/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hu" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hv" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hw" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hy" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hz" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"hA" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"hB" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"hC" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hD" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hG" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hC" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hD" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hG" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"hH" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hI" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"hJ" = (/obj/structure/table,/obj/item/trash/chips,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hK" = (/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hL" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hM" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hN" = (/obj/structure/stool,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hP" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "201"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hI" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"hJ" = (/obj/structure/table,/obj/item/trash/chips,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hK" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hL" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hM" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hN" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hP" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "201"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"hV" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"hW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"hW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"hX" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"hY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"hZ" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ia" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ib" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ic" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"id" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"hZ" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ia" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ib" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ic" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"id" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"ie" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"if" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"ig" = (/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"ih" = (/obj/machinery/computer/rdconsole/core{id = 3; req_access = null},/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ii" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ij" = (/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"ik" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"il" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"im" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"in" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"io" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ip" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iq" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ir" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"is" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/processor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"it" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iu" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iv" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/window{dir = 2; name = "Gateway Chamber"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ix" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ik" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"il" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"im" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"in" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"io" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ip" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iq" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ir" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"is" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/processor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"it" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iu" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iv" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/window{dir = 2; name = "Gateway Chamber"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ix" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"iy" = (/obj/machinery/door/airlock{name = "Emergency Supplies"},/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"iA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"iB" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"iC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"iD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"iE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iB" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"iF" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iG" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iH" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iI" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iJ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"iO" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iP" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iG" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iH" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iI" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iJ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"iO" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iP" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"iQ" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"iR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"iS" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"iW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"iZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"ja" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"iX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"iZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ja" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"jb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jc" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"je" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jg" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jc" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"je" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jg" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"jh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ji" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Gateway Chamber"; dir = 4; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ji" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Gateway Chamber"; dir = 4; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"jk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"jl" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"jm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Gateway Observation"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"js" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"jt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"jn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Gateway Observation"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"js" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"jt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ju" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"jv" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jw" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jx" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jy" = (/obj/machinery/door/window/southright{name = "Bar Door"; req_access_txt = "201"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jz" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jA" = (/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("UO45")},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jB" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jw" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jx" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jy" = (/obj/machinery/door/window/southright{name = "Bar Door"; req_access_txt = "201"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jz" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jA" = (/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("UO45")},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jB" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"jC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"jD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"jE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"jF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"jG" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jH" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jG" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jH" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"jI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jJ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"jL" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jJ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"jL" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"jM" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"jN" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"jO" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"jP" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"jP" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"jQ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"jR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jS" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jT" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jU" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jW" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 1; locked = 0; name = "UO45 Bar APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"jY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jS" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jT" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jU" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jW" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 1; locked = 0; name = "UO45 Bar APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"jY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"jZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ka" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"kb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"kb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"kc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"kd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ke" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/command{icon_state = "door_closed"; lockdownbyai = 0; locked = 0; name = "Gateway Chamber"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kf" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kf" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"ki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kj" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kl" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kj" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kl" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"km" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres"; locked = 0; name = "scientist's locker"; req_access_txt = "201"},/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kn" = (/obj/structure/closet/secure_closet{icon_broken = "secureresbroken"; icon_closed = "secureres"; icon_locked = "secureres1"; icon_off = "secureresoff"; icon_opened = "secureresopen"; icon_state = "secureres"; locked = 0; name = "scientist's locker"; req_access_txt = "201"},/obj/item/weapon/tank/air,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ko" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"kp" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"kq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"kr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ks" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"kt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ku" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"kv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"kw" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"kr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ks" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"kt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ku" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"kv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"kw" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"kx" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ky" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"kz" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/head/welding,/obj/structure/sign/biohazard{pixel_x = 0; pixel_y = 32},/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kA" = (/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kB" = (/obj/structure/dispenser/oxygen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kF" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kz" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/head/welding,/obj/structure/sign/biohazard{pixel_x = 0; pixel_y = 32},/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kA" = (/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kB" = (/obj/structure/dispenser/oxygen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kF" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"kG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kK" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kM" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"kN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kS" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
@@ -568,78 +568,78 @@
"kV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kX" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kY" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"kZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO45_biohazard"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{ icon_state = "delivery"; name = "floor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"la" = (/obj/machinery/shower{pixel_y = 15},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lb" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/space)
-"lc" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kY" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"kZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO45_biohazard"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"la" = (/obj/machinery/shower{pixel_y = 15},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lb" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/space)
+"lc" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ld" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"le" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/sign/science{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "purplecorner"; tag = "icon-purplecorner (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"le" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/sign/science{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "purplecorner"; tag = "icon-purplecorner (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lg" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lh" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"li" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ll" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ln" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"li" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ll" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ln" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lo" = (/turf/simulated/wall/r_wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"lp" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lp" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"lq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"lr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"ls" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"lt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Gateway Ready Room"; dir = 2; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"lu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"lw" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/command{icon_state = "door_closed"; lockdownbyai = 0; locked = 0; name = "Gateway Ready Room"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lx" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ly" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Research Division West"; dir = 1; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"lF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lH" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO45 Research Division APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lK" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lN" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Research Division East"; dir = 1; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lO" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"lP" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lx" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ly" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Research Division West"; dir = 1; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"lF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lH" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO45 Research Division APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lK" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lN" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Research Division East"; dir = 1; network = list("UO45","UO45R")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lO" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"lP" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"lQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "purple"; tag = "icon-purple (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lS" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lT" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"lV" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{ icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "purple"; tag = "icon-purple (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lS" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lT" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"lV" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lW" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lX" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"lY" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 2; network = list("UO45")},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"lZ" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/plasma{amount = 26},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ma" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"mb" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"ma" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"mb" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"mc" = (/turf/simulated/floor/plasteel,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"md" = (/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"me" = (/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"md" = (/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"me" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"mg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/command{name = "Research Director's Office"; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/command{name = "Research Director's Office"; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mj" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO45_rdprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mk" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO45_rdprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"ml" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mm" = (/obj/structure/closet/firecloset,/obj/machinery/light/small,/obj/structure/sign/securearea{pixel_x = 0; pixel_y = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mn" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"mq" = (/obj/structure/table,/obj/item/weapon/newspaper,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"mr" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ml" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mm" = (/obj/structure/closet/firecloset,/obj/machinery/light/small,/obj/structure/sign/securearea{pixel_x = 0; pixel_y = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mn" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"mq" = (/obj/structure/table,/obj/item/weapon/newspaper,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"mr" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"ms" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mt" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mu" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
@@ -647,28 +647,28 @@
"mw" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/obj/item/clothing/under/pj/red,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mx" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"my" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"mz" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"mz" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"mB" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"mC" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mD" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mE" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mF" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mG" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO45 Gateway APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/machinery/light/small,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mH" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"mI" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mC" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mD" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mE" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mF" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO45 Gateway APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/machinery/light/small,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mG" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mH" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
+"mI" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "201"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/suit/storage/labcoat/science,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mJ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "201"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mM" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "201"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/suit/storage/labcoat/science,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mP" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mR" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mS" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mT" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mU" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mM" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mO" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mQ" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mR" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mS" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mT" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mU" = (/obj/machinery/vending/cola,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mV" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mW" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Dormitories"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"mX" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Dormitories"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
@@ -677,271 +677,271 @@
"na" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nc" = (/obj/machinery/door_control{id = "awaydorm7"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nd" = (/obj/machinery/vending/cola,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ne" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nf" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ng" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nd" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ne" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nf" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ng" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nh" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ni" = (/obj/machinery/door/poddoor{id_tag = "UO45_Secure Storage"; name = "secure storage"},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"nj" = (/turf/simulated/wall/r_wall/rust,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"nk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nl" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"no" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nm" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"no" = (/obj/machinery/computer/security{network = list("UO45")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"np" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nq" = (/obj/machinery/computer/security{network = list("UO45")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nr" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 8; name = "research monitor"; network = list("UO45R")},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nq" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 8; name = "research monitor"; network = list("UO45R")},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ns" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nt" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ny" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nz" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nA" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ny" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nz" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nA" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm5"; name = "Dorm 5"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm7"; name = "Dorm 7"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nE" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nG" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Dormitories"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"nH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"nI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"nK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"nL" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warndark"; tag = "icon-warndark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"nM" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (NORTH)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"nK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"nL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"nM" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/laser_pointer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nP" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/laser_pointer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nQ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nR" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 2; name = "research monitor"; network = list("UO45R")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nT" = (/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nP" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nQ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 2; name = "research monitor"; network = list("UO45R")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nS" = (/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nT" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light{dir = 8},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nU" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nV" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light{dir = 8},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"nW" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nV" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"nW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"nX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"nZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ob" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"od" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/camera{c_tag = "Dormitories"; dir = 2; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"of" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"og" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oa" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ob" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"od" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/camera{c_tag = "Dormitories"; dir = 2; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oe" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"of" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"og" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"oh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ol" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"om" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ol" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"om" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"on" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-y"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"op" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Dormitories"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-y"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"or" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-y (WEST)"; icon_state = "pipe-y"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"os" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ot" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ot" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ou" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 1.5e+006; input_level = 30000; inputting = 0; output_level = 7000; outputting = 1},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"ov" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 7000; outputting = 1},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ow" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warndark"; tag = "icon-warndark (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ox" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oy" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oz" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "201"},/obj/machinery/door_control{desc = "A remote control-switch that controls the privacy shutters."; id = "UO45_rdprivacy"; name = "Privacy Shutter Control"; pixel_x = 0; pixel_y = -2; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oB" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oC" = (/obj/machinery/computer/aifixer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ow" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ox" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "201"},/obj/machinery/door_control{desc = "A remote control-switch that controls the privacy shutters."; id = "UO45_rdprivacy"; name = "Privacy Shutter Control"; pixel_x = 0; pixel_y = -2; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"oy" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"oz" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"oA" = (/obj/machinery/computer/aifixer,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"oB" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"oC" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"oD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oE" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oF" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"oG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oG" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"oI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oJ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{ icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oR" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 6; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oP" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 6; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"oR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"oS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"oT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"oU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"oV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"oV" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"oW" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/item/weapon/wrench,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"oX" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"oY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warndark"; tag = "icon-warndark (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"oY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"oZ" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pa" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pb" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "UO45_air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"pc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pc" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pd" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pe" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pf" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pg" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"ph" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pj" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pk" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pm" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pn" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"po" = (/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pe" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ph" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pi" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pk" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pl" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pm" = (/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pn" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"po" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm4"; name = "Dorm 4"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm6"; name = "Dorm 6"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ps" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ps" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pt" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pv" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pw" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"px" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"py" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pz" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"pA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"pB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"pC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"pD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (EAST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"pE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"pA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"pB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"pC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"pD" = (/obj/machinery/door/airlock/command{name = "Server Room"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pE" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "UO45_air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 2; frequency = 1443; id = "UO45_air_in"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"pH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pJ" = (/obj/machinery/door/airlock/command{name = "Server Room"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pK" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pJ" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pK" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pN" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pO" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pP" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{dir = 6; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pQ" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pN" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{dir = 6; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pO" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pP" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pQ" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{id = "awaydorm4"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{id = "awaydorm6"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pW" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pX" = (/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pY" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"pZ" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"qa" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pW" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pX" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pY" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass_engineering{name = "SMES Room"; req_access_txt = "201"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qb" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"qc" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass_engineering{name = "SMES Room"; req_access_txt = "201"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qe" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/meter{frequency = 1443; id = "UO45_mair_out_meter"; layer = 3.3; name = "Mixed Air Tank Out"},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"qf" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "UO45_mair_in_meter"; layer = 3.3; name = "Mixed Air Tank In"},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qg" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qj" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qk" = (/obj/structure/toilet{tag = "icon-toilet00 (WEST)"; icon_state = "toilet00"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ql" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qm" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qn" = (/obj/structure/toilet{tag = "icon-toilet00 (WEST)"; icon_state = "toilet00"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qo" = (/obj/machinery/light/small,/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -11; pixel_y = 0},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qp" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/glasses/hud/health,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qq" = (/obj/machinery/vending/medical{req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qr" = (/obj/structure/table,/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/hand_labeler,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qs" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qm" = (/obj/machinery/light/small,/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -11; pixel_y = 0},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qn" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/glasses/hud/health,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qo" = (/obj/machinery/vending/medical{req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qp" = (/obj/structure/table,/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/hand_labeler,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qr" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"qs" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qt" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qu" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qv" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qw" = (/obj/machinery/light/small{dir = 8},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"qx" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"qy" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"qx" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qy" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"qz" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qA" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"qB" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"qC" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qD" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qE" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qD" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qF" = (/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/closet/secure_closet/engineering_personal{req_access = list(201)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"qG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5; initialize_directions = 5},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qI" = (/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/closet/secure_closet/engineering_personal{req_access = list(201)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qJ" = (/obj/structure/closet/secure_closet{icon_broken = "secureengbroken"; icon_closed = "secureeng"; icon_locked = "secureeng1"; icon_off = "secureengoff"; icon_opened = "secureengopen"; icon_state = "secureeng1"; locked = 1; name = "engineer's locker"; req_access_txt = "201"},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qK" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "UO45_air_in"; name = "Mixed Air Supply Control"; output_tag = "UO45_air_out"; pressure_setting = 2000; sensors = list("UO45_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 9; icon_state = "arrival"; tag = "icon-arrival (NORTHWEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qL" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Atmospherics"; dir = 2; network = list("UO45")},/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/item/device/multitool,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qM" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qN" = (/obj/machinery/atmospherics/trinary/mixer{dir = 1; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; req_access = null; target_pressure = 4500},/turf/simulated/floor/plasteel{dir = 5; icon_state = "arrival"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"qO" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qH" = (/obj/structure/closet/secure_closet{icon_broken = "secureengbroken"; icon_closed = "secureeng"; icon_locked = "secureeng1"; icon_off = "secureengoff"; icon_opened = "secureengopen"; icon_state = "secureeng1"; locked = 1; name = "engineer's locker"; req_access_txt = "201"},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qI" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "UO45_air_in"; name = "Mixed Air Supply Control"; output_tag = "UO45_air_out"; pressure_setting = 2000; sensors = list("UO45_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 9; icon_state = "arrival"; tag = "icon-arrival (NORTHWEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qJ" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Atmospherics"; dir = 2; network = list("UO45")},/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/item/device/multitool,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qK" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qL" = (/obj/machinery/atmospherics/trinary/mixer{dir = 1; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; req_access = null; target_pressure = 4500},/turf/simulated/floor/plasteel{dir = 5; icon_state = "arrival"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qM" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"qN" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qO" = (/obj/machinery/door/airlock/glass_command{name = "Server Room"; req_access_txt = "201"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qQ" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/r_n_d/server/core{id_with_download_string = "3"; id_with_upload_string = "3"; req_access = null},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"qR" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qS" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qT" = (/obj/machinery/door/airlock/glass_command{name = "Server Room"; req_access_txt = "201"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qU" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/chair/office/light,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qV" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qX" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"qY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qS" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/chair/office/light,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qT" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qV" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"qX" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"qY" = (/obj/machinery/door/airlock{name = "Unit 2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qZ" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"ra" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rb" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rc" = (/obj/machinery/door/airlock{name = "Unit 2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rd" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rb" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rd" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"re" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rf" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"rh" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ri" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rj" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rk" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ri" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"rj" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"rk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rl" = (/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rm" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ro" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/newscaster{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"rm" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/newscaster{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"rn" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ro" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rq" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 8; locked = 1; name = "UO45 Engineering APC"; pixel_x = -25; pixel_y = 0; req_access = list(201); start_charge = 100},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rr" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air to Distro"; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rt" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"ru" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"rv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rw" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Exterior"; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rx" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ry" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ry" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rz" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"rA" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rB" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rB" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"rC" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rD" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{ icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"rE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rF" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rG" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"rH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "201"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rJ" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"rM" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"rK" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rL" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"rO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"rP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/machinery/camera{c_tag = "Engineering Hallway"; dir = 4; network = list("UO45")},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"rR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"rW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rX" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Reception"; req_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"rY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sd" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"se" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO45_EngineeringOffice"; name = "Privacy Shutters"},/obj/machinery/door/window/southleft{base_state = "left"; dir = 4; icon_state = "left"; name = "Engineering Reception"; req_access_txt = "201"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sf" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sh" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"si" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; layer = 2.9; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sj" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/meter{frequency = 1443; id = "UO45_dloop_atm_meter"; name = "Distribution Loop"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
@@ -951,36 +951,36 @@
"so" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sp" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sq" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/meter{layer = 3.3},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sr" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sr" = (/obj/structure/closet/l3closet/general,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ss" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "UO45_waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"st" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"su" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"sv" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"sw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"sx" = (/obj/structure/closet/l3closet/general,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"sy" = (/obj/structure/closet/l3closet/general,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"sz" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"sA" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"sB" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sC" = (/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sD" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sw" = (/obj/structure/closet/l3closet/general,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"sx" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"sy" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"sz" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sA" = (/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sB" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"sE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sF" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"sG" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sI" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/plasteel{ icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"sK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sL" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Reception"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"sM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sQ" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste In"; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sR" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO45_EngineeringOffice"; name = "Privacy Shutters"},/obj/machinery/door/window/southleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Engineering Reception"; req_access_txt = "201"},/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sS" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO45_waste_in"; name = "Gas Mix Tank Control"; output_tag = "UO45_waste_out"; sensors = list("UO45_waste_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"sU" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste In"; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"sU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"sV" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"sX" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Mix to Filter"; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
@@ -990,30 +990,30 @@
"tb" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tc" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"td" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"te" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO45_waste_in"; name = "Gas Mix Tank Control"; output_tag = "UO45_waste_out"; sensors = list("UO45_waste_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"te" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tf" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "UO45_waste_in"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tg" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO45_waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"th" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ti" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"tj" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"tk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tl" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"tn" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 1; icon_state = "escape"; tag = "icon-escape (NORTH)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"to" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/wall/r_wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ts" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tt" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"tt" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"tv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"tw" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 1; icon_state = "escape"; tag = "icon-escape (NORTH)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"tx" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ty" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sign/securearea{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"tz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{ icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"tA" = (/obj/machinery/computer/security{network = list("UO45")},/obj/machinery/door_control{desc = "A remote control-switch for the security privacy shutters."; id = "UO45_EngineeringOffice"; name = "Privacy Shutters"; pixel_x = -24; pixel_y = 6; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"tB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"tw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sign/securearea{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"tx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ty" = (/obj/machinery/computer/security{network = list("UO45")},/obj/machinery/door_control{desc = "A remote control-switch for the security privacy shutters."; id = "UO45_EngineeringOffice"; name = "Privacy Shutters"; pixel_x = -24; pixel_y = 6; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"tz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 4; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"tA" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 1},/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"tB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tD" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tE" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; layer = 2.9; name = "engineering security door"},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
@@ -1022,52 +1022,52 @@
"tH" = (/obj/machinery/meter{frequency = 1443; id = "UO45_wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tI" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2 Outlet Pump"; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"tJ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "O2 Outlet Pump"; on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"tK" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 1},/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"tK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/engineering{name = "Engineering Maintenance"; req_access_txt = "201"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"tR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"tT" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"tU" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"tV" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"tX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"tY" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"tZ" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ua" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "browncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"ub" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"tY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "browncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"tZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"ua" = (/obj/structure/filingcabinet,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ub" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO45_Engineering"; name = "Engineering Lockdown"; pixel_x = 24; pixel_y = 6; req_access_txt = "201"},/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uc" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"ud" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"ue" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uf" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/engineering{name = "Engineering Foyer"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ug" = (/obj/structure/filingcabinet,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO45_Engineering"; name = "Engineering Lockdown"; pixel_x = 24; pixel_y = 6; req_access_txt = "201"},/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ui" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uj" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ug" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uh" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ui" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 2; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uj" = (/obj/machinery/light,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5; initialize_directions = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uk" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to External"; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"ul" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "External to Filter"; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"um" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 2; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"un" = (/obj/machinery/light,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5; initialize_directions = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uo" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"up" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO45_n2_in"; name = "Nitrogen Supply Control"; output_tag = "UO45_n2_out"; sensors = list("UO45_n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uq" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO45_o2_in"; name = "Oxygen Supply Control"; output_tag = "UO45_o2_out"; sensors = list("UO45_o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "blue"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ur" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 1; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"us" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"ut" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uu" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uv" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"um" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"un" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO45_n2_in"; name = "Nitrogen Supply Control"; output_tag = "UO45_n2_out"; sensors = list("UO45_n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uo" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO45_o2_in"; name = "Oxygen Supply Control"; output_tag = "UO45_o2_out"; sensors = list("UO45_o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "blue"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"up" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 1; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uq" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"ur" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"us" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{dir = 9; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ut" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"uu" = (/obj/structure/closet,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"uv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("UO45_n2_sensor" = "Nitrogen", "UO45_o2_sensor" = "Oxygen", "UO45_waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "caution"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uw" = (/turf/simulated/mineral/random/labormineral,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"uy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uz" = (/obj/structure/closet,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"uz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uA" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"uB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("UO45_n2_sensor" = "Nitrogen", "UO45_o2_sensor" = "Oxygen", "UO45_waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "caution"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uC" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"uD" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"uE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uF" = (/turf/simulated/wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uG" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "201"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
@@ -1076,49 +1076,49 @@
"uJ" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uK" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uL" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uM" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uN" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uO" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"uM" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"uN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"uO" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"uP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"uQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"uQ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"uR" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"uS" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"uT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"uU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"uS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"uT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("UO45_mair_in_meter" = "Mixed Air In", "UO45_air_sensor" = "Mixed Air Supply Tank", "UO45_mair_out_meter" = "Mixed Air Out", "UO45_dloop_atm_meter" = "Distribution Loop", "UO45_wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uU" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("UO45_mair_in_meter" = "Mixed Air In", "UO45_air_sensor" = "Mixed Air Supply Tank", "UO45_mair_out_meter" = "Mixed Air Out", "UO45_dloop_atm_meter" = "Distribution Loop", "UO45_wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"uX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uY" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"uZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uY" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"uZ" = (/obj/machinery/door/firedoor,/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"va" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vb" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{ icon_state = "delivery"; name = "floor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vc" = (/obj/machinery/door/firedoor,/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "delivery"; name = "floor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vd" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{ icon_state = "delivery"; name = "floor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vb" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "UO45_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vc" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"vd" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 10; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"ve" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "UO45_n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "UO45_n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vg" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "UO45_o2_in"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 10000},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "UO45_o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 10000},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vi" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{ icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"vj" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 10; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"vk" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 6; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"vi" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 6; icon_state = "warnplate"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"vj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"vk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"vl" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"vm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"vn" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"vo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"vo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"vp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"vq" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"vr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"vs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"vt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vv" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vy" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/noticeboard{dir = 1; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vC" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 10; icon_state = "caution"; tag = "icon-caution (SOUTHWEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vE" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO45_n2_sensor"},/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vF" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
@@ -1132,30 +1132,30 @@
"vN" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access_txt = "201"},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"vO" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_mining{name = "Mining Foyer"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"vP" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_mining{name = "Mining Foyer"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"vQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/noticeboard{dir = 1; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 10; icon_state = "caution"; tag = "icon-caution (SOUTHWEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vW" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vX" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"vY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"vZ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wa" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wb" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"vZ" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wa" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wc" = (/obj/machinery/light/small{dir = 1},/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wd" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"we" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wg" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "201"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wk" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"wl" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wm" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "201"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wo" = (/turf/simulated/wall/rust,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wq" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
@@ -1166,93 +1166,91 @@
"wv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"ww" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wx" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wC" = (/obj/structure/toilet{pixel_y = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wA" = (/obj/structure/toilet{pixel_y = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wB" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wE" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wE" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wF" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wH" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wI" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wJ" = (/obj/structure/stool/bed/chair/office,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wK" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wM" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small,/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{ icon_state = "freezerfloor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wH" = (/obj/structure/stool/bed/chair/office,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wI" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wK" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small,/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wM" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"wN" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm9"; name = "Mining Dorm 2"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door_control{id = "awaydorm9"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wS" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wT" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wU" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"wV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wR" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wS" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wU" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO45 Mining APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/secure_closet/engineering_personal{icon_broken = "miningsecbroken"; icon_closed = "miningsec"; icon_locked = "miningsec1"; icon_off = "miningsecoff"; icon_opened = "miningsecopen"; icon_state = "miningsec"; locked = 0; name = "miner's equipment"; req_access = list(201)},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/gloves/fingerless,/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/closet/secure_closet/miner{req_access = list(201)},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wW" = (/obj/machinery/light/small,/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "201"},/turf/simulated/floor/carpet,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wY" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO45 Mining APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/secure_closet/engineering_personal{icon_broken = "miningsecbroken"; icon_closed = "miningsec"; icon_locked = "miningsec1"; icon_off = "miningsecoff"; icon_opened = "miningsecopen"; icon_state = "miningsec"; locked = 0; name = "miner's equipment"; req_access = list(201)},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/gloves/fingerless,/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/closet/secure_closet/miner{req_access = list(201)},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xc" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/cigarettes{pixel_x = -2},/obj/item/weapon/lighter/zippo{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xd" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xe" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xf" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/newscaster{pixel_y = -28},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"wY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xa" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/cigarettes{pixel_x = -2},/obj/item/weapon/lighter/zippo{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xc" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xd" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/newscaster{pixel_y = -28},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xf" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xg" = (/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"xh" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/mining{name = "Processing Area"; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xi" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/mining{name = "Processing Area"; req_access_txt = "201"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xj" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xk" = (/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xl" = (/obj/machinery/light/small,/obj/machinery/computer/atmos_alert,/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO45_Engineering"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -24; req_access_txt = "201"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "UO45_Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 6; pixel_y = -24; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"xm" = (/obj/machinery/conveyor{dir = 2; id = "UO45_mining"},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xn" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xo" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xj" = (/obj/machinery/light/small,/obj/machinery/computer/atmos_alert,/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO45_Engineering"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -24; req_access_txt = "201"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "UO45_Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 6; pixel_y = -24; req_access_txt = "201"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"xk" = (/obj/machinery/conveyor{dir = 2; id = "UO45_mining"},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xl" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xm" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xo" = (/obj/machinery/conveyor{dir = 2; id = "UO45_mining"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xp" = (/obj/machinery/suit_storage_unit/mining,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xr" = (/obj/machinery/conveyor{dir = 2; id = "UO45_mining"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xr" = (/obj/machinery/mineral/processing_unit{dir = 1; output_dir = 2},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xs" = (/obj/machinery/conveyor_switch/oneway{id = "UO45_mining"; name = "mining conveyor"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xt" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xv" = (/obj/machinery/suit_storage_unit/mining,/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Mining"; dir = 4; network = list("UO45")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xw" = (/obj/structure/table,/obj/item/weapon/pickaxe,/obj/item/device/radio/off,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xx" = (/obj/machinery/mineral/processing_unit{dir = 1; output_dir = 2},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xy" = (/obj/machinery/mineral/processing_unit_console{machinedir = 8},/turf/simulated/wall/rust,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Mining"; dir = 4; network = list("UO45")},/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xz" = (/obj/machinery/light/small{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xB" = (/obj/machinery/conveyor{dir = 2; id = "UO45_mining"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xC" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xD" = (/obj/machinery/light/small{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xD" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xE" = (/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xF" = (/obj/machinery/conveyor{dir = 2; id = "UO45_mining"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 26},/obj/item/stack/sheet/glass{amount = 19},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_mining{name = "Mining EVA"; req_access_txt = "201"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xL" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xL" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xN" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2},/turf/simulated/wall,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 26},/obj/item/stack/sheet/glass{amount = 19},/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xP" = (/obj/machinery/mineral/stacking_machine{dir = 1; input_dir = 8; output_dir = 4},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xR" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/mech_bay_recharge_floor,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xT" = (/obj/machinery/mech_bay_recharge_port{tag = "icon-recharge_port (WEST)"; icon_state = "recharge_port"; dir = 8},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xU" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xV" = (/obj/machinery/mineral/stacking_machine{dir = 1; input_dir = 8; output_dir = 4},/turf/simulated/floor/plating{dir = 5; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/plasma{amount = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/plasma{amount = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xX" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"xY" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"xZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"ya" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"yb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"yc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{ icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"yd" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel{ icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"ye" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"yf" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{ icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"yg" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "201"},/turf/simulated/floor/plasteel{ icon_state = "asteroidfloor"; temperature = 273.15},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"xZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"ya" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"yb" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"yc" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"yd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"ye" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "201"},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"yh" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"yi" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yj" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
@@ -1260,30 +1258,30 @@
"yl" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"ym" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yn" = (/obj/structure/closet/crate,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yo" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yp" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yo" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yp" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yq" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yr" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"ys" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yt" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yu" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yt" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/hardsuit,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yu" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/structure/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yv" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yw" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yx" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yy" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yz" = (/obj/structure/alien/resin/membrane,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yA" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yA" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yB" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yC" = (/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yD" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yE" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yD" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yE" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yF" = (/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yG" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yH" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 5; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yI" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yJ" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yK" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yL" = (/obj/structure/alien/weeds,/obj/effect/landmark/corpse,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yK" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/hardsuit,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yL" = (/obj/structure/alien/weeds,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1349,38 +1347,38 @@ aaaaaaaaaaaaaaacacacacacgxgwgxkegwgwgwkfkfgMkgkhgwgwgVgVgVgxgVgVgVgxgxkjkiklkkgA
aaaaaaaaaaaaaaacacacacacacgLkziRkAgLkBkDkCiWkEkGkFkIkHkJkHkKkHkLkIkHkMkOkNkQkPkSkRkTkRkRkUkRkVkXkWkXkYkZgAlblalcgzleldldlflggugulhkqhKiJhKljlilililllklnlmfLadamamamfofofofoacacfofofofofoacacaclololololoacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
aaaaaaaaaaaaaaacacacacacacgLlplrlqltlslulslwlvlylxlzlzlAlzlBlzlClzlElDlGlFlIlHlKlJlMlLlOlNlOlOlOlOhbkYkZlPhbhbhblPlRlQgmlSfPfOfPfPfOfOfPfPfPlTlUhLlVfPlXlWghfofofofofofofoacacacacfofofofoacacaclolZlYmaloacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
aaaaaaaaaaaaaaacacacacacacgMmbjJjIiRmcmcmdgLmemfgxgxgVgVgVgxgVgVgVgwgwmhmggzgzgzmimkmjmjgyhHhHhHhHmlkYkZgAmnmmmogzmpglmrmqfPmsmumtfOmvmxmwfOfOfPfPfOfPmzmyghfofofofofofofofoacacfofofofoacacacaclomBmAmaloacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacgLmCmEmDmGmFmImHgxgVgVgwfofofofoqbfofofofohdmKmLgAmMmOmNmQmPmRgzmTmSmUhHmlmVgAgAgygzgzgymXmWfOfOfPmYnamZfPnbnancfOndnfnengfPnhmygsfofofofofofofofofofofofofofoacacaclololoninjnjloacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacgLgLgMgMgLgwgxgxgwfofoqbfofofofofofofofohefomKnkgAnlnnnmnomPmPgynqnpnrhHmlnshdntnvnununwnynxnAnzfPnBnCfPfOnBnDfPfPnEgmnFnHnGnJnIgsfofofofofofofofofofofofofofoacacacnjnKnLnLnLnMloacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacfofofofofofofofofofofohefofofoacnNnOgAnPnnnQnSnRnTgynVnUnWhHmlmVhdnOnXnYnZnZoboaodocofoeohogojoiohokomolooonoqoposorgsfofofofofofofofofofofofofofofoacacnjotovouovowlolololoacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacfohefofofofofofofofofofofofogAnNoxgAoynnozoBoAoCgyoEoDnWoFmlmVgAnkmKfofogsoGldldoHoJoIoLoKoMoIoOoNoQoPoLoRoSfPoUoTghpvfofofofofofofofofofofofofofoacaclooVoXoWoZoYlopapbloacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacfofofohefofofofofofofohehdpdpcgApepfmPphpgoAgzpjpipkhHmlkXhdplmKfofogspnpmgupofPppfPpqfOprfPfPfOpsfPfPptfPpumygsfofofofofofofoqBqAqAqAqAqCqAqAqApypzpApCpBpEpDnjpFpGloacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacachefofohefofoachdpHpIgAgzgzpJgzgzpKgzgzpLpMgypNjOgAnOnNhefogsgspOpQpPfOpRpSpTpVpUfOpWpYpXpZfOqafOjbmygsfofofofofofofoucnjnjqcqcnjfofofoacloqcqcqdqcqcloqeqflololoacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacfofofofoacacgzqgqhqiqjqlqkqmgyqoqngzqpqrqqhbqsgAnOmKfofofogsgsgsgsfLqtqufPqwqvfPfPfPqxqyfOqzfPjbmygsfofofojMfovIvmwknjqEqDqDlonjnjnjloloqFqHqGqJqIqLqKqNqMqOloacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzqPpIqQqRqTqSqUgAhdhdgAqVqWhbhbqXgAqYmKfofofofofofofoghqZmtfPmvrafPrbrcpXrdfPrefPrgrffLgsgsgsghgsgsrhfLlorjrirlrknjrmrornrprqrsrrrurtrwrvryrxqOlolonjnjacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgyrzqhqirArCrBrDgArFrErHrGrIkPrKrJgArLmKfofofohefofofoghghghghfPfOfPfOfOrMfPfPrNfOrPrOrRrQrTrSrUrQrWrVrYrXsarZscsbsesdsgsfsishsksjsmslsosnspspsrsqssstnjacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgyqPqhgAgAgAhdhdgAsvsugAswsysxsAszgAnOmKachefofofofohefofofoacacacfPsBsCpXsDfOrefOjRsEsGsFsHsFsIsFsKsJsMsLsNsNsPsOsRsQsTsSsisUsWsVsYsXtasZtctbtetdtftgloacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgytithnvtjnunutltktntmtototptototqtrtsnNacfofofofofofofofofofofoacfLttpXpXsDfOrefPtvtughgsgsgsghgsgsrhfLlotxtwtztylotAtCtBtEtDtFtbtHtGtIrlrltJtKlolonjnjacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgztLtMtNtOtOtNtQtPtPtRtPtPtStPtUtTtWtVtXacfofofofofofofofofofofoheghghtZtYfOfOqzfPubuagsfofofoyhfovIwkfonjudueuflolouguiuhloujulukunumupuouruqusnjacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgyuuutuvgzuwgzgzgzgzgygygAgAhdhdgzuxuyhdfofofohefofofofofofofofofofoghghghfOuzreuAubuagsfofofofofofofofonjuCuBuEuDuFqcuGqclolouHuIlouJuKnjuJuKnjnjacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzuMuLuNgzacacacacacacacacfofohduOuQuPhdfofofofofofofohefoacfofofofofofogsuSuRuTfPuUuagsfofofofofofofofoqcuWuVuXsNuYsNsTuZvavbvdvclovevflovgvhloacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzvjvivkgyacacacacacacacacacfohdhHvlhHhdfofofofofofofofoacacachefofofoyivnvpvovqfOvsvrfLfofofofofofofofoqcvtrlvvvuvxvwvzvyvBvAvDvClovEvFlovGvHloacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzgzgygygzacacacacacacacacacfoyjevevevfofofofofofofofofoacacfofofofovJvKvKvLvMvNvLvPvOvJfofofofofofofofonjvRvQvTvSvVvUvXvWvYvZwbwalololololololoacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofofofofoacacfofofofofofofofovJwdwcwewfwhwgwjwivJykfofofofofofofonjnjuFwmwlwnwouFnjnjlolonjnjacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofofoacacfofofofofofofofovJwqwpwswrwuwtwwwvwxfofofofofofofofofolowywAwzwBuFwCloacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofohefohefofofofofofofofofofovJvLvMvMvMwEwDwGwFwxfofofofofofofofofoqcwHwJwIwLwKwMnjacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofoacacacacacacacfofofofofovKwNwpwPwOwtwQwwwRwxfofofofofofofofofoqcwSwUwTwVuFlonjacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofovJwdwWwXwfwZwYxbxavJfofofofofofofofofoqcxcxexdxgxfloacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofovJvJvKvKvLvLvMxixhvJacacfofofofofofofoloxjxlxklolonjacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofoacacvKxmxoxnxqxpvKvKvJvJvJfofofofoaclonjnjloloacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacachefofofoacacvKxrxtxsxqxuwxxvxvxwvJfofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofoacvKxxxyxzwwxAxCxBxExDvKfofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfohefofofoacvJxFxtxGxIxHxKxJxMxLvJfofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofovJxmxNxOxQxPwxxRxSxTvKfofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofovKxmxVxUxXxWvJvJvKvJvJfofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofovJvKvJwxxZxYvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofovJyaycybvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofovJydyfyevJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofovJwxygwxvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacgLmCigmDmFmEmHmGgxgVgVgwfofofofoqbfofofofohdmKmLgAmImNmMmPmOmQgzmSmRmThHmlmVgAgAgygzgzgymXmWfOfOfPmYnamZfPnbnancfOmUnendnffPngmygsfofofofofofofofofofofofofofoacacaclololoninjnjloacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacgLgLgMgMgLgwgxgxgwfofoqbfofofofofofofofohefomKnkgAnhnmnlnnmOmOgynonpnqhHmlnshdntnrnununwnxnvnznyfPnBnCfPfOnBnDfPfPnAgmnFnEnGnJnIgsfofofofofofofofofofofofofofoacacacnjnHnKnKnKnLloacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacfofofofofofofofofofofohefofofoacnNnOgAnMnmnPnRnQnSgynTnUnVhHmlmVhdnOnXnYnZnZoanWocoboeodohofoiogohojolokomonoooposorgsfofofofofofofofofofofofofofofoacacnjoqovouovoqlolololoacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacfohefofofofofofofofofofofofogAnNotgAownmoxozoyoAgyoBoDnVoCmlmVgAnkmKfofogsoEldldoFoGoIoJoHoKoIoMoLoOoNoJoPoQfPoUoTghpvfofofofofofofofofofofofofofoacaclooRoXoWoZoSlopapbloacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacfofofohefofofofofofofohehdpdoVgAoYpcmOpfpeoygzphpgpihHmlkXhdpjmKfofogsplpkgupmfPppfPpqfOprfPfPfOpnfPfPptfPpomygsfofofofofofofoqBqAqAqAqAqCqAqAqApypzpspApupCpBnjpFpGloacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacachefofohefofoachdpHpIgAgzgzpDgzgzpEgzgzpLpMgypJjOgAnOnNhefogsgspKpOpNfOpRpSpTpVpUfOpPpWpQpXfOpYfOjbmygsfofofofofofofoucnjnjqcqcnjfofofoacloqcqcpZqcqcloqeqflololoacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacfofofofoacacgzqaqhqiqjqlqdqggyqmqkgzqnqpqohbqqgAnOmKfofofogsgsgsgsfLqtqufPqwqvfPfPfPqrqsfOqzfPjbmygsfofofojMfovIvmwknjqyqxqxlonjnjnjloloqDqEqGqHqFqJqIqLqKqMloacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzqPpIqQqRqOqNqSgAhdhdgAqTqUhbhbqVgAqWmKfofofofofofofoghqZmtfPmvrafPqXqYpQrbfPrefPrgrcfLgsgsgsghgsgsrhfLlorfrdrlrinjrjrmrkrprqrsrrrurtrwrnrvroqMlolonjnjacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgyrxqhqirArCryrzgArBrErHrDrFkPrIrGgArJmKfofofohefofofoghghghghfPfOfPfOfOrKfPfPrLfOrPrOrRrMrQrNrSrMrUrTrVrXsarZscrWserYsgsbsisdsksjsmslsosnspspsfsqssstnjacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgyqPqhgAgAgAhdhdgAsvsugAshswsrsysxgAnOmKachefofofofohefofofoacacacfPszsApQsBfOrefOjRsEsGsCsDsCsFsCsIsHsJsLsNsNsPsKsRsMsTsOsisQsWsVsYsXtasZtctbsStdtftgloacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgytithnrsUnunutltktetmtototptototqtrtsnNacfofofofofofofofofofofoacfLtjpQpQsBfOrefPtvtughgsgsgsghgsgsrhfLlotttntxtwlotytCtztEtDtFtbtHtGtIrlrltJtAlolonjnjacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgztLtMtNtOtOtNtQtPtPtBtPtPtStPtRtKtWtVtXacfofofofofofofofofofofoheghghtUtTfOfOqzfPtZtYgsfofofoyhfovIwkfonjudueuflolouaugublouhulukujuiunumupuouqnjacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgyusurutgzuwgzgzgzgzgygygAgAhdhdgzuxuyhdfofofohefofofofofofofofofofoghghghfOuureuAtZtYgsfofofofofofofofonjuvuBuEuzuFqcuGqclolouHuIlouJuKnjuJuKnjnjacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzuCuLuDgzacacacacacacacacfofohduMuNuPhdfofofofofofofohefoacfofofofofofogsuOuRuQfPuStYgsfofofofofofofofoqcuTuVuXsNuUsNsTuWvauYvbuZlovevflovgvhloacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzvdvcvigyacacacacacacacacacfohdhHvlhHhdfofofofofofofofoacacachefofofoyivnvpvjvqfOvovkfLfofofofofofofofoqcvrrlvvvuvxvwvtvsvBvAvDvylovEvFlovGvHloacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacgzgzgygygzacacacacacacacacacfoyjevevevfofofofofofofofofoacacfofofofovJvKvKvLvMvNvLvPvOvJfofofofofofofofonjvCvzvQvSvVvRvUvTvYvWvZvXlololololololoacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofofofofoacacfofofofofofofofovJwdwcwewfwbwawgwivJykfofofofofofofonjnjuFwmwlwhwouFnjnjlolonjnjacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofofoacacfofofofofofofofovJwqwpwswrwuwtwwwvwxfofofofofofofofofolowjwywnwzuFwAloacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofohefohefofofofofofofofofofovJvLvMvMvMwBwDwGwCwxfofofofofofofofofoqcwEwHwFwJwIwKnjacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofoacacacacacacacfofofofofovKwNwpwPwOwtwQwwwLwxfofofofofofofofofoqcwMwSwRwTuFlonjacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofovJwdwWwXwfwVwUwZwYvJfofofofofofofofofoqcxaxcxbxexdloacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofovJvJvKvKvLvLvMxixhvJacacfofofofofofofoloxfxjxglolonjacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofoacacvKxkxmxlxqxnvKvKvJvJvJfofofofoaclonjnjloloacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacachefofofoacacvKxoxtxsxqxuwxxpxpxwvJfofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofoacvKxrxyxvwwxAxCxxxExzvKfofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfohefofofoacvJxBxtxGxIxHxKxJxMxDvJfofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofovJxkxNxOxQxFwxxRxSxTvKfofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofovKxkxPxLxVxUvJvJvKvJvJfofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofovJvKvJwxxWxYvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofovJxXyaxZvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofovJybydycvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofovJwxyewxvJfofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofoylevevevylfofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofofofofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
aaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacfofofofofofofofofofofofoacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm
index 0d5e512241b..bb057f10cee 100644
--- a/_maps/map_files/RandomZLevels/wildwest.dmm
+++ b/_maps/map_files/RandomZLevels/wildwest.dmm
@@ -34,7 +34,7 @@
"aH" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/space,/area/space)
"aI" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/space)
"aJ" = (/obj/machinery/door/airlock/vault{locked = 1},/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
-"aK" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
+"aK" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
"aL" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/awaymission/wwmines)
"aM" = (/turf/simulated/mineral/random,/area/awaymission/wwmines)
"aN" = (/turf/simulated/mineral,/area/awaymission/wwmines)
@@ -56,7 +56,7 @@
"bd" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"be" = (/turf/simulated/wall/mineral/sandstone,/area/space)
"bf" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
-"bg" = (/obj/effect/landmark/corpse/miner/rig,/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
+"bg" = (/obj/effect/landmark/corpse/miner/hardsuit,/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"bh" = (/turf/simulated/floor/wood,/area/awaymission/wwmines)
"bi" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"bj" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/wood,/area/awaymission/wwmines)
@@ -64,7 +64,7 @@
"bl" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"bm" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"bn" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/wood,/area/awaymission/wwmines)
-"bo" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
+"bo" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"bp" = (/obj/structure/lattice,/turf/space,/area/space)
"bq" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"br" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
@@ -107,7 +107,7 @@
"cc" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
"cd" = (/obj/item/weapon/paper{info = " The miners in the town have become sick and almost all production has stopped. They, in a fit of delusion, tossed all of their mining equipment into the furnaces. They all claimed the same thing. A voice beckoning them to lay down their arms. Stupid miners."; name = "Planer Saul's Journal: Page 4"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
"ce" = (/obj/structure/table/woodentable,/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/weapon/kitchen/knife/butcher,/turf/simulated/floor/wood,/area/awaymission/wwmines)
-"cf" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"cf" = (/obj/structure/mineral_door/wood,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"cg" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"ch" = (/obj/item/ammo_box/c10mm,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"ci" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/awaymission/wwmines)
@@ -125,7 +125,7 @@
"cu" = (/obj/item/weapon/moneybag,/turf/simulated/floor/carpet,/area/awaymission/wwgov)
"cv" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cw" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/awaymission/wwmines)
-"cx" = (/obj/effect/mine/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
+"cx" = (/obj/effect/mine/gas/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"cy" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cz" = (/obj/item/clothing/gloves/color/yellow,/obj/item/device/multitool,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cA" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwgov)
@@ -135,9 +135,9 @@
"cE" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"cF" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"cG" = (/obj/item/toy/sword,/turf/simulated/floor/wood,/area/awaymission/wwgov)
-"cH" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwgov)
+"cH" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cI" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/wood,/area/awaymission/wwgov)
-"cJ" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/wood,/area/awaymission/wwgov)
+"cJ" = (/obj/structure/mineral_door/wood,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cK" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/carpet,/area/awaymission/wwgov)
"cL" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
"cM" = (/obj/structure/stool/bed/chair/wood/wings{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwgov)
@@ -157,8 +157,8 @@
"da" = (/obj/effect/landmark/corpse/syndicatecommando{mobname = "Syndicate Commando"},/turf/simulated/floor/carpet,/area/awaymission/wwgov)
"db" = (/obj/machinery/mineral/mint,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"dc" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/wood,/area/awaymission/wwmines)
-"dd" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
-"de" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
+"dd" = (/obj/structure/mineral_door/wood,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
+"de" = (/obj/structure/mineral_door/wood,/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"df" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
"dg" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"dh" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/plasteel{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
@@ -166,15 +166,15 @@
"dj" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/turf/simulated/floor/plasteel{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
"dk" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"dl" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/wood,/area/awaymission/wwmines)
-"dm" = (/obj/effect/mine/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"dm" = (/obj/effect/mine/gas/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"dn" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"do" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand4"; icon_state = "ironsand4"},/area/awaymission/wwgov)
-"dp" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"dp" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"dq" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand12"; icon_state = "ironsand12"},/area/awaymission/wwgov)
"dr" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand14"; icon_state = "ironsand14"},/area/awaymission/wwgov)
"ds" = (/obj/structure/toilet,/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/awaymission/wwgov)
"dt" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand9"; icon_state = "ironsand9"},/area/awaymission/wwgov)
-"du" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
+"du" = (/obj/structure/mineral_door/wood,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
"dv" = (/obj/structure/largecrate,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"dw" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand7"; icon_state = "ironsand7"},/area/awaymission/wwgov)
"dx" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
@@ -207,7 +207,7 @@
"dY" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
"dZ" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area/space)
"ea" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
-"eb" = (/obj/effect/mine/plasma,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
+"eb" = (/obj/effect/mine/gas/plasma,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
"ec" = (/obj/effect/decal/cleanable/blood,/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
"ed" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/item/ammo_box/a357,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"ee" = (/obj/structure/stool/bed/chair/comfy/brown{tag = "icon-comfychair_brown (EAST)"; icon_state = "comfychair_brown"; dir = 4},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
@@ -231,14 +231,14 @@
"ex" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibdown1"; icon_state = "gibdown1"},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"ey" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand7"; icon_state = "ironsand7"},/area/awaymission/wwgov)
"ez" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/awaymission/wwrefine)
-"eA" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
+"eA" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"eB" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines)
"eC" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand14"; icon_state = "ironsand14"},/area/awaymission/wwgov)
"eD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"eE" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"eF" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"eG" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
-"eH" = (/obj/effect/mine/plasma,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"eH" = (/obj/effect/mine/gas/plasma,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"eI" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_beige"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"eJ" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"eK" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
@@ -267,7 +267,7 @@
"fh" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
"fi" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
"fj" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
-"fk" = (/obj/effect/mine/plasma,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
+"fk" = (/obj/effect/mine/gas/plasma,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"fl" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibdown1"; icon_state = "gibdown1"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"fm" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fn" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwmines)
@@ -281,7 +281,7 @@
"fv" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/lattice,/turf/space,/area/space)
"fw" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"fx" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
-"fy" = (/obj/effect/mine/dnascramble,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"fy" = (/obj/effect/mine/dnascramble,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fz" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
"fA" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/grass,/area/awaymission/wwgov)
"fB" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/grass,/area/awaymission/wwgov)
@@ -292,7 +292,7 @@
"fG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/floor/grass,/area/awaymission/wwgov)
"fH" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plasteel,/area/space)
"fI" = (/turf/simulated/floor/plasteel,/area/space)
-"fJ" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
+"fJ" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"fK" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fL" = (/obj/item/weapon/gun/projectile/revolver/russian,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fM" = (/obj/structure/stool/bed/chair/wood/normal{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index ba174a3771b..0683edc0dd8 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -1,46 +1,46 @@
"aaa" = (/turf/space,/area/space)
"aab" = (/obj/structure/lattice,/turf/space,/area/space)
-"aac" = (/turf/simulated/floor/plating/airless,/area/space)
+"aac" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
"aad" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/abandoned)
-"aae" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
-"aaf" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
-"aag" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/abandoned)
-"aah" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/abandoned)
+"aae" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
+"aaf" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/abandoned)
+"aag" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/abandoned)
+"aah" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
"aai" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaj" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aak" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
-"aal" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/abandoned)
-"aam" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/abandoned)
-"aan" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/abandoned)
+"aak" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/abandoned)
+"aal" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_r"; tag = "icon-burst_r (WEST)"},/turf/space,/area/shuttle/abandoned)
+"aam" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/abandoned)
+"aan" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aao" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aap" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aaq" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/shuttle/abandoned)
-"aar" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/abandoned)
+"aap" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/shuttle/abandoned)
+"aaq" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/abandoned)
+"aar" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"; tag = "icon-propulsion (WEST)"},/turf/space,/area/shuttle/abandoned)
"aas" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/abandoned)
-"aat" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/abandoned)
-"aau" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/abandoned)
+"aat" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/abandoned)
+"aau" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/abandoned)
"aav" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aaw" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/abandoned)
+"aaw" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_n"; name = "north of station"; width = 18},/turf/space,/area/space)
"aax" = (/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
-"aay" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_n"; name = "north of station"; width = 18},/turf/space,/area/space)
+"aay" = (/obj/structure/window/full/shuttle{dir = 10; icon_state = "9"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"aaz" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaA" = (/obj/structure/window/full/shuttle{icon_state = "14"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
-"aaB" = (/obj/structure/window/full/shuttle{dir = 10; icon_state = "9"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
+"aaB" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/abandoned)
"aaC" = (/obj/structure/window/full/shuttle{icon_state = "17"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"aaD" = (/obj/machinery/door/airlock/glass{name = "Hibernation Pods"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaE" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"aaF" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaG" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aaH" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/abandoned)
+"aaH" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaI" = (/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aaJ" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
+"aaJ" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/abandoned)
"aaK" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/shuttle/abandoned)
-"aaL" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/abandoned)
-"aaM" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (WEST)"; icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/abandoned)
+"aaL" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_l"; tag = "icon-burst_l (WEST)"},/turf/space,/area/shuttle/abandoned)
+"aaM" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/abandoned)
"aaN" = (/turf/space,/area/shuttle/abandoned)
"aaO" = (/obj/structure/window/full/shuttle{icon_state = "16"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"aaP" = (/obj/structure/table,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aaQ" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/abandoned)
+"aaQ" = (/obj/machinery/door/unpowered/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 10; height = 35; id = "whiteship"; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; width = 21},/obj/docking_port/stationary{dir = 8; dwidth = 10; height = 35; id = "whiteship_home"; name = "north of SS13"; width = 21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaR" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaS" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aaT" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
@@ -58,11 +58,11 @@
"abf" = (/obj/machinery/door/airlock/glass{name = "Living Module"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abg" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abh" = (/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abi" = (/obj/machinery/door/unpowered/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 10; height = 35; id = "whiteship"; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; width = 21},/obj/docking_port/stationary{dir = 8; dwidth = 10; height = 35; id = "whiteship_home"; name = "north of SS13"; width = 21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
+"abi" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/abandoned)
"abj" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abk" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abl" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/abandoned)
-"abm" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/abandoned)
+"abl" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/abandoned)
+"abm" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
"abn" = (/obj/structure/window/full/shuttle{icon_state = "15"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"abo" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abp" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
@@ -71,60 +71,60 @@
"abs" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abt" = (/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abu" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abv" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
+"abv" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abw" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abx" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"aby" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
-"abz" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
+"aby" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
+"abz" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/abandoned)
"abA" = (/obj/effect/decal/cleanable/blood{amount = 0},/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"abB" = (/obj/structure/spacepoddoor,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"abC" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abD" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/abandoned)
+"abD" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/two_tile_ver{id_tag = "whiteshippoddoor"; layer = 3.1},/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"abE" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
-"abF" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/two_tile_ver{id_tag = "whiteshippoddoor"; layer = 3.1},/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
-"abG" = (/obj/machinery/door_control{id = "whiteshippoddoor"; name = "Pod Door Control"; pixel_y = -24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abH" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
+"abF" = (/obj/machinery/door_control{id = "whiteshippoddoor"; name = "Pod Door Control"; pixel_y = -24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
+"abG" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
+"abH" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"abI" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
"abJ" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
-"abK" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
-"abL" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
-"abM" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
+"abK" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
+"abL" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
+"abM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/permabrig)
"abN" = (/turf/simulated/wall/r_wall,/area/security/permabrig)
"abO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
-"abP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/permabrig)
-"abQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
+"abP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
+"abQ" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
"abR" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abS" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abT" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
+"abT" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abU" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abV" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"abW" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"abW" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abX" = (/obj/machinery/computer/shuttle/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"abY" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"abY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abZ" = (/obj/structure/computerframe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"aca" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/appleseed,/obj/item/seeds/appleseed,/obj/item/seeds/appleseed,/turf/simulated/floor/grass,/area/security/permabrig)
-"acb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acc" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/turf/simulated/floor/grass,/area/security/permabrig)
+"aca" = (/obj/machinery/hydroponics/soil,/obj/item/seeds/apple,/obj/item/seeds/apple,/obj/item/seeds/apple,/turf/simulated/floor/grass,/area/security/permabrig)
+"acb" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"acc" = (/obj/machinery/hydroponics/soil,/obj/item/seeds/orange,/obj/item/seeds/orange,/obj/item/seeds/orange,/turf/simulated/floor/grass,/area/security/permabrig)
"acd" = (/obj/structure/table,/obj/item/weapon/storage/box/syndidonkpockets,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"ace" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acf" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"acg" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/grass,/area/security/permabrig)
+"acg" = (/obj/machinery/hydroponics/soil,/obj/item/seeds/corn,/obj/item/seeds/corn,/obj/item/seeds/corn,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/grass,/area/security/permabrig)
"ach" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acj" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/grass,/area/security/permabrig)
+"acj" = (/obj/machinery/hydroponics/soil,/obj/item/seeds/wheat/rice,/obj/item/seeds/wheat/rice,/obj/item/seeds/wheat/rice,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/grass,/area/security/permabrig)
"ack" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acl" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acm" = (/obj/item/device/radio/intercom/syndicate{pixel_y = -28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acn" = (/obj/structure/closet/syndicate/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aco" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/permabrig)
-"acp" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/security/permabrig)
+"acp" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/security/permabrig)
"acq" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate)
"acr" = (/obj/machinery/door/window{dir = 2; name = "Cockpit"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acs" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
-"act" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
-"acu" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"act" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
+"acv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acx" = (/obj/machinery/biogenerator,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/permabrig)
"acz" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -134,30 +134,30 @@
"acD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acE" = (/obj/machinery/seed_extractor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acF" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"acG" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"acH" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"acG" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"acH" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"acI" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acJ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"acK" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acL" = (/obj/structure/table/glass,/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acL" = (/obj/structure/table/glass,/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/reagent_containers/spray/pestspray,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/table/glass,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"acO" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"acP" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"acQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"acN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/table/glass,/obj/item/weapon/cultivator,/obj/item/device/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"acP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"acQ" = (/obj/machinery/door/airlock{name = "Bathroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acR" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"acS" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"acT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
-"acU" = (/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
+"acU" = (/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
"acV" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/security/permabrig)
"acW" = (/turf/simulated/wall,/area/security/permabrig)
"acX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acY" = (/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig)
"ada" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
-"adb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/permabrig)
-"adc" = (/obj/machinery/door/airlock{name = "Bathroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"add" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/permabrig)
+"adb" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"adc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"add" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/permabrig)
"ade" = (/obj/structure/closet/syndicate/suits,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"adf" = (/obj/effect/landmark{name = "Syndicate-Uplink"; tag = ""},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"adg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
@@ -167,21 +167,21 @@
"adk" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adl" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adm" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"adn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"adn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"ado" = (/turf/simulated/floor/plasteel,/area/security/permabrig)
-"adp" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"adp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adq" = (/obj/machinery/computer/library/public,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adr" = (/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
"ads" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
-"adt" = (/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig)
-"adu" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig)
-"adv" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
-"adw" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig)
+"adt" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig)
+"adu" = (/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig)
+"adv" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig)
+"adw" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
"adx" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig)
"ady" = (/obj/structure/stool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"adz" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"adA" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "synd_outer"; locked = 0; name = "Ship External Access"; req_access = null; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "smindicate"; name = "Outer Airlock"; opacity = 0},/obj/machinery/door_control{id = "smindicate"; name = "External Door Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "150"},/obj/docking_port/mobile{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate"; name = "syndicate infiltrator"; roundstart_move = "syndicate_away"; width = 18},/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_nw"; name = "northwest of station"; width = 18},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
-"adB" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
+"adA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
+"adB" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "synd_outer"; locked = 0; name = "Ship External Access"; req_access = null; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "smindicate"; name = "Outer Airlock"; opacity = 0},/obj/machinery/door_control{id = "smindicate"; name = "External Door Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "150"},/obj/docking_port/mobile{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate"; name = "syndicate infiltrator"; roundstart_move = "syndicate_away"; width = 18},/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_nw"; name = "northwest of station"; width = 18},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"adC" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
"adD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool,/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adE" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
@@ -190,9 +190,9 @@
"adH" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adI" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adJ" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"adK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"adL" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"adM" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"adK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"adL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"adM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
"adO" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
"adP" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
@@ -201,86 +201,86 @@
"adS" = (/obj/structure/closet/syndicate/suits,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"adT" = (/obj/structure/table,/obj/item/weapon/grenade/plastic/c4{pixel_x = 2; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"adU" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"adV" = (/obj/machinery/atmospherics/unary/tank/air{dir = 2},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
-"adW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"adV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"adW" = (/obj/machinery/atmospherics/unary/tank/air{dir = 2},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
"adX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/gameboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adY" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"adZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aea" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aec" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aed" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aee" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aef" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aei" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aej" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aek" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
-"ael" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall,/area/security/permabrig)
-"aem" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
-"aen" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
-"aeo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
-"aep" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
-"aeq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig)
-"aer" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/security/permabrig)
+"aea" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aec" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aed" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aee" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aef" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeh" = (/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
+"aei" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall,/area/security/permabrig)
+"aej" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"aek" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
+"ael" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aem" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
+"aen" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
+"aep" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/security/permabrig)
+"aer" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig)
"aes" = (/obj/machinery/door/window{dir = 4; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aet" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "synd_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aeu" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "synd_inner"; locked = 1; name = "Ship External Access"; req_access = null; req_access_txt = "150"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aev" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aew" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "synd_airlock"; pixel_x = 25; req_access_txt = "150"; tag_airpump = "synd_pump"; tag_chamber_sensor = "synd_sensor"; tag_exterior_door = "synd_outer"; tag_interior_door = "synd_inner"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "synd_sensor"; pixel_x = 25; pixel_y = 12; req_access_txt = "150"},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aex" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_nw"; name = "northwest of SS13"; width = 19},/turf/space,/area/space)
-"aey" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aez" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aey" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aez" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeF" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeG" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeH" = (/obj/machinery/camera{c_tag = "Prison East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeJ" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeK" = (/obj/machinery/door/airlock/glass{name = "Prison Basketball Court"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeL" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
-"aeM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/holofloor,/area/security/permabrig)
+"aeI" = (/obj/machinery/door/airlock/glass{name = "Prison Basketball Court"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeJ" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"aeK" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeL" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/holofloor,/area/security/permabrig)
+"aeM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/permabrig)
"aeN" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/holofloor,/area/security/permabrig)
"aeO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig)
"aeP" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aeQ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aeR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aeS" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"aeT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig)
-"aeU" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeT" = (/obj/machinery/camera{c_tag = "Prison Basketball Court"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"aeU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aeV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aeY" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 1"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aeZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 2"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aeZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/permabrig)
"afa" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 2"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afb" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afc" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afd" = (/obj/machinery/camera{c_tag = "Prison Basketball Court"; dir = 4; network = list("SS13")},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
-"afe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/permabrig)
+"afb" = (/obj/machinery/flasher{id = "permaflash1"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afc" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afd" = (/obj/machinery/flasher{id = "permaflash2"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afe" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aff" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/permabrig)
"afg" = (/obj/item/device/radio/intercom/syndicate{pixel_x = -28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"afh" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"afi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/security/permabrig)
-"afl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash1"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash2"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/security/permabrig)
-"afp" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig)
-"afr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
-"afs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
-"aft" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig)
-"afu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
-"afv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
-"afw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
+"afj" = (/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plating/airless,/area/space)
+"afk" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
+"afl" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig)
+"afm" = (/obj/structure/grille,/obj/structure/sign/securearea{pixel_x = -30},/turf/simulated/floor/plating/airless,/area/space)
+"afn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afp" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison 3"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afq" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior East"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig)
+"afr" = (/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 2; network = list("SS13")},/obj/structure/lattice,/turf/space,/area/security/permabrig)
+"afs" = (/obj/machinery/door_control{id = "Prison Lockdown 1"; name = "Cell 1 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"aft" = (/obj/machinery/door_control{id = "Prison Lockdown 2"; name = "Cell 2 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"afu" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"afv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"afw" = (/obj/machinery/flasher_button{id = "permaflash1"; pixel_x = 0; pixel_y = -27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"afx" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/security/permabrig)
"afy" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_ne"; name = "northeast of station"; width = 18},/turf/space,/area/space)
"afz" = (/obj/machinery/recharge_station/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -298,20 +298,20 @@
"afL" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
"afM" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"afN" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afO" = (/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"afO" = (/turf/simulated/floor/plating/airless,/area/space)
"afP" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"afQ" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"afR" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"afS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
"afT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
-"afU" = (/obj/machinery/door/airlock/glass_security{name = "Prison 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afV" = (/obj/machinery/door/airlock/glass_security{name = "Prison 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afW" = (/obj/machinery/door/airlock/glass_security{name = "Prison 3"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"afX" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
-"afY" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"afU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"afV" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"afW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"afX" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space)
+"afY" = (/obj/machinery/camera{c_tag = "Prison South"; dir = 1; network = list("SS13")},/obj/machinery/flasher_button{id = "permaflash2"; pixel_x = 0; pixel_y = -27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"afZ" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/vox)
-"aga" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox)
-"agb" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northwest_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"aga" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northwest_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"agb" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox)
"agc" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/vox)
"agd" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/docking_port/mobile{dir = 2; dwidth = 2; height = 18; id = "skipjack"; name = "Vox Skipjack"; roundstart_move = "skipjack_away"; width = 19},/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_ne"; name = "northeast of SS13"; width = 19},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"age" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox)
@@ -319,25 +319,25 @@
"agg" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"agh" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"agi" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"agj" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{filled = 0.2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
-"agk" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"agl" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"agm" = (/obj/machinery/computer/area_atmos/area,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"agn" = (/obj/machinery/camera{c_tag = "Prison Air Control"; dir = 6; network = list("Prison","SS13")},/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"ago" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"agp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"agq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agj" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agk" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{filled = 0.2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
+"agl" = (/obj/machinery/computer/area_atmos/area,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agm" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"ago" = (/obj/machinery/camera{c_tag = "Prison Air Control"; dir = 6; network = list("Prison","SS13")},/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"agr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"ags" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door_control{id = "Prison Lockdown 1"; name = "Cell 1 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"agt" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"agu" = (/obj/machinery/door_control{id = "Prison Lockdown 2"; name = "Cell 2 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"ags" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"agt" = (/turf/simulated/wall/r_wall,/area/security/armoury)
+"agu" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/securearmoury)
"agv" = (/obj/machinery/door_control{id = "Prison Lockdown 3"; name = "Cell 3 Lockdown"; pixel_x = 24; pixel_y = 3; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
"agw" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/vox)
-"agx" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"agy" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25; req_access_txt = "152"},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"agx" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25; req_access_txt = "152"},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"agy" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"agz" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"agA" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"agB" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"agA" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"agB" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"agC" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25; req_access_txt = "152"},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"agD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"agE" = (/obj/machinery/sleeper/syndie{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -347,17 +347,17 @@
"agI" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"agJ" = (/obj/structure/table,/obj/item/device/radio/beacon/syndicate/bomb{pixel_y = 5},/obj/item/device/radio/beacon/syndicate/bomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"agK" = (/obj/structure/table,/obj/item/weapon/grenade/syndieminibomb{pixel_x = 4; pixel_y = 2; pixel_z = 0},/obj/item/weapon/grenade/syndieminibomb{pixel_x = -1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"agL" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
-"agM" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"agL" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"agM" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
"agN" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"agO" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"agP" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"agQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"agR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"agS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
-"agT" = (/obj/machinery/flasher_button{id = "permaflash1"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
-"agU" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
-"agV" = (/obj/machinery/camera{c_tag = "Prison South"; dir = 1; network = list("SS13")},/obj/machinery/flasher_button{id = "permaflash2"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"agR" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/box/buck{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/box/buck,/obj/item/weapon/storage/box/buck{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"agS" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"agT" = (/turf/simulated/wall,/area/security/vacantoffice{name = "\improper Security Toilet"})
+"agU" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/security/vacantoffice{name = "\improper Security Toilet"})
+"agV" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plating,/area/security/permabrig)
"agW" = (/obj/machinery/flasher_button{id = "permaflash3"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/permabrig)
"agX" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"agY" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "vox_west_control"; pixel_x = 24; req_access_txt = "152"; tag_airpump = "vox_west_vent"; tag_chamber_sensor = "vox_west_sensor"; tag_exterior_door = "vox_northwest_lock"; tag_interior_door = "vox_southwest_lock"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
@@ -373,8 +373,8 @@
"ahi" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"ahj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"ahk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ahl" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southwest_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"ahm" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox)
+"ahl" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access_txt = "152"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/vox)
+"ahm" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southwest_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"ahn" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/vox)
"aho" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (WEST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 8},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"ahp" = (/obj/item/weapon/stool,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
@@ -390,12 +390,12 @@
"ahz" = (/obj/structure/computerframe,/obj/item/weapon/paper/synditele,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"ahA" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"ahB" = (/obj/machinery/teleport/hub/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"ahC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ahD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ahE" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig)
-"ahF" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/turf/simulated/floor/plating,/area/security/permabrig)
-"ahG" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig)
-"ahH" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/security/permabrig)
+"ahC" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/security/permabrig)
+"ahD" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/security/permabrig)
+"ahE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"ahF" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/turf/simulated/floor/plating,/area/security/permabrig)
+"ahG" = (/obj/item/clothing/mask/muzzle/gag,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/security/permabrig)
+"ahH" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/armoury)
"ahI" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"ahJ" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"ahK" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
@@ -405,43 +405,43 @@
"ahO" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/syndicate)
"ahP" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r"; icon_state = "propulsion_r"},/turf/space,/area/shuttle/syndicate)
"ahQ" = (/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"ahR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ahS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ahT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/permabrig)
-"ahU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/security/permabrig)
-"ahV" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/permabrig)
-"ahW" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/security/permabrig)
-"ahX" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig)
-"ahY" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = -32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"ahR" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/armoury)
+"ahS" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/armoury)
+"ahT" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/armoury)
+"ahU" = (/obj/effect/decal/warning_stripes/northwest,/obj/effect/decal/warning_stripes/southeastcorner,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ahV" = (/obj/effect/decal/warning_stripes/north,/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ahW" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/northeast,/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ahX" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"ahY" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/vacantoffice{name = "\improper Security Toilet"})
"ahZ" = (/obj/machinery/door/airlock/hatch{req_access_txt = "152"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"aia" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aib" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aic" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/stool/bed/chair/e_chair,/obj/effect/landmark{name = "revenantspawn"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aid" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/device/assembly/signaler{code = 6; frequency = 1445},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aie" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aif" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"aia" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plating,/area/security/permabrig)
+"aib" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/permabrig)
+"aic" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/security/permabrig)
+"aid" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"aie" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/permabrig)
+"aif" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/armoury)
"aig" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"aih" = (/turf/simulated/wall/r_wall,/area/security/hos)
-"aii" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
-"aij" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
-"aik" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"aii" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/security/armoury)
+"aij" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/armoury)
+"aik" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/armoury)
"ail" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"aim" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"ain" = (/obj/machinery/camera{c_tag = "Prison Execution Chamber"; dir = 4; network = list("Prison","SS13")},/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -1; pixel_y = -2},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aio" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aip" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aiq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"air" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Prisoner Transfer Center"; req_access = null; req_access_txt = "1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"ais" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"ain" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/armoury)
+"aio" = (/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/west,/obj/machinery/light{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"aip" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/rack,/obj/item/weapon/storage/box/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/box/beanbag,/obj/item/weapon/storage/box/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/box/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/box/beanbag,/obj/item/weapon/storage/box/beanbag,/obj/item/weapon/storage/box/tranquilizer{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"aiq" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/laser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"air" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/warning_stripes/east,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ais" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
"ait" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"aiu" = (/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plating,/area/security/permabrig)
+"aiu" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"aiv" = (/turf/simulated/wall/r_wall,/area/security/securearmoury)
-"aiw" = (/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aix" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aiy" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aiz" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/cartridge/detective,/obj/item/device/megaphone,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aiA" = (/obj/machinery/photocopier,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aiB" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/newscaster/security_unit{pixel_y = 33},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aiw" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury)
+"aix" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury)
+"aiy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"aiz" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury)
+"aiA" = (/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/west,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"aiB" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/armor/laserproof{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aiC" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; tag = "icon-window5 (EAST)"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"aiD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aiE" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
@@ -453,41 +453,41 @@
"aiK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/circular_saw,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aiL" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/optable,/obj/item/organ/internal/brain,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aiM" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; tag = "icon-window5 (EAST)"},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"aiN" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/secure_closet/injection,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aiO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aiP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aiQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aiR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"})
-"aiS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"aiT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/rack,/obj/item/ammo_box/shotgun/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/beanbag,/obj/item/ammo_box/shotgun/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/beanbag,/obj/item/ammo_box/shotgun/beanbag,/obj/item/ammo_box/shotgun/tranquilizer{pixel_x = 3; pixel_y = -3},/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"aiU" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 3; pixel_y = -3},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"aiV" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/ammo_box/shotgun/buck{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"aiN" = (/obj/structure/rack,/obj/item/weapon/gun/energy/gun{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"aiO" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/warning_stripes/east,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"aiP" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"aiQ" = (/obj/structure/curtain/open/shower,/obj/machinery/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"aiR" = (/obj/machinery/shower,/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"aiS" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"aiT" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/main)
+"aiU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/main)
+"aiV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/main)
"aiW" = (/obj/item/toy/prize/honk,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aiX" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aiX" = (/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"aiY" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aiZ" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aja" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aiZ" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Prison Execution Antichamber"; dir = 4; network = list("Prison","SS13")},/obj/item/device/assembly/signaler{code = 6; frequency = 1445},/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"aja" = (/obj/structure/closet/secure_closet/injection,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"ajb" = (/turf/simulated/wall/r_wall,/area/security/podbay)
-"ajc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"ajc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/space)
"ajd" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aje" = (/obj/item/weapon/skeleton/r_arm,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"ajf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ajg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ajh" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/suit/armor/laserproof{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"aji" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ajf" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"ajg" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/mindshield,/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury)
+"ajh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"aji" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"ajj" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajk" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajl" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"ajm" = (/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"ajn" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/hos,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/carpet,/area/security/hos)
-"ajo" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_pump,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
-"ajp" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/carpet,/area/security/hos)
-"ajq" = (/obj/machinery/door_control{id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = -28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -28; pixel_y = -3; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"ajr" = (/obj/structure/table/woodentable,/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"ajk" = (/obj/vehicle/secway,/obj/item/key/security,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury)
+"ajl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"ajm" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"ajn" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/armoury)
+"ajo" = (/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ajp" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"ajq" = (/obj/structure/rack,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"ajr" = (/obj/structure/rack,/obj/structure/window/reinforced,/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = 3; pixel_y = -3},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"ajs" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 10},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/effect/decal/warning_stripes/east,/obj/item/clothing/glasses/welding,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/podbay)
"ajt" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/engine,/area/security/podbay)
-"aju" = (/obj/machinery/light{dir = 1; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/security/podbay)
-"ajv" = (/obj/machinery/camera{c_tag = "Brig Podbay"; dir = 2; network = list("SS13")},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "secpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
+"aju" = (/obj/machinery/camera{c_tag = "Brig Podbay"; dir = 2; network = list("SS13")},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "secpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
+"ajv" = (/obj/machinery/light{dir = 1; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/security/podbay)
"ajw" = (/turf/simulated/floor/engine,/area/security/podbay)
"ajx" = (/obj/structure/spacepoddoor{luminosity = 3},/turf/simulated/floor/engine,/area/security/podbay)
"ajy" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine/vacuum,/area/security/podbay)
@@ -502,95 +502,95 @@
"ajH" = (/obj/machinery/bodyscanner,/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajI" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ajK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ajL" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/laser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"ajM" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajO" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajQ" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ajR" = (/obj/structure/rack,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"ajS" = (/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"ajT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/hos)
-"ajU" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
+"ajK" = (/obj/structure/rack,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"ajL" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ajM" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior South"; dir = 8; network = list("SS13")},/turf/space,/area/security/securearmoury)
+"ajN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"ajO" = (/obj/structure/mirror{pixel_x = -28},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"ajP" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"ajQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"ajR" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/main)
+"ajS" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Detective"},/turf/simulated/floor/plasteel,/area/security/main)
+"ajT" = (/obj/structure/stool/bed/chair,/obj/machinery/light{dir = 1; on = 1},/obj/effect/landmark/start{name = "Brig Physician"},/turf/simulated/floor/plasteel,/area/security/main)
+"ajU" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"ajV" = (/turf/simulated/floor/carpet,/area/security/hos)
-"ajW" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"ajX" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/jetpack/oxygen,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
+"ajW" = (/obj/machinery/door/poddoor{id_tag = "Execution Vent"; name = "Execution Vent Shutter"},/obj/structure/grille{layer = 2.69},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"ajX" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/jetpack/oxygen,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"ajY" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/vox)
"ajZ" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aka" = (/obj/structure/rack,/obj/item/weapon/pneumatic_cannon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/tank/nitrogen,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"akb" = (/obj/structure/rack,/obj/machinery/light{dir = 8},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/energy/gun{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"akc" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"ake" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"akb" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/security{name = "Execution Room"; req_access = null; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"akc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/warning_stripes/northeast,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"akd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/binary/valve/open{tag = "icon-map_valve1 (EAST)"; icon_state = "map_valve1"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"ake" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"akf" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akg" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"akh" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior South"; dir = 8; network = list("SS13")},/turf/space,/area/security/permabrig)
-"aki" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
-"akk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
-"akl" = (/mob/living/simple_animal/hostile/retaliate/araneus,/turf/simulated/floor/carpet,/area/security/hos)
-"akm" = (/obj/structure/table/woodentable,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"akg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"akh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"aki" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"akj" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury)
+"akk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"akl" = (/obj/machinery/door/airlock/security{name = "Warden's office"; req_access = null; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/armoury)
+"akm" = (/obj/effect/decal/warning_stripes/northwestcorner,/obj/effect/decal/warning_stripes/northeastcorner,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"akn" = (/obj/machinery/space_heater,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"ako" = (/obj/spacepod/sec{req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
"akp" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l"; icon_state = "propulsion_l"},/turf/space,/area/shuttle/vox)
"akq" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"akr" = (/obj/structure/rack,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aks" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"akt" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"aks" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"akt" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aku" = (/obj/structure/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"akv" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security's Office"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
-"akx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"akw" = (/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"akx" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
"aky" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"akz" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "secpodbay"; layer = 3.1; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
"akA" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"akB" = (/turf/simulated/wall/r_wall,/area/security/range)
-"akC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/southwest,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"akH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akK" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akL" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/camera{c_tag = "Brig Head of Security's Office"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"akM" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/unary/vent_pump,/obj/effect/decal/warning_stripes/yellow/hollow,/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel,/area/security/podbay)
-"akN" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/security/podbay)
-"akO" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/security/podbay)
-"akP" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/security/podbay)
-"akQ" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"akC" = (/obj/machinery/camera{c_tag = "Brig Security Toilet"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"akD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"akE" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/light_switch{pixel_y = -25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"akF" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel,/area/security/main)
+"akG" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/security/main)
+"akH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
+"akI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/main)
+"akJ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/main)
+"akK" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"akL" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"akM" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"akN" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/newscaster{pixel_y = 30},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"akO" = (/obj/structure/stool/bed/chair/e_chair{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "revenantspawn"},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"akP" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
+"akQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Execution Shutter"; name = "Execution Decency Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/execution{name = "\improper Prisoner Transfer Center"})
"akR" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"akS" = (/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"akT" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel,/area/security/range)
-"akU" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"akV" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel,/area/security/range)
+"akS" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"akT" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"akU" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"akV" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"akW" = (/turf/simulated/wall,/area/security/range)
"akX" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"akY" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
+"akY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"akZ" = (/turf/simulated/wall/r_wall,/area/security/prisonlockers)
-"ala" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"alb" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"ala" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"alc" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/permabrig)
-"ald" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"ale" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/southwest,/obj/structure/rack,/obj/item/key/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"alf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"alg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeast,/obj/vehicle/secway,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"alh" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"ali" = (/turf/simulated/wall/r_wall,/area/security/securehallway)
-"alj" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/securehallway)
-"alk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/security/securehallway)
-"all" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/securehallway)
-"alm" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/hos)
-"aln" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/hos)
-"alo" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Head of Security"; req_access_txt = "58"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"alp" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/hos)
-"alq" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/hos)
-"alr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/security/podbay)
+"ald" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Prisoner Transfer Center"; req_access = null; req_access_txt = "1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"ale" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig)
+"alf" = (/obj/machinery/vending/security,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury)
+"alg" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury)
+"alh" = (/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/l3closet/security,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury)
+"ali" = (/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/bombcloset,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury)
+"alj" = (/obj/machinery/light_switch{pixel_x = -25},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"alk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/light,/obj/machinery/door_control{id = "Secure Armory"; name = "Secure Armory Shutter Control"; pixel_x = 7; pixel_y = -28; req_access_txt = "3"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"all" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"alm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"aln" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"alo" = (/obj/machinery/door/airlock{name = "Bathroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"})
+"alp" = (/obj/structure/table,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Brig Briefing Room West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/security/main)
+"alq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
+"alr" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/main)
"als" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/podbay)
-"alt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"alu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/podbay)
+"alt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/main)
+"alu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"alv" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
"alw" = (/obj/structure/grille,/turf/space,/area/space)
"alx" = (/obj/item/weapon/broken_bottle,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
@@ -598,1564 +598,1564 @@
"alz" = (/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"alA" = (/obj/item/clothing/head/bearpelt,/obj/item/xenos_claw,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"alB" = (/turf/simulated/floor/plasteel,/area/security/range)
-"alC" = (/obj/machinery/magnetic_module,/obj/structure/target_stake,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
+"alC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/main)
"alD" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
"alE" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"alF" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"alG" = (/obj/machinery/camera{c_tag = "Prisoner Lockers"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"alH" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"alI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonlockers)
-"alJ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
-"alK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/permabrig)
-"alL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/permabrig)
-"alM" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
-"alN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/securearmoury)
-"alO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Armory"; req_access_txt = "3"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Secure Armory"; req_access_txt = "3"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"alP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/securearmoury)
-"alQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/securehallway)
-"alR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Brig North Hallway"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alX" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"alZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/securehallway)
-"ama" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"amb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/securehallway)
-"amc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/security/podbay)
-"amd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/spacepod_key{id = 100000},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"ame" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amg" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/device/spacepod_equipment/weaponry/laser,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amh" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/space,/area/space)
+"alF" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/main)
+"alG" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/hos)
+"alH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"alI" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/security/podbay)
+"alJ" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/security/podbay)
+"alK" = (/obj/machinery/camera{c_tag = "Prison Execution Chamber"; dir = 4; network = list("Prison","SS13")},/obj/effect/decal/warning_stripes/southwest,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_CO2 = 0; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Execution Shutter"; name = "Execution Decency Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alM" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/effect/decal/warning_stripes/southeast,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alN" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alO" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/warning_stripes/west,/obj/machinery/door_control{id = "Execution Vent"; name = "Execution Vent Control"; pixel_x = -5; pixel_y = -28; req_access_txt = "1"},/obj/machinery/door_control{id = "Execution Shutter"; name = "Execution Shutter Control"; pixel_x = 5; pixel_y = -28; req_access_txt = "1"},/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alP" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -1; pixel_y = -2},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alQ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
+"alR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"alS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"alT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"alU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/warden)
+"alV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"alW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/warden)
+"alX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "Secure Armory"; name = "Secure Armory Shutters"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"alY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/securearmoury)
+"alZ" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Armory"; req_access_txt = "3"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Secure Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
+"ama" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main)
+"amb" = (/obj/structure/table,/obj/item/clothing/suit/tracksuit/red,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Security Equipment Lockers"; dir = 4; network = list("SS13")},/obj/machinery/requests_console{department = "Security"; departmentType = 5; name = "Security Requests Console"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/main)
+"amc" = (/obj/structure/closet/secure_closet/security,/obj/structure/sign/goldenplaque{pixel_y = 30},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"amd" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"ame" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/main)
+"amf" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/main)
+"amg" = (/obj/machinery/vending/cigarette,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/main)
+"amh" = (/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space)
"ami" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"amj" = (/obj/item/clothing/head/collectable/xenom,/obj/item/clothing/head/chicken,/obj/item/weapon/aiModule/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"amk" = (/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aml" = (/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"amm" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel,/area/security/range)
-"amn" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/security/range)
+"amk" = (/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"aml" = (/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"amm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/main)
+"amn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
"amo" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"amp" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"amq" = (/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"amr" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
-"ams" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"amt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"amu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers)
-"amv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"amw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"amx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"amy" = (/turf/simulated/wall,/area/security/armoury)
-"amz" = (/obj/machinery/deployable/barrier,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"amA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/deployable/barrier,/obj/effect/decal/warning_stripes/northeastcorner,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"amB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"amC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"amD" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"amE" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"amF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel,/area/security/armoury)
-"amG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/securehallway)
-"amH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"amI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/securehallway)
-"amJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"amK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"amL" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"amM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/securehallway)
-"amN" = (/turf/simulated/floor/plasteel,/area/security/securehallway)
-"amO" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"amP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/securehallway)
-"amQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amT" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Security Pod Pilot"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"amU" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/camera{c_tag = "Brig Pod Pilot's Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"amp" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/book/manual/sop_legal,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/main)
+"amq" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Briefing Room East"; dir = 8; network = list("SS13")},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/main)
+"amr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/hos)
+"ams" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/stamp/hos,/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/carpet,/area/security/hos)
+"amt" = (/obj/structure/closet/secure_closet/hos,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"amu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/carpet,/area/security/hos)
+"amv" = (/mob/living/simple_animal/hostile/retaliate/araneus,/turf/simulated/floor/carpet,/area/security/hos)
+"amw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"amx" = (/obj/machinery/photocopier,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "darkred"},/area/security/warden)
+"amy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"amz" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"},/area/security/warden)
+"amA" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/light{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Brig Warden's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"},/area/security/warden)
+"amB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"amC" = (/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"},/area/security/warden)
+"amD" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/warden)
+"amE" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkred"},/area/security/warden)
+"amF" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"amG" = (/obj/machinery/vending/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage)
+"amH" = (/obj/structure/rack,/obj/machinery/recharger/wallcharger{pixel_y = 25},/obj/machinery/recharger/wallcharger{pixel_y = 35},/obj/item/device/flash,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"amI" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"amJ" = (/obj/structure/rack,/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/obj/item/weapon/restraints/handcuffs{pixel_y = -4},/obj/item/weapon/restraints/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"amK" = (/obj/effect/decal/warning_stripes/red/partial,/turf/simulated/floor/plasteel,/area/security/main)
+"amL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
+"amM" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"amN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"amO" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/book/manual/security_space_law,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/main)
+"amP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"amQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"amR" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/camera{c_tag = "Brig Pod Pilot's Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"amS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/security/hos)
+"amT" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Head of Security"; req_access_txt = "58"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"amU" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxstarboard)
"amV" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/security/podbay)
"amW" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
-"amX" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxstarboard)
+"amX" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/hos)
"amY" = (/obj/structure/AIcore,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"amZ" = (/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"amZ" = (/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ana" = (/obj/item/weapon/storage/box/zipties,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"anb" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"anc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
-"and" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"ane" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers)
-"anf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ang" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"anh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"ani" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"anj" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/deployable/barrier,/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"ank" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/deployable/barrier,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"anb" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/security/hos)
+"anc" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"and" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/keycard_auth{pixel_x = -28; pixel_y = 2},/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor/carpet,/area/security/hos)
+"ane" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
+"anf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/range)
+"ang" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/range)
+"anh" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/camera{c_tag = "Prisoner Lockers"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"ani" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"anj" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"ank" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"anl" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/prisonlockers)
+"anm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"ann" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"ano" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/vending/security,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/seceqstorage)
-"anq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/security/seceqstorage)
-"anr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"ans" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/seceqstorage)
-"ant" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/security/main)
-"anu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/main)
-"anv" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main)
-"anw" = (/obj/machinery/door/airlock/multi_tile/glass{req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/main)
-"anx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"any" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/main)
-"anz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main)
+"ano" = (/obj/machinery/sleeper{dir = 2; icon_state = "sleeper"; tag = "icon-sleeper (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/security/medbay)
+"anp" = (/obj/structure/closet/secure_closet/brigdoc,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/security/medbay)
+"anq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/security/medbay)
+"anr" = (/obj/item/roller,/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/security/medbay)
+"ans" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/security/medbay)
+"ant" = (/obj/structure/table/glass,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/machinery/camera{c_tag = "Brig Medbay"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/security/medbay)
+"anu" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/warden)
+"anv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"anw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"anx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main)
+"any" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"anz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"anA" = (/turf/simulated/wall,/area/security/main)
-"anB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/security/main)
-"anC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/podbay)
-"anD" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"anE" = (/obj/structure/table/reinforced,/obj/item/device/flashlight,/obj/item/device/radio{pixel_y = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"anF" = (/obj/machinery/light,/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"anG" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"anB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"anC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"anD" = (/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access_txt = "3"},/turf/simulated/floor/plasteel,/area/security/warden)
+"anE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/warden)
+"anF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"anG" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
"anH" = (/turf/simulated/wall/r_wall,/area/security/main)
-"anI" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"anJ" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
-"anK" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"anL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"anM" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"anN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
-"anO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
-"anP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/permabrig)
-"anQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"anR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/armoury)
+"anI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"anJ" = (/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"anK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"anL" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/main)
+"anM" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"anN" = (/obj/structure/stool,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"anO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
+"anP" = (/obj/structure/stool,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"anQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
+"anR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/main)
+"anS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main)
+"anT" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/book/manual/sop_security,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/main)
+"anU" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/main)
+"anV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/hos)
"anW" = (/turf/simulated/floor/plasteel,/area/security/armoury)
-"anX" = (/obj/machinery/light{dir = 4},/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/bombcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"anY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/armoury)
-"anZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage)
-"aoa" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Security"; departmentType = 5; name = "Security Requests Console"; pixel_x = -30; pixel_y = 30},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
-"aob" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
-"aoc" = (/obj/structure/sink{pixel_y = 18},/obj/structure/mirror{pixel_y = 32},/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
-"aod" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/seceqstorage)
-"aoe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main)
-"aof" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"aog" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
-"aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
-"aoi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"aoj" = (/obj/structure/table,/obj/item/ashtray/bronze{pixel_x = 2; pixel_y = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"aok" = (/obj/machinery/vending/cigarette,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/main)
+"anX" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_legal,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/carpet,/area/security/hos)
+"anY" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"anZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door_control{desc = "A remote control-switch to lock down the prison wing's blast doors"; id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = -28; pixel_y = 7; range = 20; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -28; pixel_y = -3; range = 20; req_access_txt = "2"},/turf/simulated/floor/carpet,/area/security/hos)
+"aoa" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos)
+"aob" = (/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aoc" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aod" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aoe" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aof" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
+"aog" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aoh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aoi" = (/obj/effect/landmark/start{name = "Brig Physician"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"aoj" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/security/medbay)
+"aok" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"aol" = (/turf/simulated/floor/plasteel,/area/shuttle/gamma/station)
"aom" = (/turf/simulated/wall,/area/security/prisonlockers)
-"aon" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall,/area/security/prisonlockers)
-"aoo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/prisonlockers)
-"aop" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogation)
-"aoq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"aor" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"aos" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aot" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aou" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/armoury)
-"aov" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aow" = (/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/l3closet/security,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aox" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/armoury)
-"aoy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
-"aoz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"aoA" = (/obj/structure/stool,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/seceqstorage)
-"aoB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"aoC" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/seceqstorage)
-"aoD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
-"aoE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"aoF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
-"aoG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"aoH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"aoI" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/main)
+"aon" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"aoo" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/security/medbay)
+"aop" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"aoq" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/warden)
+"aor" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aos" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aot" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aou" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aov" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aow" = (/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = 3; pixel_y = -28; range = 20; req_access_txt = "2"},/obj/machinery/door_control{desc = "A remote control-switch to lock down the prison wing's blast doors"; id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = -7; pixel_y = -28; range = 20; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aox" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/warden)
+"aoy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aoz" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
+"aoA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aoB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aoC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aoD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aoE" = (/obj/effect/decal/warning_stripes/red/partial{dir = 1},/turf/simulated/floor/plasteel{dir = 1},/area/security/main)
+"aoF" = (/obj/effect/decal/warning_stripes/red/partial{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1},/area/security/main)
+"aoG" = (/obj/effect/decal/warning_stripes/red/partial{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 1},/area/security/main)
+"aoH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/main)
+"aoI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
"aoJ" = (/turf/simulated/floor/plasteel,/area/security/main)
-"aoK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"aoL" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"aoM" = (/obj/machinery/camera{c_tag = "Brig Firing Range West"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"aoN" = (/obj/machinery/camera{c_tag = "Brig Firing Range East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
+"aoK" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
+"aoL" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
+"aoM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/main)
+"aoN" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/main)
"aoO" = (/turf/simulated/wall/r_wall,/area/space)
-"aoP" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/security/prisonlockers)
-"aoQ" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogation)
-"aoR" = (/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogation)
-"aoS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/interrogation)
-"aoT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"aoU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"aoV" = (/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aoW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aoX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury)
-"aoY" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aoZ" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"apa" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"apb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/armoury)
-"apc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/security,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
-"apd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"ape" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/seceqstorage)
-"apf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"apg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/sign/securearea,/turf/simulated/floor/plating,/area/security/seceqstorage)
-"aph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"api" = (/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"apj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/main)
-"apk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"apl" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/main)
-"apm" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"apn" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"apo" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"aoP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"aoQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main)
+"aoR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/hos)
+"aoS" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/computer/card/minor/hos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aoT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aoU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/range)
+"aoV" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aoW" = (/obj/structure/table,/obj/item/clothing/under/color/orange/prison,/obj/item/clothing/shoes/orange,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aoX" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aoY" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/security/medbay)
+"aoZ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/security/medbay)
+"apa" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"apb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/security/medbay)
+"apc" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/masks{pixel_x = 6; pixel_y = 2},/obj/item/weapon/storage/box/gloves,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/security/medbay)
+"apd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"ape" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/requests_console{department = "Warden"; departmentType = 7; name = "Warden's Requests Console"; pixel_x = 0; pixel_y = -30},/obj/item/device/radio/intercom/department/security{pixel_x = -28; pixel_y = -10},/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkred"},/area/security/warden)
+"apf" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/warden)
+"apg" = (/obj/structure/table,/obj/item/weapon/book/manual/sop_legal,/obj/item/weapon/paper/armory,/obj/item/weapon/clipboard,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/warden)
+"aph" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/warden)
+"api" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/item/device/megaphone,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/warden)
+"apj" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/warden)
+"apk" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkred"},/area/security/warden)
+"apl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"apm" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
+"apn" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
+"apo" = (/obj/structure/grille/broken,/turf/space,/area/space)
"app" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard)
-"apq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"apr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard)
+"apq" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard)
+"apr" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/trade/sol)
"aps" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/trade/sol)
-"apt" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/trade/sol)
+"apt" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/trade/sol)
"apu" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "trade_sol_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "160"},/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
-"apv" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/trade/sol)
+"apv" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/trade/sol)
"apw" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
"apx" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
-"apy" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/trade/sol)
-"apz" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxport)
-"apA" = (/obj/structure/table/reinforced,/obj/machinery/magnetic_controller{autolink = 1; name = "Firing Range Control Console"; path = "w;e;e;w;s;n;n;s"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/range)
-"apB" = (/obj/effect/decal/warning_stripes/eastnorthwest,/turf/simulated/floor/plasteel,/area/security/range)
-"apC" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/range)
-"apD" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/range)
-"apE" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/paper/firingrange,/turf/simulated/floor/plasteel,/area/security/range)
+"apy" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxport)
+"apz" = (/obj/structure/table/reinforced,/obj/machinery/magnetic_controller{autolink = 1; name = "Firing Range Control Console"; path = "w;e;e;w;s;n;n;s"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/range)
+"apA" = (/obj/machinery/vending/wallmed1{dir = 2; name = "Emergency NanoMed"; pixel_x = -27; pixel_y = 0; req_access_txt = "0"},/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Brig Security Equipment South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage)
+"apB" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/spray/pepper{pixel_x = -2; pixel_y = -2},/obj/item/weapon/reagent_containers/spray/pepper{pixel_x = -4; pixel_y = -4},/obj/item/weapon/reagent_containers/spray/pepper{pixel_y = -4},/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
+"apC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"apD" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/seceqstorage)
+"apE" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/seceqstorage)
"apF" = (/turf/simulated/wall/r_wall,/area/security/medbay)
"apG" = (/turf/simulated/wall,/area/security/medbay)
-"apH" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogation)
-"apI" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/item/device/flashlight/lamp,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/interrogation)
-"apJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogation)
-"apK" = (/turf/simulated/wall,/area/security/interrogationhallway)
-"apL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
-"apM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway)
-"apN" = (/turf/simulated/wall,/area/security/warden)
-"apO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/warden)
-"apP" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/airlock/security{name = "Warden's office"; req_access = null; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"apQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/security/warden)
-"apR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/warden)
+"apH" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/security/main)
+"apI" = (/obj/structure/closet/redcorp,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/main)
+"apJ" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
+"apK" = (/obj/structure/closet/wardrobe/red,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
+"apL" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/main)
+"apM" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel,/area/security/main)
+"apN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main)
+"apO" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/main)
+"apP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/warden)
+"apQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/main)
+"apR" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Pod Pilot"},/turf/simulated/floor/plasteel,/area/security/main)
"apS" = (/turf/simulated/wall,/area/security/seceqstorage)
-"apT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Brig Security Equipment Lockers"; dir = 4; network = list("SS13")},/obj/structure/sign/poster/legit{pixel_x = -32; pixel_y = 0},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage)
-"apU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"apV" = (/obj/structure/stool,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/seceqstorage)
-"apW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"apX" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage)
-"apY" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/seceqstorage)
-"apZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"aqa" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"aqb" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/book/manual/security_space_law/black,/turf/simulated/floor/plasteel,/area/security/main)
-"aqc" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/main)
-"aqd" = (/obj/machinery/camera{c_tag = "Brig Briefing Room East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"aqe" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/main)
-"aqf" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"aqg" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/space,/area/shuttle/trade/sol)
+"apT" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"apU" = (/obj/structure/table/woodentable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Brig Head of Security's Office"; dir = 1; network = list("SS13")},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/cartridge/detective,/obj/item/device/megaphone,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"apV" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_x = -5; pixel_y = 0},/obj/machinery/light,/obj/item/device/radio{pixel_x = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"apW" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"apX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"apY" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/warning_stripes/yellow/hollow,/obj/effect/decal/warning_stripes/northeastcorner,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/security/podbay)
+"apZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/security/podbay)
+"aqa" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/podbay)
+"aqb" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/podbay)
+"aqc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/security/podbay)
+"aqd" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
+"aqe" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/plating/airless,/area/security/podbay)
+"aqf" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_l"},/turf/space,/area/shuttle/trade/sol)
+"aqg" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/trade/sol)
"aqh" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/shuttle/trade/sol)
"aqi" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1450; id_tag = "trade_sol_pump"; req_access_txt = "160"; req_one_access_txt = "0"},/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "trade_sol_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "trade_sol"; pixel_x = 25; req_access_txt = "160"; tag_airpump = "trade_sol_pump"; tag_chamber_sensor = "trade_sol_sensor"; tag_exterior_door = "trade_sol_outer"; tag_interior_door = "trade_sol_inner"},/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
-"aqj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/trade/sol)
+"aqj" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/computer/shuttle/trade/sol,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"aqk" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"aql" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"aqm" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
-"aqn" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/computer/shuttle/trade/sol,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
+"aqn" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
"aqo" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
-"aqp" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
-"aqq" = (/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/structure/table/reinforced,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/range)
+"aqp" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"aqq" = (/obj/machinery/door/airlock/security{name = "Execution Room"; req_access = null; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"aqr" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range)
-"aqs" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/range)
-"aqt" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/range)
-"aqu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range)
-"aqv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/range)
-"aqw" = (/obj/structure/table/reinforced,/obj/machinery/syndicatebomb/training,/obj/machinery/requests_console{department = "Security"; departmentType = 3; name = "Security Requests Console"; pixel_x = 30},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/range)
-"aqx" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/security/medbay)
-"aqy" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
-"aqz" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/camera{c_tag = "Brig Medbay"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
-"aqA" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/light{dir = 1},/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
-"aqB" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/requests_console{department = "Brig Medbay"; departmentType = 3; name = "Brig Medbay Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
-"aqC" = (/obj/effect/landmark{name = "revenantspawn"},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/security/medbay)
-"aqD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door_control{id = "Interrogation"; name = "Interrogation Privacy Shutter"; pixel_x = -28; pixel_y = -3; range = 20; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogation)
-"aqE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogation)
-"aqF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogation)
-"aqG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/security/interrogationhallway)
-"aqH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
-"aqI" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway)
-"aqJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/warden)
-"aqK" = (/obj/machinery/photocopier,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aqL" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Brig Warden's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aqM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aqN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aqO" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/paper/armory,/obj/machinery/requests_console{department = "Warden"; departmentType = 7; name = "Warden's Requests Console"; pixel_x = 30; pixel_y = 30},/obj/item/device/megaphone,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aqP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/seceqstorage)
-"aqQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"aqR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"aqS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Briefing Room West"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"aqT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"aqU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_security,/turf/simulated/floor/plasteel,/area/security/main)
-"aqV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/item/device/megaphone,/turf/simulated/floor/plasteel,/area/security/main)
-"aqW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel,/area/security/main)
-"aqX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"aqY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/main)
-"aqZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/main)
-"ara" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/solar/auxstarboard)
-"arb" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxstarboard)
-"arc" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk14"; icon_state = "catwalk14"},/area/solar/auxstarboard)
-"ard" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk10"; icon_state = "catwalk10"},/area/solar/auxstarboard)
-"are" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/trade/sol)
-"arf" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "trade_sol_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "160"},/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
+"aqs" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aqt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Brig Medical Bay"; req_access_txt = "0"; req_one_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"aqu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Brig Medical Bay"; req_access_txt = "0"; req_one_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"aqv" = (/turf/simulated/wall/r_wall,/area/security/warden)
+"aqw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/security/warden)
+"aqx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/security/warden)
+"aqy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aqz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aqA" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/main)
+"aqB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/main)
+"aqC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/security/main)
+"aqD" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/main)
+"aqE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
+"aqF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
+"aqG" = (/turf/simulated/wall,/area/security/hos)
+"aqH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Head of Security"; req_access_txt = "58"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aqI" = (/turf/simulated/wall/r_wall,/area/security/brig)
+"aqJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"aqK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"aqL" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/lattice,/turf/space,/area/space)
+"aqM" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range)
+"aqN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range)
+"aqO" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Firing Range"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range)
+"aqP" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/range)
+"aqQ" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range)
+"aqR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
+"aqS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/brig)
+"aqT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"aqU" = (/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"aqV" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"aqW" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"aqX" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"aqY" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera{c_tag = "Brig Main Hall West"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"aqZ" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/solar/auxstarboard)
+"ara" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxstarboard)
+"arb" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk14"; icon_state = "catwalk14"},/area/solar/auxstarboard)
+"arc" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk10"; icon_state = "catwalk10"},/area/solar/auxstarboard)
+"ard" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"},/turf/space,/area/shuttle/trade/sol)
+"are" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "trade_sol_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "160"},/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
+"arf" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; req_access_txt = "160"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 11; id = "trade_sol"; name = "sol trade shuttle"; roundstart_move = "trade_sol_base"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "trade_sol_offstation"; lock_shuttle_doors = 1; name = "northwest of Cyberiad"; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"arg" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"},/area/shuttle/trade/sol)
"arh" = (/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
-"ari" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; req_access_txt = "160"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 11; id = "trade_sol"; name = "sol trade shuttle"; roundstart_move = "trade_sol_base"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "trade_sol_offstation"; lock_shuttle_doors = 1; name = "northwest of Cyberiad"; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
-"arj" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
-"ark" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/range)
-"arl" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/range)
-"arm" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
-"arn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/range)
-"aro" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/range)
-"arp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/closet/crate,/obj/item/target/syndicate,/obj/item/target/syndicate,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
-"arq" = (/obj/structure/stool/bed/roller,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/security/medbay)
-"arr" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"ars" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"art" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"aru" = (/obj/structure/disposalpipe/segment,/obj/item/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
-"arv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Interrogation"; name = "Interrogation Privacy Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
-"arw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Interrogation"; name = "Interrogation Privacy Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
-"arx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/interrogation)
-"ary" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/security/interrogationhallway)
-"arz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
-"arA" = (/obj/structure/table/reinforced{tag = "icon-table_vertical"; icon_state = "table_vertical"},/obj/machinery/door/window/brigdoor{dir = 4; name = "Warden's Desk"; req_access_txt = "3"},/obj/machinery/door/window/westright{name = "Reception Door"; req_access = null; req_access_txt = "0"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/security/warden)
-"arB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"arC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"arD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"arE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"arF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"arG" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/machinery/door/window/brigdoor/southleft{dir = 4; req_access_txt = "63"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access_txt = "3"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"arH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage)
-"arI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/recharger/wallcharger{pixel_y = 25},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/recharger/wallcharger{pixel_y = 35},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
-"arJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"arK" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
-"arL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"arM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/structure/sign/goldenplaque{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/seceqstorage)
-"arN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/seceqstorage)
-"arO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"arP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/main)
-"arQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"arR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"arS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"arT" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/main)
-"arU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"arV" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"arW" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/space,/area/shuttle/trade/sol)
-"arX" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "trade_sol"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "160"},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
+"ari" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"arj" = (/obj/machinery/light{dir = 1; on = 1},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"ark" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arl" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"arn" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/camera{c_tag = "Brig Main Hall Center"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"aro" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arp" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"arq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"ars" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"art" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"aru" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arv" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"ary" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"arz" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera{c_tag = "Brig Main Hall East 1"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arA" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arB" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arC" = (/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arD" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arE" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Brig Main Hall East 2"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig)
+"arF" = (/turf/simulated/wall,/area/security/podbay)
+"arG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"arH" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/spacepod_key{id = 100000},/obj/item/device/gps,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"arI" = (/obj/structure/closet/secure_closet/security,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/device/spacepod_equipment/weaponry/laser,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"arJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"arK" = (/obj/machinery/magnetic_module,/obj/structure/target_stake,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
+"arL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
+"arM" = (/obj/effect/decal/warning_stripes/west,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
+"arN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
+"arO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range)
+"arP" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/range)
+"arQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/security/brig)
+"arR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range)
+"arS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"arT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
+"arU" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
+"arV" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_r"},/turf/space,/area/shuttle/trade/sol)
+"arW" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "trade_sol"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "160"},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
+"arX" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport)
"arY" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"arZ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"asa" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
-"asb" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport)
-"asc" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
-"asd" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
-"ase" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/security/range)
-"asf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
-"asg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/range)
-"ash" = (/obj/structure/cable,/obj/machinery/light,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/range)
-"asi" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"asj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Brig Physician"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"ask" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"asl" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"asm" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"asn" = (/obj/item/weapon/storage/box/masks{pixel_x = 6; pixel_y = 2},/obj/item/weapon/storage/box/gloves,/obj/structure/table/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
-"aso" = (/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/camera{c_tag = "Brig Interrogation Observation"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogationhallway)
-"asp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogationhallway)
-"asq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/interrogationhallway)
-"asr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/interrogationhallway)
-"ass" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
-"ast" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway)
-"asu" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"asv" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"asw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"asx" = (/obj/structure/table,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"asy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
-"asz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"asA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"asB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"asC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"asD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/main)
-"asE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/main)
-"asF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
-"asG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
-"asH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{name = "Sorting Office"},/turf/simulated/floor/plasteel,/area/security/main)
-"asI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
-"asJ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
-"asK" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/trade/sol)
-"asL" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/trade/sol)
+"asb" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
+"asc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"ase" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"ash" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"ask" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asl" = (/obj/machinery/door/airlock/security{name = "Execution Room"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/range)
+"asm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"aso" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"ass" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 7},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"ast" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"asE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"asF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"asG" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"asH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"asI" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Security Pod Pilot"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"asJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/trade/sol)
+"asK" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/trade/sol)
+"asL" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
"asM" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/auxport)
-"asN" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
-"asO" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
+"asN" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
+"asO" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
"asP" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/auxport)
-"asQ" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
-"asR" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
-"asS" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/auxport)
-"asT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/siberia)
+"asQ" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
+"asR" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/auxport)
+"asS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/siberia)
+"asT" = (/obj/structure/grille,/obj/structure/window/full/shuttle{dir = 10; icon_state = "9"},/turf/simulated/floor/plating,/area/shuttle/siberia)
"asU" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "window4"},/turf/simulated/floor/plating,/area/shuttle/siberia)
-"asV" = (/obj/structure/grille,/obj/structure/window/full/shuttle{dir = 10; icon_state = "9"},/turf/simulated/floor/plating,/area/shuttle/siberia)
+"asV" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/siberia)
"asW" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "window8"},/turf/simulated/floor/plating,/area/shuttle/siberia)
-"asX" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/siberia)
-"asY" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range)
-"asZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/range)
-"ata" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range)
-"atb" = (/obj/structure/closet/secure_closet/brigdoc,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/security/medbay)
-"atc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"atd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"ate" = (/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
-"atf" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
-"atg" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/security/medbay)
-"ath" = (/obj/machinery/light/small{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogationhallway)
-"ati" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogationhallway)
-"atj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogationhallway)
-"atk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Hallway"; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogationhallway)
-"atl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogationhallway)
-"atm" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogationhallway)
-"atn" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"ato" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/crowbar,/obj/item/device/radio,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"atp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{desc = "A remote control-switch to lock down the prison wing's blast doors"; id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = -28; pixel_y = 7; range = 20; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -28; pixel_y = -3; range = 20; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"atq" = (/obj/machinery/computer/prisoner,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"atr" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light_switch{pixel_x = 27; pixel_y = -8},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"ats" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/vending/wallmed1{dir = 2; name = "Emergency NanoMed"; pixel_x = -27; pixel_y = 0; req_access_txt = "0"},/obj/machinery/camera{c_tag = "Brig Security Equipment South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage)
-"att" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"atu" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/spray/pepper{pixel_x = -2; pixel_y = -2},/obj/item/weapon/reagent_containers/spray/pepper{pixel_x = -4; pixel_y = -4},/obj/item/weapon/reagent_containers/spray/pepper{pixel_y = -4},/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
-"atv" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/rack,/obj/item/device/flash,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
-"atw" = (/obj/machinery/light,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/obj/structure/rack,/obj/item/weapon/restraints/handcuffs{pixel_y = -4},/obj/item/weapon/restraints/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
-"atx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/vending/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage)
-"aty" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/seceqstorage)
-"atz" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
-"atA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 7},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"atB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"atC" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/obj/structure/reagent_dispensers/peppertank{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"atD" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/closet/redcorp,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"atE" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/wardrobe/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
-"atF" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
+"asX" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/range)
+"asY" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/range)
+"asZ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/range)
+"ata" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plating,/area/security/range)
+"atb" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/range)
+"atc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/brig)
+"atd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/brig)
+"ate" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig)
+"atf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
+"atg" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"ath" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"ati" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
+"atl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"ato" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/brig)
+"atp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
+"atq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"atr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/brig)
+"ats" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/brig)
+"att" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
+"atu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/obj/machinery/newscaster/security_unit{pixel_y = -30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
+"aty" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
+"atA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"atE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atF" = (/obj/structure/cable,/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport)
"atG" = (/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
-"atH" = (/obj/structure/cable,/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport)
-"atI" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
-"atJ" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/siberia)
+"atH" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
+"atI" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/siberia)
+"atJ" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
"atK" = (/obj/machinery/computer/shuttle/labor,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
"atL" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
-"atM" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
-"atN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/prisonershuttle)
-"atO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"atM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"atN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"atO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"atP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/prisonershuttle)
-"atQ" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/prisonershuttle)
-"atR" = (/obj/machinery/computer/prisoner{req_access = null; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"atS" = (/obj/machinery/computer/shuttle/labor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"atT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Brig Labor Camp Airlock North"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"atU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"atV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"atW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"atX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"atY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/prisonershuttle)
-"atZ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Brig Medical Bay"; req_access_txt = "0"; req_one_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"aua" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Brig Medical Bay"; req_access_txt = "0"; req_one_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"aub" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/security/medbay)
+"atQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
+"atS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/detectives_office)
+"atT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Detective"; req_access_txt = "4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"atU" = (/obj/structure/table/reinforced,/obj/item/device/flashlight,/obj/item/device/radio{pixel_y = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"atV" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"atW" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"atX" = (/obj/machinery/light,/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"atY" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/item/clothing/glasses/sunglasses,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel,/area/security/range)
+"atZ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/security/range)
+"aua" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/range)
+"aub" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Processing"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
"auc" = (/turf/simulated/wall,/area/security/brig)
-"aud" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/brig)
-"aue" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Hallway"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/interrogationhallway)
-"auf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Hallway"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/interrogationhallway)
-"aug" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/warden)
-"auh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"aui" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
-"auj" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"auk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
-"aul" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/security/main)
-"aum" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
-"aun" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
-"auo" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/turf/simulated/wall,/area/security/main)
-"aup" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"auq" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Security Pod"; dir = 2; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aur" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_3)
-"aus" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/pod_3)
-"aut" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_3)
-"auu" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
+"aud" = (/turf/simulated/wall,/area/security/prisonershuttle)
+"aue" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Courtroom Prosecution and Defense"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/courtroomdandp)
+"auf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Courtroom Prosecution and Defense"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/courtroomdandp)
+"aug" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/prison/cell_block/A)
+"auh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/prison/cell_block/A)
+"aui" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"auj" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/lobby)
+"auk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/lobby)
+"aul" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"aum" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/lobby)
+"aun" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/lobby)
+"auo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"aup" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Security Pod"; dir = 2; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"auq" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/pod_3)
+"aur" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_3)
+"aus" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_3)
+"aut" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
+"auu" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30; pixel_y = 30},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
"auv" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/shuttle/siberia)
"auw" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
"aux" = (/obj/machinery/flasher_button{id = "gulagshuttleflasher"; name = "Flash Control"; pixel_x = 0; pixel_y = -26; req_access_txt = "1"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
-"auy" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30; pixel_y = 30},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
+"auy" = (/obj/machinery/door/airlock/external{id_tag = "laborcamp_home"; name = "Labor Camp Airlock"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
"auz" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
-"auA" = (/obj/machinery/door/airlock/external{id_tag = "laborcamp_home"; name = "Labor Camp Airlock"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"auA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
"auB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/security/prisonershuttle)
"auC" = (/turf/simulated/floor/plating,/area/security/prisonershuttle)
"auD" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"auK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
-"auL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"auO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"auP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/newscaster{pixel_y = 30},/obj/machinery/camera{c_tag = "Brig Main Hall 2"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"auX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/brig)
-"auY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
-"auZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "Brig Main Hall 1"; dir = 2; network = list("SS13")},/obj/machinery/hologram/holopad,/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"ava" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
-"avd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"ave" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
-"avi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avk" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"avm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"avn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/brig)
-"avo" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/brig)
-"avp" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "63"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"auE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/processing)
+"auF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Prisoner Processing"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
+"auG" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"auH" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"auI" = (/obj/structure/closet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"auJ" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auK" = (/obj/machinery/computer/med_data,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Brig Detective's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auL" = (/obj/machinery/computer/secure_data,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auO" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/item/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auP" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/weapon/book/manual/security_space_law,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auQ" = (/obj/machinery/photocopier,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auR" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/range)
+"auS" = (/obj/structure/table/reinforced,/obj/machinery/syndicatebomb/training,/turf/simulated/floor/plasteel,/area/security/range)
+"auT" = (/obj/structure/table/reinforced,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/security/range)
+"auU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"auV" = (/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"auW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/courtroomdandp)
+"auX" = (/obj/machinery/camera{c_tag = "Brig Security Courtroom Hall"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/courtroomdandp)
+"auY" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"auZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"ava" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_1{dir = 4; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"avb" = (/obj/structure/closet/secure_closet/brig{id = "Cell 1"; name = "Cell 1 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 1"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"avc" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison/cell_block/A)
+"avd" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"ave" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"avf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
+"avg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"avh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "darkred"},/area/security/brig)
+"avi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkred"},/area/security/brig)
+"avj" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"avk" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"avl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"avm" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/prison/cell_block/B)
+"avn" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"avo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_4{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"avp" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
"avq" = (/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"avr" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"avr" = (/obj/structure/table,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "Camera"; pictures_left = 30; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/processing)
"avs" = (/obj/machinery/door/airlock/external{name = "Escape Pod"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"avt" = (/obj/docking_port/mobile/pod{dir = 4; id = "pod3"; name = "escape pod 3"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
-"avu" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
-"avv" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
+"avu" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
+"avv" = (/obj/machinery/door/airlock/external{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia)
"avw" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/pod_3)
-"avx" = (/obj/machinery/door/airlock/external{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia)
+"avx" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia)
"avy" = (/turf/simulated/shuttle/wall,/area/shuttle/siberia)
-"avz" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia)
-"avA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"avB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"avC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"avD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"avE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
-"avF" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"avG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"avH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"avI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/brig)
-"avL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"avM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/brig)
-"avR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"avS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
-"avW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel,/area/security/brig)
-"avX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"avZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"awa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"awb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"awc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"awd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"awe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"awf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"awg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
-"awh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"awi" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/brig)
-"awj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/security/brig)
-"awk" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"avz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Processing Shutter"; name = "Processing Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/processing)
+"avA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/security/processing)
+"avB" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/processing)
+"avC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"avD" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/processing)
+"avE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/evidence)
+"avF" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"avG" = (/obj/structure/table/woodentable,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"avH" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"avI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/security/detectives_office)
+"avJ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Detective"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"avK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"avL" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/requests_console{name = "Detective Requests Console"; pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"avM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"avN" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"avO" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/courtroomdandp)
+"avP" = (/obj/machinery/light{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"avQ" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/A)
+"avR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/A)
+"avS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"avT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"avU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"avV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"avW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
+"avX" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/brig)
+"avY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"avZ" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkred"},/area/security/brig)
+"awa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"awb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"awc" = (/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"awd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"awe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"awf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"awg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Processing Shutter"; name = "Processing Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/processing)
+"awh" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/processing)
+"awi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"awj" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"awk" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_3)
"awl" = (/turf/simulated/wall,/area/maintenance/fsmaint)
-"awm" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_3)
-"awn" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_3)
-"awo" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "security_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/space)
-"awp" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
+"awm" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_3)
+"awn" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"awo" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
+"awp" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/shuttle/syndicate_elite)
"awq" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/shuttle/syndicate_elite)
-"awr" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/shuttle/syndicate_elite)
+"awr" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
"aws" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/turf/space,/area/shuttle/syndicate_elite)
-"awt" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
-"awu" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
+"awt" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
+"awu" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/shuttle/syndicate_sit)
"awv" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/shuttle/syndicate_sit)
-"aww" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/shuttle/syndicate_sit)
+"aww" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
"awx" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/turf/space,/area/shuttle/syndicate_sit)
-"awy" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
+"awy" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"awz" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"awA" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
+"awA" = (/obj/structure/closet,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
"awB" = (/turf/simulated/wall/r_wall,/area/security/prisonershuttle)
-"awC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Processing"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
-"awD" = (/turf/simulated/wall,/area/security/courtroomdandp)
-"awE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/courtroomdandp)
-"awF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/courtroomdandp)
-"awG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Courtroom Prosecution and Defense"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"awC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/evidence)
+"awD" = (/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"awE" = (/obj/machinery/door/window/brigdoor/southleft{dir = 2; icon_state = "rightsecure"; req_access_txt = "63"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"awF" = (/obj/structure/closet/secure_closet/detective,/obj/item/weapon/storage/secure/safe{pixel_x = -23},/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"awG" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"awH" = (/turf/simulated/wall,/area/security/prison/cell_block/B)
-"awI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"awJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"awI" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"awJ" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/carpet,/area/security/detectives_office)
"awK" = (/turf/simulated/wall,/area/security/prison/cell_block/A)
-"awL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/prison/cell_block/A)
-"awM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"awN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"awO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/lobby)
-"awP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
-"awQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/security/lobby)
-"awR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/security/lobby)
-"awS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/lobby)
-"awT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = null; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
-"awU" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/lobby)
+"awL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"awM" = (/obj/machinery/computer/security/wooden_tv{network = list("SS13","Research Outpost","Mining Outpost")},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"awN" = (/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"awO" = (/obj/structure/closet/emcloset,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"awP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"awQ" = (/obj/machinery/camera{c_tag = "Brig Labor Camp Airlock North"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"awR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"awS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"awT" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkred"},/area/security/courtroomdandp)
+"awU" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
"awV" = (/turf/simulated/wall,/area/security/processing)
-"awW" = (/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/processing)
+"awW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"awX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Prisoner Processing"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
-"awY" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Prisoner Processing"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
-"awZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/detectives_office)
-"axa" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/detectives_office)
-"axb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/detectives_office)
-"axc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Detective"; req_access_txt = "4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/detectives_office)
-"axd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/detectives_office)
+"awY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"awZ" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"axa" = (/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/treadmill_monitor{id = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison/cell_block/A)
+"axb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/brig)
+"axc" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28; pixel_y = -28},/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = -28},/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigEast"; name = "Brig Foyer East Doors"; normaldoorcontrol = 1; pixel_x = 5; pixel_y = -35; range = 10; req_access_txt = "63"},/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigWest"; name = "Brig Foyer West Doors"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = -35; range = 10; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/brig)
+"axd" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkred"},/area/security/brig)
"axe" = (/turf/simulated/wall,/area/security/detectives_office)
-"axf" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/security/detectives_office)
-"axg" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
+"axf" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkred"},/area/security/brig)
+"axg" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 4"; pixel_x = 0; pixel_y = -28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
"axh" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"axi" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "security_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"axj" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate_elite)
-"axk" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_elite)
-"axl" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate_sit)
-"axm" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_sit)
+"axi" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate_elite)
+"axj" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_elite)
+"axk" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate_sit)
+"axl" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_sit)
+"axm" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"axn" = (/obj/structure/lattice,/obj/item/stack/cable_coil,/turf/space,/area/space)
"axo" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"axp" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"axq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
-"axr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/flag/nt,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp)
-"axs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
-"axt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"axp" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"axq" = (/obj/machinery/power/treadmill{dir = 4},/obj/machinery/treadmill_monitor{id = "Cell 4"; pixel_y = -32},/obj/structure/cable/yellow,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
+"axr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"axs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"axt" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel,/area/security/processing)
"axu" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
-"axv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/courtroomdandp)
-"axw" = (/obj/structure/closet/secure_closet/brig{id = "Cell 6"; name = "Cell 6 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
-"axx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"axy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"axz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/door_timer/cell_3{dir = 8; id = "Cell 6"; layer = 4; name = "Cell 6"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"axA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"axB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"axC" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"; name = "Cell 3 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
-"axD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"axE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"axF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/door_timer/cell_3{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"axG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_1{dir = 4; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"axH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"axI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"axJ" = (/obj/structure/closet/secure_closet/brig{id = "Cell 1"; name = "Cell 1 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 1"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"axK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"axv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "Processing Shutter"; name = "Processing Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/processing)
+"axw" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"axx" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/security/processing)
+"axy" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/processing)
+"axz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/processing)
+"axA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"axB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"axC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"axD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"axE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"axF" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"axG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"axH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/detectives_office)
+"axI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/detectives_office)
+"axJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"axK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
"axL" = (/turf/simulated/floor/plasteel,/area/security/lobby)
-"axM" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"axN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/lobby)
-"axO" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"axP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/security/lobby)
-"axQ" = (/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{pixel_x = 28; pixel_y = -10},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"axR" = (/obj/machinery/light_switch{pixel_x = -25},/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing)
-"axS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/processing)
-"axT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/processing)
-"axU" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
-"axV" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Brig Detective's Office"; dir = 2; network = list("SS13")},/obj/structure/bookcase,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"axW" = (/obj/structure/closet/secure_closet/detective,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"axX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"axY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"axZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aya" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"axM" = (/obj/machinery/computer/prisoner{req_access = null; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"axN" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"axO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Courtroom Prosecution and Defense"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/courtroomdandp)
+"axP" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"axQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"axR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"axS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"axT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"axU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"axV" = (/obj/structure/table/reinforced{layer = 2.5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door/window/brigdoor{dir = 2; name = "Security Checkpoint"; req_access_txt = "1"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
+"axW" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"axX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"axY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig)
+"axZ" = (/obj/machinery/light_switch{pixel_x = 25},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aya" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
"ayb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"ayc" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"ayd" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aye" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"ayf" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"ayg" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/portables_connector{layer = 2},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"ayh" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "security_airlock"; pixel_x = -25; req_access_txt = "13"; tag_airpump = "security_pump"; tag_chamber_sensor = "security_sensor"; tag_exterior_door = "security_outer"; tag_interior_door = "security_inner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"ayi" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"aye" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"ayf" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera{c_tag = "Brig Cell Block B"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"ayg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"ayh" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Labor Shuttle Airlock"; req_access_txt = "0"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; rebuildable = 1; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
+"ayi" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space)
"ayj" = (/obj/effect/landmark{name = "Syndicate-Commando-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
"ayk" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"ayl" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"aym" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"ayn" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Labor Shuttle Airlock"; req_access_txt = "0"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; rebuildable = 1; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
+"ayn" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Prisoner Processing West"; dir = 4; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/machinery/door_control{id = "Processing Shutter"; name = "Processing Shutter Privacy"; pixel_x = -28; pixel_y = -8; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/processing)
"ayo" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/security/prisonershuttle)
-"ayp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"ayq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/courtroomdandp)
-"ayr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
-"ays" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
-"ayt" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
-"ayu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/courtroomdandp)
-"ayv" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
-"ayw" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"ayx" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 6"; name = "Cell 6"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"ayy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"ayz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"ayA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"ayB" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
-"ayC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"ayD" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 3"; name = "Cell 3"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"ayE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"ayF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"ayG" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"ayH" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"ayI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"ayJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"ayK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/lobby)
-"ayL" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby)
-"ayM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/office/dark,/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = -35; range = 10; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
-"ayN" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/lobby)
-"ayO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/processing)
-"ayP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/security/processing)
-"ayQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
-"ayR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/processing)
-"ayS" = (/obj/machinery/camera{c_tag = "Brig Prisoner Processing"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/processing)
-"ayT" = (/obj/item/weapon/storage/secure/safe{pixel_x = -23},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"ayU" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/security/detectives_office)
+"ayp" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"ayq" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/processing)
+"ayr" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Brig Prisoner Processing East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel,/area/security/processing)
+"ays" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/processing)
+"ayt" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"ayu" = (/obj/structure/closet,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"ayv" = (/obj/structure/table,/obj/machinery/light_switch{pixel_y = -25},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"ayw" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"ayx" = (/obj/structure/closet,/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"ayy" = (/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/hand_labeler,/obj/item/weapon/storage/box/evidence,/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -28; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"ayz" = (/obj/structure/bookcase,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"ayA" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{pixel_x = 0; pixel_y = -30},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"ayB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"ayC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"ayD" = (/obj/machinery/computer/secure_data,/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"ayE" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"ayF" = (/obj/item/flag/nt,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp)
+"ayG" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
+"ayH" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/courtroomdandp)
+"ayI" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/courtroomdandp)
+"ayJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_2{dir = 4; layer = 4; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"ayK" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"ayL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"ayM" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/lobby)
+"ayN" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/lobby)
+"ayO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"ayP" = (/obj/structure/closet/secure_closet/brig{id = "Cell 5"; name = "Cell 5 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 5"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"ayQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_5{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"ayR" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"ayS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"ayT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/processing)
+"ayU" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/security/processing)
"ayV" = (/turf/simulated/floor/carpet,/area/security/detectives_office)
-"ayW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"ayX" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{name = "Detective Requests Console"; pixel_x = 30},/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"ayY" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"ayZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "security_airlock"; name = "interior access button"; pixel_x = 20; pixel_y = 20; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aza" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "security_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"azb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "security_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "security_sensor"; pixel_x = 22; pixel_y = 25},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"azc" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk13"; icon_state = "catwalk13"},/area/solar/auxstarboard)
-"azd" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/solar/auxstarboard)
-"aze" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk13"; icon_state = "catwalk13"},/area/solar/auxstarboard)
-"azf" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
+"ayW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"ayX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"ayY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"ayZ" = (/obj/machinery/computer/shuttle/labor,/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"aza" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/courtroomdandp)
+"azb" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk13"; icon_state = "catwalk13"},/area/solar/auxstarboard)
+"azc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"azd" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"aze" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
+"azf" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"azg" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
"azh" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
-"azi" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
+"azi" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Cell Door"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"azj" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
-"azk" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Cell Door"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
-"azl" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plating/airless,/area/shuttle/siberia)
-"azm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/security/prisonershuttle)
-"azn" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/prisonershuttle)
-"azo" = (/turf/simulated/wall/r_wall,/area/security/courtroomdandp)
-"azp" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/courtroomdandp)
-"azq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/courtroomdandp)
-"azr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"azk" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plating/airless,/area/shuttle/siberia)
+"azl" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/courtroomdandp)
+"azm" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"azn" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/courtroomdandp)
+"azo" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Brig Cell Block A"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"azp" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/A)
+"azq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/A)
+"azr" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/courtroomdandp)
"azs" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/courtroomdandp)
-"azt" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/courtroomdandp)
-"azu" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 6"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
-"azv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 6"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"azw" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"azx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"azy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"azz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"azA" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 3"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
-"azB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"azC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"azD" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"azE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"azF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"azG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"azH" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"azI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"azJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/security/lobby)
-"azK" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/security/lobby)
-"azL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/security/lobby)
-"azM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/security/processing)
-"azN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/processing)
-"azO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
-"azP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
-"azQ" = (/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/security/processing)
-"azR" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 1},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"azS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"azT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"azU" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{pixel_x = 30; pixel_y = 0},/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"azV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"azW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"azX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"azY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"azZ" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAa" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/solar/auxstarboard)
-"aAc" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk7"; icon_state = "catwalk7"},/area/solar/auxstarboard)
-"aAd" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxstarboard)
-"aAe" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk11"; icon_state = "catwalk11"},/area/solar/auxstarboard)
+"azt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"azu" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/camera{c_tag = "Brig Lobby West"; dir = 4; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"azv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"azw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/lobby)
+"azx" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"azy" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/lobby)
+"azz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"azA" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"azB" = (/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 5"; name = "Cell 5"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"azC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"azD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"azE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"azF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Prisoner Processing"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
+"azG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/processing)
+"azH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"azI" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/processing)
+"azJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"azK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azL" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azM" = (/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "bar_maint"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azQ" = (/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "bar_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "bar_maint"; pixel_x = 0; pixel_y = -25; req_access_txt = "13"; tag_airpump = "bar_pump"; tag_chamber_sensor = "bar_sensor"; tag_exterior_door = "bar_maint_outer"; tag_interior_door = "bar_maint_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1450; id_tag = "bar_pump"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azR" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azS" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "bar_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"azT" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"azU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/solar/auxstarboard)
+"azV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"azW" = (/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"azX" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/courtroomdandp)
+"azY" = (/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"azZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"aAa" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"aAb" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk7"; icon_state = "catwalk7"},/area/solar/auxstarboard)
+"aAc" = (/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/treadmill_monitor{id = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison/cell_block/A)
+"aAd" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"aAe" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/siberia)
"aAf" = (/turf/simulated/wall,/area/maintenance/abandonedbar)
"aAg" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aAh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
"aAi" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
-"aAj" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/siberia)
+"aAj" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/siberia)
"aAk" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/siberia)
-"aAl" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/siberia)
+"aAl" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
"aAm" = (/turf/simulated/wall/r_wall,/area/crew_quarters/courtroom)
"aAn" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
-"aAo" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
+"aAo" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"aAp" = (/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aAq" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aAr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/prison/cell_block/B)
-"aAs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aAt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aAu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/prison/cell_block/A)
-"aAv" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aAw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
+"aAq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aAr" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"aAs" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aAt" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/camera{c_tag = "Brig Lobby East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aAu" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 5"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"aAv" = (/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/treadmill_monitor{id = "Cell 5"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/prison/cell_block/B)
+"aAw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
"aAx" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"aAy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/flag/nt,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"aAz" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/lobby)
-"aAA" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aAy" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/processing)
+"aAz" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aAA" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel,/area/security/processing)
"aAB" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
-"aAC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
-"aAD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/lobby)
-"aAE" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/lobby)
+"aAC" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/processing)
+"aAD" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/processing)
+"aAE" = (/obj/structure/table,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/processing)
"aAF" = (/turf/simulated/floor/plasteel,/area/security/processing)
-"aAG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/processing)
-"aAH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
-"aAI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/security/processing)
-"aAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/processing)
-"aAK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/computer/security/wooden_tv{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Detective"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/security/detectives_office)
-"aAM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table/woodentable,/obj/item/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"aAN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"aAO" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_x = 0; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aAP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aAG" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/processing)
+"aAH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/processing)
+"aAI" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aAK" = (/obj/machinery/atmospherics/binary/valve/open{tag = "icon-map_valve1 (EAST)"; icon_state = "map_valve1"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aAL" = (/turf/space,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/solar/auxstarboard)
+"aAM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"aAN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aAO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"aAP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
"aAQ" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAR" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aAR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"aAS" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAT" = (/obj/structure/table,/obj/item/ashtray/plastic,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAU" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/stool,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAV" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAW" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
-"aAX" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/maintenance/fsmaint)
-"aAY" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/maintenance/fsmaint)
-"aAZ" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk5"; icon_state = "catwalk5"},/area/solar/auxstarboard)
-"aBa" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/solar/auxstarboard)
-"aBb" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk5"; icon_state = "catwalk5"},/area/solar/auxstarboard)
-"aBc" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk14"; icon_state = "catwalk14"},/area/solar/auxstarboard)
+"aAT" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/light{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"aAU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aAV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aAW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"aAX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aAY" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk5"; icon_state = "catwalk5"},/area/solar/auxstarboard)
+"aAZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aBa" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aBb" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aBc" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aBd" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aBe" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
-"aBf" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aBe" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aBf" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aBg" = (/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aBh" = (/obj/item/stack/tile/wood,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aBi" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
+"aBi" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
"aBj" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aBk" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"aBl" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"aBm" = (/obj/item/stack/rods,/turf/space,/area/space)
"aBn" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/courtroom)
-"aBo" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aBp" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aBo" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/door/window/westright{dir = 1; name = "Judge Committee"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"aBp" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
"aBq" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
-"aBr" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/door/window/westright{dir = 1; name = "Judge Committee"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
-"aBs" = (/obj/structure/closet/secure_closet/brig{id = "Cell 5"; name = "Cell 5 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 5"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
-"aBt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"aBu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"aBv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_timer/cell_5{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aBw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aBx" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 4"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
-"aBy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"aBz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aBA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_timer/cell_4{dir = 8; layer = 4; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"aBB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door_timer/cell_2{dir = 4; layer = 4; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aBC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aBD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aBE" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"aBF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"aBG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aBr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"aBs" = (/turf/simulated/wall,/area/security/interrogation)
+"aBt" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/processing)
+"aBu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "63"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aBv" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall,/area/maintenance/fsmaint)
+"aBw" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aBx" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk14"; icon_state = "catwalk14"},/area/solar/auxstarboard)
+"aBy" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/solar/auxstarboard)
+"aBz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"aBA" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"aBB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle)
+"aBC" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aBD" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aBE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"aBF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_3{dir = 4; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"aBG" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"; name = "Cell 3 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 3"; dir = 2; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
"aBH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/lobby)
-"aBI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/lobby)
-"aBJ" = (/obj/machinery/camera{c_tag = "Brig Lobby"; dir = 8; pixel_x = 0; pixel_y = -22; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"aBK" = (/obj/structure/stool/bed/chair,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/processing)
-"aBL" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
-"aBM" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/processing)
-"aBN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aBO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"aBP" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/sunglasses,/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aBQ" = (/obj/effect/decal/cleanable/generic,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aBI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/lobby)
+"aBJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"aBK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aBL" = (/obj/structure/closet/secure_closet/brig{id = "Cell 6"; name = "Cell 6 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 6"; dir = 2; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"aBM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"aBN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door_timer/cell_3{dir = 8; id = "Cell 6"; layer = 4; name = "Cell 6"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"aBO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aBP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Observation"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aBQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aBR" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access_txt = "12;24"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aBS" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fsmaint)
-"aBT" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Gas pump"; on = 0},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/fsmaint)
-"aBU" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"aBV" = (/obj/machinery/light_construct/small{dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
-"aBW" = (/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aBS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aBT" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
+"aBU" = (/obj/machinery/light_construct/small{dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aBV" = (/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aBW" = (/obj/structure/sink/kitchen{pixel_y = 25},/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
"aBX" = (/obj/item/trash/liquidfood,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
-"aBY" = (/obj/structure/sink/kitchen{pixel_y = 25},/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
-"aBZ" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
-"aCa" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
-"aCb" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
-"aCc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aBY" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
+"aBZ" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
+"aCa" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
+"aCb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/camera{c_tag = "Courtroom Judge Committee"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"aCc" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aCd" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/device/megaphone,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
-"aCe" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/camera{c_tag = "Courtroom Judge Committee"; dir = 8; network = list("Toxins","Research","SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
-"aCf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aCg" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 5"; name = "Cell 5"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aCh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"aCi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aCj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aCk" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
-"aCl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aCm" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aCn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aCo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aCp" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aCq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"aCr" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"aCs" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aCt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"aCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/lobby)
-"aCv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/security/lobby)
-"aCw" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"aCx" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel,/area/security/processing)
+"aCe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCh" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCl" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 3"; name = "Cell 3"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/A)
+"aCm" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/A)
+"aCn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"aCo" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"aCp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aCq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aCr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"aCs" = (/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 6"; name = "Cell 6"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"aCt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"aCu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"aCv" = (/obj/structure/stool/bed/chair,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Interrogation Observation"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aCw" = (/obj/structure/stool/bed/chair,/obj/machinery/light_switch{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aCx" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aCy" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing)
-"aCz" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/evidence)
-"aCA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/evidence)
-"aCB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/evidence)
-"aCC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/window{dir = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aCD" = (/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aCE" = (/obj/structure/table/woodentable,/obj/item/device/flash,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aCF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aCG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aCH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aCI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aCJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
-"aCK" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/maintenance/fsmaint)
-"aCL" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/maintenance/fsmaint)
-"aCM" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/auxstarboard)
+"aCz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aCD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCE" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCF" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCG" = (/obj/machinery/door/window/westright{dir = 8; icon_state = "left"; name = "Witness Stand"},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
+"aCH" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"aCI" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/A)
+"aCJ" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 3"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison/cell_block/A)
+"aCK" = (/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/treadmill_monitor{id = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison/cell_block/A)
+"aCL" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/auxstarboard)
+"aCM" = (/obj/item/weapon/shard,/obj/item/stack/rods,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating{dir = 9; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
"aCN" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/abandonedbar)
"aCO" = (/obj/machinery/vending/autodrobe,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aCP" = (/turf/simulated/wall/rust,/area/maintenance/abandonedbar)
-"aCQ" = (/obj/item/weapon/shard,/obj/item/stack/rods,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating{dir = 9; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
+"aCQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{dir = 5; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
"aCR" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "escape"},/area/maintenance/abandonedbar)
-"aCS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{dir = 5; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
-"aCT" = (/obj/item/weapon/lighter/random,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aCS" = (/obj/item/weapon/lighter/random,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aCT" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
"aCU" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aCV" = (/obj/structure/table/woodentable,/obj/item/trash/plate,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aCW" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aCX" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
-"aCY" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0; req_access_txt = "150"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "sst"; name = "SST shuttle"; roundstart_move = "sst_away"; width = 11},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sst_home"; name = "northwest of station"; width = 11},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
-"aCZ" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
-"aDa" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_sit_1"; name = "Side Hull Door"; opacity = 0; req_access_txt = "150"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "sit"; name = "SIT shuttle"; roundstart_move = "sit_away"; width = 11},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sit_arrivals"; name = "Cyberiad Arrivals"; width = 11},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
+"aCX" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0; req_access_txt = "150"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "sst"; name = "SST shuttle"; roundstart_move = "sst_away"; width = 11},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sst_home"; name = "northwest of station"; width = 11},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
+"aCY" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
+"aCZ" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_sit_1"; name = "Side Hull Door"; opacity = 0; req_access_txt = "150"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "sit"; name = "SIT shuttle"; roundstart_move = "sit_away"; width = 11},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sit_arrivals"; name = "Cyberiad Arrivals"; width = 11},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
+"aDa" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aDb" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aDc" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aDc" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/camera{c_tag = "Courtroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
"aDd" = (/obj/machinery/light_switch{pixel_y = -24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aDe" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/camera{c_tag = "Courtroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aDf" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aDg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aDh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/window/westright{dir = 8; icon_state = "left"; name = "Witness Stand"},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aDi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/courtroom)
-"aDj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
-"aDk" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
-"aDl" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 5"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
-"aDm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 5"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
-"aDn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"aDo" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aDp" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 4"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
-"aDq" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 4"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"aDr" = (/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aDs" = (/obj/item/device/radio/intercom{pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"aDt" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aDu" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"aDv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby)
-"aDw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
-"aDx" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
-"aDy" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
-"aDz" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
-"aDA" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/light_switch{pixel_x = 26},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/lobby)
-"aDB" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel,/area/security/processing)
-"aDC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/security/processing)
-"aDD" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
-"aDE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/evidence)
-"aDF" = (/obj/effect/decal/cleanable/cobweb{dir = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aDG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aDH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aDI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"aDJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"aDK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aDL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aDM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/crew_quarters/mrchangs)
+"aDe" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
+"aDf" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/security/lobby)
+"aDg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"aDi" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"aDj" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"aDk" = (/obj/machinery/vending/coffee,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aDl" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 6"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
+"aDm" = (/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/treadmill_monitor{id = "Cell 6"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/prison/cell_block/B)
+"aDn" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"aDo" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
+"aDp" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "Interrogation"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
+"aDq" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "Interrogation"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
+"aDr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "Interrogation"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
+"aDs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aDt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"aDu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"aDv" = (/turf/simulated/wall,/area/security/lobby)
+"aDw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = null; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aDx" = (/turf/simulated/wall/r_wall,/area/security/interrogation)
+"aDy" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/door_control{id = "Interrogation"; name = "Interrogation Privacy Shutter"; pixel_x = -28; pixel_y = -3; range = 20; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aDz" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aDA" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aDB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aDC" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDI" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDJ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aDL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aDM" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
"aDN" = (/turf/simulated/wall,/area/crew_quarters/mrchangs)
-"aDO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/civilian/barber)
+"aDO" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aDP" = (/turf/simulated/wall,/area/civilian/barber)
-"aDQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/civilian/barber)
+"aDQ" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aDR" = (/turf/simulated/wall/r_wall,/area/civilian/barber)
"aDS" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aDT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aDT" = (/obj/item/trash/cheesie,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 5},/area/maintenance/abandonedbar)
"aDU" = (/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/plating{dir = 4; icon_regular_floor = "whitecorner"},/area/maintenance/abandonedbar)
-"aDV" = (/obj/item/trash/cheesie,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 5},/area/maintenance/abandonedbar)
+"aDV" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/maintenance/abandonedbar)
"aDW" = (/obj/structure/door_assembly,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aDX" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/maintenance/abandonedbar)
+"aDX" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating{dir = 4; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
"aDY" = (/obj/item/stack/tile/plasteel,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aDZ" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating{dir = 4; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
-"aEa" = (/obj/structure/stool,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
-"aEb" = (/obj/structure/table/woodentable,/obj/item/trash/can,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aDZ" = (/obj/structure/stool,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aEa" = (/obj/structure/table/woodentable,/obj/item/trash/can,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aEb" = (/obj/machinery/computer/pod{id_tags = list("syndicate_elite"); name = "Hull Door Control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
"aEc" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aEd" = (/obj/machinery/computer/pod{id_tags = list("syndicate_elite"); name = "Hull Door Control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
+"aEd" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aEe" = (/obj/machinery/computer/shuttle/sst,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite)
"aEf" = (/obj/structure/table,/obj/item/stack/sheet/metal,/obj/item/clothing/glasses/welding,/obj/item/weapon/weldingtool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"aEg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "solar_tool_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_tool_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_tool_pump"; tag_exterior_door = "solar_tool_outer"; frequency = 1379; id_tag = "solar_tool_airlock"; tag_interior_door = "solar_tool_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_tool_sensor"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aEh" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aEh" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aEi" = (/turf/simulated/wall/r_wall,/area/hallway/primary/fore)
"aEj" = (/turf/simulated/wall,/area/hallway/primary/fore)
-"aEk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/clownoffice)
+"aEk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aEl" = (/turf/simulated/wall,/area/crew_quarters/courtroom)
-"aEm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/courtroom)
-"aEn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/courtroom)
-"aEo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"aEm" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aEn" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aEo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aEp" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
-"aEq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
-"aEr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"aEs" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"aEt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"aEu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"aEv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aEw" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aEx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"aEy" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/lobby)
-"aEz" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby)
-"aEA" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby)
-"aEB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor,/area/security/lobby)
-"aEC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/security/lobby)
-"aED" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aEE" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aEF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/evidence)
-"aEG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aEH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aEI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/hand_labeler,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aEJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office)
-"aEK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aEq" = (/obj/effect/landmark/start{name = "Barber"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aEr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aEB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby)
+"aEC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aED" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/mob/living/simple_animal/bot/secbot/beepsky{name = "Officer Beepsky"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEF" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aEG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aEH" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aEI" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aEJ" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aEK" = (/obj/machinery/camera{c_tag = "Mr. Chang's"; dir = 2; network = list("SS13")},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aEL" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aEM" = (/obj/machinery/vending/chinese,/obj/machinery/light{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aEN" = (/obj/machinery/camera{c_tag = "Mr. Chang's"; dir = 2; network = list("SS13")},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aEO" = (/obj/machinery/camera{c_tag = "Barber Shop"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/dye_generator,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aEP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aEQ" = (/obj/structure/stool/bed/chair/barber{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aER" = (/obj/structure/table/reinforced,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/razor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aES" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aEN" = (/obj/machinery/camera{c_tag = "Barber Shop"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/dye_generator,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aEO" = (/obj/structure/stool/bed/chair/barber{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aEP" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
+"aEQ" = (/obj/structure/table/reinforced,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/razor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aES" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar)
"aET" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aEU" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar)
-"aEV" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
+"aEU" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
+"aEV" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "escape"},/area/maintenance/abandonedbar)
"aEW" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/maintenance/abandonedbar)
-"aEX" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "escape"},/area/maintenance/abandonedbar)
-"aEY" = (/obj/item/trash/pistachios,/obj/machinery/light_construct,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aEX" = (/obj/item/trash/pistachios,/obj/machinery/light_construct,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aEY" = (/obj/structure/stool,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aEZ" = (/obj/machinery/light,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aFa" = (/obj/structure/stool,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
+"aFa" = (/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
"aFb" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"aFc" = (/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aFc" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite)
"aFd" = (/turf/simulated/wall/r_wall,/area/maintenance/abandonedbar)
"aFe" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
"aFf" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate_elite)
-"aFg" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite)
-"aFh" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
+"aFg" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
+"aFh" = (/obj/machinery/door_control{id = "syndicate_sit_1"; name = "Blast Doors"; pixel_x = 3; pixel_y = -28; range = 20; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
"aFi" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate_sit)
-"aFj" = (/obj/machinery/door_control{id = "syndicate_sit_1"; name = "Blast Doors"; pixel_x = 3; pixel_y = -28; range = 20; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
+"aFj" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aFk" = (/obj/machinery/computer/shuttle/sit,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_sit)
-"aFl" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aFl" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"aFm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aFn" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aFn" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aFo" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFp" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aFp" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aFq" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aFr" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
"aFs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aFt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aFu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aFv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"aFw" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway Courtroom"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFz" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFA" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aFx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aFy" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aFz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aFA" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"aFB" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFC" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aFE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aFC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aFD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aFE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"aFF" = (/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aFG" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/hallway/primary/fore)
-"aFH" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aFI" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aFJ" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aFK" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"aFG" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"aFH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aFI" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/camera{c_tag = "Fore Primary Hallway East"; dir = 1; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aFJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aFK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"aFL" = (/turf/simulated/wall/r_wall,/area/security/evidence)
-"aFM" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aFN" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aFO" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/wall/r_wall,/area/security/evidence)
-"aFP" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aFQ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aFR" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aFS" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office)
+"aFM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aFN" = (/obj/item/weapon/dice/d20,/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aFO" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aFP" = (/obj/structure/stool/bed/chair/wood/wings,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aFQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aFR" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aFS" = (/obj/machinery/newscaster{pixel_x = -30},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
"aFT" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aFU" = (/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aFV" = (/obj/structure/stool/bed/chair/wood/wings,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aFW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aFX" = (/obj/effect/landmark/start{name = "Barber"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aFY" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aFZ" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aGa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aFV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aFW" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aFX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/bananium{name = "Clown's Office"; req_access_txt = "46"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/clownoffice)
+"aFY" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aFZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aGa" = (/obj/item/weapon/stool,/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "purplecorner"},/area/maintenance/abandonedbar)
"aGb" = (/obj/structure/table/woodentable,/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/maintenance/abandonedbar)
-"aGc" = (/obj/item/weapon/stool,/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "purplecorner"},/area/maintenance/abandonedbar)
+"aGc" = (/obj/structure/mineral_door/wood{name = "Abandoned Bar"},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
"aGd" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/rust,/area/maintenance/abandonedbar)
-"aGe" = (/obj/structure/mineral_door/wood{name = "Abandoned Bar"},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aGe" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_sit_1"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_sit)
"aGf" = (/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_elite)
"aGg" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
-"aGh" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_sit_1"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_sit)
-"aGi" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
+"aGh" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate_sit)
+"aGi" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aGj" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
-"aGk" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aGk" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aGl" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aGm" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aGm" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"aGn" = (/turf/simulated/wall,/area/maintenance/fpmaint2)
"aGo" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/fore)
-"aGp" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aGq" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aGp" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aGq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/tranquillite{name = "Mime's Office"; req_access_txt = "46"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/mimeoffice)
"aGr" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGA" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGB" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/mob/living/simple_animal/bot/secbot/beepsky{name = "Officer Beepsky"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGC" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGD" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGF" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aGG" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -22},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aGH" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aGI" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aGJ" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aGK" = (/obj/machinery/light,/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"aGL" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aGM" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aGs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aGt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Magistrate's Office"; req_access_txt = "74"},/turf/simulated/floor/plasteel,/area/magistrateoffice)
+"aGu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGv" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGw" = (/obj/effect/spawner/lootdrop/maintenance,/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aGz" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aGA" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/clown,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/wood,/area/clownoffice)
+"aGB" = (/obj/item/flag/clown,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/clownoffice)
+"aGC" = (/obj/structure/statue/bananium/clown,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/clownoffice)
+"aGD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/wood,/area/clownoffice)
+"aGE" = (/obj/structure/statue/tranquillite/mime,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/mimeoffice)
+"aGF" = (/obj/item/flag/mime,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/mimeoffice)
+"aGG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/mimeoffice)
+"aGH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aGI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aGJ" = (/obj/machinery/light{dir = 1},/obj/machinery/photocopier,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aGK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aGN" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aGO" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aGP" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/wall,/area/civilian/barber)
-"aGQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aGO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aGP" = (/obj/machinery/light/small,/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aGQ" = (/obj/structure/stool/bed/chair/barber{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
"aGR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aGS" = (/obj/structure/stool/bed/chair/barber{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aGS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aGT" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"aGU" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aGV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aGV" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fsmaint2)
"aGW" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aGX" = (/turf/simulated/wall,/area/maintenance/fsmaint2)
"aGY" = (/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aGZ" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fsmaint2)
-"aHa" = (/turf/simulated/wall/rust,/area/maintenance/fsmaint2)
+"aGZ" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aHa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aHb" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aHc" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aHd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aHe" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aHf" = (/obj/structure/stool/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aHg" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHh" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHi" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHj" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHk" = (/obj/machinery/light,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHl" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHm" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHn" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aHo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aHr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aHv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aHx" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA"; location = "Security"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aHy" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHz" = (/obj/machinery/light,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHB" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aHD" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway East"; dir = 1; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHd" = (/obj/structure/stool/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aHe" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHf" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHg" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aHi" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aHj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aHk" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/clownoffice)
+"aHl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/clownoffice)
+"aHm" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/mimeoffice)
+"aHn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/mimeoffice)
+"aHp" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aHq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Mr. Chang's"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/mrchangs)
+"aHs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Barber Shop"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aHt" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/mimeoffice)
+"aHu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aHv" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA"; location = "Security"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aHw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aHx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aHz" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "magistrate2"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Magistrate's Office"; req_access_txt = "74"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/magistrateoffice)
+"aHA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aHB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aHC" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aHD" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
"aHE" = (/turf/simulated/wall/r_wall,/area/security/detectives_office)
-"aHF" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aHG" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aHH" = (/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aHI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aHJ" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/item/weapon/paper_bin{pixel_x = 0; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aHF" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/cryopod/right,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aHG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aHH" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/item/weapon/paper_bin{pixel_x = 0; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aHI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aHJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aHK" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aHL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aHM" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aHL" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"aHM" = (/obj/machinery/atmospherics/trinary/filter{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aHN" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aHO" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aHP" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fsmaint2)
"aHQ" = (/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"aHR" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"aHR" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aHS" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aHT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aHU" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aHV" = (/obj/machinery/atmospherics/trinary/filter{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aHW" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aHX" = (/obj/machinery/camera{c_tag = "Fore Port Solar Control"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aHY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aHZ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aHU" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aHV" = (/obj/machinery/camera{c_tag = "Fore Port Solar Control"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aHW" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aHX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aHY" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness)
+"aHZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/crew_quarters/fitness)
"aIa" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
"aIb" = (/turf/simulated/wall/r_wall,/area/clownoffice)
"aIc" = (/turf/simulated/wall,/area/clownoffice)
-"aId" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/clownoffice)
+"aId" = (/obj/structure/sign/chinese{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
"aIe" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/clownoffice)
-"aIf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/bananium{name = "Clown's Office"; req_access_txt = "46"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
-"aIg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/mimeoffice)
+"aIf" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aIg" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
"aIh" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mimeoffice)
-"aIi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/tranquillite{name = "Mime's Office"; req_access_txt = "46"},/turf/simulated/floor/plasteel,/area/mimeoffice)
-"aIj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/mimeoffice)
-"aIk" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aIi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "magistrate"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/magistrateoffice)
+"aIj" = (/obj/structure/stool/bed/chair/sofa/right,/obj/machinery/camera{c_tag = "Boxing Ring"; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aIk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
"aIl" = (/turf/simulated/wall,/area/magistrateoffice)
-"aIm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "magistrate"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/magistrateoffice)
-"aIn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Magistrate's Office"; req_access_txt = "74"},/turf/simulated/floor/plasteel,/area/magistrateoffice)
+"aIm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Internal Affairs Office"; req_access_txt = "38"},/turf/simulated/floor/plasteel,/area/lawoffice)
+"aIn" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"aIo" = (/turf/simulated/wall,/area/lawoffice)
-"aIp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Internal Affairs Office"; req_access_txt = "38"},/turf/simulated/floor/plasteel,/area/lawoffice)
-"aIq" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aIp" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"aIq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/lasertag/red,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
"aIr" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aIs" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aIt" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/hallway/primary/fore)
-"aIu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/fore)
-"aIv" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/maintenance/fsmaint)
-"aIw" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aIx" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aIy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aIz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aIA" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aIB" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "bar_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"aIC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aID" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aIE" = (/obj/machinery/camera{c_tag = "Fore Starboard Solars"; dir = 1; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aIs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aIt" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Mime"},/turf/simulated/floor/wood,/area/mimeoffice)
+"aIu" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/mimeoffice)
+"aIv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aIw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aIx" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aIy" = (/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/item/weapon/gavelblock,/obj/item/weapon/gavelhammer,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aIz" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "bar_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"aIA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aIB" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aIC" = (/obj/machinery/camera{c_tag = "Fore Starboard Solars"; dir = 1; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
+"aID" = (/obj/structure/closet/wardrobe/mixed,/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aIE" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aIF" = (/turf/simulated/wall/r_wall,/area/maintenance/fsmaint2)
-"aIG" = (/obj/structure/closet/wardrobe/mixed,/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aIH" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aIG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aIH" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aII" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aIJ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aIK" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aIJ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aIK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
"aIL" = (/obj/machinery/atmospherics/unary/portables_connector{layer = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aIM" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aIN" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aIO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
+"aIM" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aIN" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aIO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aIP" = (/obj/structure/closet/secure_closet/clown,/turf/simulated/floor/wood,/area/clownoffice)
-"aIQ" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/clown,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/clownoffice)
-"aIR" = (/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice)
-"aIS" = (/obj/item/flag/clown,/turf/simulated/floor/wood,/area/clownoffice)
-"aIT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/clownoffice)
-"aIU" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/flag/mime,/turf/simulated/floor/wood,/area/mimeoffice)
+"aIQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aIR" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aIS" = (/obj/machinery/cryopod/right,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aIT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aIV" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/mimeoffice)
-"aIW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/mimeoffice)
-"aIX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aIY" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange{department = "Magistrate's Office"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aIW" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange{department = "Magistrate's Office"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aIX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aIY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aIZ" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/megaphone,/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aJa" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump,/obj/machinery/photocopier,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aJb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aJc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "magistrate"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/magistrateoffice)
-"aJd" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJe" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/structure/closet/lawcloset,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJf" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/bookcase,/obj/item/weapon/book/manual/sop_engineering,/obj/item/weapon/book/manual/sop_medical,/obj/item/weapon/book/manual/sop_science,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_service,/obj/item/weapon/book/manual/sop_supply,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/book/manual/sop_legal,/obj/item/weapon/book/manual/sop_command,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJg" = (/obj/machinery/photocopier,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJh" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJi" = (/obj/machinery/vending/coffee,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/secure/briefcase{pixel_x = 5; pixel_y = -5},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aJl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "lawyer"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/lawoffice)
-"aJm" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aJn" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall,/area/hallway/primary/fore)
-"aJo" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aJw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aJx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aJy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aJz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/civilian/barber)
-"aJA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aJB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aJC" = (/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aJD" = (/obj/machinery/light{dir = 4},/obj/structure/dresser,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aJa" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJb" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "magistrate"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/magistrateoffice)
+"aJc" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/bookcase,/obj/item/weapon/book/manual/sop_engineering,/obj/item/weapon/book/manual/sop_medical,/obj/item/weapon/book/manual/sop_science,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_service,/obj/item/weapon/book/manual/sop_supply,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/book/manual/sop_legal,/obj/item/weapon/book/manual/sop_command,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJd" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/structure/closet/lawcloset,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJe" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJf" = (/obj/machinery/photocopier,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJh" = (/obj/machinery/vending/coffee,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "lawyer"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/lawoffice)
+"aJj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/secure/briefcase{pixel_x = 5; pixel_y = -5},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJk" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aJl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aJm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aJn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aJo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aJp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aJq" = (/obj/machinery/camera{c_tag = "Fitness Rooms North"; dir = 2; network = list("SS13")},/obj/machinery/computer/mob_battle_terminal/red,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aJr" = (/obj/machinery/camera{c_tag = "Mime's Office"; dir = 1; network = list("SS13")},/obj/structure/closet/secure_closet/mime,/turf/simulated/floor/wood,/area/mimeoffice)
+"aJs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aJt" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/folder{pixel_x = -4},/obj/machinery/door_control{id = "magistrate2"; name = "IAA Privacy Shutters Control"; pixel_x = 8; pixel_y = -25},/obj/machinery/door_control{id = "magistrate"; name = "Privacy Shutters Control"; pixel_x = -8; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aJu" = (/obj/structure/filingcabinet,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aJv" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aJw" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/stamp/law,/obj/machinery/light,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aJx" = (/obj/structure/table/reinforced,/obj/item/weapon/folder{pixel_x = -4},/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/folder/yellow{pixel_x = 2; pixel_y = 2},/obj/item/weapon/stamp/law,/obj/machinery/requests_console{department = "Internal Affairs Office"; name = "Internal Affairs Requests Console"; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJy" = (/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aJz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJA" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aJB" = (/obj/machinery/light{dir = 4},/obj/structure/dresser,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"aJC" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aJE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aJF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aJG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
-"aJH" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aJJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
-"aJK" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJL" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
+"aJI" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJJ" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJK" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJL" = (/obj/machinery/slot_machine,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aJM" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJN" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJO" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/coin/gold,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJP" = (/obj/machinery/slot_machine,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJQ" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJR" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_1)
+"aJN" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/coin/gold,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJO" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aJP" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_1)
+"aJQ" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_1)
+"aJR" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_2)
"aJS" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/pod_1)
-"aJT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_1)
-"aJU" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_2)
+"aJT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_2)
+"aJU" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aJV" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/pod_2)
-"aJW" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_2)
+"aJW" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aJX" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aJY" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aJZ" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKa" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKb" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKc" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKe" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKf" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Fore Port Solar Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKi" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aKj" = (/obj/structure/lattice,/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
+"aKa" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKb" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKc" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Fore Port Solar Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKd" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aKh" = (/obj/structure/lattice,/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
+"aKi" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/weapon/pen/multi,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aKj" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 5; pixel_y = 6},/obj/structure/cable,/obj/item/weapon/pen/multi,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aKk" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/wood,/area/clownoffice)
-"aKl" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/clownoffice)
+"aKl" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/machinery/requests_console{department = "Internal Affairs Office"; name = "Internal Affairs Requests Console"; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aKm" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/clownoffice)
"aKn" = (/turf/simulated/floor/wood,/area/clownoffice)
-"aKo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/wood,/area/clownoffice)
-"aKp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/mimeoffice)
-"aKq" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/mimeoffice)
+"aKo" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "lawyer"; name = "Privacy Shutters Control"; pixel_y = -25},/obj/item/weapon/folder{pixel_x = -4},/obj/item/weapon/folder/red{pixel_y = 3},/obj/machinery/camera{c_tag = "Internal Affairs Office"; dir = 1; network = list("SS13")},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/stamp/law,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aKp" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aKq" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aKr" = (/turf/simulated/floor/wood,/area/mimeoffice)
-"aKs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/mimeoffice)
+"aKs" = (/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aKt" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/effect/landmark/start{name = "Magistrate"},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/carpet,/area/magistrateoffice)
"aKu" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/multi/gold,/turf/simulated/floor/carpet,/area/magistrateoffice)
"aKv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aKw" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aKx" = (/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aKy" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aKz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aKA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep)
-"aKB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep)
-"aKC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/wall,/area/crew_quarters/sleep)
-"aKD" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aKE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/fitness)
-"aKF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/fitness)
-"aKG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/crew_quarters/mrchangs)
-"aKH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/mrchangs)
-"aKI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Mr. Chang's"},/turf/simulated/floor/plasteel,/area/crew_quarters/mrchangs)
-"aKJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/mrchangs)
-"aKK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/civilian/barber)
-"aKL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/civilian/barber)
-"aKM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Barber Shop"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
-"aKN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/wall,/area/civilian/barber)
+"aKw" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aKx" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aKy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aKz" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/lawoffice)
+"aKA" = (/obj/machinery/door/airlock/maintenance{name = "Internal Affairs Maintenance"; req_access_txt = "38"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aKC" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aKD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKH" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKJ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1450; id_tag = "bar_pump"},/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "bar_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "bar_maint"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "bar_pump"; tag_chamber_sensor = "bar_sensor"; tag_exterior_door = "bar_maint_outer"; tag_interior_door = "bar_maint_inner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKL" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aKM" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"aKO" = (/turf/simulated/wall,/area/crew_quarters/fitness)
"aKP" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aKQ" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck)
-"aKR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1450; id_tag = "bar_pump"},/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "bar_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "bar_maint"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "bar_pump"; tag_chamber_sensor = "bar_sensor"; tag_exterior_door = "bar_maint_outer"; tag_interior_door = "bar_maint_inner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKT" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKU" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKR" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKT" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKU" = (/obj/structure/table,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKV" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aKW" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Fore Starboard Solar Access"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aKX" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKY" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKZ" = (/obj/structure/table,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aLa" = (/obj/item/weapon/coin/gold,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aLb" = (/obj/structure/closet,/obj/item/weapon/coin/iron,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKY" = (/obj/structure/closet,/obj/item/weapon/coin/iron,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aKZ" = (/obj/item/weapon/coin/gold,/obj/item/weapon/coin/iron,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aLa" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/pod_1)
+"aLb" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
"aLc" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aLd" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry)
-"aLe" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/pod_1)
-"aLf" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
-"aLg" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/pod_2)
-"aLh" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/pod_2)
-"aLi" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "arrivals_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "arrivals_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "arrivals_pump"; tag_exterior_door = "arrivals_outer"; frequency = 1379; id_tag = "arrivals_airlock"; tag_interior_door = "arrivals_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "arrivals_sensor"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLe" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/pod_2)
+"aLf" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/pod_2)
+"aLg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "arrivals_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "arrivals_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "arrivals_pump"; tag_exterior_door = "arrivals_outer"; frequency = 1379; id_tag = "arrivals_airlock"; tag_interior_door = "arrivals_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "arrivals_sensor"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLh" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLi" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/wall,/area/maintenance/fpmaint2)
+"aLj" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fpmaint2)
"aLk" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLl" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/wall,/area/maintenance/fpmaint2)
-"aLm" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall,/area/maintenance/fpmaint2)
-"aLn" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fpmaint2)
-"aLo" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLp" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLq" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLl" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall,/area/maintenance/fpmaint2)
+"aLm" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLn" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLo" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLp" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLq" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aLr" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLs" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLt" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aLv" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Clown's Office"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/wood,/area/clownoffice)
-"aLw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/clownoffice)
-"aLx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/turf/simulated/floor/wood,/area/clownoffice)
-"aLy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/clownoffice)
-"aLz" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
+"aLs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aLt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/clownoffice)
+"aLu" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Clown's Office"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/wood,/area/clownoffice)
+"aLv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/clownoffice)
+"aLw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/turf/simulated/floor/wood,/area/clownoffice)
+"aLx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
+"aLy" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/paper_bin,/obj/item/toy/crayon/mime,/turf/simulated/floor/wood,/area/mimeoffice)
+"aLz" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"aLA" = (/turf/simulated/wall,/area/mimeoffice)
-"aLB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/mimeoffice)
-"aLC" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/paper_bin,/obj/item/toy/crayon/mime,/turf/simulated/floor/wood,/area/mimeoffice)
-"aLD" = (/obj/machinery/camera{c_tag = "Magistrate's Office"; dir = 4; network = list("SS13")},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aLB" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aLC" = (/obj/machinery/camera{c_tag = "Magistrate's Office"; dir = 4; network = list("SS13")},/turf/simulated/floor/carpet,/area/magistrateoffice)
+"aLD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.V.A. Maintenance"; req_access_txt = "0"; req_one_access_txt = "18"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aLE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aLF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aLG" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "magistrate2"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Magistrate's Office"; req_access_txt = "74"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/magistrateoffice)
-"aLH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aLI" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aLJ" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aLK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aLL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aLM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aLF" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aLG" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aLH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aLI" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aLJ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"aLK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aLL" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aLM" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
"aLN" = (/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aLO" = (/obj/structure/cryofeed,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aLO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "Cryogenics"; name = "Cryodorms"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
"aLP" = (/turf/simulated/wall,/area/crew_quarters/sleep)
-"aLQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/crew_quarters/fitness)
-"aLR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness)
-"aLS" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLT" = (/obj/machinery/requests_console{department = "Crew Quarters"; name = "Crew Quarters Requests Console"; pixel_y = 30},/obj/machinery/vending/cigarette,/obj/machinery/camera{c_tag = "Dormitories North"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLU" = (/obj/machinery/vending/cola,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLV" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLW" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLX" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aLZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/sign/chinese{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/structure/stool/bed/chair/sofa/right,/obj/machinery/camera{c_tag = "Boxing Ring"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair/sofa,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/barber{pixel_y = 30},/obj/structure/stool/bed/chair/sofa/left,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/lasertag/red,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aMg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/lasertag/blue,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aLQ" = (/obj/machinery/requests_console{department = "Crew Quarters"; name = "Crew Quarters Requests Console"; pixel_y = 30},/obj/machinery/vending/cigarette,/obj/machinery/camera{c_tag = "Dormitories North"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aLR" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aLS" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aLT" = (/obj/machinery/vending/cola,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aLU" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aLV" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aLW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aLX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aLY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aLZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aMa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/barber{pixel_y = 30},/obj/structure/stool/bed/chair/sofa/left,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aMb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair/sofa,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
+"aMc" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aMd" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aMe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/lasertag/blue,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aMf" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aMg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aMh" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aMi" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "bar_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aMj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aMk" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aMl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aMi" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aMj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aMk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aMl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/donut,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aMm" = (/obj/structure/door_assembly/door_assembly_mai,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aMn" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aMo" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aMp" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/donut,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aMp" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
"aMq" = (/turf/simulated/wall,/area/maintenance/electrical)
"aMr" = (/turf/simulated/wall,/area/space)
"aMs" = (/turf/simulated/wall,/area/hallway/secondary/entry)
-"aMt" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
-"aMu" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor,/area/shuttle/pod_2)
-"aMv" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aMw" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aMt" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor,/area/shuttle/pod_2)
+"aMu" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aMv" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aMw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aMx" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aMy" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aMz" = (/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aMz" = (/turf/simulated/wall/rust,/area/maintenance/fsmaint2)
"aMA" = (/turf/simulated/wall,/area/maintenance/fpmaint)
-"aMB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Mime"},/turf/simulated/floor/wood,/area/mimeoffice)
+"aMB" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aMC" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/mimeoffice)
-"aMD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice)
-"aME" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/mimeoffice)
-"aMF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aMG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/magistrateoffice)
-"aMH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aMI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aMJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aMK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/item/weapon/gavelblock,/obj/item/weapon/gavelhammer,/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aML" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine/longrange{department = "Internal Affairs Office"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aMM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aMN" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aMD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aME" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aMF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aMG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aMH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aMI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aMJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aMK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"aML" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness)
+"aMM" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine/longrange{department = "Internal Affairs Office"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aMN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
"aMO" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aMP" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aMP" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aMQ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aMR" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aMS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/crew_quarters/sleep)
-"aMT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aMU" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aMR" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aMS" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aMT" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aMU" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
"aMV" = (/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aMW" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aMX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aMY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aMZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aMX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aMY" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aMZ" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
"aNb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aNc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aNd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/camera{c_tag = "Fitness Rooms North"; dir = 2; network = list("SS13")},/obj/machinery/computer/mob_battle_terminal/red,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"aNe" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "bar_maint"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aNf" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aNg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aNh" = (/obj/machinery/door_control{id = "maint3"; name = "Blast Door Control C"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aNc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNd" = (/obj/machinery/atm{pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNe" = (/obj/machinery/newscaster{pixel_y = -28},/obj/structure/closet/athletic_mixed,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNf" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "bar_maint"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aNg" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aNh" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNi" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNj" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNk" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
-"aNl" = (/obj/item/stack/sheet/mineral/plasma{amount = 10},/obj/item/stack/rods{amount = 50},/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
+"aNl" = (/obj/machinery/door_control{id = "maint3"; name = "Blast Door Control C"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNm" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aNn" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aNn" = (/obj/item/stack/sheet/mineral/plasma{amount = 10},/obj/item/stack/rods{amount = 50},/obj/structure/rack,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil{amount = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
"aNo" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/maintenance/electrical)
-"aNp" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/bluegrid,/area/maintenance/electrical)
-"aNq" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_1)
-"aNr" = (/obj/docking_port/mobile/pod{id = "pod1"; name = "escape pod 1"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
+"aNp" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aNq" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/bluegrid,/area/maintenance/electrical)
+"aNr" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_1)
"aNs" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_1)
-"aNt" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_2)
-"aNu" = (/obj/docking_port/mobile/pod{id = "pod2"; name = "escape pod 2"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_2)
+"aNt" = (/obj/docking_port/mobile/pod{id = "pod1"; name = "escape pod 1"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_1)
+"aNu" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_2)
"aNv" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_2)
"aNw" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/hallway/secondary/entry)
"aNx" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNy" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aNy" = (/obj/docking_port/mobile/pod{id = "pod2"; name = "escape pod 2"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_2)
+"aNz" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aNA" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aNB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNC" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/space)
-"aND" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/space)
+"aNC" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aND" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/space)
"aNE" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aNF" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNG" = (/obj/structure/grille,/obj/structure/window/basic,/obj/structure/window/basic{dir = 1},/obj/structure/window/basic{dir = 8},/obj/structure/window/basic{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNJ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/fpmaint)
-"aNK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_outer"; locked = 1; name = "EVA External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/maintenance/fpmaint)
-"aNL" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eva_pump"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aNM" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eva_airlock"; name = "EVA Airlock Console"; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "1;5;11;18;24"; tag_airpump = "eva_pump"; tag_chamber_sensor = "eva_sensor"; tag_exterior_door = "eva_outer"; tag_interior_door = "eva_inner"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aNN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aNO" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aNG" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/space)
+"aNH" = (/obj/structure/grille,/obj/structure/window/basic,/obj/structure/window/basic{dir = 1},/obj/structure/window/basic{dir = 8},/obj/structure/window/basic{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aNI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aNJ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_outer"; locked = 1; name = "EVA External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/maintenance/fpmaint)
+"aNK" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/fpmaint)
+"aNL" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eva_airlock"; name = "EVA Airlock Console"; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "1;5;11;18;24"; tag_airpump = "eva_pump"; tag_chamber_sensor = "eva_sensor"; tag_exterior_door = "eva_outer"; tag_interior_door = "eva_inner"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aNM" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eva_pump"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aNN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aNO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aNP" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aNQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aNR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Mime's Office"; dir = 1; network = list("SS13")},/obj/structure/closet/secure_closet/mime,/turf/simulated/floor/wood,/area/mimeoffice)
-"aNS" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice)
-"aNT" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice)
-"aNU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aNV" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/filingcabinet,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aNW" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/folder{pixel_x = -4},/obj/machinery/door_control{id = "magistrate2"; name = "IAA Privacy Shutters Control"; pixel_x = 8; pixel_y = -25},/obj/machinery/door_control{id = "magistrate"; name = "Privacy Shutters Control"; pixel_x = -8; pixel_y = -25},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aNX" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/stamp/law,/obj/machinery/light,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aNY" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/carpet,/area/magistrateoffice)
-"aNZ" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOa" = (/obj/structure/table/reinforced,/obj/item/weapon/folder{pixel_x = -4},/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/folder/yellow{pixel_x = 2; pixel_y = 2},/obj/item/weapon/stamp/law,/obj/machinery/requests_console{department = "Internal Affairs Office"; name = "Internal Affairs Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOb" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOc" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOd" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/machinery/requests_console{department = "Internal Affairs Office"; name = "Internal Affairs Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOe" = (/obj/structure/table/reinforced,/obj/item/ashtray/plastic{pixel_x = 5; pixel_y = 6},/obj/structure/cable,/obj/item/weapon/pen/multi,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "lawyer"; name = "Privacy Shutters Control"; pixel_y = -25},/obj/item/weapon/folder{pixel_x = -4},/obj/item/weapon/folder/red{pixel_y = 3},/obj/machinery/camera{c_tag = "Internal Affairs Office"; dir = 1; network = list("SS13")},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/stamp/law,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aOg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "lawyer"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/lawoffice)
-"aOh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aOi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aOj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aOk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/hallway/primary/fore)
-"aOl" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aOm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/crew_quarters/sleep)
-"aOn" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aOo" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNQ" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice)
+"aNR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/closet/masks,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light,/obj/structure/closet/boxinggloves,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/poolcontroller{pixel_y = -25; srange = 7},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/wardrobe/pjs,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNV" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aNW" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
+"aNX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aNY" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aNZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aOa" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aOc" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aOd" = (/obj/machinery/cryopod/right,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aOe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aOg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOh" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aOi" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aOj" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aOk" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aOl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aOm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aOn" = (/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aOo" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/door/window/westright{dir = 1; name = "Boxing Ring"},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
"aOp" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aOq" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/door/window/westright{dir = 1; name = "Boxing Ring"},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
+"aOq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aOr" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
"aOs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
-"aOt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aOt" = (/obj/machinery/door/airlock/maintenance{name = "Bar Office Maintenance"; req_access_txt = "25"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aOu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
"aOv" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
"aOw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
-"aOx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aOy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"aOz" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aOA" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aOx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aOy" = (/obj/machinery/camera{c_tag = "Holodeck"; network = list("SS13")},/obj/machinery/alarm{pixel_y = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aOz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aOA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aOB" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aOC" = (/obj/machinery/camera{c_tag = "Holodeck"; network = list("SS13")},/obj/machinery/alarm{pixel_y = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aOC" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aOD" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
-"aOE" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aOF" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aOG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aOH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aOI" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aOJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOH" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
"aOK" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
"aOL" = (/turf/simulated/floor/plating,/area/maintenance/electrical)
"aOM" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
-"aON" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
-"aOO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
+"aON" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
+"aOO" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28},/obj/machinery/iv_drip,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aOP" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aOQ" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aOR" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aOS" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aOT" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aOU" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28},/obj/machinery/iv_drip,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aOU" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28},/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/circuitboard/operating,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aOV" = (/obj/structure/computerframe,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aOW" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28},/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/circuitboard/operating,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aOX" = (/obj/structure/stool/bed/chair,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aOY" = (/obj/structure/lattice,/obj/structure/closet,/turf/space,/area/space)
-"aOZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aOW" = (/obj/structure/stool/bed/chair,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aOX" = (/obj/structure/lattice,/obj/structure/closet,/turf/space,/area/space)
+"aOY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aOZ" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aPa" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aPb" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aPb" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eva_pump"},/obj/machinery/camera{c_tag = "EVA Airlock"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aPc" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fpmaint2)
"aPd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/fpmaint)
"aPe" = (/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aPf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eva_pump"},/obj/machinery/camera{c_tag = "EVA Airlock"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aPg" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aPf" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aPg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{sortType = 19},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aPh" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aPi" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aPj" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fpmaint)
-"aPk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall,/area/mimeoffice)
-"aPl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/mimeoffice)
-"aPm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aPn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/magistrateoffice)
-"aPo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/magistrateoffice)
-"aPp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/magistrateoffice)
-"aPq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/lawoffice)
-"aPr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Internal Affairs Maintenance"; req_access_txt = "38"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aPs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/lawoffice)
-"aPt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/lawoffice)
-"aPu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/lawoffice)
-"aPv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/lawoffice)
-"aPw" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/camera{c_tag = "Fore Primary Hallway South"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"aPx" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"aPy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/sleep)
-"aPz" = (/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aPk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aPl" = (/obj/machinery/camera{c_tag = "Dormitories South"; c_tag_order = 999; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aPm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aPn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aPo" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aPp" = (/obj/structure/sign/poster{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aPq" = (/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aPr" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/camera{c_tag = "Fore Primary Hallway South"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"aPs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aPt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aPu" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aPv" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aPw" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"aPx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aPy" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aPz" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aPA" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aPB" = (/obj/structure/table/woodentable,/obj/item/weapon/coin/silver,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aPC" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
@@ -2166,192 +2166,192 @@
"aPH" = (/mob/living/simple_animal/crab/Coffee,/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
"aPI" = (/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
"aPJ" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
-"aPK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aPK" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint3"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aPL" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aPM" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aPN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint3"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aPO" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint3"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aPO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
"aPP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aPQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
+"aPQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
"aPR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
-"aPS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aPS" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/electrical)
"aPT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aPU" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aPV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aPU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aPV" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/space,/area/space)
"aPW" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/weapon/storage/toolbox/electrical,/obj/item/device/multitool,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical)
-"aPX" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"aPY" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
+"aPX" = (/obj/machinery/optable,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aPY" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/space)
"aPZ" = (/obj/machinery/door/airlock/external{name = "Escape Pod"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aQa" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/hallway/secondary/entry)
"aQb" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aQc" = (/obj/machinery/optable,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aQd" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/space)
+"aQc" = (/obj/structure/stool,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aQd" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aQe" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aQf" = (/obj/structure/stool,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aQf" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/crew_quarters/toilet)
"aQg" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aQh" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aQi" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aQj" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aQk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aQl" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQm" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQn" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQt" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQw" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aQx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aQy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aQz" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aQA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/hallway/primary/fore)
-"aQB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aQC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aQD" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aQm" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aQn" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aQo" = (/obj/machinery/light/small{dir = 8},/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aQp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQq" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/crew_quarters/bar)
+"aQs" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/bridge)
+"aQt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQu" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQv" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"aQw" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"aQx" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/secure_closet/exam,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aQy" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/body_scanconsole,/obj/machinery/camera{c_tag = "Medbay Examination Room"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aQz" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aQA" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/morgue)
+"aQB" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQC" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQD" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/machinery/requests_console{department = "Morgue"; departmentType = 5; name = "Morgue Requests Console"; pixel_x = 0; pixel_y = 30},/obj/item/weapon/storage/box/bodybags{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
"aQE" = (/obj/structure/table/woodentable,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aQF" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aQG" = (/obj/structure/disposalpipe/segment,/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aQH" = (/obj/structure/table,/obj/item/weapon/paper/holodeck,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aQI" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQJ" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQK" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQJ" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "maint2"; name = "Blast Control Door B"; pixel_x = -28; pixel_y = 4},/obj/machinery/door_control{id = "maint1"; name = "Blast Control Door A"; pixel_x = -28; pixel_y = -6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aQL" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQM" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "maint2"; name = "Blast Control Door B"; pixel_x = -28; pixel_y = 4},/obj/machinery/door_control{id = "maint1"; name = "Blast Control Door A"; pixel_x = -28; pixel_y = -6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQO" = (/obj/structure/janitorialcart,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQP" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQQ" = (/obj/structure/table/glass,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aQT" = (/obj/machinery/door/airlock/engineering{name = "Electrical Maintenance"; req_access_txt = "11"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aQU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aQV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aQW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aQX" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQM" = (/obj/structure/janitorialcart,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQN" = (/obj/structure/table/glass,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQO" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aQR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQS" = (/obj/machinery/door/airlock/engineering{name = "Electrical Maintenance"; req_access_txt = "11"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQV" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQW" = (/obj/structure/table,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = 5},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aQX" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "trade_dock"; name = "port bay 4 at Cyberiad"; width = 5},/turf/space,/area/space)
"aQY" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aQZ" = (/obj/structure/table,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = 5},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aRa" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "trade_dock"; name = "port bay 4 at Cyberiad"; width = 5},/turf/space,/area/space)
+"aQZ" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
+"aRa" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Arrivals Escape Pods"; dir = 2},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"aRb" = (/obj/machinery/door/airlock/external{id_tag = "trade_dock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"aRc" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"aRd" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Arrivals Escape Pods"; dir = 2},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"aRe" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aRf" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aRg" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aRh" = (/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/hallway/secondary/entry)
-"aRi" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aRj" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aRk" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aRl" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aRm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aRn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRr" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRt" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRc" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aRd" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aRe" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aRf" = (/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/hallway/secondary/entry)
+"aRg" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aRh" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aRi" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aRj" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aRk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aRl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRp" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRs" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRt" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRu" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
+"aRv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/medical/morgue)
"aRw" = (/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"aRx" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
-"aRy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
-"aRz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.V.A. Maintenance"; req_access_txt = "0"; req_one_access_txt = "18"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aRA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
-"aRB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aRC" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aRD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aRE" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aRF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aRG" = (/obj/machinery/computer/cryopod{density = 0; pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Cryodorms"; c_tag_order = 999; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aRH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aRI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "Cryogenics"; name = "Cryodorms"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aRy" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
+"aRz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aRA" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
+"aRB" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
+"aRC" = (/obj/machinery/alarm{pixel_y = 26},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
+"aRD" = (/obj/machinery/computer/cryopod{density = 0; pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Cryodorms"; c_tag_order = 999; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aRE" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aRF" = (/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aRG" = (/obj/machinery/door/window/eastleft{dir = 2; name = "Boxing Ring"},/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
+"aRH" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue)
+"aRI" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/crew_quarters/fitness)
"aRJ" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aRK" = (/obj/structure/table/woodentable,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aRL" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/sop_general,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aRM" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/fitness)
"aRN" = (/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/fitness)
-"aRO" = (/obj/machinery/door/window/eastleft{dir = 2; name = "Boxing Ring"},/obj/structure/window/reinforced{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/fitness)
+"aRO" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/paper_bin{pixel_y = -1},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/medical/morgue)
"aRP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
"aRQ" = (/obj/structure/window/reinforced,/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/fitness)
-"aRR" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/crew_quarters/fitness)
-"aRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"aRT" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aRU" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aRR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aRS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
+"aRT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aRU" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aRV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aRW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aRX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aRY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
-"aRZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
-"aSa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aSb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aSc" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aRW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aRX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
+"aRY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aRZ" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aSa" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
+"aSb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
+"aSc" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
"aSd" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"aSe" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
"aSf" = (/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"aSg" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
-"aSh" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
+"aSg" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
+"aSh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/entry)
"aSi" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"aSj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"aSk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/entry)
-"aSl" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
-"aSm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
-"aSn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
-"aSo" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aSp" = (/obj/structure/closet/wardrobe/white,/obj/item/clothing/shoes/jackboots,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aSq" = (/obj/structure/table/glass,/obj/item/weapon/hemostat,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aSr" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aSk" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
+"aSl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
+"aSm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
+"aSn" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aSo" = (/obj/structure/closet/wardrobe/white,/obj/item/clothing/shoes/jackboots,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aSp" = (/obj/structure/table/glass,/obj/item/weapon/hemostat,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aSq" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aSr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aSs" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aSt" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2)
"aSu" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint)
-"aSv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aSw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aSv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aSw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aSx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aSy" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aSz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aSA" = (/turf/simulated/wall/r_wall,/area/gateway)
"aSB" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aSC" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aSD" = (/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aSE" = (/obj/machinery/camera/motion{c_tag = "EVA North-West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aSF" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aSG" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aSH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aSI" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aSJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aSK" = (/obj/machinery/camera{c_tag = "EVA North-East"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aSD" = (/obj/machinery/camera/motion{c_tag = "EVA North-West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aSE" = (/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"aSF" = (/obj/effect/landmark/start{name = "Coroner"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"aSG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"aSH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"aSI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aSJ" = (/obj/machinery/camera{c_tag = "EVA North-East"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aSK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room)
"aSL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aSM" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aSN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"aSO" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
"aSP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aSQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aSR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
+"aSQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/bar)
+"aSR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/machinery/cryopod/right,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
"aSS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/crew_quarters/sleep)
-"aST" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"aST" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cryopod,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
"aSU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aSV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aSV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue)
"aSW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aSX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aSY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aSX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aSY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aSZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aTa" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aTb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aTa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
+"aTb" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aTc" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aTd" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/fitness)
-"aTe" = (/obj/machinery/computer/mob_battle_terminal/blue,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aTe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aTf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
-"aTg" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aTh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aTi" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aTj" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aTg" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aTh" = (/obj/machinery/computer/mob_battle_terminal/blue,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aTi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aTj" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
"aTk" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aTl" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aTm" = (/obj/machinery/power/terminal,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aTn" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
+"aTl" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aTm" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aTn" = (/obj/machinery/power/terminal,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical)
"aTo" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
"aTp" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry)
"aTq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
@@ -2359,210 +2359,210 @@
"aTs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
"aTt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
"aTu" = (/turf/simulated/wall,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aTv" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aTv" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/gateway)
"aTw" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aTx" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/gateway)
+"aTx" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/gateway)
"aTy" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
-"aTz" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/gateway)
+"aTz" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/ai_monitored/storage/eva)
"aTA" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aTB" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/ai_monitored/storage/eva)
+"aTB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/clothing/head/welding,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aTC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"aTD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/clothing/head/welding,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aTD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aTE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"aTF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aTG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aTH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"aTI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aTJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"aTK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aTL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/fitness)
-"aTM" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTN" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTO" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTP" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTQ" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTR" = (/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTS" = (/obj/machinery/newscaster{pixel_y = -28},/obj/structure/closet/athletic_mixed,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light,/obj/structure/closet/boxinggloves,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/closet/masks,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/poolcontroller{pixel_y = -25; srange = 7},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness)
-"aTX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aTY" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aTZ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aTF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"aTG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aTH" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aTI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
+"aTJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aTK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aTL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aTM" = (/obj/structure/closet/wardrobe/black,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue)
+"aTN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/exam_room)
+"aTO" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"aTP" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cane{pixel_x = -5; pixel_y = 6},/obj/item/weapon/cane,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aTQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
+"aTR" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_y = 8},/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/morgue)
+"aTS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
+"aTT" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/optable,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
+"aTU" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
+"aTV" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
+"aTW" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
+"aTX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aTY" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/exam_room)
+"aTZ" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aUa" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUb" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUc" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUb" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUc" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint2"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aUd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint2"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUe" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint2"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUf" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/obj/effect/landmark{name = "blobstart"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUg" = (/obj/effect/spawner/window,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUh" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aUe" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/obj/effect/landmark{name = "blobstart"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUf" = (/obj/effect/spawner/window,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUg" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aUh" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/monitor{name = "Backup Power Monitoring Console"},/turf/simulated/floor/plating,/area/maintenance/electrical)
"aUi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/maintenance/electrical)
-"aUj" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/monitor{name = "Backup Power Monitoring Console"},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aUk" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical)
-"aUl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/hallway/secondary/entry)
-"aUm" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"aUn" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
+"aUj" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"aUk" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
+"aUl" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry)
+"aUm" = (/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
+"aUn" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
"aUo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
-"aUp" = (/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
-"aUq" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry)
-"aUr" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"aUs" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
-"aUt" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aUu" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUp" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aUq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUs" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUt" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/checkpoint2)
+"aUu" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUv" = (/obj/machinery/light{dir = 1},/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aUw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUw" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aUx" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aUy" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aUy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aUz" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aUA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aUB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aUC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aUD" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aUA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aUB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aUC" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
+"aUD" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
"aUE" = (/turf/simulated/wall/r_wall,/area/security/nuke_storage)
"aUF" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aUG" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
+"aUG" = (/obj/machinery/requests_console{department = "EVA"; name = "EVA Requests Console"; pixel_x = -32; pixel_y = 0},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aUH" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aUI" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
+"aUI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aUJ" = (/turf/simulated/wall,/area/ai_monitored/storage/eva)
-"aUK" = (/obj/machinery/requests_console{department = "EVA"; name = "EVA Requests Console"; pixel_x = -32; pixel_y = 0},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aUK" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aUL" = (/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"aUM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aUN" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aUO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aUP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aUM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aUN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aUO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Examination Room"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room)
+"aUP" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6;5"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/morgue)
"aUQ" = (/turf/simulated/wall,/area/crew_quarters/toilet)
-"aUR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aUR" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aUS" = (/turf/simulated/wall,/area/crew_quarters/bar)
-"aUT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUU" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUV" = (/obj/structure/closet,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUT" = (/obj/structure/closet,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
"aUW" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aUX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aUX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
"aUY" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/electrical)
"aUZ" = (/turf/space,/area/hallway/secondary/entry)
-"aVa" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
-"aVb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aVa" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aVb" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aVc" = (/turf/simulated/wall,/area/security/checkpoint2)
-"aVd" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aVd" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
"aVe" = (/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aVf" = (/obj/structure/table/glass,/obj/item/seeds/appleseed,/obj/item/seeds/bananaseed,/obj/item/seeds/cocoapodseed,/obj/item/seeds/grapeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/towermycelium,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aVf" = (/obj/structure/table/glass,/obj/item/seeds/apple,/obj/item/seeds/banana,/obj/item/seeds/cocoapod,/obj/item/seeds/grape,/obj/item/seeds/orange,/obj/item/seeds/sugarcane,/obj/item/seeds/wheat,/obj/item/seeds/watermelon,/obj/item/seeds/tower,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aVg" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/storage/primary)
"aVh" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"aVi" = (/turf/simulated/wall,/area/storage/primary)
"aVj" = (/turf/simulated/wall/r_wall,/area/storage/primary)
"aVk" = (/obj/structure/closet/secure_closet/freezer/money,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
-"aVl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
+"aVl" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
"aVm" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage)
-"aVn" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
-"aVo" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/filingcabinet,/obj/item/weapon/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
+"aVn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/filingcabinet,/obj/item/weapon/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
+"aVo" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/gateway)
"aVp" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aVq" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/gateway)
+"aVq" = (/obj/machinery/gateway{dir = 6},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/gateway)
"aVr" = (/obj/machinery/gateway{density = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
-"aVs" = (/obj/machinery/gateway{dir = 6},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/gateway)
-"aVt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aVu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera/motion{c_tag = "EVA West"; dir = 4; network = list("SS13")},/obj/structure/table/reinforced,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aVv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"aVw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "EVA East"; dir = 8; network = list("SS13")},/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aVx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"aVy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aVz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
-"aVA" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aVB" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aVs" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"aVt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera/motion{c_tag = "EVA West"; dir = 4; network = list("SS13")},/obj/structure/table/reinforced,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aVu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"aVv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "EVA East"; dir = 8; network = list("SS13")},/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aVw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
+"aVx" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"aVy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
+"aVz" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aVA" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aVB" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/machinery/light_switch{pixel_x = -25},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aVC" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aVD" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/machinery/light_switch{pixel_x = -25},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aVD" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)"},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aVE" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aVF" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)"},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aVF" = (/obj/machinery/camera{c_tag = "Bar Storage"; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aVG" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aVH" = (/obj/machinery/camera{c_tag = "Bar Storage"; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aVI" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aVJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aVH" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aVI" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"aVJ" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aVK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aVL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aVM" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aVN" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aVO" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aVP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aVQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/window/basic{dir = 4},/obj/structure/window/basic,/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fsmaint2)
+"aVO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aVP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/grille/broken,/obj/structure/window/basic{dir = 4},/obj/structure/window/basic,/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fsmaint2)
+"aVQ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint1"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aVR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint1"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aVS" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint1"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aVS" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
"aVT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"aVU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"aVV" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/arrival/station)
-"aVW" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
+"aVW" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station)
"aVX" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aVY" = (/obj/structure/window/full/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"aVZ" = (/obj/structure/window/full/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"aWa" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/arrival/station)
-"aWb" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station)
-"aWc" = (/obj/machinery/camera{c_tag = "Arrivals East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aWb" = (/obj/machinery/camera{c_tag = "Arrivals East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aWc" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
"aWd" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint2)
-"aWe" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
+"aWe" = (/obj/machinery/computer/card,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
"aWf" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
-"aWg" = (/obj/machinery/computer/card,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
+"aWg" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint2)
"aWh" = (/obj/machinery/computer/secure_data,/obj/machinery/requests_console{department = "Security"; name = "Security Requests Console"; departmentType = 5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
-"aWi" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint2)
+"aWi" = (/obj/structure/table,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/wirecutters,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel,/area/storage/primary)
"aWj" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aWk" = (/obj/machinery/vending/assist,/turf/simulated/floor/plasteel,/area/storage/primary)
"aWl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aWm" = (/obj/structure/table,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/wirecutters,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aWm" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Primary Tool Storage"},/obj/machinery/requests_console{department = "Tool Storage"; name = "Tool Storage Requests Console"; pixel_y = 30},/obj/item/device/assembly/igniter{pixel_x = -8; pixel_y = -4},/obj/item/device/assembly/igniter,/obj/item/weapon/screwdriver{pixel_y = 16},/turf/simulated/floor/plasteel,/area/storage/primary)
"aWn" = (/obj/structure/table,/obj/machinery/alarm{pixel_y = 23},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aWo" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Primary Tool Storage"},/obj/machinery/requests_console{department = "Tool Storage"; name = "Tool Storage Requests Console"; pixel_y = 30},/obj/item/device/assembly/igniter{pixel_x = -8; pixel_y = -4},/obj/item/device/assembly/igniter,/obj/item/weapon/screwdriver{pixel_y = 16},/turf/simulated/floor/plasteel,/area/storage/primary)
-"aWp" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/multitool,/obj/item/device/multitool{pixel_x = 4},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aWo" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/multitool,/obj/item/device/multitool{pixel_x = 4},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aWp" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/storage/primary)
"aWq" = (/obj/structure/table,/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plasteel,/area/storage/primary)
"aWr" = (/obj/structure/table,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aWs" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aWs" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
"aWt" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/storage/primary)
"aWu" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
-"aWv" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
+"aWv" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
"aWw" = (/obj/machinery/nuclearbomb{r_code = "LOLNO"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
-"aWx" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
-"aWy" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
+"aWx" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
+"aWy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/window/southleft{name = "Gateway Chamber"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
"aWz" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
"aWA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aWB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/window/southleft{name = "Gateway Chamber"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
+"aWB" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
"aWC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
-"aWD" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
+"aWD" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aWE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "External EVA Storage"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aWF" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aWG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aWH" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aWI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Xeno Hardsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"aWF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"aWG" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aWH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aWI" = (/obj/machinery/camera{c_tag = "Medbay Fore Starboard"; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"aWJ" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aWK" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
-"aWL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"aWM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aWN" = (/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aWO" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aWP" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aWQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aWR" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/storage/secure/safe{pixel_x = -22; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aWS" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aWT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aWU" = (/obj/machinery/door/airlock/maintenance{name = "Bar Office Maintenance"; req_access_txt = "25"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aWV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{sortType = 19},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aWW" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aWX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 5; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aWY" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aWZ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXa" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aWK" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aWL" = (/obj/machinery/door/airlock{name = "Unisex Showers"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"aWM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"aWN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/bar)
+"aWO" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
+"aWP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aWQ" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/storage/secure/safe{pixel_x = -22; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aWR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"aWS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"aWT" = (/obj/machinery/door/window{dir = 4; name = "Bar Door"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"aWU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 5; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aWV" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aWW" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aWX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aWY" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aWZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXa" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aXb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aXh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aXi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/chapel/main)
-"aXm" = (/obj/machinery/mass_driver{dir = 4; id_tag = "chapelgun"},/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/chapel/main)
-"aXn" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/chapel/main)
+"aXj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/chapel/main)
+"aXk" = (/obj/machinery/mass_driver{dir = 4; id_tag = "chapelgun"},/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/chapel/main)
+"aXl" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/chapel/main)
+"aXm" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/arrival/station)
+"aXn" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_r"},/turf/space,/area/shuttle/arrival/station)
"aXo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/chapel/main)
-"aXp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"aXq" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/arrival/station)
+"aXp" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/arrival/station)
+"aXq" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Cryo and Arrivals Super APC"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
"aXr" = (/obj/effect/landmark{name = "HONKsquad"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aXs" = (/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aXt" = (/obj/machinery/computer/arcade,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
@@ -2572,181 +2572,171 @@
"aXx" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aXy" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aXz" = (/obj/effect/landmark{name = "HONKsquad"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"aXA" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/arrival/station)
-"aXB" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/arrival/station)
-"aXC" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Cryo and Arrivals Super APC"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aXD" = (/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/flash,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2)
-"aXE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/checkpoint2)
+"aXA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/checkpoint2)
+"aXB" = (/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/flash,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2)
+"aXC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint2)
+"aXD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aXF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/checkpoint2)
"aXG" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/checkpoint2)
-"aXH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint2)
+"aXH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aXI" = (/obj/structure/table/glass,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXJ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{name = "Garden"; req_access_txt = "0"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aXO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/storage/primary)
-"aXP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aXJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aXL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{name = "Garden"; req_access_txt = "0"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aXM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aXN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aXO" = (/obj/machinery/camera{c_tag = "Vault"; dir = 4; network = list("SS13")},/obj/structure/closet/crate{name = "Gold Crate"},/obj/item/stack/sheet/mineral/gold{pixel_x = -1; pixel_y = 5},/obj/item/stack/sheet/mineral/gold{pixel_y = 2},/obj/item/stack/sheet/mineral/gold{pixel_x = 1; pixel_y = -2},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/belt/champion,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
+"aXP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage)
"aXQ" = (/turf/simulated/floor/plasteel,/area/storage/primary)
-"aXR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aXR" = (/obj/item/weapon/coin/silver{pixel_x = 7; pixel_y = 12},/obj/item/weapon/coin/silver{pixel_x = 12; pixel_y = 7},/obj/item/weapon/coin/silver{pixel_x = 4; pixel_y = 8},/obj/item/weapon/coin/silver{pixel_x = -6; pixel_y = 5},/obj/item/weapon/coin/silver{pixel_x = 5; pixel_y = -8},/obj/structure/closet/crate{name = "Silver Crate"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
"aXS" = (/obj/machinery/lapvend,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aXT" = (/obj/machinery/camera{c_tag = "Vault"; dir = 4; network = list("SS13")},/obj/structure/closet/crate{name = "Gold Crate"},/obj/item/stack/sheet/mineral/gold{pixel_x = -1; pixel_y = 5},/obj/item/stack/sheet/mineral/gold{pixel_y = 2},/obj/item/stack/sheet/mineral/gold{pixel_x = 1; pixel_y = -2},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/belt/champion,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
-"aXU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage)
-"aXV" = (/obj/item/weapon/coin/silver{pixel_x = 7; pixel_y = 12},/obj/item/weapon/coin/silver{pixel_x = 12; pixel_y = 7},/obj/item/weapon/coin/silver{pixel_x = 4; pixel_y = 8},/obj/item/weapon/coin/silver{pixel_x = -6; pixel_y = 5},/obj/item/weapon/coin/silver{pixel_x = 5; pixel_y = -8},/obj/structure/closet/crate{name = "Silver Crate"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
-"aXW" = (/obj/machinery/camera{c_tag = "Gateway"; dir = 4; network = list("SS13")},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel,/area/gateway)
+"aXT" = (/obj/machinery/camera{c_tag = "Gateway"; dir = 4; network = list("SS13")},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel,/area/gateway)
+"aXU" = (/obj/structure/table,/obj/item/device/radio{pixel_y = 6},/obj/item/device/radio{pixel_x = 6; pixel_y = 4},/obj/item/device/radio{pixel_x = -6; pixel_y = 4},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/gateway)
+"aXV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/gateway)
+"aXW" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots{pixel_y = -5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aXX" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel,/area/gateway)
-"aXY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/gateway)
-"aXZ" = (/obj/structure/table,/obj/item/device/radio{pixel_y = 6},/obj/item/device/radio{pixel_x = 6; pixel_y = 4},/obj/item/device/radio{pixel_x = -6; pixel_y = 4},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/gateway)
+"aXY" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aXZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aYa" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel,/area/gateway)
-"aYb" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots{pixel_y = -5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aYc" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aYd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aYe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/evaguide,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aYf" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/nitrogen,/obj/item/clothing/suit/space/eva/vox,/obj/item/clothing/mask/breath/vox,/obj/item/clothing/head/helmet/space/eva/vox,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/ai_monitored/storage/eva)
-"aYg" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aYb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/evaguide,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aYc" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aYd" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"aYe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aYf" = (/obj/machinery/modular_computer/console/preset/command,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/bridge)
+"aYg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "greencorner"},/area/bridge)
"aYh" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aYi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep)
-"aYj" = (/obj/machinery/camera{c_tag = "Dormitories South"; c_tag_order = 999; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
-"aYk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"aYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aYm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aYn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aYo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/toilet)
-"aYp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/toilet)
-"aYq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/crew_quarters/toilet)
-"aYr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar)
-"aYs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aYt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aYu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aYv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/bridge)
+"aYj" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/bridge)
+"aYk" = (/obj/machinery/door/window/eastright{name = "Coroner Office"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"aYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"aYm" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"aYn" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYo" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes/stokcubes,/obj/item/weapon/storage/box/monkeycubes/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/wolpincubes,/obj/item/weapon/storage/box/monkeycubes/farwacubes,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
+"aYp" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
+"aYq" = (/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/coffee,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/stamp/cmo,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/glass,/obj/item/weapon/pen/multi,/obj/item/weapon/book/manual/sop_medical,/obj/item/device/megaphone,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
+"aYr" = (/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/obj/machinery/computer/card/minor/cmo,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo)
+"aYs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/obj/item/weapon/book/manual/sop_engineering,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter/zippo,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"aYu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aYw" = (/obj/effect/decal/cleanable/fungus,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fsmaint2)
-"aYx" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYz" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/chapel/office)
+"aYC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/driver_button{id_tag = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"aYD" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
"aYE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/library)
"aYF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/fsmaint2)
"aYG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aYH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aYH" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
"aYI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/chapel/office)
"aYJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/chapel/office)
"aYK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/chapel/office)
-"aYL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/chapel/office)
-"aYM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/driver_button{id_tag = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"aYN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"aYL" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
+"aYM" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
+"aYN" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/arrival/station)
"aYO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/chapel/main)
"aYP" = (/turf/simulated/wall,/area/chapel/main)
"aYQ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/chapel/main)
"aYR" = (/turf/simulated/wall/r_wall,/area/chapel/main)
"aYS" = (/turf/simulated/wall/r_wall,/area/escapepodbay)
-"aYT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
+"aYT" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"},/turf/space,/area/shuttle/arrival/station)
"aYU" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/shuttle/escape)
-"aYV" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
-"aYW" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
-"aYX" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"aYY" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/arrival/station)
+"aYV" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/arrival/station)
+"aYW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
+"aYX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2)
+"aYY" = (/obj/machinery/camera{c_tag = "Security Checkpoint"; dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint2)
"aYZ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"aZa" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/arrival/station)
-"aZb" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/arrival/station)
-"aZc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
-"aZd" = (/obj/machinery/camera{c_tag = "Security Checkpoint"; dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint2)
-"aZe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2)
+"aZa" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2)
+"aZb" = (/obj/item/device/radio,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/checkpoint2)
+"aZc" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aZd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Garden"; dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aZe" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/stack/cable_coil{pixel_x = 2; pixel_y = -2},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/stack/tape_roll,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel,/area/storage/primary)
"aZf" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2)
-"aZg" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2)
+"aZg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
"aZh" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2)
-"aZi" = (/obj/item/device/radio,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/checkpoint2)
-"aZj" = (/obj/machinery/light/small{dir = 8},/obj/structure/table/glass,/obj/item/weapon/minihoe,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aZk" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aZi" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
+"aZj" = (/obj/machinery/light/small{dir = 8},/obj/structure/table/glass,/obj/item/weapon/cultivator,/obj/item/weapon/hatchet,/obj/item/weapon/crowbar,/obj/item/device/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"aZk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
"aZl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aZm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aZn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aZo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Garden"; dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aZp" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/stack/cable_coil{pixel_x = 2; pixel_y = -2},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/stack/tape_roll,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aZq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aZo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
+"aZp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage)
+"aZq" = (/obj/structure/safe,/obj/machinery/light_switch{pixel_y = -23},/obj/item/clothing/head/bearpelt,/obj/item/weapon/twohanded/fireaxe,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
"aZr" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aZs" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
-"aZt" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
-"aZu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage)
-"aZv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
-"aZw" = (/obj/structure/safe,/obj/machinery/light_switch{pixel_y = -23},/obj/item/clothing/head/bearpelt,/obj/item/weapon/twohanded/fireaxe,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage)
-"aZx" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/gateway)
+"aZs" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/gateway)
+"aZt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/gateway)
+"aZu" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/gateway)
+"aZv" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aZw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aZx" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"aZy" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/gateway)
-"aZz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/gateway)
+"aZz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
"aZA" = (/turf/simulated/floor/plasteel,/area/gateway)
-"aZB" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/gateway)
-"aZC" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aZD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aZE" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
+"aZB" = (/obj/machinery/computer/card/minor/ce,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"aZC" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/table,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/turf/simulated/floor/plasteel,/area/atmos)
+"aZD" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aZE" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/window/reinforced,/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aZF" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"aZG" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore)
-"aZH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aZH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding,/obj/item/clothing/head/welding,/turf/simulated/floor/plasteel,/area/atmos)
"aZI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aZJ" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
-"aZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"aZM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/toilet)
-"aZN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aZO" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aZP" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aZQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/crew_quarters/toilet)
-"aZR" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aZS" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aZT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/wall,/area/crew_quarters/bar)
-"aZU" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aZN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aZV" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aZW" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/window/reinforced,/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aZX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aZY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aZZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"baa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bab" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bac" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bad" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = 20; tag = "icon-pipe-j1s (EAST)"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bae" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"baf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bag" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bah" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bai" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"baj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/fsmaint2)
-"bak" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bal" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bam" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"ban" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bao" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/lattice,/turf/space,/area/space)
-"bap" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"baq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aZW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aZX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aZY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aZZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = 20; tag = "icon-pipe-j1s (EAST)"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"baa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bab" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bac" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bad" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/fsmaint2)
+"bae" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"baf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bag" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bah" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bai" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"baj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/lattice,/turf/space,/area/space)
+"bak" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bal" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bam" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/library)
+"ban" = (/obj/machinery/door/airlock/maintenance{name = "Library Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bao" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/stack/packageWrap,/turf/simulated/floor/wood,/area/library)
+"bap" = (/obj/machinery/door/airlock/maintenance{name = "Crematorium Maintenance"; req_access_txt = "27"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"baq" = (/obj/machinery/camera{c_tag = "Chapel Chaplain's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bar" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/library)
-"bas" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/library)
-"bat" = (/obj/machinery/door/airlock/maintenance{name = "Library Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bas" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small{dir = 1},/obj/machinery/requests_console{department = "Chapel"; name = "Chapel Requests Console"; departmentType = 2; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"bat" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bau" = (/turf/simulated/wall,/area/library)
"bav" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/obj/item/weapon/storage/box/characters,/turf/simulated/floor/wood,/area/library)
-"baw" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/stack/packageWrap,/turf/simulated/floor/wood,/area/library)
+"baw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bax" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/library)
"bay" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/chapel/office)
"baz" = (/turf/simulated/wall,/area/chapel/office)
-"baA" = (/obj/machinery/door/airlock/maintenance{name = "Crematorium Maintenance"; req_access_txt = "27"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"baA" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"baB" = (/obj/structure/closet/secure_closet/chaplain,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"baC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small{dir = 1},/obj/machinery/requests_console{department = "Chapel"; name = "Chapel Requests Console"; departmentType = 2; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"baD" = (/obj/machinery/camera{c_tag = "Chapel Chaplain's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"baE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"baC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"baD" = (/obj/structure/table/glass,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"baE" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"baF" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"baG" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"baH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"baG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/escapepodbay)
+"baH" = (/obj/machinery/camera{c_tag = "Departure Lounge Podbay"; dir = 2; network = list("SS13")},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "escapepodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay)
"baI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"baJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"baK" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"baL" = (/obj/structure/table/glass,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"baJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry)
+"baK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/checkpoint2)
+"baL" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint2)
"baM" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/escapepodbay)
"baN" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/crowbar/red,/turf/simulated/floor/plasteel,/area/escapepodbay)
"baO" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/stock_parts/cell,/obj/item/device/flashlight,/turf/simulated/floor/plasteel,/area/escapepodbay)
-"baP" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/escapepodbay)
+"baP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"baQ" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/engine,/area/escapepodbay)
"baR" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/escapepodbay)
-"baS" = (/obj/machinery/camera{c_tag = "Departure Lounge Podbay"; dir = 2; network = list("SS13")},/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "escapepodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay)
+"baS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/maintenance/fpmaint2)
"baT" = (/turf/simulated/floor/engine,/area/escapepodbay)
"baU" = (/obj/structure/spacepoddoor{luminosity = 3},/turf/simulated/floor/engine,/area/escapepodbay)
"baV" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine/vacuum,/area/escapepodbay)
@@ -2755,171 +2745,167 @@
"baY" = (/turf/simulated/shuttle/wall{icon_state = "swallc3"},/area/shuttle/escape)
"baZ" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"bba" = (/obj/effect/landmark{name = "Observer-Start"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"bbb" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry)
-"bbc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/checkpoint2)
-"bbd" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/security/checkpoint2)
-"bbe" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint2)
-"bbf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/maintenance/fpmaint2)
-"bbg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"bbb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
+"bbc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bbd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bbe" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bbf" = (/obj/machinery/door/airlock/vault{icon_state = "door_locked"; locked = 1; req_access_txt = "53"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/security/nuke_storage)
+"bbg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway)
"bbh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"bbi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/plantspray/pests,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/rh,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
+"bbi" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/gateway)
"bbj" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plasteel,/area/storage/primary)
-"bbk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bbk" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/gateway)
"bbl" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel,/area/storage/primary)
"bbm" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/storage/primary)
-"bbn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/storage/primary)
-"bbo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bbn" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/l3closet/scientist,/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel,/area/gateway)
+"bbo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Entertainer Suits"; req_access_txt = "0"; req_one_access_txt = "18;46"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"bbp" = (/obj/structure/table,/obj/item/weapon/weldingtool,/obj/item/weapon/crowbar,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel,/area/storage/primary)
"bbq" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/nuke_storage)
-"bbr" = (/obj/machinery/door/airlock/vault{icon_state = "door_locked"; locked = 1; req_access_txt = "53"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/security/nuke_storage)
-"bbs" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/gateway)
-"bbt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway)
-"bbu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/gateway)
-"bbv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/l3closet/scientist,/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel,/area/gateway)
-"bbw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Entertainer Suits"; req_access_txt = "0"; req_one_access_txt = "18;46"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"bbr" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bbs" = (/obj/structure/sign/directions/security{dir = 1; pixel_y = 7},/turf/simulated/wall,/area/hallway/primary/central/north)
+"bbt" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/north)
+"bbu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"bbv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
+"bbw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"bbx" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"bby" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
"bbz" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
-"bbA" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/north)
-"bbB" = (/obj/structure/sign/directions/security{dir = 1; pixel_y = 7},/turf/simulated/wall,/area/hallway/primary/central/north)
+"bbA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bbB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = -28; pixel_y = 4},/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bbC" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"bbD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
"bbE" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central/ne)
"bbF" = (/turf/simulated/wall,/area/hallway/primary/central/ne)
-"bbG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
-"bbH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Dormitories"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
-"bbI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"bbG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/maintenance/fsmaint2)
+"bbH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/window/southleft{tag = "icon-left (WEST)"; name = "Bar Delivery"; icon_state = "left"; dir = 8; req_access_txt = "25"; base_state = "left"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"bbI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"bbJ" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"bbK" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"bbL" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"bbM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/crew_quarters/bar)
-"bbN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = -28; pixel_y = 4},/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bbO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bbP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/window/southleft{tag = "icon-left (WEST)"; name = "Bar Delivery"; icon_state = "left"; dir = 8; req_access_txt = "25"; base_state = "left"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
-"bbQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/maintenance/fsmaint2)
-"bbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bbS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bbT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bbU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bbV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen)
-"bbW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen)
-"bbX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bbY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery"; location = "Kitchen"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/maintenance/fsmaint2)
-"bbZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bca" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bcb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bcc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bcd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = 21; tag = "icon-pipe-j1s (EAST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bce" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bcf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 17},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bcg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics)
-"bch" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/hydroponics)
-"bci" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics)
-"bcj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/hydroponics)
-"bck" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics)
-"bcl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen)
+"bbQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen)
+"bbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery"; location = "Kitchen"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/maintenance/fsmaint2)
+"bbT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = 21; tag = "icon-pipe-j1s (EAST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 17},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bbZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bca" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/hydroponics)
+"bcb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics)
+"bcc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/hydroponics)
+"bcd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics)
+"bce" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bcf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics)
+"bcg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/library)
+"bch" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/camera{c_tag = "Library North"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/library)
+"bci" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
+"bcj" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
+"bck" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bcl" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/storage/fancy/crayons,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bcm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/library)
-"bcn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/library)
+"bcn" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
"bco" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/library)
"bcp" = (/turf/simulated/floor/wood,/area/library)
-"bcq" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/camera{c_tag = "Library North"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/library)
-"bcr" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
+"bcq" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Escape Podbay APC"; pixel_x = -25},/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bcr" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station)
"bcs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/library)
-"bct" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
+"bct" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcu" = (/obj/structure/crematorium,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bcv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bcv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bcx" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"bcy" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/storage/fancy/crayons,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"bcy" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry)
"bcz" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bcA" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"bcB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bcC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bcD" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bcE" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bcE" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry)
"bcF" = (/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
-"bcG" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Escape Podbay APC"; pixel_x = -25},/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bcG" = (/obj/machinery/camera{c_tag = "Arrivals Lounge"; dir = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcH" = (/turf/simulated/floor/plasteel,/area/escapepodbay)
"bcI" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/escapepodbay)
"bcJ" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost","Telecomms")},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bcK" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bcL" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"bcM" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station)
+"bcM" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcN" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"bcO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bcP" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bcQ" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry)
-"bcR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry)
+"bcO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
+"bcP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table/glass,/obj/item/weapon/hatchet,/obj/item/weapon/cultivator,/obj/item/weapon/crowbar,/obj/item/device/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"})
+"bcQ" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/plant_analyzer,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -6; pixel_y = -25},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
+"bcR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
"bcS" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/entry)
-"bcT" = (/obj/machinery/camera{c_tag = "Arrivals Lounge"; dir = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bcU" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bcT" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plasteel,/area/storage/primary)
+"bcU" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/storage/primary)
"bcV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/sign/double/map/left{pixel_y = 31},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/double/map/right{pixel_y = 31},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/hallway/secondary/construction{name = "\improper Garden"})
-"bcY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table/glass,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/obj/item/weapon/crowbar,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hallway/secondary/construction{name = "\improper Garden"})
-"bcZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"bda" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -6; pixel_y = -25},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
+"bcY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/port)
+"bcZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/hallway/primary/port)
+"bda" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/door_control{id = "stationawaygate"; name = "Gateway Shutters Access Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway)
"bdb" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/turf/simulated/floor/plasteel,/area/storage/primary)
-"bdc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"bdc" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/gateway)
"bdd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/primary)
"bde" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/storage/primary)
-"bdf" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plasteel,/area/storage/primary)
+"bdf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/gateway)
"bdg" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel,/area/storage/primary)
"bdh" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/storage/primary)
"bdi" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/storage/primary)
-"bdj" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/storage/primary)
+"bdj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/gateway)
"bdk" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel,/area/storage/primary)
-"bdl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/port)
-"bdm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/hallway/primary/port)
-"bdn" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/gateway)
-"bdo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/door_control{id = "stationawaygate"; name = "Gateway Shutters Access Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway)
-"bdp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/gateway)
-"bdq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/gateway)
+"bdl" = (/obj/item/clothing/suit/space/eva/clown,/obj/item/clothing/head/helmet/space/eva/clown,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"bdm" = (/obj/item/clothing/suit/space/eva/mime,/obj/item/clothing/head/helmet/space/eva/mime,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"bdn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"bdo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Sout-West"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"bdp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"bdq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"bdr" = (/obj/machinery/light{dir = 4},/obj/effect/decal/warning_stripes/southwest,/obj/structure/closet/secure_closet/exile,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/gateway)
-"bds" = (/obj/item/clothing/suit/space/eva/mime,/obj/item/clothing/head/helmet/space/eva/mime,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"bdt" = (/obj/item/clothing/suit/space/eva/clown,/obj/item/clothing/head/helmet/space/eva/clown,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"bdu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"bdv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Sout-West"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"bdw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"bdx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA South-East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
-"bdy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"bds" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA South-East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"bdt" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Central Hallway North"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/item/flag/nt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north)
+"bdu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north)
+"bdv" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bdw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/item/flag/nt,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north)
+"bdx" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bdy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/north)
"bdz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"bdA" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north)
-"bdB" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Central Hallway North"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/item/flag/nt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north)
-"bdC" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bdA" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/central/ne)
+"bdB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/hallway/primary/central/ne)
+"bdC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"bdD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
-"bdE" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/north)
-"bdF" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/item/flag/nt,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north)
-"bdG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/north)
+"bdE" = (/obj/machinery/camera{c_tag = "Dormitories Toilets"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"bdF" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Office"; req_access_txt = "25"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
"bdH" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central/ne)
"bdI" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne)
-"bdJ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/hallway/primary/central/ne)
-"bdK" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/central/ne)
-"bdL" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"bdM" = (/obj/machinery/camera{c_tag = "Dormitories Toilets"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
+"bdJ" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bdK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bdL" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bdM" = (/obj/machinery/camera{c_tag = "Kitchen Freezer"; network = list("SS13")},/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bdN" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"bdO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/bar)
-"bdP" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Office"; req_access_txt = "25"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
+"bdP" = (/obj/machinery/navbeacon{codes_txt = "delivery"; location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/maintenance/fsmaint2)
"bdQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/crew_quarters/bar)
"bdR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/bar)
-"bdS" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access_txt = "12"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bdS" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"bdT" = (/turf/simulated/wall,/area/crew_quarters/kitchen)
"bdU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bdV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bdW" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bdX" = (/obj/machinery/camera{c_tag = "Kitchen Freezer"; network = list("SS13")},/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bdY" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bdZ" = (/obj/machinery/navbeacon{codes_txt = "delivery"; location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/maintenance/fsmaint2)
+"bdV" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/camera{c_tag = "Hydroponics Storage"; network = list("SS13")},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bdW" = (/obj/structure/table,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/reagentgrinder,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bdX" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bdY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/crema_switch{pixel_x = 25},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bdZ" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{dir = 8; name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"bea" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hydroponics)
"beb" = (/turf/simulated/wall,/area/hydroponics)
"bec" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/hydroponics)
-"bed" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bed" = (/obj/item/weapon/storage/bible,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"bee" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall,/area/hydroponics)
"bef" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hydroponics)
-"beg" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/camera{c_tag = "Hydroponics Storage"; network = list("SS13")},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"beh" = (/obj/structure/table,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/reagentgrinder,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"beg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/escapepodbay)
+"beh" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/arrival/station)
"bei" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/item/weapon/paper/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bej" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bej" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station)
"bek" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library)
"bel" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/wood,/area/library)
"bem" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/library)
@@ -2928,356 +2914,350 @@
"bep" = (/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor/wood,/area/library)
"beq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall,/area/chapel/office)
"ber" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bes" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/crema_switch{pixel_x = 25},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bes" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"bet" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp{pixel_y = 10},/obj/structure/disposalpipe/segment,/obj/item/device/eftpos,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"beu" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"bev" = (/obj/structure/table/woodentable,/obj/item/weapon/nullrod,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"bev" = (/obj/structure/table/woodentable,/obj/item/device/soulstone/anybody/chaplain,/obj/item/weapon/nullrod,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bew" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"bex" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{dir = 8; name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bey" = (/obj/item/weapon/storage/bible,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
-"bez" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bex" = (/obj/machinery/requests_console{department = "Arrival Shuttle"; name = "Arrival Shuttle Requests Console"; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
+"bey" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_l"},/turf/space,/area/shuttle/arrival/station)
+"bez" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry)
"beA" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"beB" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"beC" = (/turf/simulated/shuttle/floor,/area/shuttle/escape)
"beD" = (/obj/machinery/computer/crew,/obj/machinery/status_display{pixel_y = 30},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"beE" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/arrival/station)
-"beF" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station)
+"beE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"beF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/entry)
"beG" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"beH" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"beI" = (/obj/machinery/requests_console{department = "Arrival Shuttle"; name = "Arrival Shuttle Requests Console"; pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
-"beJ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/arrival/station)
-"beK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"beL" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry)
+"beH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/secondary/entry)
+"beI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"beJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/storage/primary)
+"beK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port)
+"beL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/port)
"beM" = (/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/entry)
-"beN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/hallway/secondary/entry)
-"beO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/secondary/entry)
+"beN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/hallway/primary/port)
+"beO" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/hallway/primary/port)
"beP" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
"beQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Garden"},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"beR" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/primary)
-"beS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
-"beT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/storage/primary)
+"beS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port)
+"beT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Gateway Access"; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway)
"beU" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/storage/primary)
-"beV" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/port)
-"beW" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port)
-"beX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/hallway/primary/port)
-"beY" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/hallway/primary/port)
-"beZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port)
+"beV" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway)
+"beW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway)
+"beX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "0"; req_one_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
+"beY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
+"beZ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/north)
"bfa" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"bfb" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/command{name = "Gateway Access"; req_access_txt = "62"},/turf/simulated/floor/plasteel,/area/gateway)
-"bfc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway)
-"bfd" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "stationawaygate"; name = "Gateway Access Shutters"},/turf/simulated/floor/plasteel,/area/gateway)
+"bfb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
+"bfc" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bfd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/north)
"bfe" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/gateway)
"bff" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"bfg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"bfh" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/sign/securearea,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"bfi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "0"; req_one_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"bfj" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
-"bfk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/north)
-"bfl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
-"bfm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/north)
+"bfi" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/central/ne)
+"bfj" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bfk" = (/obj/machinery/requests_console{department = "Bar"; name = "Bar Requests Console"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bfl" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"bfn" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne)
"bfo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne)
"bfp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne)
"bfq" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne)
-"bfr" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/central/ne)
+"bfr" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"bfs" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/boozeomat,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
"bft" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bfu" = (/obj/machinery/requests_console{department = "Bar"; name = "Bar Requests Console"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bfv" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/soda,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bfw" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bfx" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"bfy" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"bfz" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
+"bfv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bfw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bfx" = (/obj/machinery/door/window/eastright{tag = "icon-right"; name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access_txt = "35"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera{c_tag = "Hydroponics Pasture"; network = list("SS13")},/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
+"bfz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/hydroponics/soil,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/grass,/area/hydroponics)
"bfA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bfB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bfB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"bfC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bfD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bfD" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/closet/secure_closet/hydroponics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"bfE" = (/mob/living/simple_animal/hostile/retaliate/goat,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bfF" = (/obj/machinery/door/window/eastright{tag = "icon-right"; name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access_txt = "35"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera{c_tag = "Hydroponics Pasture"; network = list("SS13")},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
-"bfH" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
-"bfI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/grass,/area/hydroponics)
-"bfJ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
-"bfK" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfL" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfM" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfO" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/closet/secure_closet/hydroponics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bfT" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bfU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"bfV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/library)
-"bfW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{dir = 8},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library)
-"bfX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/library)
+"bfF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfH" = (/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
+"bfI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfJ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
+"bfK" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfM" = (/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfN" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bfO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bfP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/library)
+"bfQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bfR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/library)
+"bfS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{dir = 8},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library)
+"bfT" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/library)
+"bfU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bfV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Chapel Crematorium"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bfW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"bfX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Crematorium"; req_access_txt = "27"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"bfY" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/sop_service,/turf/simulated/floor/wood,/area/library)
"bfZ" = (/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/item/weapon/book/manual/sop_general,/turf/simulated/floor/wood,/area/library)
-"bga" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/library)
-"bgb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Chapel Crematorium"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bgc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bgd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Crematorium"; req_access_txt = "27"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bge" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"bga" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/escapepodbay)
+"bgb" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bgc" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/engine,/area/escapepodbay)
+"bgd" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "escapepodbay"; layer = 3.1; req_one_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay)
+"bge" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
"bgf" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bgg" = (/obj/machinery/light/small,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
-"bgh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/escapepodbay)
+"bgh" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
"bgi" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/escapepodbay)
-"bgj" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bgj" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
"bgk" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/unary/vent_pump,/obj/effect/decal/warning_stripes/yellow/hollow,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/escapepodbay)
-"bgl" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/engine,/area/escapepodbay)
+"bgl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/entry)
"bgm" = (/obj/machinery/light,/turf/simulated/floor/engine,/area/escapepodbay)
-"bgn" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "escapepodbay"; layer = 3.1; req_one_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay)
+"bgn" = (/obj/machinery/door/firedoor,/obj/machinery/light{dir = 1},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bgo" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bgp" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"bgq" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
-"bgr" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
+"bgq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bgs" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
"bgt" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
-"bgu" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
+"bgu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bgv" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry)
-"bgw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/secondary/entry)
-"bgx" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/light{dir = 1},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bgy" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgx" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bgy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bgz" = (/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgA" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgB" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgA" = (/obj/machinery/light{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/port)
+"bgB" = (/obj/machinery/camera{c_tag = "Port Hallway 2"; dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
+"bgC" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
"bgD" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgE" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
"bgF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgG" = (/obj/machinery/light{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/port)
-"bgH" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
-"bgI" = (/obj/machinery/camera{c_tag = "Port Hallway 2"; dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
-"bgJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
-"bgK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
-"bgL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/port)
+"bgG" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bgH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/port)
+"bgI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/port)
+"bgJ" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgL" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
"bgM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgN" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bgP" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bgN" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bgO" = (/obj/machinery/camera{c_tag = "Central Hallway North-West"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bgP" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/nw)
"bgQ" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bgR" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bgR" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bgS" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bgT" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bgU" = (/obj/machinery/camera{c_tag = "Central Hallway North-West"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bgV" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bgW" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bgX" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/nw)
-"bgY" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bgZ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
+"bgT" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
+"bgU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
+"bgV" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
+"bgW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "L11"},/area/hallway/primary/central/north)
+"bgX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
+"bgY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{desc = ""; icon_state = "L13"; name = "floor"},/area/hallway/primary/central/north)
+"bgZ" = (/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/central/ne)
"bha" = (/turf/simulated/floor/plasteel{icon_state = "L1"},/area/hallway/primary/central/north)
"bhb" = (/turf/simulated/floor/plasteel{icon_state = "L3"},/area/hallway/primary/central/north)
"bhc" = (/turf/simulated/floor/plasteel{icon_state = "L5"},/area/hallway/primary/central/north)
"bhd" = (/turf/simulated/floor/plasteel{icon_state = "L7"},/area/hallway/primary/central/north)
"bhe" = (/turf/simulated/floor/plasteel{icon_state = "L9"},/area/hallway/primary/central/north)
-"bhf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "L11"},/area/hallway/primary/central/north)
-"bhg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{desc = ""; icon_state = "L13"; name = "floor"},/area/hallway/primary/central/north)
-"bhh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
-"bhi" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bhj" = (/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/central/ne)
-"bhk" = (/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/central/ne)
-"bhl" = (/obj/machinery/camera{c_tag = "Central Hallway North-East"; dir = 2; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bhm" = (/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bhn" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bho" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bhf" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bhg" = (/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/central/ne)
+"bhh" = (/obj/machinery/camera{c_tag = "Central Hallway North-East"; dir = 2; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bhi" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bhj" = (/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bhk" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bhl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/book/manual/sop_service,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bhm" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bho" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bhp" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"bhq" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"bhr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bhs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/book/manual/sop_service,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bhs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bht" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bhu" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bhu" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bhv" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bhw" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bhw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bhx" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"bhy" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"bhz" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"bhA" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bhB" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bhC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bhD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bhE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhF" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
-"bhG" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/mob/living/simple_animal/pig,/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
-"bhH" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
-"bhI" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
-"bhJ" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Hydroponics Pasture"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhM" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhN" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhB" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/mob/living/simple_animal/pig,/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
+"bhC" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
+"bhD" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
+"bhE" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
+"bhF" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Hydroponics Pasture"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhI" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bhK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/library)
+"bhL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/library)
+"bhM" = (/obj/machinery/light{dir = 1},/obj/structure/reagent_dispensers/watertank/high,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bhN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"bhO" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bhP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"bhQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"bhR" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bhS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/library)
+"bhS" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bhT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library)
"bhU" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library)
"bhV" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library)
-"bhW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/library)
+"bhW" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"bhX" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bhY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bhZ" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"bia" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"bib" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"bic" = (/obj/machinery/camera{c_tag = "Chapel North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bid" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bie" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bif" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Escape Pod Bay"},/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bhY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bhZ" = (/obj/machinery/camera{c_tag = "Chapel North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bia" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bib" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Escape Pod Bay"},/turf/simulated/floor/plasteel,/area/escapepodbay)
+"bic" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"bid" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
+"bie" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bif" = (/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."; dir = 4; icon_state = "plaque"; name = "Comemmorative Plaque"},/area/hallway/secondary/entry)
"big" = (/turf/simulated/wall,/area/escapepodbay)
"bih" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/escapepodbay)
"bii" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/escapepodbay)
-"bij" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"bij" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHW"; location = "Lockers"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bik" = (/obj/machinery/computer/robotics,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bil" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bim" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bin" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"bio" = (/obj/machinery/door/firedoor{dir = 2},/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bip" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
-"biq" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bio" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bip" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bir" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
"bis" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/simulated/floor/carpet,/area/hallway/secondary/entry)
"bit" = (/turf/simulated/floor/carpet,/area/hallway/secondary/entry)
"biu" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
"biv" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry)
-"biw" = (/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."; dir = 4; icon_state = "plaque"; name = "Comemmorative Plaque"},/area/hallway/secondary/entry)
-"bix" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"biy" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHW"; location = "Lockers"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biI" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"biS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"biT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"biw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bix" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biB" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biK" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"biM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"biN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"biO" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Lockers"; location = "EVA"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L6"},/area/hallway/primary/central/north)
+"biP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L12"},/area/hallway/primary/central/north)
+"biQ" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Security"; location = "EVA2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L10"},/area/hallway/primary/central/north)
+"biR" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{desc = ""; icon_state = "L14"},/area/hallway/primary/central/north)
+"biS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"biT" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"biU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
"biV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
"biW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L2"},/area/hallway/primary/central/north)
"biX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L4"},/area/hallway/primary/central/north)
-"biY" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Lockers"; location = "EVA"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L6"},/area/hallway/primary/central/north)
+"biY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"biZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L8"},/area/hallway/primary/central/north)
-"bja" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Security"; location = "EVA2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L10"},/area/hallway/primary/central/north)
-"bjb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L12"},/area/hallway/primary/central/north)
-"bjc" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{desc = ""; icon_state = "L14"},/area/hallway/primary/central/north)
+"bja" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bjc" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"bjd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"bje" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bjf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bjg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bjh" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bji" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bjf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bjg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bjh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/closet/crate/freezer,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bji" = (/turf/simulated/floor/grass,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/hydroponics)
"bjj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
"bjk" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bjl" = (/obj/machinery/door/window{dir = 4; name = "Bar Door"; req_access_txt = "25"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bjl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"bjm" = (/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"bjn" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
+"bjn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel Office"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"bjo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bjp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bjp" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bjq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/gibber,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bjr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/closet/crate/freezer,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bjs" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bjr" = (/obj/machinery/camera{c_tag = "Departure Lounge North"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bjs" = (/obj/structure/closet/emcloset,/obj/machinery/light{dir = 1; on = 1},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bjt" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bju" = (/turf/simulated/floor/grass,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/hydroponics)
+"bju" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/camera{c_tag = "Departure Lounge Security"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bjv" = (/turf/simulated/floor/grass,/area/hydroponics)
"bjw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/grass,/area/hydroponics)
"bjx" = (/mob/living/simple_animal/cow{name = "Betsy"},/turf/simulated/floor/grass,/area/hydroponics)
"bjy" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics)
"bjz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/hydroponics)
-"bjA" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/hydroponics)
+"bjA" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/effect/decal/warning_stripes/east,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bjB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics)
-"bjC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bjC" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"bjD" = (/obj/machinery/bookbinder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library)
"bjE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library)
"bjF" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/library)
-"bjG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel Office"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
-"bjH" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bjG" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"bjH" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bjI" = (/obj/machinery/light/small{dir = 1},/obj/structure/stool/bed/chair,/obj/item/device/radio/intercom/locked/confessional{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bjJ" = (/obj/machinery/camera{c_tag = "Departure Lounge North"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bjJ" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
"bjK" = (/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bjL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/secondary/exit)
"bjM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bjN" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bjO" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bjP" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/machinery/light{dir = 1; on = 1},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bjQ" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bjP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bjQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/hallway/secondary/entry)
"bjR" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit)
-"bjS" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
-"bjT" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
-"bjU" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"bjV" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"bjW" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
-"bjX" = (/obj/item/device/radio/beacon,/obj/machinery/camera{c_tag = "Arrivals South"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"bjY" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"bjZ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry)
-"bka" = (/obj/machinery/camera{c_tag = "Arrivals Center"; dir = 4; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
-"bkb" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/item/weapon/lighter{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
+"bjS" = (/obj/item/device/radio/beacon,/obj/machinery/camera{c_tag = "Arrivals South"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
+"bjT" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
+"bjU" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry)
+"bjV" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
+"bjW" = (/obj/machinery/camera{c_tag = "Arrivals Center"; dir = 4; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
+"bjX" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/item/weapon/lighter{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
+"bjY" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bjZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bka" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkb" = (/obj/machinery/camera{c_tag = "Port Hallway 3"; dir = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bkc" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/hallway/secondary/entry)
"bkd" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry)
-"bke" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkf" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bke" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bkg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkh" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkh" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"bki" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkj" = (/obj/machinery/camera{c_tag = "Port Hallway 3"; dir = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkm" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bko" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkp" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkk" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkm" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkn" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bko" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"bkq" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
"bkr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bks" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkt" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bku" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkv" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"bkw" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bkx" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bky" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bkz" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=QM"; location = "CHW"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bkA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bkB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bkC" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bkD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bkE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
-"bkF" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
-"bkG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
-"bkH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
-"bkI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
-"bkJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
-"bkK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
-"bkL" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bks" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bkt" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=QM"; location = "CHW"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bku" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bkv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
+"bkw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
+"bkx" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bky" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
+"bkz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bkA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
+"bkB" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bkC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bkD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bkE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/north)
+"bkF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
+"bkG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
+"bkH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bkI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
+"bkK" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
+"bkL" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/freezer{req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bkM" = (/obj/machinery/slot_machine,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
"bkN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/slot_machine,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
"bkO" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
"bkP" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bkQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bkR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
-"bkS" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"bkT" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/freezer{req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"bkU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
-"bkV" = (/turf/simulated/floor/grass,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/hydroponics)
-"bkW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/flora/ausbushes/fullgrass,/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
-"bkX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/portable_atmospherics/hydroponics/soil,/mob/living/simple_animal/chicken{name = "Commander Clucky"},/turf/simulated/floor/grass,/area/hydroponics)
-"bkY" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/grass,/area/hydroponics)
-"bkZ" = (/obj/machinery/botany/editor,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bla" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; name = "Hydroponics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/botany/extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"blb" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bkQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"bkR" = (/turf/simulated/floor/grass,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/hydroponics)
+"bkS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/hydroponics/soil,/mob/living/simple_animal/chicken{name = "Commander Clucky"},/turf/simulated/floor/grass,/area/hydroponics)
+"bkT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; name = "Hydroponics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/plantgenes,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bkU" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bkV" = (/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/obj/machinery/vending/hydroseeds,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bkW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/flora/ausbushes/fullgrass,/obj/machinery/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics)
+"bkX" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
+"bkY" = (/obj/machinery/hydroponics/soil,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/grass,/area/hydroponics)
+"bkZ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/invisible,/obj/machinery/camera{c_tag = "Library Study"; dir = 8; network = list("SS13")},/obj/item/stack/tape_roll,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
+"bla" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "Camera"; pictures_left = 30; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
+"blb" = (/obj/structure/reagent_dispensers/watertank/high,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
"blc" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bld" = (/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/obj/machinery/vending/hydroseeds,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bld" = (/obj/machinery/hologram/holopad,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"ble" = (/obj/machinery/biogenerator,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
"blf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
"blg" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
@@ -3286,129 +3266,128 @@
"blj" = (/turf/simulated/floor/carpet,/area/library)
"blk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/library)
"bll" = (/obj/structure/bookcase{name = "bookcase (Reference)"},/turf/simulated/floor/wood,/area/library)
-"blm" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"bln" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "Camera"; pictures_left = 30; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"blo" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/invisible,/obj/machinery/camera{c_tag = "Library Study"; dir = 8; network = list("SS13")},/obj/item/stack/tape_roll,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"blp" = (/obj/machinery/hologram/holopad,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"blq" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"blr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
-"bls" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"blt" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
-"blu" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"blv" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"blm" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"bln" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
+"blo" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"blp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
+"blq" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"blr" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bls" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"blt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"blu" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"blv" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"blw" = (/obj/structure/sign/poster/legit{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"blx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bly" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bly" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
"blz" = (/obj/effect/decal/warning_stripes/east,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"blA" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"blB" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"blB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
"blC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"blD" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/floor/plating,/area/shuttle/escape)
-"blE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
-"blF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"blG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
-"blH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"blE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
+"blF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"blG" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"blH" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"blI" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
"blJ" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/secondary/entry)
"blK" = (/turf/simulated/wall,/area/hallway/primary/port)
-"blL" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"blL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock{name = "Port Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
"blM" = (/turf/simulated/wall,/area/crew_quarters/locker)
-"blN" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"blO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"blN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/civilian/pet_store)
+"blO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"blP" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/port)
"blQ" = (/turf/simulated/wall,/area/maintenance/port)
"blR" = (/turf/simulated/wall,/area/storage/emergency2)
-"blS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock{name = "Port Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
+"blS" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/hallway/primary/central/nw)
"blT" = (/turf/simulated/wall,/area/civilian/pet_store)
-"blU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/civilian/pet_store)
+"blU" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/bridge)
"blV" = (/obj/machinery/door/airlock/glass{name = "Pet Store"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/civilian/pet_store)
"blW" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"blX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"blY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"blY" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/status_display{density = 0; layer = 4},/turf/simulated/floor/plating,/area/bridge)
"blZ" = (/turf/simulated/wall,/area/hallway/primary/central/nw)
-"bma" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/hallway/primary/central/nw)
+"bma" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/bridge)
"bmb" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/nw)
"bmc" = (/turf/simulated/wall/r_wall,/area/bridge)
-"bmd" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/bridge)
-"bme" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/status_display{density = 0; layer = 4},/turf/simulated/floor/plating,/area/bridge)
-"bmf" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/bridge)
-"bmg" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4},/turf/simulated/floor/plating,/area/bridge)
-"bmh" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/bridge)
+"bmd" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/bridge)
+"bme" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4},/turf/simulated/floor/plating,/area/bridge)
+"bmf" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/hallway/primary/central/ne)
+"bmg" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bmh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bmi" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne)
-"bmj" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/hallway/primary/central/ne)
+"bmj" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/obj/machinery/door/window{dir = 4; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bmk" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bml" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bmm" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bmn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/stool,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bmo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bmp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bmq" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bmr" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bms" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bmt" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/obj/machinery/door/window{dir = 4; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bmu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bmv" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bmw" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bmx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bms" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bmt" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bmu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bmv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics)
+"bmw" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics)
+"bmx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/floodlight,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
"bmy" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bmz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bmA" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics)
-"bmC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics)
-"bmD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics)
-"bmE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hydroponics)
-"bmF" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/floodlight,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bmG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hydroponics)
+"bmC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bmD" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Library East"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/library)
+"bmE" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
+"bmF" = (/obj/structure/cult/tome,/obj/item/device/videocam,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
+"bmG" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
"bmH" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"bmI" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library)
-"bmJ" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Library East"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/library)
-"bmK" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"bmL" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"bmM" = (/obj/structure/cult/tome,/obj/item/device/videocam,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"bmN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bmJ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bmK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bmL" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bmM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bmN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bmO" = (/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
"bmP" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bmQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bmQ" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/shuttle/escape)
"bmR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
-"bmS" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bmS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
"bmT" = (/obj/machinery/light/small,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom/locked/confessional{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bmU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/chapel/main)
-"bmV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bmV" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
"bmW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bmX" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"bmY" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"bmZ" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bna" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"bmZ" = (/obj/effect/decal/warning_stripes/northeastcorner,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bna" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bnb" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape)
"bnc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"bnd" = (/obj/machinery/door/firedoor{dir = 2},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bne" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"bnf" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"bng" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
-"bnh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bnd" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
+"bne" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/entry)
+"bnf" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
+"bng" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
+"bnh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
"bni" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bnj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/entry)
-"bnk" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"bnl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
-"bnn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bno" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry)
-"bnp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
-"bnq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
-"bnr" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
-"bns" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
-"bnt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/secondary/entry)
+"bnj" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry)
+"bnk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bnl" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
+"bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
+"bnn" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
+"bno" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
+"bnp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"; dir = 1},/area/hallway/secondary/entry)
+"bnq" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bnr" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bns" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bnt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
"bnu" = (/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bnv" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/port)
"bnw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/port)
-"bnx" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bnx" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plating,/area/storage/emergency2)
"bny" = (/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bnz" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bnz" = (/obj/item/device/flashlight/flare,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2)
"bnA" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bnB" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bnC" = (/obj/machinery/vending/artvend,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bnD" = (/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bnE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bnE" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store)
"bnF" = (/obj/machinery/vending/clothing,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bnG" = (/obj/machinery/vending/autodrobe,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bnH" = (/obj/machinery/vending/hatdispenser,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
@@ -3416,141 +3395,138 @@
"bnJ" = (/obj/machinery/vending/shoedispenser,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bnK" = (/turf/simulated/floor/plating,/area/maintenance/port)
"bnL" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/port)
-"bnM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bnN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bnO" = (/obj/item/device/flashlight/flare,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bnP" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store)
+"bnM" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store)
+"bnN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/storage/tools)
+"bnO" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/nw)
+"bnP" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
"bnQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/civilian/pet_store)
-"bnR" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store)
+"bnR" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 10; icon_state = "yellow"},/area/bridge)
"bnS" = (/turf/simulated/wall,/area/storage/tools)
"bnT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tools)
-"bnU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/storage/tools)
-"bnV" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/nw)
-"bnW" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bnX" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/turf/simulated/floor/plasteel,/area/bridge)
-"bnY" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 10; icon_state = "yellow"},/area/bridge)
-"bnZ" = (/obj/machinery/computer/station_alert/all,/turf/simulated/floor/plasteel{dir = 0; icon_state = "yellow"},/area/bridge)
-"boa" = (/obj/machinery/computer/monitor{name = "Bridge Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/bridge)
-"bob" = (/obj/machinery/computer/shuttle/labor,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/bridge)
-"boc" = (/obj/machinery/computer/communications,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bod" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel{dir = 6; icon_state = "blue"},/area/bridge)
-"boe" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/bridge)
-"bof" = (/obj/machinery/computer/crew,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "green"},/area/bridge)
-"bog" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{dir = 6; icon_state = "green"},/area/bridge)
+"bnU" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/turf/simulated/floor/plasteel,/area/bridge)
+"bnV" = (/obj/machinery/computer/monitor{name = "Bridge Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/bridge)
+"bnW" = (/obj/machinery/computer/station_alert/all,/turf/simulated/floor/plasteel{dir = 0; icon_state = "yellow"},/area/bridge)
+"bnX" = (/obj/machinery/computer/communications,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bnY" = (/obj/machinery/computer/shuttle/labor,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/bridge)
+"boa" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel{dir = 6; icon_state = "blue"},/area/bridge)
+"boc" = (/obj/machinery/computer/crew,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "green"},/area/bridge)
+"bod" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
+"boe" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"bof" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bog" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; layer = 3; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"boh" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/wrench,/obj/item/device/assembly/timer,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/turf/simulated/floor/plasteel,/area/bridge)
-"boi" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
-"boj" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"boi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"boj" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/kitchen_machine/grill,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bok" = (/obj/structure/piano,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bol" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bom" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bon" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; layer = 3; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"boo" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bop" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"boq" = (/obj/machinery/camera{c_tag = "Kitchen"; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/kitchen_machine/candy_maker,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bor" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/kitchen_machine/grill,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bos" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bot" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bou" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bov" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bow" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/kitchen_machine/oven,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"box" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"boy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
-"boz" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/hydroponics)
-"boA" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel,/area/hydroponics)
+"bon" = (/obj/machinery/camera{c_tag = "Kitchen"; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/kitchen_machine/candy_maker,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"boo" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bop" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"boq" = (/obj/machinery/cooker/deepfryer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bor" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bos" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/kitchen_machine/oven,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bot" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
+"bou" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bov" = (/obj/machinery/newscaster{pixel_x = 27; pixel_y = 1},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bow" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
+"box" = (/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"boy" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access_txt = "37"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
+"boz" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"boA" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
"boB" = (/turf/simulated/floor/plasteel,/area/hydroponics)
-"boC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
-"boD" = (/obj/machinery/newscaster{pixel_x = 27; pixel_y = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"boC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
+"boD" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"boE" = (/obj/structure/bookcase{name = "bookcase (Fiction)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library)
"boF" = (/obj/structure/bookcase{name = "bookcase (Fiction)"},/turf/simulated/floor/wood,/area/library)
"boG" = (/obj/structure/bookcase{name = "bookcase (Non-Fiction)"},/turf/simulated/floor/wood,/area/library)
-"boH" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access_txt = "37"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library)
-"boI" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"boH" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"boI" = (/obj/machinery/door/airlock/external{aiControlDisabled = 0; hackProof = 1; id_tag = "emergency_home"; name = "Escape Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"boJ" = (/turf/simulated/floor/carpet,/area/chapel/main)
-"boK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"boL" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"boK" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"boL" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry)
"boM" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"boN" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"boO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/hallway/secondary/exit)
-"boP" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry)
-"boQ" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry)
-"boR" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/secondary/entry)
-"boS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"boT" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"boP" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry)
+"boQ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/secondary/entry)
+"boR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"boS" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"boT" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"boU" = (/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"boV" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"boW" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"boV" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"boW" = (/obj/machinery/camera{c_tag = "Arrivals Hallway"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"boX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"boY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"boZ" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bpa" = (/obj/machinery/camera{c_tag = "Arrivals Hallway"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bpb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
-"bpc" = (/obj/structure/closet/wardrobe/mixed,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"boZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bpa" = (/obj/structure/closet/wardrobe/mixed,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bpb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/civilian/pet_store)
"bpd" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bpe" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bpf" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bpg" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bpf" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/port)
+"bpg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/civilian/pet_store)
"bph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/emergency2)
"bpi" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plating,/area/storage/emergency2)
"bpj" = (/obj/machinery/light_switch{pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/wood,/area/civilian/pet_store)
-"bpk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/civilian/pet_store)
-"bpl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/civilian/pet_store)
-"bpm" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel,/area/storage/tools)
-"bpn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/storage/tools)
-"bpo" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bpk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bpl" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bpm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bpn" = (/obj/structure/table,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bpo" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/bridge)
"bpp" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel,/area/storage/tools)
-"bpq" = (/obj/structure/table,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bpq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/bridge)
"bpr" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/bridge)
-"bps" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/bridge)
+"bps" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 28; pixel_y = -2; req_access_txt = "19"},/obj/machinery/keycard_auth{pixel_x = 29; pixel_y = 8},/turf/simulated/floor/plasteel,/area/bridge)
"bpt" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/bridge)
-"bpu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/bridge)
-"bpv" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_command,/obj/item/device/aicard,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/bridge)
-"bpw" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 28; pixel_y = -2; req_access_txt = "19"},/obj/machinery/keycard_auth{pixel_x = 29; pixel_y = 8},/turf/simulated/floor/plasteel,/area/bridge)
-"bpx" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/bridge)
-"bpy" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "greencorner"},/area/bridge)
+"bpu" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_command,/obj/item/device/aicard,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/bridge)
+"bpw" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/bridge)
+"bpx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/bridge)
+"bpy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/crew_quarters/bar)
"bpz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/bridge)
-"bpA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/bridge)
+"bpA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"bpB" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel,/area/bridge)
-"bpC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"bpD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/crew_quarters/bar)
-"bpE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpG" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpH" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpI" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpL" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpE" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpF" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpG" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpK" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpL" = (/obj/structure/foodcart,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bpM" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpN" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bpO" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window{dir = 4; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpP" = (/obj/structure/foodcart,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpS" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bpV" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window{dir = 4; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpP" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpR" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bpU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
+"bpV" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/hydroponics)
"bpW" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/hydroponics)
-"bpX" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/hydroponics)
-"bpY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
-"bpZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
-"bqa" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bqb" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 8; icon_state = "right"; name = "Library Desk Door"; req_access_txt = "37"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library)
+"bpX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
+"bpY" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 8; icon_state = "right"; name = "Library Desk Door"; req_access_txt = "37"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library)
+"bpZ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"bqa" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bqb" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
"bqc" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library)
"bqd" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/checkout{pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/library)
-"bqe" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bqf" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bqe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"bqf" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bqg" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
-"bqh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
-"bqi" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bqj" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
-"bqk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bqh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bqi" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
+"bqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bqk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bql" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bqm" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bqn" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"bqo" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape)
-"bqp" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bqq" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{pixel_x = 32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bqp" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"bqq" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{pixel_x = 32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bqr" = (/turf/simulated/wall,/area/security/vacantoffice)
"bqs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/vacantoffice)
"bqt" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
@@ -3575,8 +3551,8 @@
"bqM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
"bqN" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central/nw)
"bqO" = (/obj/machinery/computer/prisoner{req_access = null; req_access_txt = "2"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/bridge)
-"bqP" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost","Telecomms")},/obj/machinery/camera{c_tag = "Bridge West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 0; icon_state = "red"},/area/bridge)
-"bqQ" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{pixel_y = 26},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/bridge)
+"bqP" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{pixel_y = 26},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/bridge)
+"bqQ" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost","Telecomms")},/obj/machinery/camera{c_tag = "Bridge West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 0; icon_state = "red"},/area/bridge)
"bqR" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel,/area/bridge)
"bqS" = (/turf/simulated/floor/plasteel,/area/bridge)
"bqT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
@@ -3586,27 +3562,27 @@
"bqX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
"bqY" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel,/area/bridge)
"bqZ" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/bridge)
-"bra" = (/obj/machinery/camera{c_tag = "Bridge East"; dir = 2; network = list("SS13")},/obj/machinery/computer/supplycomp,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge)
-"brb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/bridge)
-"brc" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"brd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bra" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/bridge)
+"brb" = (/obj/machinery/camera{c_tag = "Bridge East"; dir = 2; network = list("SS13")},/obj/machinery/computer/supplycomp,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge)
+"brc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"brd" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bre" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"brf" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"brg" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"brh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bri" = (/obj/structure/table/woodentable,/obj/item/clothing/head/cakehat,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"brj" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"brk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table,/obj/item/weapon/kitchen/knife,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"brl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"brm" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"brn" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bro" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"brp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"brq" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/window/eastleft{name = "Hydroponics Desk"; req_access_txt = "35"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Kitchen Desk"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics)
+"brk" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"brl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table,/obj/item/weapon/kitchen/knife,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"brm" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"brn" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bro" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"brp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"brq" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{name = "Hydroponics Desk"; req_access_txt = "35"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Kitchen Desk"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics)
"brr" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
"brs" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hydroponics)
-"brt" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
-"bru" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"brt" = (/obj/machinery/hydroponics/constructable,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bru" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics)
"brv" = (/obj/structure/bookcase{name = "bookcase (Adult)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library)
"brw" = (/obj/structure/bookcase{name = "bookcase (Adult)"},/turf/simulated/floor/wood,/area/library)
"brx" = (/obj/machinery/computer/library/public,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library)
@@ -3615,269 +3591,268 @@
"brA" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/library)
"brB" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/machinery/libraryscanner,/turf/simulated/floor/wood,/area/library)
"brC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"brD" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"brE" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"brD" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"brE" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"brF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"brG" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"brH" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"brI" = (/obj/effect/decal/warning_stripes/southeastcorner,/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"brJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/northeastsouth,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"brK" = (/obj/machinery/door/airlock/external{aiControlDisabled = 0; hackProof = 1; id_tag = "emergency_home"; name = "Escape Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
+"brK" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; width = 24},/obj/docking_port/stationary{dir = 4; dwidth = 11; height = 13; id = "emergency_home"; name = "emergency evac bay"; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"brL" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"brM" = (/turf/simulated/floor/plating,/area/hallway/secondary/exit)
-"brN" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; width = 24},/obj/docking_port/stationary{dir = 4; dwidth = 11; height = 13; id = "emergency_home"; name = "emergency evac bay"; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"brO" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
-"brP" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport)
+"brN" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
+"brO" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport)
+"brP" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport)
"brQ" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport)
"brR" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/transport)
-"brS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport)
-"brT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking North"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"brS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking North"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"brT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/security/vacantoffice)
"brU" = (/turf/simulated/floor/wood,/area/security/vacantoffice)
"brV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/wood,/area/security/vacantoffice)
"brW" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/security/vacantoffice)
"brX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/security/vacantoffice)
"brY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"brZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/security/vacantoffice)
+"brZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bsa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/wood,/area/security/vacantoffice)
-"bsb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
+"bsb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bsc" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bsd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/port)
-"bse" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bsf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bsg" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/requests_console{department = "Locker Room"; name = "Locker Room Requests Console"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bsh" = (/obj/structure/table,/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bsi" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bse" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bsf" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/requests_console{department = "Locker Room"; name = "Locker Room Requests Console"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bsg" = (/obj/structure/table,/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bsh" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bsi" = (/obj/structure/table/woodentable,/obj/machinery/fishtank/bowl,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/civilian/pet_store)
"bsj" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bsk" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bsl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/storage/emergency2)
-"bsm" = (/obj/structure/table/woodentable,/obj/machinery/fishtank/bowl,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/civilian/pet_store)
+"bsm" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/storage/tools)
"bsn" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/civilian/pet_store)
"bso" = (/obj/machinery/vending/crittercare,/turf/simulated/floor/wood,/area/civilian/pet_store)
-"bsp" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bsp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/nw)
"bsq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/storage/tools)
"bsr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/tools)
"bss" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
-"bst" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/hallway/primary/central/nw)
+"bst" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
"bsu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/bridge)
-"bsv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
-"bsw" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/bridge)
-"bsx" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/bridge)
+"bsv" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/bridge)
+"bsw" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/bridge)
+"bsx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
"bsy" = (/obj/effect/landmark{name = "Marauder Entry"},/turf/simulated/floor/plasteel,/area/bridge)
-"bsz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"bsz" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
"bsA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/effect/landmark{name = "Marauder Entry"},/turf/simulated/floor/plasteel,/area/bridge)
-"bsB" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
-"bsC" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"bsC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
"bsD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/item/device/radio/beacon,/obj/effect/landmark{name = "Marauder Entry"},/turf/simulated/floor/plasteel,/area/bridge)
-"bsE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"bsE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"; tag = "icon-browncorner (EAST)"},/area/bridge)
"bsF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
-"bsG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"; tag = "icon-browncorner (EAST)"},/area/bridge)
+"bsG" = (/turf/simulated/floor/plasteel{tag = "icon-browncorner (EAST)"; icon_state = "browncorner"; dir = 4},/area/bridge)
"bsH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/bridge)
-"bsI" = (/turf/simulated/floor/plasteel{tag = "icon-browncorner (EAST)"; icon_state = "browncorner"; dir = 4},/area/bridge)
-"bsJ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
-"bsK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/ne)
+"bsI" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
+"bsJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/ne)
+"bsK" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/ne)
"bsL" = (/obj/machinery/camera{c_tag = "Bridge East Entrance"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/ne)
-"bsM" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/ne)
+"bsM" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bsN" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/bar)
"bsO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bsP" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/item/weapon/dice,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bsQ" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bsR" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bsS" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bsR" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bsS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bsT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/weapon/book/manual/sop_service,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bsU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bsU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bsV" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bsW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bsX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bsY" = (/obj/machinery/processor,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"bsZ" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bta" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
-"btb" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/hydroponics)
-"btc" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"btd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bsW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bsX" = (/obj/machinery/processor,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bsY" = (/obj/machinery/hydroponics/constructable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bsZ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"bta" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/library)
+"btb" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/wood,/area/library)
+"btc" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/library)
+"btd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"bte" = (/turf/simulated/wall,/area/hallway/primary/starboard/east)
"btf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/library)
-"btg" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/library)
+"btg" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
"bth" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/library)
"bti" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/wood,/area/library)
"btj" = (/obj/structure/table/woodentable,/obj/item/device/camera_film,/obj/item/device/camera_film,/turf/simulated/floor/wood,/area/library)
-"btk" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/wood,/area/library)
+"btk" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
"btl" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library)
-"btm" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/library)
-"btn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"bto" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"btm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/camera{c_tag = "Chapel South"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"btn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bto" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge West"; dir = 4; network = list("SS13")},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"btp" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
"btq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main)
-"btr" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"btr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bts" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
-"btt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/camera{c_tag = "Chapel South"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"btu" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge West"; dir = 4; network = list("SS13")},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
-"btv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"btt" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"btu" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"btv" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/transport)
"btw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"btx" = (/obj/item/flag/nt,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bty" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"btz" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"btA" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/transport)
-"btB" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
+"bty" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
+"btz" = (/obj/structure/stool/bed/chair,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
+"btA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/woodentable,/obj/item/weapon/pen/red,/turf/simulated/floor/wood,/area/security/vacantoffice)
+"btB" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/security/vacantoffice)
"btC" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"btD" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport)
-"btE" = (/obj/structure/stool/bed/chair,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
+"btE" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
"btF" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
"btG" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"btH" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/security/vacantoffice)
-"btI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/woodentable,/obj/item/weapon/pen/red,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"btJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/security/vacantoffice)
-"btK" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
+"btH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/security/vacantoffice)
+"btI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"btJ" = (/obj/machinery/camera{c_tag = "Locker Room West"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"btL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/port)
"btM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/port)
-"btN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"btN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"btO" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"btP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btR" = (/obj/machinery/camera{c_tag = "Locker Room West"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btS" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"btX" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btQ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btT" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"btV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
+"btW" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/storage/tools)
+"btX" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/nw)
"btY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"btZ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bua" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
+"bua" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
"bub" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/port)
"buc" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/storage/tools)
"bud" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/storage/tools)
-"bue" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/storage/tools)
+"bue" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
"buf" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/storage/tools)
"bug" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel,/area/storage/tools)
-"buh" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/nw)
-"bui" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
-"buj" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
-"buk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
-"bul" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
-"bum" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"buh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"bui" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel,/area/bridge)
+"buj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"buk" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -5; pixel_y = -25},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bul" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bum" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"bun" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/bridge)
-"buo" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -5; pixel_y = -25},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bup" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"buq" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bur" = (/obj/machinery/camera{c_tag = "Bridge Central"; dir = 1; network = list("SS13")},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bus" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"but" = (/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(75)},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"buu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"buv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"buw" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light,/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bux" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/bridge)
-"buy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/bridge)
-"buz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/bridge)
-"buA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/bridge)
-"buB" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
-"buC" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
-"buD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/ne)
+"buo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bup" = (/obj/machinery/camera{c_tag = "Bridge Central"; dir = 1; network = list("SS13")},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"buq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bur" = (/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(75)},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bus" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light,/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"but" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"buu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/bridge)
+"buv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/bridge)
+"buw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/bridge)
+"bux" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
+"buy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/bridge)
+"buz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/ne)
+"buA" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
+"buB" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"buC" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
+"buD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"buE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"buF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"buG" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"buH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"buF" = (/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"buG" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"buH" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"buI" = (/obj/structure/table/woodentable,/obj/item/candle,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"buJ" = (/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"buK" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (NORTH)"; icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"buL" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"buJ" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"buK" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/requests_console{department = "Kitchen"; name = "Kitchen Requests Console"; departmentType = 2; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"buL" = (/obj/machinery/hydroponics/constructable,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
"buM" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"buN" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"buO" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/requests_console{department = "Kitchen"; name = "Kitchen Requests Console"; departmentType = 2; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"buP" = (/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"buQ" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"buR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 16},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"buS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"buT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"buU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"buV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"buW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library)
-"buX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/library)
-"buY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/library)
-"buZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/library)
-"bva" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/carpet,/area/library)
-"bvb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/chapel/main)
-"bvc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/chapel/main)
+"buN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 16},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"buO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"buP" = (/obj/machinery/light{dir = 8},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"buQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"buR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"buS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"buT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/library)
+"buU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library)
+"buV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/library)
+"buW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/library)
+"buX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/carpet,/area/library)
+"buY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/chapel/main)
+"buZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/chapel/main)
+"bva" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/chapel/main)
+"bvb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bvc" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"bvd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/carpet,/area/chapel/main)
-"bve" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/chapel/main)
-"bvf" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
+"bve" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bvf" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "port bay 3"; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bvg" = (/obj/structure/table,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bvh" = (/obj/structure/bush,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
+"bvh" = (/obj/structure/flora/ausbushes/stalkybush,/obj/structure/flora/ausbushes/grassybush,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"bvi" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bvj" = (/turf/simulated/shuttle/floor,/area/shuttle/transport)
-"bvk" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "port bay 3"; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/transport)
+"bvk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/security/vacantoffice)
"bvl" = (/obj/machinery/door/airlock/external{id_tag = "ferry_home"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bvm" = (/obj/machinery/light_switch{pixel_x = -28},/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bvn" = (/turf/simulated/floor/carpet,/area/security/vacantoffice)
-"bvo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/security/vacantoffice)
-"bvp" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/wood,/area/security/vacantoffice)
+"bvo" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/wood,/area/security/vacantoffice)
+"bvp" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bvq" = (/obj/structure/rack{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bvr" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/maintenance/port)
"bvs" = (/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet)
-"bvt" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bvu" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bvt" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bvu" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/crew_quarters/locker)
"bvv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bvw" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/crew_quarters/locker)
-"bvx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/crew_quarters/locker)
+"bvw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/crew_quarters/locker)
+"bvx" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bvy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/crew_quarters/locker)
-"bvz" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
-"bvA" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/maintenance/port)
+"bvz" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/maintenance/port)
+"bvA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/port)
"bvB" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/port)
-"bvC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/port)
+"bvC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
"bvD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bvE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
+"bvE" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/storage/tools)
"bvF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/blood/oil,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port)
"bvG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/port)
"bvH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/port)
"bvI" = (/obj/item/clothing/gloves/color/rainbow,/obj/item/clothing/shoes/rainbow,/obj/item/clothing/head/soft/rainbow,/obj/item/clothing/under/rainbow,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bvJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/storage/tools)
"bvK" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/wall,/area/storage/tools)
-"bvL" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/storage/tools)
-"bvM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bvL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/nw)
+"bvM" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central/nw)
"bvN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/nw)
-"bvO" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central/nw)
+"bvO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/hallway/primary/central/nw)
"bvP" = (/obj/machinery/camera{c_tag = "Bridge West Entrance"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central/nw)
-"bvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/hallway/primary/central/nw)
+"bvQ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
"bvR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/bridge)
-"bvS" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
+"bvS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"bvT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/bridge)
-"bvU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bvV" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bvW" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/bridge)
+"bvU" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
+"bvV" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/bridge)
+"bvW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "AI Upload Access"; req_access_txt = "16"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"bvX" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
-"bvY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "AI Upload Access"; req_access_txt = "16"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bvY" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/bridge)
"bvZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bwa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bwb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
-"bwc" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/bridge)
+"bwc" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
"bwd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bwe" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/bridge)
-"bwf" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
+"bwe" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/bridge)
+"bwf" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/hallway/primary/central/ne)
"bwg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/bridge)
-"bwh" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/hallway/primary/central/ne)
+"bwh" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central/ne)
"bwi" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central/ne)
-"bwj" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central/ne)
-"bwk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
-"bwl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bwj" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
+"bwk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bwl" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bwm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bwn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bwo" = (/obj/machinery/door_control{id = "kitchenbar"; name = "Kitchen Bar Shutters Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "28"},/obj/machinery/door_control{id = "kitchenhall"; name = "Kitchen Hallway Shutters Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bwp" = (/obj/structure/cable,/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bwn" = (/obj/machinery/door_control{id = "kitchenbar"; name = "Kitchen Bar Shutters Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "28"},/obj/machinery/door_control{id = "kitchenhall"; name = "Kitchen Hallway Shutters Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bwo" = (/obj/structure/cable,/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bwp" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bwq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bwr" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bws" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bwt" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bwu" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 4"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bwr" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bws" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bwt" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 4"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bwu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library)
"bwv" = (/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bww" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bwx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library)
+"bwx" = (/obj/machinery/camera{c_tag = "Departure Lounge East"; dir = 8; network = list("SS13")},/obj/structure/table,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bwy" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/library)
"bwz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/carpet,/area/library)
-"bwA" = (/obj/machinery/camera{c_tag = "Departure Lounge East"; dir = 8; network = list("SS13")},/obj/structure/table,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bwA" = (/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of those who died in the great space lube airlock incident.\" Scratched in beneath that is a crude image of a clown and a spaceman. The spaceman is slipping. The clown is laughing."; dir = 4; icon_state = "plaque"; name = "Memorial Plaque"},/area/hallway/secondary/exit)
"bwB" = (/turf/simulated/floor/grass,/area/hallway/secondary/exit)
-"bwC" = (/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of those who died in the great space lube airlock incident.\" Scratched in beneath that is a crude image of a clown and a spaceman. The spaceman is slipping. The clown is laughing."; dir = 4; icon_state = "plaque"; name = "Memorial Plaque"},/area/hallway/secondary/exit)
-"bwD" = (/obj/structure/bush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hallway/secondary/exit)
-"bwE" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
-"bwF" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/transport)
+"bwC" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/ausbushes/pointybush,/obj/structure/flora/ausbushes/lavendergrass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
+"bwD" = (/obj/structure/flora/ausbushes/pointybush,/obj/structure/flora/ausbushes/lavendergrass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
+"bwE" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/transport)
+"bwF" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
"bwG" = (/obj/structure/closet/crate,/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bwH" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bwI" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport)
@@ -3891,18 +3866,18 @@
"bwQ" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bwR" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bwS" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bwT" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
-"bwU" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
+"bwT" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
+"bwU" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bwV" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/dresser,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bwW" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/locker)
"bwX" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/locker)
-"bwY" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/crew_quarters/locker)
-"bwZ" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bwY" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bwZ" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/crew_quarters/locker)
"bxa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
"bxb" = (/turf/simulated/wall,/area/quartermaster/storage)
"bxc" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access_txt = "31"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
-"bxd" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office)
-"bxe" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/turf/simulated/floor/plating,/area/quartermaster/office)
+"bxd" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/turf/simulated/floor/plating,/area/quartermaster/office)
+"bxe" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office)
"bxf" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/structure/plasticflaps{opacity = 0},/turf/simulated/floor/plating,/area/quartermaster/office)
"bxg" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office)
"bxh" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/office)
@@ -3916,8 +3891,8 @@
"bxp" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bxq" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bxr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bxs" = (/obj/machinery/camera/motion{c_tag = "AI Upload Chamber"; network = list("SS13")},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bxt" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bxs" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bxt" = (/obj/machinery/camera/motion{c_tag = "AI Upload Chamber"; network = list("SS13")},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bxu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bxv" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
"bxw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{id_tag = "captainofficedoor"; name = "Captain's Office"; req_access = null; req_access_txt = "20"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -3926,15 +3901,15 @@
"bxz" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bxA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bxB" = (/obj/machinery/light,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bxC" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/gameboard,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bxD" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bxC" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bxD" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/gameboard,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bxE" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bxF" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bxG" = (/obj/machinery/icemachine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bxH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bxI" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westright{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bxJ" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
-"bxK" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
+"bxI" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westleft{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bxJ" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/door/window/westright{dir = 1; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
+"bxK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bxL" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics)
"bxM" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics)
"bxN" = (/obj/machinery/camera{c_tag = "Hydroponics South"; dir = 8; network = list("SS13")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
@@ -3956,38 +3931,38 @@
"byd" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport)
"bye" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
"byf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"byg" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/wood,/area/security/vacantoffice)
-"byh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"byi" = (/obj/machinery/camera{c_tag = "Vacant Office"; dir = 1},/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"byj" = (/obj/structure/table/woodentable,/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/wood,/area/security/vacantoffice)
+"byg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/security/vacantoffice)
+"byh" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/wood,/area/security/vacantoffice)
+"byi" = (/obj/structure/table/woodentable,/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/wood,/area/security/vacantoffice)
+"byj" = (/obj/machinery/camera{c_tag = "Vacant Office"; dir = 1},/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/turf/simulated/floor/wood,/area/security/vacantoffice)
"byk" = (/obj/machinery/atmospherics/unary/tank/air{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/port)
"byl" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/port)
"bym" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet)
"byn" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"byo" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"byp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
-"byq" = (/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
+"byp" = (/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
+"byq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"byr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
-"bys" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"byt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bys" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"byt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"byu" = (/obj/machinery/hologram/holopad,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"byv" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"byw" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/apc_electronics,/obj/item/weapon/stock_parts/cell{maxcharge = 2000},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"byx" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor/plating,/area/quartermaster/office)
-"byy" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/office)
-"byz" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/office)
-"byA" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/office)
+"byx" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/office)
+"byy" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor/plating,/area/quartermaster/office)
+"byz" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/office)
+"byA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/office)
"byB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/office)
"byC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/quartermaster/office)
-"byD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
-"byE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
+"byD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
+"byE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
"byF" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
"byG" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"byH" = (/obj/machinery/door_control{id = "heads_meeting"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"byI" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"byJ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Bridge Conference Room"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"byK" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"byL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"byK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"byL" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"byM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"byN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"byO" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
@@ -3995,69 +3970,69 @@
"byQ" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"byR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/nanotrasen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"byS" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"byT" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"byU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"byV" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
-"byW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
-"byX" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
-"byY" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"byT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"byU" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"byV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
+"byW" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
+"byX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"byY" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"byZ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bza" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
"bzb" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"bzc" = (/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/obj/structure/sign/directions/science{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar)
"bzd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
"bze" = (/obj/structure/sign/barsign,/turf/simulated/wall,/area/crew_quarters/bar)
-"bzf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
-"bzg" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
+"bzf" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
+"bzg" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
"bzh" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
"bzi" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
"bzj" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westright{dir = 1; name = "Hydroponics Desk"; req_access_txt = "35"},/turf/simulated/floor/plasteel,/area/hydroponics)
"bzk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel,/area/hydroponics)
"bzl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bzm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
-"bzn" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bzo" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"bzp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bzq" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bzr" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bzs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/vacantoffice)
-"bzt" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bzm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bzn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
+"bzo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bzp" = (/obj/item/flag/nt,/obj/effect/decal/warning_stripes/east,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bzq" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bzr" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bzs" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bzt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/vacantoffice)
"bzu" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bzv" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bzw" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bzx" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -1; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
+"bzw" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bzx" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bzy" = (/obj/machinery/washing_machine,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
-"bzz" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
-"bzA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bzz" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -1; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
+"bzA" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bzB" = (/obj/structure/closet/crate,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bzC" = (/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"bzD" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/office)
+"bzD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bzE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bzF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bzG" = (/obj/item/weapon/storage/box,/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 1},/area/quartermaster/office)
+"bzG" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/office)
"bzH" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_y = 30},/obj/item/stack/tape_roll,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 1},/area/quartermaster/office)
-"bzI" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/rcs,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/quartermaster/office)
+"bzI" = (/obj/item/weapon/storage/box,/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 1},/area/quartermaster/office)
"bzJ" = (/turf/simulated/wall,/area/quartermaster/office)
-"bzK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
+"bzK" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/rcs,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/quartermaster/office)
"bzL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
-"bzM" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "heads_meeting"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/bridge/meeting_room)
+"bzM" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
"bzN" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bzO" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bzP" = (/turf/simulated/floor/carpet,/area/bridge/meeting_room)
"bzQ" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/carpet,/area/bridge/meeting_room)
-"bzR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bzR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "heads_meeting"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/bridge/meeting_room)
"bzS" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bzT" = (/obj/structure/table,/obj/item/weapon/aiModule/quarantine,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bzU" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bzU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bzV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/table,/obj/item/weapon/aiModule/freeform,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bzW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bzX" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bzW" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bzX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bzY" = (/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bzZ" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bAa" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/carpet,/area/crew_quarters/captain)
-"bAb" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
+"bAb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bAc" = (/obj/structure/displaycase/captains_laser,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bAd" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/east)
+"bAd" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bAe" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Dorm"; location = "HOP2"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/east)
"bAf" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/east)
"bAg" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/east)
@@ -4065,54 +4040,54 @@
"bAi" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bAj" = (/obj/machinery/alarm{pixel_y = 26},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bAk" = (/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bAl" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 1"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bAm" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bAl" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/east)
+"bAm" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 1"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bAn" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bAo" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bAo" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bAp" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bAq" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hallway/primary/starboard/west)
+"bAq" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bAr" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hallway/primary/starboard/west)
-"bAs" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hallway/primary/starboard/west)
-"bAt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAs" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hallway/primary/starboard/west)
+"bAt" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hallway/primary/starboard/west)
+"bAu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bAw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atm{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/alarm{pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atm{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bAA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/alarm{pixel_y = 25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bAD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bAE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bAG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bAH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit)
-"bAI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit)
+"bAH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bAI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit)
"bAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bAK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bAL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bAK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bAL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit)
"bAM" = (/obj/effect/decal/warning_stripes/northeastsouth,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bAN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"bAO" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"bAP" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"bAQ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/space,/area/shuttle/specops)
+"bAQ" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_l"},/turf/space,/area/shuttle/specops)
"bAR" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/specops)
"bAS" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "109"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
"bAT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops)
-"bAU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bAV" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bAW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bAX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bAU" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bAV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bAW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bAX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bAY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bAZ" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bBa" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/port)
-"bBb" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/remains/robot,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bBc" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bBb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bBc" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/remains/robot,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bBd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bBe" = (/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/locker)
-"bBf" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/crew_quarters/locker)
-"bBg" = (/obj/machinery/camera{c_tag = "Locker Room South"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bBf" = (/obj/machinery/camera{c_tag = "Locker Room South"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
+"bBg" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/crew_quarters/locker)
"bBh" = (/obj/item/weapon/cigbutt,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bBi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bBj" = (/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
@@ -4123,7 +4098,7 @@
"bBo" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bBp" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/machinery/recharger,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
"bBq" = (/obj/machinery/atm{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
-"bBr" = (/obj/item/weapon/hand_labeler,/obj/item/device/assembly/timer,/obj/structure/table,/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bBr" = (/obj/item/device/assembly/timer,/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bBs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bBt" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room)
"bBu" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom/command,/turf/simulated/floor/carpet,/area/bridge/meeting_room)
@@ -4131,8 +4106,8 @@
"bBw" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet,/area/bridge/meeting_room)
"bBx" = (/obj/machinery/vending/cola,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bBy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bBz" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai_upload)
-"bBA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bBz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bBA" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai_upload)
"bBB" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"bBC" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bBD" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/crew_quarters/captain)
@@ -4146,270 +4121,260 @@
"bBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bBM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bBN" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP2"; location = "Stbd"},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bBO" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bBO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bBP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bBQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bBQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bBR" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "14"},/turf/simulated/floor/plating,/area/shuttle/escape)
"bBS" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "17"},/turf/simulated/floor/plating,/area/shuttle/escape)
"bBT" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"bBU" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"bBV" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/shuttle/escape)
-"bBW" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/specops)
-"bBX" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops)
-"bBY" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Special Ops team."; name = "Spec Ops Monitor"; network = list("ERT"); pixel_y = 30},/obj/machinery/computer/shuttle/ert,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
+"bBU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bBV" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bBW" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"bBX" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"bBY" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bBZ" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
-"bCa" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Shuttle"; dir = 2; network = list("ERT","CentComm")},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
+"bCa" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"},/turf/space,/area/shuttle/specops)
"bCb" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
-"bCc" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
-"bCd" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
-"bCe" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bCc" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Special Ops team."; name = "Spec Ops Monitor"; network = list("ERT"); pixel_y = 30},/obj/machinery/computer/shuttle/ert,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
+"bCd" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops)
+"bCe" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Shuttle"; dir = 2; network = list("ERT","CentComm")},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
"bCf" = (/turf/simulated/wall,/area/maintenance/disposal)
"bCg" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/disposal)
"bCh" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/disposal)
-"bCi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bCi" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
"bCj" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/port)
"bCk" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/port)
-"bCl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster{pixel_x = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bCl" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
"bCm" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bCn" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
+"bCn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bCo" = (/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/port)
"bCp" = (/obj/effect/landmark{name = "blobstart"},/obj/item/clothing/suit/ianshirt,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/port)
"bCq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
"bCr" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"bCs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
-"bCt" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bCt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"bCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bCv" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"bCw" = (/obj/machinery/camera{c_tag = "Cargo Bay Storage"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"bCx" = (/obj/machinery/camera{c_tag = "Cargo Delivery Office"; dir = 4; network = list("SS13")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/telepad_cargo,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
-"bCy" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
-"bCz" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
+"bCw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster{pixel_x = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
+"bCx" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
+"bCy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bCz" = (/obj/machinery/camera{c_tag = "Cargo Bay Storage"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bCA" = (/obj/structure/table,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bCB" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/bridge/meeting_room)
+"bCB" = (/obj/machinery/camera{c_tag = "Cargo Delivery Office"; dir = 4; network = list("SS13")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/telepad_cargo,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"bCC" = (/obj/item/weapon/folder/blue,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/bridge/meeting_room)
"bCD" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bCE" = (/obj/structure/table,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/aiModule/crewsimov,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bCF" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bCG" = (/obj/machinery/computer/aiupload,/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bCH" = (/obj/structure/cable,/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bCI" = (/obj/machinery/computer/borgupload,/obj/item/device/radio/intercom/private{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bCJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bCK" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneCrewMember,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/antimov,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
-"bCL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
+"bCE" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"bCF" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
+"bCG" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/bridge/meeting_room)
+"bCH" = (/obj/structure/table,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/aiModule/crewsimov,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bCI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bCJ" = (/obj/structure/cable,/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bCK" = (/obj/machinery/computer/aiupload,/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bCL" = (/obj/machinery/computer/borgupload,/obj/item/device/radio/intercom/private{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bCM" = (/obj/machinery/light{dir = 8},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bCN" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bCN" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneCrewMember,/obj/item/weapon/aiModule/purge,/obj/item/weapon/aiModule/antimov,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bCO" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bCP" = (/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bCQ" = (/mob/living/simple_animal/pet/fox/Renault,/turf/simulated/floor/carpet,/area/crew_quarters/captain)
-"bCR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
-"bCS" = (/obj/structure/table/woodentable,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8; network = list("SS13")},/obj/item/weapon/storage/lockbox/medal,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bCT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/east)
-"bCU" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/east)
-"bCV" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bCR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"bCS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
+"bCT" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bCU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
+"bCV" = (/obj/structure/table/woodentable,/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8; network = list("SS13")},/obj/item/weapon/storage/lockbox/medal,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bCW" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/starboard/west)
-"bCX" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard/west)
-"bCY" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/starboard/west)
-"bCZ" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bCX" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/east)
+"bCY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/east)
+"bCZ" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bDa" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bDb" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
-"bDc" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/hallway/primary/starboard/west)
-"bDd" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
-"bDe" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bDf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bDg" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 3"; dir = 1; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bDh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bDi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
-"bDj" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bDb" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard/west)
+"bDc" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/starboard/west)
+"bDd" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bDe" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
+"bDf" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
+"bDg" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/hallway/primary/starboard/west)
+"bDh" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bDi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bDj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"bDk" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bDl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bDm" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east)
-"bDn" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east)
-"bDo" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit)
-"bDp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
-"bDq" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
-"bDr" = (/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
-"bDs" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
-"bDt" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bDu" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bDv" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"bDl" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 3"; dir = 1; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bDm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bDn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
+"bDo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bDp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bDq" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east)
+"bDr" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east)
+"bDs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit)
+"bDt" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
+"bDu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
+"bDv" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
"bDw" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"bDx" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"bDy" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bDx" = (/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
+"bDy" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
"bDz" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"bDA" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
-"bDB" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "109"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 11; id = "specops"; name = "ert shuttle"; roundstart_move = "specops_away"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "specops_home"; name = "port bay 2"; width = 5},/turf/simulated/shuttle/plating,/area/shuttle/specops)
+"bDA" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
+"bDB" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"bDC" = (/obj/machinery/door/airlock/external{id_tag = "specops_home"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bDD" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bDD" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bDE" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet{dir = 4},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bDF" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bDG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bDH" = (/obj/structure/sign/securearea{name = "\improper STAY CLEAR HEAVY MACHINERY"; pixel_y = 32},/obj/machinery/recycler,/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bDI" = (/obj/machinery/conveyor{dir = 9; id = "garbage"; verted = -1},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bDJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bDK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bDL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bDM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
-"bDN" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortdir = 0; sortType = 1},/turf/simulated/floor/plating,/area/maintenance/port)
-"bDO" = (/obj/machinery/camera{c_tag = "Locker Room Toilets"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
+"bDF" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bDG" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
+"bDH" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "109"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 11; id = "specops"; name = "ert shuttle"; roundstart_move = "specops_away"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "specops_home"; name = "port bay 2"; width = 5},/turf/simulated/shuttle/plating,/area/shuttle/specops)
+"bDI" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bDJ" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bDK" = (/obj/structure/sign/securearea{name = "\improper STAY CLEAR HEAVY MACHINERY"; pixel_y = 32},/obj/machinery/recycler,/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bDL" = (/obj/machinery/light/small{dir = 1},/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bDM" = (/obj/machinery/conveyor{dir = 9; id = "garbage"; verted = -1},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bDN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bDO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
"bDP" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/port)
-"bDQ" = (/obj/structure/closet/crate/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bDQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bDR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bDS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bDT" = (/obj/structure/closet/crate/internals,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bDU" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/quartermaster/office)
-"bDV" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
-"bDW" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"bDV" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortdir = 0; sortType = 1},/turf/simulated/floor/plating,/area/maintenance/port)
+"bDW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"bDX" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/office)
-"bDY" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
-"bDZ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
+"bDY" = (/obj/machinery/camera{c_tag = "Locker Room Toilets"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
+"bDZ" = (/obj/structure/closet/crate/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bEa" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bEb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_y = -30},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bEb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"bEc" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bEd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bEe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
-"bEf" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 10},/obj/item/weapon/pen/multi/fountain,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door_control{id = "captainofficedoor"; name = "Office Door"; normaldoorcontrol = 1; pixel_x = 5; pixel_y = -3; req_access_txt = "20"},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bEf" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
"bEg" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bEh" = (/obj/structure/table/woodentable,/obj/item/weapon/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bEi" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bEj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bEj" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
"bEk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bEl" = (/obj/structure/table/woodentable,/obj/item/weapon/pinpointer,/obj/item/weapon/disk/nuclear,/obj/item/weapon/storage/secure/safe{pixel_x = 35; pixel_y = 5},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bEm" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
+"bEl" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
+"bEm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge Requests Console"; pixel_y = -30},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bEn" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"bEo" = (/turf/simulated/wall/r_wall,/area/medical/chemistry)
"bEp" = (/turf/simulated/wall,/area/medical/reception)
"bEq" = (/obj/structure/sign/nosmoking_1,/turf/simulated/wall,/area/medical/reception)
-"bEr" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/reception)
-"bEs" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/reception)
+"bEr" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 10},/obj/item/weapon/pen/multi/fountain,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door_control{id = "captainofficedoor"; name = "Office Door"; normaldoorcontrol = 1; pixel_x = 5; pixel_y = -3; req_access_txt = "20"},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bEs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bEt" = (/turf/simulated/wall,/area/medical/exam_room)
"bEu" = (/turf/simulated/wall,/area/medical/morgue)
-"bEv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "0"; req_one_access_txt = "6,9"},/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bEw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bEv" = (/obj/structure/table/woodentable,/obj/item/weapon/pinpointer,/obj/item/weapon/disk/nuclear,/obj/item/weapon/storage/secure/safe{pixel_x = 35; pixel_y = 5},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bEw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
"bEx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/starboard/east)
-"bEy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bEz" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/starboard/east)
+"bEy" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/reception)
+"bEz" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/reception)
"bEA" = (/turf/simulated/wall/r_wall,/area/assembly/robotics)
-"bEB" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east)
-"bEC" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "purple"},/area/hallway/primary/starboard/east)
+"bEC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/genetics)
"bED" = (/turf/simulated/wall/r_wall,/area/toxins/lab)
-"bEE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bEE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bEF" = (/turf/simulated/wall,/area/hallway/secondary/exit)
"bEG" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/exit)
-"bEH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bEI" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bEJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"bEH" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"bEI" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/starboard/east)
+"bEJ" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east)
"bEK" = (/obj/machinery/computer/communications,/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
"bEL" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
-"bEM" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops)
-"bEN" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bEO" = (/obj/machinery/conveyor{dir = 5; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bEP" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bEQ" = (/obj/machinery/conveyor{dir = 10; id = "garbage"; verted = -1},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bEM" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "purple"},/area/hallway/primary/starboard/east)
+"bEN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bEO" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bEP" = (/obj/machinery/status_display{pixel_x = -30; pixel_y = 0},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bEQ" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bER" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops)
"bES" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port)
"bET" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port)
"bEU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
-"bEV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port)
+"bEV" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bEW" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bEX" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bEY" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
+"bEX" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bEY" = (/obj/machinery/conveyor{dir = 5; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bEZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bFa" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bFb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bFc" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
+"bFc" = (/obj/machinery/conveyor{dir = 10; id = "garbage"; verted = -1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bFd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bFe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
-"bFf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bFg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/port)
-"bFh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"bFi" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "31"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bFf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bFg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port)
+"bFh" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
+"bFi" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bFj" = (/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
"bFk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
-"bFl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bFl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
"bFm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/storage)
-"bFn" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 0},/turf/simulated/wall,/area/quartermaster/office)
-"bFo" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
-"bFp" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bFq" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bFr" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
-"bFs" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Mailing Room"; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office)
-"bFt" = (/obj/machinery/camera{c_tag = "Central Hallway West"; dir = 8; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
-"bFu" = (/obj/machinery/door/window/eastright{dir = 1; name = "Bridge Delivery"; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge/meeting_room)
+"bFn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bFo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/port)
+"bFp" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "31"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bFq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bFr" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bFs" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 0},/turf/simulated/wall,/area/quartermaster/office)
+"bFt" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bFu" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"bFv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/bridge/meeting_room)
"bFw" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bFx" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/slot_machine,/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bFy" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bFz" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/wood,/area/bridge/meeting_room)
-"bFA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bFx" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Mailing Room"; req_access_txt = "50"},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office)
+"bFy" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"bFz" = (/obj/machinery/camera{c_tag = "Central Hallway West"; dir = 8; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
+"bFA" = (/obj/machinery/door/window/eastright{dir = 1; name = "Bridge Delivery"; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge/meeting_room)
"bFB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/space,/area/space)
"bFC" = (/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
"bFD" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"bFE" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bFF" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bFG" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bFF" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/slot_machine,/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bFG" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bFH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
-"bFI" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain Requests Console"; pixel_x = -30; pixel_y = 0},/obj/structure/filingcabinet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bFI" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bFJ" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bFK" = (/obj/machinery/computer/communications,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bFL" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/coin/plasma,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/book/manual/sop_command,/obj/item/device/megaphone,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bFM" = (/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/device/camera,/obj/item/weapon/storage/photo_album{pixel_y = -10},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bFN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
+"bFM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bFN" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"bFO" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bFP" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bFP" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"bFQ" = (/obj/machinery/chem_heater,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bFR" = (/obj/machinery/chem_dispenser,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bFS" = (/obj/machinery/camera{c_tag = "Medbay Chemistry"; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bFR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain Requests Console"; pixel_x = -30; pixel_y = 0},/obj/structure/filingcabinet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bFS" = (/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/device/camera,/obj/item/weapon/storage/photo_album{pixel_y = -10},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bFT" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/mineral/plasma,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bFU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table/reinforced,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bFU" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
"bFV" = (/obj/structure/sign/chemistry,/turf/simulated/wall/r_wall,/area/medical/chemistry)
-"bFW" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/reception)
-"bFX" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bFY" = (/obj/machinery/camera{c_tag = "Medbay Lobby West"; network = list("SS13")},/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bFZ" = (/obj/machinery/light{dir = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bFW" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bFX" = (/obj/machinery/chem_dispenser,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bFY" = (/obj/machinery/camera{c_tag = "Medbay Chemistry"; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bFZ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table/reinforced,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bGa" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception)
-"bGb" = (/obj/machinery/camera{c_tag = "Medbay Lobby East"; network = list("SS13")},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bGc" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table,/obj/machinery/computer/mob_healer_terminal,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bGd" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/alarm{pixel_y = 26},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/reception)
-"bGe" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bGf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bGg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Medbay Examination Room"; network = list("SS13")},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bGh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bGi" = (/obj/structure/table,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = -2},/obj/item/clothing/gloves/color/latex,/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/morgue)
-"bGj" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
-"bGk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
-"bGl" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
-"bGm" = (/obj/machinery/camera{c_tag = "Medbay Morgue"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
-"bGn" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/morgue)
-"bGo" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bGp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bGb" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bGc" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/reception)
+"bGd" = (/obj/machinery/light{dir = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bGe" = (/obj/machinery/camera{c_tag = "Medbay Lobby West"; network = list("SS13")},/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bGf" = (/obj/machinery/camera{c_tag = "Medbay Lobby East"; network = list("SS13")},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bGg" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/alarm{pixel_y = 26},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/reception)
+"bGh" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table,/obj/machinery/computer/mob_healer_terminal,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bGi" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
"bGq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/assembly/chargebay)
"bGr" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay)
-"bGs" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bGt" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "mechbay"; name = "Mech Bay"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay)
"bGu" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bGv" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics Requests Console"; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bGv" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/plasteel,/area/medical/morgue)
"bGw" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bGx" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "robotics"; name = "Robotics Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics)
-"bGy" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "robotics"; name = "Robotics Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics)
-"bGz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east)
-"bGA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab)
-"bGB" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab)
+"bGx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bGy" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bGz" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "mechbay"; name = "Mech Bay"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay)
+"bGA" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics Requests Console"; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bGB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "robotics"; name = "Robotics Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics)
"bGC" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bGD" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bGE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bGF" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bGE" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "robotics"; name = "Robotics Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/assembly/robotics)
+"bGF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east)
"bGG" = (/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bGH" = (/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
"bGI" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bGJ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"bGK" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/space,/area/shuttle/specops)
-"bGL" = (/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
-"bGM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bGN" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/structure/sign/vacuum{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bGO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/trunk,/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; layer = 3; name = "interior door"; req_access_txt = "50"},/obj/machinery/disposal/deliveryChute{dir = 4},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bGP" = (/obj/machinery/mineral/stacking_machine{input_dir = 1; stack_amt = 10},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bGK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab)
+"bGL" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab)
+"bGM" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bGN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bGO" = (/obj/machinery/sleeper{tag = "icon-sleeper (NORTH)"; icon_state = "sleeper"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bGP" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_r"},/turf/space,/area/shuttle/specops)
"bGQ" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 8},/turf/simulated/wall,/area/maintenance/disposal)
-"bGR" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bGR" = (/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
"bGS" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port)
"bGT" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port)
"bGU" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
@@ -4418,347 +4383,321 @@
"bGX" = (/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/port)
"bGY" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/port)
"bGZ" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
-"bHa" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage)
+"bHa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bHb" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/storage)
"bHc" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/quartermaster/office)
-"bHd" = (/obj/machinery/door/window/eastleft{name = "Mail"; req_access_txt = "50"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/office)
-"bHe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
-"bHf" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
-"bHg" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
-"bHh" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
-"bHi" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Bridge"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/bridge/meeting_room)
-"bHj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = null; req_access_txt = "19"},/turf/simulated/floor/wood,/area/bridge/meeting_room)
+"bHd" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/structure/sign/vacuum{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bHe" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/trunk,/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; layer = 3; name = "interior door"; req_access_txt = "50"},/obj/machinery/disposal/deliveryChute{dir = 4},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bHf" = (/obj/machinery/mineral/stacking_machine{input_dir = 1; stack_amt = 10},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bHg" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bHh" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage)
+"bHi" = (/obj/machinery/door/window/eastleft{name = "Mail"; req_access_txt = "50"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/office)
+"bHj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"bHk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/lattice,/turf/space,/area/space)
"bHl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/space,/area/space)
"bHm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
-"bHn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bHo" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/engine/gravitygenerator)
-"bHp" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/gravitygenerator)
-"bHq" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/engine/gravitygenerator)
-"bHr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bHn" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"bHo" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
+"bHp" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
+"bHq" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Bridge"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/bridge/meeting_room)
+"bHr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = null; req_access_txt = "19"},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"bHs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
"bHt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/space,/area/space)
-"bHu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space)
+"bHu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"bHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/suit/space/captain,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/capspace,/obj/item/device/radio/intercom/private{pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bHw" = (/obj/machinery/computer/card,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bHx" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bHy" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bHz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
+"bHz" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/gravitygenerator)
"bHA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bHB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bHC" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/dropper/precision,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bHD" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chemist"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bHB" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/engine/gravitygenerator)
+"bHC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bHD" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/engine/gravitygenerator)
"bHE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bHF" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bHF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space)
"bHG" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bHH" = (/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/structure/table/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bHI" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception)
-"bHJ" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
+"bHH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
+"bHI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bHJ" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chemist"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bHK" = (/obj/structure/sign/examroom,/turf/simulated/wall,/area/medical/exam_room)
-"bHL" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bHM" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bHN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bHO" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/closet/secure_closet/exam,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bHP" = (/obj/structure/table,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue)
+"bHL" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/dropper/precision,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bHM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bHN" = (/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bHO" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception)
+"bHP" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
"bHQ" = (/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bHR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bHS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bHT" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue)
+"bHR" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
"bHU" = (/obj/structure/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bHV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bHW" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bHX" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bHY" = (/obj/machinery/door_control{dir = 2; id = "mechbay"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay)
-"bHZ" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/chargebay)
"bIa" = (/turf/simulated/wall,/area/assembly/robotics)
-"bIb" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bIb" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue)
"bIc" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bId" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bIe" = (/obj/machinery/camera{c_tag = "Research Robotics Lab"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics)
-"bIf" = (/obj/structure/table,/obj/machinery/door_control{id = "robotics"; name = "Robotics Lab Shutters Control"; pixel_x = -24; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
-"bIg" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
-"bIh" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
+"bIe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bIf" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bIg" = (/obj/machinery/door_control{dir = 2; id = "mechbay"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay)
+"bIh" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/chargebay)
"bIi" = (/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"bIj" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bIj" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bIk" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"bIl" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/machinery/door_control{id = "rdlab"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "47"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
-"bIm" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
-"bIn" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
+"bIl" = (/obj/structure/table,/obj/machinery/door_control{id = "robotics"; name = "Robotics Lab Shutters Control"; pixel_x = -24; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
+"bIm" = (/obj/machinery/camera{c_tag = "Research Robotics Lab"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics)
+"bIn" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
"bIo" = (/obj/machinery/computer/guestpass{pixel_y = 30},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bIp" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bIq" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bIr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bIq" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
+"bIr" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bIs" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bIt" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
+"bIt" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/machinery/door_control{id = "rdlab"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "47"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
"bIu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape)
-"bIv" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
-"bIw" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"bIv" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
+"bIw" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
"bIx" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape)
-"bIy" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
-"bIz" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bIA" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bIy" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bIz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bIA" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
"bIB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bIC" = (/obj/effect/decal/warning_stripes/north,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bIC" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
"bID" = (/obj/effect/decal/warning_stripes/north,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bIE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bIF" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bIG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bIH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bII" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bIJ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port)
-"bIK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/port)
-"bIL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bIM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
-"bIN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
-"bIO" = (/obj/structure/table,/obj/item/clothing/head/soft,/obj/item/weapon/stamp/granted{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bIP" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; name = "Cargo Requests Console"; pixel_x = 0; pixel_y = 30},/obj/item/weapon/stamp/granted{pixel_x = -3; pixel_y = 3},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bIQ" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bIR" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/secure_closet/cargotech,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bIE" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"bIF" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
+"bIG" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
+"bIH" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bII" = (/obj/effect/decal/warning_stripes/north,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bIJ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bIK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bIL" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bIM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bIN" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port)
+"bIO" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bIP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bIQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/port)
+"bIR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
"bIS" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bIT" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bIU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bIV" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "31"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bIT" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
+"bIU" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; name = "Cargo Requests Console"; pixel_x = 0; pixel_y = 30},/obj/item/weapon/stamp/granted{pixel_x = -3; pixel_y = 3},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bIV" = (/obj/structure/table,/obj/item/clothing/head/soft,/obj/item/weapon/stamp/granted{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bIW" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bIX" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "Sorting Office"; sortType = 2},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bIY" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "packageExternal"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bIZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
+"bIX" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/secure_closet/cargotech,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bIY" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bIZ" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bJa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
-"bJb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
+"bJb" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "31"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bJc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/maintenance/maintcentral)
"bJd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bJe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"bJf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bJf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bJg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bJh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room)
-"bJi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/computer/account_database{anchored = 1},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
-"bJj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
+"bJi" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "Sorting Office"; sortType = 2},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bJj" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "packageExternal"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bJk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/bridge/meeting_room)
"bJl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/lattice,/turf/space,/area/space)
-"bJm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/space,/area/space)
+"bJm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
"bJn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bJo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/gravitygenerator)
-"bJp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bJo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west)
+"bJp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bJq" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/space,/area/space)
"bJr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
-"bJs" = (/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange{department = "Captain's Office"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJv" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJw" = (/obj/machinery/light,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bJz" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
+"bJs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/computer/account_database{anchored = 1},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
+"bJt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
+"bJu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/space,/area/space)
+"bJv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/gravitygenerator)
+"bJw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bJx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bJy" = (/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange{department = "Captain's Office"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bJz" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Captain's Desk Door"; req_access_txt = "20"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bJA" = (/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/structure/table/glass,/obj/structure/reagent_dispensers/fueltank/chem{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bJB" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bJC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bJD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bJE" = (/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bJD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bJE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bJF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception)
-"bJG" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
-"bJH" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/medical{name = "Examination Room"; req_access_txt = "5"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room)
-"bJI" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bJJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bJK" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed,/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bJL" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue)
-"bJM" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bJN" = (/obj/machinery/optable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bJO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bJP" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bJQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bJR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay)
-"bJS" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
+"bJG" = (/obj/machinery/light,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bJH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bJI" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se)
+"bJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bJK" = (/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bJL" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
+"bJP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Examination Room"; req_access_txt = "5"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room)
"bJT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
-"bJU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bJV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bJW" = (/obj/machinery/door/firedoor{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bJX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bJW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 12},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bJX" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"bJY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bJZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bKa" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bJZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay)
+"bKa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bKb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/robotics)
-"bKc" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"})
+"bKc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bKd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bKe" = (/obj/machinery/camera{c_tag = "Research Access"; dir = 2; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
+"bKe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bKf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/lab)
-"bKg" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bKh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bKg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bKh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bKi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bKj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bKk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bKk" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bKl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bKm" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape)
-"bKn" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
-"bKo" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry)
+"bKn" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"})
+"bKo" = (/obj/machinery/camera{c_tag = "Research Access"; dir = 2; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
"bKp" = (/obj/machinery/door/airlock/external{id_tag = "admin_home"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bKq" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Disposal Exit"; layer = 3; name = "Disposal Exit Vent"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bKr" = (/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bKq" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bKr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bKs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bKt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bKu" = (/obj/machinery/light_switch{pixel_x = 30},/obj/machinery/camera{c_tag = "Disposals"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bKu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bKv" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/port)
"bKw" = (/turf/simulated/wall/r_wall,/area/maintenance/port)
-"bKx" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/port)
-"bKy" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "31"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
+"bKx" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry)
+"bKy" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry)
"bKz" = (/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bKA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bKB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bKC" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/quartermaster/office)
-"bKD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bKE" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bKF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bKG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bKH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bKI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bKJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "loadingarea"},/area/quartermaster/office)
-"bKK" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office)
-"bKL" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office)
-"bKM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
-"bKN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
-"bKO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
-"bKP" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"bKQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"bKR" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"bKS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bKC" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Disposal Exit"; layer = 3; name = "Disposal Exit Vent"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bKD" = (/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bKE" = (/obj/machinery/light_switch{pixel_x = 30},/obj/machinery/camera{c_tag = "Disposals"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bKF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/port)
+"bKG" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "31"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
+"bKH" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/quartermaster/office)
+"bKI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bKJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bKK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bKL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bKM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bKN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "loadingarea"},/area/quartermaster/office)
+"bKO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bKP" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office)
+"bKQ" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/office)
+"bKR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
+"bKS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
"bKT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room)
-"bKU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
-"bKV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Accounts Uplink Terminal"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
+"bKU" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bKV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west)
"bKW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/bridge/meeting_room)
-"bKX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space)
+"bKX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bKY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/space,/area/space)
-"bKZ" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bLa" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/gravitygenerator)
-"bLb" = (/obj/machinery/camera{c_tag = "Gravity Generator Room North"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bKZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bLa" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bLb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
"bLc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/lattice,/turf/space,/area/space)
"bLd" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain/bedroom)
"bLe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/crew_quarters/captain/bedroom)
-"bLf" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = null; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bLg" = (/obj/machinery/door/airlock/maintenance{name = "Captain's Office Maintenance"; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
-"bLh" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bLi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bLf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Accounts Uplink Terminal"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
+"bLg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space)
+"bLh" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bLi" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/gravitygenerator)
"bLj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/chemistry)
-"bLk" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bLk" = (/obj/machinery/camera{c_tag = "Gravity Generator Room North"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"bLl" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Chemist"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bLm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bLn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bLn" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = null; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bLo" = (/obj/item/stack/packageWrap,/obj/item/weapon/storage/box/syringes,/obj/item/device/mass_spectrometer/adv,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bLp" = (/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception)
-"bLq" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception)
-"bLr" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/item/weapon/storage/box/cups{pixel_x = 5; pixel_y = 5},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/reception)
-"bLs" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
-"bLt" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
-"bLu" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
-"bLv" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access_txt = "5"},/obj/item/device/radio/intercom/department/medbay,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
-"bLw" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/reception)
-"bLx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
-"bLy" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/insulin,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/weapon/reagent_containers/syringe,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/storage/pill_bottle/painkillers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bLz" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bLA" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/clipboard,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bLB" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue)
-"bLC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bLD" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/assembly/chargebay)
+"bLp" = (/obj/machinery/door/airlock/maintenance{name = "Captain's Office Maintenance"; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
+"bLq" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bLr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bLs" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bLt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bLu" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception)
+"bLv" = (/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception)
+"bLw" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
+"bLx" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/item/weapon/storage/box/cups{pixel_x = 5; pixel_y = 5},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/reception)
+"bLy" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
+"bLz" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
+"bLA" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/reception)
+"bLB" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access_txt = "5"},/obj/item/device/radio/intercom/department/medbay,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception)
+"bLD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
"bLE" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay)
-"bLF" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
-"bLG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bLH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bLF" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/insulin,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/weapon/reagent_containers/syringe,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/storage/pill_bottle/painkillers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
"bLI" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/assembly/robotics)
-"bLJ" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/effect/decal/warning_stripes/north,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bLK" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bLL" = (/obj/machinery/mecha_part_fabricator,/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bLM" = (/obj/machinery/mecha_part_fabricator,/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel,/area/assembly/robotics)
-"bLN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bLN" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/assembly/chargebay)
"bLO" = (/mob/living/simple_animal/pet/corgi/Ian/borgi,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bLP" = (/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/obj/structure/table,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bLQ" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"})
+"bLP" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
+"bLQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bLR" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bLS" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"})
-"bLT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/lab)
-"bLU" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab)
-"bLV" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/lab)
+"bLS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bLT" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/effect/decal/warning_stripes/north,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel,/area/assembly/robotics)
+"bLU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bLV" = (/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/obj/structure/table,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bLW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bLX" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/obj/structure/table/glass,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bLY" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/structure/sign/poster{pixel_x = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bLZ" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
-"bMa" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry)
+"bLX" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"})
+"bLY" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"})
+"bLZ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/lab)
+"bMa" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/lab)
"bMb" = (/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
"bMc" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
"bMd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry)
"bMe" = (/obj/machinery/mass_driver{id_tag = "trash"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bMf" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bMg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bMh" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bMi" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bMj" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/supply)
-"bMk" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/supply)
-"bMl" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/supply)
-"bMm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bMn" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/status_display/supply_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
-"bMo" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bMp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bMf" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab)
+"bMg" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/obj/structure/table/glass,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bMh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/structure/sign/poster{pixel_x = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bMi" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry)
+"bMj" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry)
+"bMk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bMl" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bMm" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bMn" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bMo" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/supply)
+"bMp" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/supply)
"bMq" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 27},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bMr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bMs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bMt" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bMu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
-"bMv" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bMw" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bMr" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/supply)
+"bMs" = (/obj/structure/closet/emcloset,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bMt" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/status_display/supply_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
+"bMu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bMv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bMw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bMx" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/office)
-"bMy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/office)
-"bMz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bMy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
+"bMz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bMA" = (/obj/machinery/mineral/ore_redemption,/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bMB" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
+"bMB" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bMC" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"bMD" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"bMD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bME" = (/turf/simulated/wall,/area/hallway/primary/central/sw)
-"bMF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bMF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bMG" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads)
"bMH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/crew_quarters/heads)
"bMI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/heads)
-"bMJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bMJ" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
"bMK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/lattice,/turf/space,/area/space)
-"bML" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bMM" = (/obj/machinery/light{dir = 4},/obj/machinery/hologram/holopad,/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bMN" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/dresser,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bMO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bMP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bMQ" = (/obj/machinery/door/airlock{name = "Private Restroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
-"bMR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
+"bML" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"bMM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"bMN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bMO" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bMP" = (/obj/machinery/light{dir = 4},/obj/machinery/hologram/holopad,/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bMQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bMR" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/dresser,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bMS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/captain/bedroom)
-"bMT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/captain)
+"bMT" = (/obj/machinery/door/airlock{name = "Private Restroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
"bMU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/crew_quarters/captain)
-"bMV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bMW" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bMV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bMW" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
"bMX" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bMY" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bMZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bNb" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/secure_closet/reagents,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bNc" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall/r_wall,/area/medical/chemistry)
-"bNd" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/reception)
-"bNe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception)
-"bNf" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/reception)
-"bNg" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 3; req_access_txt = null},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/medical/reception)
+"bNb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/captain)
+"bNc" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bNd" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bNe" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall/r_wall,/area/medical/chemistry)
+"bNf" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/secure_closet/reagents,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bNg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception)
"bNh" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel,/area/medical/reception)
"bNi" = (/obj/machinery/computer/guestpass,/obj/structure/table,/turf/simulated/floor/plasteel,/area/medical/reception)
-"bNj" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 26; range = 6},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/medical/reception)
-"bNk" = (/obj/structure/table,/obj/item/weapon/folder/white{pixel_y = 10},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/medical/reception)
-"bNl" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception)
-"bNm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/reception)
-"bNn" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/exam_room)
+"bNj" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/reception)
+"bNk" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 3; req_access_txt = null},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/medical/reception)
+"bNl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/reception)
+"bNm" = (/obj/structure/table,/obj/item/weapon/folder/white{pixel_y = 10},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/medical/reception)
+"bNn" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 26; range = 6},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/medical/reception)
"bNo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/exam_room)
-"bNp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bNq" = (/obj/structure/table,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
-"bNr" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/morgue)
-"bNs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
-"bNt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
-"bNu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
-"bNv" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
-"bNw" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
-"bNx" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
-"bNy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bNp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/reception)
+"bNq" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception)
+"bNr" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/exam_room)
"bNz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay)
-"bNA" = (/obj/machinery/camera{c_tag = "Research Mech Bay"; dir = 4; network = list("Research","SS13")},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bNA" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/morgue)
"bNB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bNC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bND" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bNE" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics)
"bNF" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics)
@@ -4766,470 +4705,457 @@
"bNH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bNI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bNJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bNK" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bNL" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bNM" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"})
-"bNN" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"})
-"bNO" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/rdconsole/core,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/lab)
+"bNK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 13},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bNL" = (/obj/machinery/camera{c_tag = "Research Mech Bay"; dir = 4; network = list("Research","SS13")},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bNM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bNN" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bNO" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bNP" = (/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab)
-"bNQ" = (/obj/machinery/r_n_d/circuit_imprinter{pixel_x = 3; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/lab)
-"bNR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/camera{c_tag = "Research Research and Development Lab"; dir = 8; network = list("Research","SS13")},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bNS" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bNT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/research)
-"bNU" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research)
+"bNQ" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"})
+"bNR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/research{name = "Research Division"})
+"bNS" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/rdconsole/core,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/lab)
+"bNT" = (/obj/machinery/r_n_d/circuit_imprinter{pixel_x = 3; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/lab)
+"bNU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/camera{c_tag = "Research Research and Development Lab"; dir = 8; network = list("Research","SS13")},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bNV" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/research)
-"bNW" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/research)
-"bNX" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bNY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bNZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bOa" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bOb" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/supply)
+"bNW" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bNX" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/research)
+"bNY" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bNZ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research)
+"bOa" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/research)
+"bOb" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bOc" = (/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"bOd" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"bOe" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
-"bOf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bOg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bOh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bOi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bOj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bOk" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bOl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
-"bOm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bOn" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bOo" = (/obj/item/weapon/stamp/granted{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bOp" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bOq" = (/obj/machinery/computer/ordercomp,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bOr" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "loadingarea"},/area/quartermaster/office)
+"bOd" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bOe" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/supply)
+"bOf" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/supply)
+"bOg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
+"bOh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bOi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bOj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bOk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bOl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bOm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
+"bOn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access_txt = "31"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bOo" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bOp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bOq" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bOr" = (/obj/item/weapon/stamp/granted{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bOs" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/firealarm{pixel_y = 27},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bOt" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
+"bOt" = (/obj/machinery/computer/ordercomp,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bOu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"bOv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/central/sw)
-"bOw" = (/obj/machinery/computer/secure_data,/obj/machinery/flasher_button{id = "hopflash"; pixel_x = 6; pixel_y = 36},/obj/machinery/door_control{id = "hopqueue"; name = "Queue Privacy Shutters Control"; pixel_x = -4; pixel_y = 25; req_access_txt = "28"},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 6; pixel_y = 25; req_access_txt = "28"},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 36},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/heads)
-"bOx" = (/obj/structure/table,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bOy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/recharger/wallcharger{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bOz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/photocopier,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bOA" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bOB" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
-"bOC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
-"bOD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bOE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
-"bOF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/gravitygenerator)
+"bOv" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "loadingarea"},/area/quartermaster/office)
+"bOw" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
+"bOx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/central/sw)
+"bOy" = (/obj/structure/table,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/skills{req_access_txt = "57"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bOz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
+"bOA" = (/obj/machinery/computer/secure_data,/obj/machinery/flasher_button{id = "hopflash"; pixel_x = 6; pixel_y = 36},/obj/machinery/door_control{id = "hopqueue"; name = "Queue Privacy Shutters Control"; pixel_x = -4; pixel_y = 25; req_access_txt = "28"},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 6; pixel_y = 25; req_access_txt = "28"},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 36},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/heads)
+"bOB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/stool/bed/dogbed/ian,/mob/living/simple_animal/pet/corgi/Ian,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bOC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/recharger/wallcharger{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bOD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bOE" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
+"bOF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"bOG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/space,/area/space)
-"bOH" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bOH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
"bOI" = (/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bOJ" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bOK" = (/turf/simulated/wall,/area/crew_quarters/captain/bedroom)
"bOL" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
-"bOM" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
+"bOM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/gravitygenerator)
"bON" = (/turf/simulated/wall,/area/crew_quarters/captain)
-"bOO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bOP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bOO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/gravitygenerator)
+"bOP" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bOQ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/chemistry)
"bOR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/chemistry)
-"bOS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bOS" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
"bOT" = (/obj/structure/sign/chemistry,/turf/simulated/wall,/area/medical/chemistry)
"bOU" = (/turf/simulated/wall,/area/medical/chemistry)
"bOV" = (/obj/effect/decal/warning_stripes/yellow/partial,/obj/effect/decal/warning_stripes/arrow,/turf/simulated/floor/plasteel,/area/medical/reception)
"bOW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/yellow/partial,/obj/effect/decal/warning_stripes/arrow,/turf/simulated/floor/plasteel,/area/medical/reception)
-"bOX" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/reception)
-"bOY" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/medical/reception)
+"bOX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bOY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"bOZ" = (/turf/simulated/floor/plasteel,/area/medical/reception)
-"bPa" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 11; pixel_y = -22},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/medical/reception)
-"bPb" = (/obj/machinery/door/window/eastright{name = "Medical Reception"; req_access_txt = "5"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/medical/reception)
-"bPc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception)
-"bPd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception)
-"bPe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Examination Room"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room)
-"bPf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/exam_room)
+"bPa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
+"bPb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/medical/reception)
+"bPc" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/reception)
+"bPd" = (/obj/machinery/door/window/eastright{name = "Medical Reception"; req_access_txt = "5"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/medical/reception)
+"bPe" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 11; pixel_y = -22},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/medical/reception)
+"bPf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception)
"bPg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/morgue)
-"bPh" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "0"; req_one_access_txt = "6,9"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/morgue)
-"bPi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/morgue)
-"bPj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/morgue)
-"bPk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bPl" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/assembly/chargebay)
-"bPm" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bPh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/yellow/partial{dir = 1},/obj/effect/decal/warning_stripes/arrow{dir = 1},/turf/simulated/floor/plasteel,/area/medical/reception)
+"bPm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
"bPn" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bPo" = (/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bPp" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bPq" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bPr" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bPr" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/morgue)
"bPs" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/assembly/robotics)
"bPt" = (/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
"bPu" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
-"bPv" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bPv" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/assembly/chargebay)
"bPw" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bPx" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bPy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bPz" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/structure/table/glass,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bPx" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bPy" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bPz" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bPA" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bPB" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/research)
+"bPB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bPC" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/research)
"bPD" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/research)
"bPE" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/research)
"bPF" = (/turf/simulated/shuttle/floor,/area/shuttle/research)
"bPG" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/research)
-"bPH" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/administration)
+"bPH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bPI" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration)
-"bPJ" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bPK" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "106"},/obj/docking_port/mobile{dir = 2; dwidth = 8; height = 15; id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; width = 18},/obj/docking_port/stationary{dir = 2; dwidth = 8; height = 15; id = "admin_home"; name = "port bay 1"; width = 18},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bPL" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/administration)
-"bPM" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bPN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
+"bPJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/structure/table/glass,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bPK" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/research)
+"bPL" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/administration)
+"bPM" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "106"},/obj/docking_port/mobile{dir = 2; dwidth = 8; height = 15; id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; width = 18},/obj/docking_port/stationary{dir = 2; dwidth = 8; height = 15; id = "admin_home"; name = "port bay 1"; width = 18},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bPN" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bPO" = (/obj/machinery/conveyor_switch/oneway{id = "QMLoad2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bPP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bPQ" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"bPR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/quartermaster/office)
+"bPR" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/administration)
"bPS" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bPT" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bPU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bPT" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/floor/plating,/area/quartermaster/storage)
+"bPU" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
"bPV" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bPW" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access_txt = "50"},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bPW" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bPX" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/office)
"bPY" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bPZ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central/sw)
-"bQa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw)
+"bPZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "browncorner"},/area/quartermaster/office)
+"bQa" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research_shuttle_dock)
"bQb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/central/sw)
-"bQc" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/flasher{id = "hopflash"; pixel_y = 28},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Head of Personnel's Desk"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bQd" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/crew_quarters/heads)
-"bQe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bQf" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
+"bQc" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bQd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bQe" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access_txt = "50"},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bQf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw)
"bQg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bQh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bQi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/space,/area/space)
+"bQh" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/primary/central/sw)
+"bQi" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/flasher{id = "hopflash"; pixel_y = 28},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Head of Personnel's Desk"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bQj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/space,/area/space)
-"bQk" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bQl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bQk" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/crew_quarters/heads)
+"bQl" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bQm" = (/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bQn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bQo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/power/terminal,/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bQp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/space,/area/space)
-"bQq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/captains,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bQr" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bQs" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask/gold,/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bQt" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
-"bQu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
-"bQv" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bQw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bQx" = (/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire,/obj/structure/table,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/chemistry)
-"bQy" = (/obj/item/weapon/storage/firstaid/o2{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/o2,/obj/structure/table,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
-"bQz" = (/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Medbay Medicine Storage"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
-"bQA" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
-"bQB" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
+"bQn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bQo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/space,/area/space)
+"bQp" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bQq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bQr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/power/terminal,/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bQs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bQt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/space,/area/space)
+"bQu" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bQv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/captains,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bQw" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask/gold,/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bQx" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
+"bQy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
+"bQz" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bQA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bQB" = (/obj/item/weapon/storage/firstaid/o2{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/o2,/obj/structure/table,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
"bQC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/chemistry)
-"bQD" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
-"bQE" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
+"bQD" = (/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire,/obj/structure/table,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/chemistry)
+"bQE" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
"bQF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/medbay3)
-"bQG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay3)
-"bQH" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
-"bQI" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerStar"; name = "Medbay Entrance Starboard"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
-"bQJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerStar"; name = "Medbay Entrance Starboard"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
-"bQK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/medical/medbay2)
+"bQG" = (/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Medbay Medicine Storage"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
+"bQH" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
+"bQI" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
+"bQJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
+"bQK" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
"bQL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/medical/medbay2)
-"bQM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
-"bQN" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bQO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bQP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bQQ" = (/obj/machinery/camera{c_tag = "Medbay Fore Starboard"; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bQR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bQS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bQT" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bQU" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
+"bQM" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay3)
+"bQN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerStar"; name = "Medbay Entrance Starboard"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
+"bQO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerStar"; name = "Medbay Entrance Starboard"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
+"bQP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/medical/medbay2)
+"bQS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"bQT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"bQV" = (/turf/simulated/wall,/area/medical/medbay2)
-"bQW" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/genetics)
"bQX" = (/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bQY" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 14},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bQZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
"bRa" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/machinery/light{dir = 8},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"bRb" = (/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"bRc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
-"bRd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bRe" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bRf" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics)
-"bRg" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi/posibrain,/obj/item/device/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics)
+"bRe" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bRf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bRg" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 14},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/genetics)
"bRh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bRi" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bRj" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
-"bRk" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
-"bRl" = (/obj/machinery/door_control{id = "rdlab2"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = -24; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bRm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bRn" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bRo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bRp" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/stock_parts/scanning_module{pixel_x = 0; pixel_y = 0},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/machinery/light_switch{pixel_y = -25},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bRq" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bRr" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research)
+"bRi" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bRj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bRk" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics)
+"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi/posibrain,/obj/item/device/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics)
+"bRm" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bRn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"bRo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"bRp" = (/obj/machinery/door_control{id = "rdlab2"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = -24; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bRq" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bRr" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/space,/area/shuttle/research)
"bRs" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research)
"bRt" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research)
"bRu" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration)
"bRv" = (/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bRw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/drinkingglasses,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bRx" = (/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/soda,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bRy" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/administration)
-"bRz" = (/obj/machinery/door_control{id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; req_access_txt = "106"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bRy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bRz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bRA" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bRB" = (/obj/machinery/cell_charger,/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bRC" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bRD" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bRE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/structure/plasticflaps/mining,/turf/simulated/shuttle/plating,/area/shuttle/supply)
-"bRF" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bRG" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bRH" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
-"bRI" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bRJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bRK" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/quartermaster/storage)
+"bRE" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/stock_parts/scanning_module{pixel_x = 0; pixel_y = 0},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/machinery/light_switch{pixel_y = -25},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bRF" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bRG" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/administration)
+"bRH" = (/obj/machinery/door_control{id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; req_access_txt = "106"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bRI" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/storage)
+"bRJ" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/structure/plasticflaps/mining,/turf/simulated/shuttle/plating,/area/shuttle/supply)
+"bRK" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bRL" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bRM" = (/obj/machinery/autolathe,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bRN" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bRO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office)
"bRP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bRR" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
-"bRT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"bRU" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/central/sw)
+"bRR" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bRS" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
+"bRT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bRU" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/quartermaster/storage)
"bRV" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/sw)
"bRW" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central/sw)
-"bRX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
-"bRY" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
-"bRZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bRX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"bRY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
+"bRZ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/central/sw)
"bSa" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bSb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/simple_animal/pet/corgi/Ian,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bSc" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bSd" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bSe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bSf" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bSg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bSh" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bSb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
+"bSc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
+"bSd" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
+"bSe" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bSf" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bSg" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bSh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
"bSi" = (/turf/simulated/wall/r_wall,/area/teleporter)
"bSj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/teleporter)
-"bSk" = (/obj/machinery/door/airlock/maintenance{name = "Teleporter Maintenance"; req_access_txt = "17"},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/teleporter)
-"bSl" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bSm" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/firstaid/brute{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/chemistry)
+"bSk" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bSl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bSm" = (/obj/machinery/door/airlock/maintenance{name = "Teleporter Maintenance"; req_access_txt = "17"},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/teleporter)
"bSn" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bSo" = (/obj/effect/landmark/start{name = "Chemist"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
-"bSp" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
-"bSq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 3; req_access_txt = null},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
-"bSr" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
-"bSs" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/medical/medbay3)
-"bSt" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cell_charger,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay3)
-"bSu" = (/obj/structure/closet/secure_closet/medical3,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3)
-"bSv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3)
-"bSw" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay3)
-"bSx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; range = 6},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
-"bSy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bSz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bSA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bSB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"bSC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bSD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"bSp" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bSq" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/firstaid/brute{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/chemistry)
+"bSr" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
+"bSs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
+"bSt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 3; req_access_txt = null},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
+"bSu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/cell_charger,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay3)
+"bSv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/medical/medbay3)
+"bSw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3)
+"bSx" = (/obj/structure/closet/secure_closet/medical3,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3)
+"bSy" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay3)
+"bSz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"bSA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; range = 6},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
+"bSB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"bSD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"bSE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bSF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 23},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bSG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bSH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bSI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"bSJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/maintenance/genetics)
-"bSK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bSL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bSM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bSN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bSO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Mech Bay Maintenance"; req_access_txt = "29"},/turf/simulated/floor/plasteel,/area/maintenance/genetics)
-"bSP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bSQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bSR" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bSS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bST" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/assembly/robotics)
-"bSU" = (/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 4; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/assembly/robotics)
+"bSG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"bSH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 23},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"bSI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"bSJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"bSK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/maintenance/genetics)
+"bSL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"bSM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bSN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bSO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bSP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bSQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bSR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Mech Bay Maintenance"; req_access_txt = "29"},/turf/simulated/floor/plasteel,/area/maintenance/genetics)
+"bSS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bST" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
+"bSU" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bSV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bSW" = (/obj/machinery/door_control{id = "robotics2"; name = "Robotics Lab Shutters Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "29"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bSX" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "robotics2"; name = "Robotics Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/turf/simulated/floor/plating,/area/assembly/robotics)
-"bSY" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"})
-"bSZ" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/research{name = "Research Division"})
-"bTa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"})
+"bSW" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/assembly/robotics)
+"bSX" = (/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 4; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/assembly/robotics)
+"bSY" = (/obj/machinery/door_control{id = "robotics2"; name = "Robotics Lab Shutters Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "29"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bSZ" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"})
+"bTa" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "robotics2"; name = "Robotics Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Robotics Desk"; req_access_txt = "29"},/turf/simulated/floor/plating,/area/assembly/robotics)
"bTb" = (/turf/simulated/wall,/area/toxins/lab)
-"bTc" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab2"; name = "Research and Development Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bTc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/medical/research{name = "Research Division"})
"bTd" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/toxins/lab)
"bTe" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/lab)
-"bTf" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
-"bTg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bTf" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/research{name = "Research Division"})
+"bTg" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "rdlab2"; name = "Research and Development Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bTh" = (/turf/simulated/wall/r_wall,/area/medical/research_shuttle_dock)
"bTi" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/medical/research_shuttle_dock)
-"bTj" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bTk" = (/obj/machinery/door/poddoor/preopen{id_tag = "adminshuttleblast"; name = "Blast Doors"; req_access_txt = "101"},/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bTl" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bTm" = (/obj/item/stack/sheet/metal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bTn" = (/obj/item/stack/sheet/glass,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bTo" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "31"},/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"bTp" = (/obj/machinery/door/firedoor{dir = 2},/obj/machinery/door/airlock/external{id_tag = "supply_home"; name = "Cargo Docking Hatch"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage)
+"bTj" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bTk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bTl" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bTm" = (/obj/structure/table,/obj/item/pod_parts/core,/obj/item/weapon/circuitboard/mecha/pod,/obj/item/clothing/glasses/welding{pixel_y = 12},/obj/item/device/gps,/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"bTn" = (/obj/machinery/door/poddoor/preopen{id_tag = "adminshuttleblast"; name = "Blast Doors"; req_access_txt = "101"},/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bTo" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bTp" = (/obj/item/stack/sheet/metal,/obj/structure/table,/obj/item/stack/sheet/glass{pixel_x = 4; pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bTq" = (/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bTr" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/storage)
+"bTr" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{id_tag = "supply_home"; name = "Cargo Docking Hatch"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bTs" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/storage)
-"bTt" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #1"},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #1"; suffix = "#1"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"bTu" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Cargo Office"; dir = 4; network = list("SS13")},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bTt" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "31"},/turf/simulated/shuttle/floor,/area/shuttle/supply)
+"bTu" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/storage)
"bTv" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bTw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office)
-"bTx" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bTx" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #1"},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #1"; suffix = "#1"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"bTy" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"bTz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"bTA" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
-"bTB" = (/obj/structure/closet/secure_closet/hop,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bTC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bTD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/pdapainter,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bTE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
-"bTF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bTA" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Cargo Office"; dir = 4; network = list("SS13")},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bTB" = (/obj/structure/disposalpipe/segment,/mob/living/simple_animal/pet/sloth/paperwork,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bTC" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hop"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads)
+"bTD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/heads)
+"bTE" = (/obj/structure/closet/secure_closet/hop,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bTF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/photocopier,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
"bTG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/crew_quarters/heads)
"bTH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/server)
"bTI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/simulated/wall/r_wall,/area/server)
"bTJ" = (/turf/simulated/wall/r_wall,/area/server)
-"bTK" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bTL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bTM" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/camera{c_tag = "Gravity Generator Room South"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bTN" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/beacon,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/teleporter)
+"bTK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/pdapainter,/turf/simulated/floor/carpet,/area/crew_quarters/heads)
+"bTL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bTM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bTN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
"bTO" = (/obj/machinery/light{dir = 1},/obj/structure/table,/obj/item/weapon/hand_tele,/turf/simulated/floor/plasteel,/area/teleporter)
-"bTP" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/crate,/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel,/area/teleporter)
-"bTQ" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/teleporter)
-"bTR" = (/obj/machinery/camera{c_tag = "Teleporter Room"; network = list("SS13")},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/teleporter)
-"bTS" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/teleporter)
-"bTT" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/teleporter)
+"bTP" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/camera{c_tag = "Gravity Generator Room South"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bTQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/beacon,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/teleporter)
+"bTR" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/teleporter)
+"bTS" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/crate,/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel,/area/teleporter)
+"bTT" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/teleporter)
"bTU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/teleporter)
-"bTV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/se)
-"bTW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
-"bTX" = (/obj/structure/closet/secure_closet/medical1,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry)
-"bTY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/wardrobe/chemistry_white,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry)
-"bTZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry)
-"bUa" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
-"bUb" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"bUc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
-"bUd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
-"bUe" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3)
+"bTV" = (/obj/machinery/camera{c_tag = "Teleporter Room"; network = list("SS13")},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/teleporter)
+"bTW" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/teleporter)
+"bTX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/se)
+"bTY" = (/obj/structure/closet/secure_closet/medical1,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry)
+"bTZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
+"bUa" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry)
+"bUb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/wardrobe/chemistry_white,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/chemistry)
+"bUc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
+"bUd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bUe" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"bUf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3)
"bUg" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3)
-"bUh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3)
-"bUi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
-"bUj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"bUk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bUl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"bUm" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUt" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"bUu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"bUv" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"bUh" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3)
+"bUi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
+"bUj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
+"bUk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3)
+"bUl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"bUm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
+"bUn" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"bUp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"bUv" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"bUw" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/genetics)
"bUx" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/genetics)
-"bUy" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/genetics)
+"bUy" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
"bUz" = (/obj/structure/table,/obj/item/weapon/crowbar/large,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bUA" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bUB" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bUC" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/chargebay)
-"bUD" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -4; pixel_y = -4},/obj/structure/sign/poster/legit{pixel_x = -32},/obj/item/weapon/storage/box/masks,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/assembly/robotics)
+"bUD" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"bUE" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bUF" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bUG" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bUG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/genetics)
"bUH" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bUI" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bUJ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bUK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bUL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/noticeboard{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bUM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bUN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bUO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"bUP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
-"bUQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"bUR" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
-"bUS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bUT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"bUU" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Research Shuttle Maintenance"; dir = 2; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"bUV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research_shuttle_dock)
-"bUW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"bUX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"bUY" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"bUZ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"bVa" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/medical/research_shuttle_dock)
-"bVb" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/research)
-"bVc" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "External Hatch"; req_access_txt = "65"},/obj/docking_port/mobile{dwidth = 3; height = 5; id = "science"; name = "research shuttle"; rebuildable = 1; width = 7},/obj/docking_port/stationary{dwidth = 3; height = 5; id = "science_home"; name = "research dock"; width = 7},/turf/simulated/shuttle/floor,/area/shuttle/research)
-"bVd" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/research)
+"bUI" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -4; pixel_y = -4},/obj/structure/sign/poster/legit{pixel_x = -32},/obj/item/weapon/storage/box/masks,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/assembly/robotics)
+"bUJ" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bUK" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"bUL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"bUM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bUN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bUO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/noticeboard{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bUP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
+"bUQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bUR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
+"bUS" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
+"bUT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bUU" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"bUV" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Research Shuttle Maintenance"; dir = 2; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
+"bUW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
+"bUX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
+"bUY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research_shuttle_dock)
+"bUZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
+"bVa" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
+"bVb" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
+"bVc" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/research)
+"bVd" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "External Hatch"; req_access_txt = "65"},/obj/docking_port/mobile{dwidth = 3; height = 5; id = "science"; name = "research shuttle"; rebuildable = 1; width = 7},/obj/docking_port/stationary{dwidth = 3; height = 5; id = "science_home"; name = "research dock"; width = 7},/turf/simulated/shuttle/floor,/area/shuttle/research)
"bVe" = (/obj/machinery/kitchen_machine/microwave/upgraded,/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bVf" = (/obj/machinery/door/window/northright{name = "bar"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bVg" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bVh" = (/obj/item/ashtray/glass,/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bVi" = (/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/weapon/lighter/zippo{pixel_x = 5},/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bVj" = (/obj/machinery/door_control{id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bVk" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Workshop"; opacity = 1; req_access_txt = "105"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bVl" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"bVm" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/machinery/door_control{id = "QMLoaddoor2"; layer = 3; name = "Loading Doors"; pixel_x = 24; pixel_y = 8; req_access_txt = "0"},/obj/machinery/door_control{id = "QMLoaddoor"; layer = 3; name = "Loading Doors"; pixel_x = 24; pixel_y = -8; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"bVn" = (/obj/machinery/camera{c_tag = "Cargo Recieving Dock"; dir = 4},/obj/machinery/door_control{id = "QMLoaddoor"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = -8; req_access_txt = "0"},/obj/machinery/door_control{id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = 8; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
-"bVo" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #2"},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"bVp" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos,/obj/item/weapon/book/manual/sop_supply,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bVj" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/research)
+"bVk" = (/obj/machinery/door_control{id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bVl" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Workshop"; opacity = 1; req_access_txt = "105"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"bVm" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/supply)
+"bVn" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/machinery/door_control{id = "QMLoaddoor2"; layer = 3; name = "Loading Doors"; pixel_x = 24; pixel_y = 8; req_access_txt = "0"},/obj/machinery/door_control{id = "QMLoaddoor"; layer = 3; name = "Loading Doors"; pixel_x = 24; pixel_y = -8; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/supply)
+"bVo" = (/obj/machinery/camera{c_tag = "Cargo Recieving Dock"; dir = 4},/obj/machinery/door_control{id = "QMLoaddoor"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = -8; req_access_txt = "0"},/obj/machinery/door_control{id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = 8; req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
+"bVp" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #2"},/mob/living/simple_animal/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"bVq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bVr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bVs" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bVr" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos,/obj/item/weapon/book/manual/sop_supply,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bVs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bVt" = (/obj/machinery/vending/cart,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bVu" = (/obj/structure/closet/secure_closet/hop2,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bVv" = (/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bVw" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/obj/item/weapon/pen/multi,/obj/item/device/megaphone,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bVw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access_txt = "50"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bVx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bVy" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bVz" = (/obj/machinery/message_server,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/server)
+"bVy" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/obj/item/weapon/pen/multi,/obj/item/device/megaphone,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bVz" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bVA" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/server)
-"bVB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
+"bVB" = (/obj/machinery/message_server,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/server)
"bVC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/server)
-"bVD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
-"bVE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
-"bVF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/space,/area/space)
-"bVG" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/teleporter)
+"bVD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
+"bVE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
+"bVF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
+"bVG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/space,/area/space)
"bVH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/teleporter)
-"bVI" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
+"bVI" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/teleporter)
"bVJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/bluespace_beacon,/turf/simulated/floor/plasteel,/area/teleporter)
-"bVK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
-"bVL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
-"bVM" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/command{name = "Teleport Access"; req_access_txt = "17"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
-"bVN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/se)
-"bVO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR: EMERGENCY ENTRANCE'."; name = "KEEP CLEAR: EMERGENCY ENTRANCE"; pixel_x = 32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bVP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/backpack/medic,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/weapon/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay2)
-"bVQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medical Supplies"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/chemistry)
+"bVK" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
+"bVL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
+"bVM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Teleport Access"; req_access_txt = "17"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
+"bVN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/teleporter)
+"bVO" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/se)
+"bVP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR: EMERGENCY ENTRANCE'."; name = "KEEP CLEAR: EMERGENCY ENTRANCE"; pixel_x = 32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bVQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/backpack/medic,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/weapon/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay2)
"bVR" = (/obj/machinery/smartfridge/medbay,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bVS" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bVS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medical Supplies"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/chemistry)
"bVT" = (/turf/simulated/wall,/area/medical/medbay3)
-"bVU" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3)
-"bVV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3)
+"bVU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bVV" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3)
"bVW" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3)
-"bVX" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3)
-"bVY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bVZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bVX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3)
+"bVY" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3)
+"bVZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"bWa" = (/turf/simulated/wall,/area/medical/cryo)
"bWb" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/medical/cryo)
"bWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/cryo)
"bWd" = (/turf/simulated/wall,/area/medical/genetics_cloning)
-"bWe" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bWe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"bWf" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/genetics_cloning)
"bWg" = (/turf/simulated/wall,/area/medical/genetics)
-"bWh" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Genetics Maintenance"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/maintenance/genetics)
+"bWh" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bWi" = (/turf/simulated/wall/r_wall,/area/medical/genetics)
"bWj" = (/turf/simulated/wall,/area/assembly/chargebay)
"bWk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/assembly/chargebay)
"bWl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/assembly/robotics)
-"bWm" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
-"bWn" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bWo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bWm" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Genetics Maintenance"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/maintenance/genetics)
+"bWn" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
+"bWo" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bWp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bWr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bWr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bWs" = (/obj/machinery/camera{c_tag = "Research Hallway North"; dir = 1; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bWt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bWu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bWv" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access_txt = "47"},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
+"bWv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bWw" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
-"bWx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
+"bWx" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access_txt = "47"},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"bWy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"bWz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bWz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
"bWA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
-"bWB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
-"bWC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bWB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bWC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
"bWD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"bWE" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plating,/area/medical/research_shuttle_dock)
-"bWF" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (EAST)"; icon_state = "propulsion_l"; dir = 4},/turf/space,/area/shuttle/administration)
+"bWE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bWF" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plating,/area/medical/research_shuttle_dock)
"bWG" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration)
"bWH" = (/obj/structure/stool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bWI" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
@@ -5238,1040 +5164,1035 @@
"bWL" = (/obj/machinery/mecha_part_fabricator/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bWM" = (/obj/machinery/autolathe/upgraded{hacked = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"bWN" = (/obj/structure/dispenser,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bWO" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "31"},/obj/docking_port/mobile/supply,/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"bWP" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bWQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bWR" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #3"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"bWS" = (/obj/structure/table,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bWO" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_l"; tag = "icon-propulsion_l (EAST)"},/turf/space,/area/shuttle/administration)
+"bWP" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "31"},/obj/docking_port/mobile/supply,/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/shuttle/floor,/area/shuttle/supply)
+"bWQ" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bWR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bWS" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #3"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"bWT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bWU" = (/obj/machinery/light,/obj/machinery/computer/merch,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bWV" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/sw)
-"bWW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central/sw)
-"bWX" = (/obj/machinery/computer/security/mining{network = list("Mining Outpost")},/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/heads)
+"bWW" = (/obj/structure/table,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bWX" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central/sw)
"bWY" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Head of Personnel"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bWZ" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/item/device/eftpos,/obj/item/weapon/book/manual/sop_service,/obj/item/weapon/book/manual/sop_supply,/obj/item/weapon/book/manual/sop_command,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bXa" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bXb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/computer/guestpass/hop{pixel_x = 28},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bXb" = (/obj/machinery/computer/security/mining{network = list("Mining Outpost")},/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/heads)
"bXc" = (/obj/machinery/computer/message_monitor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
-"bXd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
-"bXe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
-"bXf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access_txt = "30"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
-"bXg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bXd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/computer/guestpass/hop{pixel_x = 28},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bXe" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
+"bXf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access_txt = "30"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
+"bXg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
"bXh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bXi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
-"bXj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/teleporter)
+"bXi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bXj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
"bXk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/teleporter)
"bXl" = (/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/teleporter)
"bXm" = (/obj/machinery/shieldwallgen,/obj/effect/decal/warning_stripes/yellow/hollow,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel,/area/teleporter)
"bXn" = (/obj/machinery/shieldwallgen,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel,/area/teleporter)
"bXo" = (/obj/structure/closet/crate,/turf/simulated/floor/plasteel,/area/teleporter)
-"bXp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/se)
+"bXp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/teleporter)
"bXq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bXr" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/se)
-"bXs" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay Emergency Entrance"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/medbay2)
+"bXr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/hallway/primary/central/se)
+"bXs" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/se)
"bXt" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
-"bXu" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"bXu" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay Emergency Entrance"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/medbay2)
"bXv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bXw" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"bXw" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"bXx" = (/obj/machinery/camera{c_tag = "Medbay Emergency Entrance"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"bXy" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"bXy" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"bXz" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay3)
-"bXA" = (/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light,/obj/item/weapon/gun/syringe,/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay3)
-"bXB" = (/obj/machinery/camera{c_tag = "Medbay Equipment"; dir = 1; network = list("SS13")},/obj/structure/closet/wardrobe/medical_white,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3)
+"bXA" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"bXB" = (/obj/structure/table,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light,/obj/item/weapon/gun/syringe,/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay3)
"bXC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3)
-"bXD" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_y = 8},/obj/item/weapon/storage/box/masks{pixel_y = -3},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/weapon/wirecutters{desc = "This cuts gloves."; name = "Glove Snippers"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay3)
-"bXE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bXD" = (/obj/machinery/camera{c_tag = "Medbay Equipment"; dir = 1; network = list("SS13")},/obj/structure/closet/wardrobe/medical_white,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3)
+"bXE" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_y = 8},/obj/item/weapon/storage/box/masks{pixel_y = -3},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/weapon/wirecutters{desc = "This cuts gloves."; name = "Glove Snippers"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay3)
"bXF" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bXG" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bXH" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel,/area/medical/cryo)
-"bXI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel,/area/medical/cryo)
+"bXI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"bXJ" = (/obj/machinery/cell_charger,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Cryogenics"; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"bXK" = (/obj/machinery/camera{c_tag = "Medbay Cloning"; network = list("SS13")},/obj/structure/closet/wardrobe/medic_white,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bXK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel,/area/medical/cryo)
"bXL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bXM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bXM" = (/obj/machinery/camera{c_tag = "Medbay Cloning"; network = list("SS13")},/obj/structure/closet/wardrobe/medic_white,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bXN" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/genetics)
-"bXO" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical1,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
-"bXP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/camera{c_tag = "Research Genetics North"; network = list("Research","SS13")},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
+"bXO" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bXP" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical1,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
"bXQ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bXR" = (/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/weapon/hand_labeler,/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
+"bXR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/camera{c_tag = "Research Genetics North"; network = list("Research","SS13")},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
"bXS" = (/obj/structure/closet/wardrobe/genetics_white,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
-"bXT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/medical/genetics)
+"bXT" = (/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/weapon/hand_labeler,/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
"bXU" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/research{name = "Genetics Research"; req_access_txt = "47;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bXV" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/research{name = "Research Division"})
-"bXW" = (/obj/machinery/camera{c_tag = "Research Hallway West"; dir = 2; network = list("Research","SS13")},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bXV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/medical/genetics)
+"bXW" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/research{name = "Research Division"})
"bXX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bXY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bXZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bXY" = (/obj/machinery/camera{c_tag = "Research Hallway West"; dir = 2; network = list("Research","SS13")},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bXZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bYa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteredcorner"},/area/medical/research{name = "Research Division"})
-"bYb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/research{name = "Research Division"})
+"bYb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bYc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteredcorner"},/area/medical/research{name = "Research Division"})
-"bYd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bYe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bYd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/research{name = "Research Division"})
+"bYe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bYf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bYg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"bYg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bYh" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
-"bYi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"bYi" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bYj" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bYk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
-"bYl" = (/obj/machinery/light{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bYl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bYm" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"bYn" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock)
+"bYn" = (/obj/machinery/light{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
"bYo" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock)
-"bYp" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bYp" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock)
"bYq" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/medical/research_shuttle_dock)
-"bYr" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research_shuttle_dock)
-"bYs" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (EAST)"; icon_state = "propulsion_r"; dir = 4},/turf/space,/area/shuttle/administration)
+"bYr" = (/obj/machinery/door/airlock/external{id_tag = "science_home"; name = "Shuttle Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"bYs" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research_shuttle_dock)
"bYt" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"bYu" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/administration)
-"bYv" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/structure/plasticflaps/mining,/turf/simulated/shuttle/plating,/area/shuttle/supply)
+"bYu" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_r"; tag = "icon-propulsion_r (EAST)"},/turf/space,/area/shuttle/administration)
+"bYv" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/administration)
"bYw" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bYx" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bYy" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
+"bYx" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/structure/plasticflaps/mining,/turf/simulated/shuttle/plating,/area/shuttle/supply)
+"bYy" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id_tag = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bYz" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/light,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
-"bYA" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
-"bYB" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/quartermaster/storage)
-"bYC" = (/obj/machinery/camera{c_tag = "Cargo Bay South"; dir = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bYA" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
+"bYB" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
+"bYC" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/quartermaster/storage)
"bYD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bYE" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #4"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
-"bYF" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bYG" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bYE" = (/obj/machinery/camera{c_tag = "Cargo Bay South"; dir = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bYF" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "QM #4"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
+"bYG" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bYH" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/computer/guestpass{pixel_y = -28},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/quartermaster/office)
-"bYI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bYI" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bYJ" = (/obj/structure/noticeboard{pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/quartermaster/office)
"bYK" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/qm)
"bYL" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/qm)
"bYM" = (/turf/simulated/wall,/area/quartermaster/qm)
-"bYN" = (/obj/machinery/camera{c_tag = "Cargo Bay Entrance"; dir = 4; network = list("SS13")},/obj/machinery/atm{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
-"bYO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/sw)
-"bYP" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw)
-"bYQ" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
-"bYR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel Requests Console"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bYS" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bYT" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bYN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/office)
+"bYO" = (/obj/machinery/camera{c_tag = "Cargo Bay Entrance"; dir = 4; network = list("SS13")},/obj/machinery/atm{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
+"bYP" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock)
+"bYQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw)
+"bYR" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/sw)
+"bYS" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel Requests Console"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bYT" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
"bYU" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/server)
-"bYV" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/simulated/floor/bluegrid,/area/server)
-"bYW" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/camera{c_tag = "Messaging Server"; dir = 1; network = list("SS13")},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
-"bYX" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"; dir = 1; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light,/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bYV" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bYW" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bYX" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/simulated/floor/bluegrid,/area/server)
"bYY" = (/obj/structure/closet/radiation,/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
"bYZ" = (/obj/machinery/computer/teleporter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/teleporter)
"bZa" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/teleporter)
"bZb" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/teleporter)
"bZc" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/teleporter)
-"bZd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bZe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 18},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bZf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"bZg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/se)
-"bZh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay Emergency Entrance"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/medbay2)
-"bZi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2)
-"bZj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"bZk" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"bZl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"bZm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
-"bZn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"bZo" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bZd" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/camera{c_tag = "Messaging Server"; dir = 1; network = list("SS13")},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
+"bZe" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"; dir = 1; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light,/turf/simulated/floor/plasteel,/area/engine/gravitygenerator)
+"bZf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 18},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bZg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bZh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/se)
+"bZi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"bZj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2)
+"bZk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay Emergency Entrance"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/medbay2)
+"bZl" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"bZm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"bZn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
+"bZo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"bZp" = (/obj/structure/noticeboard,/turf/simulated/wall,/area/medical/medbay3)
-"bZq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
-"bZr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bZq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bZr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"bZs" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bZt" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bZu" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"bZv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"bZw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Cryo and Arrivals Super APC"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"bZx" = (/obj/structure/table,/obj/item/weapon/book/manual/medical_cloning,/obj/item/weapon/storage/box/bodybags,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bZy" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bZv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Equipment"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3)
+"bZw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"bZx" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{cell_type = 15000; dir = 4; name = "Cryo and Arrivals Super APC"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"bZy" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bZz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bZA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bZB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
-"bZC" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bZD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bZE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/genetics)
-"bZF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
-"bZG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/research{name = "Genetics Research"; req_access_txt = "47;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bZH" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
-"bZI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/research{name = "Research Division"})
-"bZJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bZK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bZL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bZM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bZN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bZO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bZP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bZQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"bZR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor)
-"bZS" = (/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; req_access_txt = "47"},/obj/item/weapon/folder/white{pixel_x = 4},/obj/item/weapon/stamp/rd{pixel_x = 5; pixel_y = -2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"bZT" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Research Outpost","RD"); pixel_x = 0; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"bZU" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 7; name = "Research Director Requests Console"; pixel_x = -2; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"bZV" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
+"bZA" = (/obj/structure/table,/obj/item/weapon/book/manual/medical_cloning,/obj/item/weapon/storage/box/bodybags,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bZB" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bZC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
+"bZD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"bZE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"bZF" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"bZG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/genetics)
+"bZH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/research{name = "Genetics Research"; req_access_txt = "47;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"bZI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
+"bZJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/research{name = "Research Division"})
+"bZK" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
+"bZL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bZM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bZN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bZO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bZP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bZQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"bZR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"bZS" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bZT" = (/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; req_access_txt = "47"},/obj/item/weapon/folder/white{pixel_x = 4},/obj/item/weapon/stamp/rd{pixel_x = 5; pixel_y = -2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"bZU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"bZV" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 7; name = "Research Director Requests Console"; pixel_x = -2; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bZW" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
-"bZX" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
-"bZY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"bZX" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Research Outpost","RD"); pixel_x = 0; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"bZY" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
"bZZ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"caa" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
-"cab" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock)
-"cac" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research_shuttle_dock)
-"cad" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research_shuttle_dock)
+"cac" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cad" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock)
"cae" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/administration)
"caf" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cag" = (/obj/machinery/vending/cola,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cah" = (/obj/machinery/vending/coffee,/obj/machinery/light/spot,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cai" = (/obj/machinery/vending/cigarette,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"caj" = (/obj/structure/table/reinforced,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"caj" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research_shuttle_dock)
"cak" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"cal" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (WEST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 8},/turf/simulated/floor/plating,/area/shuttle/administration)
+"cal" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research_shuttle_dock)
"cam" = (/turf/simulated/wall,/area/quartermaster/miningdock)
-"can" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/mining{name = "Mining Dock"; req_access_txt = "48"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"can" = (/obj/structure/table/reinforced,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cao" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cap" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"caq" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"car" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cas" = (/obj/structure/disposalpipe/segment,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/sw)
-"cat" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"car" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (WEST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 8},/turf/simulated/floor/plating,/area/shuttle/administration)
+"cas" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Dock"; req_access_txt = "48"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cat" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cau" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/server)
"cav" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
-"caw" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/gravitygenerator)
-"cax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cay" = (/obj/machinery/camera{c_tag = "Central Hallway South-East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"caw" = (/obj/structure/disposalpipe/segment,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central/sw)
+"cax" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/gravitygenerator)
+"cay" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"caz" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/sleeper)
"caA" = (/turf/simulated/wall,/area/medical/sleeper)
-"caB" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
-"caC" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
-"caD" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"caE" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"caB" = (/obj/machinery/camera{c_tag = "Central Hallway South-East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"caC" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"caD" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"caE" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"caF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"caG" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"caG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"caH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom/department/medbay{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"caI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"caI" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"caJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"caK" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"caK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"caL" = (/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Medbay"; departmentType = 1; name = "Medbay Requests Console"; pixel_x = 0; pixel_y = 30; pixel_z = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"caM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"caN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"caM" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"caN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"caO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"caP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"caP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"caQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"caR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"caR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"caS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"caT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"caT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"caU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"caV" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"caV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"caW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"caX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"caX" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"caY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
-"caZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"caZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"cba" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"cbb" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
+"cbb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"cbc" = (/obj/item/roller,/obj/item/weapon/storage/box/disks,/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"cbd" = (/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
"cbe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
"cbf" = (/turf/simulated/wall/r_wall,/area/toxins/server)
-"cbg" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
"cbh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/storage)
-"cbi" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"cbi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
"cbj" = (/turf/simulated/wall/r_wall,/area/toxins/storage)
"cbk" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cbl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cbm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cbl" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"cbm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cbn" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cbo" = (/obj/item/weapon/paper/monitorkey,/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cbp" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"cbo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cbp" = (/obj/item/weapon/paper/monitorkey,/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cbq" = (/obj/machinery/computer/robotics,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cbr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
+"cbr" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cbs" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
-"cbt" = (/obj/structure/lamarr,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
-"cbu" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
+"cbt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
+"cbu" = (/obj/structure/lamarr,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
"cbv" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research_shuttle_dock)
-"cbw" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Bridge"; opacity = 1; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cbw" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research_shuttle_dock)
"cbx" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cby" = (/obj/machinery/computer/shuttle/admin,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"cbz" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; tag = "icon-window5 (EAST)"},/turf/simulated/floor/plating,/area/shuttle/administration)
-"cbA" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/supply)
+"cbz" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Bridge"; opacity = 1; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cbA" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; tag = "icon-window5 (EAST)"},/turf/simulated/floor/plating,/area/shuttle/administration)
"cbB" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/supply)
"cbC" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/supply)
-"cbD" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/supply)
-"cbE" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/supply)
-"cbF" = (/obj/structure/lattice,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 32},/turf/space,/area/space)
-"cbG" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/rcs,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cbD" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/supply)
+"cbE" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/supply)
+"cbF" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/supply)
+"cbG" = (/obj/structure/lattice,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 32},/turf/space,/area/space)
"cbH" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cbI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cbI" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/rcs,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cbJ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cbK" = (/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cbK" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cbL" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cbM" = (/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cbN" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cbN" = (/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cbO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cbP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cbQ" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cbS" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cbR" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cbS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cbT" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cbU" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cbV" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south)
-"cbW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south)
+"cbV" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cbW" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south)
"cbX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south)
-"cbY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cbY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south)
"cbZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cca" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cca" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"ccb" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"ccc" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"ccc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"ccd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cce" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"ccf" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"ccg" = (/obj/machinery/camera{c_tag = "Central Primary Hallway South"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"ccf" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"ccg" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cch" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cci" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"ccj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cck" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"ccj" = (/obj/machinery/camera{c_tag = "Central Primary Hallway South"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cck" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"ccl" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"ccm" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"ccn" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cco" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"ccp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"ccq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"ccr" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"ccs" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
+"ccq" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"ccr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"ccs" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cct" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"ccu" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"ccv" = (/obj/machinery/door_control{id = "acute1"; name = "Acute One Shutters Control"; pixel_y = 25},/obj/machinery/camera{c_tag = "Medbay Acute 1"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"ccw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Acute Treatment 1"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
-"ccx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ccv" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
+"ccw" = (/obj/machinery/door_control{id = "acute1"; name = "Acute One Shutters Control"; pixel_y = 25},/obj/machinery/camera{c_tag = "Medbay Acute 1"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"ccx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Acute Treatment 1"; req_access_txt = "5"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
"ccy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"ccz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"ccz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"ccA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"ccB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"ccB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"ccC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"ccD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"ccD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"ccE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"ccF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
+"ccF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"ccG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ccH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
-"ccI" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"ccH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
+"ccI" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"ccJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"ccK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"ccK" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"ccL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/medical/genetics_cloning)
-"ccM" = (/obj/structure/cable,/obj/item/roller,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"ccM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"ccN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"ccO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"ccP" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
-"ccQ" = (/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
-"ccR" = (/obj/machinery/r_n_d/server/robotics,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
+"ccO" = (/obj/structure/cable,/obj/item/roller,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"ccP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"ccQ" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
+"ccR" = (/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"ccS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
-"ccT" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
+"ccT" = (/obj/machinery/r_n_d/server/robotics,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"ccU" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/toxins/server)
-"ccV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"ccV" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"ccW" = (/obj/machinery/camera{c_tag = "Research Server Room"; dir = 2; network = list("Research","SS13"); pixel_x = 22},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
-"ccX" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 73; dir = 2; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"ccX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
"ccY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/area_atmos,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"ccZ" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"cda" = (/obj/machinery/portable_atmospherics/scrubber/huge,/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"cdb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cdc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cdd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
+"cdb" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 73; dir = 2; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"cdc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"cdd" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cde" = (/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/structure/table/glass,/obj/item/weapon/pen/multi,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cdf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"cdf" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"cdg" = (/obj/machinery/computer/mecha,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cdh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
+"cdh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cdi" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
-"cdj" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
-"cdk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cdj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
+"cdk" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
"cdl" = (/obj/machinery/dna_scannernew/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"cdm" = (/obj/machinery/computer/cloning,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"cdn" = (/obj/machinery/clonepod/upgraded,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
+"cdn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cdo" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"cdp" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "adminshuttleshutters"; name = "remote shutter control"; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cdp" = (/obj/machinery/clonepod/upgraded,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"cdq" = (/obj/machinery/computer/card/centcom,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"cdr" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 4},/turf/simulated/floor/plating,/area/shuttle/administration)
-"cds" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/supply)
+"cdr" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "adminshuttleshutters"; name = "remote shutter control"; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cds" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 4},/turf/simulated/floor/plating,/area/shuttle/administration)
"cdt" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/shuttle/supply)
"cdu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/supply)
-"cdv" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/supply)
-"cdw" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cdv" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/supply)
+"cdw" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/supply)
"cdx" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cdy" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cdy" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cdz" = (/obj/structure/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cdA" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cdB" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cdA" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cdB" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cdC" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/qm,/obj/item/weapon/stamp/granted{pixel_x = -4; pixel_y = 4},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -4},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cdD" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Quartermaster's Office"; dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cdE" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cdD" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cdE" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Quartermaster's Office"; dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cdF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cdG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cdH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cdG" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cdH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cdI" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cdJ" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cdK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cdK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cdL" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cdM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cdN" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cdO" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AftH"; location = "AIW"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cdO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cdP" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cdQ" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHE"; location = "AIE"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cdR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cdQ" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AftH"; location = "AIW"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cdR" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHE"; location = "AIE"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cdS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cdT" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cdT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cdU" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cdV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cdV" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cdW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cdX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cdX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cdY" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP"; location = "CHE"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cdZ" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light{dir = 8},/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
+"cdZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cea" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"ceb" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"ceb" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light{dir = 8},/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
"cec" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ced" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cee" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"ced" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"cee" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cef" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"ceg" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/goldenplaque{desc = "Done No Harm."; name = "Best Doctor 2552"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/cmo)
+"ceg" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"ceh" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access_txt = "40"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/cmo)
-"cei" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"cei" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/goldenplaque{desc = "Done No Harm."; name = "Best Doctor 2552"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/cmo)
"cej" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"cek" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cel" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
-"cem" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"cek" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"cel" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cem" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"cen" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel,/area/medical/cryo)
-"ceo" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
+"ceo" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"cep" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/genetics_cloning)
"ceq" = (/obj/machinery/clonepod/biomass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"cer" = (/obj/machinery/computer/cloning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"cer" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"ces" = (/obj/machinery/dna_scannernew,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"cet" = (/obj/structure/stool/bed/chair/office/dark,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
-"ceu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"cev" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"cet" = (/obj/machinery/computer/cloning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"ceu" = (/obj/structure/stool/bed/chair/office/dark,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
+"cev" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"cew" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
-"cex" = (/obj/machinery/alarm/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
+"cex" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"cey" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
-"cez" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
-"ceA" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Server Exterior Door"; req_access = null; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Server Interior Door"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
-"ceB" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"cez" = (/obj/machinery/alarm/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
+"ceA" = (/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Server Exterior Door"; req_access = null; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Server Interior Door"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"ceB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"ceC" = (/obj/structure/stool/bed/chair/office/light,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
-"ceD" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"ceD" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
"ceE" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"ceF" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"ceG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"ceH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 13},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"ceG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"ceH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"ceI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"ceJ" = (/obj/machinery/door/airlock/glass_command{name = "Research Director"; req_access_txt = "30"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"ceJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 13},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ceK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"ceL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"ceL" = (/obj/machinery/door/airlock/glass_command{name = "Research Director"; req_access_txt = "30"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"ceM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"ceN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"ceN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"ceO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"ceP" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"ceP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"ceQ" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/toxins/mixing)
"ceR" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"ceS" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Medbay"; opacity = 1; req_access_txt = "103"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"ceT" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area/shuttle/supply)
+"ceS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"ceT" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Medbay"; opacity = 1; req_access_txt = "103"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"ceU" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/supply)
-"ceV" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area/shuttle/supply)
-"ceW" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/mining)
-"ceX" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining)
+"ceV" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area/shuttle/supply)
+"ceW" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area/shuttle/supply)
+"ceX" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/mining)
"ceY" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/mining)
-"ceZ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/mining)
-"cfa" = (/obj/machinery/computer/security/mining,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Mining Dock"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"ceZ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining)
+"cfa" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/mining)
"cfb" = (/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cfc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cfd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cfe" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cff" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cfg" = (/obj/machinery/light,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
-"cfh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cff" = (/obj/machinery/computer/security/mining,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Mining Dock"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cfg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cfh" = (/obj/machinery/light,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/sw)
"cfi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cfj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cfj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cfk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cfl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cfl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cfm" = (/obj/machinery/camera{c_tag = "Central Primary Hallway South-West"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
-"cfn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cfn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cfo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cfp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cfp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cfq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cfr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cfr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cfs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/light,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cft" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cfu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cfu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cfv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cfw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"cfx" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 22},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cfx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cfy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
"cfz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cfA" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cfB" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cfA" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 22},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
+"cfB" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cfC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cfD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cfD" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cfE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/se)
-"cfF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door_control{id = "paramedic"; name = "Garage Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "66"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cfF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"cfG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cfH" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
-"cfI" = (/obj/machinery/iv_drip,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
-"cfJ" = (/obj/machinery/door_control{id = "acutesep"; name = "Acute Separation Shutters Control"; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"cfK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"cfH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door_control{id = "paramedic"; name = "Garage Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "66"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cfI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
+"cfJ" = (/obj/machinery/iv_drip,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
+"cfK" = (/obj/machinery/door_control{id = "acutesep"; name = "Acute Separation Shutters Control"; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"cfL" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Chief Medical Officer's Office"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/cmo)
-"cfM" = (/obj/machinery/light{dir = 1},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/cmo)
+"cfM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"cfN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/cmo)
-"cfO" = (/obj/structure/closet/secure_closet/CMO,/obj/machinery/light{dir = 1},/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/cmo)
+"cfO" = (/obj/machinery/light{dir = 1},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/cmo)
"cfP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"cfQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cfR" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
-"cfS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cryo)
+"cfQ" = (/obj/structure/closet/secure_closet/CMO,/obj/machinery/light{dir = 1},/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/cmo)
+"cfR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cfS" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"cfT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall,/area/medical/genetics)
-"cfU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/genetics)
-"cfV" = (/obj/machinery/computer/scan_consolenew,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
+"cfU" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cryo)
+"cfV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/genetics)
"cfW" = (/obj/machinery/dna_scannernew,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"cfX" = (/obj/machinery/door/window/southright{dir = 1; name = "Primate Pen"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"cfX" = (/obj/machinery/computer/scan_consolenew,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
"cfY" = (/obj/machinery/dna_scannernew,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"cfZ" = (/obj/machinery/computer/scan_consolenew,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
-"cga" = (/obj/machinery/r_n_d/server/core,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
+"cfZ" = (/obj/machinery/door/window/southright{dir = 1; name = "Primate Pen"; req_access_txt = "9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
+"cga" = (/obj/machinery/computer/scan_consolenew,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"cgb" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
-"cgc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
+"cgc" = (/obj/machinery/r_n_d/server/core,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"cgd" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/turf/simulated/floor/plating,/area/toxins/server)
-"cge" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"cge" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"cgf" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
"cgg" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
-"cgh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/toxins/storage)
-"cgi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cgj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cgh" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"cgi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"cgj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cgk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cgl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
-"cgm" = (/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cgn" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"cgm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cgn" = (/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cgo" = (/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("Research","SS13")},/obj/item/clothing/glasses/welding/superior,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cgp" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"cgp" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cgq" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"cgr" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"cgr" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cgs" = (/turf/simulated/wall/r_wall,/area/toxins/mixing)
"cgt" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall,/area/toxins/mixing)
"cgu" = (/turf/simulated/wall/r_wall/coated,/area/toxins/mixing)
-"cgv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor{id_tag = "ToxinsVenting"; name = "Toxins Venting Bay Door"; use_power = 0},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
+"cgv" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"cgw" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"cgx" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"cgy" = (/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"cgz" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"cgA" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining)
+"cgy" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor{id_tag = "ToxinsVenting"; name = "Toxins Venting Bay Door"; use_power = 0},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
+"cgz" = (/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cgA" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cgB" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/mining)
"cgC" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/shuttle/floor,/area/shuttle/mining)
"cgD" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining)
-"cgE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock)
-"cgF" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock)
+"cgE" = (/turf/simulated/wall/r_wall,/area/toxins/launch{name = "Toxins Launch Room"})
+"cgF" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining)
"cgG" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock)
-"cgH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cgH" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock)
"cgI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cgJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cgJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cgK" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cgL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access_txt = "41"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cgL" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cgM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cgN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cgO" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"cgP" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
+"cgN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access_txt = "41"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cgO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
+"cgP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cgQ" = (/turf/simulated/wall,/area/maintenance/apmaint)
-"cgR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cgR" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/sw)
"cgS" = (/turf/simulated/wall,/area/blueshield)
-"cgT" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/blueshield)
-"cgU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/command{name = "Blueshield's Office"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield)
+"cgT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cgU" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/blueshield)
"cgV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "blueshield"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/blueshield)
"cgW" = (/turf/simulated/wall,/area/ntrep)
-"cgX" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep)
-"cgY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/command{name = "NT Representative's Office"; req_access_txt = "73"},/turf/simulated/floor/wood,/area/ntrep)
+"cgX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Blueshield's Office"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield)
+"cgY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep)
"cgZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "representative"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/ntrep)
"cha" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south)
-"chb" = (/obj/structure/sign/directions/engineering,/obj/structure/sign/directions/science{dir = 4; pixel_x = 0; pixel_y = -7},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/turf/simulated/wall,/area/janitor)
+"chb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "NT Representative's Office"; req_access_txt = "73"},/turf/simulated/floor/wood,/area/ntrep)
"chc" = (/turf/simulated/wall,/area/janitor)
"chd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/janitor)
-"che" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/janitor)
+"che" = (/obj/structure/sign/directions/engineering,/obj/structure/sign/directions/science{dir = 4; pixel_x = 0; pixel_y = -7},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/turf/simulated/wall,/area/janitor)
"chf" = (/turf/simulated/wall,/area/maintenance/asmaint)
-"chg" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"chg" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/janitor)
"chh" = (/turf/simulated/wall,/area/medical/paramedic)
-"chi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "paramedic"; name = "Paramedic Garage"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
-"chj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/diamond{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
+"chi" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"chj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "paramedic"; name = "Paramedic Garage"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
"chk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/paramedic)
-"chl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper)
+"chl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/diamond{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
"chm" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
-"chn" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"chn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper)
"cho" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/sleeper)
-"chp" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"chq" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"chp" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"chq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"chr" = (/turf/simulated/wall/r_wall,/area/medical/cmo)
-"chs" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/cmo)
-"cht" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
+"chs" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cht" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/cmo)
"chu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
-"chv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump Important Area"; pixel_x = 24; shock_proof = 0},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
-"chw" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"chv" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
+"chw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump Important Area"; pixel_x = 24; shock_proof = 0},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
"chx" = (/turf/simulated/wall,/area/medical/medbreak)
-"chy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/door_control{id = "staffroom"; name = "Staff Room Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"chy" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
"chz" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"chA" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"chA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/door_control{id = "staffroom"; name = "Staff Room Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chB" = (/obj/machinery/camera{c_tag = "Medbay Break Room"; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"chC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/woodentable,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"chC" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"chE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/genetics)
-"chF" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
-"chG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
+"chF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/woodentable,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"chG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
"chH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/genetics)
"chI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"chJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"chK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"chL" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
+"chL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
"chM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
-"chN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
+"chN" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"chO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server)
"chP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/toxins/server)
-"chQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server)
-"chR" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Research Toxins Storage Room"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"chQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
+"chR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server)
"chS" = (/mob/living/simple_animal/mouse/white,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"chT" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"chU" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"chV" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"chW" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"chX" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/camera{c_tag = "Research Toxins Mixing North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"chU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Research Toxins Storage Room"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"chV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"chW" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"chX" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"chY" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"chZ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall/coated,/area/toxins/mixing)
-"cia" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
-"cib" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
+"cia" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
+"cib" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
"cic" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"cid" = (/turf/simulated/wall,/area/toxins/test_area)
"cie" = (/turf/simulated/wall/r_wall,/area/toxins/test_area)
-"cif" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall/r_wall,/area/toxins/test_area)
+"cif" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/camera{c_tag = "Research Toxins Mixing North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cig" = (/obj/machinery/sleeper/upgraded{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"cih" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"cii" = (/obj/machinery/chem_dispenser,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"cij" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Holding Cell"; opacity = 1; req_access_txt = "104"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"cik" = (/obj/machinery/door/window/brigdoor/westleft{color = "#d70000"; req_access_txt = "104"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cij" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall/r_wall,/area/toxins/test_area)
+"cik" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Holding Cell"; opacity = 1; req_access_txt = "104"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cil" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cim" = (/turf/simulated/shuttle/floor,/area/shuttle/mining)
"cin" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining)
-"cio" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/miningdock)
-"cip" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/item/weapon/ore/iron,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock)
-"ciq" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock)
+"cio" = (/obj/machinery/door/window/brigdoor/westleft{color = "#d70000"; req_access_txt = "104"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cip" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/miningdock)
+"ciq" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/item/weapon/ore/iron,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock)
"cir" = (/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cis" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"cit" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"cit" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock)
"ciu" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"civ" = (/obj/structure/closet,/obj/machinery/light_switch{pixel_x = -27},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"ciw" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"cix" = (/obj/structure/table,/obj/item/weapon/coin/silver,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"ciy" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
-"ciz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ciy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"ciz" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"ciA" = (/obj/machinery/light{dir = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/blueshield)
"ciB" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/blueshield)
-"ciC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/blueshield)
+"ciC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"ciD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/blueshield)
-"ciE" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/blueshield)
+"ciE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/blueshield)
"ciF" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase,/obj/item/weapon/book/manual/sop_engineering,/obj/item/weapon/book/manual/sop_medical,/obj/item/weapon/book/manual/sop_science,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_service,/obj/item/weapon/book/manual/sop_supply,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/book/manual/sop_legal,/obj/item/weapon/book/manual/sop_command,/turf/simulated/floor/wood,/area/ntrep)
"ciG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/ntrep)
-"ciH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/ntrep)
+"ciH" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/blueshield)
"ciI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/ntrep)
-"ciJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep)
-"ciK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"ciJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/ntrep)
+"ciK" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep)
"ciL" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"ciM" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"ciN" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/janitor)
+"ciM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"ciN" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"ciO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/plasteel,/area/janitor)
-"ciP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/key/janitor,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/simulated/floor/plasteel,/area/janitor)
+"ciP" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/janitor)
"ciQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/vehicle/janicart,/turf/simulated/floor/plasteel,/area/janitor)
"ciR" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
-"ciS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/janitor)
-"ciT" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/janitor)
+"ciS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/key/janitor,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/simulated/floor/plasteel,/area/janitor)
+"ciT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/janitor)
"ciU" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 8; location = "Janitor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/asmaint)
-"ciV" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ciV" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/janitor)
"ciW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/paramedic)
-"ciX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
+"ciX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ciY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/vehicle/ambulance,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"ciZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door_control{id = "paramedic"; name = "Garage Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "66"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
+"ciZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
"cja" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/effect/landmark/start{name = "Paramedic"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"cjb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
+"cjb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door_control{id = "paramedic"; name = "Garage Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "66"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
"cjc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"cjd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
+"cjd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"cje" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"cjf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"cjg" = (/obj/machinery/door_control{id = "acutesep"; name = "Acute Separation Shutters Control"; pixel_y = 25},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Medbay Acute 2"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"cjh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Acute Treatment 2"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"cjg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
+"cjh" = (/obj/machinery/door_control{id = "acutesep"; name = "Acute Separation Shutters Control"; pixel_y = 25},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Medbay Acute 2"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"cji" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"cjj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cjk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access_txt = "40"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
+"cjj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Acute Treatment 2"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"cjk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"cjl" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/cmo)
"cjm" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
"cjn" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
-"cjo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
+"cjo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access_txt = "40"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
"cjp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access_txt = "40"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
-"cjq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cjr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cjq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
+"cjr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"cjs" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Staff Room"; req_access_txt = "5"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbreak)
-"cjt" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cju" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cjv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cjt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cju" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cjv" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cjw" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cjx" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/medical/genetics)
-"cjy" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
+"cjx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cjy" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/medical/genetics)
"cjz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
-"cjA" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Research Genetics South"; dir = 1; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
+"cjA" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
"cjB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
-"cjC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
-"cjD" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
-"cjE" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
-"cjF" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"cjC" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Research Genetics South"; dir = 1; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
+"cjE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
+"cjF" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"cjG" = (/turf/simulated/floor/engine,/area/toxins/explab_chamber)
-"cjH" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Chamber"; dir = 2; network = list("Telepad","Research","SS13"); pixel_x = 0},/obj/machinery/light{dir = 1; on = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
-"cjI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"cjH" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"cjI" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Chamber"; dir = 2; network = list("Telepad","Research","SS13"); pixel_x = 0},/obj/machinery/light{dir = 1; on = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"cjJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/toxins/explab_chamber)
"cjK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/storage)
-"cjL" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"cjL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"cjM" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"cjN" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"cjO" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/decal/warning_stripes/yellow,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"cjP" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cjQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cjR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cjP" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"cjQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"cjR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cjS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cjT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cjU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cjT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cjU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cjV" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cjW" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cjX" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/air_sensor{frequency = 1222; id_tag = "burn_sensor"},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
-"cjY" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
+"cjX" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
+"cjY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cjZ" = (/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"cka" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"ckb" = (/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
"ckc" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
"ckd" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"cke" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"ckf" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"ckg" = (/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 8},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"cke" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/air_sensor{frequency = 1222; id_tag = "burn_sensor"},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
+"ckf" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
+"ckg" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"ckh" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"cki" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/mining)
-"ckj" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; req_access_txt = "48"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; rebuildable = 1; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/shuttle/floor,/area/shuttle/mining)
-"ckk" = (/obj/machinery/door/airlock/external{id_tag = "mining_home"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/quartermaster/miningdock)
-"ckl" = (/obj/machinery/door/airlock/external{id_tag = "mining_home"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"ckm" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock)
-"ckn" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Shaft Miner"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"ckj" = (/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 8},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"ckk" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; req_access_txt = "48"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; rebuildable = 1; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/shuttle/floor,/area/shuttle/mining)
+"ckl" = (/obj/machinery/door/airlock/external{id_tag = "mining_home"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/quartermaster/miningdock)
+"ckm" = (/obj/machinery/door/airlock/external{id_tag = "mining_home"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"ckn" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock)
"cko" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"ckp" = (/obj/item/weapon/beach_ball/holoball,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"ckq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ckq" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Shaft Miner"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"ckr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/blueshield)
-"cks" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/blueshield)
+"cks" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"ckt" = (/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
"cku" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/blueshield)
"ckv" = (/turf/simulated/floor/wood,/area/ntrep)
"ckw" = (/turf/simulated/floor/carpet,/area/ntrep)
-"ckx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/ntrep)
+"ckx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/blueshield)
"cky" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/ntrep)
-"ckz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"ckz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/ntrep)
"ckA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"ckB" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"ckB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"ckC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/janitor)
-"ckD" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/janitor)
+"ckD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"ckE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Janitor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
-"ckF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
+"ckF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel,/area/janitor)
"ckG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/janitor)
-"ckH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/janitor)
+"ckH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
"ckI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/janitor)
-"ckJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ckK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
+"ckJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/janitor)
+"ckK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ckL" = (/obj/structure/stool/bed/amb_trolley,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"ckM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
+"ckM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
"ckN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"ckO" = (/obj/structure/closet/secure_closet/paramedic,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"ckP" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "acute2"; name = "Acute 2 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
+"ckO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/paramedic)
+"ckP" = (/obj/structure/closet/secure_closet/paramedic,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"ckQ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"ckR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ckR" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "acute2"; name = "Acute 2 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
"ckS" = (/obj/machinery/camera{c_tag = "Medbay Port Corridor"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/disposal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"ckT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/cmo)
-"ckU" = (/obj/machinery/camera{c_tag = "Medbay Chief Medical Officer's Office"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 9},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/cmo)
-"ckV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door_control{id = "Biohazard_medi"; name = "Emergency Medbay Quarantine"; pixel_y = 7},/obj/machinery/door_control{id = "cmooffice"; name = "Privacy Shutters Control"; pixel_y = -3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
+"ckU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ckV" = (/obj/machinery/camera{c_tag = "Medbay Chief Medical Officer's Office"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 9},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/cmo)
"ckW" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
-"ckX" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
-"ckY" = (/obj/machinery/camera{c_tag = "Medbay Starboard Corridor"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
+"ckX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door_control{id = "Biohazard_medi"; name = "Emergency Medbay Quarantine"; pixel_y = 7},/obj/machinery/door_control{id = "cmooffice"; name = "Privacy Shutters Control"; pixel_y = -3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
+"ckY" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
"ckZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cla" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cla" = (/obj/machinery/camera{c_tag = "Medbay Starboard Corridor"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"clb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/medbreak)
-"clc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"clc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cld" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cle" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cle" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"clf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"clg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"clg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"clh" = (/obj/machinery/computer/med_data,/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cli" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/genetics)
-"clj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/genetics)
+"clj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"clk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/medical/genetics)
-"cll" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"cll" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/genetics)
"clm" = (/obj/machinery/r_n_d/experimentor,/turf/simulated/floor/engine,/area/toxins/explab_chamber)
-"cln" = (/obj/effect/landmark{name = "blobstart"},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
-"clo" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"cln" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"clo" = (/obj/effect/landmark{name = "blobstart"},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"clp" = (/turf/simulated/wall/r_wall,/area/toxins/explab_chamber)
"clq" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"clr" = (/obj/effect/decal/warning_stripes/yellow,/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"cls" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"clt" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"clt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"clu" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"clv" = (/obj/machinery/atmospherics/binary/valve,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"clw" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
-"clx" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "ToxinsIgnitor"; on = 0},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
-"cly" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing)
-"clz" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"clv" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"clw" = (/obj/machinery/atmospherics/binary/valve,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"clx" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
+"cly" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
+"clz" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "ToxinsIgnitor"; on = 0},/turf/simulated/floor/engine/insulated/vacuum,/area/toxins/mixing)
"clA" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"clB" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber North"; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
+"clB" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"clC" = (/obj/structure/table,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel,/obj/item/weapon/retractor,/obj/item/weapon/FixOVein,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"clD" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"clE" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"clF" = (/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"clG" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"clH" = (/obj/structure/table,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"clI" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock)
-"clJ" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/quartermaster/miningdock)
+"clG" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/mindshield,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"clH" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber North"; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
+"clI" = (/obj/structure/table,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"clJ" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock)
"clK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall,/area/quartermaster/miningdock)
"clL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"clM" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"clM" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/quartermaster/miningdock)
"clN" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; name = "QM Office"; sortType = 3},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"clO" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access_txt = "48"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"clO" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"clP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"clQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"clQ" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access_txt = "48"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"clR" = (/turf/simulated/floor/wood,/area/blueshield)
"clS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
-"clT" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor/wood,/area/blueshield)
+"clT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"clU" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/ntrep)
-"clV" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor/wood,/area/ntrep)
-"clW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"clV" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor/wood,/area/blueshield)
+"clW" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor/wood,/area/ntrep)
"clX" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"clY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"clZ" = (/obj/machinery/requests_console{department = "Janitorial"; name = "Janitor Requests Console"; departmentType = 1; pixel_y = -29},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel,/area/janitor)
+"clY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"clZ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cma" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/restraints/legcuffs/beartrap,/turf/simulated/floor/plasteel,/area/janitor)
"cmb" = (/obj/machinery/light,/obj/structure/rack{dir = 1},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/turf/simulated/floor/plasteel,/area/janitor)
-"cmc" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/janitorialcart,/turf/simulated/floor/plasteel,/area/janitor)
+"cmc" = (/obj/machinery/requests_console{department = "Janitorial"; name = "Janitor Requests Console"; departmentType = 1; pixel_y = -29},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel,/area/janitor)
"cmd" = (/turf/simulated/floor/plasteel,/area/janitor)
-"cme" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light_switch{pixel_y = -23},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/janitor)
+"cme" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/janitorialcart,/turf/simulated/floor/plasteel,/area/janitor)
"cmf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/janitor)
"cmg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cmh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cmh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light_switch{pixel_y = -23},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/janitor)
"cmi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/paramedic)
-"cmj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/paramedic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
+"cmj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cmk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"cml" = (/obj/machinery/light,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Paramedic Bay"; dir = 1; network = list("SS13")},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
+"cml" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/paramedic,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"cmm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
"cmn" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
-"cmo" = (/obj/machinery/door_control{id = "acute2"; name = "Acute 2 Shutters Control"; pixel_x = 6; pixel_y = -25},/obj/machinery/door_control{id = "scansep"; name = "Scanning Room Separation Shutters Control"; pixel_x = -6; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"cmp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"cmo" = (/obj/machinery/light,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Paramedic Bay"; dir = 1; network = list("SS13")},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/paramedic)
+"cmp" = (/obj/machinery/door_control{id = "acute2"; name = "Acute 2 Shutters Control"; pixel_x = 6; pixel_y = -25},/obj/machinery/door_control{id = "scansep"; name = "Scanning Room Separation Shutters Control"; pixel_x = -6; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"cmq" = (/obj/machinery/vending/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
-"cmr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"cmr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
"cms" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
"cmt" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cmo)
-"cmu" = (/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/coffee,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/stamp/cmo,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/glass,/obj/item/weapon/pen/multi,/obj/item/weapon/book/manual/sop_medical,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
+"cmu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"cmv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"cmw" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2)
"cmx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
-"cmy" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cmy" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2)
"cmz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbreak)
-"cmA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cmA" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cmC" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/book/manual/sop_medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cmC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cmD" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cmE" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cmE" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/book/manual/sop_medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cmF" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/medical/psych)
"cmG" = (/obj/structure/table/woodentable,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/wood,/area/medical/psych)
-"cmH" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/briefcase,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/wood,/area/medical/psych)
+"cmH" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cmI" = (/obj/structure/closet/secure_closet/psychiatrist,/turf/simulated/floor/wood,/area/medical/psych)
-"cmJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/medical/psych)
-"cmK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/carpet,/area/medical/psych)
+"cmJ" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/briefcase,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/wood,/area/medical/psych)
+"cmK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/medical/psych)
"cmL" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/medical/psych)
"cmM" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
-"cmN" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
+"cmN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/carpet,/area/medical/psych)
"cmO" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"cmP" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"cmQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"cmQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"cmR" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cmS" = (/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
-"cmT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
+"cmT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cmU" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
-"cmV" = (/obj/structure/closet/wardrobe/toxins_white,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/mixing)
-"cmW" = (/obj/structure/closet/wardrobe/toxins_white,/obj/machinery/camera{c_tag = "Research Toxins Mixing West"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/mixing)
+"cmV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
+"cmW" = (/obj/structure/closet/wardrobe/toxins_white,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/mixing)
"cmX" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/mixing)
-"cmY" = (/obj/structure/rack,/obj/structure/window/plasmareinforced{dir = 4},/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"},/area/toxins/mixing)
+"cmY" = (/obj/structure/closet/wardrobe/toxins_white,/obj/machinery/camera{c_tag = "Research Toxins Mixing West"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/mixing)
"cmZ" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cna" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cnb" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cnb" = (/obj/structure/rack,/obj/structure/window/plasmareinforced{dir = 4},/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"},/area/toxins/mixing)
"cnc" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/meter,/turf/simulated/floor/plating,/area/toxins/mixing)
"cnd" = (/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/turf/simulated/floor/plating,/area/toxins/mixing)
"cne" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/meter,/turf/simulated/floor/plating,/area/toxins/mixing)
-"cnf" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/toxins/test_area)
+"cnf" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cng" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cnh" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/mining)
"cni" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/shuttle/mining)
"cnj" = (/obj/structure/ore_box,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/mining)
-"cnk" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock)
+"cnk" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/toxins/test_area)
"cnl" = (/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock)
-"cnm" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock)
+"cnm" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock)
"cnn" = (/obj/effect/decal/cleanable/dirt,/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cno" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cnp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cno" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock)
+"cnp" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cnq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cnr" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cns" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cnt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/blueshield)
+"cnr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cns" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cnt" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cnu" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/ntrep)
-"cnv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/wood,/area/ntrep)
+"cnv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/blueshield)
"cnw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/ntrep)
-"cnx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cnx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/wood,/area/ntrep)
"cny" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cnz" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cnA" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cnB" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cnC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cnD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Paramedic Maintenance"; req_access_txt = "66"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cnE" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "scansep"; name = "Scanning Room Separation Shutters"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"cnz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cnA" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cnB" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cnC" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cnD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cnE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Paramedic Maintenance"; req_access_txt = "66"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cnF" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/medical/sleeper)
-"cnG" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"cnH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cnG" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "scansep"; name = "Scanning Room Separation Shutters"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"cnH" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"cnI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall,/area/medical/medbay2)
-"cnJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"cnJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cnK" = (/obj/machinery/light,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo)
-"cnL" = (/obj/structure/table,/obj/item/device/megaphone,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo)
+"cnL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"cnM" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo)
-"cnN" = (/obj/machinery/computer/crew,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo)
"cnO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"cnP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"cnQ" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cnP" = (/obj/machinery/computer/crew,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cmo)
+"cnQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"cnR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cnS" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cnS" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cnT" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cnU" = (/obj/machinery/hologram/holopad,/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cnU" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
"cnV" = (/obj/machinery/vending/chinese,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
-"cnW" = (/obj/structure/table/woodentable,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/paper_bin{pixel_y = 5},/obj/item/weapon/clipboard{pixel_x = -5},/obj/item/weapon/pen/multi,/turf/simulated/floor/wood,/area/medical/psych)
-"cnX" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Psychiatrist"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/medical/psych)
+"cnW" = (/obj/machinery/hologram/holopad,/obj/item/device/radio/intercom/department/medbay{pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak)
+"cnX" = (/obj/structure/table/woodentable,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/paper_bin{pixel_y = 5},/obj/item/weapon/clipboard{pixel_x = -5},/obj/item/weapon/pen/multi,/turf/simulated/floor/wood,/area/medical/psych)
"cnY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/medical/psych)
-"cnZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/medical/psych)
+"cnZ" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Psychiatrist"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/wood,/area/medical/psych)
"coa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/medical/psych)
-"cob" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/medical/psych)
+"cob" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/medical/psych)
"coc" = (/obj/machinery/camera{c_tag = "Medbay Psych Office"; dir = 8; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/carpet,/area/medical/psych)
"cod" = (/turf/simulated/wall/r_wall,/area/toxins/explab)
-"coe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/explab)
-"cof" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/engine,/area/toxins/explab)
+"coe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/medical/psych)
+"cof" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/explab)
"cog" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/explab)
"coh" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"coi" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"coj" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
-"cok" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
+"coi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/engine,/area/toxins/explab)
+"coj" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
+"cok" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"col" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
-"com" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
+"com" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
"con" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
-"coo" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Mixing Room"; req_access_txt = "7"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/mixing)
+"coo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
"cop" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/mixing)
"coq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cor" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/window/eastright{name = "Toxins Mixing Room"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/mixing)
+"cor" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Mixing Room"; req_access_txt = "7"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/mixing)
"cos" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cot" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cot" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/window/eastright{name = "Toxins Mixing Room"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/mixing)
"cou" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cov" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cov" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cow" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cox" = (/obj/machinery/door_control{id = "ToxinsVenting"; name = "Toxin Venting Control"; pixel_x = -8; pixel_y = 26},/obj/machinery/ignition_switch{id = "ToxinsIgnitor"; pixel_x = 6; pixel_y = 25},/obj/machinery/computer/general_air_control{frequency = 1222; name = "Bomb Mix Monitor"; sensors = list("burn_sensor" = "Burn Mix")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cox" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"coy" = (/obj/machinery/atmospherics/binary/pump/highcap,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"coz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/unary/cold_sink/freezer,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"coz" = (/obj/machinery/door_control{id = "ToxinsVenting"; name = "Toxin Venting Control"; pixel_x = -8; pixel_y = 26},/obj/machinery/ignition_switch{id = "ToxinsIgnitor"; pixel_x = 6; pixel_y = 25},/obj/machinery/computer/general_air_control{frequency = 1222; name = "Bomb Mix Monitor"; sensors = list("burn_sensor" = "Burn Mix")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"coA" = (/obj/machinery/portable_atmospherics/pump,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Research Toxins Mixing East"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"coB" = (/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"coC" = (/obj/structure/dispenser,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"coD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing)
-"coE" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Research Toxins Launch Room"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"coF" = (/obj/machinery/driver_button{dir = 2; id_tag = "toxinsdriver"; pixel_y = 24; range = 18},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"coG" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins"); pixel_x = 32; pixel_y = 0},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"coH" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
-"coI" = (/turf/simulated/floor/plasteel/airless{dir = 9; icon_state = "warning"},/area/toxins/test_area)
+"coC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/unary/cold_sink/freezer,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"coD" = (/obj/structure/dispenser,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"coE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/launch{name = "Toxins Launch Room"})
+"coF" = (/obj/machinery/camera{c_tag = "Research Toxins Launch Room"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
+"coG" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins"); pixel_x = 32; pixel_y = 0},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
+"coH" = (/obj/machinery/driver_button{dir = 2; id_tag = "toxinsdriver"; pixel_y = 24; range = 18},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
+"coI" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
"coJ" = (/turf/simulated/floor/plasteel/airless{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/area/toxins/test_area)
"coK" = (/obj/structure/stool/bed,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"coL" = (/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"coM" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/mining)
+"coM" = (/turf/simulated/floor/plasteel/airless{dir = 9; icon_state = "warning"},/area/toxins/test_area)
"coN" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area/shuttle/mining)
-"coO" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/mining)
+"coO" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/mining)
"coP" = (/obj/structure/table/glass,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
-"coQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"coQ" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/mining)
"coR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"coS" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"coS" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"coT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"coU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; name = "HoP Office"; sortType = 15},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"coV" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"coW" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield)
+"coU" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"coV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; name = "HoP Office"; sortType = 15},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"coW" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"coX" = (/obj/structure/table/woodentable,/obj/item/ashtray/glass{pixel_x = -4; pixel_y = -4},/obj/item/weapon/lighter/zippo/blue{pixel_x = 7; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
-"coY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue,/obj/item/weapon/folder/blue{pixel_x = 4; pixel_y = 6},/obj/item/weapon/paper/blueshield,/obj/item/weapon/book/manual/sop_command,/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
+"coY" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield)
"coZ" = (/obj/structure/sign/poster/legit{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield)
"cpa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/ntrep)
"cpb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep)
"cpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/ntrep)
"cpd" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{req_access_txt = "57"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/ntrep)
"cpe" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard{pixel_x = -2},/obj/item/weapon/folder,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/stamp/centcom,/obj/item/weapon/pen/multi/fountain,/turf/simulated/floor/carpet,/area/ntrep)
-"cpf" = (/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "73"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/wood,/area/ntrep)
-"cpg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cpf" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue,/obj/item/weapon/folder/blue{pixel_x = 4; pixel_y = 6},/obj/item/weapon/paper/blueshield,/obj/item/weapon/book/manual/sop_command,/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
+"cpg" = (/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "73"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/wood,/area/ntrep)
"cph" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cpi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cpi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"cpj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cpk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cpl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cpk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cpl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cpm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cpn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cpn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cpo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cpp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cpq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cpp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cpq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cpr" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cps" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cpt" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/sleeper)
+"cpt" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cpu" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/sleeper)
-"cpv" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/sleeper)
+"cpv" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/sleeper)
"cpw" = (/obj/machinery/door_control{id = "scanhide"; name = "Scanning Room Privacy Shutters Control"; pixel_x = 6; pixel_y = 25},/obj/machinery/camera{c_tag = "Medbay Scanning"; network = list("SS13")},/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"; tag = ""},/obj/machinery/door_control{id = "scansep"; name = "Scanning Room Separation Shutters Control"; pixel_x = -6; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/sleeper)
-"cpx" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "scanhide"; name = "Scanning Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper)
-"cpy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cpz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
+"cpx" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/sleeper)
+"cpy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "scanhide"; name = "Scanning Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper)
+"cpz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cpA" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"cpB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/medical/cmo)
+"cpB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"cpC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access_txt = "40"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/cmo)
-"cpD" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
-"cpE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/medical/medbay2)
+"cpD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/medical/cmo)
+"cpE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "cmooffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo)
"cpF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"cpG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"cpG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/medical/medbay2)
"cpH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/medical/medbreak)
"cpI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/medbreak)
-"cpJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/medbreak)
-"cpK" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/door_control{id = "psychoffice"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/medical/psych)
-"cpL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/medical/psych)
+"cpJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay2)
+"cpK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/medbreak)
+"cpL" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/door_control{id = "psychoffice"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/medical/psych)
"cpM" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/wood,/area/medical/psych)
"cpN" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/wood,/area/medical/psych)
"cpO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light,/turf/simulated/floor/carpet,/area/medical/psych)
"cpP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/comfy/lime{dir = 1},/turf/simulated/floor/carpet,/area/medical/psych)
"cpQ" = (/obj/structure/stool/psychbed,/turf/simulated/floor/carpet,/area/medical/psych)
"cpR" = (/turf/simulated/wall,/area/toxins/explab)
-"cpS" = (/obj/machinery/door_control{id = "telescienceblast"; name = "Test Chamber Blast Doors"; pixel_x = -25; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cpT" = (/obj/structure/closet/radiation,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/toxins/explab)
-"cpU" = (/obj/machinery/computer/rdconsole/experiment,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/explab)
+"cpS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/medical/psych)
+"cpT" = (/obj/machinery/door_control{id = "telescienceblast"; name = "Test Chamber Blast Doors"; pixel_x = -25; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cpU" = (/obj/structure/closet/radiation,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/toxins/explab)
"cpV" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/experimentor,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/toxins/explab)
-"cpW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/toxins/explab)
-"cpX" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/toxins/explab)
-"cpY" = (/obj/machinery/light_switch{pixel_y = -23},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
+"cpW" = (/obj/machinery/computer/rdconsole/experiment,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/explab)
+"cpX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/toxins/explab)
+"cpY" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/toxins/explab)
"cpZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
-"cqa" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"cqa" = (/obj/machinery/light_switch{pixel_y = -23},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage)
"cqb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cqc" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
+"cqc" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cqd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"})
"cqe" = (/obj/effect/decal/warning_stripes/northwestcorner,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
-"cqf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
+"cqf" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cqg" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/warning_stripes/northeastcorner,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
"cqh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing)
-"cqi" = (/obj/structure/closet/bombcloset,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/mixing)
+"cqi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing)
"cqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cqk" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cql" = (/obj/structure/closet/l3closet/scientist,/obj/structure/window/plasmareinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/mixing)
+"cql" = (/obj/structure/closet/bombcloset,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/mixing)
"cqm" = (/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"; tag = "icon-warnwhitecorner (EAST)"},/area/toxins/mixing)
-"cqn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cqn" = (/obj/structure/closet/l3closet/scientist,/obj/structure/window/plasmareinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/mixing)
"cqo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cqp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cqp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cqq" = (/obj/machinery/atmospherics/binary/valve,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cqs" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cqt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access_txt = "7"},/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"cqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"cqv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"cqw" = (/obj/machinery/doppler_array{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/mixing)
-"cqx" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
-"cqy" = (/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warning"},/area/toxins/test_area)
+"cqt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cqv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
+"cqw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access_txt = "7"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
+"cqx" = (/obj/machinery/doppler_array{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
+"cqy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/toxins/launch{name = "Toxins Launch Room"})
"cqz" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cqA" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cqB" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cqC" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
-"cqD" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
-"cqE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cqC" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"cqD" = (/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "warning"},/area/toxins/test_area)
+"cqE" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
"cqF" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cqG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cqH" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Blueshield"; departmentType = 5; name = "Blueshield Requests Console"; pixel_x = -30},/turf/simulated/floor/wood,/area/blueshield)
+"cqG" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
+"cqH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cqI" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Blueshield"},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
"cqJ" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{req_one_access = null},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
"cqK" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield)
@@ -6279,300 +6200,300 @@
"cqM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/ntrep)
"cqN" = (/obj/item/flag/nt,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/wood,/area/ntrep)
"cqO" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/ntrep)
-"cqP" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/device/flashlight/lamp/green{pixel_x = -5; pixel_y = 12},/obj/item/weapon/paper/ntrep,/turf/simulated/floor/carpet,/area/ntrep)
+"cqP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cqQ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Nanotrasen Representative"},/turf/simulated/floor/carpet,/area/ntrep)
-"cqR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "NT Representative"; departmentType = 5; dir = 2; name = "NT Representative Requests Console"; pixel_x = 30},/turf/simulated/floor/wood,/area/ntrep)
-"cqS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cqT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cqU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cqR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Blueshield"; departmentType = 5; name = "Blueshield Requests Console"; pixel_x = -30},/turf/simulated/floor/wood,/area/blueshield)
+"cqS" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/device/flashlight/lamp/green{pixel_x = -5; pixel_y = 12},/obj/item/weapon/paper/ntrep,/turf/simulated/floor/carpet,/area/ntrep)
+"cqT" = (/obj/machinery/requests_console{announcementConsole = 1; department = "NT Representative"; departmentType = 5; dir = 2; name = "NT Representative Requests Console"; pixel_x = 30},/turf/simulated/floor/wood,/area/ntrep)
+"cqU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cqV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/hallway/primary/aft)
"cqW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/engine/controlroom)
-"cqX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/engine/controlroom)
-"cqY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall,/area/engine/controlroom)
+"cqX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cqY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cqZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/engine/controlroom)
"cra" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint)
"crb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"crc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/asmaint)
-"crd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"crd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall,/area/engine/controlroom)
"cre" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"crf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"crg" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/asmaint)
-"crh" = (/obj/machinery/door/window/eastleft{name = "Medical Delivery"; req_access_txt = "5"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/medical/sleeper)
-"cri" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/sleeper)
-"crj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/medical/sleeper)
+"crg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/engine/controlroom)
+"crh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cri" = (/obj/machinery/door/window/eastleft{name = "Medical Delivery"; req_access_txt = "5"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/medical/sleeper)
+"crj" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/asmaint)
"crk" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/medical/sleeper)
-"crl" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/sleeper)
-"crm" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "scanhide"; name = "Scanning Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/sleeper)
-"crn" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"cro" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"crp" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crq" = (/obj/machinery/light{dir = 1},/obj/structure/table,/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/item/roller,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crr" = (/obj/machinery/camera{c_tag = "Medbay Lounge"; network = list("SS13")},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crs" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"cru" = (/obj/machinery/vending/coffee,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crv" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/medical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crw" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"cry" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"crz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor West"; network = list("SS13")},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
+"crl" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/medical/sleeper)
+"crm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/sleeper)
+"crn" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/sleeper)
+"cro" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"crp" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "scanhide"; name = "Scanning Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/sleeper)
+"crq" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"crs" = (/obj/machinery/camera{c_tag = "Medbay Lounge"; network = list("SS13")},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crt" = (/obj/machinery/light{dir = 1},/obj/structure/table,/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/item/roller,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"cru" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crv" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crw" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/medical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crx" = (/obj/machinery/vending/coffee,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"cry" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"crz" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crA" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"crB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"crC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"crD" = (/turf/simulated/wall,/area/medical/psych)
-"crE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Psych Office"; req_access_txt = "64"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/psych)
+"crE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor West"; network = list("SS13")},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"crF" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/psych)
-"crG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
-"crH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
-"crI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
-"crJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"crK" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the E.X.P.E.R.I-MENTOR chamber."; layer = 4; name = "E.X.P.E.R.I-MENTOR Camera Screen"; network = list("Telepad"); pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"crG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
+"crH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Psych Office"; req_access_txt = "64"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/psych)
+"crI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
+"crJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
+"crK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "psychoffice"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/psych)
"crL" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"crM" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"crN" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"crN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"crO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"crP" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"crQ" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"crQ" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the E.X.P.E.R.I-MENTOR chamber."; layer = 4; name = "E.X.P.E.R.I-MENTOR Camera Screen"; network = list("Telepad"); pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"crR" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"crS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"crT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"crU" = (/obj/structure/closet/bombcloset,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitepurple"},/area/toxins/mixing)
-"crV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/mixing)
-"crW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/mixing)
-"crX" = (/obj/structure/closet/l3closet/scientist,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/window/plasmareinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/mixing)
-"crY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"crZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"csa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"csb" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"crT" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"crU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/toxins/storage)
+"crV" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"crW" = (/obj/structure/closet/bombcloset,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitepurple"},/area/toxins/mixing)
+"crX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/mixing)
+"crY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/mixing)
+"crZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"csa" = (/obj/structure/closet/l3closet/scientist,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/window/plasmareinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/mixing)
+"csb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"csc" = (/obj/machinery/atmospherics/unary/portables_connector{layer = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"csd" = (/obj/machinery/disposal,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -30; pixel_y = 0},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{tag = "icon-warningcorner"; icon_state = "warningcorner"; dir = 2},/area/toxins/mixing)
-"cse" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/mixing)
-"csf" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/toxins/mixing)
-"csg" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
-"csh" = (/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "warning"},/area/toxins/test_area)
-"csi" = (/turf/simulated/floor/plasteel/airless{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/toxins/test_area)
+"csd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cse" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"csf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"csg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"csh" = (/obj/machinery/atmospherics/unary/portables_connector{layer = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"csi" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"csj" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/space)
"csk" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"csl" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"csm" = (/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
-"csn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"csn" = (/obj/machinery/disposal,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -30; pixel_y = 0},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{tag = "icon-warningcorner"; icon_state = "warningcorner"; dir = 2},/area/toxins/launch{name = "Toxins Launch Room"})
"cso" = (/obj/machinery/light/small{dir = 1},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"csp" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"csq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"csr" = (/obj/structure/closet/secure_closet/blueshield,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/blueshield)
-"css" = (/obj/machinery/door_control{id = "blueshield"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "67"},/obj/machinery/computer/crew,/turf/simulated/floor/wood,/area/blueshield)
-"cst" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/obj/machinery/camera{c_tag = "Blueshield's Office"; dir = 1; network = list("SS13")},/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/blueshield)
-"csu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/wood,/area/blueshield)
-"csv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/ntrep)
+"csq" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/toxins/launch{name = "Toxins Launch Room"})
+"csr" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"css" = (/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "warning"},/area/toxins/test_area)
+"cst" = (/turf/simulated/floor/plasteel/airless{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/toxins/test_area)
+"csu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"csv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"csw" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/ntrep)
-"csx" = (/obj/machinery/camera{c_tag = "NT Representative's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange{department = "NT Representative's Office"},/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/ntrep)
-"csy" = (/obj/machinery/door_control{id = "representative"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "73"},/obj/machinery/computer/secure_data,/turf/simulated/floor/wood,/area/ntrep)
-"csz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet/secure_closet/ntrep,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep)
-"csA" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Aft Primary Hallway 1"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"csB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"csC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"csx" = (/obj/machinery/door_control{id = "blueshield"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "67"},/obj/machinery/computer/crew,/turf/simulated/floor/wood,/area/blueshield)
+"csy" = (/obj/structure/closet/secure_closet/blueshield,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/blueshield)
+"csz" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/obj/machinery/camera{c_tag = "Blueshield's Office"; dir = 1; network = list("SS13")},/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/blueshield)
+"csA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/ntrep)
+"csB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/wood,/area/blueshield)
+"csC" = (/obj/machinery/door_control{id = "representative"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "73"},/obj/machinery/computer/secure_data,/turf/simulated/floor/wood,/area/ntrep)
"csD" = (/turf/simulated/wall,/area/engine/controlroom)
-"csE" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"csF" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"csE" = (/obj/machinery/camera{c_tag = "NT Representative's Office"; dir = 1; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine/longrange{department = "NT Representative's Office"},/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/ntrep)
+"csF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet/secure_closet/ntrep,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep)
"csG" = (/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"csH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"csI" = (/obj/structure/cable,/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/engine/controlroom)
+"csH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"csI" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Aft Primary Hallway 1"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"csJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/controlroom)
"csK" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"csL" = (/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"csM" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"csN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"csO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/maintenance/asmaint)
+"csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"csN" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"csO" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor/plasteel,/area/engine/controlroom)
"csP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/sleeper)
-"csQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/sleeper)
+"csQ" = (/obj/structure/cable,/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/engine/controlroom)
"csR" = (/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/plasteel,/area/medical/sleeper)
"csS" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/medical/sleeper)
-"csT" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "scanhide"; name = "Scanning Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper)
-"csU" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
+"csT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"csU" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"csV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"csW" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"csX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"csY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"csZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cta" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ctb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ctc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ctd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cte" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ctf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"ctg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"cth" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"cti" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"ctj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"ctk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"ctl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"ctm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
-"ctn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
-"cto" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"ctp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"ctq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"ctr" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cts" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"ctt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"csW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"csX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/maintenance/asmaint)
+"csY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/sleeper)
+"csZ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
+"cta" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "scanhide"; name = "Scanning Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper)
+"ctb" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cte" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cth" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cti" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctk" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"ctl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"ctm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"ctn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"cto" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"ctp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"ctq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"ctr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
+"cts" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"ctt" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"ctu" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/explab)
"ctv" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"ctw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"ctx" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cty" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ctz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ctA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ctB" = (/obj/structure/table,/obj/structure/cable,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"ctC" = (/obj/structure/table,/obj/item/device/assembly/signaler{pixel_x = 8; pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = 5; pixel_y = -5},/obj/item/device/assembly/signaler{pixel_x = 3; pixel_y = 4},/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler{pixel_x = 4; pixel_y = -2},/obj/item/device/assembly/signaler{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"ctw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"ctx" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cty" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"ctz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"ctA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"ctB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"ctC" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"ctD" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"ctE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"ctF" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"ctG" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/plasmareinforced{dir = 1},/obj/structure/window/plasmareinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
-"ctH" = (/obj/machinery/door/window/southright{name = "Toxins Launcher"; req_access_txt = "7"; req_one_access_txt = "0"},/obj/machinery/door/window/southright{dir = 1; name = "Toxins Launcher"; req_access_txt = "7"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
-"ctI" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
+"ctF" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ctG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ctH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ctI" = (/obj/structure/table,/obj/structure/cable,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"ctJ" = (/turf/simulated/floor/plasteel/airless{icon_state = "warning"},/area/toxins/test_area)
-"ctK" = (/turf/simulated/floor/plasteel/airless{dir = 6; icon_state = "warning"},/area/toxins/test_area)
-"ctL" = (/turf/simulated/floor/plasteel/airless{dir = 10; icon_state = "warning"},/area/toxins/test_area)
+"ctK" = (/obj/structure/table,/obj/item/device/assembly/signaler{pixel_x = 8; pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = 5; pixel_y = -5},/obj/item/device/assembly/signaler{pixel_x = 3; pixel_y = 4},/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler{pixel_x = 4; pixel_y = -2},/obj/item/device/assembly/signaler{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"ctL" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"ctM" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"ctN" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"ctO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"ctP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"ctQ" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ctO" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/plasmareinforced{dir = 1},/obj/structure/window/plasmareinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"ctP" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/item/device/radio/intercom,/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"ctQ" = (/obj/machinery/door/window/southright{name = "Toxins Launcher"; req_access_txt = "7"; req_one_access_txt = "0"},/obj/machinery/door/window/southright{dir = 1; name = "Toxins Launcher"; req_access_txt = "7"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
"ctR" = (/turf/simulated/wall/r_wall,/area/blueshield)
-"ctS" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"ctT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"ctU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"ctV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Engineering"},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/window/westright{name = "Engineering Monitoring Station"; req_access = null; req_access_txt = "0"; req_one_access_txt = "11;24;34"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/controlroom)
-"ctW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Monitoring Station"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/engine/controlroom)
-"ctX" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/engine/controlroom)
+"ctS" = (/turf/simulated/floor/plasteel/airless{dir = 6; icon_state = "warning"},/area/toxins/test_area)
+"ctT" = (/turf/simulated/floor/plasteel/airless{dir = 10; icon_state = "warning"},/area/toxins/test_area)
+"ctU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ctV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ctW" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ctX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"ctY" = (/turf/simulated/floor/plasteel,/area/engine/controlroom)
"ctZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cua" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/computer/security/engineering,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
+"cua" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"cub" = (/obj/structure/closet,/obj/machinery/light/small{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cuc" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/asmaint)
-"cud" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cue" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cuf" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/sleeper)
+"cud" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Engineering"},/obj/machinery/door/firedoor,/obj/machinery/door/window/westright{name = "Engineering Monitoring Station"; req_access = null; req_access_txt = "0"; req_one_access_txt = "11;24;34"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/controlroom)
+"cue" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cuf" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/engine/controlroom)
"cug" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/medical/sleeper)
-"cuh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/sleeper)
-"cui" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/medical/sleeper)
-"cuj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
-"cuk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cul" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cuh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Monitoring Station"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/engine/controlroom)
+"cui" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/computer/security/engineering,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
+"cuj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cuk" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cul" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/sleeper)
"cum" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"cun" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"cuo" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cup" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"cuq" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"cur" = (/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
-"cus" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cut" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
-"cuu" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cuv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cuw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cuy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cuz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
-"cuB" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuH" = (/obj/machinery/door/firedoor{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "E.X.P.E.R.I-MENTOR Lab"; req_access_txt = "47"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cuI" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cuJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cuK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cuL" = (/obj/machinery/camera{c_tag = "Research Hallway South"; dir = 1; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cup" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/sleeper)
+"cuq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
+"cur" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/medical/sleeper)
+"cus" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cut" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cuu" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"cuv" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"cuw" = (/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2)
+"cux" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
+"cuy" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cuz" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
+"cuA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cuB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cuC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cuD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cuE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
+"cuF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cuG" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cuH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cuI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cuJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cuK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cuL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "E.X.P.E.R.I-MENTOR Lab"; req_access_txt = "47"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cuM" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cuN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cuO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cuO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cuP" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cuQ" = (/turf/simulated/wall,/area/maintenance/asmaint2)
-"cuR" = (/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -4; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = 5; pixel_y = 5},/obj/structure/table,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cuS" = (/obj/item/device/assembly/timer,/obj/item/device/assembly/timer{pixel_x = 6},/obj/item/device/assembly/timer{pixel_x = -5; pixel_y = 6},/obj/structure/table,/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = -4},/obj/item/device/assembly/timer{pixel_x = 8; pixel_y = 8},/obj/item/device/assembly/timer,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/light,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cuR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cuS" = (/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cuT" = (/obj/item/device/transfer_valve,/obj/item/device/transfer_valve,/obj/item/device/transfer_valve,/obj/item/device/transfer_valve,/obj/item/device/transfer_valve,/obj/structure/table,/obj/item/device/transfer_valve,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cuU" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cuV" = (/obj/machinery/atmospherics/trinary/mixer{density = 0; dir = 8; req_access = null},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cuV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cuW" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cuX" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cuY" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cuX" = (/obj/machinery/camera{c_tag = "Research Hallway South"; dir = 1; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cuY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cuZ" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cva" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cvb" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
-"cvc" = (/obj/machinery/mass_driver{dir = 4; id_tag = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/mixing)
-"cvd" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/toxins/mixing)
-"cve" = (/turf/simulated/floor/plating,/area/toxins/mixing)
-"cvf" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/toxins/mixing)
-"cvg" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"cvc" = (/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -4; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = 5; pixel_y = 5},/obj/structure/table,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cvd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/launch{name = "Toxins Launch Room"})
+"cve" = (/obj/item/device/assembly/timer,/obj/item/device/assembly/timer{pixel_x = 6},/obj/item/device/assembly/timer{pixel_x = -5; pixel_y = 6},/obj/structure/table,/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = -4},/obj/item/device/assembly/timer{pixel_x = 8; pixel_y = 8},/obj/item/device/assembly/timer,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/light,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cvf" = (/obj/machinery/atmospherics/trinary/mixer{density = 0; dir = 8; req_access = null},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cvg" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"cvh" = (/obj/item/device/radio/beacon,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
-"cvi" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/toxins/test_area)
-"cvj" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber East"; dir = 8; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
+"cvi" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"cvj" = (/obj/machinery/mass_driver{dir = 4; id_tag = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
"cvk" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cvl" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cvm" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cvn" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cvn" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cvo" = (/turf/simulated/wall,/area/maintenance/consarea)
"cvp" = (/turf/simulated/wall/r_wall,/area/maintenance/apmaint)
"cvq" = (/turf/simulated/wall/r_wall,/area/storage/tech)
-"cvr" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech)
-"cvs" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/storage/tech)
-"cvt" = (/obj/machinery/camera{c_tag = "Tech Storage"; dir = 2; network = list("SS13")},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cyborgrecharger{pixel_x = -4; pixel_y = -2},/obj/item/weapon/circuitboard/mech_bay_power_console{pixel_x = 2; pixel_y = 2},/obj/item/weapon/circuitboard/mech_recharger,/obj/item/weapon/circuitboard/mechfab{pixel_y = 3},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/storage/tech)
+"cvr" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"cvs" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"cvt" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/toxins/test_area)
"cvu" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/healthanalyzer,/turf/simulated/floor/plating,/area/storage/tech)
-"cvv" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/storage/tech)
-"cvw" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plating,/area/storage/tech)
+"cvv" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber East"; dir = 8; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
+"cvw" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech)
"cvx" = (/turf/simulated/wall,/area/storage/tech)
-"cvy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cvz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cvA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cvy" = (/obj/machinery/camera{c_tag = "Tech Storage"; dir = 2; network = list("SS13")},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cyborgrecharger{pixel_x = -4; pixel_y = -2},/obj/item/weapon/circuitboard/mech_bay_power_console{pixel_x = 2; pixel_y = 2},/obj/item/weapon/circuitboard/mech_recharger,/obj/item/weapon/circuitboard/mechfab{pixel_y = 3},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/storage/tech)
+"cvz" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/storage/tech)
+"cvA" = (/obj/structure/table,/obj/item/device/plant_analyzer,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/storage/tech)
"cvB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/controlroom)
"cvC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cvD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cvD" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plating,/area/storage/tech)
"cvE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cvF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cvG" = (/obj/machinery/disposal,/obj/machinery/camera{c_tag = "Atmospherics Monitoring"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
+"cvG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cvH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/construction)
"cvI" = (/turf/simulated/wall,/area/construction)
-"cvJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/construction)
-"cvK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/sleeper)
-"cvL" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/sleeper)
-"cvM" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/sleeper)
-"cvN" = (/obj/structure/cable,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/sleeper)
-"cvO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Scanning Room"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"cvP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2)
-"cvQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cvR" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"cvS" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
-"cvT" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cvU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cvV" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cvW" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
-"cvX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
+"cvJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cvK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cvL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cvM" = (/obj/machinery/disposal,/obj/machinery/camera{c_tag = "Atmospherics Monitoring"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
+"cvN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/construction)
+"cvO" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/sleeper)
+"cvP" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/sleeper)
+"cvQ" = (/obj/structure/cable,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/sleeper)
+"cvR" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/sleeper)
+"cvS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2)
+"cvT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Scanning Room"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"cvU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cvV" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"cvW" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2)
+"cvX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cvY" = (/turf/simulated/wall,/area/medical/patient_a)
"cvZ" = (/obj/structure/sign/greencross,/turf/simulated/wall/r_wall,/area/medical/patient_a)
-"cwa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/patients_rooms)
-"cwb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms)
+"cwa" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cwb" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
"cwc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/medical/biostorage)
"cwd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/biostorage)
-"cwe" = (/obj/structure/extinguisher_cabinet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/medical/biostorage)
-"cwf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Secondary Storage"; req_access_txt = "39"},/turf/simulated/floor/plasteel,/area/medical/biostorage)
+"cwe" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
+"cwf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
"cwg" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/biostorage)
-"cwh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cwi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/medbay2)
+"cwh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms)
+"cwi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/patients_rooms)
"cwj" = (/obj/machinery/light,/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cwk" = (/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/item/device/radio,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cwl" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Lab"; dir = 1; network = list("Research","SS13")},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cwm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
-"cwn" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cwk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Secondary Storage"; req_access_txt = "39"},/turf/simulated/floor/plasteel,/area/medical/biostorage)
+"cwl" = (/obj/structure/extinguisher_cabinet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/medical/biostorage)
+"cwm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/medical/medbay2)
+"cwn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cwo" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/telepad_cargo,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cwp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"cwq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/research{name = "Research Division"})
-"cwr" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"cws" = (/obj/machinery/light,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreencorner"},/area/medical/research{name = "Research Division"})
-"cwt" = (/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cwq" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Lab"; dir = 1; network = list("Research","SS13")},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cwr" = (/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/item/device/radio,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cws" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cwt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cwu" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cwv" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "warning"},/area/toxins/test_area)
-"cww" = (/turf/simulated/floor/plasteel/airless{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/toxins/test_area)
+"cwv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/research{name = "Research Division"})
+"cww" = (/obj/machinery/light,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreencorner"},/area/medical/research{name = "Research Division"})
"cwx" = (/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
"cwy" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/incinerator)
"cwz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint)
@@ -6585,76 +6506,76 @@
"cwG" = (/obj/structure/table,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/maintenance/consarea)
"cwH" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area/maintenance/consarea)
"cwI" = (/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cwJ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
-"cwK" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
-"cwL" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/storage/tech)
-"cwM" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
+"cwJ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"cwK" = (/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cwL" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "warning"},/area/toxins/test_area)
+"cwM" = (/turf/simulated/floor/plasteel/airless{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/toxins/test_area)
"cwN" = (/obj/structure/table,/obj/item/weapon/apc_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating,/area/storage/tech)
"cwO" = (/turf/simulated/floor/plating,/area/storage/tech)
-"cwP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/tech)
-"cwQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/storage/tech)
+"cwP" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
+"cwQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/storage/tech)
"cwR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
"cwS" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
"cwT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/storage/tech)
-"cwU" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cwV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cwW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cwX" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Desk"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/controlroom)
-"cwY" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cwZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cxa" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cxb" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cxc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cxd" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
-"cxe" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cxf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cxg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cwU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
+"cwV" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
+"cwW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/tech)
+"cwX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/storage/tech)
+"cwY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cwZ" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cxa" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Engineering Desk"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/controlroom)
+"cxb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cxc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cxd" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cxe" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cxf" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cxg" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
"cxh" = (/turf/simulated/wall,/area/medical/ward)
"cxi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/ward)
-"cxj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cxk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cxj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cxk" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cxl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/ward)
-"cxm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/ward)
+"cxm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cxn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/ward)
-"cxo" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "scanhide"; name = "Scanning Room Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay2)
+"cxo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cxp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"cxq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/patient_a)
-"cxr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sink,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Isolation A"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/patient_a)
-"cxs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_a)
-"cxt" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_a)
-"cxu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacya"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_a)
-"cxv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cxw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cxr" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cxs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Ward"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cxt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/medical/ward)
+"cxu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "scanhide"; name = "Scanning Room Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay2)
+"cxv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_a)
+"cxw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sink,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Isolation A"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/patient_a)
"cxx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/medical/biostorage)
-"cxy" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/biostorage)
-"cxz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/biostorage)
-"cxA" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/biostorage)
+"cxy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacya"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_a)
+"cxz" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_a)
+"cxA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
"cxB" = (/turf/simulated/wall/r_wall,/area/medical/biostorage)
"cxC" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cxD" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cxD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cxE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/toxins/explab)
-"cxF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.X.P.E.R.I-MENTOR Lab Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cxF" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/medical/biostorage)
"cxG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/toxins/explab)
-"cxH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/toxins/explab)
+"cxH" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/biostorage)
"cxI" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/toxins/explab)
"cxJ" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cxK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cxL" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cxL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/biostorage)
"cxM" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cxN" = (/turf/simulated/wall,/area/toxins/xenobiology)
"cxO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/toxins/xenobiology)
-"cxP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cxP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cxQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/toxins/xenobiology)
-"cxR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cxR" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.X.P.E.R.I-MENTOR Lab Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cxS" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/asmaint2)
-"cxT" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cxU" = (/obj/machinery/light/small{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cxT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/toxins/explab)
+"cxU" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cxV" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cxW" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cxW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cxX" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
"cxY" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
-"cxZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cya" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cxZ" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cya" = (/obj/machinery/light/small{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cyb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cyc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cyd" = (/obj/machinery/atmospherics/unary/tank/toxins{volume = 3200},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
@@ -6665,1581 +6586,1577 @@
"cyi" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating,/area/maintenance/consarea)
"cyj" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/consarea)
"cyk" = (/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cyl" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cym" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
-"cyn" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel,/area/storage/tech)
-"cyo" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/tech)
-"cyp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/storage/tech)
+"cyl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cym" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cyn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cyo" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cyp" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cyq" = (/obj/structure/table,/obj/item/device/aicard,/obj/item/weapon/aiModule/reset,/turf/simulated/floor/plating,/area/storage/tech)
-"cyr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/rdconsole/public{pixel_x = -4},/obj/item/weapon/circuitboard/rdserver{pixel_x = 4; pixel_y = -2},/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe{pixel_x = -2; pixel_y = 3},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/circuitboard/circuit_imprinter{pixel_x = -4; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
-"cys" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/bodyscanner,/obj/item/weapon/circuitboard/bodyscanner_console,/obj/item/weapon/circuitboard/sleeper{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech)
-"cyt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/obj/item/weapon/circuitboard/arcade/battle,/obj/item/weapon/circuitboard/arcade/orion_trail{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plating,/area/storage/tech)
+"cyr" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
+"cys" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/tech)
+"cyt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel,/area/storage/tech)
"cyu" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plating,/area/storage/tech)
-"cyv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cyw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cyv" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/storage/tech)
+"cyw" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/rdconsole/public{pixel_x = -4},/obj/item/weapon/circuitboard/rdserver{pixel_x = 4; pixel_y = -2},/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe{pixel_x = -2; pixel_y = 3},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/circuitboard/circuit_imprinter{pixel_x = -4; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
"cyx" = (/obj/machinery/computer/guestpass,/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cyy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cyy" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/obj/item/weapon/circuitboard/arcade/battle,/obj/item/weapon/circuitboard/arcade/orion_trail{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plating,/area/storage/tech)
"cyz" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cyA" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
+"cyA" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/bodyscanner,/obj/item/weapon/circuitboard/bodyscanner_console,/obj/item/weapon/circuitboard/sleeper{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech)
"cyB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/construction)
-"cyC" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cyC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"cyD" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cyE" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cyF" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyJ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/camera{c_tag = "Medbay Recovery Ward West"; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cyF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cyG" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/engine/controlroom)
+"cyH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cyI" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cyJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cyK" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyL" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cyM" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyN" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cyQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyP" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/camera{c_tag = "Medbay Recovery Ward West"; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cyR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/ward)
-"cyS" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/medbay2)
+"cyS" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cyT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"cyU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/medbay2)
+"cyU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cyV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/patient_a)
-"cyW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/patient_a)
-"cyX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_a)
-"cyY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_a)
-"cyZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation A"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_a)
-"cza" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"czb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
-"czc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
+"cyW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cyY" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/medbay2)
+"cyZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/medbay2)
+"cza" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_a)
+"czb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/patient_a)
+"czc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation A"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_a)
"czd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/medical/biostorage)
-"cze" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Medbay Storage"; dir = 8; network = list("SS13")},/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
-"czf" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"czr" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"czs" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"czt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"czu" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/remains/robot,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"czD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cze" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_a)
+"czf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"czg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
+"czh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
+"czi" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Medbay Storage"; dir = 8; network = list("SS13")},/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"czj" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czu" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"czv" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"czw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"czx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"czy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"czz" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"czA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"czB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"czC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"czD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"czE" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"czF" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
-"czG" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
+"czG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"czH" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"czI" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Gas Pump"; on = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"czI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/remains/robot,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"czJ" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czK" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"czL" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"czL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"czM" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/consarea)
"czN" = (/obj/machinery/light/small{dir = 8},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"czO" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/storage/tech)
-"czP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/tech)
-"czQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Secure Tech Storage"; req_access_txt = "19;23"},/turf/simulated/floor/plating,/area/storage/tech)
-"czR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/tech)
-"czS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/storage/tech)
-"czT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/tech)
-"czU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "blobstart"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/storage/tech)
-"czV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access_txt = "23"},/turf/simulated/floor/plating,/area/storage/tech)
-"czW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"czX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"czY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"czO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"czP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
+"czQ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Gas Pump"; on = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"czR" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"czS" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/tech)
+"czT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/storage/tech)
+"czU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/tech)
+"czV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Secure Tech Storage"; req_access_txt = "19;23"},/turf/simulated/floor/plating,/area/storage/tech)
+"czW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/tech)
+"czX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/storage/tech)
+"czY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark{name = "blobstart"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/storage/tech)
"czZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/engine/controlroom)
-"cAa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cAb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump Engineering"; pixel_y = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cAc" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cAd" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/engine/controlroom)
-"cAe" = (/obj/machinery/camera{c_tag = "Engineering Construction Area"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cAf" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAl" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access_txt = "23"},/turf/simulated/floor/plating,/area/storage/tech)
+"cAb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cAc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cAd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cAe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cAf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump Engineering"; pixel_y = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cAg" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/engine/controlroom)
+"cAh" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cAi" = (/obj/machinery/camera{c_tag = "Engineering Construction Area"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cAj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAk" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cAp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cAq" = (/obj/machinery/light{dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/medbay2)
-"cAr" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/medbay2)
-"cAs" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_a)
-"cAt" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/patient_a)
-"cAu" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacya"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_a)
-"cAv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacya"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_a)
-"cAw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cAx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
-"cAy" = (/obj/structure/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
+"cAq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cAu" = (/obj/machinery/light{dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/medbay2)
+"cAv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/medbay2)
+"cAw" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/patient_a)
+"cAx" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_a)
+"cAy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacya"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_a)
"cAz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/medical/biostorage)
-"cAA" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 6; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 4; pixel_y = 3},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -4; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -6; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"cAA" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacya"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_a)
"cAB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cAC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
"cAD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cAF" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cAF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cAG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAH" = (/obj/item/device/flashlight,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cAI" = (/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cAI" = (/obj/structure/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
"cAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/asmaint)
"cAK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
-"cAM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor{dir = 2; name = "hazard door south"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology)
-"cAN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor{dir = 2; name = "hazard door south"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology)
-"cAO" = (/obj/machinery/door/firedoor{dir = 2; name = "hazard door south"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology)
+"cAM" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 6; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 4; pixel_y = 3},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -4; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -6; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"cAN" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cAO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAP" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
"cAQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
-"cAR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
+"cAR" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cAT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cAT" = (/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAU" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cAV" = (/obj/machinery/door/poddoor{id_tag = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
-"cAW" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
+"cAV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology)
+"cAW" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology)
"cAX" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
-"cAY" = (/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 1},/obj/structure/sign/fire{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cAZ" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "incinerator_access_control"; name = "Incinerator Access Console"; pixel_x = -26; pixel_y = 6; req_access_txt = "12"; tag_exterior_door = "incinerator_airlock_exterior"; tag_interior_door = "incinerator_airlock_interior"},/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -24; pixel_y = -6},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cAY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology)
+"cAZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
"cBa" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cBb" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cBc" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cBd" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cBe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cBe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cBf" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cBg" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cBg" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
"cBh" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cBi" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel,/area/storage/tech)
-"cBj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/tech)
+"cBi" = (/obj/machinery/door/poddoor{id_tag = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
+"cBj" = (/obj/machinery/atmospherics/binary/pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 1},/obj/structure/sign/fire{pixel_y = 32},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
"cBk" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/storage/tech)
"cBl" = (/obj/structure/table,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/storage/tech)
-"cBm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/med_data{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/obj/item/weapon/circuitboard/scan_consolenew,/obj/item/weapon/circuitboard/cryo_tube{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech)
-"cBn" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/secure_data{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/camera{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating,/area/storage/tech)
-"cBo" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_all{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/thermomachine,/obj/item/weapon/circuitboard/smes{pixel_x = 4},/turf/simulated/floor/plating,/area/storage/tech)
+"cBm" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "incinerator_access_control"; name = "Incinerator Access Console"; pixel_x = -26; pixel_y = 6; req_access_txt = "12"; tag_exterior_door = "incinerator_airlock_exterior"; tag_interior_door = "incinerator_airlock_interior"},/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -24; pixel_y = -6},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cBn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cBo" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cBp" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plating,/area/storage/tech)
-"cBq" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/aft)
-"cBr" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cBs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/construction)
-"cBt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cBu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cBv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cBq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/tech)
+"cBr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel,/area/storage/tech)
+"cBs" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/med_data{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/obj/item/weapon/circuitboard/scan_consolenew,/obj/item/weapon/circuitboard/cryo_tube{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech)
+"cBt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_all{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/thermomachine,/obj/item/weapon/circuitboard/smes{pixel_x = 4},/turf/simulated/floor/plating,/area/storage/tech)
+"cBu" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/secure_data{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/camera{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating,/area/storage/tech)
+"cBv" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/aft)
"cBw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cBx" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cBy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cBz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cBz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cBA" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cBB" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cBB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cBC" = (/obj/machinery/light,/obj/structure/table,/obj/item/toy/cards/deck,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cBD" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cBE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cBF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"cBG" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/medbay2)
-"cBH" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/medbay2)
+"cBD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/construction)
+"cBE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cBF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cBG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cBH" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cBI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/patient_a)
-"cBJ" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
-"cBK" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
-"cBL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/medical/biostorage)
-"cBM" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"cBJ" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"; tag = "icon-pipe-j2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cBK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cBM" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/medbay2)
"cBN" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cBO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cBO" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/medbay2)
"cBP" = (/turf/simulated/wall/r_wall,/area/maintenance/asmaint)
"cBQ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cBR" = (/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
"cBS" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
-"cBT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cBT" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
"cBU" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
-"cBV" = (/obj/structure/closet/bombcloset,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cBW" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/camera{c_tag = "Research Test Lab West"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cBX" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cBY" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cBV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
+"cBW" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"cBX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/medical/biostorage)
+"cBY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cBZ" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/table,/obj/item/device/radio/electropack,/obj/item/device/assembly/signaler,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cCa" = (/obj/structure/table,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cCb" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/item/device/multitool,/obj/item/clothing/ears/earmuffs,/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cCc" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cCd" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/warning_stripes/yellow,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cCe" = (/obj/machinery/chem_heater,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cCf" = (/obj/machinery/chem_dispenser,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cCg" = (/obj/machinery/chem_master,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cCh" = (/obj/machinery/newscaster{pixel_y = 34},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cCi" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cCj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cCk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cCl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
-"cCm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"cCn" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"cCo" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"cCp" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; on = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
-"cCq" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access_txt = "12"},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator Airlock Control"; pixel_x = 0; pixel_y = -23},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
-"cCr" = (/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cCs" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access_txt = "12"},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "incinerator_access_control"; name = "Incinerator Airlock Control"; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cCd" = (/obj/structure/closet/bombcloset,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCe" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCf" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/camera{c_tag = "Research Test Lab West"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCg" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCh" = (/obj/structure/table,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCi" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/warning_stripes/yellow,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cCj" = (/obj/machinery/chem_dispenser,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cCk" = (/obj/machinery/chem_heater,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cCl" = (/obj/machinery/newscaster{pixel_y = 34},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cCm" = (/obj/machinery/chem_master,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cCn" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cCo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cCp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
+"cCq" = (/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
+"cCr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cCs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"cCt" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cCu" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cCv" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/hologram/holopad,/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cCw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cCx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/atmos{name = "Incinerator Access"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cCy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cCz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cCu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"cCv" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"cCw" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; on = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
+"cCx" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access_txt = "12"},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator Airlock Control"; pixel_x = 0; pixel_y = -23},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
+"cCy" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access_txt = "12"},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "incinerator_access_control"; name = "Incinerator Airlock Control"; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
+"cCz" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cCA" = (/obj/item/stack/sheet/glass{amount = 10},/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cCB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cCC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cCD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cCE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cCF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
-"cCG" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/tech)
-"cCH" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/storage/tech)
-"cCI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/storage/tech)
-"cCJ" = (/obj/machinery/requests_console{department = "Tech Storage"; name = "Tech Storage Requests Console"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
+"cCB" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/hologram/holopad,/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cCC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Incinerator Access"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cCD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cCE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cCF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cCG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"cCH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cCI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"cCJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cCK" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
"cCL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/storage/tech)
-"cCM" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cCN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cCO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cCP" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cCM" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech)
+"cCN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/tech)
+"cCO" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/storage/tech)
+"cCP" = (/obj/machinery/requests_console{department = "Tech Storage"; name = "Tech Storage Requests Console"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech)
"cCQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cCR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cCR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/storage/tech)
"cCS" = (/obj/structure/table,/obj/item/mounted/frame/apc_frame,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cCT" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cCU" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cCV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cCT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cCU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cCV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cCW" = (/turf/simulated/wall,/area/medical/surgery1)
"cCX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/surgery1)
-"cCY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cCZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery1)
-"cDa" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery1)
+"cCY" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cCZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cDa" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cDb" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/medical/surgery1)
-"cDc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery2)
-"cDd" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery2)
-"cDe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cDc" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cDd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cDe" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery1)
"cDf" = (/turf/simulated/wall,/area/medical/surgery2)
"cDg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/surgery2)
"cDh" = (/turf/simulated/wall,/area/medical/patient_b)
-"cDi" = (/obj/structure/sink,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Isolation B"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/patient_b)
-"cDj" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_b)
-"cDk" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_b)
-"cDl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacyb"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_b)
-"cDm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Patient's Rooms"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
-"cDn" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
+"cDi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cDj" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery1)
+"cDk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery2)
+"cDl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery2)
+"cDm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/obj/machinery/holosign/surgery{id = "surgery2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cDn" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_b)
"cDo" = (/turf/simulated/floor/plasteel,/area/medical/biostorage)
-"cDp" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"cDp" = (/obj/structure/sink,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Isolation B"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/patient_b)
"cDq" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cDr" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cDs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cDt" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cDr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacyb"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_b)
+"cDs" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_b)
+"cDt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Patient's Rooms"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
"cDu" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/toxins/misc_lab)
-"cDv" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/misc_lab)
+"cDv" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage)
"cDw" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cDx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cDy" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cDz" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cDA" = (/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cDB" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cDC" = (/obj/machinery/chem_dispenser,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cDD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cDE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"cDF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"cDG" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
-"cDH" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber South"; dir = 1; network = list("Toxins","Research","SS13")},/obj/machinery/light,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
-"cDI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
-"cDJ" = (/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/obj/structure/sign/fire{pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cDK" = (/obj/machinery/door_control{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "12"},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cDx" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
+"cDy" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cDz" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cDA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cDB" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/misc_lab)
+"cDC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cDD" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cDE" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cDF" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cDG" = (/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cDH" = (/obj/machinery/chem_dispenser,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cDI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cDJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"cDK" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"cDL" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cDM" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cDN" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cDM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
+"cDN" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber South"; dir = 1; network = list("Toxins","Research","SS13")},/obj/machinery/light,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
"cDO" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cDP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/apmaint)
+"cDP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
"cDQ" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cDR" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel,/area/maintenance/consarea)
"cDS" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/maintenance/consarea)
"cDT" = (/obj/item/stack/rods{amount = 8},/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cDU" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/consarea)
-"cDV" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 5},/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech)
+"cDU" = (/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/obj/structure/sign/fire{pixel_y = -32},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator)
+"cDV" = (/obj/machinery/door_control{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "12"},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cDW" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/tech)
-"cDX" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech)
+"cDX" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cDY" = (/obj/machinery/vending/assist,/turf/simulated/floor/plating,/area/storage/tech)
-"cDZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cEa" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/pump,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
-"cEb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; level = 2},/obj/machinery/meter,/turf/simulated/wall,/area/engine/controlroom)
+"cDZ" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/binary/pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cEa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/apmaint)
+"cEb" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/consarea)
"cEc" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cEd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cEe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cEf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/construction)
+"cEd" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 5},/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech)
+"cEe" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech)
+"cEf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"cEg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cEh" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cEi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cEj" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cEk" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cEl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cEi" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/pump,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
+"cEj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; level = 2},/obj/machinery/meter,/turf/simulated/wall,/area/engine/controlroom)
+"cEk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cEl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cEm" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cEn" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cEo" = (/obj/machinery/body_scanconsole,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cEp" = (/obj/machinery/bodyscanner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cEq" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cEr" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cEs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cEt" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cEu" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = -5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cEv" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/medbay2)
-"cEw" = (/obj/machinery/camera{c_tag = "Medbay IV Room"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/medbay2)
-"cEx" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/medbay2)
-"cEy" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/patient_b)
-"cEz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_b)
-"cEA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_b)
-"cEB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation B"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_b)
-"cEC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cED" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/biostorage)
-"cEE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/biostorage)
-"cEF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/biostorage)
+"cEs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/turf/simulated/floor/plasteel,/area/construction)
+"cEt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cEu" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cEv" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cEw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cEx" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cEy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cEz" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = -5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cEA" = (/obj/machinery/camera{c_tag = "Medbay IV Room"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/medbay2)
+"cEB" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/medbay2)
+"cEC" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/medbay2)
+"cED" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_b)
+"cEE" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/patient_b)
+"cEF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation B"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_b)
"cEG" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cEH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cEI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cEJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cEK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/research{name = "Test Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cEL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/misc_lab)
-"cEM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cEN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cEO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cEI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_b)
+"cEJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
+"cEK" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/biostorage)
+"cEL" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/biostorage)
+"cEM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/biostorage)
+"cEN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cEO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cEP" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cEQ" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cEQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/misc_lab)
+"cER" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Test Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cES" = (/obj/item/clothing/mask/cigarette,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"cET" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"cEU" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/incinerator)
-"cEV" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop)
+"cEV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cEW" = (/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop)
-"cEX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cEX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cEY" = (/turf/simulated/wall,/area/engine/mechanic_workshop)
-"cEZ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cEZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cFa" = (/turf/simulated/wall/r_wall,/area/hallway/primary/aft)
-"cFb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
-"cFc" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/pump,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
-"cFd" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/wall,/area/engine/controlroom)
-"cFe" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cFf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cFg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/drone_fabricator,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cFh" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cFi" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/computer/drone_control,/turf/simulated/floor/plasteel,/area/engine/controlroom)
-"cFj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/construction)
-"cFk" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cFl" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cFb" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cFc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cFd" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop)
+"cFe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cFf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cFg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
+"cFh" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/pump,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
+"cFi" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cFj" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/wall,/area/engine/controlroom)
+"cFk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/drone_fabricator,/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cFl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cFm" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cFn" = (/obj/structure/table,/obj/item/weapon/wirecutters,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cFo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cFo" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/computer/drone_control,/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cFp" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cFq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cFr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cFr" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cFs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cFt" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cFu" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cFt" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cFu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/construction)
"cFv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cFw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cFw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cFx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cFy" = (/turf/simulated/wall/r_wall,/area/medical/surgery2)
"cFz" = (/turf/simulated/wall/r_wall,/area/medical/medbay2)
"cFA" = (/turf/simulated/wall/r_wall,/area/medical/patient_b)
-"cFB" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_b)
-"cFC" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/patient_b)
-"cFD" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyb"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_b)
-"cFE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
+"cFB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
+"cFC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cFD" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cFE" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cFF" = (/turf/simulated/wall/r_wall,/area/medical/patients_rooms)
-"cFG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cFH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cFI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cFJ" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/effect/decal/warning_stripes/southwestcorner,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cFG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cFH" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/patient_b)
+"cFI" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_b)
+"cFJ" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyb"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_b)
"cFK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/misc_lab)
-"cFL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/toxins/misc_lab)
+"cFL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cFM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cFN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cFO" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cFP" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cFQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/secure_closet/research_reagents,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cFR" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cFS" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/dropper/precision,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cFT" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 1; layer = 2.9},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
-"cFU" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cFN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cFO" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/effect/decal/warning_stripes/southwestcorner,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cFP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cFQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/toxins/misc_lab)
+"cFR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cFS" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cFT" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cFU" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
"cFV" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/engine/vacuum,/area/engine/mechanic_workshop)
"cFW" = (/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cFX" = (/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cFY" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cFZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cGa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/camera{c_tag = "Mechanic's Workshop West"; dir = 2; network = list("SS13")},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cFY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/secure_closet/research_reagents,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cFZ" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 1; layer = 2.9},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cGa" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/dropper/precision,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
"cGb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cGc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cGd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cGe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop)
-"cGf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Mechanic"; departmentType = 2; name = "Mechanic's Workshop Requests Console"; pixel_y = 30},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
-"cGg" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop)
-"cGh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/reagent_dispensers/fueltank,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
-"cGi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Mechanic's Workshop East"; dir = 2; network = list("SS13")},/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
-"cGj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
-"cGk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/mechanic_workshop)
-"cGl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGn" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-y"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGr" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Aft Primary Hallway 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cGy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cGz" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/aft)
-"cGA" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/wall,/area/engine/controlroom)
-"cGB" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cGd" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab)
+"cGe" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cGf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cGg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/camera{c_tag = "Mechanic's Workshop West"; dir = 2; network = list("SS13")},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cGh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cGi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cGj" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cGk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Mechanic"; departmentType = 2; name = "Mechanic's Workshop Requests Console"; pixel_y = 30},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"cGl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Mechanic's Workshop East"; dir = 2; network = list("SS13")},/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
+"cGm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/reagent_dispensers/fueltank,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
+"cGn" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/mechanic_workshop)
+"cGo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
+"cGp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGr" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGu" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-y"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Aft Primary Hallway 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cGB" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cGC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/engine/controlroom)
-"cGD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/engine/controlroom)
+"cGD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cGE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/engine/break_room)
"cGF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/engine/break_room)
"cGG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/atmos/control)
"cGH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/atmos/control)
"cGI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/atmos/control)
-"cGJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/control)
+"cGJ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/aft)
"cGK" = (/turf/simulated/wall/r_wall,/area/atmos/control)
"cGL" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cGM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cGN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cGO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cGM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "0"; req_one_access_txt = "11;24"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plasteel,/area/engine/controlroom)
+"cGN" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/wall,/area/engine/controlroom)
+"cGO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/engine/controlroom)
"cGP" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cGQ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cGR" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cGQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/control)
+"cGR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cGS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cGT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cGU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cGT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cGU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cGV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cGW" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cGW" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cGX" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery2)
"cGY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/patient_b)
-"cGZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cHa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/medical/patients_rooms)
-"cHb" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/patients_rooms)
-"cHc" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms)
+"cGZ" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cHa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cHb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cHc" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cHd" = (/turf/simulated/wall,/area/medical/patients_rooms)
"cHe" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cHf" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cHf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/medical/patients_rooms)
"cHg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
-"cHh" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 2; pixel_y = 2},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -2; pixel_y = -2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cHh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cHi" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cHk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/obj/structure/table,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cHl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cHm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cHn" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cHk" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms)
+"cHl" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/patients_rooms)
+"cHm" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cHn" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 2; pixel_y = 2},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -2; pixel_y = -2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHo" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHp" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHq" = (/obj/machinery/atmospherics/binary/pump/highcap{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHr" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHs" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cHt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cHu" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cHv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cHw" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop)
-"cHx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
-"cHy" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cHt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cHu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"cHv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/obj/structure/table,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cHw" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cHx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cHy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cHz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cHA" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cHB" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cHC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cHA" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cHB" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cHC" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop)
"cHD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHE" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cHE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"cHF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cHG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cHH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cHI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHM" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Aft Primary Hallway 2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/aft)
-"cHN" = (/obj/structure/sign/securearea,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/wall,/area/engine/break_room)
-"cHO" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cHJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cHK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cHL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cHM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cHN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Aft Primary Hallway 2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/aft)
+"cHO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cHP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/recharge_station,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cHQ" = (/turf/simulated/wall,/area/engine/break_room)
"cHR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cHS" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cHT" = (/obj/structure/table,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cHU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cHT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cHU" = (/obj/structure/sign/securearea,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/wall,/area/engine/break_room)
"cHV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos/control)
-"cHW" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cHX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Atmospherics Control Room"; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/table,/obj/item/weapon/book/manual/atmospipes,/obj/item/device/multitool{pixel_x = 5},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cHY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cHW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cHX" = (/obj/structure/table,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cHY" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/control)
"cHZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/atmos/control)
-"cIa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cIa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/control)
"cIb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/surgery1)
-"cIc" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cId" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cIe" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cIf" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cIc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Atmospherics Control Room"; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/table,/obj/item/weapon/book/manual/atmospipes,/obj/item/device/multitool{pixel_x = 5},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cId" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cIe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cIf" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cIg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cIh" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cIi" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cIj" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cIk" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cIi" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cIj" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cIk" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cIl" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cIm" = (/turf/simulated/wall/r_wall,/area/medical/patient_c)
-"cIn" = (/obj/structure/sink,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Isolation C"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/patient_c)
-"cIo" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_c)
-"cIp" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_c)
-"cIq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacyc"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_c)
+"cIn" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cIo" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cIp" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_c)
+"cIq" = (/obj/structure/sink,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Isolation C"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/patient_c)
"cIr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
-"cIs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
-"cIt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cIs" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacyc"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_c)
+"cIt" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_c)
"cIu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/patients_rooms)
"cIv" = (/obj/item/weapon/shard,/obj/effect/decal/cleanable/blood,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cIw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cIx" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology)
-"cIy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology)
-"cIz" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Xenobiology Access"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology)
-"cIA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/closet/firecloset,/obj/machinery/camera{c_tag = "Research Test Chamber East"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/obj/structure/sign/fire{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cIB" = (/obj/machinery/light,/obj/machinery/computer/security/telescreen{desc = "Used for watching the horrors within the test chamber."; name = "Research Monitor"; network = list("TestChamber"); pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cIC" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/obj/item/device/tape/random{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cID" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/ignition_switch{id = "testigniter"; pixel_x = 3; pixel_y = -3},/obj/machinery/door_control{id = "RnDChem"; name = "Chamber Blast Doors"; pixel_x = 3; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cIw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cIx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
+"cIy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cIz" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology)
+"cIA" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Xenobiology Access"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology)
+"cIB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology)
+"cIC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/closet/firecloset,/obj/machinery/camera{c_tag = "Research Test Chamber East"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/obj/structure/sign/fire{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cID" = (/obj/machinery/light,/obj/machinery/computer/security/telescreen{desc = "Used for watching the horrors within the test chamber."; name = "Research Monitor"; network = list("TestChamber"); pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cIE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cIF" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbayouter"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cIF" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/ignition_switch{id = "testigniter"; pixel_x = 3; pixel_y = -3},/obj/machinery/door_control{id = "RnDChem"; name = "Chamber Blast Doors"; pixel_x = 3; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cIG" = (/obj/machinery/light,/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cIH" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbay"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cII" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbayouter"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cIJ" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cIK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cIH" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/obj/item/device/tape/random{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
+"cII" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbayouter"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cIJ" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbay"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cIK" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cIL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cIM" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cIM" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbayouter"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cIO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/engine/mechanic_workshop)
-"cIP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cIP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/mechanic_workshop)
"cIQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cIR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cIS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Mechanic"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cIT" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Mechanic's Desk"; req_access = null; req_access_txt = "70"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cIV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cIW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cIX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cIY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cIT" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/mechanic_workshop)
+"cIV" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Mechanic's Desk"; req_access = null; req_access_txt = "70"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"cIW" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cIX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cIY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cIZ" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/assembly_line)
-"cJa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cJb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cJc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cJd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cJe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cJf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cJa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cJb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cJc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cJd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cJe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cJf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cJg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/break_room)
-"cJh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cJi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/engine/break_room)
-"cJj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/camera{c_tag = "Engineering Foyer"; network = list("SS13")},/obj/structure/noticeboard{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/engine/break_room)
+"cJh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cJi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cJj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cJk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cJl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cJm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cJm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/camera{c_tag = "Engineering Foyer"; network = list("SS13")},/obj/structure/noticeboard{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/engine/break_room)
"cJn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cJo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/control)
+"cJo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/engine/break_room)
"cJp" = (/obj/machinery/computer/atmoscontrol,/turf/simulated/floor/plasteel,/area/atmos/control)
"cJq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cJr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel,/area/atmos/control)
+"cJr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cJs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cJt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/medical/surgery1)
"cJu" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cJv" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cJw" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cJx" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cJy" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/patient_c)
-"cJz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_c)
-"cJA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_c)
-"cJB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation C"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_c)
-"cJC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cJD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
+"cJy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/control)
+"cJz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel,/area/atmos/control)
+"cJA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_c)
+"cJB" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/patient_c)
+"cJC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation C"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_c)
+"cJD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_c)
"cJE" = (/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
-"cJF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cJF" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
"cJG" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cJH" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology)
-"cJI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cJJ" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology)
+"cJH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
+"cJI" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cJJ" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology)
"cJK" = (/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cJL" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cJM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Test Chamber"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
-"cJN" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced{dir = 1},/turf/simulated/floor/engine,/area/toxins/misc_lab)
-"cJO" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/engine,/area/toxins/misc_lab)
+"cJM" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology)
+"cJN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cJO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/glass_research{name = "Test Chamber"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cJP" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
"cJQ" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cJR" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/engine/mechanic_workshop)
-"cJS" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/engine/mechanic_workshop)
-"cJT" = (/obj/machinery/door/airlock/maintenance{name = "Mechanic Workshop Maintenance"; req_access = null; req_access_txt = "70"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cJU" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/radio{pixel_y = 6},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"cJR" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/engine,/area/toxins/misc_lab)
+"cJS" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/mechanic_workshop)
+"cJT" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "RnDChem"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced{dir = 1},/turf/simulated/floor/engine,/area/toxins/misc_lab)
+"cJU" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/engine/mechanic_workshop)
"cJV" = (/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"cJW" = (/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cJX" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cJY" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"cJY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cJZ" = (/turf/simulated/wall,/area/hallway/primary/aft)
-"cKa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cKa" = (/obj/machinery/door/airlock/maintenance{name = "Mechanic Workshop Maintenance"; req_access = null; req_access_txt = "70"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cKb" = (/turf/simulated/wall,/area/assembly/assembly_line)
-"cKc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{icon_state = "door_locked"; locked = 1; name = "Assembly Line Maintenance"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/assembly/assembly_line)
-"cKd" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Assembly Line Delivery"; req_access_txt = "32"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/assembly_line)
+"cKc" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/radio{pixel_y = 6},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"cKd" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cKe" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/assembly/assembly_line)
"cKf" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/assembly/assembly_line)
-"cKg" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cKg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cKh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cKi" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cKj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cKk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cKl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/hallway/primary/aft)
-"cKm" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cKi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{icon_state = "door_locked"; locked = 1; name = "Assembly Line Maintenance"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/assembly/assembly_line)
+"cKj" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Assembly Line Delivery"; req_access_txt = "32"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/assembly_line)
+"cKk" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cKl" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cKm" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cKn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cKo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cKp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cKq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/control)
+"cKq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/hallway/primary/aft)
"cKr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel,/area/atmos/control)
"cKs" = (/turf/simulated/floor/plasteel,/area/atmos/control)
-"cKt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/engineering,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cKt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cKu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cKv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/surgery1)
"cKw" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cKx" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cKy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
-"cKz" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cKx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "32"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cKy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/control)
+"cKz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/engineering,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/atmos/control)
"cKA" = (/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cKB" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cKC" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
"cKD" = (/obj/structure/table/glass,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cKE" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cKF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cKG" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cKE" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cKF" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
+"cKG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery1)
"cKH" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
-"cKI" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_c)
-"cKJ" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/patient_c)
-"cKK" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyc"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_c)
-"cKL" = (/obj/machinery/light,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/medical/patients_rooms)
-"cKM" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/medical/patients_rooms)
-"cKN" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/machinery/camera{c_tag = "Medbay Virology Entrance"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cKI" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cKJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cKK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery2)
+"cKL" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 3; icon_state = "whitered"},/area/medical/patient_c)
+"cKM" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_c)
+"cKN" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyc"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_c)
"cKO" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cKP" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cKQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cKR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cKS" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cKT" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology)
-"cKU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster{pixel_y = 34},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cKV" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cKW" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology)
-"cKX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology)
-"cKY" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology)
+"cKS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/medical/patients_rooms)
+"cKT" = (/obj/machinery/light,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/medical/patients_rooms)
+"cKU" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/machinery/camera{c_tag = "Medbay Virology Entrance"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cKV" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology)
+"cKW" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cKX" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cKY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster{pixel_y = 34},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cKZ" = (/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cLa" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cLb" = (/turf/simulated/wall/r_wall,/area/toxins/test_chamber)
-"cLc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine{icon_state = "stage_stairs"; name = "reinforced stairs"},/area/toxins/test_chamber)
-"cLd" = (/obj/machinery/camera{c_tag = "Research Test Chamber"; dir = 2; network = list("TestChamber","SS13","Research"); pixel_x = 0},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cLc" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology)
+"cLd" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology)
"cLe" = (/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cLf" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cLf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology)
"cLg" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/toxins/test_chamber)
"cLh" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cLi" = (/turf/simulated/wall,/area/maintenance/aft)
-"cLj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft)
-"cLk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cLl" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cLm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cLn" = (/obj/structure/table,/obj/item/pod_parts/core,/obj/item/weapon/circuitboard/mecha/pod,/obj/item/clothing/glasses/welding{pixel_y = 12},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
-"cLo" = (/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
-"cLp" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/spod_part_fabricator,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/mechanic_workshop)
-"cLq" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/window/reinforced{dir = 8},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cLr" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/engine/mechanic_workshop)
-"cLs" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/computer/rdconsole/mechanics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"cLt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cLu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cLj" = (/obj/machinery/camera{c_tag = "Research Test Chamber"; dir = 2; network = list("TestChamber","SS13","Research"); pixel_x = 0},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cLk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine{icon_state = "stage_stairs"; name = "reinforced stairs"},/area/toxins/test_chamber)
+"cLl" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cLm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cLn" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft)
+"cLo" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cLp" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cLq" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/spod_part_fabricator,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/mechanic_workshop)
+"cLr" = (/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"cLs" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/engine/mechanic_workshop)
+"cLt" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/window/reinforced{dir = 8},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"cLu" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/computer/rdconsole/mechanics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cLv" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cLw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
+"cLw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
"cLx" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
-"cLy" = (/turf/simulated/floor/plasteel{icon_state = "loadingarea"; tag = "loading"},/area/assembly/assembly_line)
+"cLy" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cLz" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cLA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating,/area/assembly/assembly_line)
-"cLB" = (/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cLB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"cLC" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cLD" = (/obj/structure/computerframe,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cLE" = (/obj/structure/table,/obj/item/clothing/glasses/welding,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cLF" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"cLG" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cLH" = (/obj/structure/closet/crate,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cLI" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cLJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cLK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cLL" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/hallway/primary/aft)
+"cLI" = (/turf/simulated/floor/plasteel{icon_state = "loadingarea"; tag = "loading"},/area/assembly/assembly_line)
+"cLJ" = (/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cLK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cLL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cLM" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/break_room)
-"cLN" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cLN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cLO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cLP" = (/turf/simulated/floor/plasteel,/area/engine/break_room)
"cLQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cLR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cLS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cLT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/control)
-"cLU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cLT" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/hallway/primary/aft)
+"cLU" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cLV" = (/obj/machinery/atmospherics/unary/portables_connector,/turf/simulated/floor/plasteel,/area/atmos/control)
-"cLW" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 8; req_access_txt = "24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cLX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cLW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cLX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/control)
"cLY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/medical/surgery2)
"cLZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/surgery2)
-"cMa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/medical/surgery2)
-"cMc" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cMd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
-"cMe" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cMa" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 8; req_access_txt = "24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cMb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/medical/surgery2)
+"cMe" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cMf" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cMg" = (/obj/effect/landmark{name = "revenantspawn"},/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cMh" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cMi" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
-"cMj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "55"},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cMh" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cMi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
+"cMj" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"cMk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cMl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cMl" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cMm" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cMn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cMo" = (/obj/structure/table,/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cMp" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
+"cMo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "55"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cMp" = (/obj/structure/table,/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cMq" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cMr" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cMs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cMs" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
"cMt" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cMu" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cMv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
-"cMw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cMx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/paper,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cMy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/assembly/assembly_line)
-"cMz" = (/obj/item/mounted/frame/apc_frame,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/assembly/assembly_line)
+"cMu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cMv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cMw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
+"cMx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cMy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cMz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/assembly/assembly_line)
"cMA" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cMB" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cMC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{icon_state = "door_locked"; locked = 1; name = "Assembly Line (KEEP OUT)"; req_access_txt = "32"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cMD" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cME" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cMF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cMG" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/hallway/primary/aft)
-"cMH" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cMC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/paper,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cMD" = (/obj/item/mounted/frame/apc_frame,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/assembly/assembly_line)
+"cME" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{icon_state = "door_locked"; locked = 1; name = "Assembly Line (KEEP OUT)"; req_access_txt = "32"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cMF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cMG" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cMH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cMI" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/effect/landmark/start{name = "Life Support Specialist"},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cMJ" = (/obj/structure/table,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cMK" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/effect/landmark/start{name = "Life Support Specialist"},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cML" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cMM" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cML" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 4},/area/hallway/primary/aft)
+"cMM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
"cMN" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/control)
"cMO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{level = 2},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cMP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cMQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos/control)
-"cMR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMV" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cMZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMP" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cMQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cMR" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cMS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cMT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos/control)
+"cMV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cMZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cNb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cNb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cNc" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cNd" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/patients_rooms)
-"cNe" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"cNf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
-"cNg" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cNe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cNf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cNg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cNh" = (/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cNi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cNj" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology)
-"cNk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cNl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cNm" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/camera{c_tag = "Xenobiology Module North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cNn" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "xeno_airlock_exterior"; id_tag = "xeno_airlock_control"; tag_interior_door = "xeno_airlock_interior"; name = "Xenobiology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/toxins/xenobiology)
-"cNo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/toxins/xenobiology)
-"cNp" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/northwestcorner,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/toxins/xenobiology)
-"cNq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cNr" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cNs" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cNt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/sparker{id = "testigniter"; name = "Test Igniter"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cNi" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
+"cNj" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cNk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms)
+"cNl" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology)
+"cNm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cNn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cNo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cNp" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "xeno_airlock_exterior"; id_tag = "xeno_airlock_control"; tag_interior_door = "xeno_airlock_interior"; name = "Xenobiology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/toxins/xenobiology)
+"cNq" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/camera{c_tag = "Xenobiology Module North"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cNr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/northwestcorner,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/toxins/xenobiology)
+"cNs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/toxins/xenobiology)
+"cNt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cNu" = (/obj/item/device/radio/beacon,/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cNv" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cNw" = (/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/plating,/area/space)
-"cNx" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port)
-"cNy" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/port)
-"cNz" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port)
+"cNx" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cNy" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"cNz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/sparker{id = "testigniter"; name = "Test Igniter"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cNA" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft)
"cNB" = (/turf/simulated/floor/plating,/area/maintenance/aft)
"cNC" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"cND" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cNE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cNF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cNE" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/port)
+"cNF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port)
"cNG" = (/turf/simulated/floor/plating,/area/assembly/assembly_line)
"cNH" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cNI" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cNJ" = (/obj/item/weapon/paper,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cNK" = (/obj/structure/barricade/wooden,/obj/structure/grille,/turf/simulated/floor/plating,/area/assembly/assembly_line)
"cNL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cNM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cNN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 7},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cNM" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port)
+"cNN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
"cNO" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cNP" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cNQ" = (/obj/effect/landmark/start{name = "Life Support Specialist"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cNR" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cNS" = (/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = -32},/obj/structure/closet/secure_closet/atmos_personal,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/atmos/control)
-"cNT" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light,/obj/structure/closet/secure_closet/atmos_personal,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/atmos/control)
-"cNU" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/closet/secure_closet/atmos_personal,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/atmos/control)
-"cNV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/atmos/control)
-"cNW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/atmos/control)
+"cNR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cNS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cNT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 7},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cNU" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cNV" = (/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = -32},/obj/structure/closet/secure_closet/atmos_personal,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/atmos/control)
+"cNW" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/closet/secure_closet/atmos_personal,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/atmos/control)
"cNX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cNY" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cNZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOe" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOf" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
-"cOg" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOh" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
-"cOi" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cOj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cOk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cOl" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cOm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cOn" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology)
-"cOo" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology)
-"cOp" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology)
-"cOq" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cOr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cNZ" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light,/obj/structure/closet/secure_closet/atmos_personal,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/atmos/control)
+"cOa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/atmos/control)
+"cOb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/atmos/control)
+"cOc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOh" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOi" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
+"cOj" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cOk" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
+"cOl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cOm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cOn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cOo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cOp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cOq" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology)
+"cOr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology)
"cOs" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cOt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cOu" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cOv" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
+"cOt" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology)
+"cOu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cOv" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cOw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/wall,/area/maintenance/aft)
"cOx" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft)
"cOy" = (/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cOz" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cOA" = (/obj/machinery/conveyor_switch{id = "Skynet_heavy"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cOB" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cOC" = (/turf/simulated/floor/plating{desc = " There is some old writing on this floor. You are barely able to read out a few lines from a tangled scribble. In a chamber a great mirror lies, cut away it solemn cries. Travel bold as thou might, piercing vastness as a kite. HONK! "; name = "Old Note #6"},/area/assembly/assembly_line)
-"cOD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/assembly/assembly_line)
+"cOC" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cOD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cOE" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/barricade/wooden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cOF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cOG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cOH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cOI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cOJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/engine/break_room)
-"cOK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cOL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cOM" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cOF" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
+"cOG" = (/turf/simulated/floor/plating{desc = " There is some old writing on this floor. You are barely able to read out a few lines from a tangled scribble. In a chamber a great mirror lies, cut away it solemn cries. Travel bold as thou might, piercing vastness as a kite. HONK! "; name = "Old Note #6"},/area/assembly/assembly_line)
+"cOH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/assembly/assembly_line)
+"cOI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cOJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cOK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
+"cOL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/engine/break_room)
+"cOM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cON" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cOO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cOP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/atmos/control)
-"cOQ" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/atmos/control)
-"cOR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos/control)
+"cOQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"cOR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cOS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/atmos)
"cOT" = (/turf/simulated/wall/r_wall,/area/atmos/distribution)
"cOU" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/wall/r_wall,/area/atmos/distribution)
"cOV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/atmos/distribution)
"cOW" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/wall/r_wall,/area/atmos/distribution)
"cOX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/distribution)
-"cOY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cOZ" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/patients_rooms)
-"cPa" = (/obj/effect/decal/warning_stripes/south,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/patients_rooms)
-"cPb" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/patients_rooms)
+"cOY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cOZ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos/control)
+"cPb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/turf/simulated/floor/plasteel,/area/atmos/control)
"cPc" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cPd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cPe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cPf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cPg" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cPh" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
-"cPi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cPe" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/patients_rooms)
+"cPf" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/patients_rooms)
+"cPg" = (/obj/effect/decal/warning_stripes/south,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/patients_rooms)
+"cPh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cPi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cPj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPn" = (/obj/machinery/light{dir = 1; in_use = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera{c_tag = "Xenobiology Module North-East"; dir = 8; network = list("Research","SS13"); pixel_y = -22},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cPq" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cPr" = (/obj/structure/table/reinforced,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cPs" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/clipboard,/obj/item/weapon/hand_labeler,/turf/simulated/floor/engine,/area/toxins/test_chamber)
-"cPt" = (/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cPk" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cPl" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
+"cPm" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cPn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPs" = (/obj/machinery/light{dir = 1; in_use = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cPt" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera{c_tag = "Xenobiology Module North-East"; dir = 8; network = list("Research","SS13"); pixel_y = -22},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cPu" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft)
"cPv" = (/obj/structure/closet,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cPw" = (/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"cPx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
-"cPy" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/assembly/assembly_line)
-"cPz" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line)
-"cPA" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line)
-"cPB" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line)
-"cPC" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/assembly/assembly_line)
-"cPD" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Assembly Line East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
-"cPE" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
-"cPF" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cPG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cPH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cPI" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cPJ" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cPy" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cPz" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/clipboard,/obj/item/weapon/hand_labeler,/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cPA" = (/obj/structure/table/reinforced,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/engine,/area/toxins/test_chamber)
+"cPB" = (/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cPC" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/assembly/assembly_line)
+"cPD" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line)
+"cPE" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line)
+"cPF" = (/obj/machinery/conveyor{dir = 4; id = "Skynet_heavy"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/assembly/assembly_line)
+"cPG" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/assembly/assembly_line)
+"cPH" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Assembly Line East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
+"cPI" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"cPJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cPK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/engine/break_room)
-"cPL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cPM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cPN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPL" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cPM" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cPN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cPO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cPP" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPP" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cPQ" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cPR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cPS" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/vending/cigarette,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cPT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos)
"cPU" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
-"cPV" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
-"cPW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/atmos)
-"cPX" = (/obj/machinery/light_switch{pixel_y = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/atmos)
-"cPY" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/pipedispenser,/turf/simulated/floor/plasteel,/area/atmos)
+"cPV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPW" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPX" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cPY" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/vending/cigarette,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cPZ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution)
-"cQa" = (/obj/machinery/light{dir = 1},/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/light_switch{pixel_y = 27},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQb" = (/obj/machinery/camera{c_tag = "Atmospherics North-East"; network = list("SS13")},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Distro to Waste"; on = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQc" = (/obj/machinery/meter{frequency = 1443; id = "dloop_atm_meter"; name = "Distribution Loop"},/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQd" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQe" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Air To Distro"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQf" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQg" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQh" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
-"cQi" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/space,/area/space)
-"cQj" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/space)
+"cQa" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
+"cQb" = (/obj/machinery/light_switch{pixel_y = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/atmos)
+"cQc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/atmos)
+"cQd" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/pipedispenser,/turf/simulated/floor/plasteel,/area/atmos)
+"cQe" = (/obj/machinery/camera{c_tag = "Atmospherics North-East"; network = list("SS13")},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Distro to Waste"; on = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQf" = (/obj/machinery/light{dir = 1},/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/light_switch{pixel_y = 27},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQg" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQh" = (/obj/machinery/meter{frequency = 1443; id = "dloop_atm_meter"; name = "Distribution Loop"},/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQi" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQj" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Air To Distro"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cQk" = (/turf/simulated/wall/r_wall,/area/medical/virology)
"cQl" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology)
-"cQm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "viro_lab_airlock_exterior"; locked = 1; name = "Virology Lab External Airlock"; req_access_txt = "39"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.6; master_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cQm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
"cQn" = (/turf/simulated/wall,/area/medical/virology)
-"cQo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cQp" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cQq" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cQo" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQp" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/space,/area/space)
+"cQq" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/space)
"cQr" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cQs" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cQt" = (/obj/structure/table/reinforced,/obj/item/weapon/circular_saw{pixel_y = 0},/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cQu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cQu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "viro_lab_airlock_exterior"; locked = 1; name = "Virology Lab External Airlock"; req_access_txt = "39"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.6; master_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cQv" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/wall/r_wall,/area/toxins/test_chamber)
"cQw" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cQx" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cQx" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cQy" = (/turf/simulated/wall/r_wall,/area/maintenance/aft)
-"cQz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cQA" = (/obj/structure/table,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line)
-"cQB" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line)
-"cQC" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line)
-"cQD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft)
+"cQz" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cQA" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cQB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cQC" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cQD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft)
"cQE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/hallway/primary/aft)
-"cQF" = (/obj/structure/sign/securearea,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
-"cQG" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cQH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/equipmentstorage)
-"cQI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
-"cQJ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cQK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
+"cQF" = (/obj/structure/table,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line)
+"cQG" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line)
+"cQH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line)
+"cQI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft)
+"cQJ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cQK" = (/obj/structure/sign/securearea,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
"cQL" = (/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cQM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
-"cQN" = (/turf/simulated/floor/plasteel,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
-"cQO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
+"cQN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
+"cQO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/equipmentstorage)
"cQP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
"cQQ" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/atmos)
"cQR" = (/obj/machinery/atmospherics/binary/volume_pump/on{name = "Waste In"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
"cQT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQU" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Distro"; on = 0},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQW" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Gas Turbine"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cQY" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cQU" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cQV" = (/turf/simulated/floor/plasteel,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
+"cQW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
+"cQX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cQY" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Distro"; on = 0},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cQZ" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
-"cRa" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/space)
-"cRb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cRc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/medical/virology)
-"cRd" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cRe" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/machinery/camera{c_tag = "Virology Break Room"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cRa" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cRb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cRc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cRd" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix to Gas Turbine"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cRe" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/space)
"cRf" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cRg" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cRh" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
-"cRi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/virology)
-"cRj" = (/obj/structure/closet/emcloset,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Virology Airlock"; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology)
-"cRk" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology)
-"cRl" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -5; pixel_y = 5},/obj/item/weapon/pen,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
-"cRm" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
-"cRn" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/syringes,/obj/machinery/camera{c_tag = "Virology Monkey Pen"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
-"cRo" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/medical/virology)
-"cRp" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cRq" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
-"cRr" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cRs" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cRh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/medical/virology)
+"cRi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cRj" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/machinery/camera{c_tag = "Virology Break Room"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cRk" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cRl" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
+"cRm" = (/obj/structure/closet/emcloset,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Virology Airlock"; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology)
+"cRn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/virology)
+"cRo" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology)
+"cRp" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes/stokcubes,/obj/item/weapon/storage/box/monkeycubes/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/wolpincubes,/obj/item/weapon/storage/box/monkeycubes/farwacubes,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
+"cRq" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -5; pixel_y = 5},/obj/item/weapon/pen,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
+"cRr" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/medical/virology)
+"cRs" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/syringes,/obj/machinery/camera{c_tag = "Virology Monkey Pen"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
"cRt" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cRu" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cRv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cRw" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cRw" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"cRx" = (/obj/machinery/processor{name = "Slime Processor"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cRy" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/toxins/test_chamber)
"cRz" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cRA" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar)
"cRB" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/aft)
"cRC" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/assembly/assembly_line)
-"cRD" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Assembly Line West"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
+"cRD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cRE" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
"cRF" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
"cRG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/assembly/assembly_line)
-"cRH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cRP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
-"cRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
+"cRH" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cRI" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cRJ" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cRK" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Assembly Line West"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
+"cRL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"cRR" = (/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
-"cRS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cRT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cRU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cRV" = (/obj/machinery/camera{c_tag = "Engineering Equipment North"; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cRW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cRS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cRU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
+"cRV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
+"cRW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cRX" = (/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cRY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cRY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cRZ" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/atmos)
-"cSa" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
+"cSa" = (/obj/machinery/camera{c_tag = "Engineering Equipment North"; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cSb" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
-"cSc" = (/turf/simulated/floor/plasteel,/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
+"cSc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cSd" = (/turf/simulated/floor/plasteel,/area/atmos)
"cSe" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/plasteel,/area/atmos)
"cSf" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cSg" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Mix to Filter"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cSh" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cSg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cSh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cSi" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cSj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cSk" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to Mix"; on = 0},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cSl" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/atmos/distribution)
-"cSm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cSj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
+"cSk" = (/turf/simulated/floor/plasteel,/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
+"cSl" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Mix to Filter"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cSm" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cSn" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos)
-"cSo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
-"cSp" = (/obj/machinery/camera{c_tag = "Atmospherics Waste Tank"; network = list("SS13")},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
-"cSq" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
-"cSr" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cSs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cSo" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to Mix"; on = 0},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cSp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cSq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cSr" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/atmos/distribution)
+"cSs" = (/obj/machinery/camera{c_tag = "Atmospherics Waste Tank"; network = list("SS13")},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"cSt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cSu" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cSu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"cSv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology)
-"cSw" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/sign/securearea{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
-"cSx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cSy" = (/obj/structure/closet/l3closet,/obj/machinery/light{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
-"cSz" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"cSw" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
+"cSx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cSy" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cSz" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cSA" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cSB" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cSC" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
-"cSD" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
+"cSC" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/sign/securearea{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
+"cSD" = (/obj/structure/closet/l3closet,/obj/machinery/light{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
"cSE" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cSF" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{pixel_x = -2; pixel_y = -2},/obj/item/stack/sheet/mineral/plasma,/obj/item/stack/sheet/mineral/plasma{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cSF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cSG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cSH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cSI" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cSI" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
"cSJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
"cSK" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/toxins/xenobiology)
"cSL" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cSM" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
-"cSN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cSO" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cSP" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cSQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cSR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cSM" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
+"cSN" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
+"cSO" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{pixel_x = -2; pixel_y = -2},/obj/item/stack/sheet/mineral/plasma,/obj/item/stack/sheet/mineral/plasma{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cSP" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cSQ" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
+"cSR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cSS" = (/obj/machinery/optable{name = "Robotics Operating Table"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
-"cST" = (/obj/machinery/computer/operating{icon_state = "operatingb"; name = "Robotics Operating Computer"; stat = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
+"cST" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cSU" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
"cSV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/engine/engineering)
"cSW" = (/turf/simulated/wall/r_wall,/area/engine/hardsuitstorage)
"cSX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/hardsuitstorage)
"cSY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cSZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
-"cTa" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cTb" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cTc" = (/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cTd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cTa" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cTb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cTc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cTd" = (/obj/machinery/computer/operating{icon_state = "operatingb"; name = "Robotics Operating Computer"; stat = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
"cTe" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cTf" = (/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/engineeringcart,/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cTg" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
+"cTf" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cTg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cTh" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
-"cTi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cTj" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1; tag = "icon-manifold-g (NORTH)"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cTk" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1; tag = "icon-manifold-g (NORTH)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cTl" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 4; tag = "icon-manifold-g (NORTH)"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cTm" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "waste_in"; name = "Gas Mix Tank Control"; output_tag = "waste_out"; sensors = list("waste_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/atmos/distribution)
-"cTn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cTi" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cTj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cTk" = (/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/engineeringcart,/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cTl" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
+"cTm" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1; tag = "icon-manifold-g (NORTH)"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cTn" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cTo" = (/obj/structure/grille,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/turf/simulated/floor/plating,/area/atmos)
-"cTp" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
-"cTq" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
-"cTr" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/newscaster{pixel_x = -30},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cTp" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 4; tag = "icon-manifold-g (NORTH)"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cTq" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1; tag = "icon-manifold-g (NORTH)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cTr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
"cTs" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cTt" = (/obj/structure/closet/wardrobe/virology_white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cTu" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
-"cTv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
-"cTw" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
-"cTx" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/medical/virology)
-"cTy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
-"cTz" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
-"cTA" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/medical/virology)
+"cTu" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "waste_in"; name = "Gas Mix Tank Control"; output_tag = "waste_out"; sensors = list("waste_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/atmos/distribution)
+"cTv" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
+"cTw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
+"cTx" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/newscaster{pixel_x = -30},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cTy" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
+"cTz" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
+"cTA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
"cTB" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cTC" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cTD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cTE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cTF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cTC" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/medical/virology)
+"cTD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
+"cTE" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/medical/virology)
+"cTF" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
"cTG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cTH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cTI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/monkey_recycler,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cTK" = (/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 4},/obj/structure/table/glass,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cTJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cTK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cTL" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cTM" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space)
-"cTN" = (/turf/simulated/floor/plating/airless,/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/port)
-"cTO" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
-"cTP" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
-"cTQ" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/port)
-"cTR" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
-"cTS" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
-"cTT" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/port)
-"cTU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cTV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; pixel_x = 0; pixel_y = -25; req_access_txt = "13"; tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; pixel_x = 12; pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cTW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cTX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cTY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cTZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cUa" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cUb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cTM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cTN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cTO" = (/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 4},/obj/structure/table/glass,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cTP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cTQ" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space)
+"cTR" = (/turf/simulated/floor/plating/airless,/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/port)
+"cTS" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
+"cTT" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/port)
+"cTU" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
+"cTV" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
+"cTW" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port)
+"cTX" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/port)
+"cTY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; pixel_x = 0; pixel_y = -25; req_access_txt = "13"; tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; pixel_x = 12; pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cTZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cUa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cUb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cUc" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cUd" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cUe" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cUf" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering North-West"; network = list("SS13")},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cUg" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cUh" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/power/apc{cell_type = 25000; dir = 1; name = "Engineering Engine Super APC"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cUd" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cUe" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cUf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cUg" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cUh" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cUi" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
-"cUj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUl" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUn" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"cUo" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/obj/structure/table/reinforced,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/device/megaphone,/obj/item/device/lock_buster,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cUp" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 7; name = "Chief Engineer Requests Console"; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cUq" = (/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 10; pixel_y = 24; req_access_txt = "24"},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -10; pixel_y = 24; req_access_txt = "10"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 0; pixel_y = 24; req_access_txt = "11"},/obj/machinery/light_switch{pixel_y = 38},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cUr" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cUs" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cUj" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering North-West"; network = list("SS13")},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cUk" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cUl" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/power/apc{cell_type = 25000; dir = 1; name = "Engineering Engine Super APC"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cUm" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cUn" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUo" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUp" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUq" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cUr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUs" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 7; name = "Chief Engineer Requests Console"; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cUt" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cUu" = (/obj/effect/landmark{name = "lightsout"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cUu" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/obj/structure/table/reinforced,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/device/megaphone,/obj/item/device/lock_buster,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cUv" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cUw" = (/obj/structure/table,/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cUx" = (/turf/simulated/floor/plasteel,/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/atmos)
-"cUy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
-"cUz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
-"cUA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plasteel,/area/atmos)
-"cUB" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_atmos{name = "Distribution Loop"; req_access_txt = "24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUD" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUE" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUF" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Pure to Mix"; on = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 5},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUH" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 0},/turf/simulated/floor/plasteel,/area/atmos/distribution)
-"cUI" = (/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Inlet Valve"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/atmos/distribution)
-"cUJ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/green{dir = 4; level = 2},/turf/space,/area/space)
-"cUK" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
+"cUw" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cUx" = (/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 10; pixel_y = 24; req_access_txt = "24"},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "Engineering"; name = "Engineering Lockdown"; pixel_x = -10; pixel_y = 24; req_access_txt = "10"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 0; pixel_y = 24; req_access_txt = "11"},/obj/machinery/light_switch{pixel_y = 38},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cUy" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cUz" = (/obj/effect/landmark{name = "lightsout"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cUA" = (/obj/structure/table,/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cUB" = (/obj/structure/flora/ausbushes/leafybush,/obj/structure/flora/ausbushes/grassybush,/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
+"cUC" = (/turf/simulated/floor/plasteel,/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/atmos)
+"cUD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
+"cUE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"cUF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_atmos{name = "Distribution Loop"; req_access_txt = "24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cUG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plasteel,/area/atmos)
+"cUH" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cUI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cUJ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Pure to Mix"; on = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
+"cUK" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cUL" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/light_switch{pixel_x = -23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cUM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cUN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cUN" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 0},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cUO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/virology)
-"cUP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "viro_lab_airlock_interior"; locked = 1; name = "Virology Lab Internal Airlock"; req_access_txt = "39"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "39"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
+"cUP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 5},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cUQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/virology)
"cUR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/virology)
-"cUS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cUS" = (/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Inlet Valve"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/atmos/distribution)
"cUT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology)
"cUU" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cUV" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cUW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cUV" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/green{dir = 4; level = 2},/turf/space,/area/space)
+"cUW" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"cUX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cUY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cUZ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cVa" = (/obj/machinery/camera{c_tag = "Xenobiology Module East"; dir = 8; network = list("Research","SS13"); pixel_y = -22},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cVb" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
-"cVc" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cVa" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cVb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "viro_lab_airlock_interior"; locked = 1; name = "Virology Lab Internal Airlock"; req_access_txt = "39"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Button"; pixel_x = -28; pixel_y = 8; req_access_txt = "39"},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
+"cVc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cVd" = (/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cVe" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1; network = list("SS13")},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump Engineering"; pixel_y = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cVf" = (/obj/structure/closet/wardrobe/black,/obj/machinery/camera{c_tag = "Aft Port Solar Access"; dir = 1; network = list("SS13")},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cVg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cVe" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"cVf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cVg" = (/obj/machinery/camera{c_tag = "Xenobiology Module East"; dir = 8; network = list("Research","SS13"); pixel_y = -22},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cVh" = (/obj/machinery/computer/security/engineering,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cVi" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cVj" = (/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cVk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cVl" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
-"cVm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cVn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cVo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cVp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cVq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"cVr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/elite,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cVs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cVt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cVu" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cVv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/station_alert/all,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cVw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cVk" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
+"cVl" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cVm" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1; network = list("SS13")},/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump Engineering"; pixel_y = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar)
+"cVn" = (/obj/structure/closet/wardrobe/black,/obj/machinery/camera{c_tag = "Aft Port Solar Access"; dir = 1; network = list("SS13")},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cVo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cVp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cVq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cVr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
+"cVs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cVt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cVu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cVv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cVw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cVx" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/tape_roll,/obj/item/stack/tape_roll,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cVy" = (/obj/structure/table,/obj/item/device/radio{pixel_y = 6},/obj/item/device/radio{pixel_x = 6; pixel_y = 4},/obj/item/device/radio{pixel_x = -6; pixel_y = 4},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cVz" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cVA" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/atmos)
-"cVB" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{icon_state = "red"},/area/atmos)
-"cVC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
-"cVD" = (/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 4; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
+"cVy" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/hardsuit/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/elite,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cVz" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cVA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cVB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cVC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/station_alert/all,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cVD" = (/obj/structure/table,/obj/item/device/radio{pixel_y = 6},/obj/item/device/radio{pixel_x = 6; pixel_y = 4},/obj/item/device/radio{pixel_x = -6; pixel_y = 4},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cVE" = (/turf/simulated/wall,/area/atmos/distribution)
-"cVF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/obj/structure/sign/nosmoking_2,/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVI" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVJ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVK" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
-"cVM" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cVF" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cVG" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/atmos)
+"cVH" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{icon_state = "red"},/area/atmos)
+"cVI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"cVJ" = (/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 4; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
+"cVK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/atmos/distribution)
+"cVL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/obj/structure/sign/nosmoking_2,/turf/simulated/floor/plating,/area/atmos/distribution)
+"cVM" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/atmos/distribution)
"cVN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cVO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cVP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Break Room"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cVQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology)
-"cVR" = (/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/embedded_controller/radio/airlock/access_controller{id_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Console"; pixel_x = 6; pixel_y = 24; req_one_access_txt = "39"; tag_exterior_door = "viro_lab_airlock_exterior"; tag_interior_door = "viro_lab_airlock_interior"},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
-"cVS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cVT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
-"cVU" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera{c_tag = "Virology Module North"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
-"cVV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
-"cVW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
-"cVX" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
-"cVY" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/medical/virology)
+"cVO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cVP" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution)
+"cVQ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution)
+"cVR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/atmos/distribution)
+"cVS" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cVT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Break Room"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cVU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cVV" = (/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/embedded_controller/radio/airlock/access_controller{id_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Console"; pixel_x = 6; pixel_y = 24; req_one_access_txt = "39"; tag_exterior_door = "viro_lab_airlock_exterior"; tag_interior_door = "viro_lab_airlock_interior"},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
+"cVW" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology)
+"cVX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
+"cVY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cVZ" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cWa" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cWb" = (/obj/machinery/camera{c_tag = "Xenobiology Module South"; dir = 4; network = list("Research","SS13"); pixel_x = 0},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
-"cWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cWd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cWe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
+"cWb" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera{c_tag = "Virology Module North"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
+"cWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
+"cWd" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/medical/virology)
+"cWe" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
"cWf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cWg" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cWh" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cWi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cWj" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
+"cWh" = (/obj/machinery/camera{c_tag = "Xenobiology Module South"; dir = 4; network = list("Research","SS13"); pixel_x = 0},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
+"cWi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cWj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cWk" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/aft)
"cWl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft)
"cWm" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft)
"cWn" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"cWo" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cWp" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cWq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cWr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cWp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cWq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cWr" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cWs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cWt" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cWu" = (/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cWv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"cWw" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cWx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cWy" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cWz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cWA" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter/zippo,/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cWw" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cWx" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
+"cWy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cWz" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cWA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cWB" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWD" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWE" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWF" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWI" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/stock_parts/cell/high,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cWJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos)
-"cWK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/atmos)
-"cWL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/binary/volume_pump/on{dir = 4; name = "External to Filter"},/turf/simulated/floor/plasteel,/area/atmos)
-"cWM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"cWC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cWD" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cWF" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cWH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cWI" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cWJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cWK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cWL" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cWM" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/stock_parts/cell/high,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cWN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
"cWO" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
-"cWP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/atmos)
-"cWQ" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 4; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
+"cWP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cWQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/atmos)
"cWR" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
-"cWS" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
-"cWT" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"cWU" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"cWV" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "N2O to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"cWW" = (/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "N2O Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 5},/area/atmos)
-"cWX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
-"cWY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/n20,/area/atmos)
+"cWS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos)
+"cWT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/binary/volume_pump/on{dir = 4; name = "External to Filter"},/turf/simulated/floor/plasteel,/area/atmos)
+"cWU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"cWV" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/atmos)
+"cWW" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 4; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
+"cWX" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"cWY" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"cWZ" = (/turf/simulated/floor/engine/n20,/area/atmos)
-"cXa" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
-"cXb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cXc" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cXd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
-"cXe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
-"cXf" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cXg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
-"cXh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology)
-"cXi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
+"cXa" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "N2O to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
+"cXb" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"cXc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
+"cXd" = (/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "N2O Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 5},/area/atmos)
+"cXe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/n20,/area/atmos)
+"cXf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cXg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"cXh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
+"cXi" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cXj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cXk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cXk" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cXl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/asmaint)
"cXm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
-"cXn" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/device/radio/intercom{pixel_x = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
-"cXo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cXp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cXq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cXr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cXs" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cXt" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cXn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
+"cXo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology)
+"cXp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
+"cXq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
+"cXr" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cXs" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/device/radio/intercom{pixel_x = -28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
+"cXt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cXu" = (/turf/simulated/wall,/area/maintenance/engi_shuttle)
-"cXv" = (/obj/machinery/door/airlock/maintenance{name = "Engineering Shuttle"; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cXv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cXw" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cXx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cXx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cXy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
-"cXz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access_txt = "11"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cXA" = (/obj/machinery/camera{c_tag = "Engineering Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cXB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cXC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cXD" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump Engineering"; pixel_x = 24; shock_proof = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"cXE" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cXF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/radio/headset/headset_eng,/obj/item/device/multitool{pixel_x = 5},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cXG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/weapon/crowbar/large,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cXH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cXI" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cXz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cXA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cXB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cXC" = (/obj/machinery/door/airlock/maintenance{name = "Engineering Shuttle"; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cXD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cXE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access_txt = "11"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cXF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cXG" = (/obj/machinery/camera{c_tag = "Engineering Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cXH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cXI" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump Engineering"; pixel_x = 24; shock_proof = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cXJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
-"cXK" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/table,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/turf/simulated/floor/plasteel,/area/atmos)
-"cXL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
-"cXM" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Filter to External"},/turf/simulated/floor/plasteel,/area/atmos)
-"cXN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"cXO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
-"cXP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"cXQ" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"cXR" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Mix to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"cXS" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Pure to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
+"cXL" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cXM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/radio/headset/headset_eng,/obj/item/device/multitool{pixel_x = 5},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cXN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cXO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/weapon/crowbar/large,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cXP" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cXQ" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Filter to External"},/turf/simulated/floor/plasteel,/area/atmos)
+"cXR" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
+"cXS" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
"cXT" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
"cXU" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"cXV" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 4},/area/atmos)
-"cXW" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
-"cXX" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine/n20,/area/atmos)
-"cXY" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 0; volume = 1e+006},/turf/simulated/floor/engine/n20,/area/atmos)
+"cXV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"cXW" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"cXX" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Mix to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
+"cXY" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"cXZ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine/n20,/area/atmos)
-"cYa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cYb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cYc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cYd" = (/obj/machinery/smartfridge/secure/chemistry/virology,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"cYa" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Pure to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
+"cYb" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
+"cYc" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 4},/area/atmos)
+"cYd" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 0; volume = 1e+006},/turf/simulated/floor/engine/n20,/area/atmos)
"cYe" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cYf" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
-"cYg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation A"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cYh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation B"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cYf" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine/n20,/area/atmos)
+"cYg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cYh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cYi" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cYj" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cYk" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cYl" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
-"cYm" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
-"cYn" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
-"cYo" = (/obj/machinery/light,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
-"cYp" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/door_control{id = "xenobio5"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
-"cYq" = (/obj/machinery/light,/obj/structure/closet,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
-"cYr" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology)
-"cYs" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_se"; name = "southeast of SS13"; width = 19},/turf/space,/area/space)
+"cYl" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"cYm" = (/obj/machinery/smartfridge/secure/chemistry/virology,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"cYn" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
+"cYo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation A"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cYp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Isolation B"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cYq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
+"cYr" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
+"cYs" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
"cYt" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cYu" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cYv" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cYw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cYx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cYy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cYz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/maintenance/engi_shuttle)
-"cYA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cYB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cYC" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cYD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
-"cYE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"cYF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel,/area/engine/chiefs_office)
-"cYG" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"cYH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cYv" = (/obj/machinery/light,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
+"cYw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/door_control{id = "xenobio5"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
+"cYx" = (/obj/machinery/light,/obj/structure/closet,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/xenobiology)
+"cYy" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology)
+"cYz" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_se"; name = "southeast of SS13"; width = 19},/turf/space,/area/space)
+"cYA" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cYB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cYC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cYD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cYE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/maintenance/engi_shuttle)
+"cYF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cYG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cYH" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering)
"cYI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cYJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/engine/engineering)
-"cYK" = (/obj/machinery/door/firedoor{layer = 2.6; name = "\improper Firelock South"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cYL" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"cYK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cYL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cYM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
-"cYN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"cYO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"cYP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/atmos)
-"cYQ" = (/obj/structure/table,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/turf/simulated/floor/plasteel,/area/atmos)
-"cYR" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/weapon/wrench,/obj/item/device/pipe_painter,/obj/item/device/pipe_painter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
+"cYN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cYO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel,/area/engine/chiefs_office)
+"cYP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
+"cYQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cYR" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cYS" = (/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/atmos)
"cYT" = (/obj/machinery/atmospherics/trinary/tvalve/digital/flipped,/turf/simulated/floor/plasteel,/area/atmos)
-"cYU" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste to Port"},/turf/simulated/floor/plasteel,/area/atmos)
+"cYU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cYV" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/plasteel,/area/atmos)
"cYW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/plasteel,/area/atmos)
-"cYX" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"cYY" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 1; filter_type = 4; name = "Gas filter (N2O tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
-"cYZ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/atmos)
-"cZa" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
-"cZb" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/space,/area/space)
-"cZc" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "n2o_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos)
-"cZd" = (/obj/structure/table/glass,/obj/machinery/requests_console{department = "Virology"; departmentType = 3; name = "Virology Requests Console"; pixel_x = -30},/obj/item/weapon/storage/belt/medical,/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
-"cZe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cYX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"cYZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/atmos)
+"cZa" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/weapon/wrench,/obj/item/device/pipe_painter,/obj/item/device/pipe_painter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
+"cZb" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste to Port"},/turf/simulated/floor/plasteel,/area/atmos)
+"cZc" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"cZd" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 1; filter_type = 4; name = "Gas filter (N2O tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
+"cZe" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
"cZf" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cZg" = (/obj/structure/table,/obj/item/weapon/hand_labeler{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
-"cZh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
-"cZi" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
-"cZj" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
-"cZk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
-"cZl" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cZm" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cZn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cZo" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cZp" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cZq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cZr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"cZs" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"cZt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cZg" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/atmos)
+"cZh" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/space,/area/space)
+"cZi" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "n2o_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos)
+"cZj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cZk" = (/obj/structure/table/glass,/obj/machinery/requests_console{department = "Virology"; departmentType = 3; name = "Virology Requests Console"; pixel_x = -30},/obj/item/weapon/storage/belt/medical,/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"cZl" = (/obj/structure/table,/obj/item/weapon/hand_labeler{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
+"cZm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
+"cZn" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
+"cZo" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
+"cZp" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
+"cZq" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cZr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cZs" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"cZt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cZu" = (/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cZv" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cZv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cZw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cZx" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cZy" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/computer/monitor{name = "Engine Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZz" = (/obj/structure/table,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZA" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/item/device/pipe_painter,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/power/port_gen/pacman,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZy" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"cZz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cZA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
+"cZB" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
+"cZC" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"cZD" = (/obj/structure/table,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZE" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/computer/monitor{name = "Engine Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cZF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZH" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZJ" = (/obj/machinery/camera{c_tag = "Engineering East"; network = list("SS13")},/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZK" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZL" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/engineering)
+"cZG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/power/port_gen/pacman,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZH" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/item/device/pipe_painter,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cZM" = (/turf/simulated/wall,/area/engine/engineering)
-"cZN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/light_switch{pixel_x = -27},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cZO" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"cZP" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
-"cZQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
-"cZR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"cZN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZP" = (/obj/machinery/camera{c_tag = "Engineering East"; network = list("SS13")},/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cZQ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/engine/engineering)
+"cZR" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cZS" = (/turf/simulated/wall/r_wall,/area/atmos)
-"cZT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/atmos)
+"cZT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/light_switch{pixel_x = -27},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cZU" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
-"cZV" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Port to Filter"},/turf/simulated/floor/plasteel,/area/atmos)
+"cZV" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
"cZW" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel,/area/atmos)
"cZX" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
"cZY" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel,/area/atmos)
"cZZ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
-"daa" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dab" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Space Loop Out"},/turf/simulated/floor/plasteel,/area/atmos)
-"dac" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
+"daa" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
+"dab" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dac" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"dad" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/space,/area/space)
"dae" = (/obj/structure/door_assembly/door_assembly_mai,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"daf" = (/obj/structure/table/glass,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
-"dag" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
-"dah" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/medical/virology)
-"dai" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
-"daj" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
-"dak" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
-"dal" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
-"dam" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dan" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/port)
+"daf" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/atmos)
+"dag" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Port to Filter"},/turf/simulated/floor/plasteel,/area/atmos)
+"dah" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dai" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plating,/area/atmos)
+"daj" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Space Loop Out"},/turf/simulated/floor/plasteel,/area/atmos)
+"dak" = (/obj/structure/table/glass,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"dal" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
+"dam" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
+"dan" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/medical/virology)
"dao" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"dap" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"daq" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/decal/cleanable/generic,/obj/machinery/camera{c_tag = "Engineering Shuttle Access"; dir = 8; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"daq" = (/obj/structure/table,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
"dar" = (/turf/simulated/wall/r_wall,/area/storage/secure)
-"das" = (/obj/machinery/power/smes/engineering,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dat" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dau" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dav" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"das" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
+"dat" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
+"dau" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dav" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/port)
"daw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dax" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dax" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/decal/cleanable/generic,/obj/machinery/camera{c_tag = "Engineering Shuttle Access"; dir = 8; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"day" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"daz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daz" = (/obj/machinery/power/smes/engineering,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"daA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/engine/engineering)
"daB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"daC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"daD" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"daE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"daF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"daC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering)
"daG" = (/turf/simulated/floor/plating,/area/engine/engineering)
"daH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/engine/engineering)
"daI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
-"daJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
-"daK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"daJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"daL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
"daM" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
"daN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"daO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos)
"daP" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
-"daQ" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
-"daR" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"daS" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Plasma to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"daT" = (/obj/machinery/camera{c_tag = "Atmospherics East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Plasma Outlet Valve"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/atmos)
-"daU" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/space,/area/space)
-"daV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
-"daW" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"daQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daR" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daS" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"daT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"daU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"daV" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"daW" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Plasma to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"daX" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"daY" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
-"daZ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"dba" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
-"dbb" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
-"dbc" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
-"dbd" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
-"dbe" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
+"daY" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"daZ" = (/obj/machinery/camera{c_tag = "Atmospherics East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Plasma Outlet Valve"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/atmos)
+"dba" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/space,/area/space)
+"dbb" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"dbc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"dbd" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
+"dbe" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
"dbf" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"dbg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbh" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dbi" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dbi" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/stack/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbj" = (/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"dbk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage North"; dir = 4; network = list("SS13")},/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure)
+"dbk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"dbl" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure)
-"dbm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
-"dbn" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
-"dbo" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
-"dbp" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/dispenser,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dbm" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
+"dbn" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
+"dbo" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
+"dbp" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
"dbq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/engine/engineering)
"dbr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/engineering)
"dbs" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dbt" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dbu" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engine/engineering)
-"dbv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/engineering)
-"dbw" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plating,/area/engine/engineering)
-"dbx" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering)
-"dby" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
+"dbt" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage North"; dir = 4; network = list("SS13")},/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure)
+"dbu" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
+"dbv" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
+"dbw" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
+"dbx" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/dispenser,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dby" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engine/engineering)
"dbz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/engineering)
"dbA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dbB" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
-"dbC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dbB" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dbC" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plating,/area/engine/engineering)
"dbD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engine/engineering)
-"dbE" = (/obj/machinery/camera{c_tag = "Atmospherics West"; dir = 4; network = list("SS13")},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/atmos)
-"dbF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/atmos)
-"dbG" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dbH" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Toxin Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/atmos)
+"dbE" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/engineering)
+"dbF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
+"dbG" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering)
+"dbH" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
"dbI" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space)
-"dbJ" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
-"dbK" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
-"dbL" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"dbJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dbK" = (/obj/machinery/camera{c_tag = "Atmospherics West"; dir = 4; network = list("SS13")},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/atmos)
+"dbL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/reagent_dispensers/watertank/high,/turf/simulated/floor/plasteel,/area/atmos)
"dbM" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dbN" = (/obj/machinery/camera{c_tag = "Virology Module South"; dir = 1; network = list("SS13")},/obj/structure/closet/l3closet,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology)
-"dbO" = (/obj/structure/disposalpipe/segment,/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology)
+"dbN" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dbO" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Toxin Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/atmos)
"dbP" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall/r_wall,/area/medical/virology)
-"dbQ" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dbQ" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"dbR" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology)
-"dbS" = (/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sit_scimaint"; name = "Cyberiad Science Maint"; width = 11},/turf/space,/area/space)
+"dbS" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
"dbT" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
"dbU" = (/obj/structure/rack,/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"dbV" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"dbW" = (/obj/machinery/floodlight,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
-"dbX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
-"dbY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
-"dbZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
-"dca" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{id_tag = "Secure Storage"; name = "Secure Storage Blast Doors"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/storage/secure)
-"dcb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dce" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcg" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dbW" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"dbX" = (/obj/machinery/camera{c_tag = "Virology Module South"; dir = 1; network = list("SS13")},/obj/structure/closet/l3closet,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology)
+"dbY" = (/obj/structure/disposalpipe/segment,/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology)
+"dbZ" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dca" = (/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sit_scimaint"; name = "Cyberiad Science Maint"; width = 11},/turf/space,/area/space)
+"dcb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
+"dcc" = (/obj/machinery/floodlight,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
+"dcd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
+"dce" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
+"dcf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcg" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{id_tag = "Secure Storage"; name = "Secure Storage Blast Doors"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/storage/secure)
"dch" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dci" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
-"dcj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"dck" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"dcl" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/camera{c_tag = "Engineering Particle Accelerator"; dir = 2; pixel_x = 23; network = list("Singularity","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"dcm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
+"dci" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dck" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcl" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"dcn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dco" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering)
-"dcp" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering)
-"dcq" = (/obj/machinery/camera{c_tag = "Engineering SMES"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
-"dcr" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
+"dco" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
+"dcp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"dcq" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"dcr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
"dcs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/engine/engineering)
"dct" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/atmos)
-"dcu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/atmos)
+"dcu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/camera{c_tag = "Engineering Particle Accelerator"; dir = 2; pixel_x = 23; network = list("Singularity","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
"dcv" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
-"dcw" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 1; name = "Gas filter (Toxins tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
-"dcx" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/atmos)
-"dcy" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space)
-"dcz" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "tox_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"dcw" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering)
+"dcx" = (/obj/machinery/camera{c_tag = "Engineering SMES"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering)
+"dcy" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering)
+"dcz" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering)
"dcA" = (/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint)
"dcB" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dcC" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/medical/virology)
@@ -8251,226 +8168,226 @@
"dcI" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dcJ" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dcK" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dcL" = (/obj/machinery/door/airlock/external{id_tag = "engineering_home"; name = "Engineering Dock Airlock"; req_access_txt = "0"; req_one_access_txt = "10;24"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"dcL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/atmos)
"dcM" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"dcN" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/storage/secure)
-"dcO" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
+"dcO" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 1; name = "Gas filter (Toxins tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"dcP" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
"dcQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/secure)
-"dcR" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{id_tag = "Secure Storage"; name = "Secure Storage Blast Doors"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/secure)
-"dcS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dcY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"dcZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
-"dda" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcR" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/atmos)
+"dcS" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space)
+"dcT" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "tox_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos)
+"dcU" = (/obj/machinery/door/airlock/external{id_tag = "engineering_home"; name = "Engineering Dock Airlock"; req_access_txt = "0"; req_one_access_txt = "10;24"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"dcV" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
+"dcW" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{id_tag = "Secure Storage"; name = "Secure Storage Blast Doors"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/secure)
+"dcX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dcZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dda" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
"ddb" = (/obj/structure/particle_accelerator/end_cap,/turf/simulated/floor/plating,/area/engine/engineering)
-"ddc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"dde" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddh" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"ddk" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"ddl" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/airlock/external{name = "Engineering Escape Pod"; req_access = null; req_access_txt = "10"},/turf/simulated/floor/plating,/area/engine/engineering)
+"ddc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dde" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"ddf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"ddg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
+"ddi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddk" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"ddm" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel,/area/atmos)
-"ddn" = (/obj/machinery/portable_atmospherics/pump,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
-"ddo" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"ddp" = (/obj/machinery/camera{c_tag = "Atmospherics Central"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/atmos)
-"ddq" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ddr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dds" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ddt" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddo" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddp" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
+"ddq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"ddr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/airlock/external{name = "Engineering Escape Pod"; req_access = null; req_access_txt = "10"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dds" = (/obj/machinery/portable_atmospherics/pump,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"ddt" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"ddu" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/weapon/wrench,/obj/machinery/light/small{dir = 8},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ddv" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ddw" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ddx" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ddy" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ddz" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"ddA" = (/obj/structure/sign/biohazard{pixel_y = 32},/turf/space,/area/space)
+"ddx" = (/obj/machinery/camera{c_tag = "Atmospherics Central"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/atmos)
+"ddy" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"ddB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ddC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ddD" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ddE" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"ddF" = (/obj/structure/lattice,/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sit_engshuttle"; name = "Cyberiad Eng Shuttle"; width = 11},/turf/space,/area/space)
+"ddC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddE" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddF" = (/obj/structure/sign/biohazard{pixel_y = 32},/turf/space,/area/space)
"ddG" = (/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/storage/secure)
-"ddH" = (/obj/machinery/field/generator,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
-"ddI" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/storage/secure)
-"ddJ" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddK" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "engineering_west_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddL" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddM" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = 25; pixel_y = 0; req_access_txt = "10"},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddQ" = (/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = -25; pixel_y = 0; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"ddH" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ddI" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ddJ" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ddK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"ddL" = (/obj/structure/lattice,/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "sit_engshuttle"; name = "Cyberiad Eng Shuttle"; width = 11},/turf/space,/area/space)
+"ddM" = (/obj/machinery/field/generator,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
+"ddN" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/storage/secure)
+"ddO" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"ddP" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"ddQ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "engineering_west_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"ddR" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"ddS" = (/obj/structure/particle_accelerator/fuel_chamber,/turf/simulated/floor/plating,/area/engine/engineering)
-"ddT" = (/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = 25; pixel_y = 0; req_access_txt = "10"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"ddU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = -25; pixel_y = 0; req_access_txt = "10"},/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"ddX" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "engineering_east_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/engine/engineering)
-"ddY" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
+"ddT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"ddU" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"ddV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = 25; pixel_y = 0; req_access_txt = "10"},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"ddW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"ddX" = (/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = -25; pixel_y = 0; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"ddY" = (/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = 25; pixel_y = 0; req_access_txt = "10"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
"ddZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
"dea" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/atmos)
-"deb" = (/obj/machinery/space_heater,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"deb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "Singularity"; name = "Singularity Blast Doors"; pixel_x = -25; pixel_y = 0; req_access_txt = "10"},/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"dec" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/plasteel,/area/atmos)
-"ded" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
-"dee" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "CO2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"def" = (/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "CO2 Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/atmos)
-"deg" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space)
-"deh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
-"dei" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
-"dej" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dek" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"del" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dem" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access_txt = "12;24"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"den" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deo" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dep" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"ded" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"dee" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"def" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
+"deg" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "engineering_east_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/engine/engineering)
+"deh" = (/obj/machinery/space_heater,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"dei" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
+"dej" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "CO2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
+"dek" = (/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "CO2 Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/atmos)
+"del" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space)
+"dem" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
+"den" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
+"deo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dep" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"deq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"der" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"des" = (/obj/machinery/light/small{dir = 8},/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/storage/secure)
-"det" = (/obj/machinery/light/small{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
+"det" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access_txt = "12;24"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"deu" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/engine/engineering)
-"dev" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_west_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dew" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/engineering)
-"dex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/engineering)
-"dey" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering)
-"dez" = (/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/crowbar,/obj/machinery/light_switch{pixel_x = -27},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"dev" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dew" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dey" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dez" = (/obj/machinery/light/small{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
"deA" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/engine/engineering)
"deB" = (/obj/structure/particle_accelerator/power_box,/turf/simulated/floor/plating,/area/engine/engineering)
"deC" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"deD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
-"deE" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_east_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
-"deF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos)
-"deG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"deD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_west_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering)
+"deE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/engineering)
+"deF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/engineering)
+"deG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering)
"deH" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"deI" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
"deJ" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"deK" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
-"deL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"deM" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"deN" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/floor/plasteel,/area/atmos)
-"deO" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/atmos)
-"deP" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
-"deQ" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
-"deR" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
+"deL" = (/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/crowbar,/obj/machinery/light_switch{pixel_x = -27},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"deM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering)
+"deN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_east_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"deO" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/atmos)
+"deP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"deQ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"deR" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
"deS" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"deT" = (/obj/structure/stool,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deU" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deW" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"deZ" = (/obj/machinery/door/airlock/maintenance,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dfa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
-"dfb" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"deU" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/floor/plasteel,/area/atmos)
+"deV" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/atmos)
+"deW" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
+"deX" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
+"deY" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
+"deZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfa" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dfc" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dfd" = (/turf/simulated/wall/r_wall,/area/maintenance/engi_shuttle)
"dfe" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plating,/area/storage/secure)
-"dff" = (/obj/machinery/pipedispenser,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
-"dfg" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/crate/internals,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"dfh" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "engineering_west_pump"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plating,/area/engine/engineering)
-"dfi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering)
-"dfj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dff" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
+"dfi" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dfj" = (/obj/machinery/door/airlock/maintenance,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dfk" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/engine/engineering)
"dfl" = (/obj/structure/cable,/obj/machinery/power/rad_collector{anchored = 1},/turf/simulated/floor/plating,/area/engine/engineering)
"dfm" = (/obj/structure/cable,/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/engine/engineering)
"dfn" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"dfo" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering)
-"dfp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"dfp" = (/obj/machinery/pipedispenser,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
"dfq" = (/obj/structure/particle_accelerator/particle_emitter/left,/turf/simulated/floor/plating,/area/engine/engineering)
"dfr" = (/obj/structure/particle_accelerator/particle_emitter/center,/turf/simulated/floor/plating,/area/engine/engineering)
"dfs" = (/obj/structure/particle_accelerator/particle_emitter/right,/turf/simulated/floor/plating,/area/engine/engineering)
"dft" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/engine/engineering)
-"dfu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dfu" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/crate/internals,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
"dfv" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/engine/engineering)
-"dfw" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/airlock/external{name = "Engineering Escape Pod"; req_access = null; req_access_txt = "24"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/atmos)
+"dfw" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "engineering_west_pump"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plating,/area/engine/engineering)
"dfx" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/t_scanner,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/atmos)
"dfy" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/atmos)
-"dfz" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dfA" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
+"dfz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dfA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering)
"dfB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dfC" = (/obj/machinery/atmospherics/trinary/mixer{dir = 4; name = "Gas mixer (N2/O2)"; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; target_pressure = 4500},/turf/simulated/floor/plasteel,/area/atmos)
-"dfD" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "O2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
-"dfE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dfF" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 1; filter_type = 3; name = "Gas filter (CO2 tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
-"dfG" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/atmos)
-"dfH" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "co2_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
-"dfI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dfJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dfK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
+"dfD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dfE" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/airlock/external{name = "Engineering Escape Pod"; req_access = null; req_access_txt = "24"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/atmos)
+"dfF" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dfG" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
+"dfH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "O2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos)
+"dfI" = (/obj/machinery/atmospherics/trinary/mixer{dir = 4; name = "Gas mixer (N2/O2)"; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; target_pressure = 4500},/turf/simulated/floor/plasteel,/area/atmos)
+"dfJ" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 1; filter_type = 3; name = "Gas filter (CO2 tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
+"dfK" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
"dfL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dfM" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dfN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/asmaint2)
-"dfO" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dfN" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/atmos)
+"dfO" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "co2_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos)
"dfP" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dfQ" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_sw"; name = "southwest of SS13"; width = 19},/turf/space,/area/space)
-"dfR" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/constructionsite)
-"dfS" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/constructionsite)
-"dfT" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/docking_port/mobile{dir = 2; dwidth = 3; height = 5; id = "engineering"; name = "engineering shuttle"; rebuildable = 1; roundstart_move = "engineering_away"; width = 7},/obj/docking_port/stationary{dir = 2; dwidth = 3; height = 5; id = "engineering_home"; name = "engineering dock"; width = 7},/turf/simulated/floor/plating,/area/shuttle/constructionsite)
-"dfU" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/constructionsite)
+"dfQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/asmaint2)
+"dfT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dfU" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dfV" = (/turf/simulated/floor/plating,/area/storage/secure)
-"dfW" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"dfX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "engineering_west_pump"; tag_exterior_door = "engineering_west_outer"; frequency = 1379; id_tag = "engineering_west_airlock"; tag_interior_door = "engineering_west_inner"; pixel_x = 25; req_access_txt = "10;13"; tag_chamber_sensor = "engineering_west_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "engineering_west_sensor"; pixel_x = 25; pixel_y = 12},/turf/simulated/floor/plating,/area/engine/engineering)
-"dfY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
-"dfZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"dga" = (/obj/item/weapon/wirecutters,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
-"dgb" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
-"dgc" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "engineering_east_pump"; tag_exterior_door = "engineering_east_outer"; frequency = 1379; id_tag = "engineering_east_airlock"; tag_interior_door = "engineering_east_inner"; pixel_x = -25; req_access_txt = "10;13"; tag_chamber_sensor = "engineering_east_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "engineering_east_sensor"; pixel_x = -25; pixel_y = 12},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
-"dgd" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "engineering_east_pump"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dge" = (/obj/machinery/camera{c_tag = "Atmospherics South-West"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
-"dgf" = (/obj/structure/table,/obj/item/pipe,/obj/item/device/radio{pixel_x = -6; pixel_y = 4},/obj/item/device/radio{pixel_x = 6; pixel_y = 4},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/atmos)
+"dfW" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_sw"; name = "southwest of SS13"; width = 19},/turf/space,/area/space)
+"dfX" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/constructionsite)
+"dfY" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/constructionsite)
+"dfZ" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; req_access_txt = "0"; req_one_access_txt = "10;24"},/obj/docking_port/mobile{dir = 2; dwidth = 3; height = 5; id = "engineering"; name = "engineering shuttle"; rebuildable = 1; roundstart_move = "engineering_away"; width = 7},/obj/docking_port/stationary{dir = 2; dwidth = 3; height = 5; id = "engineering_home"; name = "engineering dock"; width = 7},/turf/simulated/floor/plating,/area/shuttle/constructionsite)
+"dga" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/constructionsite)
+"dgb" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
+"dgc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "engineering_west_pump"; tag_exterior_door = "engineering_west_outer"; frequency = 1379; id_tag = "engineering_west_airlock"; tag_interior_door = "engineering_west_inner"; pixel_x = 25; req_access_txt = "10;13"; tag_chamber_sensor = "engineering_west_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "engineering_west_sensor"; pixel_x = 25; pixel_y = 12},/turf/simulated/floor/plating,/area/engine/engineering)
+"dgd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering)
+"dge" = (/obj/item/weapon/wirecutters,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
+"dgf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering)
"dgg" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
"dgh" = (/obj/machinery/atmospherics/unary/portables_connector,/turf/simulated/floor/plasteel,/area/atmos)
-"dgi" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
+"dgi" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering)
"dgj" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"dgk" = (/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dgl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dgl" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "engineering_east_pump"},/turf/simulated/floor/plating,/area/engine/engineering)
"dgm" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dgn" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/asmaint)
"dgo" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/asmaint)
"dgp" = (/obj/structure/closet/l3closet,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dgq" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dgr" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dgs" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dgt" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/area/shuttle/constructionsite)
+"dgq" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "engineering_east_pump"; tag_exterior_door = "engineering_east_outer"; frequency = 1379; id_tag = "engineering_east_airlock"; tag_interior_door = "engineering_east_inner"; pixel_x = -25; req_access_txt = "10;13"; tag_chamber_sensor = "engineering_east_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "engineering_east_sensor"; pixel_x = -25; pixel_y = 12},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dgr" = (/obj/machinery/camera{c_tag = "Atmospherics South-West"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
+"dgs" = (/obj/structure/table,/obj/item/device/radio{pixel_x = -6; pixel_y = 4},/obj/item/device/radio{pixel_x = 6; pixel_y = 4},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/atmos)
+"dgt" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"dgu" = (/turf/simulated/shuttle/wall,/area/shuttle/constructionsite)
"dgv" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite)
"dgw" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite)
"dgx" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite)
-"dgy" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/constructionsite)
+"dgy" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dgz" = (/obj/machinery/light/small{dir = 8},/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/storage/secure)
-"dgA" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
-"dgB" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"dgC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_west_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dgD" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating/airless,/area/space)
+"dgA" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dgB" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dgC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dgD" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/area/shuttle/constructionsite)
"dgE" = (/obj/machinery/power/grounding_rod{anchored = 1},/turf/simulated/floor/plating/airless,/area/space)
-"dgF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dgG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_east_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
-"dgH" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plasteel,/area/atmos)
-"dgI" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 4; filter_type = 2; name = "Gas filter (N2 tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
-"dgJ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dgK" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dgL" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 4; filter_type = 1; name = "Gas filter (O2 tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
-"dgM" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dgN" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
-"dgO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9; level = 2},/turf/simulated/floor/plating,/area/atmos)
-"dgP" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space)
-"dgQ" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/space)
-"dgR" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space)
+"dgF" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/constructionsite)
+"dgG" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
+"dgH" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
+"dgI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_west_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dgJ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating/airless,/area/space)
+"dgK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dgL" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "engineering_east_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
+"dgM" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plasteel,/area/atmos)
+"dgN" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 4; filter_type = 2; name = "Gas filter (N2 tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
+"dgO" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dgP" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dgQ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dgR" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 4; filter_type = 1; name = "Gas filter (O2 tank)"; on = 1},/turf/simulated/floor/plasteel,/area/atmos)
"dgS" = (/turf/simulated/wall/r_wall,/area/maintenance/turbine)
"dgT" = (/turf/simulated/wall,/area/maintenance/turbine)
"dgU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/turbine)
-"dgV" = (/obj/machinery/door/airlock/atmos{name = "Turbine Access"; req_access_txt = "12;24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/turbine)
-"dgW" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dgV" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; level = 2},/turf/simulated/floor/plasteel,/area/atmos)
+"dgW" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9; level = 2},/turf/simulated/floor/plating,/area/atmos)
"dgX" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/obj/item/roller,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dgY" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/reagent_containers/food/snacks/donkpocket,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dgZ" = (/obj/item/weapon/c_tube,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -8480,98 +8397,98 @@
"dhd" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite)
"dhe" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/space,/area/shuttle/constructionsite)
"dhf" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating,/area/storage/secure)
-"dhg" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
-"dhh" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"dhi" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dhj" = (/obj/item/weapon/extinguisher,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "engineering_west_airlock"; name = "exterior access button"; pixel_x = 20; pixel_y = 20; req_access_txt = "10;13"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dhk" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity North-West"; dir = 2; network = list("Singularity","SS13"); pixel_x = 20; pixel_y = 0},/obj/machinery/power/grounding_rod{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dhl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/space)
-"dhm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dhn" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dho" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dhp" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity North-East"; dir = 2; network = list("Singularity","SS13")},/obj/machinery/power/grounding_rod{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dhq" = (/obj/item/weapon/wrench,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "engineering_east_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = 20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dhr" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dhg" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space)
+"dhh" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/space)
+"dhi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space)
+"dhj" = (/obj/machinery/door/airlock/atmos{name = "Turbine Access"; req_access_txt = "12;24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/turbine)
+"dhk" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dhl" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
+"dhm" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
+"dhn" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dho" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity North-West"; dir = 2; network = list("Singularity","SS13"); pixel_x = 20; pixel_y = 0},/obj/machinery/power/grounding_rod{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dhp" = (/obj/item/weapon/extinguisher,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "engineering_west_airlock"; name = "exterior access button"; pixel_x = 20; pixel_y = 20; req_access_txt = "10;13"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dhq" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/space)
+"dhr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"dhs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
-"dht" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/firecloset,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = -30},/turf/simulated/floor/plasteel,/area/atmos)
-"dhu" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/atmos)
-"dhv" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plasteel{icon_state = "red"},/area/atmos)
-"dhw" = (/obj/machinery/atmospherics/binary/valve/digital/open{name = "Nitrogen Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/atmos)
+"dht" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
+"dhu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
+"dhv" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity North-East"; dir = 2; network = list("Singularity","SS13")},/obj/machinery/power/grounding_rod{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dhw" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"dhx" = (/obj/machinery/light,/obj/machinery/atmospherics/binary/volume_pump/on{name = "Space Loop In"},/turf/simulated/floor/plasteel,/area/atmos)
-"dhy" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/atmos)
-"dhz" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/atmos)
-"dhA" = (/obj/machinery/atmospherics/binary/valve/digital/open{name = "Oxygen Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/atmos)
-"dhB" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 10},/area/atmos)
-"dhC" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "arrival"},/area/atmos)
-"dhD" = (/obj/machinery/camera{c_tag = "Atmospherics South-East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/binary/valve/digital/open{name = "Mixed Air Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/atmos)
-"dhE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos)
-"dhF" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/space)
-"dhG" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 5; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/wall/r_wall,/area/maintenance/turbine)
-"dhH" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/maintenance/turbine)
-"dhI" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/effect/decal/cleanable/cobweb,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dhJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dhK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dhL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/maintenance/turbine)
-"dhM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_y = 32},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/maintenance/turbine)
-"dhN" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dhO" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dhP" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dhy" = (/obj/item/weapon/wrench,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "engineering_east_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = 20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dhz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/firecloset,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = -30},/turf/simulated/floor/plasteel,/area/atmos)
+"dhA" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plasteel{icon_state = "red"},/area/atmos)
+"dhB" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/atmos)
+"dhC" = (/obj/machinery/atmospherics/binary/valve/digital/open{name = "Nitrogen Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/atmos)
+"dhD" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/atmos)
+"dhE" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/atmos)
+"dhF" = (/obj/machinery/atmospherics/binary/valve/digital/open{name = "Oxygen Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/atmos)
+"dhG" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "arrival"},/area/atmos)
+"dhH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{level = 2},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 10},/area/atmos)
+"dhI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos)
+"dhJ" = (/obj/machinery/camera{c_tag = "Atmospherics South-East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/binary/valve/digital/open{name = "Mixed Air Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/atmos)
+"dhK" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/space)
+"dhL" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/maintenance/turbine)
+"dhM" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 5; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/wall/r_wall,/area/maintenance/turbine)
+"dhN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10; level = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dhO" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/effect/decal/cleanable/cobweb,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dhP" = (/obj/structure/grille/broken,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dhQ" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dhR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2)
-"dhS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dhT" = (/obj/machinery/door/airlock/maintenance,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dhU" = (/obj/structure/rack,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dhV" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dhS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/maintenance/turbine)
+"dhT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dhU" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dhV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_y = 32},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/maintenance/turbine)
"dhW" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite)
"dhX" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite)
-"dhY" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"; dir = 2},/area/shuttle/constructionsite)
-"dhZ" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"dia" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dhY" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dhZ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dia" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dib" = (/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dic" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
-"did" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/turf/simulated/floor/plating,/area/atmos)
-"die" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9},/turf/simulated/floor/plating,/area/atmos)
-"dif" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/turf/simulated/floor/plating,/area/atmos)
-"dig" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/atmos)
-"dih" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plating,/area/atmos)
-"dii" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/structure/lattice,/turf/space,/area/space)
-"dij" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dik" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to MiniSat"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dic" = (/obj/structure/rack,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"did" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"die" = (/obj/machinery/door/airlock/maintenance,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dif" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"; dir = 2},/area/shuttle/constructionsite)
+"dig" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
+"dih" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dii" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
+"dij" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9},/turf/simulated/floor/plating,/area/atmos)
+"dik" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/turf/simulated/floor/plating,/area/atmos)
"dil" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dim" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"din" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dio" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dip" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dio" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/atmos)
+"dip" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/turf/simulated/floor/plating,/area/atmos)
"diq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/maintenance/asmaint)
"dir" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint)
"dis" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dit" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diu" = (/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"div" = (/obj/structure/stool/bed/chair,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/asmaint2)
-"dix" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint2)
-"diz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/asmaint2)
-"diA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diD" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diF" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dit" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/simulated/floor/plating,/area/atmos)
+"diu" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/structure/lattice,/turf/space,/area/space)
+"div" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"diw" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to MiniSat"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dix" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"diy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"diz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diB" = (/obj/structure/stool/bed/chair,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diC" = (/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/asmaint2)
+"diF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/asmaint2)
+"diG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint2)
"diH" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"diI" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/constructionsite)
-"diJ" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/constructionsite)
+"diI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"diK" = (/obj/machinery/light/small{dir = 8},/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/storage/secure)
-"diL" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
-"diM" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/firecloset,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"diN" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"diO" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"diL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diN" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"diO" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"diP" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"diQ" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space)
+"diQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"diR" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"diS" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"diT" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"diS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/constructionsite)
+"diT" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/constructionsite)
"diU" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/turf/space,/area/space)
"diV" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/turf/space,/area/space)
"diW" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/space,/area/space)
@@ -8584,203 +8501,203 @@
"djd" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/lattice,/turf/space,/area/space)
"dje" = (/obj/machinery/atmospherics/unary/tank/toxins{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"djf" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"djg" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"djg" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
"djh" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dji" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"djj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"djj" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/firecloset,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
"djk" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister,/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"djl" = (/obj/structure/table,/obj/item/weapon/cartridge/medical,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"djm" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"djn" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"djn" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"djo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"djp" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"djq" = (/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"djp" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"djq" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space)
"djr" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"djs" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/storage/secure)
-"djt" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
-"dju" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"djt" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dju" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"djv" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"djw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"djx" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/space)
+"djw" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"djx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"djy" = (/obj/structure/lattice,/obj/item/weapon/wirecutters,/turf/space,/area/space)
-"djz" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/space)
-"djA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
+"djz" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"djA" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"djB" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos)
-"djC" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos)
-"djD" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos)
+"djC" = (/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"djD" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure)
"djE" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space)
"djF" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"djG" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"djH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"djI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"djH" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"djI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"djJ" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"djK" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/turbine)
-"djL" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/maintenance/asmaint)
+"djL" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/space)
"djM" = (/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"djN" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/cigbutt/roach,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"djO" = (/obj/structure/disposalpipe/segment,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"djO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"djP" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"djQ" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
-"djR" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"djS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
+"djR" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/space)
+"djS" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos)
"djT" = (/obj/structure/lattice,/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
-"djU" = (/obj/machinery/power/emitter,/obj/machinery/camera{c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/storage/secure)
-"djV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"djW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"djX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"djY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"djU" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos)
+"djV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"djW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"djX" = (/obj/structure/disposalpipe/segment,/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"djY" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/maintenance/asmaint)
"djZ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering)
-"dka" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "n2_in"; on = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
-"dkb" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
-"dkc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
-"dkd" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "o2_in"; on = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
-"dke" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
-"dkf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
-"dkg" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "o2_in"; on = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
-"dkh" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
-"dki" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dka" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dkb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar)
+"dkc" = (/obj/machinery/power/emitter,/obj/machinery/camera{c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/storage/secure)
+"dkd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dke" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dkf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dkg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dkh" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
+"dki" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "n2_in"; on = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"dkj" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/turbine)
-"dkk" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"dkl" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dkm" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dkn" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dko" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dkp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dkq" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/obj/machinery/meter,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkp" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
+"dkq" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "o2_in"; on = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
"dkr" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dks" = (/obj/machinery/door/airlock/maintenance{name = "Biohazard Disposals"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dks" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
"dkt" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/asmaint)
-"dku" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/asmaint2)
+"dku" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
"dkv" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dkw" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dkx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dky" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dkw" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "o2_in"; on = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dkx" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dky" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dkz" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating/airless,/area/space)
"dkA" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating/airless,/area/space)
"dkB" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating/airless,/area/space)
"dkC" = (/obj/item/weapon/crowbar,/turf/space,/area/space)
-"dkD" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
-"dkE" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
-"dkF" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
-"dkG" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
-"dkH" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
-"dkI" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dkD" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/obj/machinery/meter,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkF" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/asmaint2)
+"dkG" = (/obj/machinery/door/airlock/maintenance{name = "Biohazard Disposals"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dkH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dkI" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dkJ" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dkK" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"dkL" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dkM" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door_control{id = "auxiliaryturbinevent"; name = "Auxiliary Vent"; pixel_x = 6; pixel_y = -24; req_access_txt = "32"},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent"; pixel_x = -6; pixel_y = -24; req_access_txt = "32"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dkN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
-"dkO" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "turbine_control"; name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"; tag_exterior_door = "gas_turbine_exterior"; tag_interior_door = "gas_turbine_interior"},/obj/machinery/ignition_switch{id = "gasturbine"; pixel_x = -6; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkM" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dkN" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
+"dkO" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"dkP" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dkQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkR" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "gas pump"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dkR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
"dkS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkU" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "south_maint"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkV" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "south_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1450; id_tag = "south_pump"},/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "south_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "south_maint"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"; tag_airpump = "south_pump"; tag_chamber_sensor = "south_sensor"; tag_exterior_door = "south_maint_outer"; tag_interior_door = "south_maint_inner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkX" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "south_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dkY" = (/obj/structure/disposalpipe/segment,/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dkZ" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dla" = (/obj/structure/stool,/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dlb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dlc" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dld" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dkT" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
+"dkU" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dkV" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dkW" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door_control{id = "auxiliaryturbinevent"; name = "Auxiliary Vent"; pixel_x = 6; pixel_y = -24; req_access_txt = "32"},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent"; pixel_x = -6; pixel_y = -24; req_access_txt = "32"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkX" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/embedded_controller/radio/airlock/access_controller{frequency = 1449; id_tag = "turbine_control"; name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"; tag_exterior_door = "gas_turbine_exterior"; tag_interior_door = "gas_turbine_interior"},/obj/machinery/ignition_switch{id = "gasturbine"; pixel_x = -6; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
+"dkZ" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "gas pump"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dla" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dlb" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "south_maint"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dlc" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1450; id_tag = "south_pump"},/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "south_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "south_maint"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"; tag_airpump = "south_pump"; tag_chamber_sensor = "south_sensor"; tag_exterior_door = "south_maint_outer"; tag_interior_door = "south_maint_inner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dld" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "south_maint_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dle" = (/obj/machinery/the_singularitygen{anchored = 1},/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating/airless,/area/space)
"dlf" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/space)
"dlg" = (/obj/machinery/the_singularitygen/tesla{anchored = 1},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating/airless,/area/space)
-"dlh" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dli" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
-"dlj" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
-"dlk" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dlh" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "south_maint_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dli" = (/obj/structure/disposalpipe/segment,/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlj" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dll" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/maintenance/turbine)
"dlm" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine)
"dln" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine)
-"dlo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_interior"; locked = 1; name = "Turbine Interior Airlock"; req_access_txt = "32"},/turf/simulated/floor/engine,/area/maintenance/turbine)
+"dlo" = (/obj/structure/stool,/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dlp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dlq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dlq" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dlr" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dls" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dlt" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "south_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = 8; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"dlu" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dlv" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dlw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dlx" = (/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dly" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlt" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dlu" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dlv" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
+"dlw" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
+"dlx" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos)
+"dly" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_interior"; locked = 1; name = "Turbine Interior Airlock"; req_access_txt = "32"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
"dlz" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dlA" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dlB" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dlC" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dlD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dlA" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dlB" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlC" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dlE" = (/obj/item/weapon/weldingtool,/turf/space,/area/space)
"dlF" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating/airless,/area/space)
"dlG" = (/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plating/airless,/area/space)
"dlH" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating/airless,/area/space)
"dlI" = (/obj/structure/lattice,/obj/machinery/atmospherics/binary/pump/on,/turf/space,/area/maintenance/turbine)
-"dlJ" = (/obj/machinery/atmospherics/binary/pump{on = 1},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = 5; pixel_y = -23},/obj/machinery/light/small{dir = 8},/obj/structure/sign/fire{pixel_x = -32},/turf/simulated/floor/engine,/area/maintenance/turbine)
-"dlK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/maintenance/turbine)
-"dlL" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/obj/structure/sign/fire{pixel_x = 32},/turf/simulated/floor/engine,/area/maintenance/turbine)
+"dlJ" = (/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlK" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "south_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = 8; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"dlL" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dlM" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dlN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dlO" = (/obj/structure/stool,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dlP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/clipboard,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dlP" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dlQ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dlR" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/ash,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dlS" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dlR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dlS" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dlT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dlU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dlV" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering)
-"dlW" = (/obj/machinery/access_button/airlock_exterior{master_tag = "atmospherics_south"; pixel_x = -25; pixel_y = -8},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space)
-"dlX" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space)
+"dlU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dlV" = (/obj/machinery/atmospherics/binary/pump{on = 1},/obj/machinery/access_button{command = "cycle_exterior"; layer = 3.1; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = 5; pixel_y = -23},/obj/machinery/light/small{dir = 8},/obj/structure/sign/fire{pixel_x = -32},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
+"dlW" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/obj/structure/sign/fire{pixel_x = 32},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
+"dlX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
"dlY" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/structure/lattice,/turf/space,/area/space)
-"dlZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/turf/simulated/floor/engine,/area/maintenance/turbine)
+"dlZ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/ash,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dma" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint)
-"dmb" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint)
-"dmc" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/obj/machinery/atmospherics/binary/pump{name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dmd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dme" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dmf" = (/obj/effect/decal/warning_stripes/west,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dmg" = (/obj/structure/table,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dmh" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dmi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dmb" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dmc" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/clipboard,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dmd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dme" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering)
+"dmf" = (/obj/machinery/access_button/airlock_exterior{master_tag = "atmospherics_south"; pixel_x = -25; pixel_y = -8},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/space)
+"dmg" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space)
+"dmh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
+"dmi" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint)
"dmj" = (/obj/item/device/radio,/turf/simulated/floor/plating/airless,/area/engine/engineering)
"dmk" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/engine/engineering)
-"dml" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dmm" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "atmospherics_south_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "atmospherics_south_sensor"; pixel_x = -8; pixel_y = -30},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "atmospherics_south"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_airpump = "atmospherics_south_pump"; tag_chamber_sensor = "atmospherics_south_sensor"; tag_exterior_door = "atmospherics_south_outer"; tag_interior_door = "atmospherics_south_inner"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dmn" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dml" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/obj/machinery/atmospherics/binary/pump{name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dmm" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dmn" = (/obj/effect/decal/warning_stripes/west,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dmo" = (/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"dmp" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine,/area/maintenance/turbine)
-"dmq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/igniter{icon_state = "igniter0"; id = "gasturbine"; on = 0},/turf/simulated/floor/engine,/area/maintenance/turbine)
-"dmr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/vacuum{pixel_y = -30},/turf/simulated/floor/engine,/area/maintenance/turbine)
-"dms" = (/obj/machinery/door/poddoor{id_tag = "auxiliaryturbinevent"; name = "Auxiliary Turbine Vent"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/turbine)
+"dmp" = (/obj/structure/table,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dmq" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dmr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dms" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dmt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dmu" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2)
-"dmv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"dmw" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmx" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity West"; dir = 4; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmy" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity East"; dir = 8; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmz" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmA" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button/airlock_interior{master_tag = "atmospherics_south"; pixel_x = 22; pixel_y = 10},/turf/simulated/floor/plating,/area/engine/engineering)
+"dmv" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "atmospherics_south_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "atmospherics_south_sensor"; pixel_x = -8; pixel_y = -30},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "atmospherics_south"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_airpump = "atmospherics_south_pump"; tag_chamber_sensor = "atmospherics_south_sensor"; tag_exterior_door = "atmospherics_south_outer"; tag_interior_door = "atmospherics_south_inner"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dmw" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dmx" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dmy" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
+"dmz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/vacuum{pixel_y = -30},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
+"dmA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/igniter{icon_state = "igniter0"; id = "gasturbine"; on = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
"dmB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dmC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dmD" = (/turf/simulated/wall/r_wall/coated,/area/space)
-"dmE" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable,/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1},/turf/simulated/floor/engine,/area/maintenance/turbine)
+"dmE" = (/obj/machinery/door/poddoor{id_tag = "auxiliaryturbinevent"; name = "Auxiliary Turbine Vent"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
"dmF" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/space,/area/space)
-"dmG" = (/obj/effect/decal/warning_stripes/northeast,/obj/structure/table/glass,/obj/item/weapon/wirerod,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dmH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area/space)
-"dmI" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
-"dmJ" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmK" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmM" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating/airless,/area/space)
-"dmN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dmO" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
+"dmH" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmI" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity West"; dir = 4; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmJ" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmK" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity East"; dir = 8; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmL" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button/airlock_interior{master_tag = "atmospherics_south"; pixel_x = 22; pixel_y = 10},/turf/simulated/floor/plating,/area/engine/engineering)
+"dmM" = (/obj/effect/decal/warning_stripes/northeast,/obj/structure/table/glass,/obj/item/weapon/wirerod,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dmN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area/space)
+"dmO" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable,/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
"dmP" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/engine/engineering)
"dmQ" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dmR" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/engine/engineering)
-"dmS" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engine/engineering)
-"dmT" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/transit_tube{dir = 4; icon_state = "Block"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/engineering)
-"dmU" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
+"dmR" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"dmS" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dmU" = (/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"dmV" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube,/turf/simulated/floor/plating,/area/engine/engineering)
"dmW" = (/obj/structure/transit_tube,/turf/space,/area/space)
"dmX" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/obj/structure/lattice,/turf/space,/area/space)
@@ -8788,282 +8705,280 @@
"dmZ" = (/obj/structure/transit_tube,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dna" = (/obj/structure/transit_tube,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dnb" = (/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 4},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnc" = (/obj/structure/transit_tube{dir = 8; icon_state = "Block"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dnc" = (/obj/machinery/power/tesla_coil{anchored = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating/airless,/area/space)
"dnd" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/space)
-"dne" = (/obj/structure/cable,/obj/machinery/power/turbine,/turf/simulated/floor/engine,/area/maintenance/turbine)
+"dne" = (/obj/structure/cable,/obj/machinery/power/turbine,/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
"dnf" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless/catwalk,/area/space)
"dng" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/asmaint)
-"dnh" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "sci_maint"; name = "interior access button"; pixel_x = -28; pixel_y = -5; req_access_txt = "13"},/obj/effect/decal/warning_stripes/west,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dni" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dnj" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/space)
-"dnk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
-"dnl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
-"dnm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dnn" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dno" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dnp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
-"dnq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "75"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"dnr" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/engine/engineering)
-"dns" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engine/engineering)
-"dnt" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engine/engineering)
-"dnu" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/engine/engineering)
+"dnh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dni" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dnj" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/engine/engineering)
+"dnk" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/transit_tube{dir = 4; icon_state = "Block"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/engineering)
+"dnl" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engine/engineering)
+"dnm" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
+"dnn" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dno" = (/obj/structure/transit_tube{dir = 8; icon_state = "Block"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dnp" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/space)
+"dnq" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "sci_maint"; name = "interior access button"; pixel_x = -28; pixel_y = -5; req_access_txt = "13"},/obj/effect/decal/warning_stripes/west,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dnr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"dns" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering)
+"dnt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dnu" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"dnv" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dnw" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dnx" = (/obj/structure/sign/fire,/turf/simulated/wall/r_wall/coated,/area/maintenance/turbine)
-"dny" = (/obj/machinery/door/poddoor{id_tag = "turbinevent"; name = "Turbine Vent"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/turbine)
-"dnz" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dnA" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
-"dnB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"dnC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dny" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
+"dnz" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
+"dnA" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/engine/engineering)
+"dnB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "75"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"dnC" = (/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engine/engineering)
"dnD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/engine/engineering)
-"dnE" = (/obj/machinery/door/airlock/external{name = "MiniSat External Access"; req_access = null; req_access_txt = "75;13"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dnE" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engine/engineering)
"dnF" = (/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dnG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dnI" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
-"dnJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dnH" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/engine/engineering)
+"dnI" = (/obj/machinery/door/poddoor{id_tag = "turbinevent"; name = "Turbine Vent"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine)
+"dnJ" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dnK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/engine/engineering)
-"dnL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plating,/area/engine/engineering)
-"dnM" = (/turf/space,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"dnN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnO" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnP" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnQ" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnS" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light/small,/obj/machinery/camera/motion{c_tag = "Mini Satellite Antechamber North"; dir = 1; network = list("SS13","MiniSat")},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnT" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dnU" = (/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "sci_sensor"; pixel_x = -25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1450; id_tag = "sci_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "sci_maint"; pixel_x = -25; pixel_y = -6; req_access_txt = "13"; tag_airpump = "sci_pump"; tag_chamber_sensor = "sci_sensor"; tag_exterior_door = "sci_outer"; tag_interior_door = "sci_inner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dnV" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard)
-"dnW" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"dnL" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"dnM" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dnN" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dnO" = (/obj/machinery/door/airlock/external{name = "MiniSat External Access"; req_access = null; req_access_txt = "75;13"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dnP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dnQ" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"dnR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"dnS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plating,/area/engine/engineering)
+"dnT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dnU" = (/turf/space,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"dnV" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dnW" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"dnX" = (/obj/machinery/door/airlock/external{name = "Escape Pod"},/turf/simulated/floor/plating,/area/engine/engineering)
"dnY" = (/turf/space,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk,/area/space)
"dnZ" = (/turf/simulated/wall,/area/turret_protected/aisat_interior)
-"doa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Foyer"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dob" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/turret_protected/aisat_interior)
+"doa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dob" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
"doc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/turret_protected/aisat_interior)
-"dod" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/turret_protected/aisat_interior)
-"doe" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/turret_protected/aisat_interior)
-"dof" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dog" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/starboard)
-"doh" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
-"doi" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
-"doj" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/starboard)
-"dok" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
-"dol" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
-"dom" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/starboard)
-"don" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4)
-"doo" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/pod_4)
-"dop" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_4)
-"doq" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dor" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dos" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 1},/obj/structure/rack,/obj/item/weapon/screwdriver,/obj/item/device/radio,/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dot" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "sci_maint"; name = "exterior access button"; pixel_x = 8; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space)
-"dou" = (/turf/space,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space)
-"dov" = (/obj/structure/cable,/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard)
-"dow" = (/obj/docking_port/mobile/pod{dir = 4; id = "pod4"; name = "escape pod 4"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
-"dox" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
-"doy" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
+"dod" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating/airless,/area/turret_protected/aisat_interior)
+"doe" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dof" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light/small,/obj/machinery/camera/motion{c_tag = "Mini Satellite Antechamber North"; dir = 1; network = list("SS13","MiniSat")},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dog" = (/obj/machinery/airlock_sensor{frequency = 1450; id_tag = "sci_sensor"; pixel_x = -25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1450; id_tag = "sci_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1450; id_tag = "sci_maint"; pixel_x = -25; pixel_y = -6; req_access_txt = "13"; tag_airpump = "sci_pump"; tag_chamber_sensor = "sci_sensor"; tag_exterior_door = "sci_outer"; tag_interior_door = "sci_inner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"doh" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard)
+"doi" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"doj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Foyer"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dok" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/turret_protected/aisat_interior)
+"dol" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/plating/airless,/area/turret_protected/aisat_interior)
+"dom" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"don" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/starboard)
+"doo" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
+"dop" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/starboard)
+"doq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
+"dor" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
+"dos" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
+"dot" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/starboard)
+"dou" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/pod_4)
+"dov" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4)
+"dow" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/pod_4)
+"dox" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doy" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"doz" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/pod_4)
-"doA" = (/obj/machinery/computer/station_alert,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
+"doA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 1},/obj/structure/rack,/obj/item/weapon/screwdriver,/obj/item/device/radio,/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doB" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "sci_maint"; name = "exterior access button"; pixel_x = 8; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space)
"doC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
"doD" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
-"doE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doF" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "teledoor"; name = "AI Satellite Teleport Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doG" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 0; pixel_y = 25; req_access_txt = "17;75"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doE" = (/turf/space,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space)
+"doF" = (/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"doG" = (/obj/structure/cable,/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard)
"doH" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"doI" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_sw"; name = "southwest of station"; width = 18},/turf/space,/area/space)
+"doI" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
"doJ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/engineering)
-"doK" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_4)
-"doL" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_4)
-"doM" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
-"doO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
+"doK" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"})
+"doL" = (/obj/docking_port/mobile/pod{dir = 4; id = "pod4"; name = "escape pod 4"},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Escape Pod Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
+"doM" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_4)
+"doN" = (/obj/machinery/computer/station_alert,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
"doP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
-"doQ" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Teleporter Room"; req_access_txt = "17;75"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doS" = (/obj/machinery/bluespace_beacon,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doT" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"doU" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
-"doW" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
-"doX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
-"doY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"doZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/turret_protected/aisat_interior)
-"dpa" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Mini Satellite Teleporter"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doR" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 0; pixel_y = 25; req_access_txt = "17;75"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doS" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "teledoor"; name = "AI Satellite Teleport Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doT" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_sw"; name = "southwest of station"; width = 18},/turf/space,/area/space)
+"doU" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_4)
+"doV" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_4)
+"doW" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"doX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
+"doY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
+"doZ" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpa" = (/obj/machinery/bluespace_beacon,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"dpb" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
-"dpc" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/starboard)
+"dpc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Teleporter Room"; req_access_txt = "17;75"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"dpd" = (/turf/simulated/wall/r_wall,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
"dpe" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
"dpf" = (/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior)
-"dpg" = (/obj/structure/rack,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/turret_protected/aisat_interior)
-"dph" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Antechamber"; name = "AI Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "75"},/obj/machinery/camera/motion{c_tag = "Mini Satellite Antechamber Center"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpk" = (/obj/structure/table,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpg" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior)
+"dph" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpi" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
+"dpj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
+"dpk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"dpl" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/head/welding,/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
"dpm" = (/obj/machinery/atmospherics/unary/tank/air,/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior)
"dpo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior)
"dpp" = (/turf/simulated/wall/r_wall,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dpq" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpr" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
-"dps" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpt" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Mix to MiniSat"},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpu" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Air Out"},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpv" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpw" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dpx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dpz" = (/obj/machinery/cryopod/robot,/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpr" = (/obj/effect/decal/warning_stripes/east,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Mini Satellite Teleporter"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dps" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/turret_protected/aisat_interior)
+"dpt" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk8"; icon_state = "catwalk8"},/area/solar/starboard)
+"dpu" = (/obj/structure/rack,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/turret_protected/aisat_interior)
+"dpv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpw" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpx" = (/obj/structure/table,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Antechamber"; name = "AI Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "75"},/obj/machinery/camera/motion{c_tag = "Mini Satellite Antechamber Center"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"dpA" = (/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpB" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/mineral/plasma,/obj/item/clothing/head/welding,/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpC" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/space_heater,/obj/machinery/camera{c_tag = "AI Satellite Atmospherics"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpD" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpE" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpF" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpB" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard)
+"dpC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpD" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Air Out"},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpE" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Mix to MiniSat"},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpF" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
"dpG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior)
-"dpH" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "AI Satellite Antechamber South"; dir = 4},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Atmospherics"; name = "AI Satellite Atmospherics Turret Control"; pixel_x = -28; pixel_y = 0; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dpI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpJ" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Service"; name = "AI Satellite Service Bay Turret Control"; pixel_x = 24; pixel_y = 0; req_access_txt = "75"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dpK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/computer/cryopod/robot{pixel_x = -30; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpL" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpM" = (/obj/effect/decal/warning_stripes/northeast,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpN" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/device/multitool,/obj/machinery/camera{c_tag = "AI Satellite Service Bay"; dir = 8; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpO" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
-"dpP" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/starboard)
-"dpQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpS" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Atmospherics"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dpV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpW" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/ai_slipper{icon_state = "motion0"},/mob/living/simple_animal/bot/secbot/pingsky,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dpY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Service Bay"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dqa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dqb" = (/obj/effect/decal/warning_stripes/east,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dqc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/port_gen/pacman,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dqd" = (/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dqe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dqf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/mob/living/simple_animal/bot/floorbot{on = 0},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
-"dqg" = (/obj/machinery/porta_turret{dir = 1},/obj/item/device/radio/intercom/locked/ai_private{broadcasting = 1; listening = 0; pixel_y = -29},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dqh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Hallway"; name = "AI Chamber Hallway Turret Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "75"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
-"dqi" = (/obj/machinery/porta_turret{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dqj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/mob/living/simple_animal/bot/cleanbot{on = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dqk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
-"dql" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
+"dpJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_y = 27},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
+"dpK" = (/obj/machinery/cryopod/robot,/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpL" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/mineral/plasma,/obj/item/clothing/head/welding,/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpM" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/space_heater,/obj/machinery/camera{c_tag = "AI Satellite Atmospherics"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpN" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpO" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpP" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dpQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dpR" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "AI Satellite Antechamber South"; dir = 4},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Atmospherics"; name = "AI Satellite Atmospherics Turret Control"; pixel_x = -28; pixel_y = 0; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
+"dpS" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Service"; name = "AI Satellite Service Bay Turret Control"; pixel_x = 24; pixel_y = 0; req_access_txt = "75"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
+"dpT" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpU" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/computer/cryopod/robot{pixel_x = -30; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpV" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/device/multitool,/obj/machinery/camera{c_tag = "AI Satellite Service Bay"; dir = 8; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpW" = (/obj/effect/decal/warning_stripes/northeast,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpX" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/solar/starboard)
+"dpY" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/starboard)
+"dpZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plating,/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dqa" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dqb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/effect/decal/warning_stripes/west,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dqc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Atmospherics"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dqd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dqe" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/ai_slipper{icon_state = "motion0"},/mob/living/simple_animal/bot/secbot/pingsky,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dqf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dqg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Service Bay"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dqh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
+"dqi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dqk" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/port_gen/pacman,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dql" = (/obj/effect/decal/warning_stripes/east,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dqm" = (/turf/simulated/wall/r_wall,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqn" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqo" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
"dqp" = (/turf/simulated/wall,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Hallway"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqq" = (/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
"dqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqs" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/mob/living/simple_animal/bot/floorbot{on = 0},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat/entrance{name = "\improper AI Satellite Atmospherics"})
+"dqt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Hallway"; name = "AI Chamber Hallway Turret Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "75"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"dqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqv" = (/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqx" = (/obj/machinery/porta_turret{dir = 1},/obj/item/device/radio/intercom/locked/ai_private{broadcasting = 1; listening = 0; pixel_y = -29},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
"dqy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqz" = (/obj/machinery/porta_turret{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
"dqA" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqB" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/starboard)
+"dqB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dqC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/mob/living/simple_animal/bot/cleanbot{on = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dqD" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqE" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior West"; dir = 8; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
-"dqH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/porta_turret{dir = 4; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqK" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/porta_turret{dir = 8; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqL" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
-"dqM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqN" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqQ" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqE" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dqF" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Hallway"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqH" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqK" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/starboard)
+"dqL" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior West"; dir = 8; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
+"dqM" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/porta_turret{dir = 4; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqO" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/porta_turret{dir = 8; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqP" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqQ" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
+"dqR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqV" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqX" = (/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqY" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "AI Satellite Hallway"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dqY" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dra" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
-"drb" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"drc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
-"dre" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom/locked/ai_private{broadcasting = 1; listening = 0; pixel_x = -29; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"dra" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"drb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
+"drc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"drd" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"dre" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "AI Satellite Hallway"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"drf" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"drg" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
-"drh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Observation"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drh" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"dri" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
-"drj" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; width = 18},/turf/space,/area/space)
-"drk" = (/obj/machinery/light/small{dir = 1},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drl" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"dro" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drp" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drt" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"drk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
+"drl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom/locked/ai_private{broadcasting = 1; listening = 0; pixel_x = -29; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
+"drm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Observation"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drn" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; width = 18},/turf/space,/area/space)
+"dro" = (/obj/machinery/light/small{dir = 1},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/multi,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drq" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drt" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"dru" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"drv" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/ai)
-"drw" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "AI Core"; req_access_txt = "16"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drx" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/turret_protected/ai)
"dry" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drz" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drB" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drH" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drA" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drC" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "AI Core"; req_access_txt = "16"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drE" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drG" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drI" = (/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/turretid/lethal{check_synth = 1; name = "AI Chamber Turret Control"; pixel_x = 5; pixel_y = -24; req_access_txt = "75"},/obj/machinery/flasher{id = "AI"; pixel_x = -8; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/door/window/southright{dir = 1; name = "AI Core Door"; req_access = null; req_access_txt = "16"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drL" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/motion{c_tag = "AI Core"; dir = 1; network = list("SS13","MiniSat")},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drM" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"drN" = (/turf/simulated/wall,/area/turret_protected/ai)
-"drO" = (/obj/item/device/radio/intercom/custom{pixel_x = -28; pixel_y = -10},/obj/item/device/radio/intercom/private{pixel_x = 28; pixel_y = -10},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/requests_console{department = "AI"; departmentType = 5; name = "AI Requests Console"; pixel_x = 32; pixel_y = -32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = -32},/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drQ" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; width = 18},/turf/space,/area/space)
-"drR" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South West"; dir = 8; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
+"drO" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/door/window/southright{dir = 1; name = "AI Core Door"; req_access = null; req_access_txt = "16"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/turretid/lethal{check_synth = 1; name = "AI Chamber Turret Control"; pixel_x = 5; pixel_y = -24; req_access_txt = "75"},/obj/machinery/flasher{id = "AI"; pixel_x = -8; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drR" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/motion{c_tag = "AI Core"; dir = 1; network = list("SS13","MiniSat"); start_active = 1},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "south bump Important Area"; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"drS" = (/obj/item/device/radio/intercom/custom{pixel_y = 25},/obj/item/device/radio/intercom/private{pixel_y = -28},/obj/item/device/radio/intercom{pixel_x = -28},/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drT" = (/obj/item/device/radio/intercom/custom{pixel_x = -28; pixel_y = -10},/obj/item/device/radio/intercom/private{pixel_x = 28; pixel_y = -10},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/obj/machinery/requests_console{department = "AI"; departmentType = 5; name = "AI Requests Console"; pixel_x = 32; pixel_y = -32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = -32},/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"drU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drV" = (/obj/item/device/radio/intercom/custom{pixel_y = 25},/obj/item/device/radio/intercom/private{pixel_y = -28},/obj/item/device/radio/intercom{pixel_x = 28},/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drW" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
-"drX" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"drY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall,/area/turret_protected/ai)
-"drZ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"dsa" = (/obj/machinery/camera/motion{c_tag = "AI Core South"; dir = 2; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"dsb" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"dsc" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"dsd" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
-"dse" = (/obj/machinery/camera{c_tag = "AI Satellite Exterior South"; dir = 2; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
+"drW" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; width = 18},/turf/space,/area/space)
+"drX" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South West"; dir = 8; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
+"drY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"drZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"dsa" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
+"dsb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"dsc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"dsd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall,/area/turret_protected/ai)
+"dse" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"dsf" = (/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"dsg" = (/obj/item/flag/nt,/obj/effect/decal/warning_stripes/east,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"dsh" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"dsi" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
-"dsj" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
-"dsk" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
+"dsg" = (/obj/machinery/camera/motion{c_tag = "AI Core South"; dir = 2; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"dsh" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"dsi" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
+"dsj" = (/obj/machinery/camera{c_tag = "AI Satellite Exterior South"; dir = 2; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
"dsl" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"dsn" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
-"dso" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"dsp" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"dsq" = (/obj/structure/closet/cardboard,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
-"dsr" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
-"dss" = (/obj/machinery/status_display{pixel_x = -30; pixel_y = 0},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"dst" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"dsu" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"dsv" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"dsw" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/shuttle/escape)
-"dsx" = (/obj/machinery/sleeper{tag = "icon-sleeper (NORTH)"; icon_state = "sleeper"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9072,7 +8987,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9085,228 +9000,228 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeaaeaaeaaeaafaagaaaaaaaaaaaaaaaaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeaahaaiaaiaajaaiaakaalaafaagaaaaaaaaaaaaaadaalaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaanaaoaaiaaiaaiaaiaaiaaiaapaakaaqaagaaaaaaaadaaraasaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaqaalaauaaiaaiaaiaaiaavaaiaaiaaiaawaaqaagaadaaraaxaasaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaqaahaazaakaaeaafaaAaaBaaCaaeaaeaaDaalaalaalaanaaEaaxaasaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaahaaiaaFaaiaaGaaHaaIaaiaaJaaiaaiaaiaaiaaiaaiaaKaaxaaLaaeaaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaiaaiaaiaaiaaGaaHaaiaaiaaiaaiaaiaaiaaiaaiaaiaawaaeaaqaagaaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOaaiaaiaaiaaiaaPaaHaaiaaiaaQaaRaaeaaeaauaaiaaSaaHaaTaakaalaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaiaaiaaiaaiaaiaaHaaiaaiaaHaaiaaVaaiaaHaaiaaiaaHaaWaaiaaiaakaaqaagaaaaadaafaaeaaeaaeaaeaaeaaeaaeaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaXaazaaiaaiaaiaaYaaiaaiaaHaaZabaaaSaaHaaiaaiabbaaiaaiaaiaaiaakaaqaaeaaqaahaaiaaiaaiabcaaiaaiaaiaakaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUabdabeaaiaaiaaiaaRaaiaaiaaHaaiaaiaaiaaHaaiaaiabfaaiaaiaaiaaiaaiabgabhabgaaiaaiaaiaaiaaiaaiaaiaaiaaiabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaGaaGaaiaaiaaiaaYaaiaaiaaHabjaaVaaiaaHaaiaaiabbaaiaaiaaiaaiaaQaaqaaeaaqaauaaiaaiaaiaaiaaiaaiabkaaQaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaiaaiaaiaaiaaiaaHaaiaaiaakaaeaaeaaRaahaaiaaiaaHaaWaaiaaiaaQaaqablaaaabmaalaaeaaeaaeaaeaaeaaeaaeaalablaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnaaiaaiaaiaaiaboaawaauaaiaaiaaiaaiaaiaaiaaiaaiaaHaaiaaQaafaalablaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHabqabrabsaaiaaQaaqaalaaeaaeaafaauaaiaaiaaiaaiaawaaeaaqablaaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaauaazabtaaQaaqaahabuabvabwaakaanaaiaaiaaJabxaaKaaxabyaaeaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmaalaaeabzaalaahaaiaaiaaiaaiaaiaaHaaiaaiaaQaafaanaaEabAaasaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaabBaaiaaiaaiaaiaaiaaiaaiabCabjaaQaaqablabmabDabEaasaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFaaiabGaaiaaiaaiaaiaaiaawaafaaqablaaaaaaabmabDaasaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHabIabJabKabKabKabLabIabMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabOabPabQabNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmaaeaafaauaaiabRabSaaQaaqaalablaaaaaaaaaaaaabmaafaaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTabUabVabWabXabYabZabZabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNacaacbaccabNabNaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmaalaaeaaeaaeaalablaaaaaaaaaaaaaaaaaaaaaabmablaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTacdabVabVaceabVabVacfabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNacgachaciachacjabNaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTackaclabVabVacmabVacnabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoacpachaciachacpacoaaaaaaaaaaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqabIabIabIacrabIabIabIacsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactacuacvacwacvacxacyaaaaaaaaaabNabNabNabNabNaabaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTaczabVacAabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaababNacBacCacDachacEabNaaaaaaaababNacFacGacHabNabNabNaaaaaaaabaabaabaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTacIabVacJabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaabNacKacLacDacMacNabNaaaaabaababNacOacPacQacRacSabNaaaaabaabaacaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTabIabIabIabIabTacIabVacJacUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacabNacoabNacVacWacXacYacWabNacZadaabQabNadbadcaddacWacWabNabNabNabNabNabNabNabNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTadeabVabVadfabTacIabVacJabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaababNadgadhacKadhacDadiadjadkaciadlachadmadnadoadpadqadradsacWadtaduadvadwadxabNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTadeabVadyadzabTacIabVacJabTabIadAadBadCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNadDadEadFadoacDadGachachadHadIadladJadKadLadMadladNadOacWadPadPadQadRadRacoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTadSabVabVadTabTadUabVacfadVadWadWadWabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNadXacvadYacvadZaeaaebaecaedaeeaefaegaehaeiaejaefaekaekaelaemaenaeoaepaeqaeraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTadeabVabVabVaesabVabVaetaeuaevaevaewabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaexaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNadlaeyaezaeAaeBaeCaeDaeAaeAaeEaeFaeGaeHaeAaeIaeJaeAaeAaeKaeLaeMaeNaeMadRaeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTadeabVabVabVaePabVabVabVaeQaeRaeRaeSabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNaeTaeUaeVaeWaeXacWaeYaeYacWaeZafaacWafbafcabNabNabNabNafdafeadoafeadRaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTabIabIabIabIabIabIafgabVabVabIabIabIabIabIabIadCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababNafhachafiafjafkaeVaflafkafmafnafoaeVafpafqafrafsafqaftafuafvafwafxabNaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTafzafzafAafBafCabTafDabVabVabTafEafFafGafHafIabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNafJacWafKafLacWafMafNacWafMafNaddafMafNabNaabafOabNabNabNabNabNabNabNaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTabVabVabVadyabVafPabVabVabVafQabVadyabVadyafRabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababNabNabNabNafJacWafSafTacWafUafUacWafVafVaddafWafWabNaabafOafXafXafXafYafOafOaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZagaagbagcaaaaaaaaaafZaaaaaaaaaagcaaaaaaaaaafZagdageagcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTagfabVabVabVabVaggabVabVabVaghabVabVabVabVagiabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaababNagjagkaglagmagnagoagpagqagragragsagtagtaguagtagvabNaabaabaabafOafXafXafOaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwagxagyagwaaaaaaafZagwagzagAagBagwagcaaaaaaagwagCagDagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTagEabVabVagFagGabTagHagIagHabTagJagKabVabVabVabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaabNagLagMagNagOagPagQagRagSagPagTagPagUagVagPagPagWabNaaaaabaabaabafOafXaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwagXagYagwaaaafZagZahaahbahcahdahaagZagcaaaagwaheahfagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTabVabVahgabTabIabTabVahhahiabTabIabTabVabVabVabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNabNabNabNabNahjahkabNabNabNabNabNabNabNabNabNabNaaaaaaaaaaabafOafXafXaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwahlahmahnaaaahoahpahaahaahqahaahaahpahraaaahsahtahuagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTahvahwahxabTaaaabTahyahyahyabTaaaabTahzahAahBabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNahCahDahEahFahGahHabNaabaabaabaaaaaaaaaaaaaaaaabaabafOafXaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZahIagZaaaaaaahJahpahaahKahLahaahaahpahMaaaaaaagZahIagZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTahyahyahyabTaaaacqahNahOahPacsaaaabTahyahyahyabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQahRahSahTahUahVahWabNahXaaaaaaaaaaaaaaaaaaaabaabaabahYafXafXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZahIagZagZagZagZagZagZagZahZagZagZagZagZagZagZagZahIagZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqahNahOahPacsaaaaaaaaaaaaaaaaaaaaaacqahNahOahPacsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQaiaaibaicaidaieaifaigabNabNabNabNabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaihaihaihaiiaijaihaihaihaikaikaikaikaikaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahoahIailailailailailailagwaimagwailailailailailailahIahraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQainaioaipaiqairaisaitabNaiuaivaivaivaivaivaaaaaaaaaaaaaaaaaaaaaaaaaihaiwaixaiyaizaiAaiBaihafXafXafXafXafXaikaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCaiDaiEaiFaiGaiHagwahZagZahZagZahZagwaiIaiJaiKaiLaiDaiMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQaiNaiOaiPaiQaiRaiSaitabNaivaivaiTaiUaiVaivaivaaaaaaaaaaaaaaaaaaaaaaihaiXaiYaiZaiYaiYajaaihajbajbajbajbajbajbafXajcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaiDahaahaahaajdagwahaahaahaahaahaagwahaahaajeahaaiDahMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQajfajgaivaivajhajiajjajkajlaivaivaaaaaaaaaaaaaaaaaaaihajmajnajoajpajqajraihajsajtajuajvajwajxajyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajzajAajBajCajDagwajEahaahaahaajFagwajGahaajHajIajzagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaababNajJajKaivajLajMajNajOajPajQajRaivaaaaaaaaaaaaaaaaaaaihajSajTajUajVaiYajWaihajXajwajwajwajwajxajyaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaababNahRaigaivakbakcakdajOakeakfakgaivaaaaaaaaaaaaaaaakhaihakiakjakkaklaiYakmaihaknajwakoajwajwajxajyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaaaaaaaababNaksaigaivaktakcakdajOakeakfakuaivaaaaaaaaaaaaaaaaaaaihakvajTakwajVaiYakxaihakyajwajwajwajwakzajyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakAahaahaahaakragwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakBakBakBakBakBakBakBakBaabaaaaaaaaaaabaabaabaabaabaababNajJaigaivaivakCakDakEakFakGaivaivaaaaaaaaaaaaaaaaaaaihakHakIakJaiYakKakLaihakMakNakOakOakPajbafXakQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakRakSahZakRakSagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakTakUakVakWakXakUakYakBaabaaaaaaaabakZakZakZakZakZakZabNalaalbalcaivaldalealfalgalhaivalialialjalkallalialiaihalmalnaloalpalqaihaihalralsaltaltaluajbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwalxalyahaalzalAagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalBalCalDakWalBalCalDakBaaaaaaaaaaabakZalEalFalGalHalIalJalKalLalMaivaivalNalOalPaivaivalialQalRalSalTalUalValWalXalYalZalTalTamaambamcamdameamfamgajbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaalvaaaaabaaaamhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwamiamjahaamkamlagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBammalDamnakWamoalDampakBaabaaaaaaaaaakZamqamramsamtamuamvamwafeamxamyamzamAamBamCamDamEamFamGamHamIamHamHamJamKamLamMamNamHamHamOamPamQamRamSamTamUamVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabamXaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZamYamZanaagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalDalBalDakWalDalBalDakBaaaaaaaabaabakZanbamrancandaneanfanganhaniamyanjankanlanmannanoamyanpanqanransansantanuanvanwanxanyanzanAanBanCanDanEanFanGajbanHanHanHanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWalvaaaanIaaaalvamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZagZagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalBalDalBakWalBalDalBakBaaaaabaaaaaaakZalEanJanKanLanManNanOanPanQanRanSanTanUanVanWanXanYanZaoaaobaocaodanAaoeaofaogaohaoiaoiaojaokanHajbajbajbajbajbaolaolaolanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabaabaabanIaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalBalBalDakWalBalBalDakBaabaabaaaaaaakZakZaomaonaooaooaopacWaoqaoramyaosaotanlaouaovaowaoxaoyaozaoAaoBaoCaoDaoEaoFaoGaoHaoHaoIaoJaoKanHaolaolaolaolaolaolaolaolanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaaaaaaaoLaaaaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalDalBaoMakWalDalBaoNakBaoOaabaabaabaabakZaoPaomaoQaoRaoSacWaoTaoUamyaoVaoWaoXaoYaoZapaapbapcapdapeapfaoCapgaphapiapjapkaplapmaoJapnanHaolaolaolaolaolaolaolaolanHamWamWapoaabamWamWamWamWamWamWamWamWamWamWamWamWamWamWaabaabappapqapraabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsaptapuapvapwaptaptapxaptaptapyaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabapzaabalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaakBapAapBapCapDapAapBapCapEapFapFapFapFapFapFapGapGapHapIapJapKapLapMapNapNapOapPapQapRapNapSapTapUapVapWapXapYapZapiapjaqaaqbapmaqcaqdaqeaolaolaolaolaolaolaolaolanHaabaabaabaabaabaabaaaaabaaaaabaabaabaabaabaabaabaabaaaaaaaaaappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqgaqhaqiaqjaqkaqlaqlaqlaqmaqnaqoaaaaaaaaaalwalwalwalvalvaabaabaaaaqpaaaaabaabalvalvalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBaqqaqraqsalBaqtaquaqvaqwapGaqxaqyaqzaqAaqBaqCapGaqDaqEaqFaqGaqHaqIaqJaqKaqLaqMaqNaqOapRapSaqPaqQapSaqRapSanAaqSaqTaqUaqVaqWaqXaqYaoJaqZaolaolaolaolaolaolaolaolanHaabaraarbarbarbarcarbarbarbarbarcarbarbarbarbardaabaaaaaaaaaappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaareaqharfargaqlarharharharharhariaaaaaaaaaalwaaaaaaaabaaaaabaaaaaaaqpaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBarjalBarkarlarmarnaroarpapGarqarrarsarsartaruapGarvarwarxaryarzaqIarAarBarCarDarEarFarGarHarIarJarKarLarMarNarOarParQarRarSarTaoJarUaqeaolaolaolaolaolaolaolaolanHaabarVaabaabaabarVaabaaaaaaaabarVaabaabaaaaaaarVaabaaaaabaabappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarWaqharXarYarharharharharZasaaqoaaaaaaaaaalwaabasbasbasbasbasbaaaascaaaasbasbasbasbasbaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBasdasearkalBasfarnasgashapGasiasjaskaslasmasnapGasoaspasqasrassastaqJasuasvaqMaswasxapRasyaozaszaszasAasBasCasDasEasFasGasHasGasIasJanHanHanHanHanHanHanHanHanHanHaabarVaabaaaappapqapraaaaaaappapqapraaaaaaappapqapraabaabaaaappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasKaptaptaptapwaptaptapxaptaptasLaaaaaaaaaalwaaaasMasNasNasNasNasOasPasQasRasRasRasRasSaaaalwaaaaaaaaaasTasUasVasWasXaaaaaaaaaaoOakBakWakWakWakWasYasZataakWapGatbatcatdateatfatgapGathatiatjatkatlatmapNatnatoatpatqatrapNatsattatuatvatwatxatyatzatAatBaoJatCatDatEatFanHatGatGatGatGatGaaaaaaaaaaaaaabarVaabaaaappaqfapraaaaaaappaqfapraaaaaaappaqfapraaaaaaaaaappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaabatHatHatHatHatHaaaatIaaaatHatHatHatHatHaabalwaaaaaaaaaatJatKatLatMatJatNatOatOatPatQatRatSatTatUatVatWatXatYapGapGatZauaapGapGaubapGaucaucaudaucaueaufapNaqJaugauhapQapRapNauiaujaukapSapSapSanAanAaulaumaunauoanAanHaupanHauqaurausausautaaaaaaaaaaaaaaaarVaabaaaappaqfapraaaaaaappaqfapraaaaaaappaqfapraaaaaaaaaappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaaaaabaaaaaaaaaauuaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaauvauwauxauyauzauAauBauCauAauDauDauEauFauGauHauIauJauKauLauMauNauOauPauQauRauSauTauUauVauWauXauYauZavaavbavcavdaveavfavgavhaviauSauWauSavjavkavlavmavnavoavpavqavravsavqavtavuavvavwaaaaaaaaaaaaaaaarVaabaaaappaqfapraaaaaaappaqfapraaaaaaappaqfapraaaaaaaaaappaqfapraaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaabasbasbasbasbasbaaaatIaaaasbasbasbasbasbaabalwaaaaaaaaaatJavxavyavzatJatNatOatOatOavAavBavCavDavEavFavFavGavHavIavJavKavLavMavNavOavPavQavRavPavSavTavMavUavVavWavXavMavYavZavMavYawaawbawcawdavOaweawfawgawhawiawjawkavrawlavqawmausausawnaaaaacawoaacaaaarVaabaaaappaqfapraaaaaaappaqfapraaaaaaappaqfapraaaaabaabappaqfapraabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawpawqawrawsawtaaaawuawvawwawxawyapoaaaasMasNasNasNasNasOasPasQasRasRasRasRasSaaaalwaaaaaaaaaatJawzawzawAatJaaaaaaaaaawBawCawDawEawFawGawDawDawHawHawHawHawIawJawKawKawKawLawMawNawLawKawKawKawOawPawPawQawRawSawTawUawVawWawXawYawWawVawZaxaaxbaxcaxdaxeaxfavrawlaxgaxgatGaxhaxhaxhatGaxiatGaabarVaabaaaappaqfapraaaaaaappaqfapraaaaaaappaqfapraabaabaaaaabaoLaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjaxkaxkaxkaxjaaaaxlaxmaxmaxmaxlalwaxnatHatHatHatHatHaaaatIaaaatHatHatHatHatHaabalwaaaaaaaaaauvaxoawzaxpatJatNatOatOatOaxqawDaxraxsaxtaxuaxvawHaxwaxxaxyaxzaxAaxBaxCaxDaxEaxFaxGaxHaxIaxJaxBaxKaxLaxLaxMaxNaxOaxPaxQawVaxRaxSaxTaxUawVaxVaxWaxXaxYaxZayaaxfavraybaycaydayeayfayfaygatGayhatGaabarVaabaaaappaqfapraaaaaaappaqfapraaaaaaappaqfapraaaaaaaaaaabarVaabaaaaaaayiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjayjayjayjaxjaaaaxlaykaylaykaxlalwaaaaaaaaaaabaaaaaaaaaauuaaaaaaaaaaabaaaaaaaaaalwaaaaaaaaaatJaymawzawzaynauAayoauCauAaypawDayqayraysaytayuawHayvaywayxayyayzayAayBayCayDayEayFayGayCayHayIayJaxLaxLaxMayKayLayMayNayOayPayQayRaySawVayTayUayVayWayVayXaxfavravqavqavqavqayYavqayZazaazbatGaraazcardaaaaaaaoLaabaabaabaabaoLaabaabaabaabaoLaabaabaabaabazdazeardaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjazfazgazhaxjaaaaxlaziazjazkaxlalwaabasbasbasbasbasbaaaatIaaaasbasbasbasbasbaabalwaaaaaaaaaatJazlazlazlatJatNatOazmazmaznazoazpazqazrazsaztawHazuazvazwazxazyazzazAazBazCazDazEazFazGazHazzazIaxLaxLaxMazJawUazKazLazMazNazOazPazQawVazRazSazTayWayVazUaxfazVazWazXazYazXazZaAaatGatGawlatGarVaAbaAcarbarbazcarbarbarbarbazcarbarbarbarbazcarbarbarbaAdaAeaAbarVaabaaaamWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaaaaAfaAfaAgaAgaAgaAgaAgaAgaAfaAfaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjaAhazgazhaxjaaaaxlaAiaykaykaxlalwaaaasMasNasNasNasNasOasPasQasRasRasRasRasSaaaalwaaaaaaaaaaAjaAkaAkaAkaAlaaaaaaaAmaAnaAoaAnaApaApaApaApaAqawHawHaArawHaAsaAtawKawKaAuawKaAvaAwawKaAuawKaAxaAyaAzaxLaAAaABaACaADaAEawVaAFaAGaAHaAIaAJaAKaALaAMaANayVaAOaxfaAPaAQaARaASaATaAUaAVaAWaAXaAYatGaAZazcaBaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaBbaBcaBaaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaAfaAfaBdaBeaBfaBgaBhaBiaBjaBfaAfaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjaAhazgazhaxjaaaaxlaBkaykaBlaxlaabaBmatHatHatHatHatHaaaatIaaaatHatHatHatHatHaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBnaAnaAnaAnaBoaApaBpaBqaBrawHaBsaBtaBuaBvaBwaxBaBxaByaBzaBAaBBaBCaBDaBEaxBaBFaBGaxLaxLaxLaBHaBIaBJawVaBKaAFaBLaBMawVaBNaBOayVayWayVaBPaxfaAPayYaAQaAQaAQaBQavqaBRaBSaBTatGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaabaabaabaabaBUaabaabaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaAfaAfaAfaAfaBVaBgaBWaBgaBWaBXaBgaBgaBgaBYaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjazgazgazgaBZaaaaxlaBkaykaBlaxlalwaaaaaaaabaaaaabaaaaaaaCaaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaBnaCbaAnaAnaCcaApaApaCdaCeawHayvaCfaCgaChaCiaCjaCkaClaCmaCnaCoaCpaCqaCraCsaCtaCuaCuaCuaCuaCuaCvaCwawVaCxaBLaAFaCyaCzaCAaCBaCzaCCaCDaCEaxfaAPaCFaCGaCGaCGaCHaCIaCJaCKaCLatGaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaabaabaabaCMaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaAfaCNaCOaCPaCQaCRaCSaCTaBgaBgaCUaCVaBgaCWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjaCXazgazgaCYaaaaxlaCZaykaykaDaalwalwalwaabaabaabaabaDbaDcaDbaabaabaabaabalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAmaDdaDeaDfaDgaDhaDiaDjaDkawHaDlaDmaDnaDoazyazzaDpaDqazzaDraDsazzaDtaDuazzaDvaDwaDxaDyaxLaDzaxLaDAawVaDBaDCaDDaBLaDEaDFaDGaDHaDIaDJaDJaDKaDLaDMaDNaDNaDNaDOaDPaDQaDRaDRaDRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaabaabaDSaDTaDSaabaabaaaaabaaaaaaaabaabaaaaaaaaaaaaaaaaaaaAfaDUaDVaDWaDXaDYaDZaBgaBgaBgaEaaEbaBgaEcaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxjaEdazgaEeaxjaaaaxlaEfaykaykaxlaabaaaaabaaaaaaaabaaaaDbaEgaEhaaaaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaEiaEjaEjaEjaEkaElaEmaEnaEoaEpaEpaEpaEqaEraEsaEtaEtaEuaEtaEvaEwaEtaExaAxaAxaEyaEzaEAaEBaECaEBaECaEAawVawVawVawVawVaCzaEDaEEaEFaEGaEHaEIaEJaEKaDNaELaEMaENaDOaEOaEPaEQaERaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaaaaDSaESaDSaaaaabaaaaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaAfaETaEUaCPaEVaEWaEXaEYaBgaEZaFaaFbaFcaAfaFdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeaFfaFgaFfaFhaaaaFiaFjaykaFkaFiaabaaaaabaaaaaaaabaDbaDbaFlaFmaDbaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaFnaFoaFpaFqaFraFsaFtaFuaFvaFwaFxaFxaFyaFzaFzaFzaFzaFzaFAaFBaFCaFzaFzaFzaFzaFDaFEaFzaFzaFFaFGaFFaFHaFHaFIaFHaFJaFKaFLaFMaFNaFOaFPaFQaFRaFSavraDNaFTaFUaFVaDOaFWaFXaFYaFZaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabaDSaDSaGaaDSaDSaabaaaaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaAfaGbaGcaCPaAfaCPaCPaGdaGeaAfaAfaAfaAfaAfaAfaabaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaFeaGfaFhaaaaaaaGgaFiaGhaFiaGiaabaaaaabaaaaaaaabaGjaGkaGlaGmaGjaGnaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaGpaFFaGqaGraGsaGraGtaGuaGvaGwaGraGraGxaGraGraGraGraGraGyaGraGraGraGraGraGraGzaGAaGraGraGraGBaGraGCaFFaGDaFFaGEaGFaFLaGGaGHaFLaGIaGJaGKaFSaGLaDNaGMaGNaGOaGPaGQaGRaGSaERaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaGTaGUaGVaGWaGTaabaaaaabaaaaaaaabaaaaaaaabaabaaaaaaaGXaAfaCPaAfaCPaGYaGZaGYaHaaGYaGYaGYaHbaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaGnaGnaGnaGnaGnaGnaGnaGnaabaabaGjaHcaHdaHeaGjaHfaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaHgaHhaHiaHjaHkaHlaHmaHnaHoaHpaHpaHqaHraHsaHtaHpaHpaHpaHuaHpaHpaHpaHpaHpaHpaHvaHwaHmaHmaHmaHxaHyaHzaHyaHAaHBaHCaHDaFLaFLaFLaFLaHEaHEaHEaFSavraDNaHFaFUaHGaDOaHHaHIaFYaHJaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabaGTaHKaHLaHMaGTaabaaaaabaaaaaaaabaaaaaaaGXaHNaGXaHNaGXaHbaGYaGYaGYaGYaGYaGYaGYaGYaGYaHOaHPaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaHQaHRaHQaaaaaaaaaaGnaHSaHTaHSaHUaHVaHWaGnaaaaaaaGjaHXaHYaHZaIaaHSaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaEiaEiaIbaIcaIdaIeaIeaIfaIgaIhaIhaIiaIjaIkaIlaImaImaIlaInaIlaIoaIoaIoaIoaIoaIoaIpaIoaIoaIqaIraIsaItaEjaIuaEjaIvaEjaEjayeaIwavqavqavqavqaIxavraDNaIyaFUaIzaDOaIAaGRaGSaERaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaHQaIBaHQaaaaabaGTaICaIDaIEaGTaIFaIFaIFaIFaIFaHNaHNaHNaGXaIGaGYaHOaHPaHaaGYaHaaHaaHaaGXaIHaGXaGXaGXaGXaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaIIaIJaIIaaaaaaaabaGnaIKaILaHSaHSaIMaHSaGnaIIaIIaGjaGjaINaIOaIaaHSaGnaGnaIIaIIaIIaGnaGnaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaIbaIPaIQaIRaISaITaIgaIUaIVaIWaIjaIXaIlaIYaIZaJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaFFaFHaJnaJoaJpaJqaJraJqaJqaJqaJsaJqaJqaJqaJqaJtaJuaJvaJwaJxaJyaJzaJAaJBaJCaJDaDPaabaJEaJFaJFaJFaJFaJFaJGaabaabaaaaaaaaaaaaaHNaJHaHNaaaaIFaGTaGTaJIaJJaGTaJKaGYaGYaGYaHaaJLaGYaJMaGXaGYaGYaGYaJNaHaaGYaGXaJOaJPaGXaGYaJQaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJRaJSaJTaaaaJUaJVaJWaabaabaIIaHSaIIaaaaaaaabaGnaJXaJYaJZaKaaKbaKcaGnaKdaHSaKeaKfaKgaKhaKhaKhaKhaKhaKhaKhaKhaKiaGnaaaaKjaaaaaaaaaaaaaaaaaaaaaaaaaIbaKkaKlaKmaKnaKoaKpaKqaKraKsaIjaIXaIlaKtaKuaKvaJbaJcaKwaKxaKxaKxaKxaKxaJjaKyaJlaFzaFFaFHaEjaKzaKAaKBaKCaKBaKBaKDaKEaKFaKFaKFaKFaKFaKFaKGaKHaKIaKJaKKaKLaKMaKNaDPaDPaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaaaaaaaaaaaaaHNaKRaKSaaaaIFaKTaKUaKVaKWaGYaGYaGYaHaaGYaHaaKXaGYaGYaGXaGYaKYaKZaKXaIHaGYaGXaLaaLbaGXaGYaLcaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLeaLfaLeaLdaLgaLhaLgaLdaabaIIaLiaLjaaaaaaaGnaGnaGnaGnaGnaLkaLlaLmaLnaLoaLpaLpaLqaLraLraLsaLtaGnaHSaGnaGnaGnaLuaGnaaaaabaaaaaaaaaaaaaaaaaaaabaabaIbaLvaLwaLxaLyaLzaLAaLBaLCaKsaIjaIXaIlaLDaLEaLFaJbaLGaLHaKxaLIaKxaLJaLJaJjaKxaJlaFzaFFaLKaEjaLLaKAaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLZaMaaMbaMcaMdaMeaMfaMgaMhaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaabaabaabaHNaHNaMiaMjaHNaIFaMkaGYaMlaGYaHbaGYaGXaGXaMmaGXaGXaMnaHaaHaaKXaMoaMpaGYaGXaGYaMqaMqaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraacaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaMwaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaMBaMCaMDaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaMTaLNaLOaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNqaNraNsaMsaNtaNuaNvaNwaNxaHSaNyaNzaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLuaGnaNCafOaNDaGnaNEaNFaNGaHSaNBaGnaNAaNHaKhaKiaNIaaaaaaaaaaaaaaaaNJaNKaNLaNMaNNaNOaNPaMAaiWaLAaNRaNSaNTaLAaNUaIlaNVaNWaNXaNYaJcaNZaKxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaOnaLNaLOaLPaOoaMVaOpaOpaOpaMVaMVaOqaOraOraOsaMWaOtaOuaOvaOvaOwaOxaOyaOzaKQaKQaKQaKQaKQaOAaOBaOCaODaaaaaaaHNaGYaGYaOEaGYaHaaOFaGYaOGaOHaOHaOHaOHaOIaOHaOJaGYaGYaGYaGYaGYaGYaGYaGYaHaaGZaMqaOKaOLaOLaMqaOMaONaOOaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaOPaOQaORaMsaOPaOQaORaNwaKcaHSaOSaHSaHSaHSaHSaHSaGnaOTaOUaOVaOWaOXaGnaLuaGnafOaOYaNCaOZaPaaPbaGnaPcaGnaGnaGnaGnaPcaLuaNIaaaaHQaHQaHQaHQaPdaNKaPeaPfaPgaPhaPiaPjaMAaLAaPkaPlaPlaPlaPmaPnaPoaPnaPnaPnaPpaPqaPraPsaPtaPtaPtaPtaPuaPvaPwaFFaPxaEjaAPaPyaPzaLNaLOaLPaMUaOpaPAaPAaPBaOpaMVaPCaPDaPDaPEaPFaOtaPGaPHaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaPLaPMaODaabaabaGXaGYaGYaHaaHaaHaaHPaHPaGXaGXaGXaHaaHaaHaaGXaPNaPOaGXaHaaHaaGXaHaaHaaGXaGXaPPaPQaPRaPSaPTaPUaPVaOKaPWaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaPYaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaQcaHSaHSaGnaLuaGnaQdaabaQdaGnaJYaPbaGnaQeaQfaGnaNAaKcaGnaLuaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQpaQqaQraQsaQtaQuaQpaQpaQvaQvaQwaQxaQyaQzaQAaQBaPyaQCaQDaQDaLPaMUaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOtaPGaPIaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQJaHaaQKaHOaQLaQMaHbaGXaOFaHbaGXaQNaGYaGXaQOaGYaGXaQPaQQaQRaOHaQSaOHaQTaQUaQVaQWaQXaQYaQZaMqaMraMraacaacaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaRbaOQaRbaRcaRcaRcaRdaRcaRcaRcaReaRfaRgaRgaRgaRgaRhaGnaHSaGnaRiaRjaRkaHSaRlaPcaLuaGnaGnaGnaGnaGnaGnaPcaGnaHSaRkaLkaHSaHSaHSaNQaRnaRoaRpaRpaRpaRpaRqaRpaRpaRraRsaRoaRtaRuaRuaRuaRuaRuaRuaRuaRvaRwaRwaRwaRwaRxaRyaRwaRzaRwaRAaRxaRwaRwaRwaRwaRBaRCaRDaREaRFaOmaRGaRHaQDaRIaMUaOpaRJaRKaRLaOpaMVaRMaRNaRNaROaMWaOtaRPaRQaRQaRRaMVaRSaRTaKQaKQaKQaKQaKQaRUaRVaRWaODaaaaaaaGXaGYaGYaGYaGYaGYaGYaQRaOHaOHaOHaOHaOHaOHaOHaKVaGYaGYaGYaGYaMnaGYaGYaMlaGYaRXaRYaRZaSaaSbaOLaOLaOLaScaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaPYaSdaSeaSfaSgaShaSiaSjaSkaSlaSjaSmaSnaSjaSjaSoaGnaHSaGnaSpaHSaHSaSqaSraGnaNHaKiaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaRmaMAaSuaSvaSwaSwaSwaSxaSwaSwaSwaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSDaSEaSFaSGaSHaSIaSJaSKaSLaSCaSMaRwaSNaFFaSOaEjaSPaPyaSQaSRaSRaSSaSTaSUaSVaSWaSWaSXaSYaSZaSXaSYaSYaTaaTbaTcaMVaMVaTdaMVaTeaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaHaaHaaIHaGXaGXaMlaHaaGXaTgaHaaGXaIHaGXaMlaQIaHaaGXaIHaGXaGYaQIaMlaGYaThaMqaTiaQUaTjaTkaTlaQUaTmaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaTnaSdaToaSfaSfaTpaSdaTnaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIkaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaRmaKdaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTxaTyaTzaTAaSAaPiaRwaTBaTBaTCaTDaTEaTFaTGaTFaTHaTIaTJaTBaTBaRwaSNaFFaTKaEjaSPaPyaPzaLNaLOaLPaMUaTLaTMaTNaTOaTPaTPaTQaTRaTPaTRaTSaTTaTUaTVaTWaTXaTYaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTZaUaaHaaGXaHaaLcaGYaGXaLcaMlaGXaUbaGYaGXaUcaGYaHaaUdaUeaGXaUfaGYaHaaIHaIHaMlaIHaUgaMqaUhaQUaUiaUjaUiaQUaUkaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaUlaLdaUmaOQaSdaUnaUoaUpaUqaSdaOQaUraPYaLdaUsaUtaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUwaUxaUyaUzaUuaTuaTvaUBaUAaUAaUAaUAaUAaUAaUCaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUGaUHaUIaUFaSAaPiaRwaUJaUJaUJaUKaULaSCaUMaSCaULaUNaUJaUJaUJaRwaSNaFFaUOaEjaSPaPyaOnaLNaLOaLPaOoaUPaUQaUQaUQaUQaUQaUQaUQaURaUQaUSaUSaUSaUSaUSaUTaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaUUaUaaHaaUVaGXaGYaGYaGXaGYaMlaHaaGYaGYaGXaGYaGYaHaaMlaGZaGXaGYaGYaHaaUWaGYaMlaGYaUXaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaTnaSdaSdaSdaSdaSdaSdaTnaPYaUZaLdaVaaVbaVcaVcaVcaVcaVcaVcaVdaTuaUuaVeaUwaVfaVeaVeaUuaTuaVgaUDaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVlaVmaVnaVoaUEaaaaSuaSzaSAaVpaVqaVraVsaUFaSAaPiaRwaVtaVtaTCaVuaVvaTFaTGaTFaVvaVwaVxaTBaTBaRwaSNaFFaSOaEjaVyaKAaVzaLNaLOaLPaMUaUPaUQaVAaVBaVCaVCaUQaVDaVEaVFaUSaVGaVHaVIaUSaVJaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVOaHaaHaaGXaGXaHaaHaaVPaVQaHaaGXaHPaGXaGXaHaaHaaVRaVSaGXaGXaGXaQLaUWaGYaMlaGYaUXaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVWaVXaVWaVWaVYaVZaVWaVWaVXaWaaWbaLdaToaWcaVcaWdaWeaWfaWgaWhaWiaTuaUuaVeaUwaWjaVeaVeaUuaTuaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaVjaabaUEaWuaWvaWwaWxaWyaUEaabaSuaSzaSAaWzaWAaWBaWCaWDaSAaPiaRwaSBaSCaWEaWFaULaSCaWGaSCaULaWHaWIaSCaSMaRwaSNaFFaWJaEjaSPaMSaMTaLNaLOaLPaWKaWLaUQaWMaVEaVEaVEaWNaWOaWPaWQaUSaWRaWSaWTaWUaWVaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWWaWXaWYaWZaXaaGXaNgaGYaQIaMlaGYaGXaaaaGXaGYaGYaGYaGYaMlaXbaXcaXdaXdaXdaXdaXeaXfaXgaXhaXiaXjaXiaXkaVTaVTaVUaXmaXlaXnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVWaXqaXraXsaXtaXuaXvaXwaXxaXyaXzaXAaXBaSdaToaXCaVcaXDaXEaXFaXGaXFaXHaTuaXIaVeaXJaXKaXLaXKaXMaXNaXOaXPaXQaXQaXQaXQaXQaXQaXRaXSaVjaaaaUEaXTaWvaXUaWxaXVaUEaaaaSuaSzaSAaXWaXXaXYaXZaYaaSAaPiaRwaYbaYbaTCaYcaVvaTFaYdaTFaVvaYeaTJaYfaYfaRwaYgaIraYhaEjaSPaMSaYiaYiaYiaYiaYjaYkaYlaYmaYnaYoaYoaYoaYpaYoaYqaYraYsaYtaYuaYraYvaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYxaGXaGXaGXaGXaGYaMlaWWaHNaabaHNaGYaYyaYzaYAaYBaYCaYDaYEaYEaYEaYEaYFaYGaYHaYIaYJaYKaYJaYLaYJaYJaYMaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYTaYUaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAaYWaYXaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaToaZcaVcaZdaZeaZfaZgaZhaZiaTuaZjaVeaZkaZlaZmaZnaZoaTuaZpaZqaXQaXQaXQaXQaXQaXQaXRaZraVjaabaUEaZsaZtaZuaZvaZwaUEaabaSuaSzaSAaZxaZyaZzaZAaZBaSAaPiaRwaUJaUJaUJaZCaULaSCaUMaSCaULaZDaUJaUJaUJaRwaZEaZFaZGaEjaVyaZHaZIaZIaZIaZJaZKaZLaZMaZNaZOaZMaZPaZQaZRaZMaZSaZTaZUaZVaZWaUSaZXaZYaZZbaabaaaZYbabbacbacbacbacbacbadbaebacbafbagbahbaibajbakbalbambanbaobanbapbaqaGYaGXbarbasbatbaubavbawbaxbaybazbaAbazbaBbaCbaDbaEbaFbaGbaHbaIbaJbaKbaLaYPbaMbaNbaObaPbaQbaRbaSbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYTbaWbaXbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaZaaZbaSdaTobbbaVcaVcbbcbbdbbebbdaVcaTuaTuaTuaTubbfbbgbbhbbiaTubbjbbkbblaXQaXQbbmaXQbbnbbobbpaVjaaaaUEaUEbbqbbrbbqaUEaUEaaaaSuaSzaSAbbsbbtbbuaZAbbvaSAaPiaRwaSBaSCbbwaWFaULaSCaUMaSCaULaWHbbxaRwaRwaRwbbybbzbbAbbBbbCbbDatGatGbbEbbFbbGbbHaUQbbIaVEaUQbbJaUQbbKaUQbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbVbbWbbXbbVbbVbbYbbVbbSbbZbbSaXjbcabbSbcbbccbcdbcebcfbcgbchbcibcjbckbclaXibcmbcnbcobcpbcqbcrbcsbctbaybcubcvbazbcwbcxbcybczbaFbcAbcBbcCbcDbcEbcFaYPbcGbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYTbaWbcJbcKbcLbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAbcMbcNaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaTobcObcPbcQbcRbcSbcSaSfbcTbcUbcVbcWbcXbcYbcZaVebdaaTubdbbdcbddbdebdfbdgbdhbdibdjbdkaVjaaaaabaaabdlbdmbdlaaaaabaaaaSuaSzaSAbdnbdobdpbdqbdraSAaPiaRwbdsbdtaTCbdubdvaTFbdwaTFbdxbdybdzaRwbdAbdBbdCbdDbdEbdFbdGbdHaaaaaabbEbdIbdJbdKaUQbdLbdMaVEaVEbdNaVEaVEaVEbdOaUSbdPaUSbdQbdRaUSbdSaUSbdTbdUbdVbdWbdXbdYbdTbdZbeabebbecbebbebbebbebbedbeebebbefbegbehbeibebbejaGYbaubekbcpbelbembenbeobepbeqberbesbazbetbeubevbewbexbcAbcBbcCbcDbaKbeyaYPbezbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEbeFaVWaXqaXzaXsbeGbeHaXsaXsbeIbeGaXzaXAbeJaSdaTobeKbeLbeMbeNbeMbeMbeMbeMbeMbeOaSfaTubePbeQbePaTuaTubeRbeSbeRaViaViaViaVibeRbeTbeUaVjbeVbeWbeWbeXbeYbeXbeWbeWbeZaSubfaaSAbfbaSAbfcbfdbfeaSAbffaRwaRwaRwaRwbfgbfhbfibfjbfibfhbfgaRwaRwbfkbdDbdDbdDbdDbflbfmbfnbfobfpbbEbfqbdJbfraUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfubfvbfwbfxbfybfzbdTbfAbfBbfCbfDbfEbdTbfFbfGbfHbfIbfHbfJbfKbfLbfMbfNbfObfPbfQbfRbfSbebbfTbfUbfVbfWbfXbelbfYbfZbeobgabazbgbbgcbgdbgebgfbczbczbazbazbcBbcCbcDbcEbggaYPbghbgibgjbgkbglbgmbaTbaTbgnbaVaaaaaaaaaaaaaaaaYTbaWbgobeCbeCbeCbgpbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEaVWaVXaVWaVWaVYaVZaVWaVWaVXbeFbgqaLdbgrbeKaPYbgsbgsbgtbgsbguaMsbgvbgwaSfbgxbgybgzbgzbgAbgBbgzbgCbgzbgzbgzbgDbgzbgzbgEbgFbgGbgHbgIbgJbgHbgKbgHbgHbgHbgHbgLbgMbgNbgzbgzbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgXbgXbgXbgXbgXbgXbgYbgZbhabhbbhcbhdbhebhfbhgbhhbdDbdDbhibhjbhkbhjbhkbhlbhmbhnbhobhpbhqaUSbhrbhsbhtbhubhvbhvbhwbhxbhybhzbdTbhAbhBbhCbhCbhDbdTbhEbhFbhGbhHbhIbhIbhJbhKbhLbhMbhNbhObhPbhQbhRbebbejaTgbaubhSbhTbhTbhUbhVbhTbhWbazbhXbhYbazbhZbiabczbibbazbicbidbiebcDaYPaYPaYPbifbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabijbikbilbeCbeCbimbinbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYbioaSdaSdaSdaSdaSdaSdbioaPYaUZaLdbipbiqaPYbirbisbitbitbiuaMsbivbgwbiwbixbgybiybizbiAbiBbiBbiCbiDbiDbiDbiEbiFbiFbiGbiHbiIbiBbiBbiJbiFbiKbiLbiMbiMbiNbiObiPbiQbiQbiQbiRbgPbgQbgRbgSbgSbgSbgSbiSbgSbgSbgSbgSbgSbgSbiTbiUbiVbiWbiXbiYbiZbjabjbbjcbiVbiVbiVbjdbjebjebjebjfbhqbhqbhqbjgbjhbhqaUSbjibjjbhvbhvbjkbhvbjlbjmbhybjnbdTbjobjpbjqbjrbjsbdTbjtbjubjvbjwbjxbjybebbebbjzbjAbebbebbjBbjCbjBbebbejaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjGbazbcDbcDbcCbcDbjHbjIaYPbjJbjNbjLblwbjKbjObjPbjQbjRaaaaaaaaaaaaaYTbjSbjTbjSbjSbjSbjUbjSbjVbjSbjTbjSaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaUlaLdaPYaOQaSdbjWbjXbjYbjZaSdaOQaPYaPYaLdbkabeKaPYbkbbkcbitbitbiuaMsbkdbgwaSfbixbgybgzbkebkfbkgbkgbkhbkibkjbkgbkkbkgbklbkgbkmbknbkgbkgbkgbkgbkgbkobkpbkgbkqbkrbksbktbgzbgzbkubkvbkwbkxbkybkzbkybkAbkBbkAbkAbkAbkAbkAbkAbkCbkDbkEbkEbkEbkEbkFbkEbkGbkHbkEbkEbkIbkJbkKbkKbkKbkKbkKbkKbkKbkLbhqbhqaUSbkMbkNbkObkPbkPbkQbkRbjmbhybkSbdTbdTbdTbdTbdTbkTbdTbkUbkVbkWbkXbfHbkYbebbkZblablbblcbldbleblfblgbebbejaQLbaublhblibcpbljblkbcpbllbllbaublmblnbloaYPblpblqblrbcDbcDblsbltaYPbluaYPblvbjKbjLblxblybjKbjKblzbjRaaaaaaaaaaaabijbmXbnabmYbmYblDbeCblCblDblAblBblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaPYbioaSdaToaSfaSfaTpaSdbioaSdblEblFblGblHaPYblIblIbgtblIbguaMsblJbgwaSfaMsblKblKblLblMblMblMblMblMblMblNblOblMblMblMblMblMblMblPblQblRblRblSblRblTblUblVblTblTblWblXblYblKblZblZbmabmabmabmbbmbbmbbmbbmbbmbbmbbmbbmcbmdbmdbmebmdbmfbmfbmfbmfbmgbmhbmfbmcbmibmibmibmibmibmibmibmibmjbmjbmjaUSbmkbmlbmmbmmbmmbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbdTbdTbmxbmybmzbmybmybebbmAbmBbmCbmDbmDbmDbmEbmFbebbmGbmHbaubmIbcpbljbljblkbljbcpbmJbaubmKbmLbmMaYPbcDbmNbmObmPbmPbmQbmRbmSbmTbmUbmVbmWboObzpbjMbjKbjKblzbjRbjRbjRbjRbjRbijbBTbDzbDzbDzbBVbeCblCbnbblAbeCbncbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabndbneaSfbnfbngbnhbnibnjbnkbnibnlbnmbnibnibnnbnobnpbnqbnrbnrbnrbnsbnrbntbnuaMsbnvbnwbnxblMbnybnzbnAbnBbnCbnDbnEbnFbnGbnHbnIbnJblMbnKbnLblRbnMbnNbnOblTbnPbnQbnRblTbnSbnTbnUbnSbnSbnSbnVbgSbnWbmbaaaaaaaaaaaaaaaaaaaaabmcbnXbnYbnZboabobbocbodboebofbogbohbmcaaaaaaaaaaaaaaaaaaaaabmiboibhqbojaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbonbooboobopboqborbosbotboubovbowbebboxboybozboAboAboBboCboDbebbejaGYbauboEboFbcpbljblkbcpboGboGbaubauboHbauaYPboIblqbltboJboJboKbltaYPaYPaYPboLbjKbEFbDubjMbjKbjKbmZbAMbrKbrMbrMbrKbDvbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabndboPboQboPboPboPboPboPboPboQboPboPboRaSfboSboTboUaSfboVaSfboWboXboYboZbpaaMsbnwbnwbpbblMbpcbnDbnDbnDbnDbnDbnEbpdbnDbnDbnDbpeblMbnKbpfblRbpgbphbpiblTbpjbpkbplblTbpmbpnbpobppbpqbnTbnVbgSbnWbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbmcbmcbmcbmcaaaaaaaaaaaabmiboibhqbpCbpDbpEbpFbpGbpHbpEbpIbpJbpKbpLbpMbpNbmqbpObpPboobpQbpRboobpSbpTbpUbpVboobpWbpXbpYbozboAboAboBbpZbqabebbejaTgbaubmIbcpbljbljblkbljbcpbcpbqbbqcbcpbqdaYPbqebqfbqgboJboJbqhbqgbqiaYPbqjbqkbjKbDybDybEHbEIbDybDybjRbqnbjRbjRbjRbEJbjSbjSbjSbjSbqobeCblCbqoblAbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaPYaPYaPYaPYaPYaPYaPYaPYaPYaLdaMsbqpbqqbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnWbmbbmbbqNbmcbmcbmcbqObqPbqQbqRbqSbqSbqTbqUbqSbqVbqSbqWbqXbqYbqZbrabrbbmcbmcbmcbqNbmibmiboibhqbhqaUSbrcbrdbpMbrebmqbrfbrgbmqbrhbribpNbmqbonbooboobrjbrkbrlbrmbrnbrobrpboobrqbpXbrrbozboAboAbrsbrtbrubebbejaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrDbrEboJboJbrFbrEbrGaYPbrHbqkbjKbjObGIbjMbjKbjKbrIbrJbrKbrLbrMbrKbrNbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObrPbrPbrQbrPbrPbrPbrRbrPbrPbrSaabaPYaUnaShbrTbqrbrUbrVbrWbrXbrYbrZbsabsbbqrbscbsdbsebsfblMbsgbnDbnDbqvbqxbshbsibqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsmbsnbsoblTbspbqJbsqbqJbsrbnTbnVbssbnWbgXbgXbstbsubsvbmcbswbptbsxbqSbqSbsybszbsAbsBbsAbsCbsDbsEbsFbsGbsHbsIbmcbsJbsubsKbsLbsMboibhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsRbpNbmqbpObooboobsSbsTbsUbsVbsWbsXbrpbsYbebbsZbtabtbboAboAboBbrtbtcbebbtdbtebaubtfbaubaubtgblkbthbtibcpbtjbtkbtlbtmbmUbtnbtobtpbtqbtqbtrbtsbttbmUbtubtvbjKbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbijbtybeCblCblDblAbeCblCblDblAbeCbtzbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObtAbtBbtCbtDbtDbtEbtDbtDbtDbtEbrQaPXaPYaSdaToboSbqrbrUbtFbtGbrUbtHbtIbtJbtKbqrbtLbtMbtNblQblMbtObtPbtQbtRbtSbtTbtUbtVbtVbtVbtWbtXblMbnKbsdbtYbtZbuabubblTblTblTblTblTbucbudbuebufbugbnTbnVbssbgSbgSbgSbuhbuibujbukbulbumbqSbunbuobupbuqburbusbutbuubuvbuwbuxbulbuybuzbuAbuBbuCbuDbuEbuEbuFbhqbuGaUSbmqbuHbuIbpNbmqbuJbuKbmqbuLbuMbpNbmqbonboobooboobopboobuNboobsXbrpbuObebbuPbrrboBboAboAboBbrtbuQbebbuRbuSbuTbuUbuVbuWbuXbuYbuZbuZbuZbuZbuZbuZbvabvbbvcboJboJboJboJboJboJbvdbvebvfbqkbjKbjKbjKbjMbjKbjKbvgbqnbvhbvhbvhbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvkbvlaOQbvlaSfboSbqrbvmbrUbvnbvnbvnbvobrUbvpbqrbvqbvrbtNbvsbvsbvsbvsbvtbvsbvubnDbvvbvwbvxbvxbvybvzblMbvAbvBbvCbvDbvEbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvLbnVbvMbvNbvObvPbvQbvRbvSbvTbvUbusbvVbvWbvXbvXbvXbvXbvYbvXbvZbwabwbbwcbvVbwdbwebmcbwfbwgbwhbwibwjbwkbhqbhqbsNbmqbwlbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwnbooboobwobwpboobooboobwqbwrbwsbebbqabrrboBboBboBboBbrtbwtbebbwubwvbwvbwwbwvbwxbljbljbljbljbwybljbljbljbwzbveboJboJboJboJboJboJboJbvdbvebvfbqkbjKboMboMboNboMbjKbwAbjRbwBbwCbwDbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbwFbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaPYaPYaSdbwKblHbwLbrUbwMbvnbvnbvnbvobwMbrUbqrbwNbwObtNbvsbwPbwQbwRbwSbvsbwTbwUbwVblMbwWbwXbwYbwZblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxdbxebxebxebxfbxebxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxsbxtbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwkbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxCbxDbmqbxEbdTbxFbxGbdTbdTbxHbxIbxJbxIbdTbdTbebbxKbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbqkbjKbqlbqlbqmbqlbjKbvgbqnbvhbvhbvhbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbrPbrPbrQbrPbrPbrPbrRbrPbrPbydaabaPYbyebngbyfbqrbtFbtFbtFbrUbygbyhbyibyjbqrbykbylbtNbvsbymbvsbynbyobvsbypbyqbyrblMbwWbwXbwYbskblMbnKbxabxbbysbytbyubyvbywbxbbyxbyybyzbyAbyBbyBbyBbyCbyDbyEbyFbxlbyGbyHbyIbyJbyKbyLbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyTbyUbyVbyWbyXbyYbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzfbzgbzgbzgbzgbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbzmbznbjKbjKbjKbjMbjKbjKdsgbjRbjRbjRbjRbqnbijbzobeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzqbzrbqrbqrbqrbqrbqrbqrbzsbqrbqrbqrbnKbnKbztbvsbzubzvbynbzwbvsbzxbzybzzblMbwWbwXbwYbnDblMbnKbxabxbbzAbzBbzCbyvbzCbxbbyxbzDbzEbzFbzGbzHbzIbzJbzKbzLbyFbzMbzNbzObzPbzQbzQbzPbzRbzSbvXbzTbxqbxqbyPbzUbyPbxqbxqbzVbwbbzWbzXbzYbzZbAabAbbzYbAcbxvbAdbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAlbAmbAnbAkbAkbAobAkbAkbAkbAkbAkbAkbAkbAkbApbAqbArbArbArbArbArbArbAsbAibAtbAubAubAvbAwbAxbAwbAybAwbAzbAAbABbAwbACbADbAEbAFbAGbAGbAGbAGbAGbAGbAGbAHbAIbAJbAJbAJbAJbAKbAJbALbrIbAMbrKbANbrMbrKbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaPYaUnaShbAUbAVbAWbAXbAXbAXbAXbAYbAZbBablQbnwbBbbBcbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBfbBgblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyxbBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzMbBrbBsbBtbBubBvbBwbzRbBxbvXbBybyPbxqbBzbBAbBzbxqbyPbBBbxubBCbzYbzYbzZbBDbAbbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbBObBPbjKbjKbjKbjKbjKbjKbjKbBQbjRbqnbjRbjRbjRbEJbjSdsidshbjSbBUaYUbBUaYUbDxbBRbBSbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbBYbBZbCabCbbCbbCcbCdbARbATaPXaPYaPYaTobCebCfbCgbCfbCfbCfbCfbChbCibCjblQblQbCkbClbvsbwPbCmbCnbzwbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCtbCubzCbCvbCwbxbbyxbzJbCxbzFbBnbBnbCybzJbCzbzLbyFbzMbCAbBsbBtbCBbCCbBwbzRbCDbvXbCEbCFbxqbCGbCHbCIbxqbCJbCKbCLbCMbCNbCObCPbCQbCRbzYbCSbxvbCTbCUbAfbAgbAhbAibAkbCVbAkbAkbAkbAkbCWbCXbCXbCXbCXbCYbAkbAkbAkbAkbCZbAkbCVbDabAkbDbbDcbDdbAkbDebDfbDfbDgbDhbDibDjbwvbwvbwvbwvbwvbwvbwvbDkbDlbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDmbDnbDnbDobDpbDqbDrbDsbDsbDsbDsbDtdskbAMbrKbrMbrMbrKdsjdsldsldsldsnbijaaabijdsobDwbDwdspbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbDAbCbbCbbCbbCbbCbbCbbCbbDBbDCaOQbDCaSfbDDbCfbDEbDFbDGbDHbDIbChbDJbDKbDLbDLbDMbDNbvsbvsbvsbynbDObymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDQbDRbDSbDTbyvbxbbDUbzJbDVbzFbBnbBnbDWbDXbDYbzLbDZbxlbEabEbbzPbzPbzPbzPbzRbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbEfbEgbEhbEibEjbEkbElbxvbEmbEnbEnbEobEobEobEobEobEobEobEpbEpbEqbErbEsbEsbErbEqbEpbEpbEtbEtbEtbEtbEtbEtbEubEubEvbEubEubEubEubEubEubEwbExbEybwvbwvbEzbEzbEAbEAbEAbEAbEAbEBbDnbDnbDmbDnbwvbDnbDnbDnbDnbECbEDbEDbEDbEDbEEbEFbEFbEGbEGbEGbEGbEGbEGbEGbjRbjRbjRbjRaYUdsqdsldsldsrbijaaabijdssbDwbDwdstbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbEKbELbELbCbbELbELbELbARbEMaPYaPYaPYaTobENbCfbEObEPbEPbEPbEQbChbnKbERbESbETbEUbEVbvsbwPbEWbynbEXbymbEYbEZbFabFbbFcbFdbFdbFebFdbFfbFgbxbbFhbFibFjbFkbFlbFmbFnbyBbFobFpbBnbFqbFrbFsbDYbzLbFtbxlbFubFvbFwbFxbFybFzbFAbxmbxmbFBbFCbFDbFEbFFbFEbFGbFCaaabFHbxvbFIbFJbFKbFLbEjbzYbFMbxvbFNbFObFPbEobFQbFRbFSbFTbFUbFVbFWbFXbFYbFZbGabGabFZbGbbGcbGdbEtbGebGfbGgbGhbEtbGibGjbGkbGlbGmbGnbGnbGobEubGpbGqbGrbGsbGrbGtbGtbEAbGubGvbGwbEAbGxbGybGxbEAbGzbDnbECbEDbGAbGBbGAbEDbGCbGDbEDbGEbGFbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabijdsudswdsvdsvbijaaabijdsxbDwdsxbDwbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGKbARbARbARbARbARbARbARbARbEMaaaaaaaPYbGLbngbGMbCfbGNbCfbGObEPbGPbGQbChbGRbGSbGTbGUbEVbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHabxbbxbbxbbHbbxbbHcbHdbHebBnbBnbBnbHfbDXbHgbzLbHhbxlbHibFvbxlbxlbxlbxmbHjbxmbHkbHlbHmbHnbHobHpbHqbHrbHsbHtbHubxvbHvbzYbHwbHxbEjbHybzYbxvbHzbHAbHBbEobHCbHDbHEbHFbHGbHHbHIbGabGabGabGabGabGabGabGabHJbHKbHLbHMbHNbHObEtbHPbHQbHRbHSbHTbHUbHQbHTbEubHVbGqbHWbHXbHYbHZbHZbIabIbbIcbIdbIebIfbIgbIhbEAbIibIjbIkbEDbIlbImbInbIobIpbIqbEDbIrbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbjVbIubIubIubIvaaabIwbIxbIxbIxbjVbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaPYaPYaPYaPYaPYaPYaPYaToaSfbIzbCfbIAbIBbICbIDbIDbIEbIFbIGbIHbIHbIIbIJbDLbDLbDLbDLbDLbDLbIKbILbILbIMbINbxbbIObIPbIQbIRbISbITbIUbIVbxbbIWbIXbyBbyCbDXbHebBnbBnbIYbzJbzJbIZbJabJbbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbHsbJnbJobJnbJobJpbHsbHtbJqbJrbJsbJtbJubJvbJwbJxbJybJrbJzbFObFObEobJAbJBbJCbJDbJEbEobHIbGabGabGabGabGabGabGabJFbJGbJHbJIbJJbHLbJKbEtbJLbJMbJNbHSbHTbHUbJObJPbEubJQbJRbJSbJTbJTbJUbJVbJWbJXbJYbJYbJYbJZbJYbKabKbbKcbKdbKebKfbKgbKhbKibKibKibKjbEDbKkbGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbKmbKmbKmbIyaaabItbKmbKmbKmbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYbKnbKobKpaRcaRcaRcbngaSfaSfbCfbKqbCfbKrbKsbKtbKubCfblQbKvbKvbKwbKxbKwbKwbKwbKxbKwblQblQbxbbxbbxbbKybxbbKzbKzbKzbKzbKzbKzbIUbKAbKBbKCbzFbKDbKEbKFbKGbKHbKIbKJbKKbKLbKMbKNbKObKPbKQbKQbKRbKSbKTbKUbKVbKWbKXbKYbFCbKZbHqbLabHobLbbFCaaabLcbLdbLebLfbLdbLdbLdbLdbLgbxvbLhbFObLibLjbLkbLlbLmbLnbLobEobLpbLqbLrbLsbLtbLubLvbLwbGabLxbEtbLybJJbLzbLAbEtbLBbLCbHRbHSbHTbHUbHQbHTbEubHVbGqbLDbLEbLFbLGbLHbLIbLJbLKbLLbLMbLNbLObLPbEAbLQbLRbLSbEDbLTbLUbLVbIpbLWbLXbEDbKkbGGbLYbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYbLZbMabKpaSeaSebMbbMcaSebMdbCfbMebIBbMfbMgbMhbMibCfaaaaabaabbMjbMkbMkbMkbMkbMkbMlaaaaaabMmbMnbMobMpbMqbKzbKzbKzbKzbKzbKzbMrbMsbMtbMubMvbMwbMxbMybzJbzJbMzbMAbzJbzJbMBbMCbMDbMEbMFbMGbMGbMHbMGbMIbMJbMGbMKbKYbFCbMLbFEbFEbFEbMMbFCaaabLcbLdbMNbMObMPbMQbMRbMSbMTbMUbMVbFObMWbEobMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobJJbNpbNqbEtbNrbNsbNtbNubNvbNwbNxbGobEubNybNzbNAbNBbNBbNCbNDbNEbNFbNGbNHbNIbNJbNKbNLbEAbNMbLRbNNbEDbNObNPbNQbIpbIpbNRbEDbIrbGGbNSbGHaaaaaaaaaaaaaabbNTbNUbNVbNUbNVbNUbNWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYbKpbKpbNXaPYaPYaUlaLdbNYbNZbCfbOabIBbIBbIBbCfbCfbCfaaaaaaaaabObbOcbOcbOdbOcbOcbObaaaaaabMmbOebKzbOfbOgbOgbOgbOgbOgbOhbOibOgbOjbOkbOlbOmbOnbOobOpbzJbOqbBnbOrbOsbDXbOtbOubOvbMEbMEbMGbOwbOxbOybOzbOAbMGbFBbKYbFCbOBbOCbODbOEbOFbFCaaabOGbLdbOHbOIbOJbOKbOLbOKbOMbONbOObFObOPbEobOQbOQbORbOSbOTbOUbOVbOWbOXbOYbOZbOZbPabPbbPcbPdbEtbNobPebPfbEtbEtbEubPgbPhbPibEubEubEubEubPjbPkbGqbPlbLEbLFbPmbNBbNEbPnbPobPobPpbIdbPqbPrbPsbPtbIjbPubEDbPvbPwbIpbPxbPybPzbEDbKkbPAbGHbGHaaaaaaaaaaaaaabbPBbPCbPDbPEbPFbPGbPBaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbPIbPIbPIbPJbPKbPIbPIbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbObbPMbMmbMmbPNbPObPPbPQbPQbPQbPObKzbIUbKAbKzbKzbKBbPRbPSbPTbPUbPVbPWbPXbBnbBnbPYbDXbOtbOubPZbQabQbbQcbQdbQebQfbQgbQhbMGbQibQjbHmbQkbQlbQmbQnbQobHsbHtbQpbLdbQqbQrbQsbOKbQtbOKbQubONbQvbFObQwbEobQxbQybQzbQAbQBbQCbQDbQEbQFbQFbQGbQHbQFbQFbQIbQJbQKbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbGqbRabRbbRcbRdbRebIabRfbPobPobRgbRhbPqbRibEAbRjbRjbRkbEDbRlbRmbRnbRobIpbRpbEDbKkbRqbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbRubRvbRwbRxbRybRzbRAbRybRBbRCbRDbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbREbRFbRGbRFbRHbRIbRJbRIbRIbRIbRIbRKbIUbKAbRLbxbbxbbRMbBnbzFbPUbRNbDXbRObRPbRPbRQbRRbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbScbMGbMKbKYbFCbSdbSebSfbSgbShbFCaaabOGbSibSjbSibSibSibSibSibSkbSibSlbFObQwbEobSmbSnbSnbSobSpbOUbSqbSrbSsbStbSubSvbSwbSsbSxbSybSzbSAbSBbSCbSDbSDbSEbSFbSGbSHbSIbSJbSKbSLbSMbSNbSObSPbSPbSQbSRbSSbIabSTbIdbIdbSUbSVbPqbSWbSXbSYbSZbTabTbbTcbTdbTebTfbTebEDbEDbTgbPtbThbTibTibTibTibTibThbPBbPFbPDbPFbPFbPGbPBaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbRAbRAbRAbTjbRybTkbTkbRybTlbRAbRAbTmbTnbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbTobTpbTqbTpbTrbKzbPPbPQbPQbPQbKzbKzbIUbKAbTsbTtbxbbTubBnbzFbPUbTvbDXbTwbBnbBobBnbTxbOtbTybTzbRVbRWbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbTJbTKbTLbTMbFCbFCaaabOGbSibTNbTObTPbTQbTRbTSbTTbTUbTVbFObQwbNcbTWbTXbTYbTZbUabOUbUbbUcbUdbUebUfbUgbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbQVbUwbQXbUxbUybGrbUzbUAbUBbUCbUCbIabUDbUEbUFbIabUGbPqbUHbIabUIbUJbUKbULbUMbUNbUObUPbUQbURbUSbUTbUUbUVbUWbUWbUXbUYbUZbVabVbbNUbNVbVcbNVbNUbVdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIbVebVfbVgbVhbVibRybVjbRAbVkbRAbRAbRAbRAbRAbTjbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbVlbOcbOcbOcbVmbObbPMbMmbMmbVnbKzbPPbKzbKzbKzbKzbKzbIUbKAbTsbVobxbbVpbBnbVqbVrbBnbVsbzEbBnbBnbVtbDXbOtbTybTzbRVbRWbMGbVubVvbVwbVxbVybMHbVzbVAbVBbVCbHsbVDbVEbHsbHtbHtbVFbSibVGbVHbVIbVJbVKbVKbVLbVMbVNbFObVObEobOUbVPbOQbVQbVRbOUbUbbVSbVTbVUbVVbVWbVXbVTbUbbVYbVZbWabWbbWabWcbWabWdbWdbWebWfbWgbWgbWgbWhbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbWmbLIbIabWnbWobWpbWqbWqbWrbWsbWtbWubWvbWwbWxbWybWzbWAbWAbWBbWCbWDbThbVabVabVabWEbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWFbWGbRAbRAbWHbWHbWHbRybRAbRAbRybWIbWJbWKbWLbWMbWNbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbWObTpbTqbTpbPNbWPbWQbKzbKzbKzbWPbKzbIUbKAbTsbWRbxbbWSbBnbzFbPUbBnbzJbWTbBnbBnbWUbDXbOtbTybWVbRVbWWbMGbWXbWYbWZbXabXbbMHbXcbXdbXebXfbXgbXhbXibFCaaaaaaaaabSibXjbXkbXlbXlbXmbXnbXobSibXpbXqbQwbXrbXsbXtbXubXvbXwbXxbXybUcbXzbXAbXBbXCbXDbXzbUbbVYbXEbXFbXGbXHbXIbXJbWdbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbURbXVbWqbWqbXWbXXbWqbXYbXZbYabYbbYcbWqbYdbYebYfbYgbYhbYibYjbYkbYjbYjbYjbTgbPtbThbTibTibThbYlbYmbYnbYobYpbYqbYrbVaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYsbWGbRAbRAbRAbRAbRAbYtbRAbRAbRybPIbPIbPIbPIbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbYvbYwbYxbYwbYybYzbYAbYAbYAbYAbYAbYBbYCbYDbTsbYEbxbbYFbYGbYHbYIbYJbYKbYLbYLbYLbYMbYMbYNbTybYObYPbRWbMGbYQbYRbYSbVvbYTbMHbYUbYVbYWbTJbYXbQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZdbZebZfbZgbZhbZibZjbZkbZlbZmbZnbZobVTbVTbZpbZqbVTbVTbUbbVYbZrbZsbZtbZubZvbZwbWdbZxbZybZzbZAbZBbZCbZDbZDbZEbZFbZGbZHbZIbUMbUMbZJbUMbZKbUMbZLbUMbZMbZNbZNbZObZPbZQbZRbZSbZTbZUbZVbZWbZXbYjbZYbZZaaaaaaaaabThcaabUYcabbYobVacaccadbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRybRAbRAbRybRAcajcakcalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObbOcbOcbOcbOcbOcbObbPMbMmbMmbxbbxbbMmbMmbMmbMmbMmbxbbxbbMmbMmbMmbxbcamcamcamcancambYMcaocapcaqcarbYMbOtbTycasbMEbMEbMGbMGbMGbMGbMGcatbMHbTJbTIcaubTJcavcawbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaxbFOcaycazcaAcaBcaCcaAcaAcaDcaEcaFcaGcaHcaIcaJcaKcaLbXycaMcaNcaOcaPcaQcaRcaScaTcaUcaVcaWcaXcaYcaZcbacbbcbcbWgbWicbdcbecbdcbfcbgcbfcbfcbfcbhcbicbjcbjcbkcblcbmcbnbZRcbocbpcbqcbrcbscbtbYjbZYbZZaaaaaaaaabThcbucbvbThbVabThbThbVabThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRybTlbRAcbwbRAcbxcbycbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbAcbBbOccbCbOccbDcbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbFaabaaaaaaaaaaaacamcbGcbHcbIcbJbYMcbKcbLcbMcbNbYMbOtbTycbOcbPcbQcbRcbScbTcbUcbVcbWcbXcbYcbZccaccbcccccdcceccfccgcchcciccjcckcclccmbEnccnbFOccoccpccqbFOccrcaAccscctccuccvccwbUbccxccycczccAccBccCccDccEccFccGccHbWaccIbZuccJccKccLccMccNccObXNccPbXQbXQbXQccQbWgcbdccRccSccTccUccVccWccXcbfccYccZcdacbjcbjcdbcbmcdccddcdecdfcdgcdhcdicdjbYjcdkbGHaaaaaaaaabThbThbThbThaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPHbPIcdlcdmcdncdlcdobRybRAbRAbRybRAcdpcdqcdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdscdtcducducducdtcdvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdwcdxcdycdzbYLcdAcdBcdCcdDbYMbOtcdEcdFbTybTycdGcdHcdIcdJcclcdKcdLcdKcdMcdNcdNcdOcdPcdQcdNcdNcdRcdNcdScdNcclccmbEncdTcdUcdVcdWcdXcdYbFOcaAcdZcctceaccucebbUbceccedceecefcegcehceicejbUbcekcelbWacemcencenceocepceqcercesbXNcetceubXQcevcewbWgcbdcexceycezceAceBceCceDcbfceEccZceFceFcbjceGceHceIceJceKceLceMceNceOcePbYjbZYbGHceQaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWFbWGceRceRceRceRceRceSbRAbRAbRybPIbPIbPIbPIbPIbPIbPLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceTceUceUceUceVaaaaaaaaaaaaaaaaaaaaaceWceXceYceXceZaaaaaaaaacamcamcamcfacfbcdycfcbYLcfdcbMcfecffbYMbOtcfgcfhcficfjcfkcflcfmcfncfocfpcfqcfrcfscftcftcfucfvcfvcfvcfvcfvcfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfGcfHcaAcfIcctccucfJcebbUbceccedcfKcfLcfMcfNcfOcfPbUjcfQcfRbWabWacfScfSbWacepbWdcfTcfUbWgcfVcfWcfXcfYcfZbWgcbdcgacgbcgccgdcgecgfcggcbfcghccZceFceFcbjcgicgjcgkcglcgmcgncgocgpcgqcgrbYjbZYcgscgtcgscgucgvcgucgucguaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYsbWGceRceRceRcgwcgxbRybRAbRAbRybRAbRAbRAcgybRAcgzbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgAcgBcgCcgDcgAcgEcgEcgEcamcgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgObYMcgPcgQcgRcgScgScgTcgUcgVcgScgWcgWcgXcgYcgZcgWcgWchacclcclchbchcchcchcchdchechcchcchfchgchhchhchichhchjchkchhchlchmchncaAchochpcecchqchrchschtchuchvchrbUbcekchwchxchychzchAchBchCchDchEchFchGchHchIchJchKchLbWicbdcbdchMchNchOchPchOchQcbfchRchSchTchTcbjchUchVchWbYjbYjbYjbYjbYjbYjbYjbYjbZYcgschXchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecifaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRybRAbRAcijbRAbRAbRAcikbRAcilbRyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYcgEciocipcamciqcfbcirciscitciubYMcivciwcixciybYMcgQcgQcizcgSciAciBciCciDciEcgWciFciGciHciIciJcgWciKciLciMchcciNciOciPciQciRciSciTciUciVciWciXciYciZcjacjbcjccjdcjecjfcjgcjhcjicjjcedcjkcjlcjmcjncjocjpbUjcjqcjrcjscjtchAcjucjucjvcjwbWgcjxcjycjzcjAcjBcjCcjDbWicjEcjFcjGcjHcjGcjGcjIcjJcjKcjLcjMcjNcjOcbjcjPcjQcbnbPtbGGcjRcjScjTcjTcjScjTcjUcgscjVcjWchZciacjXcjYcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckebRybRAbRAbRyckfbRAbRAckgckhbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgAckicimcimckjckkcfbcfbcklckmcfbcfbciscknckobYMbYMbYMbYMbYMbYMckpcgQckqckrckscktcktcktckucgWckvckwckwckwckxckyckzckAckBckCckDckEckFckGckHckIchcchfckJchhckKckLckMckNckOchhcdZccuceaccuckPckQckRckSckTckUckVckWckXchrckYckZclaclbclccldcleclfclgclhbWgbWgbWgbWgbWgclicljclkbWicllcjGcjGclmclncjGcloclpcbjclqccZclrclrcbjcblclscbnbPtcgscltcgscgscgscgscgscgscgscluclvcguclwclxclycguaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacclzcjZcjZclAciecieckbckbclBckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRybRAclFbRyclGclHbRAbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYcgEclIclJclKckmcfbcfbclLclMclNclOclPclPclPclQcgQcgQcgQcizcgSclRcktclScktclTcgWckvckwclUckwclVcgWclWclXclYchcclZcmacmbcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcmnchhcfIccuccucmockPckQcmpcmqcmrcjlcmscmtcmucmvcmwcmxcmycmzcmAcmBcmCcmDcjucmEchxcmFcmGcmHcmIcmJcmKcmLclpcllcmMcjGcjGcjGcmNcmOclpcbjcmPccZclrclrcbjcmQcmRcbnbPtcmScmTcmUcgscmVcmWcmXcmYcmZcnacnbcgucnccndcnecgucgscgscgscgscgscgscgscgsaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnfcieclzciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaccgQcngcngcgQcngcngcgQaaaaaacgAcnhcnicnjcgAcgEcgEcgEcamcnkcnlcnmcnmcnmcamcamcgQcnncnocnpcnqcgQcnrcnscgSclRcktcktcktcntcgWckvckwckwcnucnvcnwcnxcnycnzchcchcchcchcchccnAchcchccnBcnCchhchhcnDchhchkchhchhcaAcnEcnEcaAcnFcnGcnHcnIcnJcnKcnLcnMcnNcnObQVcnPcmycmzcnQcnRcnScnTcnUcnVchxcnWcnXcnYcnZcoacobcoccodcoecodcofcofcofcodcogcodcodcohcoiclrclrcbjcojclscbncokcolcomconcoocopcoqcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcoFcoGcoHaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoIcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoMceXcoNceXcoOaaaaabaaacamcamcamcamcamcamcamcoPcgQcoQcoRcoScoTclPcoUcoVcgScoWcoXcoYcktcoZcpacpbcpccpdcpecpfcgWcpgcphcpicpjcpkcpkcpkcpkcplcpmcpncpocpocppcppcpqcprcpschfcaAcptcpucpvcpwcpxckQcpycnIcpzcpAcpBcpCceicpDcpEcpFcpGcpHcpHcpIcpHcpHcpHcpJchxcpKcpLcpMcpNcpOcpPcpQcpRcpScpRcpTcpUcpVcpRcpWcpXcodcpYcpZcdacbjcbjcqacqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncqocqpcqqcqrcqqcqscqrcqrcqrcqtcqucqvcqwcqxaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecqyckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaccgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqCcqDcgQcqEcgQcgQcqFcgQcgQcqGcgScqHcqIcqJcqKcqLcqMcqNcqOcqPcqQcqRcpacqScqTcqUcqVcqWcqWcqWcqWcqXcqYcqZcracrbcracrccrdcrecrfcrgcrhcricrjcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrwcrxcrybXubXucrzcrAcrBcrtcrCcrDcrDcrEcrDcrFcrGcrHcrIcpRcrJcrKcrLcrMcrLcrNcrOcrPcodcbjcrQcbjcbjcrRcrSclsbLRbPtcgscrTcgscgscrUcrVcrWcrXcrYcqrcrZcsacsbcqkcsbcqkcsccqkcqkcgscsdcsecsfcsgaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcshckbcsickbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjaacaabaMraMraaccgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsncgQcsocspcoLcgQcsqcgScsrcsscstclRcsucsvcswckvcsxcsycszcsvcsAcsBcsCcsDcsDcsEcsFcsGcsHcsIcsJcsKcsLcsMchfcsNcsLcsLcsOcsPcsQcsRcsScrlcsTcsUcsVcsWcsXcsYcsZctactbcsYcsYctcctdctdctdctdctdctectfctgcthcthctictjctkctlctmctncpRctoctpctqctrctqctscttcrLctuctvctwbLRctxbLRcrSclsbLRbIictyctzctAcgscgscgscgscgsctBcqkctCctDcsccqkctEcqkclucqkctFcgsctGctHctIcgsaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJctKckbctLctJcsickbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaaccngcoLcoLcoLcoLctMctNcoLcoLcoQctOctOctPctOctOctOctOctOctOctOctOctOctOctOctOcoRcgQcskcqzctQcgQcsqctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWctSctTctUctVctWctXctYctYctZcuacsJcsLcsLcubcuccudcsLcsLcsLcuecufcugcrjcuhcuicujctdcukculcumcecculcuncuocuocuocupcuqcuqcuqcuqcurcusceccutcuucuvcuwcuxcuycuzcuAcpRcuBcuCcrLcuDcrLcuEcuFcuGcuHcuIcuJcuKbLRcuLcrSclscuMbIibPAcuNcuOcuPcuQbGGbGGcgscuRcuScuTcuUcuVcuWcuXcuYcuZcvacvbcgscvccvdcvecvfaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvgcjZcjZcjZcjZcjZcjZcjZcvhcvickbckbckbckbcvjckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaabaaccngcvkcvlcvmcoLcoLcvncoLcoLcsncgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcsqcvpaaaaaaaaaaaacvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvEcvFcvGcvHcvIcvIcvIcvIcvJcvIcsLcsLcaAcvKcvLcvMcvNcvOcvPcuxcvQcvRcvScvTcvUcvVcvWcuqcuocvXcvYcvYcvYcvYcvZcwacwbcwccwdcwecwfcwgbQVcwhcwicpRcwjcwkcwlcwmcwncrLcwocpRcpRbIicwpbIibIibIicwqcwrcwsbIibGGcuNcwtcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgscgscgscgscgsaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecoJcoJcoJcoJcoJcoJcwvckbcoIcoJcwwckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcsncwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLcqGcngaaacwJcwKcwLcwMcwNcwOcwPcwQcwRcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcvHcxecxfcxfcxfcxgcvIcsLcsLcxhcxhcxhcxhcxicxhcxjcxjcxkcxhcxhcxlcxhcxmcxncxocxpcxocxqcxrcxscxtcxucxvcxwcxxcxycxzcxAcxBcxCcxDcpscpRcpRcxEcpRcxFcpRcxGcxHcxIcsMcxJcxKcxLcxMcxNcxOcxPcxQcxNbGGcuNcxRbGGbGGcxScxTcxUctybGGbGGbGGbGGbGGbGGbGGcxVcxWbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcshckbcwwckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcxZcyacybcyccydcyecyfcwycsncygcgQcoLcyhcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocylcqGcngaaacymcyncyocypcyqcwOcyrcyscytcyucvxcyvcsBcywcvBcyxctYcyyctYcyzcyAcyBcyCcyDcyDcyDcyEcvIcsLcsLcxhcyFcyGcyHcyIcyJcyKcyKcyLcyMcyNcyOcyPcyQcyRcyScyTcyUcyVcyWcyXcyYcyZczaczbcxBczcczdczecxxczfczgczhczicziczjczkczlczmcznczoczmczmczmczpczmczmczqczrczscztczuczvczwczxczyczyczzczyczyczyczyczAczBczyczyczyczCczDbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecqyckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFczGczHczIczJczKczKczLcwxcsncoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcsqcngaaacymczOczPczQczRczSczTczUczRczRczVczWczXczYczZczZcAacAbctYcAccAdcyBcyDcyDcyDcyDcAecvIcsLcsLcxhcAfcAgcAhcAicAjcAkcAkcAlcAmcAncAocyKcApcxhcAqcuocArcvYcAscAtcAucAvcAwcAxcxBcAycAzcAAcxBcABcACcADcAEcAEcAEcAEcAEcAFcAGcAHcAIcAJcAJcAKcAKcAJcALcAMcANcAOcAPcAPcAQcARcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScATcAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnfcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcAWcAXcAYcAXcAZcBacBbcBccBdcBecwxcsncgQcgQcBfcngcngcngcngcngcngcngcBgcvocwIcwIcwIcwIcBhcwIcwIcvocygcqGcngaaacymcBicBjcBkcBlcwOcBmcBncBocBpcvxcyvcsBcnycBqcsDcBrcsDcvBcvBcvBcBscBtcyDcyDcBucBvcvIcsLcBwcxhcBxcBycBzcBAcBAcBBcBCcBDcBAcBAcBEcyKcBFcxhcBGcuocBHcvYcvYcBIcvYcvYcAwcBJcxBcBKcBLcBMcxBcBNcBOcBwcBPcBPcBPcBPcBPcBQcBQcBQcBPcBPaaaaaaaaaaaacBRcBScBTcBUcAPcBVcBWcBXcBYcBZcCacCbcCccCdcCecCfcCgcChcCicAPcAScCjcCkcClcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCncCocieclzcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcCpcCqcCrcCsczJcCtcCucCvczJcCwcCxcCycskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCzcwFcCAcwIcwIcwIcwIcCBcCCcCDcCEcngaaacCFcwKcCGcwMcCHcwOcwOcCIcCJcCKcCLcCMcCNcCOcBqcsDcCPcCQcCRcCScCTcvHcCUcyDcyDcyDcCVcvIcsLcsLcCWcCWcCXcCYcCZcCZcDacDbcDccDdcDdcDecDfcDgcDfcAqcuocArcDhcDicDjcDkcDlcAwcDmcxBcDncDocDpcxBcsLcBOcBPcBPaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDrcDscDtcDucDvcDwcDwcDxcDwcDwcDwcDwcDwcDycDzcDAcDBcDCbGHcDDcjUbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDEcDFcDGciecieckbckbcDHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcDIcAXcDJcAXcDKcDLcDMcDNcBbcDOcwxcDPcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcDUcvocoLcqGcvpaaaaaaaaaaaacvqcDVcDWcDXcDXcvxcDYcvxcDZcsBcnycEacEbcEccEdcEecEecEecEfcEgcyDcEhcyDcEicvIcsLcsLcCWcEjcEkcElcEmcEncEocCWcEpcEqcErcEscEtcEucDfcEvcEwcExcDhcEycEzcEAcEBcECczbcxBcEDcEEcEFcxBcsLcBOcBPaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEIcEJcEKcELcEMcENcEOcDwcDwcEPcDwcDwcDycDAcDAcDAcEQbGHcERbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcEVcEWcEWcEWcEWcEWaXpcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcEZcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFbcsBcnycFccFdcFecFfcFgcFhcFicFjcFkcFlcFmcFncFocvIcsLcsLcCWcFpcFqcFrcFscFscFtcCWcFucFvcFvcFwcFvcFxcFycFzcFzcFzcFAcFBcFCcFDcDlcFEczbcFFcFFcFFcBPcBPcsLcBOcBQaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFHcFIcFJcFKcFLcFMcFNcFOcDwcDwcDwcDwcFPcFQcFRcFScFTcFUbGHcERbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecifaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFYcFXcFZcFWcGacGbcGccGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGmcGncGmcGocGpcGpcGqcGrcGscGtcGucGtcGtcGtcGscGtcGtcGvcGwcGxcGycsBcnycGzcGAcGBcGCcsDcGDczZcGEcGFcGGcGHcGIcGJcGKcsLcsLcCWcGLcGMcGNcGOcGPcGQcCWcGRcGScGTcGUcGVcGWcGXaaaaaaaaacFAcDhcGYcDhcDhcGZcHacHbcHccHdcHechfcsLcBOcBQaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcHfcHgcBScHhcHicHjcHkcHlcHmcHncDwcDwcHocHpcHqcHrcHsbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcHucFXcHvcHwcHxcHycHzcHAcHzcHBcHCcHDcHEcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcIFcFXcIGcFXcFZcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScITcIUcIVcIWcIXcIYcqVcIZcqVcIUcJacIUcIUcIUcIUcIUcIUcIUcIUcIUcIUcJbcHDcJccJdcJecJfcJgcJhcJicJjcJkcJlcJmcJncJocJpcJqcJrcGHcrecJscJtcJucEmcElcEmcEmcJvcDfcJwcErcErcEscErcJxcGXaaaaaaaaacImcJycJzcJAcJBcJCcJDcJEcJFcHdcsLcuccJGcBOcBPaaaaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcJHcJIcJJcxNcJKcJKcJLcBRaabcAPcAPcJMcAPcJNcJOcJPcAPcJQcuQcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJRcJScEWcEWcEWcEWcEXcEYcEYcEYcEYcJTcEYcJUcJVcJVcJWcJXcJYcEYcJZcKacKbcKbcKccKbcKdcKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcKgcKhcKicKjcKkcKlcKmcKncKocKncKncKncKncKpcKqcKrcKscKtcGKcsLcKucKvcKwcKxcKycKzcKAcKBcDfcKCcKDcKEcKFcKGcKHcFyaaaaaaaaacImcKIcKJcKKcIqcKLcKMcJDcKNcHdcKOchfchfcBOcBPaaaaaaaaaaaaaaaaaacBRcKPcKQcKRcKScKTcKUcKVcxNcKWcKXcKYcxNcJKcKZcLacBRaabaabcLbcLccLdcLecLfcLgcLbbGGbGGcERcLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalwalvalvalwalvalvaabamhaabayiaaaayiayicLicLjcLkcLkcLkcLlcLmcEYcLncLocLpcLqcLrcLscEYcLtcLucKfcLvcLwcLxcLycLzcLAcLBcLCcLDcKbcLCcLEcLFcLGcLGcLHcKbcLIcLJcHCcLKcnycLLcLMcLNcLOcLPcLQcLPcLRcLScLTcLUcLVcLWcGKcGKcKucKvcCWcCWcLXcCWcCWcKvcLYcLZcLZcLZcMacLZcMbcFyaaaaaaaaacImcImcImcImcImcFFcMccMdcMecHdcsLcsLcMfcBOcBPaaaaaaaaaaaaaaaaaacBRcJKcMgcJKcMhcMicEHcJIcxNcxQcMjcxQcxNcJKcJKcMkcBRaabaaacLbcMlcMmcLecLecMncLbcMobGGcERbKlcMpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaabaabcLicLicMqcLicLicMrcMscEYcEYcEYcEYcEYcEYcEYcEYcLicLucKfcMtcMucMvcMwcMwcMwcMwcMxcMycMzcLGcMAcLGcLGcMBcLGcMCcMDcMEcMFcLKcnycMGcHQcMHcLOcMIcMJcMKcLOcMLcMMcMNcMOcMPcMQcMRcMScMTcMUcMUcMVcMWcMXcMYcMZcNacrecrecNbcsLcNccBPcBPcBPcBPcBPaaaaaaaaaaaacNdcNecNfcNgcHdcNhchfchfcBOcBPcBPcBPcBPcBPaaaaaacBRcJKcJKcJKcNicNjcNkcNlcNmcNncNocNpcxNcNqcNrcNscBRaaaaaacLbcNtcLecNucLecNvcLbbGGbGGcERcMpbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNwaaaalwaaacNxcNycNzaaacNxcNycNzaaacNxcNycNzaaaaaacLicNAcNBcNCcLicNDcNEcLkcLkcLkcLkcLkcLkcLkcLkcLkcNFcKfcNGcLGcMBcNHcLGcLGcLGcNIcLGcNGcNGcLGcLGcLGcLGcNJcNKcMDcNLcHDcNMcywcHQcHQcNNcLOcNOcNPcNQcLOcNRcHVcNScNTcNUcNVcNWcNXcsLcNYcpscNYcsLcNZcOacObcObcObcObcOccOdcOdcOdcOdcOdcOecBPaaaaaaaaaaaacNdcNecNfcOfcOgcsLcxMchfcBOcsLcsLcsLcsKcBPaaaaaacBRcxNcxNcxNcxNcOhcEHcOicOjcOkcOlcOmcxNcOncOocOpcBRaaaaaacLbcOqcOrcOscLecOtcLbcOubGGcERbGHaabaabaabaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaacNxcOvcNzaaacNxcOvcNzaaacNxcOvcNzaaaayicLicNBcNBcNBcLicLicOwcOxcLicLicOxcOxcLicLicOxcOxcLucKfcNGcOycLGcOzcOAcOBcOBcMAcLGcNGcOCcLGcLGcLGcLGcODcOEcOFcOGclXcOHcOIcOJcOKcOLcLOcNOcOMcONcLOcOOcHVcGKcOPcGHcOQcORcOScOTcOUcOVcOWcOTcOXcOTcOTcOTcBPcBPcBPcBPcBPcBPcBPcBPcOYcBPaaaaaaaaaaaacNdcOZcPacPbcHdcsKcPcchfcPdcPecPecPfcsLcBPaaaaaacBRcKPcKQcKRcPgcPhcNkcPicPjcPkcPlcPmcPncPocPmcPpcBRaaaaaacLbcLbcPqcPrcPscLbcLbbGHbGGcPtcuQcuQcuQbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaayiaabcNxcOvcNzaaacNxcOvcNzaabcNxcOvcNzaaaaabcLicMrcPucNDcLiaaaaabaaaaaaaaaaaaaaaaabaaaaaacOxcLucKbcPvcLGcPwcPxcPycPzcPAcPzcPBcPzcPCcPDcLCcPEcNGcNGcNKcPFcPGcPHcPIcPJcPKcPLcPMcPNcPOcPPcPQcPRcPScPTcPUcPUcPVcPWcPXcPYcPZcQacQbcQccQdcQecQfcQgcQhcQicQicQicQicQicQicQjcBPcOYcQkcQkcQkcQkcQkcQkcQlcQmcQlcQncQkcQkcQkcQkcQkcQkcBOcsLcBPaaaaaacBRcJKcKZcJKcQocMicEHcQpcQqcQrcQscEHcEHcQtcEHcQucBRaaaaabaabcLbcLbcQvcLbcLbaaabGHbGGcERcuQcQwcQxbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNxcOvcNzaabcNxcOvcNzaaacNxcOvcNzaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQzcKbcQAcQBcQBcQCcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQDcJZcQEcJZcFacQFcQGcQHcQIcQIcQIcQJcQKcPTcQLcQMcQNcQOcQPcQQcPZcQRcQScQTcQUcQVcQWcQXcQYaabcQZcQZcQZcQZcQZcRacBPcRbcRccRdcRecRfcRgcQkcRhcRicRjcQkcRkcRlcRmcRncRocQkcBOcsLcBPaaaaaacBRcJKcJKcJKcRpcRqcNkcRrcRscRtcRucRvcRvcRwcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcERcuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvayiaaacNxcOvcNzaabcNxcOvcNzaaacNxcOvcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcRzcRAcRAcRAcRAcQycRBcLucRCcRDcREcREcRFcRGcRHcRIcRIcRIcRIcRJcRKcRLcRMcRMcRNcRNcRMcROcRPcRQcRRcRRcRScRTcRUcRVcRWcRXcRXcRYcRZcSacSbcSccSdcQPcSecPZcSfcSgcShcSicSjcSkcSlcSmcQicSncSocSpcSqcQZcRacBQcOYcQkcSrcSscStcSucSvcSwcSxcSycQkcSzcSAcSBcSAcSCcQkcBOcsLcBPcBPaaacBRcxNcxNcxNcxNcSDcEHcQpcSEcSFcQscEHcSGcSHcSHcSIcSJcSKaabaaaaaaaaaaaaaaaaaaaaabGHbGGcPtbGGbGGcSLbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcSMaabaabaabcSMaabaaaaabcSMaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSNcSOcSPcRAcSQcSRcNFcRCcRCcSScSTcKbcKbcMscSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTacTbcTccRXcTdcTecRXcRXcRXcRXcTfcPTcTgcThcQNcSdcQPcSdcPZcSfcSgcTicTjcTkcTlcTmcTnaabcTocTpcSqcTqcQZcRacBQcRbcRccTrcTscSAcTtcQkcTucTvcTwcQkcTxcTycSAcTzcTAcQkcBOcsLcTBcBPaaacBRcKPcKQcKRcTCcPhcNkcTDcTEcTFcTGcTGcTHcTIcTJcTKcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcERbGHbGHbGHbGHbGHaabaabaabcTMcTMcTMcTMcTMcTMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcTNcTOcTOcTPcTQcTRcTRcTRcTQcTRcTRcTRcTQcTRcTRcTRcTScTOcTOcTOcTOcTOcTTcTUcTVcTWcTXcTYcTZcUacUbcNBcLucUccRCcKbcKbcKbcUdcMscSUcUecUfcUgcUhcUicUjcUkcUlcUmcUncUocUpcUqcUrcUscUncUtcUucTecUvcRXcRXcRXcUwcPTcUxcUxcSdcUycUzcUAcUBcUCcUDcUEcUFcUGcUHcUIcSmcUJcSncUKcSqcSqcQZcRacBQcOYcQkcULcUMcUNcQncQkcUOcUPcQncQkcUQcURcUScUTcUTcQkcBOcsLcUUcBPaaacBRcJKcMgcJKcUVcMicEHcUWcUXcUYcEHcUZcVacxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcERbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcVbaabaaaaabcVbaabaaaaabcVbaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcVccVdcVecRAcVfcNBcNEcSRcSRcSRcSRcVgcSRcUbcSUcVhcVicVjcVkcVlcVmcVncVocVpcVqcVrcVscVtcVucVvcVwcUtcTdcTecVxcVycRXcRXcVzcPTcVAcVBcSdcVCcQPcVDcVEcVFcVGcVHcVIcVJcVKcVJcVLaabcQZcQZcQZcQZcQZcRacBPcOYcQkcVMcVNcVOcVPcVQcVRcVScVTcVUcVVcVWcSAcVXcVYcQkcBOcsLcVZcBPaaacBRcJKcJKcJKcWacWbcWccWdcWecWfcEHcEHcEHcEHcWgcWhcWiaaaaaaaaaaabaabaaaaaaaaaaaabGHbGHcERbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwaabcNxcWjcNzaaacNxcWjcNzaaacNxcWjcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabcRzcRAcRAcRAcRAcWkcWlcWmcNBcWncNBcNBcMscWocNBcSUcWpcWqcVjcWrcUicWscWtcWucWucWvcWwcWxcWycWzcWAcWvcWBcWCcWDcWEcWFcWGcWHcWIcWJcWKcUAcWLcWMcWNcWOcWPcWQcWRcWScWTcWUcWVcWWcWXcQicSncWYcWZcWZcQZcRacBPcOYcQkcQkcQkcQkcQkcXacXbcXccXdcXecXfcXgcXhcXicXjcQkcBOcXkcXlcXlcXlcXmcXmcXmcXmcXmcXncXocXpcXqcXrcNkcXscNkcXscNkcXtcWiaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHcERbGHaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNxcWjcNzaabcNxcWjcNzaaacNxcWjcNzaaaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcXucXucXucXucXucXucXucXvcXucXucSUcXwcXxcVjcWrcUicXycUicUicXzcRRcXAcXBcUrcXCcXDcRRcXEcRXcTecXFcXGcXHcWHcXIcXJcXKcXLcXMcXNcXOcXLcXPcXQcXRcXScSdcXTcXUcXVcXWaabcTocXXcXYcXZcQZcRacBQcYacYbcYbcYbcYccQkcYdcUMcYecYfcURcYgcUTcUTcURcYhcQkcBOcYichfcsLcYjcYkcBPaaaaaacBRcYlcYmcYncYocYlcYmcYpcYqcYlcYmcYrcBRaabaabaabaabaabaabaabaabaabaabbGHcERbGHbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNxcWjcNzaaacNxcWjcNzaaacNxcWjcNzaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcXucYtcYtcYucYvcYwcYwcYxcYycYycYzcYAcYBcVjcWrcVjcYCcVjcVjcVjcRRcYDcYEcYFcYGcYHcYIcYJcYKcYLcYMcYMcYMcYNcYOcYPcYQcYRcYScVCcQPcYTcYUcYVcYWcYXcSdcXTcYYcYZcZacZbcSncZccWZcWZcQZcRacBQcOYchfchfchfckJcQkcZdcZecZfcZgcURcZhcZicUTcZjcZkcQkcBOcYichfcsLcJGcsLcBPaaaaaacBRcZlcZmcZncxNcZocZpcZqcxNcZrcZscZtcBRaabaabaaaaaaaaaaaaaaaaaaaaaaaabGHcERbGGbGGbGHaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNxcWjcNzaaacNxcWjcNzaabcNxcWjcNzaabaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacXucYtcYtcYucZucZucZucZvcZwcZxcSUcZycZzcZAcZBcZCcZDcZEcZFcZFcZGcZHcZIcVjcVjcVjcZJcZKcZLcZMcZNcZOcZPcZQcZRcSUcZScZScZTcVCcQPcZUcZVcZWcZXcZYcSdcZZdaadabdacdadcQZcQZcQZcQZcQZcRacBQcOYdaecsLcsLckJcQkdafcSAcSAdagdahdaidajcUTdakdalcQkcBOcYicMfcsLcuccTBcBPaaaaaacBRcMkcJKcJKcxNcMkcJKcJKcxNcMkcJKcJKcBRaaaaabaabaaaaaaaaaaaaaaacuQcuQbGHdamcuQbGGbGHbGHbGHcTMcTMaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamhaabcNxdancNzaaacNxdancNzaaacNxdancNzaabalvaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcXudaodapcZucZucZudaqdardardardardardardardasdatdaudavdawdawdawdaxdaydazdaAdaBdawdaydaCdaDdaEcZOdaFcZQcZRdaGdaHdaIdaJdaKdaLdaMdaNcYXdaOdaPdaQdaRdaSdaTcWXdaUcSndaVdaWdaWcQZcRacBPcOYchfcBNdaXckJcQkdaYcSAdaZdbacURdbbdbccUTdbddbecQkcBOcYichfcsLchfchfcBPaabaabcBRdbfcKZcJKcxNdbfcKZcJKcxNdbfcKZcJKcBRaaaaaaaabaabaaaaaaaaaaaacuQdbgbGGcERcuQdbhcuQdbibGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaalvaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcXudbjcZucZucZucZucZudardbkdbldbmdbndbodardbpdbqdbrcXxcVjcVjdbsdbtdbudbvdbwdbxdbydbzcSUdbAdaEcZOdbBcZQdbCcSUdbDcZSdbEdbFcSddaMdaNdbGcSddaPdaQcXTcXUdbHcXWdbIcTodbJdbKdbLcQZcRacBPcOYchfdbMdbMckJcQkcQkdbNdbOcQkdbPcQkcQkcQkcQkcQkcQkcBOcYichfcsLcsLdbQcBPaaaaaacBRdbRcJKcJKcxNdbRcJKcJKcxNdbRcJKcJKcBRaaaaaaaaaaabaabaaaaaadbScuQbGGbGGcERcuQbGGbGGbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwamhalvalvalvalvalwalvalvalwdbTaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXudbUcZwcZucZucZudbVdardbldbWdbXdbYdbZdcadcbdccdcddcecVjdcfdcgdchdcidcjdckdcldcmdcndcodbrcXxdcpdcqcZMdcrcSUdcscZSdctdcucSddaMdaNcYXcSddcvdaQcXTdcwdcxcZadcycSndczdaWdaWcQZcRacBQcOYdcAcuccABckJdcBcQkcQkdcCcQkdcDdcEdcFchfdcGdcHcsLcBOcYichfcsLdcIcTBcBPaaaaaacBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRaaaaaaaaaaaaaabaabaaaaaabGHbGHbGHcERcuQdcJdcKbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucXucXudcLdcMdcMdcMdardcNdcOdcPdcPdcQdcRdawdcSdcTdcUdcVdcWdcXdcYdcZddaddbddcddddcYddeddfddgddhddiddjddkddldbDcZSddmddncSddaMcSdddocSddaPdaQcXTcXUddpcXWdbIcQZcQZcQZcQZcQZcRacBQddqcYccuccTBddrddsddsddsddtchfdduddvddwchfddxcYbcYbddyddzcMfcsLcsLcBPcBPaaaaaaddAaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaabaaabGHcJQddBddCcuQddDddEbGGbZZaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddFcXucZucZucZudcMaabaabdarddGddHdcPdcPddIdarddJddKddLddMddNddOddPcSUddQddRddScVjddTcSUddUddVddWddMddMddXddYcSUddZcZSdeadebcSddaMcSdcZUcZVdecdeddaRdeedefcWXdegcSndehdeideicQZcRacBQdejdekchfchfcOYchfchfcsLdelchfchfdemchfchfdendeodepdeqdercBPcBPcBPcBPaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaabaabbGHdbgcASbZYcuQcuQcuQbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucZucZucZudcMaabaaadardesddHdcPdcPdetdardeudevcSUdewdexdexdeycSUdezdeAdeBdeCdeDcSUdexdexdexdewcSUdeEdeucSUdbDcZSdeFdeGdeHdeIdeJdeKdeLdeMcWUdeNcXUdeOcXWdbIcTodePdeQdeRcQZcRacBPcBPcOYcprdeScOYdeTchfcsLdeUdeVdeWdeXddsddsdeYcYichfdeZcBPcBPaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGHbGHbGHbGHdfabZYcuQdfbdfcbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcLdfdaaaaaadardfedffdcPdcPdfgdardfhdfidfjdfkdfldfmdfndfodfpdfqdfrdfsddkdfodfldfldfldftdfjdfudfvcSUdbDdfwdaMdfxdfydeLdfzdfAdfBdfCdfDdfEdfFdfGcZadcycSndfHdeideicQZcRacBPcsLdfIdfJdfKdeYcsKchfcsLcsLcsLcYidfLcsLcXkdfMddzcuQcERbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfNdfOcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfRdfSdfSdfTdfSdfSdfUdardfVdcOdcPdcPdfWdardaGdfXcSUcSUdfodfodfodfodfYdfZdgaddMdgbdfodfodfodfocSUcSUdgcdgdcSUdbDcZSdgedgfdfydggdghcSdcSddgicXPdggcXUdgjcXWdbIcQZcQZcQZcQZcQZcRacBPcTBcsLdgkdglcsLdgmchfchfdgnchfdgocpscJGdgpchfchfcuQcERbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgqdgrcJQdfNbZYbGGbGGbGGdgsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgvdgxdgydardgzdgAdcPdcPdgBdarcSUdgCcSUdgDaacdgEdfodfodfodfodgFdfodfodfodfodgEaacdgDcSUdgGcSUcSUdbDcZSdgHdeHdgIdgJdgKdgLdgMdgJdgMdgJdgNdeLdgOdbIdgPdgQdgQdgQdgQdgRdgSdgTdgTdgUdgVdgTdgTdgTdgWdgXdgYdgodgZchfdgochfdhacuQcERbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMpbGHcJQcuQdhbbGGcQwdfNbZYcuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgwdhddhedardhfdhgdcPdcPdhhdardhidhjdhkaacdhldhmdhmdhmdhmdhmdhndhmdhmdhmdhmdhmdhoaacdhpdhqdhrcSUdhsdaIdhtdhudhvdhwdhxdhydhzdhAcSddhBdhCdhDdhEdbIdhFaaaaabaabaaadhGdhHdhIdhJdhKdhLdhMdhNdgTdhOcsLcsLdhPcpsdhQcYicsLcsLcEGaYNdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhTdhSdhSdhSdhSczDcuQbPAcAUbGGdhUcMpcuQcuQcuQdbhcuQdfNbZYcuQdhVbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdhWdgvdhXdhYdardfVdcOdcPdcPdhZdardiadibdibaaadicaacaacaacaacaacaacaacaacaacaacaacdicaaadibdibdiacSUdaGcZSdhEdiddiedifdigdihdhEdifdhEcXWdhEcXWdhEdbIdhFaaaalwalwdiidhHdijdikdildimdindiodipdgTcsLcsLchfdgodiqchfcYicXkdfMdhRcFGditditditditditditdiudivditditditditditditdiwdixdiydizdiAdiBdiCdiCdiCdiCdiDdiEdiFdiCdiCdiCdiCdiGcjUcuQdfcbGGdiHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiIdfSdfSdfSdfSdfSdiJdardiKdiLdcPdcPdiMdardiNdiOdiPaabdicaacdiQaaaaaaaaaaaadiQaaaaaadiQaacdicaaadiRdiSdiTcSUdaGcSUaabdiUaabdiVdiWdiXdiYdiZdiYdjadiYdjadjbdjcdhFaaaalwaabdjddgSdjedjfdjgdjhdjidjjdjkdgTdjlcsLcsLcYidjmchfcYicYidjnbGHbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHdjobGGcuQcTLbGGcuQcuQbZZbZZcxScuQdjpbGGdjpcuQdjqbZYdjrbGHbGHbGHbGHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjsdiLdcPdcPdjtdardjudibdjvaaadjwdjxaaaaaaaaaaaaaaadjyaaaaaaaaadjzdjAaaadibdibdjucSUdaGcSUcQZdjBcTodjBcQZdjBcTodjBcQZdjCcTodjDcQZaabdhFaaaalwaabdjEdgSdjFdjfdjGdjHdjidjIdjJdjKdirdjLdjMcYicpscsLdjNdgochfcBPaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdjOcLhcuQdjPbGGcuQaaaaaaaaaaaacuQbGGbGGdbgdjQdjQdjRdjSdjQaaaaabaabaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjUdcOdcPdcPdhZdardjVdjWdibaaadicaacaaaaaaaabaabaabaabaabaaaaaaaacdicaaadibdjXdjYcSUdjZcSUcQZdkadkbdkccQZdkddkedkfcQZdkgdkhdkicQZaabdhFaaaalwaaadjEdkjdkkdkldkmdkndkodkpdkqdgTdkrdgochfdgodkschfdktdgocBNcBPcBQcBQcBQaHQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdkucuQcuQcQxbGGcuQcuQbZZbZZcuQcuQbGGdkvcLhdjQdkwdkxdkydjQaaaaaaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdardardardardardardarcSUdiadibaaadicaacdiQaabaabdkzdkAdkBaabdkCaaaaacdicaaadibdiacSUcSUdaGcSUcQZdkDdkEdkDcQZdkFdkGdkFcQZdkHdkIdkHcQZaabdhFaaaalwaaadjddgSdkJdkKdkLdkldkMdkNdkOdgTdkPdkQdkRdkSdkTcsLcYicYidkUdkVdkWcsLdkXaHQaaaaabaaabZZbZZbZZbGHbGHbGHbGHbGHbGHdkYcJQcuQdkZbGGbGGcuQbGGbGGbGGbGGdhbbGGdfPdjQdladlbdlcdjQaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaacaacaabaabaabalwalwcSUcSUdlddibaaadjwdjxaaaaaaaabdledlfdlgaabaaaaaadjzdjAaaadibdlhcSUcSUdaGcSUcQZdkDdlidkDcQZdkFdljdkFcQZdkHdlkdkHcQZaabdhFaaaalwaaadjddgSdgSdgSdlldlmdlndlodlndlmdkPdlpcsLdlqdlrdfMddzcYidlscBPcBQcBQcBQdltaabaabaaabZZdludlvcuQbGGdlwdlxdbgcuQdlybGGcuQdlzbGGbGGdlAbGGbGHbGHbGHbZZbZZbGHdjQdlBdlCdlDdjQaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabalwcSUcSUdiadibaaadicaacaaadlEaabdlFdlGdlHaabaabdiQaacdicaaadibdiacSUcSUdaGcSUcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZaabdhFaaaayiaaadjdaaaaaaaaadlIdlmdlJdlKdlLdlmcsLdlMcsLcsLdlNdlOcXkdlPdlQcBPaaaaaaaaaaaaaaaaabaaabZZdlRdlSdlAbGGdgrbGGbGGdlAdjobGGcuQcuQcuQcuQcuQbGGbGHaabaaaaaaaaaaabdlTdlTdlUdlTdlTaabaabdhcaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcSUdjXdjYdibaaadicaacaaaaaaaabaabaabaabaabaaaaaaaacdicaaadibdjVdjWcSUdlVcSUcSUcSUcSUdlWdgQdgQdgQdgQdgQdgQdgQdgQdgQdgQdlXaabaabaabdjEaaaaaaaaadlYdlmdlndlZdlndlmdmadmbdfMdfMdmcdmddmecBPcBPcBPaaaaaaaaaaaaaaaaabaaabZZdludmfcuQdbgbGGbGGdmgcuQdmhbGGbGGbGGbGGbGGbGGbGGbGHaabaaaaaaaaaaabaaadlTdmidlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUdjudibdmjaaadjwdjxaaaaaaaaaaabaaaaaaaaaaaaaaadjzdjAaaadibdibdjucSUdmkdmldmmdaGdmndlXaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmpdmqdmrdmsaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMpbGHaabaaaaaaaaaaabaaadlTdmvdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUdmwdmxdiPaabdicaacdiQaaaaaadiQaaaaaaaaaaaadiQaacdicaaadiRdmydmzcSUdmAcSUcSUcSUcSUcSUcSUaaaaaaaabaaaaaaaaadmoaaaaaadmBdmBdmBdmBdmCaaaaaaaabdlYdmDdlmdmEdlmdlmaaaaabaaaaaadmFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHdlSdmGbGHdmHaabbGHbGHbZZbZZcMpbGHaaaaabaaaaaaaaaaabaaaaaadmIaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdmJdmKdmLaaadicaacaacdmMaacaacdmMaacaacdmMaacaacdicaaadmNdmKdmOcSUdmPdmQdmRdmSdmTdmUdmVdmWdmWdmXdmWdmWdmWdmYdmWdmWdmZdnadnbdncdmCaaaaaaaabdndaHQdlmdnedlmdnfaabaabaaaaaadngaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaabpaaaaaabGHdnhdnibGHdnjaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaadnkaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnlcSUcSUdnmaaadnndhmdhmdnodhmdhmdnodhmdhmdnodhmdhmdnpaaadnmcSUcSUcSUdmPdnqdnrdnsdntdnudfoaaaaaaaabaaaaaaaaadmodmBdmBdmBdnvdnwdnvdmCaaaaaaaabaabaHQdnxdnydnxaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaabZZdnzbZZbZZaabdhcaaaaabaaaaaaaabaaaamWamWalwayiaabaabaabaabdnAaabaabaabaabdhcamhamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUcYNdnBdmLaabaabaabaabaaaaaaaaaaaaaaaaabaabaabaabdmNdnCcYNcSUcSUdnDcSUcSUcSUcSUdfocSUaabaabaabaabaabaabdmodnEdnFdnEdnFdnGdnFdmCaaaaaaaaaaabaHQaaaaaaaaaaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaabZZdnHbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaaaaaaabaaaaabaaaaaadnIaaaaaaaabaaaaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacSUcSUdnBdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnJdnCcSUcSUcSUdnKdnLcSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnMdnNdnOdnPdnQdnRdnSdnTaaaaaaaaaaabaHQaHQaHQaHQaHQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaabZZdnUbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaadnVdnVdnVdnVdnVaabdnWaabdnVdnVdnVdnVdnVaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUaaacSUcSUdnXcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaaaaaadnYdnZdnZdnZdnZdoadobdocdoddoeaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabZZdofbZZaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdogdohdohdohdohdoidojdokdoldoldoldoldomaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdaGdaGdondoodoodopaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdnZdoqdordosdnZdnZdnZdnZdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdotdoudouaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdovdovdovdovdovaaadnWaaadovdovdovdovdovaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdjZdaGdowdoxdoydozaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoAdoBdoCdoDdoEdoFdoGdoHdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaaaamWaaaaabaaaaabaabaabaaadnWaaaaabaaaaabaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdoJdaGdoKdoodoodoLaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoMdoNdoOdoPdoQdoRdoSdoTdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaamWaaadnVdnVdnVdnVdnVaabdnWaabdnVdnVdnVdnVdnVaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnlcSUcSUcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaabaabdjEaabdnZdoUdoVdoWdoXdoYdoZdpadpbdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdogdohdohdohdohdoidojdokdoldoldoldoldpcaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdpddpedpddpfdpgdphdpidpjdpkdpfdpfdpfdpfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdovdovdovdovdovaaadnWaabdovdovdovdovdovaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddpldpmdpddpfdpfdpndpodpfdppdpqdpqdppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayiaaaaabaaaaabaaaaabaaadpraaaaabaaaaabaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpsdptdpudpvdpfdpwdpxdpydpfdpzdpAdpAdpBdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaadnVdnVdnVdnVdnVaabdnAaabdnVdnVdnVdnVdnVaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpCdpDdpEdpFdpGdpHdpIdpJdpGdpKdpLdpMdpNdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdogdohdohdohdohdpOdpPdpOdoldoldoldoldpcaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaadpddpQdpRdpSdpTdpUdpVdpWdpXdpYdpZdqadqbdqcdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdovdovdovdovdovaaadnAaaadovdovdovdovdovaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddqddqedqfdpfdqgdqhdqidpfdqjdqkdqldppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaaaaabaabaabaaaaaadnAaabaaaaaaaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqpdqodqpdqmdqmdqqdqrdqmdqpdqsdqpdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaadnAaaaaaaaaaamWamWamWayiamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdisdqudqpdqvdqwdqxdqydqvdqpdqzdqAdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdqBaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqndqudqpdqvdqwdqxdqydqvdqpdqzdqDdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqEdqmdqmdqudqpdqHdqwdqIdqJdqKdqpdqzdqmdqmdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqmdqMdqpdqNdqwdqxdqydqvdqpdqOdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqPdqQdqRdqSdqTdqydqUdqVdqWdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqXdqpdqYdqZdqxdqydradqpdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqmdqXdqpdqHdrbdrcdqydqKdqpdqXdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqmdqXdqpdqvdqwdqxdqydqvdqpdqXdqmdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqXdqXdqpdqvdqwdredqydqvdqpdqXdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrgdrfdrhdridrgdrfdrfdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrkdrldrmdrndrodrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrpdrqdrrdrsdrtdrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrudrfdrfdrvdrvdrwdrxdrvdrfdrfdrudqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrudrfdrydrydrzdrAdrsdrydrydrfdrudqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrBdrCdrDdrEdrFdrGdrHdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrIdrmdrJdrKdrLdrsdrMdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrfdrfdrfdrydrAdrNdrOdrNdrPdrydrfdrfdrfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrRdrfdrfdrSdrzdrTdrNdrNdrNdrUdrzdrVdrfdrfdrWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrfdrfdrfdrIdrXdrYdrZdrNdrzdrMdrfdrfdrfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrBdrzdsadsbdrydrzdrHdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrydrzdscdsddrzdrzdrydrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaacaacaacaacaaeaafaaaaaaaaaaaaaaaaaaaaaaadaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaacaagaaiaaiaajaaiaahaakaaeaafaaaaaaaaaaaaaadaakaalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaamaaoaaiaaiaaiaaiaaiaaiaanaahaapaafaaaaaaaadaaqaasaaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaapaakaataaiaaiaaiaaiaavaaiaaiaaiaauaapaafaadaaqaaxaasaaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaapaagaazaahaacaaeaaAaayaaCaacaacaaDaakaakaakaamaaEaaxaasaaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaagaaiaaFaaiaaGaaBaaIaaiaaHaaiaaiaaiaaiaaiaaiaaKaaxaaJaacaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaaiaaiaaiaaiaaGaaBaaiaaiaaiaaiaaiaaiaaiaaiaaiaauaacaapaafaaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOaaiaaiaaiaaiaaPaaBaaiaaiaaMaaRaacaacaataaiaaSaaBaaTaahaakaaeaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaiaaiaaiaaiaaiaaBaaiaaiaaBaaiaaVaaiaaBaaiaaiaaBaaWaaiaaiaahaapaafaaaaadaaeaacaacaacaacaacaacaacaaeaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaXaazaaiaaiaaiaaYaaiaaiaaBaaZabaaaSaaBaaiaaiabbaaiaaiaaiaaiaahaapaacaapaagaaiaaiaaiabcaaiaaiaaiaahaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUabdabeaaiaaiaaiaaRaaiaaiaaBaaiaaiaaiaaBaaiaaiabfaaiaaiaaiaaiaaiabgabhabgaaiaaiaaiaaiaaiaaiaaiaaiaaiaaQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaGaaGaaiaaiaaiaaYaaiaaiaaBabjaaVaaiaaBaaiaaiabbaaiaaiaaiaaiaaMaapaacaapaataaiaaiaaiaaiaaiaaiabkaaMaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaiaaiaaiaaiaaiaaBaaiaaiaahaacaacaaRaagaaiaaiaaBaaWaaiaaiaaMaapabiaaaablaakaacaacaacaacaacaacaacaakabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnaaiaaiaaiaaiaboaauaataaiaaiaaiaaiaaiaaiaaiaaiaaBaaiaaMaaeaakabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBabqabrabsaaiaaMaapaakaacaacaaeaataaiaaiaaiaaiaauaacaapabiaaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaataazabtaaMaapaagabuabvabwaahaamaaiaaiaaHabxaaKaaxabmaacaalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablaakaacabyaakaagaaiaaiaaiaaiaaiaaBaaiaaiaaMaaeaamaaEabAaasaaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaabBaaiaaiaaiaaiaaiaaiaaiabCabjaaMaapabiablabzabEaasaaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDaaiabFaaiaaiaaiaaiaaiaauaaeaapabiaaaaaaablabzaasaaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGabIabJabHabHabHabKabIabLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablaacaaeaataaiabRabSaaMaapaakabiaaaaaaaaaaaaablaaeaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQabUabVabTabXabWabZabZabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablaakaacaacaacaakabiaaaaaaaaaaaaaaaaaaaaaablabiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQacdabVabVaceabVabVacfabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQackaclabVabVacmabVacnabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqabIabIabIacrabIabIabIacsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQaczabVacAabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQacIabVacJabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabOabMabPabNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTabIabIabIabIabQacIabVacJacUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNacaabYaccabNabNaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQadeabVabVadfabQacIabVacJabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNacgachaciachacjabNaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQadeabVadyadzabQacIabVacJabQabIadBadAadCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoacpachaciachacpacoaaaaaaaaaaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQadSabVabVadTabQadUabVacfadWadVadVadVabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuactacwacvacwacxacyaaaaaaaaaabNabNabNabNabNaabaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQadeabVabVabVaesabVabVaetaeuaevaevaewabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaexaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaababNacBacCacDachacEabNaaaaaaaababNacFacHacGabNabNabNaaaaaaaabaabaabafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQadeabVabVabVaePabVabVabVaeQaeRaeRaeSabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaabNacKacLacDacMacNabNaaaaabaababNacbacPacOacRacSabNaaaaabaabafOaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTabIabIabIabIabIabIafgabVabVabIabIabIabIabIabIadCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOabNacoabNacVacWacXacYacWabNacZadaabPabNacWacQacWacWacWabNabNabNabNabNabNabNabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQafzafzafAafBafCabQafDabVabVabQafEafFafGafHafIabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababNadgadhacKadhacDadiadjadkaciadlachadmadbaddadcadqadradsacWaduadtadwadvadxabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQabVabVabVadyabVafPabVabVabVafQabVadyabVadyafRabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaabNadDadEadFadoacDadGachachadHadIadladJadnadpadladladNadOacWadPadPadQadRadRacoaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZagbagaagcaaaaaaaaaafZaaaaaaaaaagcaaaaaaaaaafZagdageagcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQagfabVabVabVabVaggabVabVabVaghabVabVabVabVagiabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNadXacwadYacwadZadLadKaeaadMaecaebaeeaedaegaefacwaehaehaeiaejaemaekaeoaeraeqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwagyagxagwaaaaaaafZagwagzagBagAagwagcaaaaaaagwagCagDagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQagEabVabVagFagGabQagHagIagHabQagJagKabVabVabVabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNadlaenaelaeAaeBaeCaeDaeAaeAaeEaepaeGaeHaeAaeyaeFaezaezaeIaeJaeLaeNaeLadRaeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwagXagYagwaaaafZagZahaahbahcahdahaagZagcaaaagwaheahfagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQabVabVahgabQabIabQabVahhahiabQabIabQabVabVabVabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNabNaeKaeWaeVaeXacWaeYaeYacWafaafaacWafcafcabNabNabNabNaeTaeMaeZaeUadRaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwahmahlahnaaaahoahpahaahaahqahaahaahpahraaaahsahtahuagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQahvahwahxabQaaaabQahyahyahyabQaaaabQahzahAahBabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababNafhachafiadiacWachafbacWachafdacWachafeabNafjafOabNaflafkafkafkafxabNafmafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZahIagZaaaaaaahJahpahaahKahLahaahaahpahMaaaaaaagZahIagZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQahyahyahyabQaaaacqahNahOahPacsaaaabQahyahyahyabQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNafJacWafKafLacWafMafNacWafMafNacWafMafNabNaabafOabNabNabNabNabNabNabNafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZahIagZagZagZagZagZagZagZahZagZagZagZagZagZagZagZahIagZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqahNahOahPacsaaaaaaaaaaaaaaaaaaaaaacqahNahOahPacsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNabNabNafJacWafSafTacWafnafnacWafoafoacWafpafpabNafqaabaabaabaabaaaaaaafraabafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahoahIailailailailailailagwaimagwailailailailailailahIahraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagkagjagmaglagoagnagqagpagragrafsagsagsaftagsagvabNaabaabaabaabaabaaaaaaaaaaabaaaafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCaiDaiEaiFaiGaiHagwahZagZahZagZahZagwaiIaiJaiKaiLaiDaiMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagMagLagNagOagPagQafvafuafUafwafUafVafYafWagPagWabNaaaaaaaabaaaaabaabaivaivaivaivaaaafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaiDahaahaahaajdagwahaahaahaahaahaagwahaahaajeahaaiDahMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNabNabNabNabNahjahkabNabNabNabNabNabNabNagtagtagtagtagtagtagtaaaaguaivagSagRaivaguaaaafOafXafXagUagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajzajAajBajCajDagwajEahaahaahaajFagwajGahaajHajIajzagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagVahDahCabNahEaigacWahGahFabNaaaaaaaaaagtahHahRagtahTahSagtaaaaivahUahVahVahWaivaaaaaaafOafXagTahXahYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaiaaicaibaieaidaitabNabNabNabNabNabNabNagtaifaijaiiainaikagtaaaaivaioaiqaipairaivaaaaaaaaaagTagTaisagTagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQajJaiuabNaolaolaolaolaolaolagtaiwaiyaixannaizagtaivaivaiAaiNaiBaiOaivaivaaaaabagTaiQaiPaiSaiRagTaaaanHaiTaiVaiUanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakAahaahaahaakragwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQaiZaiXajfajaahQahEaigabNaolaolaolaolaolaolagtajgajiajhajlajkajnajmajpajoajrajqajLajKaivaaaajMagTajOajNajQajPanAanHanHajRajTajSanHanHaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakRakPahZakRakPagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWajUakcakbakeakdakhakgahQakiaitalcaolaolaolaolaolaolajnakjanWakkannanWaklajjajjakmajjaksakwaktaivaabaabagTakCakxakEakDanAakFakGaoJaoJakHakJakIakvakKakMakLakNaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwalxalyahaalzalAagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWakOakSakQakVakTalaakYaldalbaitaleaolaolaolaolaolaolagtalfalgakkalialhajnaljallalkalnalmakfakuaivanHanHanAanAanAanAaloanAalpalralqalualtalFalCalGaiYaiYaiYalHaihaihaaaaaaaaaajbajbajbajbajbajbajbalIalJaaaabpaaaaaaalvaaaaabaaaamhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwamiamjahaamkamlagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWalKalMalLalOalNalQalPahQalRalSalcaolaolaolaolaolaolagtagtalUalTapPagtagtalValWaivalYalXalZaivaivanHambamaamdamcamfameanAamgaoJammampamnalFamqamrajVamvamsamuamtaihaaaaaaaaaajbajsajtajvajuajwajxajyaaaaaaaaaaaaaaaamWaabamUaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZamYamZanaagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQaqqahQahQahQahQahQahQamwaigapFapFapFapFapFapFapFapFamxamzamyamzamAamCamBamEamDamGamFamIamHamJauiaoJamKamKamKamKamLakIaoJapmamMamOamNamQamPamTamSanbamXandancaneaaaaaaaaaajbajXajwajwajwajwajxajyaaaaaaaaaaaaamWalvaaaanGaaaalvamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZagZagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomanianhankanjanlajJanmapGanpanoanranqantansapFanuanwanvanzanyanCanBanEanDanIanFanJanJanJanKaoJanLanNanManPanOanQaofaofanRanTanSalFanUanVajVajVanXanZanYaoaaaaaaaaaaajbaknajwakoajwajwajxajyaaaaaaaaaaaaamWaabaabanGaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomaocaobaoeaodaohaogaitapGaojaoiaonaokaopaooapFaoqaosaoraouaotaowaovaoxalWaozaoyaoBaoAaoDaoCaoJaoEaoGaoFaoFaoHaoLaoIaoIaoMaoPaoNalFaoQaoRaiYaiYaiYaoTaoSaihaabaaaaaaajbakyajwajwajwajwakzajyaaaaaaaaaaaaamWaaaaaaaoKaaaaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfaoUaomaoValEaoXaoWanlajJaigapGaoZaoYapbapaapdapcapFapeapgapfaphamyapjapiapkapSapAaplapCapBapEapDapIapHapJapJapLapKapNapMapOaoJapQaoJapRapNapTaiYapVapUapXapWaihaaaaabaabajbapYaqaapZaqcaqbajbalIaqeaaaaaaaaaamWaabappapnapqaabaabamWamWamWamWamWamWaqpamWamWamWamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsaprapuaptapwapraprapxapraprapvaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabapyaabalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakBakBakBaslakWakZaomaomaomaomakUaqsapFapGapGapGaqtaquapGapFaqvalUaqwaqwalTaqxaqxapPapSapSaqyaqzapSapSapSanAaqAaqCaqBanxanAanAaqAaqDanxaqFaqEanxanAaqGaqGaqGaqGaqHaihaihaqIaqIaqIaqIajbalsaqJaqKalsajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaabaabaabaabaabaabaabaqLaabaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqhaqiaqgaqkaqlaqlaqlaqmaqjaqoaaaaaaaaaalwalwalwalvalvaabaabaaaaqnaaaaabaabalvalvalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakXaqraqMaqNaqraqOapzaqQaqPakWaqRaqTaqSaqVaqUaqXaqWariaqYarjaqXaqXaqXaqXarkaqXaqXaqXarlarnarmarparoarrarqarsarsarsartarsaruarwarvarxaqXaryaqWaqXarzarBarAarCaqXariaqXaqXarDarEaqVaqXarFarHarGarJarIajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaqZaraaraaraaraarbaraaraaraaraarcaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaardaqhareargaqlarharharharharharfaaaaaaaaaalwaaaaaaaabaaaaabaaaaaaaqnaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalDarKalDarLalDarNarMarParOarRarQarTarSasdascaseaseasfaseasgaseaseaseasiashasiasjasiasiassaskasnasmaspasoasoasoasoasqasoasoasoasrastasAasvasuasxaswaszasyasAasAasCasBasBasDasEasEasEasFasHasGasIamRamVaaaaaaaaaaaaaaaamWaabappaqdapqaaaaaaaabarUaabaaaaaaaabarUaabaabaaaaaaarUaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarVaqharWarYarharharharharZasaaqoaaaaaaaaaalwaabarXarXarXarXarXaaaasbaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBamoasYasXasZasYasYataatbalBakWatcateatdatgatfatiathatkatjatmatlatnatjatpatoatratqatratsatuattatwatvatyatxatAatzatCatBatEatDatAatOatRatQaFLaFLaFLaFLaFLaFLaFLaxeatSatSatSatTatSatSatSarFatVatUatXatWajbaaaaaaaaaaaaaabamWaaaappaqdapqaabaabappapnapqaabaabappapnapqaabaabappapnapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasJaprapraprapwapraprapxapraprasKaaaaaaaaaalwaaaasMasLasLasLasLasNasPasOasQasQasQasQasRaaaalwaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaakBakBakBakBakBakBakBatYauaatZakWaubaudapFaufaueawKaugauhawKawKawKawKaujaukaucatdaulatdaucaunaumawHawHawHawHauAauoawVauEauEawXauEauFauEauEaFLauGauHaFLauHauIaFLauJauLauKauNauMauPauOauQajbajbajbajbajbajbaaaaaaaaaaaaaaaamWaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaabaqpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaabatFatFatFatFatFaaaatHaaaatFatFatFatFatFaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBauRauTauSakWauUauVapGauXauWaucauYavaauZavcavbauZavdavfaveavhavgaviaveavjaAzavlavkavmavlavoavnavzavravBavAaAFavCaCyavDaFLauIavFavEavFauIaFLavGavHayVayVavIavKavJavLaHEaaaaabaaaaaaaaaaaaaaaaaaaaaaaaamWaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaaaaabaaaaaaaaaautaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasSasUasTasWasVaaaaaaawBawBaudaudaudaudavMavNaucavOauWaucavPavRavQavTavSavUavdavfavVavXavWavZavYavjaAzawbawaawdawcawfaweawgaCyawhavAaAFawiawnawjaFLawAawDawCawEawAaFLawFawGayVawJawIawLawGawMaHEaabaabaaaaaaaaaaaaaaaaaaaaaaaaamWaaaappaqdapqaabaabappaqdapqaabaabappaqdapqaabaabappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaabarXarXarXarXarXaaaatHaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIatKatLatJatIatMatNatPawOawNawQawPawSawRauVaucawTauWaucawUawYawWaxaawZawWavdavfaxbaxdaxcaxfavYavjaAzaxpaxgaxqaxpaxsaxraxvaxtavBaxwaxyaxxaxAaxzaxCaxBaxEaxDaxFavFaxGawGawGawGaHEaHEaxIaxHaHEaHEaabaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawoawqawpawsawraaaawtawvawuawxawwapoaaaasMasLasLasLasLasNasPasOasQasQasQasQasRaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauvauwauxauuauzauyauBauyaxKaxJaxNaxMaudaudaudawKaxOaueawKaxPaxQawKaxSaxRawKaxTavfaxUaxWaxVaxYaxXavjaxZawHayaayeawHaygayfawVaynavBaypayqaCyaysayraFLaytayvayuayxaywaFLayyayAayzaHEaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabamWaaaaabaoKaabaaaaaaappaqdapqaaaaaaappaqdapqaaaaaaappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaxjaxjaxjaxiaaaaxkaxlaxlaxlaxkalwaxnatFatFatFatFatFaaaatHaaaatFatFatFatFatFaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIavvavyavxatIatMatNatNayCayBayEayDaudayFayGaxuayIayHawKauYayJauZavcayKauZavdayLaABayMaABayNaABayOaAzavlayPavmavlayQavnavzaAFavAayRayTaySayWayUaFLaFLaFLaFLaFLaFLaFLaxeaHEaHEaHEaoOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarUaabaabaabappaqdapqaabaabappaqdapqaabaabappaqdapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiayjayjayjaxiaaaaxkaykaylaykaxkalwaaaaaaaaaaabaaaaaaaaaautaaaaaaaaaaabaaaaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIawzawzawyatIaaaaaaayXayYauDauVayZaudazaazdazcazmazlawKazoazqazpavTaztazvazuazwaxLavdaxLaAzaxLazyazxazAazzawdazBazDazCazFazEazHazGazGazHazJazIawlazKazMazLawlazNazPazOazRazQazTazSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaqZazbarcaabaaaaaaaoKaabaabaabaabaoKaabaabaabaabaoKaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazeazgazhaxiaaaaxkazfazjaziaxkalwaabarXarXarXarXarXaaaatHaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauvaxoawzaxmatIatMatNazVauyawBaudaudaudaznazXazWazsazrawKazYazZawWaAcaAaawWaAdaAqaxLaAraBHaAsaxLazyaAtaxpaAuaAvaxpaAwavnaxvaAyaACaAAaAEaADaAHaAGawlaAIaAKaAJawlaydavqavqaxhaxhaxhdmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarUazUaAbaraaraaraazbaraaraaraaraazbaraaraaraaraaALaaaaaaamWaaaaAfaAfaAgaAgaAgaAgaAgaAgaAfaAfaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaAhazgazhaxiaaaaxkaAiaykaykaxkalwaaaasMasLasLasLasLasNasPasOasQasQasQasQasRaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIaymawzawzayhauyayoaAMauCaAmaAnaAlaAnaApaApaANaApaAoaElaAOaAPawKaxSaARawKaATaAVaAUaAWaxLaAZaAXaBbaBaawHaBiayeawHaBraBpaBsaBsaBsaBsaBsawVaBuaBtawlaBvaBRaBvawlaBwavqavqatGaupaurauqauqausaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaAYaBxaByaabaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaamWaAfaAfaBdaBcaBeaBgaBhaBfaBjaBeaAfaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaAhazgazhaxiaaaaxkaBkaykaBlaxkaabaBmatFatFatFatFatFaaaatHaaaatFatFatFatFatFaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIazkazkazkatIatMaBAaBzaBBaAmaCaaAnaAnaBCaApaBDaBqaBoaElaBEaBFauZavcaBGauZaAdaxLaxLaBJaBIaBKaxLaxLazxavlaBLavmavlaBNaBMaBPaBOaBSaBQaBsaCcaCfaCeaZIaCgavqaSPavqaChavqavqavsavqavtavpavuavwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaBTaabaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaAfaAfaAfaAfaBUaBgaBVaBgaBVaBXaBgaBgaBgaBWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazgazgazgaBYaaaaxkaBkaykaBlaxkalwaaaaaaaabaaaaabaaaaaaaBZaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaAkaAkaAkaAjaaaaaaaaaaaaaBnaAnaAnaAnaCiaCkaCjaCdaCbaElavPaCmaClavTaCnaCoavdaxLaEBaCpaEBaCqaEBaxLaAzazAaCrawdaCsaCuaCtaBsaCvaCxaCwaBsaCzaCBaCAaCCaZIaZIaCgavqavqaybaycatGavqawkauqauqawmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaCLaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaAfaCNaCOaCPaCMaCRaCQaCSaBgaBgaCUaCVaBgaCWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaCTazgazgaCXaaaaxkaCYaykaykaCZalwalwalwaabaabaabaabaDbaDaaDbaabaabaabaabalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBnaDdaDcaCEaCDaCGaCFaCHaDiaElauYaCIawWaCKaCJawWaDeaDfaEBaDgaFFaDhaEBaDkaDjaxpaDlaDmaxpaDoaDnaBsaDpaDraDqaBsaDsaDNaDNaDNaDNaDPaDPaDRaDRaDRaDRatGatGatGatGaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaDSaDKaDSaabaabaaaaabaaaaaaaabaabaaaaaaaaaaaaaaaaaaaAfaDUaDTaDWaDVaDYaDXaBgaBgaBgaDZaEaaBgaEcaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaEbazgaEeaxiaaaaxkaEfaykaykaxkaabaaaaabaaaaaaaabaaaaDbaEgaEdaaaaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaEiaEiaEiaEiaEiaEiaAmaElaElaElaDtaElaElaElaDuaAmaAxaAxaAxaAxaAxaAxaEBaEBaDvaDgaFFaDhaDvaDvaDvaEpaEpaEpaEpaDxaDwaBsaDyaDAaDzaBsaDsaDNaELaEMaEKaDPaENaDBaEOaEQaDRaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaabaabaaaaabaabaabaabaabaaaaDSaERaDSaaaaabaaaaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaAfaETaESaCPaEUaEWaEVaEXaBgaEZaEYaFbaFaaAfaFdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeaFfaFcaFfaFgaaaaFiaFhaykaFkaFiaabaaaaabaaaaaaaabaDbaDbaFjaFmaDbaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaFlaFoaDCaDDaFvaFwaFsaDFaDEaDDaDGaFvaFvaDIaDHaFBaFAaFyaFyaFyaFyaFyaFyaFyaDJaDLaGraDMaEjaDOavqavqavqavqavqaBsaDQaEkaEhaEnaEmaBsaEoaDNaFTaFUaFPaDPaFVaEqaFWaFYaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaabaDSaDSaFZaDSaDSaabaaaaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaAfaGbaGaaCPaAfaCPaCPaGdaGcaAfaAfaAfaAfaAfaAfaabaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaFeaGfaFgaaaaaaaGgaFiaGeaFiaGhaabaaaaabaaaaaaaabaGjaGiaGlaGkaGjaGnaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaGmaEraGpaEtaEsaEuaEsaEvaEsaExaEwaGraGraEzaEyaGraGraGraGraGraGraGraGraGraECaEEaEDaEGaEFaEHaAQaASaEIaASaAQaBsaEJaFnaEPaFnaFnaBsaDsaDNaFpaGNaFqaDPaFraGRaGQaEQaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaGTaGUaGSaGWaGTaabaaaaabaaaaaaaabaaaaaaaabaabaaaaaaaGXaAfaCPaAfaCPaGYaGVaGYaMzaGYaGYaGYaHbaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaGnaGnaGnaGnaGnaGnaGnaGnaabaabaGjaHcaHaaGZaGjaHdaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGoaHeaHgaHfaFuaFtaFxaHnaFzaHnaFCaHqaHnaHnaFEaFDaHnaHnaHnaHnaHnaHnaHnaFHaFJaFIaFKaHvaHxaEjaFMaAQaFNaASaFOaAQaBsaBsaBsaBsaBsaBsaBsaFQaDNaHCaFUaFRaDPaFSaHGaFWaHHaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabaGTaHKaHIaHJaGTaabaaaaabaaaaaaaabaaaaaaaGXaHNaGXaHNaGXaHbaGYaGYaGYaGYaGYaGYaGYaGYaGYaHOaHPaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaHQaHLaHQaaaaaaaaaaGnaHSaHTaHSaHRaHMaHUaGnaaaaaaaGjaHVaHXaHWaIaaHSaGnaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIbaIcaIcaIeaIeaFXaLAaIhaIhaGqaLAaGsaIlaIiaIiaIlaGtaIlaIoaIoaIoaIoaIoaIoaImaIoaIoaInaIraIpaEjaGuavqaAQaAQaAQavqavqavqaydaGvaGwavqavqaGxaDNaIwaFUaGyaDPaGzaGRaGQaEQaDPaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaHQaIzaHQaaaaabaGTaIBaIAaICaGTaIFaIFaIFaIFaIFaHNaHNaHNaGXaIDaGYaHOaHPaMzaGYaMzaMzaMzaGXaIEaGXaGXaGXaGXaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaIIaIGaIIaaaaaaaabaGnaIHaILaHSaHSaIJaHSaGnaIIaIIaGjaGjaIMaIKaIaaHSaGnaGnaIIaIIaIIaGnaGnaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaIbaIPaGAaGCaGBaGDaLAaGFaGEaGGaLAaGHaIlaIWaIZaGJaGIaJbaJaaJdaJcaJfaJeaJhaJgaJjaJiaJkaFFaFGaEjaGKavqavqavqavqavqavqavqavqavqavqavqavqaGLaGOaGMaHhaGPaDPaHiaHjaJyaJBaDPaabaJEaJFaJFaJFaJFaJFaJGaabaabaaaaaaaaaaaaaHNaJCaHNaaaaIFaGTaGTaJDaJHaGTaJIaGYaGYaGYaMzaJJaGYaJMaGXaGYaGYaGYaJKaMzaGYaGXaJNaJLaGXaGYaJOaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJPaJSaJQaaaaJRaJVaJTaabaabaIIaHSaIIaaaaaaaabaGnaJXaJYaJZaJWaJUaKaaGnaKbaHSaKdaKcaKfaKeaKeaKeaKeaKeaKeaKeaKeaKgaGnaaaaKhaaaaaaaaaaaaaaaaaaaaaaaaaIbaKkaHkaKmaKnaHlaLAaHmaKraHoaLAaGHaIlaKtaKuaKvaGIaJbaKqaKsaKsaKsaKsaKsaJgaKwaJiaFyaFFaFGaEjaFMaLPaLPaLPaLPaLPaHpaKOaKOaKOaKOaKOaKOaKOaDNaDNaHraDNaDPaDPaHsaDPaDPaDPaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaaaaaaaaaaaaaHNaKJaKMaaaaIFaKRaKTaKSaKWaGYaGYaGYaMzaGYaMzaKXaGYaGYaGXaGYaKVaKUaKXaIEaGYaGXaKZaKYaGXaGYaLcaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLaaLbaLaaLdaLeaLfaLeaLdaabaIIaLgaLhaaaaaaaGnaGnaGnaGnaGnaLkaLiaLlaLjaLnaLmaLmaLoaLraLraLqaLpaGnaHSaGnaGnaGnaLsaGnaaaaabaaaaaaaaaaaaaaaaaaaabaabaIbaLuaLtaLwaLvaLxaLAaKraLyaHtaLAaGHaIlaLCaLEaHwaHuaHzaHyaHAaLHaKsaLIaLIaJgaKsaJiaFyaFFaLJaEjaHBaLPaHFaHDaLNaLPaHZaHYaLRaLQaLTaLSaLVaLUaIgaIdaIkaIjaMbaMaaIsaIqaMeaMhaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaabaabaabaHNaHNaMfaMgaHNaIFaMiaGYaMkaGYaHbaGYaGXaGXaMmaGXaGXaMnaMzaMzaKXaMoaMlaGYaGXaGYaMqaMqaMqaMqaMqaMqaMqaMqaMqaMraMraMraMrafOaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLaaMpaLaaMsaLeaMtaLeaMsaGnaIIaMuaEAaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLsaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMvaLsaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaItaMCaIuaLAaGHaIlaIxaIvaINaIyaJbaMMaIQaIOaMPaMOaMRaMQaMSaJiaFyaFFaFGaEjaFMaLPaISaIRaLNaLPaITaMVaMVaMVaMVaMVaMVaMVaIXaIUaJlaIYaJnaJmaJoaNbaNbaJpaJqaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNfaNgaJIaMzaMoaKXaMkaGYaNhaGVaNlaIEaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNnaNmaMqaNpaNoaNqaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNraNtaNsaMsaNuaNyaNvaNwaNxaHSaNzaNCaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLsaGnaNDafOaNGaGnaNEaNFaNHaHSaNBaGnaNAaNIaKeaKgaIIaaaaaaaaaaaaaaaaNKaNJaNMaNLaNOaNNaNPaMAaiWaLAaJraNQaIVaLAaJsaIlaJuaJtaJwaJvaJbaNWaJzaJxaKiaJAaKlaKjaKoaJiaFyaFFaFGaEjaFMaLPaOjaKpaLNaLPaKxaMVaOpaOpaOpaMVaMVaOoaOraOraOsaMWaOqaOuaOvaOvaOwaKyaZzaMjaKQaKQaKQaKQaKQaMwaOBaOyaODaaaaaaaHNaGYaGYaOCaGYaMzaOFaGYaOEaOGaOGaOGaOGaOHaOGaOIaGYaGYaGYaGYaGYaGYaGYaGYaMzaGVaMqaOKaOLaOLaMqaOMaOJaONaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaOPaOQaORaMsaOPaOQaORaNwaKaaHSaOSaHSaHSaHSaHSaHSaGnaOTaOOaOVaOUaOWaGnaLsaGnafOaOXaNDaOYaPaaOZaGnaPcaGnaGnaGnaGnaPcaLsaIIaaaaHQaHQaHQaHQaPdaNJaPeaPbaPfaPhaPiaPjaMAaLAaLAaLAaLAaLAaJsaIlaIlaIlaIlaIlaIlaKzaKAaIoaIoaIoaIoaIoaIoaIoaPraFFaPwaEjaFMaLPaOnaKpaLNaLPaITaOpaPAaPAaPBaOpaMVaPCaPDaPDaPEaPFaOqaPGaPHaPIaPJaKBaKCaODaKQaKQaKQaKQaKQaODaPLaPMaODaabaabaGXaGYaGYaMzaMzaMzaHPaHPaGXaGXaGXaMzaMzaMzaGXaPNaPKaGXaMzaMzaGXaMzaMzaGXaGXaPPaPOaPRaPQaPTaPSaPUaOKaPWaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPVaSdaSdaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaPXaHSaHSaGnaLsaGnaPYaabaPYaGnaJYaOZaGnaQeaQcaGnaNAaKaaGnaLsaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQdaKEaKDaKFaKFaKFaKFaKFaKGaKIaKHaKFaKFaKFaKKaKKaKLaLzaKNaLBaEjaHBaLPaQzaKpaLNaLPaITaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOqaPGaPIaPIaPJaKBaKCaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQBaMzaQCaHOaQLaQJaHbaGXaOFaHbaGXaQKaGYaGXaQMaGYaGXaQOaQNaQPaOGaQQaOGaQSaQRaQUaQTaQVaQYaQWaMqaMraMrafOafOaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQXaRbaOQaRbaQZaQZaQZaRaaQZaQZaQZaRdaRcaReaReaReaReaRfaGnaHSaGnaRhaRgaRiaHSaRjaPcaLsaGnaGnaGnaGnaGnaGnaPcaGnaHSaRiaLkaHSaHSaHSaRkaRmaRlaRnaRnaRnaRnaRoaRnaRnaRpaRqaRlaRsaRraRraRraRraRraRraRraRtaRwaRwaRwaRwaRxaRwaRwaLDaRwaRwaRxaRwaRwaRwaRwaRzaLFaLKaLGaLLaLPaRDaLMaLWaLOaLXaOpaRJaRKaRLaOpaMVaRMaRNaRNaRGaMWaOqaRPaRQaRQaRIaLYaLZaOzaKQaKQaKQaKQaKQaOAaRVaRRaODaaaaaaaGXaGYaGYaGYaGYaGYaGYaQPaOGaOGaOGaOGaOGaOGaOGaKSaGYaGYaGYaGYaMnaGYaGYaMkaGYaRTaRSaRXaRWaRYaOLaOLaOLaRZaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSdaSdaSbaSfaScaSgaSiaSjaShaSkaSjaSmaSlaSjaSjaSnaGnaHSaGnaSoaHSaHSaSpaSqaGnaNIaKgaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaSraMAaSuaSwaSvaSvaSvaSxaSvaSvaSvaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSEaSDaMdaMcaMDaMBaMEaSJaSLaSCaSMaRwaSNaFFaSOaEjaMFaLPaSRaMGaSTaSSaMHaSUaSXaSWaSWaMIaMJaSZaSYaTaaTaaTbaTeaTcaMVaMVaTdaKBaThaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaMzaMzaIEaGXaGXaMkaMzaGXaTgaMzaGXaIEaGXaMkaQIaMzaGXaIEaGXaGYaQIaMkaGYaTiaMqaTjaQRaTlaTkaTmaQRaTnaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaRUaSdaToaSfaSfaTpaSdaRUaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIfaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaSraKbaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTvaTyaTxaTAaSAaPiaRwaTzaTzaTCaTBaTEaTDaTFaTDaMKaTGaTIaTzaTzaRwaSNaFFaTJaEjaMFaLPaOnaKpaLNaLPaMNaMLaMUaMTaMYaMXaNaaMZaNdaNcaNdaNeaNSaNRaNUaNTaNXaNVaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTXaUaaMzaGXaMzaLcaGYaGXaLcaMkaGXaTZaGYaGXaUbaGYaMzaUdaUcaGXaUeaGYaMzaIEaIEaMkaIEaUfaMqaUgaQRaUiaUhaUiaQRaUjaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaLdaLdaSdaOQaSdaUkaUoaUmaUlaSdaOQaSdaSdaLdaUnaUpaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUqaUxaUsaUzaUuaTuaUwaUAaUyaUyaUyaUyaUyaUyaUBaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUCaUHaUDaUFaSAaPiaRwaUJaUJaUJaUGaULaSCaUIaSCaULaUKaUJaUJaUJaRwaSNaFFaUMaEjaMFaLPaOjaKpaLNaLPaNYaUNaUQaUQaUQaUQaUQaUQaUQaNZaUQaUSaUSaUSaUSaUSaOaaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaURaUaaMzaUTaGXaGYaGYaGXaGYaMkaMzaGYaGYaGXaGYaGYaMzaMkaGVaGXaGYaGYaMzaUWaGYaMkaGYaUUaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdaRUaSdaSdaSdaSdaSdaSdaRUaSdaUZaLdaUVaUXaVcaVcaVcaVcaVcaVcaVaaTuaUuaVeaUqaVfaVeaVeaUuaTuaVgaVbaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVdaVmaVlaVnaUEaaaaSuaSzaSAaVpaVoaVraVqaUFaSAaPiaRwaVsaVsaTCaVtaVuaTDaTFaTDaVuaVvaVwaTzaTzaRwaSNaFFaSOaEjaObaLPaOdaOcaLNaLPaOeaUNaUQaVzaVAaVCaVCaUQaVBaOfaVDaUSaVGaVFaVHaUSaOgaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVJaMzaMzaGXaGXaMzaMzaVOaVPaMzaGXaHPaGXaGXaMzaMzaVRaVQaGXaGXaGXaQLaUWaGYaMkaGYaUUaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVSaVXaVSaVSaVYaVZaVSaVSaVXaWaaVWaLdaToaWbaVcaWdaWcaWfaWeaWhaWgaTuaUuaVeaUqaWjaVeaVeaUuaTuaWkaWlaWiaWnaWmaWoaWqaWraWpaWtaVjaabaUEaWuaWsaWwaWvaWxaUEaabaSuaSzaSAaWzaWAaWyaWCaWBaSAaPiaRwaSBaSCaWEaWDaULaSCaWFaSCaULaWGaSLaSCaSMaRwaSNaFFaWJaEjaMFaLPaISaOhaLNaLPaOiaWHaUQaWKaVEaVEaVEaWLaOlaOkaOmaUSaWQaWPaOxaOtaPgaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWVaWUaWXaWWaWYaGXaNhaGYaQIaMkaGYaGXaaaaGXaGYaGYaGYaGYaMkaXbaXaaWZaWZaWZaWZaXcaXeaXdaXhaXiaXfaXiaXgaVTaVTaVUaXkaXjaXlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVSaXmaXraXsaXtaXuaXvaXwaXxaXyaXzaXpaXnaSdaToaXqaVcaXBaXAaXFaXGaXFaXCaTuaXIaVeaXDaXHaXEaXHaXJaXLaXKaXMaXQaXQaXQaXQaXQaXQaXNaXSaVjaaaaUEaXOaWsaXPaWvaXRaUEaaaaSuaSzaSAaXTaXXaXVaXUaYaaSAaPiaRwaXWaXWaTCaXYaVuaTDaXZaTDaVuaYbaTIaTzaTzaRwaYcaIraYhaEjaMFaLPaLPaLPaLPaLPaPlaPkaPnaPmaPoaUQaUQaUQaUQaUQaUQaUSaPpaZVaPqaUSaOgaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYnaGXaGXaGXaGXaGYaMkaWVaHNaabaHNaGYaYsaYvaYuaYyaYxaYzaYEaYEaYEaYEaYFaYGaYAaYIaYJaYKaYJaYBaYJaYJaYCaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYDaYUaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpaYMaYLaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaToaYWaVcaYYaYXaZfaZaaZhaZbaTuaZjaUraZcaZlaZmaZnaZdaTuaZeaZgaXQaXQaXQaXQaXQaXQaXNaZraVjaabaUEaZkaZiaZpaZoaZqaUEaabaSuaSzaSAaZsaZyaZtaZAaZuaSAaPiaRwaUJaUJaUJaZvaULaSCaUIaSCaULaZwaUJaUJaUJaRwaZxaZFaZGaEjaPtaPsaPsaPsaPsaPuaPxaPvaUQaPyaPzaUQaQmaQfaQnaUQaQoaUSaZDaZVaZEaUSaQpaZKaQqaZNaZNaZKaZXaZWaZWaZWaZWaZWaZZaZYaZWbaabacbabbaebadbagbafbaibahbajbahbalbakaGYaGXbarbambanbaubavbaobaxbaybazbapbazbaBbasbaqbatbaFbaAbawbaIbaCbaEbaDaYPbaMbaNbaObaGbaQbaRbaHbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYDbaWbaXbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCbbDatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLaQrbbBbbAbbHbbGbbUbbIaQtbbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXbbWbbZbbYbcbbcabcdbccbcfbceaXibcmbcgbcobcpbchbcibcsbcjbaybcubckbazbcwbcxbclbczbaFbcAbcBbcCbcDbcnbcFaYPbcqbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYDbaWbcJbcKbcLbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCbdnbdoaTDbdpaTDbdsbdqbdzaRwbdubdtbdvbdDbdxbdwbdybdHaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQaUSaUSaQuaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubekbcpbelbembenbeobepbeqberbdYbazbetbeubevbewbdZbcAbcBbcCbcDbaEbedaYPbegbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMbeFbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbfdbfnbfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjaQvbflaSQbfrbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbfSbfRbelbfYbfZbeobfTbazbfVbfUbfXbfWbgfbczbczbazbazbcBbcCbcDbcnbggaYPbgabgibgbbgkbgcbgmbaTbaTbgdbaVaaaaaaaaaaaaaaaaYDbaWbgobeCbeCbeCbgpbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehaVSaVXaVSaVSaVYaVZaVSaVSaVXbejbgeaLdbghbeEaSdbgsbgsbgtbgsbgjaMsbgvbglaSfbgnbfcbgzbgzbgqbgrbgzbgubgzbgzbgzbgDbgzbgzbgwbgFbgAbgCbgBbgEbgCbgHbgCbgCbgCbgCbgIbgMbgJbgzbgzbgKbfcbgQbgxbgSbgLbgObgNbgTbgPbgPbgPbgPbgPbgPbgPbgVbgUbhabhbbhcbhdbhebgWbgYbgXbdDbdDbhfbgZbhgbgZbhgbhhbhjbhibhkbhpbhqaUSbhrbhlbhtbhmbhvbhvaWMbhxaWNbhzbdTbhobhubhsbhsbhwbdTbhAbhCbhBbhEbhDbhDbhFbhHbhGbfMbhIbhJbhPbhQbhRbebbdXaTgbaubhKbhTbhTbhUbhVbhTbhLbazbhXbhNbazbhObhSbczbhWbazbhZbhYbiabcDaYPaYPaYPbibbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabicbikbilbeCbeCbimbinbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgyaSdaSdaSdaSdaSdaSdbgyaSdaUZaLdbidbieaSdbirbisbitbitbiuaMsbivbglbifbgGbfcbijbipbiobiqbiqbixbiwbiwbiwbizbiybiybiAbiCbiBbiqbiqbiDbiybiFbiEbiGbiGbiIbiHbiKbiJbiJbiJbiLbfcbgQbgxbgSbgSbgSbgSbiMbgSbgSbgSbgSbgSbgSbiNbiUbiVbiWbiXbiObiZbiQbiPbiRbiVbiVbiVbjdbjebjebjebiSbhqbhqbhqbiYbiTbhqaUSbjabjjbhvbhvbjkbhvaWTbjmaWNbjcbdTbjobjfbjqbjhbjgbdTbjtbjibjvbjwbjxbjybebbebbjzbebbebbebbjBbjlbjBbebbdXaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjnbazbcDbcDbcCbcDbjpbjIaYPbjrbjNbjLblwbgRbjubjsbjAbjRaaaaaaaaaaaaaYDbjCbjGbjCbjCbjCbjHbjCbjJbjCbjGbjCaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbjQaLdaSdaOQaSdbjTbjSbjVbjUaSdaOQaSdaSdaLdbjWbeEaSdbjXbkcbitbitbiuaMsbkdbglaSfbgGbfcbgzbjZbjYbkgbkgbkabkibkbbkgbkebkgbkfbkgbkhbjPbkgbkgbkgbkgbkgbkjbkkbkgbklbkrbknbkmbgzbgzbkpbkobksbkqbkubktbkubkvbkwbkvbkvbkvbkvbkvbkvbkybkAbkzbkzbkzbkzbkBbkzbkCbkDbkzbkzbkEbkGbkFbkFbkFbkFbkFbkFbkFbkHbhqbhqaUSbkMbkNbkObkPbkPbkIaYdbjmaWNbkKbdTbdTbdTbdTbdTbkLbdTbkQbkRbkWbkSbfHbkYbebbhMbkTbkUblcbkVbleblfblgbebbdXaQLbaublhblibcpbljblkbcpbllbllbaubkXblabkZaYPbldblnblmbcDbcDblpbloaYPblqaYPblrbjKbjLblxblsbltbjKblzbjRaaaaaaaaaaaabicbmXblubmYbmYblDbeCblCblDblAblvblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdbgyaSdaToaSfaSfaTpaSdbgyaSdblyblEblBblFaSdblIblIbgtblIbgjaMsblJbglaSfaMsblKblKblGblMblMblMblMblMblMbkxblHblMblMblMblMblMblMblPblQblRblRblLblRblTblNblVblTblTblWblXblOblKblZblZblSblSblSbmbbmbbmbbmbbmbbmbbmbbmbbmcblUblUblYblUbmabmabmabmabmebmdbmabmcbmibmibmibmibmibmibmibmibmfbmfbmfaUSbmkbmlbmmbmmbmmbmmbmnbmoaYebmqbmrbmgbmjbmhbmtbmsbdTbdTbmubmybmzbmybmybebbmAbmvbmwbmwbmwbmwbmBbmxbebbmCbmHbaubmIbcpbljbljblkbljbcpbmDbaubmEbmGbmFaYPbcDbmJbmObmPbmPbmKbmRbmLbmTbmUbmMbmWboObmNbjMbjKbjKblzbjRbjRbjRbjRbjRbicbBTbDzbDzbDzbmQbeCblCbnbblAbeCbncbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbmSaSfbmVbndbnabnibnebnfbnibnhbngbnibnibnkbnjbnmbnlbnnbnnbnnbnobnnbnpbnuaMsbnvbnwbnqblMbnybnrbnAbnBbnCbnDbnsbnFbnGbnHbnIbnJblMbnKbnLblRbnxbntbnzblTbnEbnQbnMblTbnSbnTbnNbnSbnSbnSbnObgSbnPbmbaaaaaaaaaaaaaaaaaaaaabmcbnUbnRbnWbnVbnYbnXboaaYfbocaQsbohbmcaaaaaaaaaaaaaaaaaaaaabmibodbhqboeaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbogbofbofboibonbojbopbooborboqbosbebboubotboBboAboAboBbowbovbebbdXaGYbauboEboFbcpbljblkbcpboGboGbaubauboybauaYPbozblnbloboJboJboCbloaYPaYPaYPboDbjKbEFboHbjMbjKbjKbmZbAMboIbrMbrMboIboKbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdboLboPboLboLboLboLboLboLboPboLboLboQaSfboRbgGboUaSfboSaSfboTboXboYboVboWaMsbnwbnwboZblMbpabnDbnDbnDbnDbnDbnsbpdbnDbnDbnDbpeblMbnKbpfblRbpbbphbpiblTbpjbpcbpgblTbplbpkbpmbppbpnbnTbnObgSbnPbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpobptbpqbpubpsbpwaYgbpzbpxbpBbmcbmcbmcbmcaaaaaaaaaaaabmibodbhqbpAbpybpDbpCbpFbpEbpDbpGbpIbpHbpJbpMbpKbmqbpNbpLbofbpObpPbofbpRbpQbpTbpSbofbpWbpVbpUboBboAboAboBbpXbqabebbdXaTgbaubmIbcpbljbljblkbljbcpbcpbpYbqcbcpbqdaYPbpZbqbbqgboJboJbqebqgbqfaYPbqibqhbjKbjRbjRbqjbqkbjRbjRbjRbqnbjRbjRbjRbqpbjCbjCbjCbjCbqobeCblCbqoblAbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaLdaMsbgGbqqbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnPbmbbmbbqNbmcbmcbmcbqObqQbqPbqRbqSbqSbqTbqUbqSbqVaYibqWbqXbqYbqZbrbbrabmcbmcbmcbqNbmibmibodbhqbhqaUSbrdbrcbpMbrebmqbrfbrgbmqbrhbribpKbmqbogbofbofbrjbrlbrkbrnbrmbrpbrobofbrqbpVbrrboBboAboAbrsbrubrtbebbdXaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrEbrDboJboJbrFbrDbrGaYPbrHbqhbjKbjObGIbjMbjKbjKbrIbrJboIbrLbrMboIbrKbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbrObrObrQbrObrObrObrRbrObrObrPaabaSdaUkaSgbrSbqrbrUbrVbrWbrXbrYbrTbsabrZbqrbscbsdbsbbseblMbsfbnDbnDbqvbqxbsgbshbqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsibsnbsoblTbsmbqJbsqbqJbsrbnTbnObssbnPbgPbgPbspbsubstbmcbsvbptbswbqSbqSbsybsxbsAbszbsAaYjbsDbsCbsFbsEbsHbsGbmcbsIbsubsJbsLbsKbodbhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsMbpKbmqbpNbofbofbsRbsTbsSbsVbsUbsWbrobsXbebbqabrrboBboAboAboBbrubsYbebbsZbtebaubtfbaubaubtablkbthbtibcpbtjbtbbtlbtcbmUbtdbtgbtpbtqbtqbtkbtsbtmbmUbtobtnbtrbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbicbttbeCblCblDblAbeCblCblDblAbeCbtubicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbtvbtybtCbtDbtDbtzbtDbtDbtDbtzbrQaSdaSdaSdaToboRbqrbrUbtFbtGbrUbtBbtAbtHbtEbqrbtLbtMbtIblQblMbtObtPbtKbtJbtQbtNbtSbtRbtRbtRbtUbtTblMbnKbsdbtYbtZbtVbubblTblTblTblTblTbucbudbtWbufbugbnTbnObssbgSbgSbgSbtXbuebuabuibuhbujbqSbunbukbumbulbupbuoburbuqbutbusbuubuhbuwbuvbuybuxbuAbuzbuEbuEbuBbhqbuCaUSbmqbuDbuIbpKbmqbuFbuGbmqbuHbuMbpKbmqbogbofbofbofboibofbuJbofbsWbrobuKbebbuPbrrboBboAboAboBbrubuLbebbuNbuQbuObuSbuRbuUbuTbuWbuVbuVbuVbuVbuVbuVbuXbuZbuYboJboJboJboJboJboJbvdbvabvcbvbbjKbjKbjKbvebltbjKbvgbqnbwDbvhcUBbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvfbvlaOQbvlaSfboRbqrbvmbrUbvnbvnbvnbvkbrUbvobqrbvqbvrbtIbvsbvsbvsbvsbvpbvsbvtbnDbvvbvubvwbvwbvybvxblMbvzbvBbvAbvDbvCbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvEbnObvLbvNbvMbvPbvObvRbvQbvTbvSbuobvUbvVbvXbvXbvXbvXbvWbvXbvZbwabwbbvYbvUbwdbwcbmcbwebwgbwfbwibwhbwjbhqbhqbsNbmqbwkbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwlbofbofbwnbwobofbofbofbwqbwpbwrbebbqabrrboBboBboBboBbrubwsbebbwtbwvbwvbwwbwvbwubljbljbljbljbwybljbljbljbwzbvaboJboJboJboJboJboJboJbvdbvabvcbvbbjKboMboMboNboMbjKbwxbjRbwBbwAbwCbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbwEbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblFbwLbrUbwMbvnbvnbvnbvkbwMbrUbqrbwNbwObtIbvsbwPbwQbwRbwSbvsbwUbwTbwVblMbwWbwXbwZbwYblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxebxdbxdbxdbxfbxdbxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxtbxsbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwjbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxDbxCbmqbxEbdTbxFbxGbdTbdTbxHbxJbxIbxJbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbvbbjKbqlbqlbqmbqlbjKbvgbqnbwDbvhcUBbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzrbzsbqrbqrbqrbqrbqrbqrbztbqrbqrbqrbnKbnKbzwbvsbzubzvbynbzxbvsbzzbzybzAblMbwWbwXbwZbnDblMbnKbxabxbbzDbzBbzCbyvbzCbxbbyybzGbzEbzFbzIbzHbzKbzJbzMbzLbyFbzRbzNbzObzPbzQbzQbzPbzUbzSbvXbzTbxqbxqbyPbzWbyPbxqbxqbzVbwbbzXbAbbzYbzZbAabAdbzYbAcbxvbAlbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAmbAobAnbAkbAkbAqbAkbAkbAkbAkbAkbAkbAkbAkbApbAsbArbArbArbArbArbArbAtbAibAubAvbAvbAxbAwbAybAwbAzbAwbABbAAbACbAwbAFbADbAEbAHbAGbAGbAGbAGbAGbAGbAGbAIbALbAJbAJbAKbAJbBObjKbjKbrIbAMboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUkaSgbAVbAUbAXbAWbAWbAWbAWbAYbAZbBablQbnwbBcbBbbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBgbBfblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyybBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzRbBrbBsbBtbBubBvbBwbzUbBxbvXbBybyPbxqbBAbBzbBAbxqbyPbBBbxubBCbzYbzYbzZbBDbAdbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbDobBPbjKbjKbBQbjKbjKbjKbjKbBUbjRbqnbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCybCubzCbCvbCzbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbCAbBsbBtbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbAkbAkbAkbCWbDbbDbbDbbDbbDcbAkbAkbAkbAkbDdbAkbCZbDabAkbAkbDebDgbDfbDhbDibDibDlbDjbDnbDmbwvbwvbwvbwvbwvbwvbwvbDkbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqbDqbDsbDubDtbDxbDvbDvbDybDAbEHbmZbAMboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbDGbCbbCbbCbbCbbCbbCbbCbbDHbDCaOQbDCaSfbDIbCfbDEbDJbDLbDKbDMbChbDObDNbDQbDQbDWbDVbvsbvsbvsbynbDYbymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDZbDRbDSbDTbyvbxbbDUbzJbEbbzFbBnbBnbEfbDXbEjbzLbElbxlbEabEmbzPbzPbzPbzPbzUbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbErbEgbEhbEibEsbEkbEvbxvbEwbEnbEnbEobEobEobEobEobEobEobEpbEpbEqbEybEzbEzbEybEqbEpbEpbEtbEtbEtbEtbEtbEubEubEubEuaQwbEubEubPgbEubEubECbExbEEbwvbwvbEIbEIbEAbEAbEAbEAbEAbEJbDqbDqbDrbDqbwvbDqbDqbDqbDqbEMbEDbEDbEDbEDbENbEFbEFbEGbEGbEGbEGbEGbEGbEGbjRbjRbjRbjRaYUdsqdsldslbEObicaaabicbEPbDwbDwbEQbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbEKbELbELbCbbELbELbELbARbERaSdaSdaSdaTobEVbCfbEYbEXbEXbEXbFcbChbnKbFfbESbETbEUbFgbvsbwPbEWbynbFhbymbFibEZbFabFbbFlbFdbFdbFebFdbFnbFobxbbFqbFpbFjbFkbFrbFmbFsbyBbFubFtbBnboxbFybFxbEjbzLbFzbxlbFAbFvbFwbFFbFIbFGbFMbxmbxmbFBbFCbFDbFEbFNbFEbFPbFCaaabFHbxvbFRbFJbFKbFLbEsbzYbFSbxvbFUbFObFWbEobFQbFXbFYbFTbFZbFVbGcbGbbGebGdbGabGabGdbGfbGhbGgbEtbGiaQyaQxbEtaQAaRuaQDaRyaRvaRBaRAaRCbGvbEubGxbGqbGrbGybGrbGzbGzbEAbGubGAbGwbEAbGBbGEbGBbEAbGFbDqbEMbEDbGKbGLbGKbEDbGCbGDbEDbGNbGMbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabicdsudswdsvdsvbicaaabicbGObDwbGObDwbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbGRbndbHabCfbHdbCfbHebEXbHfbGQbChbHgbGSbGTbGUbFgbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHhbxbbxbbxbbHbbxbbHcbHibHjbBnbBnbBnbHnbDXbHobzLbHpbxlbHqbFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEobHLbHJbHEbHMbHGbHNbHObGabGabGabGabGabGabGabGabHPbHKbHRaRFaREbEtaRHaSFaROaSHaSGbIbbHUbHQbIbbEubIebGqbIfbHXbIgbIhbIhbIabIjbIcbIdbImbIlbIqbInbEAbIibIrbIkbEDbItbIwbIvbIobIpbIybEDbIzbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIAbjJbIubIubIubICaaabIEbIxbIxbIxbjJbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIGbCfbIHbIBbIIbIDbIDbIJbILbIKbIMbIMbIObINbDQbDQbDQbDQbDQbDQbIQbIPbIPbIRbITbxbbIVbIUbIYbIXbISbIZbJfbJbbxbbIWbJibyBbyCbDXbHjbBnbBnbJjbzJbzJbJmbJabJobJcbJdbJebJpbJgbJhbJsbJtbJkbJlbJubHsbJnbJvbJnbJvbJwbHsbHtbJqbJrbJybJxbJDbJzbJGbJEbJHbJrbJIbFObFObEobJAbJBbJCbJJbJKbEobHObGabGabGabGabGabGabGabJFbJLbJPbHRaSIbHRaSKbHQbHQaYkbHQaSVbIbbHUbHQbIbbEubJWbJZbJXbJTbJTbKcbKabKgbKebJYbJYbJYbKhbJYbKkbKbbKnbKdbKobKfbKqbKrbKibKibKibKjbEDbKubGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIAbKmbKmbKmbIFaaabIAbKmbKmbKmbIFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKybKxbKpaQZaQZaQZbndaSfaSfbCfbKCbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBbKHbzFbKIbKKbKJbKMbKLbKObKNbKQbKPbKSbKRbKVbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbFObLrbLjbLsbLlbLmbLtbLobEobLvbLubLxbLwbLzbLybLBbLAbGabLDbEtaTHaTLaTKaTNaTMbHQaTObHQaSVbIbbHUbHQbIbbEubIebGqbLNbLEbLPbLSbLQbLIbLTbLKbLLbLMbLUbLObLVbEAbLXbLRbLYbEDbLZbMfbMabIpbLWbMgbEDbKubGGbMhbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbMjbMibKpaSeaSebMbbMcaSebMdbCfbMebIBbMlbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMtbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObNdbEobMXbMYbMZbNabNfbNebNjbNgbNlbNkbNhbNibNnbNmbNqbNpbNrbLFaTQaTPbEtaTRaTTaTSaTUaSVbNAaTVaTWbGvbEubNKbNzbNLbNBbNBbNMbNDbNEbNFbNGbNHbNIbNJbNObNNbEAbNQbLRbNRbEDbNSbNPbNTbIpbIpbNUbEDbIzbGGbNWbGHaaaaaaaaaaaaaabbNXbNZbNVbNZbNVbNZbOaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbObaSdaSdbjQaLdaSdaSdbCfbOdbIBbIBbIBbCfbCfbCfaaaaaaaaabOebOcbOcbOfbOcbOcbOeaaaaaabKBbOgbKzbOibOhbOhbOhbOhbOhbOkbOjbOhbOlbOnbOmbOpbOobOrbOqbzJbOtbBnbOvbOsbDXbOwbOubOxbMEbMEbMGbOAbOybOCbOBbODbMGbFBbKYbFCbOEbOHbOFbOObOMbFCaaabOGbLdbOPbOIbOJbOKbOLbOKbOSbONbOXbFObOYbEobOQbOQbORbPabOTbOUbOVbOWbPcbPbbOZbOZbPebPdbPhbPfbEtbNoaUOaTYbEtbEubPgbEubEuaUPbEubEubEubEubPrbPmbGqbPvbLEbLPbPxbNBbNEbPnbPobPobPpbIdbPqbPybPsbPtbIrbPubEDbPzbPwbIpbPHbPBbPJbEDbKubPAbGHbGHaaaaaaaaaaaaaabbPKbPCbPDbPEbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbPUbPObPPbPQbPQbPQbPObKzbJfbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebPXbBnbBnbPYbDXbOwbOubQhbQfbQbbQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObQAbEobQDbQBbQGbQEbQHbQCbQJbQIbQFbQFbQMbQKbQFbQFbQObQNbQPbQLaVyaVxbQTbQSaWIaVIaYmaYlaWObQVbRebQXbRgbRfbGqbRabRbbRcbRjbRibIabRkbPobPobRlbRhbPqbRmbEAbRnbRnbRobEDbRpbRybRqbRzbIpbREbEDbKubRFbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbRubRvbRwbRxbRGbRHbRAbRGbRBbRCbRDbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbRJbRIbRKbRIbRSbRRbRTbRRbRRbRRbRRbRUbJfbKAbRLbxbbxbbRMbBnbzFbQdbRNbDXbRObRPbRPbRQbNYbRYbRXbRZbRVbRWbSbbSdbScbSabQgbSebMGbMKbKYbFCbSfbShbSgbSlbSkbFCaaabOGbSibSjbSibSibSibSibSibSmbSibSpbFObQAbEobSqbSnbSnbSobSrbOUbStbSsbSvbSubSxbSwbSybSvbSAbSzbSDbSBaWSaWRbSGbSGbSEbSHbSJbSIbSLbSKbSNbSMbSPbSObSRbSQbSQbSSbSUbSTbIabSWbIdbIdbSXbSVbPqbSYbTabSZbTfbTcbTbbTgbTdbTebTjbTebEDbEDbTkbPtbThbTibTibTibTibTibThbPKbPFbPDbPFbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbRAbRAbRAbTlbRGbTnbTnbRGbTobRAbRAbTpbWLbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbTtbTrbTqbTrbTubKzbPPbPQbPQbPQbKzbKzbJfbKAbTsbTxbxbbTAbBnbTBbQdbTvbDXbTwbBnbBobBnbPWbOwbTybTzbRVbRWbTCbTEbTDbTKbTFbTLbTGbTHbTIbTJbTJbTNbTMbTPbFCbFCaaabOGbSibTQbTObTSbTRbTVbTTbTWbTUbTXbFObQAbNebTZbTYbUbbUabUcbOUbUebUdbUibUhbUfbUgbUkbUjbUmbUlbUobUnbUqbUpbUsbUrbUubUtbUybUvbUDbQVbUwbQXbUxbUGbGrbUzbUAbUBbUCbUCbIabUIbUEbUFbIabUJbPqbUHbIabUKbUMbULbUObUNbUQbUPbUSbURbUUbUTbUWbUVbUYbUXbUXbUZbVbbVabQabVcbNZbNVbVdbNVbNZbVjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbVebVfbVgbVhbVibRGbVkbRAbVlbRAbRAbRAbRAbRAbTlbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebVmbOcbOcbOcbVnbOebPTbKBbKBbVobKzbPPbKzbKzbKzbKzbKzbJfbKAbTsbVpbxbbVrbBnbVqbVsbBnbVwbzEbBnbBnbVtbDXbOwbTybTzbRVbRWbMGbVubVvbVybVxbVzbMHbVBbVAbVDbVCbHsbVEbVFbHsbHtbHtbVGbSibVIbVHbVKbVJbVLbVLbVNbVMbVObFObVPbEobOUbVQbOQbVSbVRbOUbUebVUbVTbVVbVXbVWbVYbVTbUebVZbWebWabWbbWabWcbWabWdbWdbWhbWfbWgbWgbWgbWmbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbWnbLIbIabWobWrbWpbWqbWqbWvbWsbWtbWubWxbWwbWzbWybWBbWAbWAbWCbWEbWDbThbQabQabQabWFbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGbRAbRAbWHbWHbWHbRGbRAbRAbRGbWIbWJbWKbRAbWMbWNbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWPbTrbTqbTrbPUbWQbWRbKzbKzbKzbWQbKzbJfbKAbTsbWSbxbbWWbBnbzFbQdbBnbzJbWTbBnbBnbWUbDXbOwbTybWVbRVbWXbMGbXbbWYbWZbXabXdbMHbXcbXebXgbXfbXibXhbXjbFCaaaaaaaaabSibXpbXkbXlbXlbXmbXnbXobSibXrbXqbQAbXsbXubXtbXwbXvbXybXxbXAbUdbXzbXBbXDbXCbXEbXzbUebVZbXIbXFbXGbXHbXKbXJbWdbXMbXLbXObXNbXPbXRbXQbXTbXSbXVbXUbUUbXWbWqbWqbXYbXXbWqbXZbYbbYabYdbYcbWqbYebYgbYfbYibYhbYlbYjbYkbYjbYjbYjbTkbPtbThbTibTibThbYnbYmbYpbYobYrbYqbYsbQaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbYxbYwbYybYwbYAbYzbYBbYBbYBbYBbYBbYCbYEbYDbTsbYFbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbYQbRWbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZfbZibZhbZkbZjbZmbZlbZobZnbZrbZqbVTbVTbZpbZvbVTbVTbUebVZbZwbZsbZtbZubZybZxbWdbZAbZBbZzbZDbZCbZFbZEbZEbZGbZIbZHbZKbZJbUNbUNbZLbUNbZMbUNbZNbUNbZPbZObZObZQbZSbZRbZUbZTbZXbZVbZYbZWaYpbYjcacbZZaaaaaaaaabThcaabVbcadbYobQacajcalbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSicaybFOcaBcazcaAcaCcaDcaAcaAcaEcaGcaFcaIcaHcaKcaJcaMcaLbXAcaNcaPcaOcaRcaQcaTcaScaVcaUcaXcaWcaZcaYcbbcbabXQcbcbWgbWicbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqcbtcbscbubYjcacbZZaaaaaaaaabThcbwcbvbThbQabThbThbQabThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQcbScbVcbTcbUcbWcbYcbXccacbZcccccbccfccdcceccgccjcchccicckccqcclccmbEnccnbFOccoccpccrbFOccscaAccvcctccuccwccxbUecczccyccBccAccDccCccFccEccHccGccIbWaccKbZuccJccMccLccOccNccPbXNccQbXQbXQbXQccRbWgcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfcdecdhcdgcdjcdicdkbYjcdnbGHaaaaaaaaabThbThbThbThaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwcdGcdFbTybTycdHcdKcdIcdJcclcdOcdLcdOcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdScdNcclccmbEncdVcdUcdXcdWcdZcdYbFOcaAcebcctceaccucedbUececceecegcefceicehcekcejbUecelcembWaceocencencercepceqcetcesbXNceucevbXQcexcewbWgcbdcezceyceBceAceDceCceGcbfceEccZceFceFcbjceHceJceIceLceKceNceMcePceOceSbYjcacbGHceQaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGceRceRceRceRceRceTbRAbRAbRGbPIbPIbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceVceUceUceUceWaaaaaaaaaaaaaaaaaaaaaceXceZceYceZcfaaaaaaaaaacamcamcamcffcfbcdAcfcbYLcfdcbMcfecfgbYMbOwcfhcfjcficflcfkcfncfmcfpcfocfrcfqcfucfscftcftcfxcfvcfvcfvcfvcfvcfvcfwcfAcfycfzcfBcfDcfCcfFcfEcfHcfGcfIcaAcfJcctccucfKcedbUececceecfMcfLcfOcfNcfQcfPbUmcfRcfSbWabWacfUcfUbWacepbWdcfTcfVbWgcfXcfWcfZcfYcgabWgcbdcgccgbcgecgdcghcgfcggcbfcgiccZceFceFcbjcgjcgmcgkcglcgncgpcgocgrcgqcgvbYjcaccgscgtcgscgucgycgucgucguaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhchlchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFchDchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRGbRAbRAcikbRAbRAbRAciobRAcilbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPcipciqcamcitcfbcircisciyciubYMcivciwcixcizbYMcgQcgQciCcgSciAciBciEciDciHcgWciFciGciJciIciKcgWciMciLciNchcciPciOciSciQciRciTciVciUciXciWciZciYcjbcjacjdcjccjgcjecjfcjhcjjcjicjkceecjocjlcjmcjncjqcjpbUmcjrcjtcjscjuchCcjvcjvcjxcjwbWgcjycjAcjzcjCcjBcjEaYobWicjFcjHcjGcjIcjGcjGcjLcjJcjKcjPcjMcjNcjOcbjcjQcjRcbnbPtbGGcjTcjScjUcjUcjScjUcjYcgscjVcjWchZciackecjXcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckfbRGbRAbRAbRGckgbRAbRAckjckhbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFckicimcimckkcklcfbcfbckmckncfbcfbcisckqckobYMbYMbYMbYMbYMbYMckpcgQcksckrckxcktcktcktckucgWckvckwckwckwckzckyckBckAckDckCckFckEckHckGckJckIchcchfckKchhckMckLckOckNckPchhcebccuceaccuckRckQckUckSckTckVckXckWckYchrclackZclcclbclecldclgclfcljclhbWgbWgbWgbWgbWgclicllclkbWiclncjGcjGclmclocjGcltclpcbjclqccZclrclrcbjcbmclscbnbPtcgsclvcgscgscgscgscgscgscgscluclwcguclxclzclycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOclBcjZcjZclAciecieckbckbclHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRGbRAclFbRGclGclIbRAbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclJclMclKckncfbcfbclLclOclNclQclPclPclPclTcgQcgQcgQciCcgSclRcktclScktclVcgWckvckwclUckwclWcgWclYclXclZchccmccmacmbcmecmdcmhcmfcmgcmjcmicmlcmkcmocmmcmnchhcfJccuccucmpckRckQcmrcmqcmucjlcmscmtaYqcmvcmycmxcmAcmzcmCcmBcmEcmDcjvcmHchxcmFcmGcmJcmIcmKcmNcmLclpclncmMcjGcjGcjGcmQcmOclpcbjcmPccZclrclrcbjcmTcmRcbnbPtcmScmVcmUcgscmWcmYcmXcnbcmZcnacnfcgucnccndcnecgucgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnkcieclBciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgFcnhcnicnjcgFbYPbYPbYPcamcnmcnlcnocnocnocamcamcgQcnncnpcnrcnqcgQcnscntcgSclRcktcktcktcnvcgWckvckwckwcnucnxcnwcnzcnycnAchcchcchcchcchccnBchcchccnCcnDchhchhcnEchhchkchhchhcaAcnGcnGcaAcnFcnHcnJcnIcnLcnKaYrcnMcnPcnObQVcnQcmAcmzcnScnRcnUcnTcnWcnVchxcnXcnZcnYcobcoacoecoccodcofcodcoicoicoicodcogcodcodcohcojclrclrcbjcokclscbncomcolcooconcorcopcoqcoqcotcoscovcoucoxcowcozcoycoCcoAcoBcoDcoEcoFcoHcoGcoIaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoMcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoOceZcoNceZcoQaaaaabaaacamcamcamcamcamcamcamcoPcgQcoScoRcoUcoTclPcoVcoWcgScoYcoXcpfcktcoZcpacpbcpccpdcpecpgcgWcpicphcpkcpjcplcplcplcplcpncpmcppcpocpocpqcpqcptcprcpschfcaAcpvcpucpxcpwcpyckQcpzcnIcpBcpAcpDcpCcekcpEcpGcpFcpJcpHcpHcpIcpHcpHcpHcpKchxcpLcpScpMcpNcpOcpPcpQcpRcpTcpRcpUcpWcpVcpRcpXcpYcodcqacpZcdacbjcbjcqccqbcqfcqdcqecqicqgcqhcqlcqjcqkcqncqmcqpcqocqtcqqcqrcqqcqscqrcqrcqucqwcqvcqycqxcqCaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecqDckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqEcqGcgQcqHcgQcgQcqFcgQcgQcqPcgScqRcqIcqJcqKcqLcqMcqNcqOcqScqQcqTcpacqXcqUcqYcqVcqWcqWcqWcqWcrgcrdcqZcracrbcracrccrhcrecrfcrjcricrmcrlcrkcrncrpcrocrrcrqcrtcrscrvcrucrxcrwcrzcrycrAbXwbXwcrBcrEcrCcrucrGcrDcrDcrHcrDcrFcrIcrKcrJcpRcrNcrQcrLcrMcrLcrTcrOcrPcodcbjcrUcbjcbjcrRcrSclsbLRbPtcgscrVcgscgscrWcrYcrXcsacrZcsdcsbcsfcsecsgcsecsgcshcsgcsicgEcsncvdcsqcsraabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcssckbcstckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsucgQcsocspcoLcgQcsvcgScsycsxcszclRcsBcsAcswckvcsEcsCcsFcsAcsIcsHcsMcsDcsDcsNcsOcsGcsTcsQcsJcsKcsLcsUchfcsWcsLcsLcsXcsPcsYcsRcsScrnctacsZcsVctbctdctcctfctectgctcctccthctictictictictictjctlctkctmctmctoctnctqctpctsctrcpRcttctxctwctyctwctActzcrLctuctvctBbLRctCbLRcrSclsbLRbIictFctHctGcgscgscgscgscgsctIcqkctKctDcsccqkctEcqkclucqkctLcgEctOctQctPcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJctSckbctTctJcstckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcoSctUctUctVctUctUctUctUctUctUctUctUctUctUctUctUcoRcgQcskcqzctWcgQcsvctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWcuactXcuecudcuhcufctYctYctZcuicsJcsLcsLcubcuccujcsLcsLcsLcukculcugcrlcupcurcuqcticuscutcumceccutcuncuocuocuocuvcuucuucuucuucuwcuxceccuzcuycuBcuAcuDcuCcuFcuEcpRcuGcuHcrLcuIcrLcuKcuJcuOcuLcuScuRcuVbLRcuXcrSclscuMbIibPAcuNcuYcuPcuQbGGbGGcgscvccvecuTcuUcvfcuWcvgcvicuZcvacvbcgEcvjdoKdoFcvraaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvscjZcjZcjZcjZcjZcjZcjZcvhcvtckbckbckbckbcvvckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaabafOcngcvkcvlcvmcoLcoLcvncoLcoLcsucgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcsvcvpaaaaaaaaaaaacvqcvwcvzcvycvucvAcvDcvxcvJcvGcvKcvBcvCcvLcvEcvEcvFcvMcvHcvIcvIcvIcvIcvNcvIcsLcsLcaAcvPcvOcvRcvQcvTcvScuDcvUcvWcvVcwacvXcwecwbcuucuocwfcvYcvYcvYcvYcvZcwicwhcwccwdcwlcwkcwgbQVcwncwmcpRcwjcwrcwqcwtcwscrLcwocpRcpRbIicwpbIibIibIicwvcwJcwwbIibGGcuNcwKcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecoJcoJcoJcoJcoJcoJcwLckbcoMcoJcwMckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcsucwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLcqPcngaaacwPcwUcwQcwVcwNcwOcwWcwXcwRcwScwTcwZcwYcxbcxacxdcxccxfcxecxjcxgcvHcxkcxmcxmcxmcxocvIcsLcsLcxhcxhcxhcxhcxicxhcxrcxrcxscxhcxhcxlcxhcxtcxncxucxpcxucxqcxwcxvcxzcxycxDcxAcxxcxFcxLcxHcxBcxCcxPcpscpRcpRcxEcpRcxRcpRcxGcxTcxIcsUcxJcxKcxUcxMcxNcxOcxWcxQcxNbGGcuNcylbGGbGGcxScxZcyactFbGGbGGbGGbGGbGGbGGbGGcxVcymbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcssckbcwMckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcyocyncybcyccydcyecyfcwycsucygcgQcoLcyhcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocypcqPcngaaacyrcytcyscyvcyqcwOcywcyAcyycyucvxcyCcsHcyEcvBcyxctYcyFctYcyzcyGcyBcyHcyDcyDcyDcyIcvIcsLcsLcxhcyLcyJcyOcyNcyPcyKcyKcyQcyMcyScyWcyUcyXcyRcyYcyTcyZcyVczbczaczeczcczgczfcxBczhczdczicxxczjczlczkczmczmczocznczqczpczsczrczpczpczpcztczpczpczvczuczxczwczzczyczBczAczCczCczDczCczCczCczCczGczIczCczCczCczOczLbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecqDckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFczPczHczQczJczKczKczRcwxcsucoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcsvcngaaacyrczTczSczVczUczXczWczYczUczUcAacAccAbcAdczZczZcAecAfctYcAhcAgcyBcyDcyDcyDcyDcAicvIcsLcsLcxhcAkcAjcAmcAlcAocAncAncAqcAscArcAtcyKcApcxhcAucuocAvcvYcAxcAwcAAcAycAFcACcxBcAIcAzcAMcxBcABcAOcADcAEcAEcAEcAEcAEcARcAGcAHcATcAJcAJcAKcAKcAJcALcAVcAYcAWcAPcAPcAQcAZcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScBecAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnkcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicBgcAXcBjcAXcBmcBacBbcBccBdcBncwxcsucgQcgQcBfcngcngcngcngcngcngcngcBocvocwIcwIcwIcwIcBhcwIcwIcvocygcqPcngaaacyrcBrcBqcBkcBlcwOcBscBucBtcBpcvxcyCcsHcnycBvcsDcBzcsDcvBcvBcvBcBDcBBcyDcyDcBFcBEcvIcsLcBwcxhcBxcBycBGcBAcBAcBHcBCcBJcBAcBAcBKcyKcBLcxhcBMcuocBOcvYcvYcBIcvYcvYcAFcBTcxBcBVcBXcBWcxBcBNcBYcBwcBPcBPcBPcBPcBPcBQcBQcBQcBPcBPaaaaaaaaaaaacBRcBScCacBUcAPcCdcCfcCecCgcBZcChcCbcCccCicCkcCjcCmcClcCncAPcAScCocCrcCpcCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCscCvcCucieclBcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicCwcCxcCqcCyczJcCtcCzcCBczJcCDcCCcCEcskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCFcwFcCAcwIcwIcwIcwIcCGcCIcCHcCJcngaaacCMcwUcCNcwVcCOcwOcwOcCRcCPcCKcCLcCUcCTcCVcBvcsDcCYcCQcCZcCScDacvHcDccyDcyDcyDcDdcvIcsLcsLcCWcCWcCXcDicDecDecDjcDbcDkcDlcDlcDmcDfcDgcDfcAucuocAvcDhcDpcDncDscDrcAFcDtcxBcDvcDocDxcxBcsLcBYcBPcBPaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDycDAcDzcDucDBcDwcDwcDCcDwcDwcDwcDwcDwcDEcDDcDGcDFcDHbGHcDIcjYbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDJcDMcDKciecieckbckbcDNckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBicDPcAXcDUcAXcDVcDLcDXcDZcBbcDOcwxcEacqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcEbcvocoLcqPcvpaaaaaaaaaaaacvqcEdcDWcEecEecvxcDYcvxcEfcsHcnycEicEjcEccElcEkcEkcEkcEscEgcyDcEhcyDcEtcvIcsLcsLcCWcEvcEucEwcEmcEncEocCWcEpcEqcErcEycExcEzcDfcEBcEAcECcDhcEEcEDcEIcEFcEJczfcxBcEKcEMcELcxBcsLcBYcBPaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEOcENcERcEQcEXcEVcEZcDwcDwcEPcDwcDwcDEcDGcDGcDGcFbbGHcFcbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcFdcEWcEWcEWcEWcEWcFecEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcFfcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFgcsHcnycFhcFjcFicFlcFkcFrcFocFucFtcFwcFmcFncFBcvIcsLcsLcCWcFpcFqcFCcFscFscFDcCWcFEcFvcFvcFGcFvcFxcFycFzcFzcFzcFAcFIcFHcFJcDrcFLczfcFFcFFcFFcBPcBPcsLcBYcBQaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFNcFPcFOcFKcFQcFMcFRcFScDwcDwcDwcDwcFTcFYcFUcGacFZcGdbGHcFcbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecijaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcGecFXcGfcFWcGgcGbcGccGccGicGhcGkcGjcGmcGlcGocGncGqcGpcGpcGrcGpcGscGtcGtcGvcGucGxcGwcGycGwcGwcGwcGxcGwcGwcGzcGBcGAcGDcsHcnycGJcGNcGMcGCcsDcGOczZcGEcGFcGGcGHcGIcGQcGKcsLcsLcCWcGLcGRcGUcGTcGPcGWcCWcGZcGScHacHbcGVcHccGXaaaaaaaaacFAcDhcGYcDhcDhcHhcHfcHlcHkcHdcHechfcsLcBYcBQaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcHmcHgcBScHncHicHjcHvcHtcHxcHwcDwcDwcHocHpcHqcHrcHsbGHcFcbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcGfcFWcHycFXcANcFXcHBcHAcHEcHCcHzcHucHzcHFcHJcHDclXcHDcHDcHKcnAcnAcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHMcHLcHOcHNcHUcHTcHPcHQcHRcHScHXcHWcHVcHYcIccIacHZcAEcIdcIbcIfcIecIjcIicIgcIhcDfcIkcErcIncIocErcIlcGXaaaaaaaaacImcIqcIpcItcIscHhcIrcIxcIwcIucIvcracrecIycBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIzcIBcIAcBRcAPcAPcAPcAPcAPcAPcICcHwcIDcIHcIFcIEcAPcAPbGHcFcbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcIIcFXcIGcFXcGfcIJcIMcIKcINcILcITcIPcIOcIUcIQcIRcIScIVcIXcIWcJacIYcJbcqVcIZcqVcIXcJccIXcIXcIXcIXcIXcIXcIXcIXcIXcIXcJdcHDcJfcJecJicJhcJgcJjcJocJmcJkcJlcJrcJncJycJpcJqcJzcGHcrecJscJtcJucEmcEwcEmcEmcJvcDfcJwcErcErcEycErcJxcGXaaaaaaaaacImcJBcJAcJDcJCcJHcJFcJEcJIcHdcsLcuccJGcBYcBPaaaaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcJJcJNcJMcxNcJKcJKcJLcBRaabcAPcAPcJOcAPcJTcJRcJPcAPcJQcuQcFcbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJUcJScEWcEWcEWcEWcJYcEYcEYcEYcEYcKacEYcKccJVcJVcJWcJXcKdcEYcJZcKgcKbcKbcKicKbcKjcKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcKkcKhcKmcKlcKtcKqcKxcKncKocKncKncKncKncKpcKycKrcKscKzcGKcsLcKucKvcKwcKEcKGcKFcKAcKBcDfcKCcKDcKIcKKcKJcKHcFyaaaaaaaaacImcKMcKLcKNcIscKTcKScJFcKUcHdcKOchfchfcBYcBPaaaaaaaaaaaaaaaaaacBRcKPcKQcKRcKWcKVcKYcKXcxNcLccLfcLdcxNcJKcKZcLacBRaabaabcLbcLkcLjcLecLlcLgcLbbGGbGGcFccLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalwalvalvalwalvalvaabamhaabayiaaaayiayicLicLncLmcLmcLmcLpcLocEYbTmcLrcLqcLtcLscLucEYcLycLwcKfcLvcLBcLxcLIcLzcLAcLJcLCcLDcKbcLCcLEcLFcLGcLGcLHcKbcLLcLKcHJcLNcnycLTcLMcLUcLOcLPcLQcLPcLRcLScLXcLWcLVcMacGKcGKcKucKvcCWcCWcMbcCWcCWcKvcLYcLZcLZcLZcMccLZcMdcFyaaaaaaaaacImcImcImcImcImcFFcMecMicMhcHdcsLcsLcMfcBYcBPaaaaaaaaaaaaaaaaaacBRcJKcMgcJKcMlcMjcEHcJNcxNcxQcMocxQcxNcJKcJKcMkcBRaabaaacLbcMucMmcLecLecMncLbcMpbGGcFcbKlcMsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaabaabcLicLicMqcLicLicMrcMvcEYcEYcEYcEYcEYcEYcEYcEYcLicLwcKfcMtcMxcMwcMycMycMycMycMCcMzcMDcLGcMAcLGcLGcMBcLGcMEcMGcMFcMHcLNcnycMLcHQcMPcLOcMIcMJcMKcLOcMQcMRcMNcMOcMScMUcMTcMWcMVcMXcMXcMZcMYcNecNbcNfcNacrecrecNgcsLcNccBPcBPcBPcBPcBPaaaaaaaaaaaacNdcNicNkcNjcHdcNhchfchfcBYcBPcBPcBPcBPcBPaaaaaacBRcJKcJKcJKcNmcNlcNocNncNqcNpcNscNrcxNcNtcNycNxcBRaaaaaacLbcNzcLecNucLecNvcLbbGGbGGcFccMsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNwaaaalwaaacNFcNEcNMaaacNFcNEcNMaaacNFcNEcNMaaaaaacLicNAcNBcNCcLicNDcNNcLmcLmcLmcLmcLmcLmcLmcLmcLmcNRcKfcNGcLGcMBcNHcLGcLGcLGcNIcLGcNGcNGcLGcLGcLGcLGcNJcNKcMGcNLcHDcNScyEcHQcHQcNTcLOcNOcNPcNQcLOcNUcHVcNVcNZcNWcObcOacNXcsLcNYcpscNYcsLcOdcOccOecOecOecOecOgcOfcOfcOfcOfcOfcOhcBPaaaaaaaaaaaacNdcNicNkcOicOjcsLcxMchfcBYcsLcsLcsLcsKcBPaaaaaacBRcxNcxNcxNcxNcOkcEHcOlcOncOmcOpcOocxNcOqcOtcOrcBRaaaaaacLbcOvcOucOscLecODcLbcOCbGGcFcbGHaabaabaabaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaacNFcOFcNMaaacNFcOFcNMaaacNFcOFcNMaaaayicLicNBcNBcNBcLicLicOwcOxcLicLicOxcOxcLicLicOxcOxcLwcKfcNGcOycLGcOzcOAcOBcOBcMAcLGcNGcOGcLGcLGcLGcLGcOHcOEcOJcOIclXcOKcOMcOLcOYcORcLOcNOcOZcONcLOcOOcHVcGKcOPcGHcPbcPacOScOTcOUcOVcOWcOTcOXcOTcOTcOTcBPcBPcBPcBPcBPcBPcBPcBPcPdcBPaaaaaaaaaaaacNdcPecPgcPfcHdcsKcPcchfcPicPhcPhcPkcsLcBPaaaaaacBRcKPcKQcKRcPmcPlcNocPncPjcPocPqcPpcPscPrcPpcPtcBRaaaaaacLbcLbcPycPAcPzcLbcLbbGHbGGcPBcuQcuQcuQbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaayiaabcNFcOFcNMaaacNFcOFcNMaabcNFcOFcNMaaaaabcLicMrcPucNDcLiaaaaabaaaaaaaaaaaaaaaaabaaaaaacOxcLwcKbcPvcLGcPwcPxcPCcPEcPDcPEcPFcPEcPGcPHcLCcPIcNGcNGcNKcPLcPJcPNcPMcPPcPKcPVcPScPWcPOcPXcPQcPRcPYcPTcPUcPUcQacQccQbcQdcPZcQfcQecQhcQgcQjcQicQocQmcQpcQpcQpcQpcQpcQpcQqcBPcPdcQkcQkcQkcQkcQkcQkcQlcQucQlcQncQkcQkcQkcQkcQkcQkcBYcsLcBPaaaaaacBRcJKcKZcJKcQxcMjcEHcQzcQAcQrcQscEHcEHcQtcEHcQBcBRaaaaabaabcLbcLbcQvcLbcLbaaabGHbGGcFccuQcQwcQCbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacNFcOFcNMaabcNFcOFcNMaaacNFcOFcNMaabaaacLicLicOxcLicLiaaaaabaabaaaaabaaaaabaabaaaaaacQycQDcKbcQFcQGcQGcQHcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcKbcJZcQIcJZcQEcJZcFacQKcQJcQOcQNcQNcQNcQUcQScPTcQLcQMcQVcQWcQPcQQcPZcQRcQXcQTcQYcRbcRacRdcRcaabcQZcQZcQZcQZcQZcRecBPcRicRhcRkcRjcRfcRgcQkcRlcRncRmcQkcRocRqcRpcRscRrcQkcBYcsLcBPaaaaaacBRcJKcJKcJKcRDcRwcNocRHcRIcRtcRucRvcRvcRJcEHcRxcBRaabaabaaaaaaaaacRyaaaaaaaaabGHbGGcFccuQbGGbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvayiaaacNFcOFcNMaabcNFcOFcNMaaacNFcOFcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcRzcRAcRAcRAcRAcQycRBcLwcRCcRKcREcREcRFcRGcRMcRLcRLcRLcRLcRNcRPcROcRQcRQcRScRScRQcRTcRVcRUcRRcRRcRYcRWcSccSacSgcRXcRXcShcRZcSjcSbcSkcSdcQPcSecPZcSfcSlcSmcSicSpcSocSrcSqcQpcSncSucSscSwcQZcRecBQcPdcQkcSycSxcStcSzcSvcSCcSFcSDcQkcSIcSAcSBcSAcSMcQkcBYcsLcBPcBPaaacBRcxNcxNcxNcxNcSNcEHcQzcSEcSOcQscEHcSGcSHcSHcSPcSJcSKaabaaaaaaaaaaaaaaaaaaaaabGHbGGcPBbGGbGGcSLbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcSQaabaabaabcSQaabaaaaabcSQaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcSRcTacSTcRAcTbcTccNRcRCcRCcSScTdcKbcKbcMvcSUcSUcSUcSUcSVcSWcSXcSWcSWcSWcRRcRRcSYcSZcTfcTicTgcRXcTjcTecRXcRXcRXcRXcTkcPTcTlcThcQVcSdcQPcSdcPZcSfcSlcTncTmcTqcTpcTucTraabcTocTvcSwcTwcQZcRecBQcRicRhcTxcTscSAcTtcQkcTycTAcTzcQkcTCcTDcSAcTFcTEcQkcBYcsLcTBcBPaaacBRcKPcKQcKRcTJcPlcNocTKcTNcTMcTGcTGcTHcTIcTPcTOcBRaabaabaabaaaaaaaaaaaaaaaaaabGHcTLcFcbGHbGHbGHbGHbGHaabaabaabcTQcTQcTQcTQcTQcTQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcTRcTScTScTUcTTcTVcTVcTVcTTcTVcTVcTVcTTcTVcTVcTVcTWcTScTScTScTScTScTXcTZcTYcUbcUacUecUdcUgcUfcNBcLwcUccRCcKbcKbcKbcUhcMvcSUcUkcUjcUmcUlcUicUncUpcUocUrcUqcUucUscUxcUwcUycUqcUtcUzcTecUvcRXcRXcRXcUAcPTcUCcUCcSdcUEcUDcUGcUFcUIcUHcUKcUJcUPcUNcUScSqcUVcSncUWcSwcSwcQZcRecBQcPdcQkcULcUMcVacQncQkcUOcVbcQncQkcUQcURcVccUTcUTcQkcBYcsLcUUcBPaaacBRcJKcMgcJKcVecMjcEHcVfcUXcUYcEHcUZcVgcxNcxNcxNcBRaaaaaaaabaabaaaaaaaaaaaaaaabGHcJQcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaabcVkaabaaaaabcVkaabaaaaabcVkaabaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcVlcVdcVmcRAcVncNBcNNcTccTccTccTccVocTccUfcSUcVhcVicVjcVpcVrcVqcVtcVscVvcVucVycVwcVAcVzcVCcVBcUtcTjcTecVxcVDcRXcRXcVFcPTcVGcVHcSdcVIcQPcVJcVEcVLcVKcVOcVMcVQcVPcVQcVRaabcQZcQZcQZcQZcQZcRecBPcPdcQkcVScVNcVUcVTcVWcVVcVYcVXcWbcWacWccSAcWecWdcQkcBYcsLcVZcBPaaacBRcJKcJKcJKcWicWhcWpcWjcWqcWfcEHcEHcEHcEHcWgcWrcWwaaaaaaaaaaabaabaaaaaaaaaaaabGHbGHcFcbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwaabcNFcWxcNMaaacNFcWxcNMaaacNFcWxcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabcRzcRAcRAcRAcRAcWkcWlcWmcNBcWncNBcNBcMvcWocNBcSUcWzcWycVjcWAcUicWscWtcWucWucWvcWDcWCcWFaYtaZBcWvcWBcWHcWJcWIcWLcWKcWPcWMcWScWQcUGcWTcWUcWNcWOcWVcWWcWRcWYcWXcXbcXacXdcXccQpcSncXecWZcWZcQZcRecBPcPdcQkcQkcQkcQkcQkcXgcXfcXicXhcXncXkcXpcXocXqcXjcQkcBYcXrcXlcXlcXlcXmcXmcXmcXmcXmcXscXvcXtcXzcXxcNocXAcNocXAcNocXBcWwaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHcFcbGHaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNFcWxcNMaabcNFcWxcNMaaacNFcWxcNMaaaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcXucXucXucXucXucXucXucXCcXucXucSUcXwcXDcVjcWAcUicXycUicUicXEcRRcXGcXFcUwcXHcXIcRRcXLcRXcTecXMcXOcXNcWPcXPcXJaZCcXRcXQcXVcXScXRcXWcXYcXXcYacSdcXTcXUcYccYbaabcTocYfcYdcXZcQZcRecBQcYhcYgcYgcYgcYlcQkcYmcUMcYecYncURcYocUTcUTcURcYpcQkcBYcYichfcsLcYjcYkcBPaaaaaacBRcYqcYscYrcYvcYqcYscYwcYxcYqcYscYycBRaabaabaabaabaabaabaabaabaabaabbGHcFcbGHbGHbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNFcWxcNMaaacNFcWxcNMaaacNFcWxcNMaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcXucYtcYtcYucYAcYBcYBcYDcYCcYCcYEcYGcYFcVjcWAcVjcYHcVjcVjcVjcRRcYLcYKcYOcYNcYPcYIcYJcYQcYRcYMcYMcYMcYXcYUcYZaZHcZacYScVIcQPcYTcZbcYVcYWcZccSdcXTcZdcZgcZecZhcSncZicWZcWZcQZcRecBQcPdchfchfchfckKcQkcZkcZjcZfcZlcURcZmcZncUTcZpcZocQkcBYcYichfcsLcJGcsLcBPaaaaaacBRcZqcZscZrcxNcZtcZycZvcxNcZzcZBcZAcBRaabaabaaaaaaaaaaaaaaaaaaaaaaaabGHcFcbGGbGGbGHaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabcNFcWxcNMaaacNFcWxcNMaabcNFcWxcNMaabaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacXucYtcYtcYucZucZucZucZCcZwcZxcSUcZEcZDcZHcZGcZJcZIcZKcZFcZFcZLcZOcZNcVjcVjcVjcZPcZRcZQcZMcZTdaacZVdacdabcSUcZScZSdafcVIcQPcZUdagcZWcZXcZYcSdcZZdahdajdaidadcQZcQZcQZcQZcQZcRecBQcPddaecsLcsLckKcQkdakcSAcSAdaldandamdaqcUTdatdascQkcBYcYicMfcsLcuccTBcBPaaaaaacBRcMkcJKcJKcxNcMkcJKcJKcxNcMkcJKcJKcBRaaaaabaabaaaaaaaaaaaaaaacuQcuQbGHdaucuQbGGbGHbGHbGHcTQcTQaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamhaabcNFdavcNMaaacNFdavcNMaaacNFdavcNMaabalvaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcXudaodapcZucZucZudaxdardardardardardardardazdaDdaCdaEdawdawdawdaFdaydaJdaAdaBdawdaydaKdaRdaQdaadaSdacdabdaGdaHdaIdaTdaUdaLdaMdaNcZcdaOdaPdaVdaYdaWdaZcXcdbacSndbcdbbdbbcQZcRecBPcPdchfcBNdaXckKcQkdbdcSAdbkdbecURdbmdbncUTdbpdbocQkcBYcYichfcsLchfchfcBPaabaabcBRdbfcKZcJKcxNdbfcKZcJKcxNdbfcKZcJKcBRaaaaaaaabaabaaaaaaaaaaaacuQdbgbGGcFccuQdbhcuQdbibGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaalvaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcXudbjcZucZucZucZucZudardbtdbldbudbwdbvdardbxdbqdbrcXDcVjcVjdbsdbBdbydbEdbCdbGdbFdbzcSUdbAdaQdaadbHdacdbJcSUdbDcZSdbKdbLcSddaMdaNdbNcSddaPdaVcXTcXUdbOcYbdbIcTodbSdbQdbWcQZcRecBPcPdchfdbMdbMckKcQkcQkdbXdbYcQkdbPcQkcQkcQkcQkcQkcQkcBYcYichfcsLcsLdbZcBPaaaaaacBRdbRcJKcJKcxNdbRcJKcJKcxNdbRcJKcJKcBRaaaaaaaaaaabaabaaaaaadcacuQbGGbGGcFccuQbGGbGGbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwamhalvalvalvalvalwalvalvalwdbTaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXudbUcZwcZucZucZudbVdardbldccdcbdcedcddcgdcfdcjdcidckcVjdcmdcldchdcodcqdcpdcudcrdcndcwdbrcXDdcydcxcZMdczcSUdcscZSdctdcLcSddaMdaNcZccSddcvdaVcXTdcOdcRcZedcScSndcTdbbdbbcQZcRecBQcPddcAcuccABckKdcBcQkcQkdcCcQkdcDdcEdcFchfdcGdcHcsLcBYcYichfcsLdcIcTBcBPaaaaaacBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRaaaaaaaaaaaaaabaabaaaaaabGHbGHbGHcFccuQdcJdcKbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucXucXudcUdcMdcMdcMdardcNdcVdcPdcPdcQdcWdawdcYdcXddadcZdddddcddfddeddgddbddiddhddfddjddlddkddoddnddqddpddrdbDcZSddmddscSddaMcSdddtcSddaPdaVcXTcXUddxcYbdbIcQZcQZcQZcQZcQZcRecBQddycYlcuccTBddAddzddzddzddCchfdduddvddwchfddDcYgcYgddEddHcMfcsLcsLcBPcBPaaaaaaddFaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaabaaabGHcJQddBddKcuQddJddIbGGbZZaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddLcXucZucZucZudcMaabaabdarddGddMdcPdcPddNdarddOddQddPddUddTddWddVcSUddXddRddScVjddYcSUdebdeededddUddUdegdefcSUddZcZSdeadehcSddaMcSdcZUdagdecdeidaYdejdekcXcdelcSndendemdemcQZcRecBQdepdeochfchfcPdchfchfcsLdeqchfchfdetchfchfdewdevdeydexdercBPcBPcBPcBPaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaabaabbGHdbgcAScaccuQcuQcuQbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucZucZucZudcMaabaaadardesddMdcPdcPdezdardeudeDcSUdeFdeEdeEdeGcSUdeLdeAdeBdeCdeMcSUdeEdeEdeEdeFcSUdeNdeucSUdbDcZSdeOdePdeHdeIdeJdeKdeQdeRcXbdeUcXUdeVcYbdbIcTodeXdeWdeYcQZcRecBPcBPcPdcprdeScPddeTchfcsLdfadeZdffdfbddzddzdfgcYichfdfjcBPcBPaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGHbGHbGHbGHdfhcaccuQdfidfcbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcUdfdaaaaaadardfedfpdcPdcPdfudardfwdfAdfzdfkdfldfmdfndfodfCdfqdfrdfsddpdfodfldfldfldftdfzdfDdfvcSUdbDdfEdaMdfxdfydeQdfFdfGdfBdfIdfHdfKdfJdfNcZedcScSndfOdemdemcQZcRecBPcsLdfQdfTdfRdfgcsKchfcsLcsLcsLcYidfLcsLcXrdfMddHcuQcFcbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfSdfUcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfXdfYdfYdfZdfYdfYdgadardfVdcVdcPdcPdgbdardaGdgccSUcSUdfodfodfodfodgddgfdgeddUdgidfodfodfodfocSUcSUdgqdglcSUdbDcZSdgrdgsdfydggdghcSdcSddgtcXWdggcXUdgjcYbdbIcQZcQZcQZcQZcQZcRecBPcTBcsLdgkdgCcsLdgmchfchfdgnchfdgocpscJGdgpchfchfcuQcFcbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgAdgycJQdfScacbGGbGGbGGdgBbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdgwdgvdgxdgFdardgzdgGcMMdcPdgHdarcSUdgIcSUdgJafOdgEdfodfodfodfodgKdfodfodfodfodgEafOdgJcSUdgLcSUcSUdbDcZSdgMdeHdgNdgPdgOdgRdgQdgPdgQdgPdgVdeQdgWdbIdhgdhhdhhdhhdhhdhidgSdgTdgTdgUdhjdgTdgTdgTdhkdgXdgYdgodgZchfdgochfdhacuQcFcbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMsbGHcJQcuQdhbbGGcQwdfScaccuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdgwdgwdhddhedardhfdhldcPdcPdhmdardhndhpdhoafOdhqdhrdhrdhrdhrdhrdhtdhrdhrdhrdhrdhrdhuafOdhvdhydhwcSUdhsdaIdhzdhBdhAdhCdhxdhEdhDdhFcSddhHdhGdhJdhIdbIdhKaaaaabaabaaadhMdhLdhOdhNdhTdhSdhVdhUdgTdhYcsLcsLdhPcpsdhQcYicsLcsLcEGdhZdiadiadiadiadiadiadiadiadiadiadiadiadiadiadiediadiadiadiaczLcuQbPAcAUbGGdiccMscuQcuQcuQdbhcuQdfScaccuQdidbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgDdgudgvdhWdgvdhXdifdardfVdcVdcPdcPdigdardihdibdibaaadiiafOafOafOafOafOafOafOafOafOafOafOdiiaaadibdibdihcSUdaGcZSdhIdikdijdipdioditdhIdipdhIcYbdhIcYbdhIdbIdhKaaaalwalwdiudhLdivdiwdildimdindiydixdgTcsLcsLchfdgodiqchfcYicXrdfMdhRdizdiAdiAdiAdiAdiAdiAdiCdiBdiAdiAdiAdiAdiAdiAdiEdiDdiGdiFdiJdiIdiLdiLdiLdiLdiNdiMdiOdiLdiLdiLdiLdiQcjYcuQdfcbGGdiHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiSdfYdfYdfYdfYdfYdiTdardiKdjgdcPdcPdjjdardjndjpdiPaabdiiafOdjqaaaaaaaaaaaadjqaaaaaadjqafOdiiaaadiRdjudjtcSUdaGcSUaabdiUaabdiVdiWdiXdiYdiZdiYdjadiYdjadjbdjcdhKaaaalwaabdjddgSdjedjfdjwdjhdjidjxdjkdgTdjlcsLcsLcYidjmchfcYicYidjzbGHbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHdjobGGcuQcTLbGGcuQcuQbZZbZZcxScuQdjAbGGdjAcuQdjCcacdjrbGHbGHbGHbGHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjsdjgdcPdcPdjDdardjHdibdjvaaadjIdjLaaaaaaaaaaaaaaadjyaaaaaaaaadjRdjOaaadibdibdjHcSUdaGcSUcQZdjBcTodjBcQZdjBcTodjBcQZdjScTodjUcQZaabdhKaaaalwaabdjEdgSdjFdjfdjGdjVdjidjWdjJdjKdirdjYdjMcYicpscsLdjNdgochfcBPaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdjXcLhcuQdjPbGGcuQaaaaaaaaaaaacuQbGGbGGdbgdjQdjQdkadkbdjQaaaaabaabaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardkcdcVdcPdcPdigdardkddkedibaaadiiafOaaaaaaaabaabaabaabaabaaaaaaafOdiiaaadibdkgdkfcSUdjZcSUcQZdkidkhdkkcQZdkqdkpdkscQZdkwdkudkxcQZaabdhKaaaalwaaadjEdkjdkydkldkmdkndkodkEdkDdgTdkrdgochfdgodkGchfdktdgocBNcBPcBQcBQcBQaHQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdkFcuQcuQcQCbGGcuQcuQbZZbZZcuQcuQbGGdkvcLhdjQdkIdkHdkMdjQaaaaaaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOdardardardardardardarcSUdihdibaaadiiafOdjqaabaabdkzdkAdkBaabdkCaaaafOdiiaaadibdihcSUcSUdaGcSUcQZdkOdkNdkOcQZdkTdkRdkTcQZdkVdkUdkVcQZaabdhKaaaalwaaadjddgSdkJdkKdkLcOQdkWdkYdkXdgTdkPdkQdkZdkSdlacsLcYicYidlbdlddlccsLdlhaHQaaaaabaaabZZbZZbZZbGHbGHbGHbGHbGHbGHdlicJQcuQdljbGGbGGcuQbGGbGGbGGbGGdhbbGGdfPdjQdlodlkdlqdjQaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabafOafOaabaabaabalwalwcSUcSUdltdibaaadjIdjLaaaaaaaabdledlfdlgaabaaaaaadjRdjOaaadibdlucSUcSUdaGcSUcQZdkOdlvdkOcQZdkTdlwdkTcQZdkVdlxdkVcQZaabdhKaaaalwaaadjddgSdgSdgSdlldlmdlndlydlndlmdkPdlpcsLdlAdlrdfMddHcYidlscBPcBQcBQcBQdlKaabaabaaabZZdlBdlCcuQbGGdlDdlJdbgcuQdlPbGGcuQdlzbGGbGGdlLbGGbGHbGHbGHbZZbZZbGHdjQdlSdlRdlUdjQaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabalwcSUcSUdihdibaaadiiafOaaadlEaabdlFdlGdlHaabaabdjqafOdiiaaadibdihcSUcSUdaGcSUcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZaabdhKaaaayiaaadjdaaaaaaaaadlIdlmdlVdlXdlWdlmcsLdlMcsLcsLdlNdlOcXrdmcdlQcBPaaaaaaaaaaaaaaaaabaaabZZdlZdmbdlLbGGdgybGGbGGdlLdjobGGcuQcuQcuQcuQcuQbGGbGHaabaaaaaaaaaaabdlTdlTdmddlTdlTaabaabdhcaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcSUdkgdkfdibaaadiiafOaaaaaaaabaabaabaabaabaaaaaaafOdiiaaadibdkddkecSUdmecSUcSUcSUcSUdmfdhhdhhdhhdhhdhhdhhdhhdhhdhhdhhdmgaabaabaabdjEaaaaaaaaadlYdlmdlndmhdlndlmdmadmidfMdfMdmldmrdmmcBPcBPcBPaaaaaaaaaaaaaaaaabaaabZZdlBdmncuQdbgbGGbGGdmpcuQdmqbGGbGGbGGbGGbGGbGGbGGbGHaabaaaaaaaaaaabaaadlTdmsdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUdjHdibdmjaaadjIdjLaaaaaaaaaaabaaaaaaaaaaaaaaadjRdjOaaadibdibdjHcSUdmkdmwdmvdaGdmxdmgaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmydmAdmzdmEaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMsbGHaabaaaaaaaaaaabaaadlTdmGdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUdmHdmIdiPaabdiiafOdjqaaaaaadjqaaaaaaaaaaaadjqafOdiiaaadiRdmKdmJcSUdmLcSUcSUcSUcSUcSUcSUaaaaaaaabaaaaaaaaadmoaaaaaadmBdmBdmBdmBdmCaaaaaaaabdlYdmDdlmdmOdlmdlmaaaaabaaaaaadmFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHdmbdmMbGHdmNaabbGHbGHbZZbZZcMsbGHaaaaabaaaaaaaaaaabaaaaaadmRaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdmSdmUdmTaaadiiafOafOdncafOafOdncafOafOdncafOafOdiiaaadnhdmUdnicSUdmPdmQdnjdnldnkdnmdmVdmWdmWdmXdmWdmWdmWdmYdmWdmWdmZdnadnbdnodmCaaaaaaaabdndaHQdlmdnedlmdnfaabaabaaaaaadngaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaabpaaaaaabGHdnqdnnbGHdnpaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaadnraaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnscSUcSUdntaaadnudhrdhrdnydhrdhrdnydhrdhrdnydhrdhrdnzaaadntcSUcSUcSUdmPdnBdnAdnEdnCdnHdfoaaaaaaaabaaaaaaaaadmodmBdmBdmBdnvdnwdnvdmCaaaaaaaabaabaHQdnxdnIdnxaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaabZZdnJbZZbZZaabdhcaaaaabaaaaaaaabaaaamWamWalwayiaabaabaabaabdnLaabaabaabaabdhcamhamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUcYXdnMdmTaabaabaabaabaaaaaaaaaaaaaaaaabaabaabaabdnhdnNcYXcSUcSUdnDcSUcSUcSUcSUdfocSUaabaabaabaabaabaabdmodnOdnFdnOdnFdnGdnFdmCaaaaaaaaaaabaHQaaaaaaaaaaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaabZZdnPbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaaaaaaabaaaaabaaaaaadnQaaaaaaaabaaaaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacSUcSUdnMdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnRdnNcSUcSUcSUdnKdnScSUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnTdnWdnVdobdoadofdoeaaaaaaaaaaabaHQaHQaHQaHQaHQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaabZZdogbZZaaaaaaaaaaaaaabaaaaaaaabaaaamWaaadohdohdohdohdohaabdoiaabdohdohdohdohdohaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUcSUaaacSUcSUdnXcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaaaaaadnYdnZdnZdnZdnZdojdokdocdoddolaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaabZZdombZZaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdondoodoodoodoodoqdopdosdordordordordotaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdaGdaGdovdoudoudowaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdnZdoydoxdoAdnZdnZdnZdnZdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdoBdoEdoEaaaaaaaaaaaaaaaaaaaaaaabaaaamWaabdoGdoGdoGdoGdoGaaadoiaaadoGdoGdoGdoGdoGaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdjZdaGdoLdoIdoMdozaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoNdoOdoCdoDdoQdoSdoRdoHdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaaaamWaaaaabaaaaabaabaabaaadoiaaaaabaaaaabaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUdoJdaGdoUdoudoudoVaaaaaaaaaaaaaaaaaaaaaaaadjdaaadnZdoWdoYdoXdoPdoZdpcdpadpgdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaamWaaadohdohdohdohdohaabdoiaabdohdohdohdohdohaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnscSUcSUcSUcSUcSUcSUaaaaaaaaaaaaaaaaaaaabaabdjEaabdnZdphdpjdpidpndpkdpsdprdpbdnZaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdondoodoodoodoodoqdopdosdordordordordptaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdpddpedpddpfdpudpwdpvdpydpxdpfdpfdpfdpfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdoGdoGdoGdoGdoGaaadoiaabdoGdoGdoGdoGdoGaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddpldpmdpddpfdpfdpzdpodpfdppdpqdpqdppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayiaaaaabaaaaabaaaaabaaadpBaaaaabaaaaabaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpCdpEdpDdpFdpfdpIdpHdpJdpfdpKdpAdpAdpLdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaadohdohdohdohdohaabdnLaabdohdohdohdohdohaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpMdpOdpNdpPdpGdpRdpQdpSdpGdpUdpTdpWdpVdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdondoodoodoodoodpYdpXdpYdordordordordptaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaadpddpZdqbdqadqddqcdqfdqedqhdqgdqjdqidqldqkdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdoGdoGdoGdoGdoGaaadnLaaadoGdoGdoGdoGdoGaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddqqdqodqsdpfdqxdqtdqzdpfdqCdqBdqEdppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaaaaabaabaabaaaaaadnLaabaaaaaaaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqpdqFdqpdqmdqmdqGdqrdqmdqpdqHdqpdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaadnLaaaaaaaaaamWamWamWayiamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdisdqudqpdqvdqwdqIdqydqvdqpdqJdqAdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdqKaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqndqudqpdqvdqwdqIdqydqvdqpdqJdqDdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqmdqmdqudqpdqMdqwdqNdqPdqOdqpdqJdqmdqmdqQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqmdqRdqpdqTdqwdqIdqydqvdqpdqUdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqVdqYdqWdqSdradqydrbdrddrcdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqXdqpdredqZdqIdqydrhdqpdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqmdqXdqpdqMdrkdrjdqydqOdqpdqXdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqmdqXdqpdqvdqwdqIdqydqvdqpdqXdqmdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqXdqXdqpdqvdqwdrldqydqvdqpdqXdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrgdrfdrmdridrgdrfdrfdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrodrqdrpdrsdrrdrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrtdrzdrwdrBdrAdrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrudrfdrfdrvdrvdrCdrxdrvdrfdrfdrudqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrudrfdrydrydrEdrDdrBdrydrydrfdrudqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrGdrFdrJdrHdrLdrKdrOdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrIdrpdrQdrPdrRdrBdrMdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrfdrfdrfdrydrDdrNdrTdrNdrUdrydrfdrfdrfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrXdrfdrfdrSdrEdrYdrNdrNdrNdrZdrEdrVdrfdrfdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrfdrfdrfdrIdsbdsddscdrNdrEdrMdrfdrfdrfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrGdrEdsgdsedrydrEdrOdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrydrEdsidshdrEdrEdrydrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrfdrfdrfdrfdrfdrfdrfdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrfdrfdrfdrfdrfdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrfdrfdrfdrfdrfdrfdrfdrfdrfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaadseaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaadsjaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 2a0ec563b73..79d5bede9fd 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -2,13 +2,13 @@
"ab" = (/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"ac" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"ad" = (/obj/structure/flora/bush,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
-"ae" = (/obj/structure/flora/tree/pine{pixel_x = 2},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
-"af" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow,/area/syndicate_mothership)
+"ae" = (/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
+"af" = (/obj/machinery/door/airlock/external{id_tag = "syndicate_away"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ag" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"ah" = (/obj/structure/flora/tree/pine{pixel_x = 0},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
+"ah" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dir = 1; dwidth = 11; height = 13; id = "emergency_syndicate"; name = "404 Not Found"; turf_type = /turf/unsimulated/floor/snow; width = 24},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
"ai" = (/turf/unsimulated/floor/snow,/area/space)
-"aj" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"ak" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"aj" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/syndicate_mothership)
+"ak" = (/turf/unsimulated/wall/fakeglass{dir = 0; icon_state = "fakewindows"; tag = "icon-fakewindows (EAST)"},/area/syndicate_mothership)
"al" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"am" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHEAST)"; icon_state = "gravsnow_corner"; dir = 6},/area/syndicate_mothership)
"an" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
@@ -42,18 +42,18 @@
"aP" = (/obj/structure/window/reinforced,/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space)
"aQ" = (/turf/unsimulated/wall{tag = "icon-iron14"; icon_state = "iron14"},/area/space)
"aR" = (/turf/unsimulated/wall{tag = "icon-iron10"; icon_state = "iron10"},/area/space)
-"aS" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
-"aT" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
-"aU" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"aS" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
+"aT" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership)
+"aU" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"aV" = (/obj/machinery/door/airlock/external{id_tag = "syndicate_away"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"aW" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_away"; name = "syndicate recon outpost"; turf_type = /turf/unsimulated/floor/snow; width = 18},/turf/space,/area/space)
"aX" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTHEAST)"; icon_state = "gravsnow_corner"; dir = 5},/area/syndicate_mothership)
"aY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor/snow,/area/syndicate_mothership)
-"aZ" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"aZ" = (/obj/machinery/light{dir = 1; on = 1},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ba" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
-"bb" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
-"bc" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"bd" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"bb" = (/obj/machinery/light{dir = 4},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"bc" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
+"bd" = (/obj/machinery/door/airlock/centcom{name = "Shuttle Dock #2"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"be" = (/obj/machinery/computer/shuttle/ert,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops)
"bf" = (/obj/machinery/door/airlock/external{id_tag = "specops_away"; name = "Shuttle Hatch"; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"bg" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "specops_away"; name = "centcom bay 3"; width = 5},/turf/space,/area/space)
@@ -116,7 +116,7 @@
"cl" = (/obj/docking_port/stationary/transit{dir = 4; dwidth = 11; height = 13; id = "emergency_transit"; name = "emergency in transit"; width = 24},/turf/space/transit,/area/space)
"cm" = (/obj/docking_port/stationary/transit{dir = 8; dwidth = 5; height = 7; id = "supply_transit"; name = "supply in transit"; width = 12},/turf/space/transit,/area/space)
"cn" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "emergency_away"; locked = 1; name = "Arrival Airlock"; req_access = null; req_access_txt = "0"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
-"co" = (/turf/unsimulated/wall,/area/prison/solitary)
+"co" = (/obj/machinery/computer/cryopod{pixel_y = 32},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"cp" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry)
"cq" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry)
"cr" = (/turf/unsimulated/floor{name = "plating"},/area/space)
@@ -145,20 +145,20 @@
"cO" = (/obj/docking_port/stationary/transit{dir = 8; dwidth = 2; height = 12; id = "ferry_transit"; name = "ferry in transit"; turf_type = /turf/space/transit/horizontal; width = 5},/turf/space/transit/horizontal,/area/space)
"cP" = (/obj/docking_port/stationary/transit{dir = 2; dwidth = 3; height = 5; id = "engineering_transit"; name = "engineering in transit"; turf_type = /turf/space/transit/horizontal; width = 7},/turf/space/transit/horizontal,/area/space)
"cQ" = (/obj/structure/rack,/obj/item/clothing/glasses/sunglasses{pixel_x = -3; pixel_y = 3},/obj/item/clothing/glasses/hud/health/health_advanced,/obj/item/clothing/glasses/hud/security/sunglasses,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"cR" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/wall,/area/prison/solitary)
-"cS" = (/obj/structure/stool/bed,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
-"cT" = (/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/prison/solitary)
-"cU" = (/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
-"cV" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
-"cW" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary)
-"cX" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
+"cR" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"cS" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"cT" = (/obj/structure/flora/ausbushes/pointybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"cU" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"cV" = (/obj/structure/flora/ausbushes/brflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"cW" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"cX" = (/obj/structure/flora/ausbushes/reedbush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
"cY" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"cZ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"da" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"db" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre)
"dc" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"dd" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
-"de" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
+"de" = (/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
"df" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/shard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/storage/firstaid/tactical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/riot/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena)
"dh" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_knightarena)
@@ -168,9 +168,9 @@
"dl" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_knightarena)
"dm" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor,/area/holodeck/source_knightarena)
"dn" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_knightarena)
-"do" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
-"dp" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/prison/solitary)
-"dq" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary)
+"do" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
+"dp" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
+"dq" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
"dr" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_knightarena)
"ds" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea)
"dt" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea)
@@ -190,8 +190,8 @@
"dH" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"dI" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"dJ" = (/obj/structure/rack,/obj/item/toy/sword,/obj/item/weapon/gun/projectile/revolver/capgun,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding)
-"dK" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary)
-"dL" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
+"dK" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
+"dL" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
"dM" = (/obj/machinery/prize_counter,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding)
"dN" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid3 (EAST)"; icon_state = "asteroid3"; dir = 4},/area/holodeck/source_desert)
"dO" = (/turf/simulated/floor/holofloor{tag = "icon-carpet1-0 (EAST)"; icon_state = "carpet1-0"; dir = 4},/area/holodeck/source_theatre)
@@ -206,19 +206,19 @@
"dX" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control)
"dY" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpet15-11"},/area/centcom/control)
"dZ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_y = 5},/obj/item/weapon/pen/multi,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/control)
-"ea" = (/obj/machinery/computer/artillerycontrol,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control)
+"ea" = (/obj/machinery/computer/bsa_control/admin,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/control)
"eb" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "carpet15-14"; tag = "icon-carpet (WEST)"},/area/centcom/control)
-"ec" = (/obj/structure/artilleryplaceholder{tag = "icon-1"; icon_state = "1"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/centcom/control)
-"ed" = (/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/prison/solitary)
-"ee" = (/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary)
-"ef" = (/obj/structure/artilleryplaceholder{tag = "icon-3"; icon_state = "3"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
-"eg" = (/obj/structure/artilleryplaceholder{tag = "icon-2"; icon_state = "2"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
-"eh" = (/obj/structure/artilleryplaceholder{tag = "icon-5"; icon_state = "5"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
-"ei" = (/obj/structure/artilleryplaceholder{tag = "icon-4"; icon_state = "4"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
+"ec" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/centcom/control)
+"ed" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/control)
+"ee" = (/obj/structure/table,/obj/item/weapon/card/id/centcom,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/item/weapon/door_remote/centcomm,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control)
+"ef" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
+"eg" = (/obj/machinery/bsa/full/admin/east,/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
+"eh" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/centcom/control)
+"ei" = (/turf/space,/area/centcom/control)
"ej" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space)
"ek" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space)
"el" = (/turf/unsimulated/wall{tag = "icon-iron11"; icon_state = "iron11"},/area/space)
-"em" = (/obj/structure/artilleryplaceholder{tag = "icon-7"; icon_state = "7"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
+"em" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/centcom/control)
"en" = (/turf/simulated/floor/holofloor{tag = "icon-1 (NORTHEAST)"; icon_state = "1"; dir = 5},/area/holodeck/source_space)
"eo" = (/turf/simulated/floor/holofloor{tag = "icon-17 (NORTHEAST)"; icon_state = "17"; dir = 5},/area/holodeck/source_space)
"ep" = (/turf/simulated/floor/holofloor{tag = "icon-22 (NORTHEAST)"; icon_state = "22"; dir = 5},/area/holodeck/source_space)
@@ -234,7 +234,7 @@
"ez" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_boxingcourt)
"eA" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_boxingcourt)
"eB" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_boxingcourt)
-"eC" = (/obj/structure/artilleryplaceholder{tag = "icon-6"; icon_state = "6"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
+"eC" = (/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
"eD" = (/obj/structure/flora/grass/both,/turf/simulated/floor/holofloor{tag = "icon-snow"; icon_state = "snow"},/area/holodeck/source_snowfield)
"eE" = (/turf/simulated/floor/holofloor{tag = "icon-carpet4-0 (EAST)"; icon_state = "carpet4-0"; dir = 4},/area/holodeck/source_meetinghall)
"eF" = (/turf/simulated/floor/holofloor{tag = "icon-carpetsymbol (SOUTHEAST)"; icon_state = "carpetsymbol"; dir = 6},/area/holodeck/source_meetinghall)
@@ -250,33 +250,33 @@
"eP" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_boxingcourt)
"eQ" = (/turf/simulated/floor/holofloor,/area/holodeck/source_boxingcourt)
"eR" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_boxingcourt)
-"eS" = (/obj/structure/artilleryplaceholder{tag = "icon-9"; icon_state = "9"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
-"eT" = (/obj/structure/artilleryplaceholder{tag = "icon-8"; icon_state = "8"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
-"eU" = (/obj/structure/artilleryplaceholder{tag = "icon-11"; icon_state = "11"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/centcom/control)
-"eV" = (/obj/structure/artilleryplaceholder{tag = "icon-10"; icon_state = "10"},/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/centcom/control)
-"eW" = (/obj/structure/artilleryplaceholder{tag = "icon-12"; icon_state = "12"},/turf/space,/area/centcom/control)
+"eS" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/centcom/control)
+"eT" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
+"eU" = (/obj/structure/table/woodentable,/obj/item/stack/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"eV" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/centcom/control)
+"eW" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/centcom/control)
"eX" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor{tag = "icon-snow"; icon_state = "snow"},/area/holodeck/source_snowfield)
"eY" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor{tag = "icon-grimy"; icon_state = "grimy"; dir = 2},/area/holodeck/source_meetinghall)
"eZ" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball)
"fa" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpet15-5"},/area/centcom/control)
"fb" = (/obj/structure/table/woodentable,/obj/machinery/photocopier{icon_state = "fax"; name = "fax machine"},/obj/item/weapon/photo{name = "butts"},/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/control)
"fc" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/control)
-"fd" = (/obj/structure/artilleryplaceholder{tag = "icon-13"; icon_state = "13"},/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/centcom/control)
-"fe" = (/obj/structure/artilleryplaceholder{tag = "icon-15"; icon_state = "15"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
+"fd" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "CCGAMMA"; name = "Gamma Security"; p_open = 0},/obj/machinery/door/airlock/centcom{name = "Gamma Armory"; opacity = 1; req_access_txt = "114"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/centcom/gamma)
+"fe" = (/obj/machinery/cryopod/right,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"ff" = (/turf/unsimulated/wall,/area/ninja/outpost)
"fg" = (/turf/unsimulated/wall,/area/ninja/holding)
"fh" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/ninja/holding)
"fi" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/ninja/holding)
"fj" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/ninja/holding)
"fk" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/ninja/holding)
-"fl" = (/obj/structure/artilleryplaceholder{tag = "icon-14"; icon_state = "14"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fm" = (/obj/structure/artilleryplaceholder{tag = "icon-17"; icon_state = "17"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fn" = (/obj/structure/artilleryplaceholder{tag = "icon-16"; icon_state = "16"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fo" = (/obj/structure/artilleryplaceholder{tag = "icon-19"; icon_state = "19"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fp" = (/obj/structure/artilleryplaceholder{tag = "icon-18"; icon_state = "18"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fq" = (/obj/structure/artilleryplaceholder{tag = "icon-21"; icon_state = "21"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fr" = (/obj/structure/artilleryplaceholder{tag = "icon-20"; icon_state = "20"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fs" = (/obj/structure/artilleryplaceholder{tag = "icon-23"; icon_state = "23"},/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/centcom/control)
+"fl" = (/obj/machinery/cryopod,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"fm" = (/turf/unsimulated/wall,/area/centcom/gamma)
+"fn" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma)
+"fo" = (/obj/machinery/porta_turret/centcom/pulse,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/centcom/gamma)
+"fp" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/obj/structure/table/reinforced,/obj/item/weapon/paper,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma)
+"fq" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma)
+"fr" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma)
+"fs" = (/obj/structure/table/reinforced,/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; name = "Gamma Turret Control Panel"; pixel_x = 0; req_access = list(114)},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/centcom/gamma)
"ft" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/ninja/outpost)
"fu" = (/turf/unsimulated/floor{icon_state = "dark"},/area/ninja/outpost)
"fv" = (/obj/structure/ninjatele{pixel_y = 25},/turf/unsimulated/floor{icon_state = "dark"},/area/ninja/outpost)
@@ -288,8 +288,8 @@
"fB" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja/holding)
"fC" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja/holding)
"fD" = (/obj/structure/rack,/obj/item/device/camera,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding)
-"fE" = (/obj/structure/artilleryplaceholder{tag = "icon-22"; icon_state = "22"},/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/centcom/control)
-"fF" = (/obj/structure/artilleryplaceholder{tag = "icon-24"; icon_state = "24"},/turf/space,/area/centcom/control)
+"fE" = (/obj/machinery/porta_turret/centcom/pulse,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/centcom/gamma)
+"fF" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/gamma)
"fG" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/ninja/holding)
"fH" = (/turf/unsimulated/beach/sand,/area/ninja/holding)
"fI" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/ninja/holding)
@@ -436,7 +436,7 @@
"it" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership)
"iu" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"iv" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/assault_pod)
-"iw" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"iw" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
"ix" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station)
"iy" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/wizard_station)
"iz" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station)
@@ -447,7 +447,7 @@
"iE" = (/turf/space,/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/space)
"iF" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/turf/simulated/floor/plating,/area/shuttle/assault_pod)
"iG" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
-"iH" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"iH" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"iI" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"iJ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
"iK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
@@ -484,8 +484,8 @@
"jp" = (/turf/simulated/floor/plasteel,/area/tdome/arena_source)
"jq" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/tdome/arena_source)
"jr" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/saber/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
-"js" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
-"jt" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"js" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
+"jt" = (/obj/item/weapon/storage/fancy/crayons,/obj/machinery/light{dir = 1; on = 1},/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"ju" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"jv" = (/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"jw" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/obj/docking_port/mobile/assault_pod,/turf/simulated/floor/plating,/area/shuttle/assault_pod)
@@ -499,13 +499,13 @@
"jE" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/twohanded/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"jG" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/storage/backpack/holding{pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"jH" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/loyalty{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"jH" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/centcom/gamma)
"jI" = (/turf/space,/area/adminconstruction)
"jJ" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"jK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"jL" = (/obj/docking_port/stationary/transit{dwidth = 3; height = 7; id = "steel_rain_transit"; name = "steel_rain in transit"; width = 7},/turf/space/transit/horizontal,/area/space)
"jM" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard/syndicate,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jO" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"jP" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship)
"jQ" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship)
@@ -521,7 +521,7 @@
"ka" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship)
"kb" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"kc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/mugwort,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"kd" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"kd" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/gamma)
"ke" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"kf" = (/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"kg" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
@@ -621,11 +621,11 @@
"lW" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"lX" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"lY" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
-"lZ" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"ma" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
+"lZ" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/gamma)
+"ma" = (/obj/effect/decal/cleanable/molten_object,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"mb" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station)
"mc" = (/obj/item/trash/chips,/obj/machinery/light/spot,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"md" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable,/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
+"md" = (/obj/structure/extinguisher_cabinet,/turf/unsimulated/wall,/area/centcom/gamma)
"me" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"mf" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"mg" = (/obj/item/weapon/mop,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
@@ -744,21 +744,59 @@
"op" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/escape)
"oq" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape)
"or" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape)
+"os" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon,/obj/item/weapon/reagent_containers/food/snacks/grown/berries,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/corn,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
+"ot" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"ou" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"ov" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"ow" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
+"ox" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
+"oy" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
+"oz" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
+"oA" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"oB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership)
"oC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership)
+"oD" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
+"oE" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
+"oF" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
+"oG" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"oH" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"oI" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"oJ" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/light{dir = 1; on = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"oJ" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
+"oK" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/centcom/gamma)
+"oL" = (/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/gamma)
+"oM" = (/obj/machinery/door/airlock/centcom{name = "Team Storage"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops)
+"oN" = (/obj/machinery/power/apc{dir = 8; name = "Gamma Armory APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"oO" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"oP" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"oQ" = (/obj/machinery/vending/syndisnack,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"oR" = (/obj/machinery/vending/syndicigs,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"oS" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = 6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
+"oT" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/centcom/gamma)
+"oU" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/centcom/gamma)
+"oV" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/centcom/gamma)
+"oW" = (/obj/structure/sign/securearea,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
+"oX" = (/obj/machinery/door/airlock/centcom{name = "Prison"; opacity = 1; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
+"oY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
+"oZ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
"pa" = (/obj/structure/noticeboard{pixel_x = -32},/obj/item/weapon/paper/syndimemo,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"pb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops)
"pc" = (/mob/living/simple_animal/pet/fox/Syndifox,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pd" = (/obj/effect/decal/warning_stripes/southeastcorner,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pe" = (/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"pf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
+"pg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
+"ph" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
+"pi" = (/obj/structure/cable,/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
+"pj" = (/obj/structure/cable,/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
+"pk" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
"pl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pm" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"pn" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
+"po" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"pp" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership)
+"pq" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
+"pr" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"ps" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control)
"pu" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (NORTHWEST)"; icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership)
"pv" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership)
"pw" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice{pixel_x = -5; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
@@ -766,8 +804,21 @@
"py" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership)
"pz" = (/turf/unsimulated/floor{icon_state = "floor"},/area/syndicate_mothership)
"pA" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "floor"},/area/syndicate_mothership)
+"pB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{dir = 4; pixel_x = 32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"pC" = (/obj/machinery/door/poddoor{id_tag = "nukeop_ready"; name = "Shuttle Dock Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
+"pE" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"pF" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership)
+"pG" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
+"pH" = (/obj/machinery/door/airlock/centcom{name = "Prison Cell"; opacity = 1; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops)
+"pI" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pJ" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pK" = (/obj/structure/flora/ausbushes/pointybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pL" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pM" = (/obj/structure/flora/ausbushes/brflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pN" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pO" = (/obj/structure/flora/ausbushes,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pP" = (/obj/structure/flora/ausbushes/leafybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"pQ" = (/obj/structure/closet/secure_closet/brig,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"pR" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"pS" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"pT" = (/obj/structure/table/woodentable,/obj/item/device/syndicatedetonator,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
@@ -775,51 +826,80 @@
"pV" = (/obj/effect/decal/warning_stripes/north,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pW" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pX" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"pY" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"pZ" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"qa" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"qb" = (/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
+"qc" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"qd" = (/obj/machinery/door/airlock/centcom{name = "Medical Treatment Post"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"qe" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/centcom/evac)
"qf" = (/obj/effect/decal/warning_stripes/southeastcorner,/obj/item/device/radio/intercom/syndicate{pixel_x = -28},/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"qg" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"qh" = (/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"qi" = (/obj/effect/decal/warning_stripes/southwestcorner,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"qj" = (/obj/machinery/door/window{dir = 4; name = "Uplink Management Control"; req_access_txt = "151"},/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
+"qk" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/centcom/evac)
+"ql" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/centcom/evac)
+"qm" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/centcom/evac)
+"qn" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/centcom/evac)
+"qo" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac)
+"qp" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac)
+"qq" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/centcom/evac)
"qr" = (/obj/structure/sign/double/map/left{pixel_y = -32},/obj/effect/decal/warning_stripes/west,/obj/machinery/light,/obj/structure/rack/skeletal_bar/left,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
+"qs" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac)
"qt" = (/obj/machinery/computer/telecrystals/boss,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership)
"qu" = (/obj/structure/sign/double/map/right{pixel_y = -32},/obj/structure/rack/skeletal_bar/right,/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
+"qv" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/centcom/evac)
"qw" = (/obj/machinery/door/airlock/multi_tile/glass{name = "Equipment Room"; opacity = 0; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"qx" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/centcom/evac)
+"qy" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/centcom/evac)
+"qz" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/centcom/evac)
+"qA" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/centcom/evac)
+"qB" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/centcom/evac)
+"qC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/brute,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/centcom/evac)
"qD" = (/turf/unsimulated/floor{dir = 2; icon_state = "stage_stairs"},/area/syndicate_mothership)
"qE" = (/obj/machinery/mech_bay_recharge_port/upgraded,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/unsimulated/floor,/area/syndicate_mothership)
"qF" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/syndicate_mothership)
"qG" = (/obj/machinery/computer/mech_bay_power_console,/turf/unsimulated/floor,/area/syndicate_mothership)
"qH" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
+"qI" = (/turf/unsimulated/wall,/area/centcom/suppy)
+"qJ" = (/obj/structure/stool/bed,/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qK" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/centcom)
"qL" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
"qM" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
+"qN" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qO" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qP" = (/obj/effect/decal/cleanable/blood,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qQ" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/centcom)
+"qR" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qS" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/centcom)
+"qT" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qU" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/centcom)
+"qV" = (/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"qW" = (/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/centcom)
"qX" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/syndicate_mothership)
+"qY" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/centcom)
+"qZ" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom)
+"ra" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"rb" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"rc" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"rd" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{icon_state = "panelscorched"},/area/centcom)
"re" = (/obj/structure/closet/syndicate/personal,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/syndicate_mothership)
"rf" = (/obj/structure/table,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
+"rg" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"rh" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/centcom)
+"ri" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/centcom)
+"rj" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/mindshield{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"rE" = (/turf/unsimulated/wall,/area/start)
"rH" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start)
"rK" = (/turf/unsimulated/wall/splashscreen,/area/start)
-"rP" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"rQ" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"rU" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"rV" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"rW" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"rX" = (/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"rY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"rZ" = (/obj/machinery/power/apc{dir = 4; name = "Gamma Armory APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"sa" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
"sb" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/shuttle/gamma/space)
-"sc" = (/turf/simulated/wall/r_wall,/area/shuttle/gamma/space)
-"sd" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/shuttle/gamma/space)
"se" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/shuttle/gamma/space)
-"sf" = (/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/space)
"sg" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
-"sh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
-"si" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
-"sj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
-"sk" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
-"sl" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
"sm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
-"sn" = (/obj/structure/cable,/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
-"so" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/obj/machinery/light,/turf/simulated/floor/mech_bay_recharge_floor,/area/shuttle/gamma/space)
"sq" = (/turf/unsimulated/wall,/area/centcom/control)
"sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
@@ -877,7 +957,6 @@
"tw" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
"tx" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control)
"ty" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control)
-"tz" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
"tA" = (/obj/machinery/computer/pod/deathsquad,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"tB" = (/obj/structure/table,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/control)
"tC" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/control)
@@ -891,8 +970,6 @@
"tK" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/control)
"tL" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/control)
"tM" = (/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/control)
-"tN" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/control)
-"tO" = (/obj/structure/table,/obj/item/weapon/card/id/centcom,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control)
"tQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control)
"tR" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"tS" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control)
@@ -917,8 +994,6 @@
"ul" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Starting Room"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"um" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"un" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
-"uo" = (/turf/unsimulated/floor{icon_state = "asteroid6"; name = "sand"},/area/centcom/specops)
-"up" = (/obj/structure/extinguisher_cabinet,/turf/unsimulated/wall,/area/centcom/specops)
"uq" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"ur" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"us" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -932,7 +1007,6 @@
"uA" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/centcom/specops)
"uB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/centcom/specops)
"uC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/centcom/specops)
-"uD" = (/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uE" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control)
"uF" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom/specops,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"uG" = (/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
@@ -950,7 +1024,6 @@
"uS" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uT" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
"uU" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
-"uV" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uW" = (/obj/structure/urinal,/turf/unsimulated/wall,/area/centcom/specops)
"uX" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"va" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "Commando_Manual"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -962,9 +1035,7 @@
"vg" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vh" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vi" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
-"vj" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vk" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
-"vl" = (/obj/effect/decal/cleanable/vomit{name = "urine"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vm" = (/obj/structure/table/reinforced,/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vn" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/centcom/specops)
"vo" = (/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/specops)
@@ -982,15 +1053,10 @@
"vA" = (/obj/structure/table/woodentable{dir = 9},/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"vB" = (/obj/machinery/computer/security/telescreen{name = "Special Ops. Monitor"; desc = "Used for watching the Special Ops."; network = list("ERT")},/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops)
"vC" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/radio/intercom/specops,/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
-"vE" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control)
"vF" = (/obj/machinery/door/airlock/centcom{name = "Telecommunications"; opacity = 1; req_access_txt = "107"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
-"vG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
-"vH" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vI" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vJ" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vL" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"vM" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_y = 16; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_y = -4; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_y = 6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
-"vO" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
"vP" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops)
"vQ" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control)
"vS" = (/obj/machinery/newscaster/security_unit{pixel_x = -32},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops)
@@ -1044,8 +1110,6 @@
"xI" = (/obj/machinery/door/airlock/centcom{name = "Unit 2"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
"xJ" = (/obj/machinery/door/poddoor{id_tag = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac)
"xK" = (/obj/structure/table,/obj/machinery/door/window/southleft{name = "security checkpoint"; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
-"xL" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
-"xM" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
"xR" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/evac)
"xS" = (/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/evac)
"xW" = (/obj/machinery/door/airlock/centcom{name = "Unit 1"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
@@ -1154,7 +1218,7 @@
"DB" = (/obj/structure/rack,/obj/item/clothing/mask/gas/swat{pixel_x = -3; pixel_y = 3},/obj/item/clothing/mask/gas/cyborg,/obj/item/clothing/mask/gas/voice,/obj/item/clothing/mask/balaclava{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DC" = (/obj/structure/rack,/obj/item/clothing/head/bandana,/obj/item/clothing/head/ushanka,/obj/item/clothing/head/helmet/roman/legionaire,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DD" = (/obj/structure/rack,/obj/item/clothing/head/helmet/swat/syndicate{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/deathsquad,/obj/item/clothing/head/helmet/space/deathsquad/beret{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"DE" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/wizard{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/rig/syndi,/obj/item/clothing/head/helmet/space/santahat{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"DE" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/santahat{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DF" = (/obj/structure/rack,/obj/item/clothing/head/welding/flamedecal{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/welding/flamedecal/blue,/obj/item/clothing/head/welding/white{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DG" = (/obj/structure/rack,/obj/item/clothing/head/soft/black{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft/blue,/obj/item/clothing/head/soft/red{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DH" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding,/obj/item/weapon/storage/backpack/duffel/clown,/obj/item/weapon/storage/backpack/duffel/captain,/obj/item/weapon/storage/backpack/duffel/science,/obj/item/weapon/storage/backpack/duffel/syndie/ammo,/obj/item/weapon/storage/backpack/duffel/syndie/med,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
@@ -1183,7 +1247,7 @@
"Ef" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin)
"Eg" = (/obj/structure/rack,/obj/item/clothing/under/syndicate{pixel_x = -3; pixel_y = 3},/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/acj{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Eh" = (/obj/structure/mirror{pixel_y = -30},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"Ei" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/syndi{pixel_x = -3; pixel_y = 3},/obj/item/clothing/suit/space/rig/wizard,/obj/item/clothing/suit/space/santa{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"Ei" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/syndi{pixel_x = -3; pixel_y = 3},/obj/item/clothing/suit/space/hardsuit/wizard,/obj/item/clothing/suit/space/santa{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Ej" = (/obj/mecha/combat/marauder/mauler/loaded,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Ek" = (/obj/mecha/combat/gygax/dark/loaded,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"El" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
@@ -1220,7 +1284,6 @@
"ER" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/weapon/gun/projectile/automatic/gyropistol,/obj/item/weapon/gun/projectile/automatic/gyropistol{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"ES" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/weapon/gun/projectile/automatic/pistol/deagle,/obj/item/weapon/gun/projectile/automatic/pistol/deagle{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"ET" = (/obj/structure/rack,/obj/item/ammo_box/a357,/obj/item/ammo_box/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/item/weapon/gun/projectile/revolver/mateba{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"EU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/lemon,/obj/item/weapon/reagent_containers/food/snacks/grown/berries,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,/obj/item/weapon/reagent_containers/food/snacks/grown/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/corn,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
"EV" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/storage/box/autoinjectors,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
"EW" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
"EX" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
@@ -1296,7 +1359,6 @@
"Gs" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin)
"Gt" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin)
"Gu" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/admin)
-"Gv" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Gx" = (/obj/item/weapon/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin)
"Gy" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo/engraved,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin)
"Gz" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin)
@@ -1429,13 +1491,13 @@ ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapap
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbObqbqbqbsbPbQbPbQbPbsbIbIbIbIbIbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbqbRbSbqbsbTbTbTbTbTbsbUbUbUbUbVbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdndmdmdmdrbscabqbqbqbqbscbcccdcccebscfcgchcicfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdxdvdvdvdybsbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcRcScTcocScUcocScVcocWcXcocScUcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbEcabqbRbsbTbTbTbTbTbsdbcwcxcydbbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcododpcodocXcododqcodocUcodocTcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbqbqcabqbsdsdtdsdtdsbsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapaparapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqdGbqbqcabsbGbHbGbHbGbsducwcxcydubsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsczbMbMbMcAbD
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocSdpcodKcTcocScTcodLcUcocScXcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdCdBdBdBdDbsbRbqdNbqbEbsbtbubtbubtbsdOdPdQdRdObsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsdSdTdTdTdUbD
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcodocTcodocUcodocUcodoedcodoeecoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNhyhzhzhzhzhzbZejejejejejbZejejejejejbZejejejejejbZekekekekekbZekekekekekbZekekekekekbZekekekekekel
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeneoepeneobseqeqeqeqeqbserererererbseseseteueubsevevevevevbsewexexexeybsezeAeAeAeBbD
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdxdvdvdvdybsbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbEcabqbRbsbTbTbTbTbTbsdbcwcxcydbbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbqbqcabqbsdsdtdsdtdsbsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapaparapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqdGbqbqcabsbGbHbGbHbGbsducwcxcydubsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsczbMbMbMcAbD
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdCdBdBdBdDbsbRbqdNbqbEbsbtbubtbubtbsdOdPdQdRdObsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsdSdTdTdTdUbD
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNhyhzhzhzhzhzbZejejejejejbZejejejejejbZejejejejejbZekekekekekbZekekekekekbZekekekekekbZekekekekekel
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeneoepeneobseqeqeqeqeqbserererererbseseseteueubsevevevevevbsewexexexeybsezeAeAeAeBbD
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckbockckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeoepeneoepbseqeDeqeqeqbsereEeFeGerbseHeHeIeJeJbseveKeveLevbseMeNeNeNeObsePeQeQeQeRbD
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapavapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpepeneoepenbseqeqeqeXeqbsereYeYeYerbseHeZeZeZeJbsevevevevevbseMeNeNeNeObsePeQeQeQeRbD
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNfffffffffffgfgfhfififjfgfgfgfgfgfgfgfgfgfkfgfgfgaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpeneoepeneobseqeqeqeqeqbserererererbseHeIeIeIeJbsevevevevevbseMeNeNeNeObsePeQeQeQeRbD
@@ -1459,7 +1521,7 @@ ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckck
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihiLiLikikikiMihiNiOiPihaNaNisaNaNaNaNaNititititaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatauauauataNaNaNaNaNaNaNaNaNbZbZbZiZiZiZiZiZjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaiZiZiZiZiZbZbZbZaNaNaN
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihikikikikjdjdihihjeihihaNaNisaNaNaNaNaNitjgjhitaNaNaNaNaNaNaNaNaNaNmrmrmrmrmrmrmrmrmrmrmrmrmrmxmwatatatatataFaGaGaGaGaGaGaGaHatataIatataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihjAjAikjBjCjDihjEjejFihaNaNisaNaNaNaNaNititititititititititititaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmzmyataJaJaJaKauauauauauauauauaKaKaKauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkbikikjBkckdihkekfkgihaNaNisaNaNaNaNaNkikjkkklkmknkjkokpkqkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmBmAataKauauauauauauauaMauauauauauauauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpkBkCkBjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkbikikjBkceUihkekfkgihaNaNisaNaNaNaNaNkikjkkklkmknkjkokpkqkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmBmAataKauauauauauauauaMauauauauauauauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpkBkCkBjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkJikikikikihihihihihihaNaNisaNaNaNaNaNkKkjknknkLknkjknkrkrkrksaNaNmraNaNaNaNaNaNaNaNaNaNmDmCmFmEatbhauauauauauaubibibiauauauauauauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpkBkTkBjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkWkXkYkZiklalblcldleihaNaNisaNaNaNaNaNlgiBknknkLknkjkokpkrkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmGmEatbhauauauauaubjbibibibjauauauauauaKataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihlolplqikikiklrlsltluihaNaNisaNaNaNaNiClgiBknknknknlxknkrkrkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmEmEatbhauauauauauaubjbjbjauauauauauauauataNaNaNaNaNaNaNaNaNbZbZbZlBlBlBlBlBlClDjpjpjpjpjpjplEjpjpjpjpjpjplDlClBlBlBlBlBbZbZbZaNaNaN
@@ -1468,64 +1530,64 @@ aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckck
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihihihihihihihihihihihihaNaNisaNaNaNaNaNmtkjknknmuknkjkokpmvkrksaNaNaNaNaNaNmKmEmLmNmMmOmOmMmEmQmPatatbkatatatatatatatatatatatatatbkatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNititititititititititititititititititaNaNaNaNaNaNmKmEmEmEmEmEmEmEmEmQmRatblblataNaNaNaNaNaNaNaNaNaNaNatblblataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckbmckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNmKmEmMmOmOmOmSmMmEmEmTatblblataNaNaNaNaNaNaNaNaNaNaNatblblataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckaackckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNmUmVmEmEmEmEmEmEmEmEatatblblatatatatatatatatatatatatatblblatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckaEckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababababacababababababababababababababababababnjaNaNaNaNaNmrmrmrmWmrmXmOmOmMmEmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbnaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababacabababababababababababababababababababababababababnjaNaNaNaNaNmrmYnamZmrmEmEmEmEnbncataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababadababababababababababababaeababacabafababnjaNaNaNaNaNmrndndnemrnfngngngnhniataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckawckckckckckaxckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababababababababababababafabafababababafabababnjaNaNaNaNaNmrndnkmrmraNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababababababababababacababadababacafabadabababnjaNaNaNaNaNmrmrmrmrmraNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababagagagagagagagababababahababacabahabababacabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiacabababababajagagakagakababafabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlnmataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababacamnjnjoBoCnjnjanagagagnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababaonjnjoHoIoIoJnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalababadaonjaLoOoOoOoOfZoQoRnjfYjMmgnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiababababaSnjpaoOmfmfpcoOpdpepWpXpXganjnjnjnjnjnjnjnjnjnjnjnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNaTagagababaUamnjplmfpmjNmfoOmkppnjpXggnjnjghgjgigxgxhggxgxhxhGnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNpupvpvpvpvpvoCnjmhmfpwpxmfoOmkppnjnjnjnjnjgjgiiuiwiviFiviHiGhxnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaiaNaNaNaNaNaNaNaNaNpypzpApzpzpzpzpCoOJboOoOoOoOmkppnjnjnjnjnjgjiIiwiviJiSiKiviHiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNpFaVoBpvpvpvoCnjmimfmfmfmhoOmkppoBpvpvpvpvpvpviviJiSiUiSiKiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaWaNaiababaXnjpRpSpTpSjOoOpUpViWiViViXiViViWiFiSiYjjjiiSiFiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaYabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaZabaonjqfqgqhqiqjoOoOoOoBpvpvpvpvpvpviviJiSjkiSiSiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabaonjnjppqtqrqunjqwoOnjnjnjnjnjgjiIjsiviJiSiKivjtiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaNaNaNanabababnjnjnjnjnjnjqDqDqEqFqGqHnjgjjvjujsivjwivjtjxjynjaNaNaNatatatatatatatatatatatatatatatatatatatatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaiabababbababbaXnjqLqMqMqMqMqMnjjzgjjvjJjJjKjJjJjyjznjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababacababaoqXqMqMqMqMqMmlnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababadbcakamnjrerererererfnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababaonjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbdabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbXbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaNaNaNaNaNabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaiaNaNaNaiabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaiabababababababaiaNaNaNaiababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErHrErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqasaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-rKrErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWcPbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckaackckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNmUmVmEmEmEmEmEmEmEmEatatblblatatatatatatatatatatatatatblblatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckaEckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNmrmrmrmWmrmXmOmOmMmEmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbnaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNmrmYnamZmrmEmEmEmEnbncataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNmrndndnemrnfngngngnhniataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckawckckckckckaxckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNmrndnkmrmraNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNmrmrmrmrmraNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababababababababababacababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababacabababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNnlnmataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababacaeabababaeababababacabaeabababababababacababaeabababacabnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaeabacababaeabababaeabababababacababaeabababababababacaeabababnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNatatatatatatatatatatatatatatatatatatatatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababababababahababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababaonjafnjafnjalabaonjafnjafnjalababababababacabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababaoajoOajoOajalabaoajoOajoOajalabacababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbXbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaeabamakoOakoOakanagamakoOakoOakaSagagababaeabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaeababacaeababaonjnjafnjafnjaTpvoCnjafnjafnjnjnjnjaUababacababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaeababababacaonjaZoOoOoOaZoOoOoOaZoOoOoOaZoOoOnjalabababaeabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababaeabababaonjoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOnjalacababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaeababababaeabaeaonjaTpvpvpvpvpvpvpvpvpvpvpvoCnjbbnjalabaeabacabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaeacababagagagbcbcbcbcbababababababababaaXnjoOnjaUabacabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiacababaeababagagamnjoOnjalabababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjacaeabababaNaNaNaNaNaNaNaNaNaUabababacamnjnjqXnjbdnjiwagiHagiHagnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababaonjnjoHoIjtoOnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalaeabadaonjaLoOoOoOoOfZoQoRnjfYjMmgnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabacabababaiaNaNaNaNaNaNaNaiababababjsnjpaoOmfmfpcoOpdpepWpXpXganjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErHrErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNiwagagagagiHamnjplmfpmjNmfoOmkppnjpXggnjnjghgjgigxgxhggxgxhxhGnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababaeabababaNaNaNaNaNpupvpvpvpvpvoCnjmhmfpwpxmfoOmkppnjnjnjnjnjgjgiiuotiviFivouiGhxnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjacabaiaNaNaNaNaNaNaNaNaNpypzpApzpzpzpzpCoOJboOoOoOoOmkppnjnjnjnjnjgjiIotiviJiSiKivouiTnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNpFaVoBpvpvpvoCnjmimfmfmfmhoOmkppoBpvpvpvpvpvpviviJiSiUiSiKiviTnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaWaNaiababaXnjpRpSpTpSjOoOpUpViWiViViXiViViWiFiSiYjjjiiSiFiTnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqasaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaYabaNaNaNaNaNaNaNaNaNaNaNaNaNaNovabaonjqfqgqhqiqjoOoOoOoBpvpvpvpvpvpviviJiSjkiSiSiviTnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaeabaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabaonjnjppqtqrqunjqwoOnjnjnjnjnjgjiIowiviJiSiKivoxiTnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+rKrErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWcPbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaNaNaNanabababnjnjnjnjnjnjqDqDqEqFqGqHnjgjjvjuowivjwivoxjxjynjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaiabababbabaoyaXnjqLqMqMqMqMqMnjjzgjjvjJjJjKjJjJjyjznjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababacababaoqXqMqMqMqMqMmlnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababadoAozamnjrerererererfnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababaonjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNoDaeababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaNaNaNaNaNabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNabaiaNaNaNaiabaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaiabababababababaiaNaNaNaiababaeabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZbZbZbZbZbZrPrQdebZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZcYlZrUrVrWrXrXrXbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZrXrXrXrXrXrXrYrZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZsasbsbsbscsdsesbbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNsfsgsgsgsgsashsisjbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZsgskslsmsasnsomdbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZbZbZbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1549,77 +1611,77 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqsqsqsqsqsysEmnsMsNmnsEsEsOmosqsQsQsQsQsqsRsSsTsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsvsEsEsEsEsEsEsEsEsysysqsQsUsVsVsqsqsWsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsqaNaNaNsvsEsEsEsEsEsEsEsEsEsEsusQmpmpsQsQsQsQsZsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqtztztztztztztzsudZdYebeasuecegefeieheCemeTeSeVeUeWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqtztztztztztztzsufbfatLfcsufdflfefnfmfpfofrfqfEfsfFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititItktitititItJtmtntdtdtdsqtKtLtMtNtFtFtFtFtFtOsqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqsususqsqsqsususususqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititititVtktitititVtWtXtYtdtdtdsqtztztztztztztztztztzsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXuaubsXsqsqsqsqsqsqsqsXsXsXsXsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXufuguguhuiujujujsXukukukukulukumunuououosqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNupujujujujujujujujuqururururururussXsXsXsXsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNupujujujujujujujujsXuAuBuBuBuBuBuCsXuDuDuDsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujuOuPuQuRujuSsXsXuTuUuTsXsXunsXuVuVuVsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXuWsXsXujuXuRooonvavbujvcvdvdvdvdvesXuosXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvjvkvlsXujujvauRvmuRujujvnvdvovpvqvdsXsXsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvkvxujujujvyvyujujujvzvdvAvBvCbesXvEtTuEtRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMmjvOvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXvWtRtRtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXwkudududwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXsqsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwDwEwFwGwCwHwIwJwKwLwMwNwOwPwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCwIwIwIwIwIwIwKxcxdxexdxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbgsXaNaNaNaNaNwCwDxlwIwIwIwIwIwIwKxmxnwNxoxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCwIxxwCwHwIwJwKxyxzxAxzxzwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbYbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwDxIwIxxwCwCwCwKwKxJxzxKxzwLwPxzxLxLxMxLxLxMwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCwIwIwIwIwIxRwLxSxSxSxSwMxfxdxLwKxzxzxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwDxWwIwIwIwIwIxRxmxXxYwNxXxYxfxdxLwKxZxZxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyaybycydyeaNazaNaNaNaAaNyaybycydyeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwCwCwCyfyfyfyfyfwKxmxXxYwNxXxYxfxzxLwKwNwNwNygxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyjyjyjykylaBylylylaBylyoyjyjyjyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxdxmxXxYwNxXxYxfypxdwKyqwNwNyrcnytcncDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvywyxyyyNyAyByCyNyyyEyFyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxdxmxXxYwNxXxYxfyGytyGwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvyKyLyMyNyMyOyMyNyMyPyKyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKxyyQyQyQyRwNxfypxdwKyqwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyFyvyTyMyNyNyNyNyNyNyNyMyTyvywyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwKwKwKxdxdwKwKxmwNxfxdxLwKwNwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySylyoyWyXyYyZyNzazbyNzcykylyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqcScRcUcTcWcVcXsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqdodedqdpdLdKdesufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtYtdtdtdsXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmsXsXsXsXsXsXuaubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfofnfqfpfsfrfnfEfmufuguguhuiujujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoFoErVoGoJfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoNoPrXrXrXrXfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmsasesbsbsaoWfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXuTuUuTsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpfphpgsgsgsgfmaNaNaNaNaNaNaNaNsXujuXuRooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipkpjsmpnpofmaNaNaNaNsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNaNaNaNsXvkvkpqprujujujvyvyujujujvzvdvAvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvksXvIvJujujujujvLujsXvdoSmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXuKsqvWtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXuKsqwkudwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvxsXsXaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXoXsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvksXaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwDwEwFwGwCwHwIwJwKwLwMwNwOwPwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpGsXaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujwCwCwCwIwIwIwIwIwIwKxcxdxexdxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXaNaNaNaNaNaNaNaNaNaNbgsXsXsXsXujuSwCwDxlwIwIwIwIwIwIwKxmxnwNxoxfwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwCwCwIxxwCwHwIwJwKxyxzxAxzxzwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbYbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujwCwDxIwIxxwCwCwCwKwKxJxzxKxzwLwPxzpJpIpLpKpNpMwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXujujwCwCwCwIwIwIwIwIxRwLxSxSxSxSwMxfxdpOwKxzxzxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwDxWwIwIwIwIwIxRxmxXxYwNxXxYxfxdpPxzxZxZxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyaybycydyeaNazaNaNaNaAaNyaybycydyeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujwCwCwCyfyfyfyfyfwKxmxXxYwNxXxYxfxzpJxzwNwNwNygxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyjyjyjykylaBylylylaBylyoyjyjyjyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXujujpQsXaNaNaNaNaNaNxdxmxXxYwNxXxYxfypxdwKyqwNwNyrcnytcncDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvywyxyyyNyAyByCyNyyyEyFyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujpYsXaNaNaNaNaNaNxdxmxXxYwNxXxYxfyGytyGwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiyvyvyKyLyMyNyMyOyMyNyMyPyKyvyvyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXujujpHujujpQsXaNaNaNaNaNaNwKxyyQyQyQyRwNxfypxdwKyqwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyFyvyTyMyNyNyNyNyNyNyNyMyTyvywyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXaNaNaNwKwKwKwKxdxdwKwKxmwNxfxdpZwKwNwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySylyoyWyXyYyZyNzazbyNzcykylyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKzdzezfmqzezewKxmwNxfypxdwKyqwNwNwNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizhzizjzkyNzazbyNyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKzlzezmmqzezeznxmwNxfyGytyGwNwNwNygxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizqzrzryZyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezumqzezewKxyyQzvwKwKwKyqwNwNyrcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizxzrzrzyyNyMyMyNyNaBaCaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezezezezewKwKzBwKwKxLwKwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNykylylylyoyNzazbyNzHyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjytytytwKxLwKxZxZxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizOzOzPzQyNzazbyNzRyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcqytytytwKxLwKxzxzxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNzVzWzWzWzXyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytwKxLxLxLxLxLxLwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWAlyNyNyNyNyNaBaDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcBytytytwKwKwKwKwKwKwKAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiADzWzWzQyNyMyMyMyPyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjaNaNaNaNaNaNaNaNaNaNaNcEcGcFytytytcHwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWzXyNAMANAOyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcIytytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySAXAXylylAYylylAXAXyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyoBbzayNzbBcykyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcJytytytcKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAMyMBeyMBfyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKcLcLwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiBhBiBjBkBlyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwwKytytytcraNaNaNaNaNcMaNaNaNaNcrytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySBqBrBrBrBsyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcNbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNdwAwwKytaNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwaNaNaNaNaNaNaNAwwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezezezezewKwKzBwKwKqaxzwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNykylylylyoyNzazbyNzHyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjytytytwKpIxzxZwNxZwNcnytcnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizOzOzPzQyNzazbyNzRyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcqytytytwKpMwKxzwNxzxzxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNzVzWzWzWzXyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytwKpLqbqcwNqcpIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWAlyNyNyNyNyNaBaDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHkHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcBytytytwKwKwKwKqdwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiADzWzWzQyNyMyMyMyPyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNcjaNaNaNaNaNaNaNaNaNaNaNcEcGcFytytytcHwKqeqlqkqkqmwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWzXyNAMANAOyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcIytytytytwKqnqpqoqoqqwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySAXAXylylAYylylAXAXyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytytwKqnqvqsqsqxwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyoBbzayNzbBcykyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcJytytytcKwKqyqAqzqCqBwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAMyMBeyMBfyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjwKcLcLwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiBhBiBjBkBlyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNqIqIqIqIqIqIqIqIqIwKytytytcraNaNaNaNaNcMaNaNaNaNcrytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySBqBrBrBrBsyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcNbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNqIaNaNaNaNaNaNdwqIwKytaNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNHjIMIMIMIRIMISISISISISIMIRIMIMIMHjaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNHjHjHkHjHjHjHjITIUIVHjHjHjHjHkHjHjaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNqIaNaNaNaNaNaNaNqIwKytcraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcrwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNqIqIqIqIqIqIqIqIqIwKytytcraNaNaNaNaNaNaNaNaNaNaNaNaNcrytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKytytytcraNaNaNaNaNaNaNaNaNaNcrytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcObWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcObWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqJqKAwqJqNAwqJqOAwqQqPAwqJqNAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqRqSAwqRqTAwqRqUAwqRqVAwqRqWAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqYqZAwqYqZAwqYqZAwqYqZAwqYqZAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwrarararararbrararbrararararaAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwrararcrararararararararararaAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqYqZAwqYqZAwqYqZAwqYqZAwqYqZAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqRqSAwrdqWAwqRqWAwrgqVAwqRqTAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwqJqKAwqJqNAwqJqNAwqJrhAwqJriAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNaNaNaNDuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1630,12 +1692,12 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbW
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNDZDKDKDKDKDKEdDADTDKDUDKDVDWDXDYDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfEgDKEaEbEcDKEiDADKDKDKDKDKDKDKEeDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNiQDAiRDKDKDKDKDKjfDAEjDKEkDKElDWDXDYEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAjGEhDKDKDKEhjHDADKDKDKDKDKDKDKEmDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAjGEhDKDKDKEhrjDADKDKDKDKDKDKDKEmDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDuaNDADwDwDMEoDMDwDwDwDwDwDMEpDMDwDwDwEnaNDtDwEqErErEsDwDuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDADwDwEtDKDKDKDKDKDKDKDKDKDKDKDKEuDAEnaNDvDwEvEwExEyEwEzDwjIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEBDKECDKDKDKDKDKDKDKDKDKDKDKDKDKDKDAaNaNaNEDEEEFEwEwEwEGEDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWnnbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDADwDwDwDwDwDMEHDMDwDwDwDwDwEIDKDKDAaNaNaNEJEKEwEwEwEwELEJaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEnaNEMDAENEOEPDKDKEQERESETEuDADKDKDAiEaNDtDAEUEwEVEWEwEXDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEnaNEMDAENEOEPDKDKEQERESETEuDADKDKDAiEaNDtDAosEwEVEWEwEXDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWjLbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYDKDKDKDKDKDKDKDKDKDKEYDKDKDADwEZDwDwDwFaDwDwFaDwDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFbFcFdDKDKDKFeFeFeDKEHDKDKDAFfEwEwdfDADKDAFhFiFjDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYDKDKDKDKkhFkDwDwDwDwDADKDKDAEwEwFlFmDADKDAFnFoFpDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1646,7 +1708,7 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbW
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAGaGdGeGfGgGhGiGjGbDAGaDKDKDKDKDKDKGbDwDwDwDwDwGaDKGbDwDwGkDwFWFXFXFXGlFXFXFXFYDAaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIGmlhDKDKlvDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXFXGrGsGtFXFXFXGuaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNDKlwDKDKDKDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXGxGyGrGrGxFXFXGzaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfGAGvDKDKlJDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKFkDwDwGkDwGCFXFXGxGxGxFXFXGDDAaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfGADKDKDKlJDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKFkDwDwGkDwGCFXFXGxGxGxFXFXGDDAaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAEIGEGFGGGHGIGJGKFkDAEIDKDKDKDKDKDKFkDwDwEIDKFkDwDwDwDAEnaNEMDwGCFXFXFXFXFXGDDAEnaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwDwDwDwDwDwDwDwDwEIDKDKFkDwDwDwDwDwGLDwDwDwDADAaNaNaNEMDwGCFXFXFXGDDwEnaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDvDAGMGMDAaNDAFvGNFvFvFvGNFvDADAaNaNaNaNEMDwFIFJFKDwEnaNaNaNaNaNaNaN
@@ -1656,25 +1718,25 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDuaNEMDxDyDyDzEIDKDKDAaNDAGVFvFvFvFvFvGWDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwHaHbHcHbHdDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWjVjYjXkajZaNjUjWktkvkukajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNHjHjHjHjHkHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWlLlNlMkajZaNjUjWlOlQlPkajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNHjIMIMIMIRIMISISISISISIMIRIMIMIMHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNHjHjHkHjHjHjHjITIUIVHjHjHjHjHkHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWlLlNlMkajZaNjUjWlOlQlPkajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm
index 0738ff80065..a37392eb029 100644
--- a/_maps/map_files/cyberiad/z3.dmm
+++ b/_maps/map_files/cyberiad/z3.dmm
@@ -4,6 +4,8 @@
"ad" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_z3"; name = "south of telecomms"; width = 18},/turf/space,/area/space)
"ae" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "61"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"af" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "61"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
+"ag" = (/obj/item/stack/spacecash,/turf/simulated/floor/engine,/area/tcommsat/computer)
+"ah" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/ntnet_relay,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"aT" = (/obj/structure/lattice,/turf/space,/area/space)
"ba" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/space)
"bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/space)
@@ -26,7 +28,7 @@
"bY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"bZ" = (/obj/machinery/power/solar,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/space)
"ca" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
-"cb" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
+"cb" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space)
"cc" = (/obj/machinery/camera{c_tag = "Telecomms North Solars"; dir = 8; network = list("Telecomms")},/turf/space,/area/space)
"cd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"ce" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
@@ -94,7 +96,6 @@
"do" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"dp" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"dq" = (/obj/machinery/computer/telecomms/server{network = list("tcommsat")},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
-"dr" = (/obj/item/weapon/spacecash,/turf/simulated/floor/engine,/area/tcommsat/computer)
"ds" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"dt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"du" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
@@ -493,7 +494,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncncpcsctcucvcwcxcyczcpcqcqcqcqcqcqcqcqcAcqcBcCcDcEcFcGcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpcscscscHcIcJcKcLcMcNcqcGcOcPcQcRcScqcTcqcUcGcGcGcGcGcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctcVcWcXcKcYcZdacqdbcGdccGcGddcqcTcqdecGdfcGcGcGcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctctdgdhdidjdkdldmdndodfcGdpdqcqdrcqdsdtcGdudvdwcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctctdgdhdidjdkdldmdndodfcGdpdqcqagcqdsdtcGdudvdwcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctcVdxdydzdAdAdAdBdCdCdDdCdEdHdHdHcqdIdJcGdKdLdMdNdOdOdPdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWbWbWbWbWbWbWbWbWcbbWbWbWbWbWbWbWbWbWbWcrcncpctcsctcVdSdTdUdVdVdVcqdFcGdYcGcGeaebdHcqcqecedcqcqcqcqcncncrbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcbbWbWbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTcrcncpcseecsefdScNdHdHdHdHdHdGeheiehdWemelemdHdHeneoepcseecscpcncrbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -504,7 +505,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaTaaaaaaaaaTaaaaaaaaaafocefqcncpcscscseffrfsdHftfufvfwevevfxevevegfzfAfBdHfCfDfEfFflfGfHcpcnfIceePaaaaaaaaaaaTaaaaaaaaaTaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaTaaaaaaaaaTaaaaaaaaaachaacrcncpctcsctcVfrdadHevfJfKeBeBfLeVfMeBeBfNfOevdHcVfdfPfQflfRfScpcncraachaaaaaaaaaaaTaaaaaaaaaTaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaadXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXchaacrcncpctcsctcVfddadHeveBeBeBeBeBeVeBeBeBeBeBevdHcVfddafQfTfUfVcpcncraachdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaeDeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEcgaacrcncpctcsctcVdSdadHevfWfXeBeBeBeJeBeBeBgagbevdHcVfddafQfQfQcpcncncraTcdeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOePaTbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaeDeEeEeEeEeEeEeEeEeEeEeEeEeEeEeEcgaacrcncpctcsctcVdSdadHevfWfXeBeBeBaheBeBeBgagbevdHcVfddafQfQfQcpcncncraTcdeOeOeOeOeOeOeOeOeOeOeOeOeOeOeOePaTbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaTdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZaaaacrcncpctcsctcVdSdadHevevevevevevgdevevevevevevdHcVfddactcsctcpcncicmaaaTdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcrcncpcseecseffdcNdHdHdHdHdHdHdHgfdHdHdHdHdHdHdHeffdcNcseecscpcncrbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWbWbWbWbWbWbWbWbWbWbWbWcbbWbWbWbWbWbWbWcrcncpctcsctcVggghgidldlgjgkglgmgngogpgqgjdldlgrgsfddactcsctcpcncrbWbWbWbWbWbWcbbWbWbWbWbWbWbWbWbWbWcbbWbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm
index cf6f91d08f6..49a33f2eace 100644
--- a/_maps/map_files/cyberiad/z4.dmm
+++ b/_maps/map_files/cyberiad/z4.dmm
@@ -105,7 +105,7 @@
"ca" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engiestation)
"cb" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/engineering{input_attempt = 1; input_level = 50000; inputting = 1; output_level = 15000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engiestation)
"cc" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engiestation)
-"cd" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/head/helmet/space/rig/engineering,/turf/simulated/floor/plasteel,/area/engiestation)
+"cd" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/turf/simulated/floor/plasteel,/area/engiestation)
"ce" = (/obj/machinery/driver_button{id_tag = "constructiondriver1"; name = "Construction Driver #1"; pixel_x = 25},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/engiestation)
"cf" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/engiestation/solars)
"cg" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/engiestation/solars)
@@ -247,6 +247,7 @@
"eM" = (/obj/machinery/field/generator,/turf/simulated/floor/plating/airless,/area/space)
"eN" = (/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/exploration/methlab)
"eO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/turf/simulated/floor/plating,/area/exploration/methlab)
+"eP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/constructionsite/atmospherics)
"fe" = (/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/constructionsite/medical)
"ff" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/medical)
"fg" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/constructionsite/medical)
@@ -262,7 +263,6 @@
"fv" = (/turf/simulated/wall,/area/constructionsite/atmospherics)
"fw" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics)
"fx" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "d_air_in"; name = "Mixed Air Supply Control"; output_tag = "d_air_out"; pressure_setting = 2000; sensors = list("d_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics)
-"fy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/constructionsite/atmospherics)
"fz" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "d_air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/constructionsite/atmospherics)
"fA" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1443; id_tag = "d_air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/constructionsite/atmospherics)
"fB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics)
@@ -458,13 +458,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdhdtdtdhfrfqfrfqfrfqfqfmfqfmfqfmfqfmdCdidididCfhfhfhfhfififififhfhfhfhfhfhdhdjdjdhabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdhdtdtdhfqfqfqfqfqfqfqfqfmfmfmfmdhdhdhdidididhdhdhfhfhfififififhfhfhfhfhfhdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtdtdtfufrfqfrfqfrfqfrfrfrfqfqdhdhdidididididididhdhfifififififhfhfhfvfvfvdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafudtdtdtfqfqfqfqfqfqfqfqfqfqfqdhdidididididididididhfififififififwfxfyfzfAdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafudtdtdtfqfqfqfqfqfqfqfqfqfqfqdhdidididididididididhfififififififwfxePfzfAdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafudtdtfufrfrfrfrfrfrfrfrfrfqfqdhdidididididididididhfifififhfhfhfBfwfCfDfEdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafufufufufrfrfmfrfrfmfmfmfmfmfmfFdididididididididiftfifififhfhfhfhfhfvfvfvdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafufufufufmfrfmfrfmfqfmfqfmfqfmfFdididididididididiftfififififififGfHfyfIfJdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafufufufufmfrfmfrfmfqfmfqfmfqfmfFdididididididididiftfififififififGfHePfIfJdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafufufufufrfrfrfrfrfmfmfmfmfmfmfFdididididididididiftfifififififififGfCfKfLdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafufufufufrfrfrfrfrfrfrfrfrfqfqdhdidididididididididhfififififififififvfvfvdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMfNfNfNfNfNfNfNfNfNfNfNfMfqfqfqfqfqdhdidididididididididhfififififififGfOfyfPfQdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMfNfNfNfNfNfNfNfNfNfNfNfMfqfqfqfqfqdhdidididididididididhfififififififGfOePfPfQdhdjdjdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMfRfSfRfSfRfRfRfRfRfRfSfNfrfqfrfmfmdhdhdidididididididhdhfvfvfififTfGfifGfCfUfVdhdtdtdCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMfRfRfRfRfRfSfRfSfMfSfSfNaaabaafSfRfSdhdhdhdidididhdhdhababfvfvfvfvfvfvfvfvfvfvdhdjdjdCalabalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMfRfSfRfSfRfRfRfRfRfRfWfNabababfRfRfRfRfRdhdidididhfSfSfRfRfSfRfSfRfRfRfRfSfRfSdjdtdtdjabababalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm
index cef2e888446..86b225e0d1b 100644
--- a/_maps/map_files/cyberiad/z5.dmm
+++ b/_maps/map_files/cyberiad/z5.dmm
@@ -12,7 +12,7 @@
"al" = (/obj/machinery/light/small,/obj/structure/transit_tube,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"am" = (/obj/structure/transit_tube{icon_state = "W-SE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"an" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/mineral,/area/mine/dangerous/explored)
-"ao" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"ao" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"ap" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "NE-SW"},/turf/space,/area/space)
"aq" = (/obj/structure/transit_tube{icon_state = "D-NW"},/obj/structure/lattice,/turf/space,/area/space)
"ar" = (/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
@@ -20,17 +20,17 @@
"at" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
"au" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/mineral,/area/mine/dangerous/explored)
"av" = (/obj/structure/transit_tube{icon_state = "E-SW"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
-"aw" = (/obj/structure/transit_tube,/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"aw" = (/obj/structure/transit_tube,/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"ax" = (/obj/structure/transit_tube/station,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/research_outpost/hallway)
"ay" = (/obj/structure/transit_tube,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway)
-"az" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"az" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"aA" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space)
"aB" = (/obj/structure/transit_tube{icon_state = "W-SE"},/obj/structure/lattice,/turf/space,/area/space)
"aC" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
"aD" = (/obj/structure/transit_tube{icon_state = "S-NE"},/obj/structure/lattice,/turf/space,/area/space)
"aE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"aF" = (/obj/structure/closet/hydrant{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
-"aG" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/stock_parts/cell,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
+"aG" = (/obj/structure/table,/obj/item/device/plant_analyzer,/obj/item/weapon/stock_parts/cell,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"aH" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
"aI" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
"aJ" = (/obj/structure/transit_tube{icon_state = "NE-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
@@ -62,17 +62,17 @@
"bj" = (/turf/simulated/mineral/random,/area/mine/dangerous/unexplored)
"bk" = (/obj/structure/transit_tube{icon_state = "N-SW"},/obj/structure/lattice,/turf/space,/area/space)
"bl" = (/turf/simulated/wall/r_wall,/area/research_outpost/spectro)
-"bm" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weedkiller/triclopyr,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
+"bm" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"bn" = (/obj/machinery/light/small,/obj/structure/closet/walllocker/emerglocker/north{dir = 1; pixel_y = -32},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
"bo" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plating,/area/research_outpost/maintstore1)
-"bp" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_access_txt = "0"; req_one_access_txt = "65;12"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/maintstore1)
+"bp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_access_txt = "0"; req_one_access_txt = "65;12"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/maintstore1)
"bq" = (/turf/simulated/floor/plasteel,/area/research_outpost/maintstore1)
"br" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/research_outpost/maintstore1)
"bs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/camera{c_tag = "Research Outpost Auxiliary Storage"; dir = 8; network = list("Research Outpost")},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/research_outpost/maintstore1)
"bt" = (/obj/structure/table,/turf/simulated/floor/carpet,/area/research_outpost/hallway)
"bu" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/carpet,/area/research_outpost/hallway)
-"bv" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rminingdorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
-"bw" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rdorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
+"bv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "rminingdorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
+"bw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "rdorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/research_outpost/hallway)
"bx" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/lattice,/turf/space,/area/space)
"by" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-SE"},/turf/space,/area/space)
"bz" = (/obj/structure/transit_tube{icon_state = "E-SW"},/obj/structure/lattice,/turf/space,/area/space)
@@ -89,15 +89,15 @@
"bK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/research_outpost/hallway)
"bL" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/research_outpost/hallway)
"bM" = (/turf/simulated/wall/r_wall,/area/research_outpost/atmos)
-"bN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
-"bO" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
+"bN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/atmos)
+"bO" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/atmos)
"bP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"bQ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned)
"bR" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "S-NE"},/turf/space,/area/space)
"bS" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/research_outpost/hallway)
"bT" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
"bU" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/research_outpost/spectro)
-"bV" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Spectrometry Lab Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
+"bV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Spectrometry Lab Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
"bW" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"bX" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"bY" = (/obj/structure/table,/obj/machinery/light{dir = 1},/obj/machinery/reagentgrinder,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
@@ -105,7 +105,7 @@
"ca" = (/obj/machinery/door/window/westleft{dir = 1; name = "Sample Preparation Loading"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/research_outpost/sample)
"cb" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/research_outpost/sample)
"cc" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/research_outpost/spectro)
-"cd" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/research_outpost/maintstore1)
+"cd" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/research_outpost/maintstore1)
"ce" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1)
"cf" = (/obj/structure/sink{pixel_y = 30},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
"cg" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
@@ -124,18 +124,18 @@
"ct" = (/obj/machinery/radiocarbon_spectrometer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/research_outpost/spectro)
"cu" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
"cv" = (/obj/machinery/power/apc{dir = 4; name = "Mass Spectrometry APC"; pixel_x = 24; pixel_y = 0; pixel_x = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/research_outpost/spectro)
-"cw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/research_outpost/maintstore1)
+"cw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/research_outpost/maintstore1)
"cx" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cy" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cA" = (/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/research_outpost/sample)
"cB" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 2},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore1)
-"cC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/research_outpost/maintstore1)
+"cC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/research_outpost/maintstore1)
"cD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1)
"cE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/research_outpost/hallway)
"cF" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
"cG" = (/obj/machinery/door_control{id = "rbath"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
-"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rbath"; name = "Bathroom"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
+"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "rbath"; name = "Bathroom"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/research_outpost/hallway)
"cI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"cJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"cK" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 5; level = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
@@ -155,7 +155,7 @@
"cY" = (/obj/machinery/light/small{dir = 4},/obj/machinery/power/apc{dir = 4; name = "Sample Preparation APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"cZ" = (/turf/simulated/wall/r_wall,/area/research_outpost/anomaly)
"da" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/research_outpost/anomaly)
-"db" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
+"db" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Anomalous Materials Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"dc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"de" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 4},/obj/structure/sign/nosmoking_1{pixel_x = -32},/turf/simulated/floor/plating,/area/research_outpost/atmos)
@@ -173,20 +173,20 @@
"dq" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/camera{c_tag = "Research Outpost Sample Preparation"; dir = 1; network = list("Research Outpost")},/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 3; pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
"dr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
"ds" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/research_outpost/sample)
-"dt" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"dt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"du" = (/obj/machinery/power/apc{dir = 1; name = "Anomalous Materials APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/research_outpost/anomaly)
"dv" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dx" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dy" = (/obj/machinery/light{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dz" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/anomaly)
-"dA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
-"dB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
+"dA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
+"dB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dC" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dD" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dF" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/atmos)
-"dG" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
+"dG" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plating/airless,/area/space)
"dH" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/space)
"dI" = (/obj/structure/alien/weeds{icon_state = "weeds"},/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/space)
"dJ" = (/obj/machinery/door/airlock/hatch,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/space)
@@ -194,9 +194,9 @@
"dL" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/mine/abandoned)
"dM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"dN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
-"dO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Spectrometry Lab"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
+"dO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Spectrometry Lab"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/spectro)
"dP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/sample)
-"dQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
+"dQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/sample)
"dR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/research_outpost/sample)
"dS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"dT" = (/obj/structure/table,/obj/item/weapon/lighter/random,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
@@ -206,7 +206,7 @@
"dX" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/structure/plasticflaps,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/anomaly)
"dY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/research_outpost/hallway)
"dZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
-"ea" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/atmos)
+"ea" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"eb" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"ec" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/research_outpost/atmos)
"ed" = (/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/research_outpost/atmos)
@@ -227,7 +227,7 @@
"es" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/alarm{dir = 2; pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"et" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
-"ev" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
+"ev" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"ew" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"ex" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/sign/chemistry{desc = "A warning sign which reads 'SAMPLE PREPARATION'"; name = "\improper SAMPLE PREPARATION"; pixel_y = 32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"ey" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/research_outpost/anomaly)
@@ -240,7 +240,7 @@
"eF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"eG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
"eH" = (/turf/simulated/wall/r_wall,/area/research_outpost/power)
-"eI" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plasteel,/area/research_outpost/power)
+"eI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plasteel,/area/research_outpost/power)
"eJ" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"eK" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"eL" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/mineral,/area/mine/dangerous/explored)
@@ -258,17 +258,17 @@
"eX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"eZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"fa" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
+"fa" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
"fb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
"fc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/research_outpost/hallway)
-"fd" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"fd" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"fe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/research_outpost/anomaly)
"ff" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"fg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"fh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
"fi" = (/obj/structure/sign/nosmoking_1{pixel_y = 32},/turf/simulated/floor/plating,/area/research_outpost/power)
"fj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/research_outpost/anomaly)
-"fk" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"fk" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"fl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/research_outpost/hallway)
"fm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
"fn" = (/obj/structure/sign/science,/turf/simulated/wall/r_wall,/area/research_outpost/entry)
@@ -299,7 +299,7 @@
"fM" = (/obj/machinery/camera{c_tag = "Research Outpost Anomalous Materials Lab"; dir = 8; network = list("Research Outpost")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"fN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"fO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/research_outpost/hallway)
-"fP" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
+"fP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
"fQ" = (/turf/simulated/floor/plating,/area/research_outpost/power)
"fR" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/research_outpost/power)
"fS" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/power)
@@ -315,17 +315,17 @@
"gc" = (/obj/structure/table,/obj/item/device/camera,/obj/item/weapon/stamp/granted,/turf/simulated/floor/wood,/area/research_outpost/hallway)
"gd" = (/turf/simulated/floor/wood,/area/research_outpost/hallway)
"ge" = (/obj/machinery/vending/snack,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/research_outpost/hallway)
-"gf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"gg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
-"gh" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"gi" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"gf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
+"gg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"gh" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"gi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"gj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Research Outpost Hallway Engineering"; dir = 4; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"gk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowcorner"},/area/research_outpost/hallway)
"gl" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/power/apc{dir = 8; name = "Outpost Power APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/research_outpost/power)
"gm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/research_outpost/power)
"gn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/research_outpost/power)
"go" = (/obj/machinery/portable_atmospherics/scrubber,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/research_outpost/power)
-"gp" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/power)
+"gp" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/power)
"gq" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/power)
"gr" = (/obj/machinery/mass_driver{dir = 4; id_tag = "researchdriver"},/turf/simulated/floor/plating/airless/asteroid,/area/research_outpost/power)
"gs" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space)
@@ -367,11 +367,11 @@
"hc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"hd" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/mine/abandoned)
"he" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/wall,/area/research_outpost/entry)
-"hf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"hf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"hg" = (/obj/machinery/door/airlock/external{id_tag = "mining_away"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/lobby)
"hh" = (/turf/simulated/floor/plating,/area/research_outpost/tempstorage)
-"hi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
-"hj" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"hi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"hj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"hk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/wood,/area/research_outpost/hallway)
"hl" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/wood,/area/research_outpost/hallway)
"hm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
@@ -389,7 +389,7 @@
"hy" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/research_outpost/power)
"hz" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"hA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power)
-"hB" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
+"hB" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/hallway)
"hC" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
"hD" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
"hE" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/space,/area/space)
@@ -397,7 +397,7 @@
"hG" = (/obj/effect/gibspawner/robot,/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/mine/abandoned)
"hH" = (/obj/effect/gibspawner/human,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/mine/abandoned)
"hI" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
-"hJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"hJ" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"hK" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/research_outpost/entry)
"hL" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"hM" = (/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_away"; name = "asteroid mine"; width = 7},/turf/space,/area/space)
@@ -412,7 +412,7 @@
"hV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/fire,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"hW" = (/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage)
"hX" = (/obj/machinery/camera{c_tag = "Research Outpost Temporary Storage"; dir = 2; network = list("Research Outpost")},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage)
-"hY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;65"},/turf/simulated/floor/plating,/area/research_outpost/maint)
+"hY" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage)
"ia" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage)
"ib" = (/obj/machinery/camera{c_tag = "Research Outpost Hallway Central"; dir = 4; network = list("Research Outpost")},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
@@ -424,16 +424,16 @@
"ih" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/color/latex,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly)
"ii" = (/obj/machinery/door/window/westleft{dir = 2; name = "Monkey Pen"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"ij" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"ik" = (/obj/machinery/door/firedoor{layer = 2.6; name = "\improper Firelock South"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"il" = (/obj/machinery/door/firedoor{layer = 2.6; name = "\improper Firelock South"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"im" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
+"ik" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"il" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Power substation"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/turf/simulated/floor/plating,/area/research_outpost/power)
+"im" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/harvesting)
"in" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway)
"io" = (/obj/structure/transit_tube{icon_state = "E-NW"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/hallway)
"ip" = (/obj/structure/transit_tube/station,/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = 32; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/research_outpost/hallway)
"iq" = (/obj/structure/transit_tube{icon_state = "W-NE"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"ir" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"is" = (/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
-"it" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/harvesting)
+"it" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"iu" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"iv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"iw" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
@@ -443,23 +443,23 @@
"iA" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned)
"iB" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/mine/abandoned)
"iC" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/mine/abandoned)
-"iD" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"iD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"iE" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/research_outpost/entry)
"iF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
-"iG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"iG" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Medbay"; req_access_txt = "0"; req_one_access_txt = "65;5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"iH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"iI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"iJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
-"iK" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Medbay"; req_access_txt = "0"; req_one_access_txt = "65;5"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
+"iK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Temporary Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"iL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"iM" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/med)
"iN" = (/obj/structure/transit_tube{icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/entry)
"iO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"iP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
-"iQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
+"iQ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"iR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"iS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
-"iT" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"iT" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/camera{c_tag = "Research Outpost Hallway Starboard"; dir = 2; network = list("Research Outpost"); pixel_x = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"iU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"iV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"iW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
@@ -472,7 +472,7 @@
"jd" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowcorner"},/area/research_outpost/hallway)
"je" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/research_outpost/hallway)
"jf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowcorner"},/area/research_outpost/hallway)
-"jg" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/camera{c_tag = "Research Outpost Hallway Starboard"; dir = 2; network = list("Research Outpost"); pixel_x = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"jg" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "D-NE"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"jh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/research_outpost/hallway)
"ji" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/wall/r_wall,/area/research_outpost/harvesting)
"jj" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Research Outpost Exotic Particles Airlock"; dir = 2; network = list("Research Outpost")},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
@@ -491,7 +491,7 @@
"jw" = (/obj/structure/table,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned)
"jx" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned)
"jy" = (/obj/structure/rack,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned)
-"jz" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "D-NE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"jz" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"jA" = (/obj/structure/transit_tube{icon_state = "S-NW"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/entry)
"jB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"jC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "Research Outpost Shuttle Dock"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/research_outpost/entry)
@@ -508,7 +508,7 @@
"jN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage)
"jO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"jP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
-"jQ" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
+"jQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"jR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway)
"jS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"jT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/sign/examroom{desc = "A guidance sign which reads 'ISOLATION ROOM ONE'"; name = "\improper ISOLATION ROOM ONE"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway)
@@ -519,14 +519,14 @@
"jY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway)
"jZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/sign/examroom{desc = "A guidance sign which reads 'ISOLATION ROOM THREE'"; name = "\improper ISOLATION ROOM THREE"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/research_outpost/hallway)
"ka" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
-"kb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
+"kb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Exotic Particles Collection"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"kc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"kd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/biohazard{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/research_outpost/hallway)
"ke" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/research_outpost/hallway)
-"kf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Exotic Particles Collection"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
+"kf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/external{name = "Access Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"kg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/research_outpost/harvesting)
"kh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
-"ki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{name = "Access Airlock"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
+"ki" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;65"},/turf/simulated/floor/plating,/area/research_outpost/maint)
"kj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
"kk" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/harvesting)
"kl" = (/obj/structure/table,/obj/item/weapon/anodevice{pixel_x = 3; pixel_y = 3},/obj/item/weapon/anodevice,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/harvesting)
@@ -548,7 +548,7 @@
"kB" = (/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Research Outpost Medbay"; dir = 8; network = list("Research Outpost")},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/research_outpost/med)
"kC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"kD" = (/turf/simulated/wall/r_wall,/area/research_outpost/entry)
-"kE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Expedition Prep"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
+"kE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_access_txt = "0"; req_one_access_txt = "12;65"},/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"kF" = (/turf/simulated/wall/r_wall,/area/research_outpost/maint)
"kG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/conveyor{dir = 4; id = "anosample"},/turf/simulated/floor/plating,/area/research_outpost/maint)
"kH" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso1)
@@ -560,10 +560,10 @@
"kN" = (/turf/simulated/wall/r_wall,/area/research_outpost/iso3)
"kO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/iso3)
"kP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Isolation Room Three"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/iso3)
-"kQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_access_txt = "0"; req_one_access_txt = "12;65"},/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
+"kQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Long Term Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage)
"kR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2)
"kS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/longtermstorage)
-"kT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Long Term Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/longtermstorage)
+"kT" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SW"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/entry)
"kU" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"kV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/harvesting)
"kW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
@@ -574,15 +574,15 @@
"lb" = (/turf/simulated/wall,/area/mine/dangerous/unexplored)
"lc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space)
"ld" = (/turf/simulated/wall/r_wall,/area/research_outpost/gearstore)
-"le" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SW"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/entry)
+"le" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Expedition Prep"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"lf" = (/turf/simulated/wall,/area/research_outpost/entry)
"lg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/research_outpost/entry)
"lh" = (/obj/structure/closet/bombcloset,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"li" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/research_outpost/entry)
"lj" = (/turf/simulated/wall,/area/research_outpost/tempstorage)
-"lk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
+"lk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Temporary Storage Loading"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"ll" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
-"lm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Loading Area"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/tempstorage)
+"lm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Loading Area"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/tempstorage)
"ln" = (/obj/machinery/conveyor{dir = 4; id = "anosample"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/plating,/area/research_outpost/maint)
"lo" = (/obj/machinery/disposal/deliveryChute{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/turf/simulated/floor/plating,/area/research_outpost/maint)
"lp" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Maintenance APC"; pixel_x = 24; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/research_outpost/maint)
@@ -602,7 +602,7 @@
"lD" = (/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/camera{c_tag = "Research Outpost Exotic Particles Lab"; dir = 4; network = list("Research Outpost")},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/harvesting)
"lE" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/research_outpost/harvesting)
"lF" = (/obj/machinery/artifact_scanpad,/obj/machinery/light/small,/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/bluegrid,/area/research_outpost/harvesting)
-"lG" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel/airless{icon_state = "dark"},/area/mine/abandoned)
+"lG" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel/airless{icon_state = "dark"},/area/mine/abandoned)
"lH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"lI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"lJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
@@ -652,7 +652,7 @@
"mB" = (/obj/structure/transit_tube{tag = "icon-NE-SW"; icon_state = "NE-SW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"mC" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"mD" = (/obj/structure/transit_tube{tag = "icon-D-NW"; icon_state = "D-NW"},/turf/simulated/mineral,/area/mine/dangerous/unexplored)
-"mE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Equipment Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
+"mE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Equipment Storage"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"mF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"mG" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"mH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/research_outpost/gearstore)
@@ -784,7 +784,7 @@
"pd" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"; tag = "icon-closed (EAST)"},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel/airless,/area/mine/dangerous/explored)
"pe" = (/obj/structure/transit_tube{tag = "icon-W-NE"; icon_state = "W-NE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"pf" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space)
-"pg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/gearstore)
+"pg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/research_outpost/gearstore)
"ph" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine/vacuum,/area/mine/podbay)
"pi" = (/turf/simulated/floor/engine,/area/mine/podbay)
"pj" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2)
@@ -827,7 +827,7 @@
"pU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/engine,/area/mine/podbay)
"pV" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "minepodbay"; req_one_access_txt = "48;70"},/turf/simulated/floor/engine,/area/mine/podbay)
"pW" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/dangerous/explored)
-"pX" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
+"pX" = (/obj/structure/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"pY" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned)
"pZ" = (/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned)
"qa" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "65"},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore)
@@ -842,7 +842,7 @@
"qj" = (/obj/structure/transit_tube{tag = "icon-W-NE"; icon_state = "W-NE"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel/airless,/area/mine/dangerous/explored)
"qk" = (/obj/structure/transit_tube/station,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel/airless,/area/mine/dangerous/explored)
"ql" = (/obj/machinery/door/airlock/external{name = "External Airlock"; req_access_txt = "0"},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/abandoned)
-"qm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
+"qm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"qn" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/dangerous/explored)
"qo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/dangerous/explored)
"qp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
@@ -850,7 +850,7 @@
"qr" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = -32; pixel_y = -32},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"qs" = (/obj/effect/decal/warning_stripes/north,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/podbay)
"qt" = (/obj/machinery/door/window/westleft{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
-"qu" = (/obj/effect/glowshroom,/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
+"qu" = (/obj/structure/glowshroom,/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"qv" = (/obj/machinery/light_construct/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"qw" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHWEST)"; icon_state = "asteroidwarning"; dir = 10},/area/mine/dangerous/unexplored)
"qx" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHEAST)"; icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/unexplored)
@@ -859,7 +859,7 @@
"qA" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned)
"qB" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned)
"qC" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/unexplored)
-"qD" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/abandoned)
+"qD" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/abandoned)
"qE" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
"qF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
"qG" = (/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/mine/dangerous/explored)
@@ -1049,10 +1049,10 @@
"ui" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/dangerous/explored)
"uj" = (/obj/structure/lattice,/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/dangerous/explored)
"uk" = (/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
-"ul" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
+"ul" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
"um" = (/turf/simulated/wall/r_wall,/area/mine/maintenance)
"un" = (/obj/item/clothing/under/rank/miner,/obj/effect/decal/remains/human,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
-"uo" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored)
+"uo" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored)
"up" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/dangerous/explored)
"uq" = (/turf/simulated/floor/bluegrid,/area/mine/maintenance)
"ur" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Mining Communications APC"; pixel_x = 1; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/mine/maintenance)
@@ -1069,7 +1069,7 @@
"uC" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/dangerous/explored)
"uD" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/dangerous/explored)
"uE" = (/turf/simulated/wall,/area/mine/living_quarters)
-"uF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Communications"; req_access_txt = "48"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/mine/maintenance)
+"uF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Mining Station Communications"; req_access_txt = "48"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/mine/maintenance)
"uG" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/dangerous/explored)
"uH" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/dangerous/explored)
"uI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/carpet,/area/mine/living_quarters)
@@ -1078,30 +1078,30 @@
"uL" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored)
"uM" = (/obj/structure/table,/turf/simulated/floor/carpet,/area/mine/living_quarters)
"uN" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/carpet,/area/mine/living_quarters)
-"uO" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "miningdorm1"; name = "Room 1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters)
+"uO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "miningdorm1"; name = "Room 1"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters)
"uP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"uQ" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/dangerous/explored)
"uR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"uS" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/dangerous/explored)
"uT" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/mine/living_quarters)
"uU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/camera{c_tag = "Mining Outpost Bedrooms"; dir = 4; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
-"uV" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters)
+"uV" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/living_quarters)
"uW" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/dangerous/explored)
"uX" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/west_outpost)
-"uY" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "miningdorm2"; name = "Room 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters)
+"uY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "miningdorm2"; name = "Room 2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters)
"uZ" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/explored)
"va" = (/obj/structure/disposalpipe/segment,/turf/simulated/mineral/random,/area/mine/dangerous/unexplored)
"vb" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
-"vc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/mine/dangerous/explored)
+"vc" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/mine/dangerous/explored)
"vd" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/west_outpost)
"ve" = (/obj/machinery/camera{c_tag = "Mining Outpost West Outpost Mech Recharge Station"; dir = 1; network = list("Mining Outpost")},/turf/simulated/floor/mech_bay_recharge_floor/airless,/area/mine/west_outpost)
"vf" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/west_outpost)
"vg" = (/obj/structure/disposalpipe/segment,/obj/structure/sign/deathsposal,/turf/simulated/wall,/area/mine/living_quarters)
-"vh" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/mine/dangerous/explored)
+"vh" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/mine/dangerous/explored)
"vi" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "outpost_west_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored)
"vj" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"vk" = (/turf/simulated/wall,/area/mine/west_outpost)
-"vl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/west_outpost)
+"vl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/west_outpost)
"vm" = (/obj/structure/sign/xeno_warning_mining,/turf/simulated/wall,/area/mine/west_outpost)
"vn" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
"vo" = (/obj/machinery/vending/cigarette,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
@@ -1127,13 +1127,13 @@
"vI" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
"vJ" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
"vK" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
-"vL" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "miningdorm3"; name = "Room 3"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters)
+"vL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{id_tag = "miningdorm3"; name = "Room 3"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/mine/living_quarters)
"vM" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"vN" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"vO" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"vP" = (/turf/simulated/wall/r_wall,/area/mine/eva)
"vQ" = (/turf/simulated/wall,/area/mine/eva)
-"vR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/eva)
+"vR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/eva)
"vS" = (/obj/structure/table,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"vT" = (/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"vU" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/mine/west_outpost)
@@ -1150,12 +1150,12 @@
"wf" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
"wg" = (/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
-"wi" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva)
-"wj" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
-"wk" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/mine/eva)
+"wi" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva)
+"wj" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wk" = (/obj/structure/rack,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wl" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored)
"wm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
-"wn" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
+"wn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wo" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wp" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "outpost_west_pump"; tag_exterior_door = "outpost_west_outer"; frequency = 1379; id_tag = "outpost_west_airlock"; tag_interior_door = "outpost_west_inner"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_chamber_sensor = "outpost_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "outpost_west_pump"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wq" = (/obj/structure/ore_box,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "outpost_west_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/camera{c_tag = "Mining Outpost West Outpost External Airlock"; dir = 1; network = list("Mining Outpost")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/west_outpost)
@@ -1173,8 +1173,8 @@
"wC" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wE" = (/turf/simulated/wall,/area/mine/lobby)
-"wF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/lobby)
-"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Pod Bay"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby)
+"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wH" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/eva)
"wI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/mine/eva)
"wJ" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel,/area/mine/eva)
@@ -1187,15 +1187,15 @@
"wQ" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/mine/living_quarters)
"wR" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/living_quarters)
"wS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/mine/living_quarters)
-"wT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass{name = "Crew Area"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
-"wU" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/mining{name = "Mining Station Storage"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
+"wT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/mine/lobby)
+"wU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Crew Area"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wV" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Mining Outpost Starboard Connector"; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby)
"wW" = (/turf/simulated/floor/plasteel,/area/mine/lobby)
"wX" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/mine/eva)
"wY" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/eva)
"wZ" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/item/device/gps/mining{gpstag = "MINE2"},/obj/item/device/gps/mining{gpstag = "MINE1"},/obj/item/device/gps/mining,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -3},/turf/simulated/floor/plasteel,/area/mine/eva)
"xa" = (/turf/simulated/floor/plasteel,/area/mine/eva)
-"xb" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/eva)
+"xb" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel,/area/mine/eva)
"xc" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/eva)
"xd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/eva)
"xe" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva)
@@ -1211,10 +1211,10 @@
"xo" = (/obj/machinery/mineral/unloading_machine{input_dir = 4; output_dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/west_outpost)
"xp" = (/obj/machinery/conveyor{dir = 4; id = "mining_west"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/west_outpost)
"xq" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/west_outpost)
-"xr" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/west_outpost)
+"xr" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Station Storage"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"xs" = (/obj/structure/toilet{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/mine/living_quarters)
"xt" = (/obj/structure/sink{pixel_y = 30},/obj/machinery/light/small,/obj/structure/mirror{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/mine/living_quarters)
-"xu" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/mine/living_quarters)
+"xu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby)
"xv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"xw" = (/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel,/area/mine/podbay)
"xx" = (/obj/machinery/camera{c_tag = "Mining Outpost Crew Area Hallway"; network = list("Mining Outpost")},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
@@ -1227,7 +1227,7 @@
"xE" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/mine/lobby)
"xF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/mine/podbay)
"xG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby)
-"xH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/eva)
+"xH" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/west_outpost)
"xI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/eva)
"xJ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_east_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/mine/eva)
"xK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_east_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/mine/eva)
@@ -1237,7 +1237,7 @@
"xO" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (EAST)"; icon_state = "asteroidwarning"; dir = 4},/area/mine/dangerous/explored)
"xP" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/mine/west_outpost)
"xQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/west_outpost)
-"xR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "54"},/turf/simulated/floor/plating,/area/mine/west_outpost)
+"xR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/mine/living_quarters)
"xS" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"xT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"xU" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
@@ -1247,10 +1247,10 @@
"xY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"xZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"ya" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/living_quarters)
-"yb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
+"yb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/eva)
"yc" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"yd" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby)
-"ye" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/lobby)
+"ye" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "54"},/turf/simulated/floor/plating,/area/mine/west_outpost)
"yf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby)
"yg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/mine/lobby)
"yh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby)
@@ -1258,7 +1258,7 @@
"yj" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/mine/eva)
"yk" = (/obj/machinery/power/apc{dir = 2; name = "Mining EVA APC"; pixel_x = 1; pixel_y = -23},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/mine/eva)
"yl" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel,/area/mine/eva)
-"ym" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/mine/eva)
+"ym" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/mine/eva)
"yn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/mine/eva)
"yo" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_east_pump"; tag_exterior_door = "mining_east_outer"; frequency = 1379; id_tag = "mining_east_airlock"; tag_interior_door = "mining_east_inner"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_chamber_sensor = "mining_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel,/area/mine/eva)
"yp" = (/obj/machinery/camera{c_tag = "Mining Outpost Starboard External Airlock"; dir = 1; network = list("Mining Outpost")},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_east_sensor"; pixel_x = 0; pixel_y = -25},/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/mine/eva)
@@ -1276,11 +1276,11 @@
"yB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"yC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"yD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/camera{c_tag = "Mining Outpost Port Connector"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/mine/living_quarters)
-"yE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters)
+"yE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"yF" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/space,/area/mine/living_quarters)
"yG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/space,/area/mine/lobby)
"yH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/light{dir = 4},/turf/space,/area/mine/lobby)
-"yI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/lobby)
+"yI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/lobby)
"yJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/mine/lobby)
"yK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/lobby)
"yL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/lobby)
@@ -1293,9 +1293,9 @@
"yS" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/mine/west_outpost)
"yT" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/west_outpost)
"yU" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/turf/simulated/floor/plating,/area/mine/west_outpost)
-"yV" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
+"yV" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/living_quarters)
"yW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/living_quarters)
-"yX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters)
+"yX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby)
"yY" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/mine/living_quarters)
"yZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"za" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby)
@@ -1363,16 +1363,17 @@
"Ak" = (/obj/machinery/mech_bay_recharge_port,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/mine/production{name = "Mining Station Mech Bay"})
"Al" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/mine/dangerous/explored)
"Am" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/dangerous/explored)
-"Ao" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/lobby)
-"Ap" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/lobby)
+"An" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
+"Ao" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters)
+"Ap" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby)
"Aq" = (/obj/machinery/computer/shuttle/mining,/turf/simulated/floor/plasteel,/area/mine/lobby)
"Ar" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel,/area/mine/lobby)
"As" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby)
"At" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/mine/lobby)
"Au" = (/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"})
"Av" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/mine/living_quarters{name = "Mining Station Break Room"})
-"Az" = (/obj/machinery/door/firedoor{dir = 2},/obj/machinery/door/airlock/glass_mining{name = "Mining Station Pod Bay"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby)
-"AA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/mine/lobby)
+"Aw" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/mine/lobby)
+"Ax" = (/obj/machinery/light/small,/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel,/area/mine/eva)
"AB" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/mine/lobby)
"AC" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/mine/lobby)
"AD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Mining Shuttle Airlock"; dir = 8; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby)
@@ -1493,19 +1494,19 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbPaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacbjacacacbjbjacbjbjbjacacbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaaabRbBagagagagagafafafafblccbTbUbVbWbXbYbZcacbcdcwcebacfcgbJchcicjckclcmcncocpbNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqcrcqagaaaaaaacacacacacacacacacacacacbjbjbjbjbjbjacacacacacacacbjbjbjbjbjacacacbjbjbjbjbjcsbjbjbjbjbjbjbjbjacacacacaaaaaQaaaaaaaaaaaaafafafafblctcucvblcycxbWbWczcAcBcCcDcEcFcGcHcIcJbMcKcLcMcNcOcPbNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQcRcScTagaaaaacacacacacacacbjacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaaaaQaaaaaaaaaaaaafafafafblctcucUblcVbWcWcXcYcZdacZdbcZcZcZcZdcddbMdecLdfdgdhcpbNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadididjdkdlcqagaaaaacacacacbjbjbjacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaagaQaaaaaaaaaaaaafafafafblctdmdnbldodpdqdrdsdtdudvdwdxdydzcZdAdBbMdCdDdEdFbMbObNagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadididjdkdlcqagaaaaacacacacbjbjbjacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaagaQaaaaaaaaaaaaafafafafblctdmdnbldodpdqdrdsdtdudvdwdxdydzcZdBdAbMdCdDdEdFbMbObNagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGdHdIdJdKdLdMagagacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacaaagaQaaagagagagagafaLaLaLaLaLdNdOaLbEbEdPdQdRcZdSdTdUdVdWdXcZdYdZeaebecedeebMefafagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegdieheiejdlekacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaQaaaaaaaaaaaaaaaLemenenepeqereseteuevewexcZeyezeoeBeAeDeEeFeGeHeHeHeIeJeKeMeLeLeNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOePeQekacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjacacacacacacaaaaaQaaaaaaaaaaaaaaaoeReSeSeUeVeWeXeYeZfafbfcfdfefffgfhfhfjfkflfmeHeCfieTfqeHfrafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfsftfufvekacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfyfzfAfBfCfDaLfEfFfGfHfIfJfKfLfMcZfNfOfPfQfQfRfSfTfVfUafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfWfXfYekfZgaekekekekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfygbgcfBgdgeaLgfggcZghcZcZcZcZgicZgjgkeHglgmgngogpgqgraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfWfXfYekfZgaekekekekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfygbgcfBgdgeaLgggfcZghcZcZcZcZgicZgjgkeHglgmgngogpgqgraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbPdLgyekgzgAekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaelaaaaaaaLfwengBfygCfAfBgEgFaLgGgHgIgJgKgLgMcZgOgNgPgQgRgSgTfQgVgpefafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbhcgyhdgAgAgzekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahehfhfhfadhfhfhffnhihjbahkhlaLaLaLaLaLhmhnhogJhpgLhqcZhshrhthuhvhwhxgUhyhAhBhCaLhDbzaAaAaAaAaAaAaBhEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFgWgXgWgugufZhGgZekfvhHekgAhIekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahJhKhLhNhNhNhOhPhQhRhShThUhVhWhXfohZiaibicidieifigihcZiiijikileHeHimeHeHeHinioipiqirisisitisisisiubhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagiviwguixiygueQizhaiAiBiCekekekekekekbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacaaaaaaaaaaiDiEhNhNhNhNiFiGiHiIiJiKiLiMhWfpiOiPiQiRiSiTiUiViWiXiYiZiWjajbjcjdjejfjcjgjciWjhjijjjkjljmjnjojpisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagjqjrjsguiygAgYjtgZcrekjujvekjwgyjxjyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacaaaaaaaaaajzjAhNhNjBhNjCjDjEjFjGjHjIjJhWjKjLjMjNjOjPjQjRjSjTjUjVjWjXjUjYjVjZjUjVkakbkckdkekfkgkhkikjkkkkklisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagagbjbjekgxkmkngzjskogZhajwbPdLkpekjwfvgyjyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafafafafafacacacacacacacaaaaaaaahfkqhNkrksktkukvkwkxkykzkAkBhWkCgDhhkFkFkFkFhYkHkIkJkHkKkLkMkKkNkOkPkNkNkQkRkSkTiskUkViskWkkkkkXisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagekekekekekekgwgZkYkmgZizkZjwjwhcgyjuekjweQlajyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacafafafaeaeaeaeafafafacacacaclblcaaaaaaiNlehfhfkDlflflflgkElibaljljhWlkkFkFkFkGlnlolpkHlqlrlskKltlulvkNlwlxlykNlzlAkSlBlCisisislDlElFjpisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbhcgyhdgAgAgzekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahehfhfhfadhfhfhffnhjhibahkhlaLaLaLaLaLhmhnhogJhpgLhqcZhshrhthuhvhwhxgUhyhAhBhCaLhDbzaAaAaAaAaAaAaBhEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFgWgXgWgugufZhGgZekfvhHekgAhIekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahJhKhLhNhNhNhOhPhQhRhShThUhVhWhXfohZiaibicidieifigihcZiiijikhYeHeHileHeHeHinioipiqirisisimisisisiubhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagiviwguixiygueQizhaiAiBiCekekekekekekbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacaaaaaaaaaaitiEhNhNhNhNiFiDiHiIiJiGiLiMhWfpiOiPiKiRiSiQiUiViWiXiYiZiWjajbjcjdjejfjciTjciWjhjijjjkjljmjnjojpisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagjqjrjsguiygAgYjtgZcrekjujvekjwgyjxjyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacaaaaaaaaaajgjAhNhNjBhNjCjDjEjFjGjHjIjJhWjKjLjMjNjOjPjzjRjSjTjUjVjWjXjUjYjVjZjUjVkajQkckdkekbkgkhkfkjkkkkklisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagagbjbjekgxkmkngzjskogZhajwbPdLkpekjwfvgyjyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafafafafafacacacacacacacaaaaaaaahfkqhNkrksktkukvkwkxkykzkAkBhWkCgDhhkFkFkFkFkikHkIkJkHkKkLkMkKkNkOkPkNkNkEkRkSkQiskUkViskWkkkkkXisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagekekekekekekgwgZkYkmgZizkZjwjwhcgyjuekjweQlajyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacafafafaeaeaeaeafafafacacacaclblcaaaaaaiNkThfhfkDlflflflglelibaljljhWlkkFkFkFkGlnlolpkHlqlrlskKltlulvkNlwlxlykNlzlAkSlBlCisisislDlElFjpisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaageklGdLhagwekjqlHjrekiAeklIlJlKekdLlLcrlMeQfucrekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeafafacaclNlOaAaAajaAbAbBagagldlhlRlllTlUlVlWlmlYlZmalPmglQlSmfmgmhkHmimjmkkKmlmmmnkNmompmqkNmrmsmtmumvmwmxisisisisismybkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceklGeQdLgYiAlLkmdLkmfudLdLmzgydLeQeQekcrmAeQdLekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacafafaeaeaeaeaeaeaeaeaeaeafafmCmBmDacaaaaaaaaaaaaagldlXmFmbmHmImJmcljmdmMhWkFkFkFkFkFmgmPkHmQmRmSkKmTmUmVkNmWmXmYkNmZnanbncndndnelCmKaiaAaAngnhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaceklGnieQeQiAeQlafZeQnjfulakpcreQnkfvekkmcrlLdLekbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnfaeaeaeaeaeaeaeaeaeaeaenlafnnnmafafaaaaaaaaaaaaagldmenqnrmEnrntmGljljnvhWnononQnokFnAnBkHnCnDnEkKnFnGnHkNnInJnKkNnLnMlCnNnOnPnOlCnnnUafagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1619,19 +1620,19 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaccsacacacacaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaeaevkvkvkvkvkvkvlvlvlvkvmvkvkvkaeaeaeafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafaeaeaeaeaeafafafafafacacacacacacacbjbjbjbjuEuEuEuEvnvovpuEuIvquEvruEuEuEuVuVuVuEaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafaeaeaeaeoapSpUpTpApVphaeaeaeaeaeaeaeaeafafafafafoBoBoBoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacacacaaaaafaeaeaevkvvvwvxvyvzvAvBvCvDvEvFvGvyrkaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeaeaeafafafafafacacacacbjbjbjuEvHvIvJvKvIvIuEuMuNvLuKuEvMvNvOvOvOuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafaeaeaeaeqdqcqsqqwXvPvRvRvQvQaeaeaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZviaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnfaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeqdxwzgxFwXwiwjwjwkvQaevjaeaeaenXnfafafafoBoBoBoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyrKaeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaevbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRAAAzwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrjrkaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerjrkaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwTwRwSuEuEuEuEuEwUuEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaewFwFwVAMABwYwZxaxaxbxcxdxexcrkaeaeaenlafafafoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtStTqJqJqJqJqJqFaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRqJqJqJqJqJqJqJqJtStTqJqJqJqJqFaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwzJxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWBQxGxHxIxaxaxJxKxLxMxNvsaeaeaenlafafafoBoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQxRvkvkxSvkvkvkvkrCrKaeaeaeaeaepuaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaepuaeaeaeaeaeaeaeaerCrKaeaeaeaepuaeaeaeaeaeafafnfafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyaybxXybycycycycycycycycydydydydydydydyeyfyeygyfyhyiyjykylymynxcyoypxcrKaeaeaeaeafafafafoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvknovtofaeaeaeaeaeqvaeaeaeqEqJqJqFaeaeaeaeafacacacacacacacacacacafaeaetRqJtQaeaeaeaeafaeaeqvaeaeaeaeaeaepuaeaeaeaeaeaeaevbaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyEyEyEyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyIyIyIyJyKyLyMyNyOyPyOyOyOyOyOyOvuaeaeaeaenlafafafoBoBoBoBafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnfafaeaeaeaeaepuaeaeaeaeaeafacacacacacafafafafafaetRtQaeaeaeafafafafafafnfaeaeaeaeaeaepuaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRyVwRuEuEyWyXyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaawFwFwWzazbzczdzezfBRzhziyOuvwaaeaeaeaeaeafafafoBoBoBoBafafafoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyrKaeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaevbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRwTwFwXwGwHwIxbvQvQvQvQaeaeaeaeafafafafoBoBoBoBoBoBoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrjrkaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerjrkaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwUwRwSuEuEuEuEuExruEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexuxuwVAMABwYwZymxawJxcxdxexcrkaeaeaenlafafafoBoBoBoBoBoBoBafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxHtStTqJqJqJqJqJqFaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRqJqJqJqJqJqJqJqJtStTqJqJqJqJqFaeaeaeaeaeafacacacacacwQxsxtxRwgwDxvwhwDwwzJxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDxuxuxuxEwWBQxGybxIxaxaxJxKxLxMxNvsaeaeaenlafafafoBoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQyevkvkxSvkvkvkvkrCrKaeaeaeaeaepuaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaepuaeaeaeaeaeaeaeaerCrKaeaeaeaepuaeaeaeaeaeafafnfafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyayExXyEycycycycycycycycydydydydydydydyIyfyIygyfyhyiyjykylAxynxcyoypxcrKaeaeaeaeafafafafoBoBoBoBoBafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvknovtofaeaeaeaeaeqvaeaeaeqEqJqJqFaeaeaeaeafacacacacacacacacacacafaeaetRqJtQaeaeaeaeafaeaeqvaeaeaeaeaeaepuaeaeaeaeaeaeaevbaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyVyVyVyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyXyXyXyJyKyLyMyNyOyPyOyOyOyOyOyOvuaeaeaeaenlafafafoBoBoBoBafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnfafaeaeaeaeaepuaeaeaeaeaeafacacacacacafafafafafaetRtQaeaeaeafafafafafafnfaeaeaeaeaeaepuaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRAnwRuEuEyWAoyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxuxuwWzazbzczdzezfBRzhziyOuvwaaeaeaeaeaeafafafoBoBoBoBafafafoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaevkvkvkvkvkvkaeaeafafafafafacacafafaeaeaeaepuaeaeaeaeaeaeafafafafafafaeaeaeaeaepuaeaeafafafacacacacacafaeaeaeaeaeaepuaeaeaerjrkaeaeaeaeaeaeaeafuEzkwAzmzluEzozpzqzrzsuEztzuzvuEaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagwEzwzxzyzzzAzAzBzCzCzDzEwluLaeaeaeaeaeafafafoBoBoBafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqEqJqJqJqFaeaeaeaeaeaeaeaeaeaeaeaeaepuaeafafacacacacacacacafafaeaeaeaeaeqEqJqJqJtStTqJqJqJqFaeaeaeaeuEzHzGzIznuEzKzLzLzMzNuEzOzPzQuEaeaeaeaeaeaeagagagagagagagaaaaaaaaaaagaaaawEzSzTzUzVzWzXzWzCzCzDzEwluLaeaeaeaeafafafafoBoBafafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqEqFaeaerjrkaeaetRqJqJqJqJqJtQaeafacacacacbjbjbjacacafafafaeaeaeaeaeaeaerCrKaeaeaepuaeaeaeaewPuEuEuEuEuEzZAaAbAczNuEuEAdwRwPaeaeaeaeaeaeaaaaagaaaaaaagaaaaaaaaaaagaawFwFAeAfAgyOAhAiAjAkzhziyOuWuZaeaeaeaeafafafoBoBoBafafafafoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqvaeaeqEqJqJtStTqJqJtQaeaeaeaeaeaeaeafacacacbjbjbjbjbjacacacafafafafaeaeaeaeaeaeaeaeaeqEqJqJqFaeaeaeaeaeaewPuEuEuEuEuEwPwlyuxOyvaeaeaeaeaeaaaaaaagaaaaaaagaaaaaaaaaaAowFApAqArAsAtwEAuAvAuAuAuAuAuAutraeaeaeafafafafoBoBafafafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqEqFaeaerjrkaeaetRqJqJqJqJqJtQaeafacacacacbjbjbjacacafafafaeaeaeaeaeaeaerCrKaeaeaepuaeaeaeaewPuEuEuEuEuEzZAaAbAczNuEuEAdwRwPaeaeaeaeaeaeaaaaagaaaaaaagaaaaaaaaaaagaaxuxuAeAfAgyOAhAiAjAkzhziyOuWuZaeaeaeaeafafafoBoBoBafafafafoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqvaeaeqEqJqJtStTqJqJtQaeaeaeaeaeaeaeafacacacbjbjbjbjbjacacacafafafafaeaeaeaeaeaeaeaeaeqEqJqJqFaeaeaeaeaeaewPuEuEuEuEuEwPwlyuxOyvaeaeaeaeaeaaaaaaagaaaaaaagaaaaaaaaaaApxuAwAqArAsAtwEAuAvAuAuAuAuAuAutraeaeaeafafafafoBoBafafafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafnfafaeaeaeaerCrKaeaeaeaeqvaeafafafafafacacbjbjbjbjbjbjbjacacacacacafafafafafafafafaeaeaeaeaepuaeaeaeaeaeaeaeaerCyQzjzjzjzjzFrKaeaeaeaeaeaeagagagagagagagagaaaaaaaahMhgwWBSwWwWAsADwEAEAFAGAHAIAJAKALaeaeaeaeafafafafoBoBafafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacbjbjbjbjbjbjacacacacacacafafaeaeaeaeaeaeaeaeaenfafafacacacacacbjbjbjbjbjbjbjbjacacacacacacacacacacacacafafaeaeaeaepuaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaagaaaaaaaaaawFwFwFACwWANAOAPAQARASATAUAVAVALaeaeaeqKnfafafafoBafafafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeafafafafafacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacafaeaeaeaeqEqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqFaeaeaeaeaeaeaaaaaaaaaaagaaaaaaaaaaagaawFwFwWAsAXAYAZBaAVAVBbBbBcAuaeaeaeaeafafafafafafafafoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacbjbjbjbjbjbjacacacacacacafafaeaeaeaeaeaeaeaeaenfafafacacacacacbjbjbjbjbjbjbjbjacacacacacacacacacacacacafafaeaeaeaepuaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaagaaaaaaaaaaxuxuxuACwWANAOAPAQARASATAUAVAVALaeaeaeqKnfafafafoBafafafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeafafafafafacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacafaeaeaeaeqEqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqJqFaeaeaeaeaeaeaaaaaaaaaaagaaaaaaaaaaagaaxuxuwWAsAXAYAZBaAVAVBbBbBcAuaeaeaeaeafafafafafafafafoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaepuaerjrkaeaeaenfnfaaaaaaagaaaaaaaaaaagaaaawEBdAszUBeAVAVAVBfBgBgBhALaeaeaeaeafafafafafoBafafoBoBoBafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeqEqJtStTqJqJqJAmAlBkBkBkBkBkBkBkBkBkBkBkBkBlBmBnBowEBpBqBrAVBsBsAVALaeaeaeafafafafoBoBoBafoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeaeaeaeaeafafaeaeaeaeaeaeaeaeaerCrKaeaeaenfnfagaaaaaaaaaaaaaaaaaaaaaaBtBtBuBvBtAuAuAuALALALALAuaeaeafafafafoBoBoBoBoBoBoBafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm
index 5a0231c9394..5a9b4dafcb3 100644
--- a/_maps/map_files/cyberiad/z6.dmm
+++ b/_maps/map_files/cyberiad/z6.dmm
@@ -140,7 +140,7 @@
"cJ" = (/obj/item/stack/cable_coil/cut,/turf/space,/area/space)
"cK" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/derelict/bridge/access)
"cL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/derelict/bridge/access)
-"cM" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/turf/simulated/floor/plasteel,/area/derelict/bridge/access)
+"cM" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"cN" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/derelict/bridge/access)
"cO" = (/turf/simulated/wall/r_wall,/area/derelict/singularity_engine)
"cP" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/derelict/bridge/access)
@@ -165,7 +165,7 @@
"di" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/derelict/singularity_engine)
"dj" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
"dk" = (/obj/item/stack/cable_coil/cut,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
-"dl" = (/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
+"dl" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"; tag = "icon-propulsion_l (WEST)"},/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "burst_r"; tag = "icon-burst_r (WEST)"},/turf/space,/area/space)
"dm" = (/turf/simulated/wall,/area/derelict/singularity_engine)
"dn" = (/turf/simulated/floor/plasteel,/area/derelict/bridge)
"do" = (/turf/simulated/floor/plating,/area/derelict/bridge)
@@ -211,9 +211,9 @@
"ec" = (/obj/structure/table,/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel,/area/derelict/bridge)
"ed" = (/obj/item/stack/rods,/turf/space,/area/space)
"ee" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
-"ef" = (/obj/item/weapon/shard,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
+"ef" = (/obj/item/weapon/shard,/obj/structure/grille/broken,/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"eg" = (/obj/item/clothing/suit/space/syndicate/black/engie,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
-"eh" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
+"eh" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"; tag = "icon-propulsion_l (WEST)"},/turf/space,/area/space)
"ei" = (/obj/item/weapon/shard,/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
"ej" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"ek" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
@@ -243,7 +243,7 @@
"eI" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"eJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"eK" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/space)
-"eL" = (/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/derelict/singularity_engine)
+"eL" = (/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"eM" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"eN" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"eO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
@@ -254,7 +254,7 @@
"eT" = (/obj/item/stack/cable_coil/cut,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"eU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"eV" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
-"eW" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/derelict/singularity_engine)
+"eW" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"eX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"eY" = (/turf/simulated/floor/plating/airless,/area/derelict/bridge/access)
"eZ" = (/obj/structure/table,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
@@ -297,7 +297,7 @@
"fK" = (/obj/machinery/door/window{dir = 2},/turf/simulated/floor/plating/airless,/area/derelict/hallway/primary)
"fL" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/space)
"fM" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
-"fN" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
+"fN" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"fO" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
"fP" = (/turf/simulated/floor/plating/airless,/area/derelict/hallway/primary)
"fQ" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel/airless,/area/derelict/hallway/primary)
@@ -333,7 +333,7 @@
"gu" = (/turf/simulated/wall,/area/derelict/medical)
"gv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/derelict/medical)
"gw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/derelict/medical)
-"gx" = (/obj/item/weapon/shard,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/derelict/medical)
+"gx" = (/obj/item/weapon/shard,/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/derelict/medical)
"gy" = (/turf/simulated/floor/plating/airless,/area/derelict/medical)
"gz" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/derelict/medical)
"gA" = (/obj/machinery/door/airlock/external{name = "External Engineering"},/turf/simulated/floor/plating/airless,/area/space)
@@ -413,6 +413,7 @@
"hW" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/airless,/area/derelict/medical/chapel)
"hX" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{dir = 4; name = "Worn-out APC"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/plasteel/airless,/area/derelict/medical/chapel)
"hY" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
+"hZ" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"; tag = "icon-propulsion_l (WEST)"},/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"; tag = "icon-propulsion_l (WEST)"},/turf/space,/area/space)
"ia" = (/obj/machinery/power/apc/noalarm{dir = 0; name = "Worn-out APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"ib" = (/obj/item/stack/medical/ointment,/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"ic" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
@@ -564,7 +565,6 @@
"kS" = (/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"kT" = (/obj/machinery/door/airlock/command{name = "AI Upload"; req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"kU" = (/obj/machinery/door/airlock/external{name = "Escape Airlock"},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
-"kV" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"kW" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"kX" = (/obj/structure/window/basic{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"kY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
@@ -620,7 +620,7 @@
"lW" = (/obj/machinery/power/apc/noalarm{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/plasteel/airless,/area/derelict/teleporter)
"lX" = (/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
"lY" = (/turf/simulated/mineral,/area/syndicate_depot)
-"lZ" = (/obj/structure/lattice,/obj/machinery/gun_turret/exterior,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
+"lZ" = (/obj/structure/lattice,/obj/machinery/porta_turret/syndicate/exterior,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
"ma" = (/turf/simulated/mineral/random,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_depot)
"mb" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_depot)
"mc" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; icon_state = "window5"; name = "window"; opacity = 0},/area/syndicate_depot)
@@ -633,16 +633,16 @@
"mj" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mk" = (/obj/structure/closet/crate{name = "foot locker"},/obj/item/ammo_box/magazine/smgm45{pixel_x = 3},/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate{pixel_x = -3; pixel_y = -2},/obj/item/weapon/lighter/zippo/gonzofist,/obj/item/clothing/under/syndicate{pixel_x = 3; pixel_y = 3},/obj/item/clothing/suit/armor/vest/combat{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"ml" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/syndicate_depot)
-"mm" = (/obj/machinery/gun_turret/interior,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
+"mm" = (/obj/machinery/porta_turret/syndicate/interior,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mn" = (/obj/item/device/radio/intercom/syndicate{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mo" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mp" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/syndicate_depot)
"mq" = (/turf/simulated/mineral,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_depot)
"mr" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_depot)
-"ms" = (/obj/machinery/gun_turret/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
+"ms" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mt" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/syndicake,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
-"mu" = (/obj/machinery/gun_turret/grenade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
-"mv" = (/obj/machinery/gun_turret/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
+"mu" = (/obj/machinery/porta_turret/syndicate/grenade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
+"mv" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"mw" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_depot)
"mx" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
"my" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/syndicate_depot)
@@ -665,10 +665,8 @@
"mP" = (/obj/structure/closet/crate,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
"mQ" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/bananium,/obj/item/weapon/grenade/bananade,/turf/simulated/floor/plasteel/airless,/area/space)
"mR" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
-"mS" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/space,/area/space)
"mT" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless/asteroid,/area/space)
"mU" = (/obj/item/weapon/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
-"mV" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space)
"mW" = (/obj/structure/computerframe/HONKputer,/turf/simulated/floor/plasteel/airless,/area/space)
"mX" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/space)
"mY" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/plasteel/airless,/area/space)
@@ -680,7 +678,6 @@
"ne" = (/turf/simulated/floor/plasteel/airless,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/space)
"nf" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel/airless,/area/space)
"ng" = (/obj/structure/closet/crate,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
-"nh" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space)
"nk" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space)
"nm" = (/obj/item/weapon/shard,/turf/simulated/floor/plasteel/airless,/area/space)
"nn" = (/obj/item/weapon/broken_bottle,/turf/simulated/floor/plasteel/airless,/area/space)
@@ -767,32 +764,32 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncncscncncnckcAcncBckcncnckaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaeavavaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackcCcCcDcEcFckckcncncAckckcGckaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaAaaaaaeavavavcHaeaeaeaaaAaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaackcncncscncnckckcAcncncncncnckaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaAcIaeaecIavavavavavcIaeaecIaAaeaeaeaaaaaaaaaaaaaacJcJaAaAaAckcKcncLcncncMcNcncncncncncnckababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaAcIaeaecIavavavavavcIaeaecIaAaeaeaeaaaaaaaaaaaaaacJcJaAaAaAckcKcncLcncncGcNcncncncncncnckababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaecOcOcOcOavcHavavavcOcOcOcOaeaeaeaeaeaaaaaaaaaaaaaaaacJaAaAckcPcQcRcPcPckckckckckckckckckcSabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOcOcOcTcOcUcOcVcWcXcOcOcOcOcOcOaeaeaaaaaaaaaacJaaaaaaaAaAaAckcncncscncncYcZdadbdcdddedbdfdgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOcOdhdidjdkdhcWdldldmdldhdjdhcOcOcOaeaaaaaaaaaaaaaacJaaaaaaaackcKcncLcncncYdndndodndndndndpdqabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdrdsdtdudtdhdvcVdwdldmdxdhdhdhdydzcOaAaaaaaaaaaaaaaaaaaaaaaaaackcPcQdAcPcPdBdndndodndndndodndCdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdEdEdEdEdFdldGcOdmdHcOdldIdjdIdIdlcOaAaaaaaaaaaaaaaaaaaaaaaaaackcncAdJcncndKdndndLdndMdndndNdOabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdldIdIdIdPdidhdQdIdldIdIdhdididIdIcOaAaaaaaaaaaaaaaaaaaaaaaaaeckcncndRdSdTdUdVdVdWdXdodndndndCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOdIdidjdhdYdhdjdhdldldIdhdhdhdhdjdhcOaAaaaaaaaaaaaaaaaaaaaaaeaeckcncndJcncndZdbdbdneaebdnebecdqavedaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOdhdjdheeefegehdleidldlejekeldIdidjcOaAaeaaaaaaaaaacJaaaaaeaeaeckckckcsckcncYemeneoepeqcZcZdbdqdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOdIdheeeresetdldldldldleueueveldhdicOaAaeaeaaaAckckckckckckckckckckckewckckckexexeyexexexcScScSabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOcOdIdIezeAdidldldldldldldldleBeCdIeDcOcOcOaeaeaAckeEeEeEeFeGeHeIckeEeEeJeEeEckaAaeavavaaaAeKavbBabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOcOcOcOdIdIezerdidleLeLeLeLeLdldleMeCdldIcOcOcOcOcOaackeNeOeOeOeOeOeOePeOeOeQeEeRckaeaaaaaaaaaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOdIeSeTdIdIeUeVdleWaaaaaaaaaaeLdleMdFdldIdhdIdlcOcOaeckeXeEeEeEeEeEeEckeYeEeJeEeEckaeaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOeZdheMeldIdidIdldleLaaaaaaaaaaeLdlfadldIfbfcfddhdIcOcOckclfeckffffffffckeEeEfgeEeEckcJaaaaaaaaaaaaaaaaavavaAbBavbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdxdjfheCdidididjdleLaaaaaaaaaaeLdlfidldIfjfkfddhflcOcOfmfnfofofpfpfpfpckckckckckckckaeaeaaaaaaaaaaaaaaavavaAbBaveKavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOfqdIfheCdIdjehfrdleLaaaaaaaaaaeLdldlfsdldIdhftdjfqfufufmfvfwfofpfpfpfxckeKavckckaaaeaaaaaaaaaaaaaaavavavazaAbBavbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOdIfydFdhdifzftdleLaaaaaaaaaaeLdldlfAdIdIejeVdIcOfufBfCfDfEfofpfFfpfxfGaaaeaeaeaaaaaaaaaaaaaaaaavavavavfHaAbBfIbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOcOcOcOdIdIezdldldheLeLeLeLeLdldldlfJdidicOcOcOcOfufvfmfmfmfKfmfmfmfmfmfmfmaeaeaaaaaaaaavavbBavavfIavfLazaAbBazeKavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOcOdhfMfNdldhdjdldldldidhdldlfOfJdjdIcOcOcOaeaefvfmfofPfPfmfpfQfRfRfmfmaeavaeaeaeavavfHbBavaAazfHfIfSaAbBazbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOdjdifTdldldhfUdhdidjdtdvdtfUfVdidicOcOaaaafBfWfmfofPfofofpfpfpfmfmaaaaaaaeaaaaavazazbBavfXfXfXfXfXfXfYfYfYavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmdldmaeaefNejeCdIdIdIgadEdEdFdhdhdIcOcOaafBfWfwfmfpfpfpfogbfpfmfmfmaaaeaeavaagcfYfYfYfYfYfYgdgegfgggfghgifYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjaaaaaaaaaaaaaagkaadldlglaeaedlgmdIdhdhfjdIdIdhdidjdIdIcOcOaafvfPfwfmfmfmfpfmfmfmfmfmfmgngnbBbBbBgcgogogpgpgqfYgdgdgdgfgfgigifYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOcOdhdidjdkdhcWeLeLdmeLdhdjdhcOcOcOaeaaaaaaaaaaaaaacJaaaaaaaackcKcncLcncncYdndndodndndndndpdqabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdrdsdtdudtdhdvcVdweLdmdxdhdhdhdydzcOaAaaaaaaaaaaaaaaaaaaaaaaaackcPcQdAcPcPdBdndndodndndndodndCdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdEdEdEdEdFeLdGcOdmdHcOeLdIdjdIdIeLcOaAaaaaaaaaaaaaaaaaaaaaaaaackcncAdJcncndKdndndLdndMdndndNdOabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOeLdIdIdIdPdidhdQdIeLdIdIdhdididIdIcOaAaaaaaaaaaaaaaaaaaaaaaaaeckcncndRdSdTdUdVdVdWdXdodndndndCabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOdIdidjdhdYdhdjdheLeLdIdhdhdhdhdjdhcOaAaaaaaaaaaaaaaaaaaaaaaeaeckcncndJcncndZdbdbdneaebdnebecdqavedaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOdhdjdheeefegeWeLeieLeLejekeldIdidjcOaAaeaaaaaaaaaacJaaaaaeaeaeckckckcsckcncYemeneoepeqcZcZdbdqdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOdIdheeereseteLeLeLeLeLeueueveldhdicOaAaeaeaaaAckckckckckckckckckckckewckckckexexeyexexexcScScSabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOcOdIdIezeAdieLeLeLeLeLeLeLeLeBeCdIeDcOcOcOaeaeaAckeEeEeEeFeGeHeIckeEeEeJeEeEckaAaeavavaaaAeKavbBabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOcOcOcOdIdIezerdieLeLeLeLeLeLeLeLeMeCeLdIcOcOcOcOcOaackeNeOeOeOeOeOeOePeOeOeQeEeRckaeaaaaaaaaaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOdIeSeTdIdIeUeVeLeWaaaaaaaaaaeLeLeMdFeLdIdhdIeLcOcOaeckeXeEeEeEeEeEeEckeYeEeJeEeEckaeaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOeZdheMeldIdidIeLeLeLaaaaaaaaaaeLeLfaeLdIfbfcfddhdIcOcOckclfeckffffffffckeEeEfgeEeEckcJaaaaaaaaaaaaaaaaavavaAbBavbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOdxdjfheCdidididjeLeLaaaaaaaaaaeLeLfieLdIfjfkfddhflcOcOfmfnfofofpfpfpfpckckckckckckckaeaeaaaaaaaaaaaaaaavavaAbBaveKavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOcOfqdIfheCdIdjeWfreLeLaaaaaaaaaaeLeLeLfseLdIdhftdjfqfufufmfvfwfofpfpfpfxckeKavckckaaaeaaaaaaaaaaaaaaavavavazaAbBavbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOdIfydFdhdifzfteLeLaaaaaaaaaaeLeLeLfAdIdIejeVdIcOfufBfCfDfEfofpfFfpfxfGaaaeaeaeaaaaaaaaaaaaaaaaavavavavfHaAbBfIbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecOcOcOcOcOdIdIezeLeLdheLeLeLeLeLeLeLeLfJdidicOcOcOcOfufvfmfmfmfKfmfmfmfmfmfmfmaeaeaaaaaaaaavavbBavavfIavfLazaAbBazeKavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOcOdhfMfNeLdhdjeLeLeLdidheLeLfOfJdjdIcOcOcOaeaefvfmfofPfPfmfpfQfRfRfmfmaeavaeaeaeavavfHbBavaAazfHfIfSaAbBazbBavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecOcOdjdifTeLeLdhfUdhdidjdtdvdtfUfVdidicOcOaaaafBfWfmfofPfofofpfpfpfmfmaaaaaaaeaaaaavazazbBavfXfXfXfXfXfXfYfYfYavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmeLdmaeaefNejeCdIdIdIgadEdEdFdhdhdIcOcOaafBfWfwfmfpfpfpfogbfpfmfmfmaaaeaeavaagcfYfYfYfYfYfYgdgegfgggfghgifYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjaaaaaaaaaaaaaagkaaeLeLglaeaeeLgmdIdhdhfjdIdIdhdidjdIdIcOcOaafvfPfwfmfmfmfpfmfmfmfmfmfmgngnbBbBbBgcgogogpgpgqfYgdgdgdgfgfgigifYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgrgrgrgrgrgrgrgrgrgsgrgtgrgtgjgugvgvgvgugwgxgygzgugAaebjaedIdIdhdidididhdIdIdhdicOcOcOcOaafvfwfofmfpfEfofEfmfEfEgBfEavfHfHfHavfHgpgogqgqgpgCgfgfgfgfgfgigifYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgrgrgrgrgrgrgrgrgrgrgrgrgrgrgjgDgDgDgEgDgFgGgygygHaeaeaeaecOcOdIgIdjdhdIcOcOcOcOcOcOaeaefPgJfwfofpfpfofPfEfEgBfEfPgKbBbBgLgLgMgLfXfXfXfXfXfXgfgfgNgfgfgfgffYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgtgrgrgrgrgrgrgjgjgjgjgjgOgjgjgDgDgDgDgDgPgFgGgygygygyaeaecOcOcOcOdlcOcOcOcOcOcOaeaaavfmfPfnfofofmfpfofofPfufufufufuaeaeaeaaaaaagQfIgQavcHfXgdgdgfgdgRgfgSfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgtgtgrgTgrgrgrgjgrgrgsgrgrgrgOgDgDgDgDgDgDgFgGgygygygyaaaeaecOcOgUdldlcOcOaeaeaeaaaaavfmfwfnfofofmfmfmfmfEfufSfHfSgVaaaeaaaaaaaaaaaagQaegVfXgWgWgfgWgXgfgffYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgtgrgrgrgrgrgrgjgjgjgjgjgOgjgjgDgDgDgDgDgPgFgGgygygygyaeaecOcOcOcOeLcOcOcOcOcOcOaeaaavfmfPfnfofofmfpfofofPfufufufufuaeaeaeaaaaaagQfIgQavcHfXgdgdgfgdgRgfgSfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgtgtgrgTgrgrgrgjgrgrgsgrgrgrgOgDgDgDgDgDgDgFgGgygygygyaaaeaecOcOgUeLeLcOcOaeaeaeaaaaavfmfwfnfofofmfmfmfmfEfufSfHfSgVaaaeaaaaaaaaaaaagQaegVfXgWgWgfgWgXgfgffYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagjgjgjgjgjgjgjgYgjgZgrgZgrgZgrgjgDgDgDgDgDhagDgFgGgygygyaaaaaeaecOcOcOcOcOaeaeaaaahbhbhcfmfohdfofpfmfpfEfofEfufHgVfHfHaaaeaaaacJaaaaaaaagVaefXgfgfgfgfhegdgdfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahfhghhhihhhihhhihhgjgZgrgZgrgZgrgOgDgDgDgDgDhjgDhkgFhlgGgygyhmguguguguhnhnaeaaaeaahoaaaaavfmfmhdfofmfmfPfpfPfEfufHgQaaaaaaaeaaaaaaaaaaaaaaaafSfXfYgfgffYfYfYfYfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahfhphqhrhqhrhqhrhqgjgrgrgrgrgrgrgjgDgDgDgDgDhsgDhtgDgFgFgGgygyhugyhuavavavavaaaeaeaeaeaaavfmfphvfpfpfmfpfpfpfpfugVfHaaaaaaaeaaaaaaaaaaaaaaaafXfXfXgfgffYhwhwhwfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -824,7 +821,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaektknknknkuknknknknknknkvkwkxkykzkAkBkCknknknknknknknknknknknkDkEkFktknknkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaektktktknknknknknknknknkGkHkIkJkKkLkMkNknknknknknknknknknknknklknknknknknkkaaaaaaaaaakiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaekOkPkQkQkQjWkQkQkQkQkQjWkQkQkQkQkQjWkQkQkQkQkQjWkQkQkQkQjWklktktknknknkRhxhxhxaaaaaahoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababababababababababbBabababababdDdDdDabababaAababababkSkTkSktknknktkUkVkWkXktaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababababababababababbBabababababdDdDdDabababaAababababkSkTkSktknknktkUcMkWkXktaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaakSkYkSkZkZjYlajYlajYikikikaaaaaakiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPavavkSlblcldkSlelejYlfjYlfjYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeavkSlgkSlhliljljjYlfjYlfjYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -909,11 +906,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHaaaamHmHmHmHmHntnvnumHmHaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmImImHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImIaaaaczmKmKmLmLmKmKmKmKmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmIczmKmNmImOazazmPmPmQazmRmSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmTazazazazazmUazmRmVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmWmXmYazmZmUazmUazmUmRmVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHnaaznbazncazmOazazazmUmRmVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHndmKneaznfazazngmPmPazmRnhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmIczmKmNmImOazazmPmPmQazmRdlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmTazazazazazmUazmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmWmXmYazmZmUazmUazmUmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHnaaznbazncazmOazazazmUmRehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHndmKneaznfazazngmPmPazmRhZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHndmKmKmLmLmKmKmKmKmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaamHmHmHmHmHmImImHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/debug/smoothing.dmm b/_maps/map_files/debug/smoothing.dmm
index 1ee9773589c..b9c65716db5 100644
--- a/_maps/map_files/debug/smoothing.dmm
+++ b/_maps/map_files/debug/smoothing.dmm
@@ -1,6 +1,6 @@
"a" = (/turf/simulated/floor/plating,/area/centcom)
"b" = (/turf/simulated/floor/plating,/area/start)
-"c" = (/turf/simulated/floor,/area/centcom)
+"c" = (/turf/simulated/floor/plasteel,/area/centcom)
"d" = (/turf/simulated/wall/mineral/alien,/area/centcom)
"e" = (/obj/structure/falsewall/alien,/turf/simulated/floor/plating,/area/centcom)
"f" = (/turf/simulated/wall/mineral/diamond,/area/centcom)
diff --git a/_maps/map_files/shuttles/emergency_meta.dmm b/_maps/map_files/shuttles/emergency_meta.dmm
index 350fba4b564..16566236c59 100644
--- a/_maps/map_files/shuttles/emergency_meta.dmm
+++ b/_maps/map_files/shuttles/emergency_meta.dmm
@@ -6,7 +6,7 @@
"af" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"ag" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"ah" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
-"ai" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "Meta emergency shuttle"; timid = 1; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"ai" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aj" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
"ak" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"al" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
@@ -24,21 +24,21 @@
"ax" = (/obj/structure/stool/bed/chair,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"ay" = (/obj/structure/closet/crate{name = "lifejackets"},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"az" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/escape)
-"aA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
+"aA" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"aB" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"aC" = (/obj/structure/table,/obj/item/weapon/storage/fancy,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aD" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aE" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aF" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape)
"aG" = (/obj/structure/dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"aH" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
+"aH" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_r"; tag = "icon-propulsion_r (EAST)"},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"aI" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"aJ" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aK" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aL" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aM" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aN" = (/obj/structure/closet/crate{name = "lifejackets"},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"aO" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (EAST)"; icon_state = "propulsion_r"; dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape)
+"aO" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "burst_l"},/turf/simulated/shuttle/plating,/area/shuttle/escape)
"aP" = (/obj/machinery/computer/emergency_shuttle,/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aQ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aR" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
@@ -110,20 +110,22 @@
"cf" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
"cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/escape)
"ch" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
+"ci" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; name = "Meta emergency shuttle"; timid = 1; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
(1,1,1) = {"
-aaaaabacacacacadaeacafagacagahacacacafaiacagajakal
+aaaaabacacacacadaeacafaiacaiahacacacafciacagajakal
aaamanaoapaqarasatauavauawauavavawavaxauavauauayaz
-aAaBasaCauaDaEaFauauauauauauauauauauauauauauauaGac
-aHaIasaJaKauauazauauaLaMaLaLaLauaLaLaLaMaLauauaNaf
-aOaBasaPaQauauaRauauacaSacaTacauacaTacaSacauauauac
+aOaBasaCauaDaEaFauauauauauauauauauauauauauauauaGac
+aAaIasaJaKauauazauauaLaMaLaLaLauaLaLaLaMaLauauaNaf
+aHaBasaPaQauauaRauauacaSacaTacauacaTacaSacauauauac
ajakanaUaDauauaVauauavaWavavavauavavavaWavauauaXaf
-aAaBasaYauaKauasaZauauauauauauauauauauauauauauauac
-aOaIasbabbbcauasatauaLaLbdaLaLauaLaLaMaLaLauaubeaV
+aOaBasaYauaKauasaZauauauauauauauauauauauauauauauac
+aHaIasbabbbcauasatauaLaLbdaLaLauaLaLaMaLaLauaubeaV
ajakbfbgakaebhbiakbjacajbkaeacblacbmaeacaTbnbnajan
-aAaBasbobpbqbrasbsbrbtbtasbubvaubwazbxbybzbAbAbBaz
-aHaIasbobpajbCbDbsbrbrbEasbFauaubGacbHbpbpbpbpbAac
-aOaBasbIbpbpbJaFbKbrbrbLasbMauauaublbNbpbpbpbpbAac
+aOaBasbobpbqbrasbsbrbtbtasbubvaubwazbxbybzbAbAbBaz
+aAaIasbobpajbCbDbsbrbrbEasbFauaubGacbHbpbpbpbpbAac
+aHaBasbIbpbpbJaFbKbrbrbLasbMauauaublbNbpbpbpbpbAac
aabOanbPbpbpbJasbQbRbSbTasbUbVbWbXbYbZcacbcccdceaV
aaaacfacbqbqaccgakacacajcgaeacacajcgakaeacacajakch
"}
+
diff --git a/_maps/map_files/shuttles/emergency_narnar.dmm b/_maps/map_files/shuttles/emergency_narnar.dmm
index 537d0f5ba82..f36caa90e27 100644
--- a/_maps/map_files/shuttles/emergency_narnar.dmm
+++ b/_maps/map_files/shuttles/emergency_narnar.dmm
@@ -37,15 +37,15 @@
"aK" = (/obj/effect/rune,/mob/living/simple_animal/hostile/construct/wraith,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aL" = (/mob/living/simple_animal/hostile/construct/armoured,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aM" = (/obj/effect/decal/cleanable/blood/innards,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
-"aN" = (/mob/living/simple_animal/construct/wraith,/mob/living/simple_animal/hostile/construct/builder,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
-"aO" = (/mob/living/simple_animal/construct/builder,/mob/living/simple_animal/hostile/construct/behemoth,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
+"aN" = (/mob/living/simple_animal/hostile/construct/builder,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
+"aO" = (/mob/living/simple_animal/hostile/construct/behemoth,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aP" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aQ" = (/obj/effect/decal/cleanable/blood/writing,/obj/effect/decal/cleanable/blood/writing,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aR" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/obj/effect/spawner/window/reinforced{color = "red"},/turf/simulated/wall/cult,/area/shuttle/escape)
"aS" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light/spot,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aT" = (/obj/machinery/door/airlock/cult/friendly,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aU" = (/obj/effect/spawner/window/reinforced{color = "red"},/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"aV" = (/mob/living/simple_animal/construct/armoured,/mob/living/simple_animal/hostile/construct/harvester,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
+"aV" = (/mob/living/simple_animal/hostile/construct/harvester,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aW" = (/obj/structure/dresser,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aX" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/floor/engine/cult,/area/shuttle/escape)
"aY" = (/obj/effect/decal/cleanable/blood/tracks/footprints,/turf/simulated/floor/engine/cult,/area/shuttle/escape)
diff --git a/_maps/map_files/shuttles/ferry_base.dmm b/_maps/map_files/shuttles/ferry_base.dmm
index 85f83a9b2e0..f94765dc410 100644
--- a/_maps/map_files/shuttles/ferry_base.dmm
+++ b/_maps/map_files/shuttles/ferry_base.dmm
@@ -1,5 +1,5 @@
"a" = (/turf/space,/area/space)
-"b" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
+"b" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
"c" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport)
"d" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport)
"e" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/transport)
@@ -12,7 +12,7 @@
"l" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/turf/simulated/shuttle/floor,/area/shuttle/transport)
"m" = (/turf/simulated/shuttle/floor,/area/shuttle/transport)
"n" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; timid = 1; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/transport)
-"o" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
+"o" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
"p" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/transport)
"q" = (/obj/structure/closet/crate,/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/transport)
"r" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/transport)
@@ -27,3 +27,4 @@ lmmmmmmmmmmn
opqrsstssstd
aoccdccceccu
"}
+
diff --git a/_maps/map_files/shuttles/ferry_meat.dmm b/_maps/map_files/shuttles/ferry_meat.dmm
index 5dd28d8f5ee..eb99726e3c7 100644
--- a/_maps/map_files/shuttles/ferry_meat.dmm
+++ b/_maps/map_files/shuttles/ferry_meat.dmm
@@ -1,5 +1,5 @@
"a" = (/turf/space,/area/space)
-"b" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
+"b" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport)
"c" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport)
"d" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport)
"e" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/transport)
@@ -16,7 +16,7 @@
"p" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/turf/simulated/shuttle/floor,/area/shuttle/transport)
"q" = (/obj/item/stack/sheet/animalhide/cat,/obj/item/stack/sheet/animalhide/corgi,/obj/item/stack/sheet/animalhide/human,/obj/item/stack/sheet/animalhide/lizard,/obj/item/stack/sheet/animalhide/monkey,/obj/item/stack/sheet/animalhide/xeno,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/transport)
"r" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; timid = 1; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/transport)
-"s" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
+"s" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
"t" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/transport)
"u" = (/obj/machinery/light/spot,/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/transport)
"v" = (/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/transport)
@@ -31,3 +31,4 @@ pkkkqkkmkkkr
stuvvvwxkkwd
asccdccceccy
"}
+
diff --git a/_maps/map_files/templates/medium_shuttle1.dmm b/_maps/map_files/templates/medium_shuttle1.dmm
index ee0c3ef5876..0bad713fe7e 100644
--- a/_maps/map_files/templates/medium_shuttle1.dmm
+++ b/_maps/map_files/templates/medium_shuttle1.dmm
@@ -1,46 +1,66 @@
"a" = (/turf/space,/area/space)
-"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{dir = 8; icon_state = "burst_l"; tag = "icon-burst_l (EAST)"},/turf/space,/area/ruin/powered{name = "Shuttle"})
"c" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
"d" = (/turf/simulated/shuttle/wall{tag = "icon-wall3"; icon_state = "wall3"},/area/ruin/powered{name = "Shuttle"})
"e" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
"f" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle/wall{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
"g" = (/turf/simulated/shuttle/wall,/area/ruin/powered{name = "Shuttle"})
"h" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
-"i" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"i" = (/obj/machinery/power/smes/magical{name = "super smes"},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"j" = (/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"k" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
-"l" = (/obj/machinery/door/airlock/glass,/turf/space,/area/ruin/powered{name = "Shuttle"})
+"l" = (/obj/structure/computerframe,/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"m" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
-"n" = (/obj/machinery/sleeper{tag = "icon-sleeper (NORTH)"; icon_state = "sleeper"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"n" = (/obj/structure/table,/obj/item/clothing/head/helmet/space/eva,/obj/item/clothing/suit/space/eva,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"o" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"p" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"q" = (/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
"r" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
"s" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
"t" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
-"u" = (/obj/machinery/power/smes/magical,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"u" = (/obj/machinery/teleport/hub,/obj/item/weapon/hand_tele,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"v" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-window1"; icon_state = "window1"},/area/ruin/powered{name = "Shuttle"})
-"w" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"w" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"x" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
"y" = (/turf/simulated/shuttle/wall{tag = "icon-wall"; icon_state = "wall"},/area/ruin/powered{name = "Shuttle"})
-"z" = (/obj/structure/shuttle/engine/propulsion/burst/right{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"z" = (/obj/structure/shuttle/engine/propulsion/burst/right{dir = 8; icon_state = "burst_r"; tag = "icon-burst_r (EAST)"},/turf/space,/area/ruin/powered{name = "Shuttle"})
"A" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle/wall{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
"B" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"C" = (/obj/machinery/light{dir = 1},/obj/machinery/teleport/station,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"D" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"E" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"F" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"G" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"H" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"I" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"J" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"K" = (/obj/machinery/light{dir = 4},/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"L" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"M" = (/obj/machinery/computer,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"N" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"O" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"P" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"Q" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility/full/multitool,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"R" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"S" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"T" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/space)
+"U" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
(1,1,1) = {"
aaabcdddeaaaaaaaaaaaaaa
aaabcddddeaaaaaaaaaaaaa
-aaabcfgggghhgiaaaaaaaaa
-aaggggjjjgjjggiaaaaaaaa
-aagjjkjjjglggggggggiaaa
-ggggkggkggjjgmngjjggggi
-hopoogjjjljjlqqljjlrrst
-gogougjjjgvvgvvggggrrst
-hopoogjjjljjljjljjlrrst
-ggggkggkggjjgjjgjjggggw
-aagjjkjjjglggggggggxaaa
-aaygggjjjgjjggwaaaaaaaa
-aaazcAgggghhgwaaaaaaaaa
+aaabcfgggghhgTaaaaaaaaa
+aagggglCugjjggGaaaaaaaa
+aagNjkjSjgkggggggggGaaa
+ggggkggkggjEgmHgJKggggG
+hopOognjjkjjkqqkjjkrrUt
+gogoignjwgvvgvvggggrLMt
+hopPognjjkjjkjjkjjkrrst
+ggggpggkggjFgIIgjwggggx
+aagQjkjjRgkggggggggxaaa
+aaygggjDjgjjggxaaaaaaaa
+aaazcAgggghhgxaaaaaaaaa
aaazcdddBaaaaaaaaaaaaaa
aaazcddBaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/templates/medium_shuttle2.dmm b/_maps/map_files/templates/medium_shuttle2.dmm
index 3aafdccbed8..c85444ef120 100644
--- a/_maps/map_files/templates/medium_shuttle2.dmm
+++ b/_maps/map_files/templates/medium_shuttle2.dmm
@@ -1,18 +1,18 @@
"a" = (/turf/space,/area/space)
-"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{dir = 8; icon_state = "burst_l"; tag = "icon-burst_l (EAST)"},/turf/space,/area/ruin/powered{name = "Shuttle"})
"c" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
"d" = (/turf/simulated/shuttle{tag = "icon-wall3 (EAST)"; icon_state = "wall3"; dir = 4},/area/ruin/powered{name = "Shuttle"})
"e" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
-"f" = (/obj/structure/shuttle/engine/propulsion/burst/right{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"f" = (/obj/structure/shuttle/engine/propulsion/burst/right{dir = 8; icon_state = "burst_r"; tag = "icon-burst_r (EAST)"},/turf/space,/area/ruin/powered{name = "Shuttle"})
"g" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
"h" = (/turf/simulated/shuttle/wall,/area/ruin/powered{name = "Shuttle"})
-"i" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/space)
+"i" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"j" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/ruin/powered{name = "Shuttle"})
"k" = (/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"l" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"m" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"n" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
-"o" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"o" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"p" = (/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
"q" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"r" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
@@ -23,26 +23,47 @@
"w" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
"x" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
"y" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
-"z" = (/obj/machinery/power/smes/magical,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"z" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"A" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
"B" = (/obj/structure/stool/bed/chair/comfy{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
"C" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
-"D" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
-"E" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/space)
+"D" = (/obj/structure/computerframe,/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"E" = (/obj/machinery/teleport/hub,/obj/item/weapon/hand_tele,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
"F" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"G" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"H" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"I" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/space)
+"J" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"K" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"L" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/space)
+"M" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"N" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"O" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility/full/multitool,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"P" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"Q" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"R" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"S" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"T" = (/obj/structure/table,/obj/item/clothing/head/helmet/space/eva,/obj/item/clothing/suit/space/eva,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"U" = (/obj/machinery/teleport/station,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"V" = (/obj/machinery/power/smes/magical{name = "super smes"},/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"W" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"X" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"Y" = (/obj/machinery/light,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"Z" = (/obj/machinery/computer,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
(1,1,1) = {"
aaabcddddeaaaaaaaaaaaaaaaaaa
-aaafcddghhhiaaaaaaaaaaaaaaaa
-aaajdghhkkhhhhlhiaaaaaaaaaaa
-bcdddhmnkknkkhkhhhhhhhhhhhoa
-fcddghmhhhhkknknknppnkkqrrhh
-aaashtmhhhhnhhhhkhuvhkkhrwxa
-aaaaymmzhhhkhhhhkhAAhAAhBwxa
-aaajhtmhhhhnhhhhkhkkhkkhrwxa
-bcddChmhhhhkknknknkknkkqrrhh
-fcdddhmnkknkkhkhhhhhhhhhhhDa
-aaasdChhkkhhhhlhEaaaaaaaaaaa
-aaabcddChhhEaaaaaaaaaaaaaaaa
+aaafcddghhhIaaaaaaaaaaaaaaaa
+aaajdghhTThhhhlhIaaaaaaaaaaa
+bcdddhinkkhJHhkhhhhhhhhhhhQa
+fcddghmhkknkknknknWpnkkqXrhh
+aaashzmhDkhhhhhhkhuvhNNhrSxa
+aaaaymmhUknkVhhhkhAAhAAhBZxa
+aaajhtmhEGhhhhhhkhMMhPOhrwxa
+bcddChmhkknkknknknKknkkqYrhh
+fcdddhonkkhKkhkhhhhhhhhhhhRa
+aaasdChhNNhhhhlhLaaaaaaaaaaa
+aaabcddChhhLaaaaaaaaaaaaaaaa
aaafcddddFaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/templates/medium_shuttle3.dmm b/_maps/map_files/templates/medium_shuttle3.dmm
index 8d258c55716..3c9289648d3 100644
--- a/_maps/map_files/templates/medium_shuttle3.dmm
+++ b/_maps/map_files/templates/medium_shuttle3.dmm
@@ -11,11 +11,11 @@
"k" = (/obj/machinery/power/smes/magical,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"l" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"m" = (/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
-"n" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"n" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/space,/area/ruin/powered{name = "Shuttle"})
"o" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
"p" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
"q" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
-"r" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"r" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"; tag = "icon-propulsion (WEST)"},/turf/space,/area/ruin/powered{name = "Shuttle"})
"s" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
"t" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
"u" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/ruin/powered{name = "Shuttle"})
@@ -56,3 +56,4 @@ aaaaayFccBaayccFBaaaaa
aaaaaaGcFaaaaFcGaaaaaa
aaaaaaaaGaaaaGaaaaaaaa
"}
+
diff --git a/_maps/map_files/templates/small_shuttle_1.dmm b/_maps/map_files/templates/small_shuttle_1.dmm
index ffb52eea1d0..98f9e53f4e2 100644
--- a/_maps/map_files/templates/small_shuttle_1.dmm
+++ b/_maps/map_files/templates/small_shuttle_1.dmm
@@ -1,33 +1,38 @@
-"a" = (/turf/space,/area/space)
-"b" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/space)
-"c" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/floor/plating/airless,/area/space)
-"d" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/space)
-"e" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/space)
-"f" = (/turf/simulated/shuttle/floor,/area/space)
-"g" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/space)
-"h" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/space)
-"i" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/space)
-"j" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/space)
-"k" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/space)
-"l" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/space)
-"m" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/space)
-"n" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/space)
-"o" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/space)
-"p" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/simulated/floor/plating/airless,/area/space)
-"q" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating/airless,/area/space)
-"r" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/floor/plating/airless,/area/space)
-"s" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/space)
+"a" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/ruin/powered)
+"b" = (/turf/space,/area/ruin/powered)
+"c" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/ruin/powered)
+"d" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"e" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/ruin/powered)
+"f" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/ruin/powered)
+"g" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"h" = (/turf/simulated/shuttle/floor,/area/ruin/powered)
+"i" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"j" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"k" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"l" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/ruin/powered)
+"m" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"n" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"o" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"p" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/ruin/powered)
+"q" = (/obj/machinery/computer,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"r" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"s" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/ruin/powered)
+"t" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/ruin/powered)
+"u" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"v" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"w" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/floor/plating/airless,/area/ruin/powered)
(1,1,1) = {"
-abcccda
-aefgfea
-aefffea
-bhijkhd
-elfffme
-elfffme
-jfffffj
-jfffffj
-efffffe
-ennnnne
-opqqqrs
+bagggsb
+bchrqcb
+bcihicb
+alfdpls
+cmhhhuc
+cmhhhuc
+dhhhhhd
+dhhhhhd
+cnhhhvc
+cjjjjjc
+eokkkwt
"}
+
diff --git a/_maps/map_files/templates/spacehotel/n_02.dmm b/_maps/map_files/templates/spacehotel/n_02.dmm
index 9555b7a80e5..cda6eb42b4e 100644
--- a/_maps/map_files/templates/spacehotel/n_02.dmm
+++ b/_maps/map_files/templates/spacehotel/n_02.dmm
@@ -1,12 +1,12 @@
"a" = (/turf/template_noop,/area/template_noop)
"b" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/template_noop,/area/template_noop)
-"c" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/bananapeel{layer = 2.6},/turf/template_noop,/area/template_noop)
+"c" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/grown/bananapeel{layer = 2.6},/turf/template_noop,/area/template_noop)
"d" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
"e" = (/turf/unsimulated/floor/carpet,/area/template_noop)
"f" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop)
"g" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
-"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop)
-"i" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/obj/item/weapon/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/grown/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/obj/item/weapon/grown/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop)
"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
"k" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop)
"l" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
@@ -28,3 +28,4 @@ anopqra
aaaaaaa
aaaaaaa
"}
+
diff --git a/_maps/map_files/templates/spacehotel/n_04.dmm b/_maps/map_files/templates/spacehotel/n_04.dmm
index 74a6e875b4a..91a433502b9 100644
--- a/_maps/map_files/templates/spacehotel/n_04.dmm
+++ b/_maps/map_files/templates/spacehotel/n_04.dmm
@@ -14,7 +14,7 @@
"n" = (/obj/machinery/door/window/southright,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/unsimulated/floor/carpet,/area/template_noop)
"o" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/black,/turf/unsimulated/floor/carpet,/area/template_noop)
"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/alien/weeds,/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
-"q" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/organ/internal/body_egg/alien_embryo,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
"r" = (/obj/machinery/door/window/eastleft,/obj/structure/alien/weeds,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
"s" = (/obj/machinery/shower{dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
"t" = (/turf/unsimulated/wall/metal,/area/template_noop)
diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm
index 9648a7c707c..2764d377626 100644
--- a/_maps/map_files/templates/spacehotel/s_04.dmm
+++ b/_maps/map_files/templates/spacehotel/s_04.dmm
@@ -4,7 +4,7 @@
"d" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"e" = (/obj/structure/rack,/obj/item/clothing/suit/syndicatefake,/obj/item/clothing/under/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"f" = (/obj/structure/rack,/obj/item/clothing/mask/gas/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
-"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"h" = (/obj/structure/dresser,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/storage/fancy/cigarettes/syndicate{pixel_x = 8},/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
diff --git a/_maps/map_files/vr/blood_and_sand.dmm b/_maps/map_files/vr/blood_and_sand.dmm
new file mode 100644
index 00000000000..af13e70d2f1
--- /dev/null
+++ b/_maps/map_files/vr/blood_and_sand.dmm
@@ -0,0 +1,46 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/unsimulated/wall/other,/area/vr/roman)
+"c" = (/turf/unsimulated/beach/sand,/area/vr/roman)
+"d" = (/obj/effect/landmark{name = "avatarspawn"},/turf/unsimulated/beach/sand,/area/vr/roman)
+"e" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/vr/roman)
+"f" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/vr/roman)
+"g" = (/turf/unsimulated/floor{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/vr/roman)
+"h" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/vr/roman)
+"i" = (/turf/unsimulated/floor/lava/dense,/area/vr/roman)
+"j" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/vr/roman)
+"k" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/vr/roman)
+"l" = (/turf/unsimulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/vr/roman)
+"m" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/vr/roman)
+
+(1,1,1) = {"
+aaaaaaaaaaabbbbbbbbaaaaaaaaaaa
+aaaaaaaabbbbccccccbbbbaaaaaaaa
+aaaaaaabbccccccccccccbbaaaaaaa
+aaaaabbbccccccddccccccbbbaaaaa
+aaaabbdccccccefgcccccccdbbaaaa
+aaabbddcccccchijcccccccddbbaaa
+aaabcccccccccklmccccccccccbaaa
+aabbccccccccccccccccccccccbbaa
+abbccefgcccccccccccccccccccbba
+abccchijccccccddccccccccccccba
+abcccklmcccdccccccdcccccccccba
+bbccccccccdbccccccbdccccccccbb
+bccccccccccccccccccccccccccccb
+bccccccccccccccccccccccccccccb
+bccdccccdccccccccccccdccccdccb
+bccdccccdccccccccccccdccccdccb
+bccccccccccccccccccccccccccccb
+bccccccccccccccccccccccccccccb
+bbccccccccdbccccccbdccccefgcbb
+abcccccccccdccccccdccccchijcba
+abccccccccccccccccccccccklmcba
+abbcccefgcccccddcccccccccccbba
+aabbcchijcccccccccccccccccbbaa
+aaabddklmcccccccccccccccccbaaa
+aaabbdcccccccccccccccccddbbaaa
+aaaabbcccccccccccccccccdbbaaaa
+aaaaabbbccccccddccccccbbbaaaaa
+aaaaaaabbccccccccccccbbaaaaaaa
+aaaaaaaabbbbccccccbbbbaaaaaaaa
+aaaaaaaaaaabbbbbbbbaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/vr/lobby.dmm b/_maps/map_files/vr/lobby.dmm
new file mode 100644
index 00000000000..798228e212e
--- /dev/null
+++ b/_maps/map_files/vr/lobby.dmm
@@ -0,0 +1,46 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/unsimulated/wall/metal,/area/vr/lobby)
+"c" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/vr/lobby)
+"d" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/vr/lobby)
+"e" = (/turf/unsimulated/floor{icon_state = "gcircuit"},/area/vr/lobby)
+"f" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/vr/lobby)
+"g" = (/turf/unsimulated/floor{icon_state = "light_on"},/area/vr/lobby)
+"h" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"; tag = "icon-fakewindows (WEST)"},/area/vr/lobby)
+"i" = (/turf/unsimulated/wall/fakeglass{dir = 0; icon_state = "fakewindows"; tag = "icon-fakewindows (EAST)"},/area/vr/lobby)
+"j" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "gcircuit"},/area/vr/lobby)
+"k" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{icon_state = "gcircuit"},/area/vr/lobby)
+"l" = (/obj/machinery/telecomms/hub/preset_cent,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/vr/lobby)
+"m" = (/obj/machinery/computer/vr_control,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/vr/lobby)
+"n" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/vr/lobby)
+"o" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/vr/lobby)
+"p" = (/obj/effect/landmark{name = "avatarspawn"},/turf/unsimulated/floor{icon_state = "gcircuit"},/area/vr/lobby)
+"q" = (/obj/machinery/telecomms/processor/preset_cent,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/vr/lobby)
+"r" = (/turf/unsimulated/wall/fakeglass,/area/vr/lobby)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaabbbbaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabbccbbaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaabbbdeedbbbaaaaaaaaaaaaaaaaaaaa
+aabbbbbbbbbbbbbbbbbbbeefeefeebbbbbbbbbbbbbbbbbbbaa
+aabbcecececececbbbeeeegheehgeeeebbbcecececececbbaa
+aabcgegegegegegcbbegcgcieeicgcgebbcgegegegegegcbaa
+aabeejekejekejeebbeceeeleeleeecebbeejekejekejeebaa
+aabcgegegegegegcbeegecgheehgcegeebcgegegegegegcbaa
+aabbcecececececbbegcegcieeicgecgebbcecececececbbaa
+aaabdmdmdmdmdmdbdfnolnobccbnolnofdbdmdmdmdmdmdbaaa
+aaabeeeeeeeeeeeceeeeeeecppceeeeeeeceeeeeeeeeeebaaa
+aaabeeeeeeeeeeeceeeeeeecppceeeeeeeceeeeeeeeeeebaaa
+aaabbbbbbbbbbbbbdfnolnobccbnolnoqdbbbbbbbbbbbbbaaa
+aaaaaaaaaaaaaaabbegcegcheehcgecgebbaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaabeegecgreeigcegeebaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaabbeceeeleeleeecebbaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaabegcgcheehcgcgebaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaabeeeegreeigeeeebaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaabbbbeefeefeebbbbaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaabbbdeedbbbaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabbccbbaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaabbbbaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/test_away_missions.dm b/_maps/test_away_missions.dm
index e5c1f0d192e..e960cd3b065 100644
--- a/_maps/test_away_missions.dm
+++ b/_maps/test_away_missions.dm
@@ -2,7 +2,6 @@
#if !defined(MAP_FILE)
#include "map_files\RandomZLevels\beach.dmm"
- #include "map_files\RandomZLevels\listeningpost.dmm"
#include "map_files\RandomZLevels\moonoutpost19.dmm"
#include "map_files\RandomZLevels\undergroundoutpost45.dmm"
#include "map_files\RandomZLevels\academy.dmm"
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 47c5689054c..1d7f436770d 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -43,6 +43,8 @@ Pipelines + Other Objects -> Pipe network
if(!pipe_color_check(pipe_color))
pipe_color = null
+ // No need for a tween worldstart roundstart handler - pipenet creation is
+ // handled there
/obj/machinery/atmospherics/initialize()
..()
@@ -51,15 +53,11 @@ Pipelines + Other Objects -> Pipe network
stored = new(src, make_from = src)
/obj/machinery/atmospherics/Destroy()
- if(stored)
- qdel(stored)
- stored = null
+ QDEL_NULL(stored)
for(var/mob/living/L in src) //ventcrawling is serious business
L.remove_ventcrawl()
L.forceMove(get_turf(src))
- if(pipe_image)
- qdel(pipe_image) //we have to del it, or it might keep a ref somewhere else
- pipe_image = null
+ QDEL_NULL(pipe_image) //we have to del it, or it might keep a ref somewhere else
return ..()
// Icons/overlays/underlays
@@ -170,13 +168,13 @@ Pipelines + Other Objects -> Pipe network
var/unsafe_wrenching = FALSE
var/internal_pressure = int_air.return_pressure()-env_air.return_pressure()
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You begin to unfasten \the [src]... ")
if(internal_pressure > 2*ONE_ATMOSPHERE)
to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider? ")
unsafe_wrenching = TRUE //Oh dear oh dear
- if(do_after(user, 40, target = src) && isnull(gcDestroyed))
+ if(do_after(user, 40 * W.toolspeed, target = src) && isnull(gcDestroyed))
user.visible_message( \
"[user] unfastens \the [src].", \
"You have unfastened \the [src]. ", \
@@ -215,7 +213,7 @@ Pipelines + Other Objects -> Pipe network
qdel(src)
-/obj/machinery/atmospherics/construction(D, P, C)
+/obj/machinery/atmospherics/on_construction(D, P, C)
if(C)
color = C
dir = D
diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
index b6c5d55e5a9..a0f563669c1 100644
--- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
@@ -7,29 +7,30 @@
icon_state = "circ1-off"
var/side = CIRC_LEFT
-
+
var/global/const/CIRC_LEFT = WEST
var/global/const/CIRC_RIGHT = EAST
var/last_pressure_delta = 0
-
+
var/obj/machinery/power/generator/generator
layer = 2.45 // Just above wires
-
+
anchored = 1
density = 1
-
+
can_unwrench = 1
-
-// Creating a custom circulator pipe subtype to be delivered through cargo
+ var/side_inverted = 0
+
+// Creating a custom circulator pipe subtype to be delivered through cargo
/obj/item/pipe/circulator
name = "circulator/heat exchanger fitting"
/obj/item/pipe/circulator/New(loc)
var/obj/machinery/atmospherics/binary/circulator/C = new /obj/machinery/atmospherics/binary/circulator(null)
- ..(loc, make_from = C)
-
+ ..(loc, make_from = C)
+
/obj/machinery/atmospherics/binary/circulator/Destroy()
if(generator && generator.cold_circ == src)
generator.cold_circ = null
@@ -38,8 +39,10 @@
return ..()
/obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air()
- var/output_starting_pressure = air1.return_pressure()
- var/input_starting_pressure = air2.return_pressure()
+ var/datum/gas_mixture/inlet = get_inlet_air()
+ var/datum/gas_mixture/outlet = get_outlet_air()
+ var/output_starting_pressure = outlet.return_pressure()
+ var/input_starting_pressure = inlet.return_pressure()
if(output_starting_pressure >= input_starting_pressure - 10)
//Need at least 10 KPa difference to overcome friction in the mechanism
@@ -47,17 +50,17 @@
return null
//Calculate necessary moles to transfer using PV = nRT
- if(air2.temperature > 0)
+ if(inlet.temperature > 0)
var/pressure_delta = (input_starting_pressure - output_starting_pressure) / 2
- var/transfer_moles = pressure_delta * air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta * outlet.volume/(inlet.temperature * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
//log_debug("pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];")
//Actually transfer the gas
- var/datum/gas_mixture/removed = air2.remove(transfer_moles)
+ var/datum/gas_mixture/removed = inlet.remove(transfer_moles)
parent1.update = 1
parent2.update = 1
@@ -71,6 +74,43 @@
..()
update_icon()
+/obj/machinery/atmospherics/binary/circulator/proc/get_inlet_air()
+ if(side_inverted==0)
+ return air2
+ else
+ return air1
+
+/obj/machinery/atmospherics/binary/circulator/proc/get_outlet_air()
+ if(side_inverted==0)
+ return air1
+ else
+ return air2
+
+/obj/machinery/atmospherics/binary/circulator/proc/get_inlet_side()
+ if(dir==SOUTH||dir==NORTH)
+ if(side_inverted==0)
+ return "South"
+ else
+ return "North"
+
+/obj/machinery/atmospherics/binary/circulator/proc/get_outlet_side()
+ if(dir==SOUTH||dir==NORTH)
+ if(side_inverted==0)
+ return "North"
+ else
+ return "South"
+
+/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(ismultitool(W))
+ if(side_inverted == 0)
+ side_inverted = 1
+ else
+ side_inverted = 0
+ to_chat(user, "You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side. ")
+ desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side."
+ else
+ ..()
+
/obj/machinery/atmospherics/binary/circulator/update_icon()
if(stat & (BROKEN|NOPOWER))
icon_state = "circ[side]-p"
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 6f8da094151..74293d6a807 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -10,6 +10,8 @@
name = "dual-port air vent"
desc = "Has a valve and pump attached to it. There are two ports."
+ can_unwrench = 1
+
level = 1
connect_types = list(1,2,3) //connects to regular, supply and scrubbers pipes
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 4f3c3d65635..a9071e5ba13 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -88,17 +88,6 @@
return 1
-/obj/machinery/atmospherics/binary/passive_gate/interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
-
- var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_pump")
-
/obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
@@ -131,32 +120,62 @@
update_icon()
return
-/obj/machinery/atmospherics/binary/passive_gate/attack_hand(user as mob)
+/obj/machinery/atmospherics/binary/passive_gate/attack_hand(mob/user)
if(..())
return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
+
+ if(!allowed(user))
to_chat(user, "Access denied. ")
return
- usr.set_machine(src)
- interact(user)
- return
+
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/passive_gate/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_pump.tmpl", name, 385, 115, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/binary/passive_gate/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ return data
/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list)
- if(..()) return
+ if(..())
+ return 1
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
- src.target_pressure = max(0, min(4500, new_pressure))
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- src.update_icon()
- src.updateUsrDialog()
- return
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure))
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
-/obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
+ update_icon()
+ nanomanager.update_uis(src)
+
+/obj/machinery/atmospherics/binary/passive_gate/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(on)
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 3b1ca109a81..908a5318dda 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -103,17 +103,6 @@ Thus, the two variables affect pump operation are set in New():
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
return 1
-/obj/machinery/atmospherics/binary/pump/interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
-
- var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_pump")
-
/obj/machinery/atmospherics/binary/pump/initialize()
..()
if(frequency)
@@ -151,31 +140,60 @@ Thus, the two variables affect pump operation are set in New():
update_icon()
return
-/obj/machinery/atmospherics/binary/pump/attack_hand(user as mob)
+/obj/machinery/atmospherics/binary/pump/attack_hand(mob/user)
if(..())
return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
+
+ if(!allowed(user))
to_chat(user, "Access denied. ")
return
- usr.set_machine(src)
- interact(user)
- return
+
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/pump/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_pump.tmpl", name, 385, 115, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/binary/pump/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ return data
/obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
if(..())
return 1
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
- src.target_pressure = max(0, min(4500, new_pressure))
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- src.update_icon()
- src.updateUsrDialog()
- return
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure))
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+
+ update_icon()
+ nanomanager.update_uis(src)
/obj/machinery/atmospherics/binary/pump/power_change()
var/old_stat = stat
@@ -183,7 +201,7 @@ Thus, the two variables affect pump operation are set in New():
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
+/obj/machinery/atmospherics/binary/pump/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(!(stat & NOPOWER) && on)
diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm
index 1a2a4ea541f..2737b7abfbd 100644
--- a/code/ATMOSPHERICS/components/binary_devices/valve.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm
@@ -45,17 +45,21 @@
investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", "atmos")
return
-/obj/machinery/atmospherics/binary/valve/attack_ai(mob/user as mob)
+/obj/machinery/atmospherics/binary/valve/attack_ai(mob/user)
return
+
+/obj/machinery/atmospherics/binary/valve/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
-/obj/machinery/atmospherics/binary/valve/attack_hand(mob/user as mob)
+/obj/machinery/atmospherics/binary/valve/attack_hand(mob/user)
add_fingerprint(usr)
update_icon(1)
sleep(10)
if(open)
close()
- return
- open()
+ else
+ open()
/obj/machinery/atmospherics/binary/valve/digital // can be controlled by AI
name = "digital valve"
@@ -67,13 +71,13 @@
var/datum/radio_frequency/radio_connection
settagwhitelist = list("id_tag")
-/obj/machinery/atmospherics/binary/valve/digital/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/atmospherics/binary/valve/digital/attack_ai(mob/user)
+ return attack_hand(user)
-/obj/machinery/atmospherics/binary/valve/digital/attack_hand(mob/user as mob)
+/obj/machinery/atmospherics/binary/valve/digital/attack_hand(mob/user)
if(!powered())
return
- if(!src.allowed(user))
+ if(!allowed(user) && !user.can_advanced_admin_interact())
to_chat(user, "Access denied. ")
return
..()
@@ -130,7 +134,7 @@
if(open)
close()
-/obj/machinery/atmospherics/binary/valve/digital/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+/obj/machinery/atmospherics/binary/valve/digital/attackby(var/obj/item/weapon/W as obj, var/mob/user)
if(istype(W, /obj/item/device/multitool))
update_multitool_menu(user)
return 1
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index 80e1ad2e8b9..0ec613cb049 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -99,18 +99,6 @@ Thus, the two variables affect pump operation are set in New():
return 1
-/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow:
- [round(transfer_rate,1)]l/s | Change
- "}
-
- var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_pump")
-
-
/obj/machinery/atmospherics/binary/volume_pump/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
return 0
@@ -142,31 +130,60 @@ Thus, the two variables affect pump operation are set in New():
broadcast_status()
update_icon()
-/obj/machinery/atmospherics/binary/volume_pump/attack_hand(user as mob)
+/obj/machinery/atmospherics/binary/volume_pump/attack_hand(mob/user)
if(..())
return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
+
+ if(!allowed(user))
to_chat(user, "Access denied. ")
return
- usr.set_machine(src)
- interact(user)
- return
+
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/volume_pump/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_pump.tmpl", name, 310, 115, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/binary/volume_pump/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["rate"] = round(transfer_rate)
+ data["max_rate"] = round(MAX_TRANSFER_RATE)
+ return data
/obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list)
if(..())
return 1
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- if(href_list["set_transfer_rate"])
- var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num
- src.transfer_rate = max(0, min(200, new_transfer_rate))
- investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- src.update_icon()
- src.updateUsrDialog()
- return
+ . = TRUE
+ if(href_list["rate"])
+ var/rate = href_list["rate"]
+ if(rate == "max")
+ rate = MAX_TRANSFER_RATE
+ . = TRUE
+ else if(rate == "input")
+ rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, transfer_rate) as num|null
+ if(!isnull(rate))
+ . = TRUE
+ else if(text2num(rate) != null)
+ rate = text2num(rate)
+ . = TRUE
+ if(.)
+ transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE)
+ investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
+
+ update_icon()
+ nanomanager.update_uis(src)
/obj/machinery/atmospherics/binary/volume_pump/power_change()
var/old_stat = stat
@@ -174,7 +191,7 @@ Thus, the two variables affect pump operation are set in New():
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
+/obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(!(stat & NOPOWER) && on)
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index beae30e55db..a247d6f93a3 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -107,9 +107,9 @@
to_chat(user, "You cannot unwrench [src], it is too exerted due to internal pressure. ")
add_fingerprint(user)
return 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You begin to unfasten \the [src]... ")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"You have unfastened \the [src]. ", \
@@ -119,14 +119,16 @@
else
return ..()
-/obj/machinery/atmospherics/omni/attack_hand(user as mob)
+/obj/machinery/atmospherics/omni/attack_hand(mob/user)
if(..())
return
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
ui_interact(user)
- return
+/obj/machinery/atmospherics/omni/attack_ghost(mob/user)
+ ui_interact(user)
+
/obj/machinery/atmospherics/omni/proc/build_icons()
if(!check_icon_cache())
return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 021bec1cd24..109c3a2fa04 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -6,8 +6,6 @@
name = "gas filter"
- var/temp = null // -- TLE
-
var/target_pressure = ONE_ATMOSPHERE
var/filter_type = 0
@@ -147,71 +145,62 @@ Filter types:
set_frequency(frequency)
..()
-/obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
+/obj/machinery/atmospherics/trinary/filter/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/trinary/filter/attack_hand(mob/user)
if(..())
return
- if(!src.allowed(user))
+ if(!allowed(user))
to_chat(user, "Access denied. ")
return
- var/dat
- var/current_filter_type
- switch(filter_type)
- if(0)
- current_filter_type = "Toxins"
- if(1)
- current_filter_type = "Oxygen"
- if(2)
- current_filter_type = "Nitrogen"
- if(3)
- current_filter_type = "Carbon Dioxide"
- if(4)
- current_filter_type = "Nitrous Oxide"
- if(-1)
- current_filter_type = "Nothing"
- else
- current_filter_type = "ERROR - Report this bug to the admin, please!"
+ add_fingerprint(user)
+ ui_interact(user)
- dat += {"
- Power: [on?"On":"Off"]
- Filtering: [current_filter_type]
- Set Filter Type:
- Toxins
- Oxygen
- Nitrogen
- Carbon Dioxide
- Nitrous Oxide
- Nothing
- Desirable output pressure:
- [src.target_pressure]kPa | Change
- "}
+/obj/machinery/atmospherics/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_filter.tmpl", name, 475, 155, state = state)
+ ui.open()
- var/datum/browser/popup = new(user, "atmo_filter", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_filter")
- return
+/obj/machinery/atmospherics/trinary/filter/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ data["filter_type"] = filter_type
+ return data
/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
if(..())
return 1
- usr.set_machine(src)
- src.add_fingerprint(usr)
- if(href_list["filterset"])
- src.filter_type = text2num(href_list["filterset"])
- if(href_list["temp"])
- src.temp = null
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
- src.target_pressure = max(0, min(4500, new_pressure))
+
if(href_list["power"])
- on=!on
- src.update_icon()
- src.updateUsrDialog()
-/*
- for(var/mob/M in viewers(1, src))
- if((M.client && M.machine == src))
- src.attack_hand(M)
-*/
- return
+ on = !on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure) && !..())
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ if(href_list["filter"])
+ filter_type = text2num(href_list["filter"])
+ investigate_log("was set to filter [filter_type] by [key_name(usr)]", "atmos")
+ . = TRUE
+
+ update_icon()
+ nanomanager.update_uis(src)
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index bef88fe6f3b..0657f8d9f5f 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -16,7 +16,7 @@
icon_state = "mmap"
flipped = 1
-/obj/machinery/atmospherics/trinary/mixer/update_icon(var/safety = 0)
+/obj/machinery/atmospherics/trinary/mixer/update_icon(safety = 0)
if(flipped)
icon_state = "m"
else
@@ -108,55 +108,71 @@
return 1
-/obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob)
+/obj/machinery/atmospherics/trinary/mixer/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/trinary/mixer/attack_hand(mob/user)
if(..())
return
- src.add_fingerprint(usr)
- if(!src.allowed(user))
+
+ if(!allowed(user))
to_chat(user, "Access denied. ")
return
- usr.set_machine(src)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [target_pressure]kPa | Change
-
- Node 1 Concentration:
- -
- -
- [node1_concentration]([node1_concentration*100]%)
- +
- +
-
- Node 2 Concentration:
- -
- -
- [node2_concentration]([node2_concentration*100]%)
- +
- +
- "}
- var/datum/browser/popup = new(user, "atmo_mixer", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_mixer")
- return
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_mixer.tmpl", name, 370, 165, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/trinary/mixer/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ data["node1_concentration"] = round(node1_concentration*100)
+ data["node2_concentration"] = round(node2_concentration*100)
+ return data
/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list)
if(..())
return 1
+
if(href_list["power"])
on = !on
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
- src.target_pressure = max(0, min(4500, new_pressure))
- if(href_list["node1_c"])
- var/value = text2num(href_list["node1_c"])
- src.node1_concentration = max(0, min(1, src.node1_concentration + value))
- src.node2_concentration = max(0, min(1, src.node2_concentration - value))
- if(href_list["node2_c"])
- var/value = text2num(href_list["node2_c"])
- src.node2_concentration = max(0, min(1, src.node2_concentration + value))
- src.node1_concentration = max(0, min(1, src.node1_concentration - value))
- src.update_icon()
- src.updateUsrDialog()
- return
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure) && !..())
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ if(href_list["node1"])
+ var/value = text2num(href_list["node1"])
+ node1_concentration = max(0, min(1, node1_concentration + value))
+ node2_concentration = max(0, min(1, node2_concentration - value))
+ investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", "atmos")
+ . = TRUE
+ if(href_list["node2"])
+ var/value = text2num(href_list["node2"])
+ node2_concentration = max(0, min(1, node2_concentration + value))
+ node1_concentration = max(0, min(1, node1_concentration - value))
+ investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", "atmos")
+ . = TRUE
+
+ update_icon()
+ nanomanager.update_uis(src)
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm
index 2195bab16d8..0987561f94c 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm
@@ -30,7 +30,7 @@
if(flipped)
flipstate = "m"
if(animation)
- flick("tvalve[flipstate][src.state][!src.state]",src)
+ flick("tvalve[flipstate][state][!state]",src)
else
icon_state = "tvalve[flipstate][state]"
@@ -52,9 +52,9 @@
/obj/machinery/atmospherics/trinary/tvalve/proc/switch_side()
if(state == TVALVE_STATE_STRAIGHT)
- src.go_to_side()
+ go_to_side()
else
- src.go_straight()
+ go_straight()
/obj/machinery/atmospherics/trinary/tvalve/proc/go_to_side()
if(state == TVALVE_STATE_SIDE)
@@ -86,10 +86,14 @@
investigate_log("was set to straight by [usr ? key_name(usr) : "a remote signal"]", "atmos")
return 1
-/obj/machinery/atmospherics/trinary/tvalve/attack_ai(mob/user as mob)
+/obj/machinery/atmospherics/trinary/tvalve/attack_ai(mob/user)
return
+
+/obj/machinery/atmospherics/trinary/tvalve/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
-/obj/machinery/atmospherics/trinary/tvalve/attack_hand(mob/user as mob)
+/obj/machinery/atmospherics/trinary/tvalve/attack_hand(mob/usermob)
add_fingerprint(usr)
update_icon(1)
sleep(10)
@@ -128,13 +132,13 @@
if(!powered())
icon_state = "tvalvenopower"
-/obj/machinery/atmospherics/trinary/tvalve/digital/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/atmospherics/trinary/tvalve/digital/attack_ai(mob/user)
+ return attack_hand(user)
-/obj/machinery/atmospherics/trinary/tvalve/digital/attack_hand(mob/user as mob)
+/obj/machinery/atmospherics/trinary/tvalve/digital/attack_hand(mob/user)
if(!powered())
return
- if(!src.allowed(user))
+ if(!allowed(user) && !user.can_advanced_admin_interact())
to_chat(user, "Access denied. ")
return
..()
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 299d0c20e22..08febf1c572 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -61,6 +61,7 @@
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
+ all_vent_pumps += src
icon = null
initial_loc = get_area(loc)
area_uid = initial_loc.uid
@@ -324,9 +325,9 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "Now welding the vent. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
if(!welded)
user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.")
welded = 1
@@ -336,23 +337,25 @@
welded = 0
update_icon()
else
-
to_chat(user, "The welding tool needs to be on to start this task. ")
+ return 1
else
to_chat(user, "You need more welding fuel to complete this task. ")
return 1
if(istype(W, /obj/item/weapon/screwdriver))
if(!welded)
if(open)
- to_chat(user, " Now closing the vent. ")
- if(do_after(user, 20, target = src))
+ to_chat(user, "Now closing the vent. ")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 100, 1)
open = 0
user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
else
- to_chat(user, " Now opening the vent. ")
- if(do_after(user, 20, target = src))
+ to_chat(user, "Now opening the vent. ")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 100, 1)
open = 1
- user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
+ user.visible_message("[user] screwdrivers the vent open.", "You screwdriver the vent open.", "You hear a screwdriver.")
return
if(istype(W, /obj/item/weapon/paper))
if(!welded)
@@ -363,7 +366,7 @@
to_chat(user, "You can't shove that down there when it is closed")
else
to_chat(user, "The vent is welded.")
- return
+ return 1
if(istype(W, /obj/item/device/multitool))
update_multitool_menu(user)
return 1
@@ -426,6 +429,7 @@
return ..()
/obj/machinery/atmospherics/unary/vent_pump/Destroy()
+ all_vent_pumps -= src
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 5554723c945..6747b103972 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -375,9 +375,9 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "Now welding the scrubber. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
if(!welded)
user.visible_message("[user] welds the scrubber shut.", "You weld the vent scrubber.", "You hear welding.")
welded = 1
diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm
index f319e563835..05c5d18df99 100644
--- a/code/ATMOSPHERICS/pipes/pipe.dm
+++ b/code/ATMOSPHERICS/pipes/pipe.dm
@@ -21,8 +21,7 @@
/obj/machinery/atmospherics/pipe/Destroy()
releaseAirToTurf()
- qdel(air_temporary)
- air_temporary = null
+ QDEL_NULL(air_temporary)
var/turf/T = loc
for(var/obj/machinery/meter/meter in T)
diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm
index 3c2d0cd34a7..cbb3c546990 100644
--- a/code/LINDA/LINDA_system.dm
+++ b/code/LINDA/LINDA_system.dm
@@ -35,10 +35,10 @@
atom/movable/proc/CanAtmosPass()
return 1
-atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
- return (!density || !height || air_group)
+atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5)
+ return (!density || !height)
-turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
+turf/CanPass(atom/movable/mover, turf/target, height=1.5)
if(!target) return 0
if(istype(mover)) // turf/Enter(...) will perform more advanced checks
@@ -49,10 +49,10 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
return 0
for(var/obj/obstacle in src)
- if(!obstacle.CanPass(mover, target, height, air_group))
+ if(!obstacle.CanPass(mover, target, height))
return 0
for(var/obj/obstacle in target)
- if(!obstacle.CanPass(mover, src, height, air_group))
+ if(!obstacle.CanPass(mover, src, height))
return 0
return 1
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index 7004e6c55fb..28c1a7e6860 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -70,8 +70,7 @@
/turf/simulated/Destroy()
visibilityChanged()
- if(active_hotspot)
- qdel(active_hotspot)
+ QDEL_NULL(active_hotspot)
return ..()
/turf/simulated/assume_air(datum/gas_mixture/giver)
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index d2988a6474f..fe7e2b0067c 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -114,4 +114,9 @@
// Atmos pipe limits
#define MAX_OUTPUT_PRESSURE 4500 // (kPa) What pressure pumps and powered equipment max out at.
-#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at.
\ No newline at end of file
+#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at.
+
+// Atmos alarm defines
+#define ATMOS_ALARM_NONE 0
+#define ATMOS_ALARM_WARNING 1
+#define ATMOS_ALARM_DANGER 2
\ No newline at end of file
diff --git a/code/__DEFINES/callbacks.dm b/code/__DEFINES/callbacks.dm
new file mode 100644
index 00000000000..c0d8ac15ace
--- /dev/null
+++ b/code/__DEFINES/callbacks.dm
@@ -0,0 +1,2 @@
+#define CALLBACK new /datum/callback
+#define INVOKE_ASYNC ImmediateInvokeAsync
\ No newline at end of file
diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm
index ec9ad2f2128..1d87f8845c8 100644
--- a/code/__DEFINES/clothing.dm
+++ b/code/__DEFINES/clothing.dm
@@ -32,7 +32,8 @@
#define slot_r_ear 20
#define slot_wear_pda 21
#define slot_tie 22
-#define slots_amt 22
+#define slot_collar 23
+#define slots_amt 23
//Cant seem to find a mob bitflags area other than the powers one
@@ -70,6 +71,13 @@
#define THERMAL_PROTECTION_HAND_LEFT 0.025
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
+//flags for covering body parts
+#define GLASSESCOVERSEYES 1
+#define MASKCOVERSEYES 2 // get rid of some of the other retardation in these flags
+#define HEADCOVERSEYES 4 // feel free to realloc these numbers for other purposes
+#define MASKCOVERSMOUTH 8 // on other items, these are just for mask/head
+#define HEADCOVERSMOUTH 16
+
// Suit sensor levels
#define SUIT_SENSOR_OFF 0
#define SUIT_SENSOR_BINARY 1
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 39074c65664..499be494056 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -24,6 +24,7 @@
#define FIRELOSS 2
#define TOXLOSS 4
#define OXYLOSS 8
+#define SHAME 16
//Bitflags defining which status effects could be or are inflicted on a mob
#define CANSTUN 1
@@ -69,3 +70,6 @@
#define WEAPON_LIGHT 0
#define WEAPON_MEDIUM 1
#define WEAPON_HEAVY 2
+
+// Embedded objects
+#define EMBED_THROWSPEED_THRESHOLD 15
\ No newline at end of file
diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
new file mode 100644
index 00000000000..cb67ee38b7e
--- /dev/null
+++ b/code/__DEFINES/construction.dm
@@ -0,0 +1,23 @@
+/*ALL DEFINES RELATED TO CONSTRUCTION, CONSTRUCTING THINGS, OR CONSTRUCTED OBJECTS GO HERE*/
+
+//Defines for construction states
+
+//girder construction states
+#define GIRDER_NORMAL 0
+#define GIRDER_REINF_STRUTS 1
+#define GIRDER_REINF 2
+#define GIRDER_DISPLACED 3
+#define GIRDER_DISASSEMBLED 4
+
+//rwall construction states
+#define RWALL_INTACT 0
+#define RWALL_SUPPORT_LINES 1
+#define RWALL_COVER 2
+#define RWALL_CUT_COVER 3
+#define RWALL_BOLTS 4
+#define RWALL_SUPPORT_RODS 5
+#define RWALL_SHEATH 6
+
+//plastic flaps construction states
+#define PLASTIC_FLAPS_NORMAL 0
+#define PLASTIC_FLAPS_DETACHED 1
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index aaf98516fa8..05133d226f1 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -8,24 +8,19 @@
#define ABSTRACT 64 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
#define ON_BORDER 128 // item has priority to check when entering or leaving
-#define GLASSESCOVERSEYES 1024
-#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags
-#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes
-#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head
-#define HEADCOVERSMOUTH 2048
-
-#define HEADBANGPROTECT 4096
#define EARBANGPROTECT 1024
#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc
+#define HEADBANGPROTECT 4096
+
#define OPENCONTAINER 4096 // is an open container for chemistry purposes
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
-
-#define NOREACT 16384 //Reagents dont' react inside this container.
+//Reagent flags
+#define REAGENT_NOREACT 1
//Species flags.
@@ -39,11 +34,10 @@
#define IS_PLANT 128
#define CAN_BE_FAT 256
#define NO_INTORGANS 512
-#define NO_POISON 1024
-#define RADIMMUNE 2048
-#define ALL_RPARTS 4096
-#define NOGUNS 8192
-#define NOTRANSSTING 16384
+#define RADIMMUNE 1024
+#define ALL_RPARTS 2048
+#define NOGUNS 4096
+#define NOTRANSSTING 8192
//Species clothing flags
#define HAS_UNDERWEAR 1
@@ -83,11 +77,12 @@
#define SAFE 16
//flags for pass_flags
-#define PASSTABLE 1
-#define PASSGLASS 2
-#define PASSGRILLE 4
-#define PASSBLOB 8
-#define PASSMOB 16
+#define PASSTABLE 1
+#define PASSGLASS 2
+#define PASSGRILLE 4
+#define PASSBLOB 8
+#define PASSMOB 16
+#define LETPASSTHROW 32
//turf-only flags
#define NOJAUNT 1
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 11393957fc1..8e7be007d12 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -12,6 +12,7 @@
#define DISABILITY_FLAG_DEAF 8
#define DISABILITY_FLAG_BLIND 16
#define DISABILITY_FLAG_MUTE 32
+#define DISABILITY_FLAG_COLOURBLIND 64
///////////////////////////////////////
// MUTATIONS
@@ -84,8 +85,9 @@
#define TOURETTES 8
#define NERVOUS 16
#define BLIND 32
-#define MUTE 64
-#define DEAF 128
+#define COLOURBLIND 64
+#define MUTE 128
+#define DEAF 256
//Nutrition levels for humans. No idea where else to put it
#define NUTRITION_LEVEL_FAT 600
@@ -113,4 +115,4 @@
#define GENETIC_DAMAGE_STAGE_3 35
#define CLONER_FRESH_CLONE "fresh"
-#define CLONER_MATURE_CLONE "mature"
\ No newline at end of file
+#define CLONER_MATURE_CLONE "mature"
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 1d89eea87a1..4126fe1725f 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -7,7 +7,7 @@
#define STATUS_HUD "2" // a simple line rounding the mob's number health
#define ID_HUD "3" // the job asigned to your ID
#define WANTED_HUD "4" // wanted, released, parroled, security status
-#define IMPLOYAL_HUD "5" // loyality implant
+#define IMPMINDSHIELD_HUD "5" // mindshield implant
#define IMPCHEM_HUD "6" // chemical implant
#define IMPTRACK_HUD "7" // tracking implant
#define DIAG_STAT_HUD "8" // Silicon/Mech Status
@@ -25,6 +25,7 @@
#define PLANT_TOXIN_HUD "20"// Toxin level
#define PLANT_PEST_HUD "21"// Pest level
#define PLANT_WEED_HUD "22"// Weed level
+#define DIAG_TRACK_HUD "23"// Mech tracking beacon
//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
@@ -47,3 +48,8 @@
#define ANTAG_HUD_CHANGELING 15
#define ANTAG_HUD_VAMPIRE 16
#define ANTAG_HUD_ABDUCTOR 17 //For Fox
+
+// Notification action types
+#define NOTIFY_JUMP "jump"
+#define NOTIFY_ATTACK "attack"
+#define NOTIFY_FOLLOW "orbit"
\ No newline at end of file
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
new file mode 100644
index 00000000000..83db83c329c
--- /dev/null
+++ b/code/__DEFINES/inventory.dm
@@ -0,0 +1,7 @@
+//ITEM INVENTORY WEIGHT, FOR w_class
+#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
+#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device
+#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets
+#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits
+#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons
+#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe
\ No newline at end of file
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 8e27f9315c3..a27e3f8e96a 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -1,5 +1,27 @@
+// Atoms
#define isatom(A) istype(A, /atom)
#define ismovableatom(A) istype(A, /atom/movable)
-#define isclient(A) istype(A, /client)
-#define isradio(A) istype(A, /obj/item/device/radio)
\ No newline at end of file
+// Mobs
+#define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna)
+
+//Turfs
+#define issimulatedturf(A) istype(A, /turf/simulated)
+
+#define isspaceturf(A) istype(A, /turf/space)
+
+#define isfloorturf(A) istype(A, /turf/simulated/floor)
+
+#define isunsimulatedturf(A) istype(A, /turf/unsimulated)
+
+#define iswallturf(A) istype(A, /turf/simulated/wall)
+
+#define isreinforcedwallturf(A) istype(A, /turf/simulated/wall/r_wall)
+
+#define ismineralturf(A) istype(A, /turf/simulated/mineral)
+
+// Misc
+#define isclient(A) istype(A, /client)
+#define isradio(A) istype(A, /obj/item/device/radio)
+#define ispill(A) istype(A, /obj/item/weapon/reagent_containers/food/pill)
+
diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm
index b1781de3314..2af0fd6ade8 100644
--- a/code/__DEFINES/language.dm
+++ b/code/__DEFINES/language.dm
@@ -17,4 +17,10 @@
#define NONGLOBAL 32 // Do not add to general languages list
#define INNATE 64 // All mobs can be assumed to speak and understand this language (audible emotes)
#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
-#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
\ No newline at end of file
+#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
+
+//Auto-accent level defines.
+#define AUTOHISS_OFF 0
+#define AUTOHISS_BASIC 1
+#define AUTOHISS_FULL 2
+#define AUTOHISS_NUM 3 //Number of auto-accent options.
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
new file mode 100644
index 00000000000..08a267322db
--- /dev/null
+++ b/code/__DEFINES/layers.dm
@@ -0,0 +1,63 @@
+//Defines for atom layers and planes
+//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE
+
+#define CLICKCATCHER_PLANE -99
+
+#define PLANE_SPACE -95
+#define PLANE_SPACE_PARALLAX -90
+
+#define GAME_PLANE 0
+//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
+#define MID_TURF_LAYER 2.02
+#define HIGH_TURF_LAYER 2.03
+#define ABOVE_OPEN_TURF_LAYER 2.04
+#define CLOSED_TURF_LAYER 2.05
+#define ABOVE_NORMAL_TURF_LAYER 2.08
+#define LATTICE_LAYER 2.2
+#define DISPOSAL_PIPE_LAYER 2.3
+#define GAS_PIPE_LAYER 2.35
+#define WIRE_LAYER 2.4
+#define WIRE_TERMINAL_LAYER 2.45
+#define LOW_OBJ_LAYER 2.5
+
+#define BELOW_OPEN_DOOR_LAYER 2.6
+#define OPEN_DOOR_LAYER 2.7
+#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
+#define TABLE_LAYER 2.8
+#define BELOW_OBJ_LAYER 2.9
+#define LOW_ITEM_LAYER 2.95
+//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
+#define CLOSED_DOOR_LAYER 3.1
+#define CLOSED_FIREDOOR_LAYER 3.11
+#define ABOVE_OBJ_LAYER 3.2
+#define ABOVE_WINDOW_LAYER 3.3
+#define SIGN_LAYER 3.4
+#define NOT_HIGH_OBJ_LAYER 3.5
+#define HIGH_OBJ_LAYER 3.6
+
+#define BELOW_MOB_LAYER 3.7
+#define LYING_MOB_LAYER 3.8
+//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
+#define ABOVE_MOB_LAYER 4.1
+#define WALL_OBJ_LAYER 4.25
+#define EDGED_TURF_LAYER 4.3
+#define ON_EDGED_TURF_LAYER 4.35
+#define LARGE_MOB_LAYER 4.4
+#define ABOVE_ALL_MOB_LAYER 4.5
+
+#define SPACEVINE_LAYER 4.8
+#define SPACEVINE_MOB_LAYER 4.9
+//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
+#define RIPPLE_LAYER 5.1
+
+#define GHOST_LAYER 6
+#define AREA_LAYER 10
+#define MASSIVE_OBJ_LAYER 11
+#define POINT_LAYER 12
+
+#define LIGHTING_PLANE 15
+#define LIGHTING_LAYER 15
+
+//HUD layer defines
+#define HUD_LAYER 19
+#define HUD_PLANE 90
\ No newline at end of file
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 7fbec83455a..c18fb516f4b 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -1,10 +1,43 @@
-#define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process
-
#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square
#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
-#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
+#define LIGHTING_ICON 'icons/effects/lighting_overlay.png' // icon used for lighting shading effects
#define LIGHTING_ROUND_VALUE (1 / 128) //Value used to round lumcounts, values smaller than 1/255 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY.
+
+#define LIGHTING_SOFT_THRESHOLD 0.05 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays.
+
+// If I were you I'd leave this alone.
+#define LIGHTING_BASE_MATRIX \
+ list \
+ ( \
+ LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
+ LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
+ LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
+ LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
+ 0, 0, 0, 1 \
+ ) \
+
+// Helpers so we can (more easily) control the colour matrices.
+#define CL_MATRIX_RR 1
+#define CL_MATRIX_RG 2
+#define CL_MATRIX_RB 3
+#define CL_MATRIX_RA 4
+#define CL_MATRIX_GR 5
+#define CL_MATRIX_GG 6
+#define CL_MATRIX_GB 7
+#define CL_MATRIX_GA 8
+#define CL_MATRIX_BR 9
+#define CL_MATRIX_BG 10
+#define CL_MATRIX_BB 11
+#define CL_MATRIX_BA 12
+#define CL_MATRIX_AR 13
+#define CL_MATRIX_AG 14
+#define CL_MATRIX_AB 15
+#define CL_MATRIX_AA 16
+#define CL_MATRIX_CR 17
+#define CL_MATRIX_CG 18
+#define CL_MATRIX_CB 19
+#define CL_MATRIX_CA 20
\ No newline at end of file
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 3153c180817..b46427979fb 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -17,12 +17,13 @@
#define MINERAL_MATERIAL_AMOUNT 2000 //The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
-#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
-#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
-#define AUTOLATHE 4 //Uses glass/metal only.
-#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
-#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
-#define PODFAB 32 //Used by the spacepod part fabricator. Same idea as the mechfab
+#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
+#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
+#define AUTOLATHE 4 //Uses glass/metal only.
+#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
+#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
+#define PODFAB 32 //Used by the spacepod part fabricator. Same idea as the mechfab
+#define BIOGENERATOR 64 //Uses biomass
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
#define HYDRO_SPEED_MULTIPLIER 1
@@ -30,4 +31,50 @@
// multitool_topic() shit
#define MT_ERROR -1
#define MT_UPDATE 1
-#define MT_REINIT 2
\ No newline at end of file
+#define MT_REINIT 2
+
+//Modular computer/NTNet defines
+
+//Modular computer part defines
+#define MC_CPU "CPU"
+#define MC_HDD "HDD"
+#define MC_SDD "SDD"
+#define MC_CARD "CARD"
+#define MC_NET "NET"
+#define MC_PRINT "PRINT"
+#define MC_CELL "CELL"
+#define MC_CHARGE "CHARGE"
+#define MC_AI "AI"
+
+//NTNet stuff, for modular computers
+ // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)
+#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet
+#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices
+#define NTNET_COMMUNICATION 3 // Communication (messaging)
+#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc.
+
+//NTNet transfer speeds, used when downloading/uploading a file/program.
+#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal
+#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal
+#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection
+
+//Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it.
+#define MAX_NTNET_LOGS 300
+#define MIN_NTNET_LOGS 10
+
+//Program bitflags
+#define PROGRAM_ALL 7
+#define PROGRAM_CONSOLE 1
+#define PROGRAM_LAPTOP 2
+#define PROGRAM_TABLET 4
+//Program states
+#define PROGRAM_STATE_KILLED 0
+#define PROGRAM_STATE_BACKGROUND 1
+#define PROGRAM_STATE_ACTIVE 2
+
+// Demotion Console (card/minor/*) departments
+#define TARGET_DEPT_GENERIC 1
+#define TARGET_DEPT_SEC 2
+#define TARGET_DEPT_MED 3
+#define TARGET_DEPT_SCI 4
+#define TARGET_DEPT_ENG 5
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 5e9815b7758..99079fd81bb 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -17,6 +17,8 @@
#define CLICK_CD_TKSTRANGLE 10
#define CLICK_CD_POINT 10
#define CLICK_CD_RESIST 20
+#define CLICK_CD_CLICK_ABILITY 6
+#define CLICK_CD_RAPID 2
//Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0
@@ -56,6 +58,16 @@
#define COLOR_WHITE "#FFFFFF"
#define COLOR_GRAY "#808080"
+//FONTS:
+// Used by Paper and PhotoCopier (and PaperBin once a year).
+// Used by PDA's Notekeeper.
+// Used by NewsCaster and NewsPaper.
+// Used by Modular Computers
+#define PEN_FONT "Verdana"
+#define CRAYON_FONT "Comic Sans MS"
+#define PRINTER_FONT "Times New Roman"
+#define SIGNFONT "Times New Roman"
+
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
@@ -160,6 +172,7 @@
#define MAT_PLASMA "$plasma"
#define MAT_BANANIUM "$bananium"
#define MAT_TRANQUILLITE "$tranquillite"
+#define MAT_BIOMASS "$biomass"
#define MAX_STACK_SIZE 50
@@ -250,16 +263,19 @@
#define MAP_MAXZ 6
//Matricies
-#define MATRIX_DEFAULT list(1, 0, 0, 0,\
- 0, 1, 0, 0,\
- 0, 0, 1, 0,\
- 0, 0, 0, 1)
+#define MATRIX_GREYSCALE list(0.33, 0.33, 0.33,\
+ 0.33, 0.33, 0.33,\
+ 0.33, 0.33, 0.33)
+
+#define MATRIX_VULP_CBLIND list(0.5,0.4,0.1,\
+ 0.5,0.4,0.1,\
+ 0.0,0.2,0.8)
+
+#define MATRIX_TAJ_CBLIND list(0.4,0.2,0.4,\
+ 0.4,0.6,0.0,\
+ 0.2,0.2,0.6)
+
-#define MATRIX_GREYSCALE list(0.33, 0.33, 0.33, 0,\
- 0.33, 0.33, 0.33, 0,\
- 0.33, 0.33, 0.33, 0,\
- 0.00, 0.00, 0.00, 1,\
- 0.00, 0.00, 0.00, 0)
//Gun trigger guards
#define TRIGGER_GUARD_ALLOW_ALL -1
#define TRIGGER_GUARD_NONE 0
@@ -285,7 +301,6 @@
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
-
// Bluespace shelter deploy checks
#define SHELTER_DEPLOY_ALLOWED "allowed"
#define SHELTER_DEPLOY_BAD_TURFS "bad turfs"
@@ -299,3 +314,22 @@
// The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps
#define OOC_COOLDOWN 5
+
+// Medal names
+#define BOSS_KILL_MEDAL "Killer"
+#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type
+
+// Score names
+#define LEGION_SCORE "Legion Killed"
+#define COLOSSUS_SCORE "Colossus Killed"
+#define BUBBLEGUM_SCORE "Bubblegum Killed"
+#define DRAKE_SCORE "Drakes Killed"
+#define BIRD_SCORE "Hierophants Killed"
+#define BOSS_SCORE "Bosses Killed"
+#define TENDRIL_CLEAR_SCORE "Tendrils Killed"
+
+// The number of station goals generated each round.
+#define STATION_GOAL_BUDGET 1
+
+#define FIRST_DIAG_STEP 1
+#define SECOND_DIAG_STEP 2
\ No newline at end of file
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 7ab8a19f86d..c2295b9c5dc 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -47,13 +47,15 @@
#define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone.
#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien.
-#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up
+#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up
//Mob attribute defaults.
#define DEFAULT_MARKING_STYLES list("head" = "None", "body" = "None", "tail" = "None") //Marking styles. Use instead of initial() for m_styles.
#define DEFAULT_MARKING_COLOURS list("head" = "#000000", "body" = "#000000", "tail" = "#000000") //Marking colours. Use instead of initial() for m_colours.
+#define OXYCONCEN_PLASMEN_IGNITION 0.5 //Moles of oxygen in the air needed to light up a poorly clothed Plasmaman. Same as LINDA requirements for plasma burning.
+
////////REAGENT STUFF////////
// How many units of reagent are consumed per tick, by default.
#define REAGENTS_METABOLISM 0.4
@@ -122,6 +124,9 @@
#define islarva(A) (istype((A), /mob/living/carbon/alien/larva))
#define isslime(A) (istype((A), /mob/living/carbon/slime))
+//Human sub-species
+#define isabductor(A) (is_species(A, "Abductor"))
+
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
#define ismouse(A) (istype((A), /mob/living/simple_animal/mouse))
@@ -129,11 +134,21 @@
#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer))
#define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian))
+
+
#define issilicon(A) (istype((A), /mob/living/silicon))
#define isAI(A) (istype((A), /mob/living/silicon/ai))
#define isrobot(A) (istype((A), /mob/living/silicon/robot))
#define ispAI(A) (istype((A), /mob/living/silicon/pai))
+// For the tcomms monitor
+#define ispathhuman(A) (ispath(A, /mob/living/carbon/human))
+#define ispathbrain(A) (ispath(A, /mob/living/carbon/brain))
+#define ispathslime(A) (ispath(A, /mob/living/carbon/slime))
+#define ispathbot(A) (ispath(A, /mob/living/simple_animal/bot))
+#define ispathsilicon(A) (ispath(A, /mob/living/silicon))
+#define ispathanimal(A) (ispath(A, /mob/living/simple_animal))
+
#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer))
#define isAIEye(A) (istype((A), /mob/camera/aiEye))
diff --git a/code/__DEFINES/process_scheduler.dm b/code/__DEFINES/process_scheduler.dm
index 5cdb99fc4bd..d3dbf1e085c 100644
--- a/code/__DEFINES/process_scheduler.dm
+++ b/code/__DEFINES/process_scheduler.dm
@@ -18,4 +18,17 @@
#define SCHECK if(world.tick_usage >= next_sleep_usage) defer()
//Timing Controller
-#define GLOBAL_PROC "some_magic_bullshit"
\ No newline at end of file
+#define GLOBAL_PROC "some_magic_bullshit"
+
+#define DECLARE_GLOBAL_CONTROLLER(PROCESS,VARNAME) \
+/datum/controller/process/##PROCESS/assertGlobality(){\
+ if(##VARNAME){\
+ message_admins("Controller '[name]' tried to become global but found another controller there already. Deleting the old controller.");\
+ qdel(##VARNAME);}\
+ ##VARNAME = src;}\
+\
+/datum/controller/process/##PROCESS/releaseGlobality(){\
+ if(##VARNAME == src)\
+ ##VARNAME = null;\
+ else\
+ message_admins("Controller '[name]' asked to release global control in spite of not having it!");}\
diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm
index b623ce72158..492918be671 100644
--- a/code/__DEFINES/qdel.dm
+++ b/code/__DEFINES/qdel.dm
@@ -4,8 +4,7 @@
#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory.
#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
-#define QDEL_HINT_PUTINPOOL 5 //qdel will put this object in the atom pool.
-#define QDEL_HINT_FINDREFERENCE 6 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
+#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
//if TESTING is enabled, qdel will call this object's find_references() verb.
// A convenient wrapper around checking for qdeletion/non-existence
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
new file mode 100644
index 00000000000..3e81a67b1b2
--- /dev/null
+++ b/code/__DEFINES/reagents.dm
@@ -0,0 +1,3 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
\ No newline at end of file
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 667c7152e85..1b848686bc3 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -8,6 +8,7 @@
//then you MUST update the database!
// If you're adding a new role, remember to update modules/admin/topic.dm, so admins can dish out
// justice if someone's abusing your role
+#define ROLE_SYNDICATE "Syndicate"
#define ROLE_TRAITOR "traitor"
#define ROLE_OPERATIVE "operative"
#define ROLE_CHANGELING "changeling"
@@ -37,7 +38,7 @@
#define ROLE_MORPH "morph"
#define ROLE_ERT "emergency response team"
#define ROLE_NYMPH "Dionaea"
-#define ROLE_GSPIDER "giant spider"
+#define ROLE_GSPIDER "giant spider"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index 06f91eb168a..b38018c0382 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -52,7 +52,9 @@
#define SHUTTLE_ALREADY_DOCKED "we_are_already_docked"
#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked"
-
+// Ripples, effects that signal a shuttle's arrival
+#define SHUTTLE_RIPPLE_TIME 100
+#define SHUTTLE_RIPPLE_FADEIN 50
/*
Logic
diff --git a/code/__HELPERS/AnimationLibrary.dm b/code/__HELPERS/AnimationLibrary.dm
index fcabe2e0a78..fd79fe197f2 100644
--- a/code/__HELPERS/AnimationLibrary.dm
+++ b/code/__HELPERS/AnimationLibrary.dm
@@ -7,7 +7,7 @@
/proc/animate_fade_grayscale(var/atom/A, var/time = 5)
if(!istype(A) && !istype(A, /client))
return
- A.color = MATRIX_DEFAULT
+ A.color = null
animate(A, color = MATRIX_GREYSCALE, time = time, easing = SINE_EASING)
/proc/animate_melt_pixel(var/atom/A)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 69ea87f8fda..2d2acdbbba5 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -151,7 +151,7 @@
// The old system would loop through lists for a total of 5000 per function call, in an empty server.
// This new system will loop at around 1000 in an empty server.
-/proc/get_mobs_in_view(var/R, var/atom/source)
+/proc/get_mobs_in_view(var/R, var/atom/source, var/include_clientless = FALSE)
// Returns a list of mobs in range of R from source. Used in radio and say code.
var/turf/T = get_turf(source)
@@ -165,7 +165,7 @@
for(var/atom/A in range)
if(ismob(A))
var/mob/M = A
- if(M.client)
+ if(M.client || include_clientless)
hear += M
//log_to_dd("Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])")
else if(istype(A, /obj/item/device/radio))
@@ -412,13 +412,30 @@
return 0
return 1
+
+/proc/GetRedPart(const/hexa)
+ return hex2num(copytext(hexa, 2, 4))
+
+/proc/GetGreenPart(const/hexa)
+ return hex2num(copytext(hexa, 4, 6))
+
+/proc/GetBluePart(const/hexa)
+ return hex2num(copytext(hexa, 6, 8))
+
+/proc/GetHexColors(const/hexa)
+ return list(
+ GetRedPart(hexa),
+ GetGreenPart(hexa),
+ GetBluePart(hexa),
+ )
+
/proc/MinutesToTicks(var/minutes as num)
return minutes * 60 * 10
/proc/SecondsToTicks(var/seconds)
return seconds * 10
-proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, var/poll_time = 300, var/ignore_respawnability = 0, var/min_hours = 0)
+proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE)
var/roletext = be_special_type ? get_roletext(be_special_type) : null
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
@@ -437,15 +454,16 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
if(roletext)
if(jobban_isbanned(G, roletext) || jobban_isbanned(G, "Syndicate"))
continue
- if(min_hours)
+ if(config.use_exp_restrictions && min_hours)
if(G.client.get_exp_living_num() < min_hours * 60)
continue
if(G.has_enabled_antagHUD)
continue
spawn(0)
G << 'sound/misc/notice2.ogg'//Alerting them to their consideration
-
- switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Not This Round"))
+ if(flashwindow)
+ window_flash(G.client)
+ switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","No","Yes","Not This Round"))
if("Yes")
to_chat(G, "Choice registered: Yes. ")
if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed.
@@ -471,3 +489,12 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
candidates.Remove(G)
return candidates
+
+/proc/window_flash(client/C)
+ if(ismob(C))
+ var/mob/M = C
+ if(M.client)
+ C = M.client
+ if(!C || !C.prefs.windowflashing)
+ return
+ winset(C, "mainwindow", "flash=5")
\ No newline at end of file
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 5d5307cd50d..cfe37505e1c 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -884,3 +884,9 @@ proc/sort_atoms_by_layer(var/list/atoms)
icon = J
return J
return 0
+
+//Hook, override to run code on- wait this is images
+//Images have dir without being an atom, so they get their own definition.
+//Lame.
+/image/proc/setDir(newdir)
+ dir = newdir
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index f54726c4161..0196f326792 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -72,6 +72,14 @@
return 0
return L[A.type]
+//returns a new list with only atoms that are in typecache L
+/proc/typecache_filter_list(list/atoms, list/typecache)
+ . = list()
+ for (var/thing in atoms)
+ var/atom/A = thing
+ if(typecache[A.type])
+ . += A
+
//Like typesof() or subtypesof(), but returns a typecache instead of a list
/proc/typecacheof(path, ignore_root_path)
if(ispath(path))
@@ -617,3 +625,18 @@ proc/dd_sortedObjectList(list/incoming)
/datum/alarm/dd_SortValue()
return "[sanitize(last_name)]"
+
+//Picks from the list, with some safeties, and returns the "default" arg if it fails
+#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default)
+
+#define LAZYINITLIST(L) if (!L) L = list()
+
+#define UNSETEMPTY(L) if (L && !L.len) L = null
+#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
+#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
+#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
+#define LAZYLEN(L) length(L)
+#define LAZYCLEARLIST(L) if(L) L.Cut()
+
+// LAZYING PT 2: THE LAZENING
+#define LAZYREINITLIST(L) LAZYCLEARLIST(L); LAZYINITLIST(L);
diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm
index 3dd0f9235bd..de827703443 100644
--- a/code/__HELPERS/logging.dm
+++ b/code/__HELPERS/logging.dm
@@ -78,6 +78,10 @@
if(config.log_pda)
diary << "\[[time_stamp()]]PDA: [text][log_end]"
+/proc/log_chat(text)
+ if (config.log_pda)
+ diary << "\[[time_stamp()]]CHAT: [text]"
+
/proc/log_misc(text)
diary << "\[[time_stamp()]]MISC: [text][log_end]"
@@ -98,7 +102,7 @@
/proc/log_after_setup(var/message)
if(ticker && ticker.current_state > GAME_STATE_SETTING_UP)
to_chat(world, "[message] ")
- log_to_dd(message)
+ log_to_dd(message)
// Helper procs for building detailed log lines
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
index 986cbac0bd3..aa73b686b9d 100644
--- a/code/__HELPERS/maths.dm
+++ b/code/__HELPERS/maths.dm
@@ -56,6 +56,16 @@ var/const/Sqrt2 = 1.41421356
var/t = Floor((val - min) / d)
return val - (t * d)
+//A logarithm that converts an integer to a number scaled between 0 and 1 (can be tweaked to be higher).
+//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
+/proc/TransformUsingVariable(input, inputmaximum, scaling_modifier = 0)
+
+ var/inputToDegrees = (input/inputmaximum)*180 //Converting from a 0 -> 100 scale to a 0 -> 180 scale. The 0 -> 180 scale corresponds to degrees
+ var/size_factor = ((-cos(inputToDegrees) +1) /2) //returns a value from 0 to 1
+
+ return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5
+ //world<< "Transform multiplier of [src] is [size_factor + scaling_modifer]"
+
/proc/RaiseToPower(num, power)
if(!power) return 1
return (power-- > 1 ? num * RaiseToPower(num, power) : num)
@@ -100,3 +110,9 @@ var/gaussian_next
if(new_val < bound_lower)
new_val = min(orig_val, bound_lower)
return new_val
+
+// sqrt, but if you give it a negative number, you get 0 instead of a runtime
+/proc/sqrtor0(num)
+ if(num < 0)
+ return 0
+ return sqrt(num)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index f59774142bd..0abf2ac1af3 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -250,13 +250,13 @@ Proc for attack log creation, because really why not
*/
proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=null, var/admin=1, var/print_attack_log = 1)//print_attack_log notifies admins with attack logs on
- var/list/ignore=list("shaked", "CPRed", "grabbed", "punched", "disarmed")
+ var/list/ignore=list("shaked", "CPRed", "grabbed", "disarmed")
if(!user)
return
if(ismob(user))
- user.attack_log += text("\[[time_stamp()]\] Has [what_done] [key_name(target)][object ? " with [object]" : " "][addition] ")
+ user.create_attack_log("Has [what_done] [key_name(target)][object ? " with [object]" : " "][addition] ")
if(ismob(target))
- target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [key_name(user)][object ? " with [object]" : " "][addition] ")
+ target.create_attack_log("Has been [what_done] by [key_name(user)][object ? " with [object]" : " "][addition] ")
if(admin)
log_attack("[key_name(user)] [what_done] [key_name(target)][object ? " with [object]" : " "][addition] ")
if(istype(target) && (target.key))
@@ -363,6 +363,13 @@ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=nul
if(progress)
qdel(progbar)
+/proc/is_species(A, species_name)
+ . = FALSE
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.get_species() == species_name)
+ . = TRUE
+
/proc/admin_mob_info(mob/M, mob/user = usr)
if(!ismob(M))
to_chat(user, "This can only be used on instances of type /mob")
@@ -433,3 +440,27 @@ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=nul
break
if(!.)
to_chat(user, "No mob located in [A]. ")
+
+// Suppress the mouse macros
+/client/var/next_mouse_macro_warning
+/mob/proc/LogMouseMacro(verbused, params)
+ if(!client)
+ return
+ if(!client.next_mouse_macro_warning) // Log once
+ log_admin("[key_name(usr)] attempted to use a mouse macro: [verbused] [params]")
+ message_admins("[key_name_admin(usr)] attempted to use a mouse macro: [verbused] [html_encode(params)]")
+ if(client.next_mouse_macro_warning < world.time) // Warn occasionally
+ usr << 'sound/misc/sadtrombone.ogg'
+ client.next_mouse_macro_warning = world.time + 600
+/mob/verb/ClickSubstitute(params as command_text)
+ set hidden = 1
+ set name = ".click"
+ LogMouseMacro(".click", params)
+/mob/verb/DblClickSubstitute(params as command_text)
+ set hidden = 1
+ set name = ".dblclick"
+ LogMouseMacro(".dblclick", params)
+/mob/verb/MouseSubstitute(params as command_text)
+ set hidden = 1
+ set name = ".mouse"
+ LogMouseMacro(".mouse", params)
diff --git a/code/__HELPERS/qdel.dm b/code/__HELPERS/qdel.dm
new file mode 100644
index 00000000000..8171dd66427
--- /dev/null
+++ b/code/__HELPERS/qdel.dm
@@ -0,0 +1,5 @@
+#define QDEL_IN(item, time) addtimer(GLOBAL_PROC, "qdel", time, FALSE, item)
+#define QDEL_NULL(item) if(item) { qdel(item); item = null }
+#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
+#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
+#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index d5b75eb4c7c..89755d7acf0 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -64,6 +64,14 @@
/proc/strip_html(var/t,var/limit=MAX_MESSAGE_LEN)
return copytext((sanitize(strip_html_simple(t))),1,limit)
+// Used to get a properly sanitized multiline input, of max_length
+/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE)
+ var/name = input(user, message, title, default) as message|null
+ if(no_trim)
+ return copytext(html_encode(name), 1, max_length)
+ else
+ return trim(html_encode(name), max_length)
+
//Runs byond's sanitization proc along-side strip_html_simple
//I believe strip_html_simple() is required to run first to prevent '<' from displaying as '<' that html_encode() would cause
/proc/adminscrub(var/t,var/limit=MAX_MESSAGE_LEN)
@@ -378,18 +386,10 @@ proc/checkhtml(var/t)
return sanitize(replace_characters(input, list(">"=" ","<"=" ", "\""="'")), max_length, encode, trim, extra)
-//Replaces \red \blue \green \b etc with span classes for to_chat
+//Replace BYOND text macros with span classes for to_chat
/proc/replace_text_macro(match, code, rest)
- var/regex/text_macro = new("(\\xFF.)(.*)$")
- switch(code)
- if("\red")
- return "[text_macro.Replace(rest, /proc/replace_text_macro)] "
- if("\blue", "\green")
- return "[text_macro.Replace(rest, /proc/replace_text_macro)] "
- if("\b")
- return "[text_macro.Replace(rest, /proc/replace_text_macro)] "
- else
- return text_macro.Replace(rest, /proc/replace_text_macro)
+ var/regex/text_macro = new("(\\xFF.)(.*)$")
+ return text_macro.Replace(rest, /proc/replace_text_macro)
/proc/macro2html(text)
var/static/regex/text_macro = new("(\\xFF.)(.*)$")
@@ -431,3 +431,114 @@ proc/checkhtml(var/t)
text = copytext(text, 1, index) + repl_chars[char] + copytext(text, index+keylength)
index = findtext(text, char)
return text
+
+//Checks if any of a given list of needles is in the haystack
+/proc/text_in_list(haystack, list/needle_list, start=1, end=0)
+ for(var/needle in needle_list)
+ if(findtext(haystack, needle, start, end))
+ return 1
+ return 0
+
+//Like above, but case sensitive
+/proc/text_in_list_case(haystack, list/needle_list, start=1, end=0)
+ for(var/needle in needle_list)
+ if(findtextEx(haystack, needle, start, end))
+ return 1
+ return 0
+
+
+// Pencode
+/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT)
+ text = replacetext(text, "\n", " ")
+ text = replacetext(text, "\[center\]", "")
+ text = replacetext(text, "\[/center\]", " ")
+ text = replacetext(text, "\[br\]", " ")
+ text = replacetext(text, "\[b\]", "")
+ text = replacetext(text, "\[/b\]", " ")
+ text = replacetext(text, "\[i\]", "")
+ text = replacetext(text, "\[/i\]", " ")
+ text = replacetext(text, "\[u\]", "")
+ text = replacetext(text, "\[/u\]", " ")
+ text = replacetext(text, "\[large\]", "")
+ text = replacetext(text, "\[/large\]", " ")
+ if(sign)
+ text = replacetext(text, "\[sign\]", "[user ? user.real_name : "Anonymous"] ")
+ if(fields)
+ text = replacetext(text, "\[field\]", " ")
+
+ text = replacetext(text, "\[h1\]", "")
+ text = replacetext(text, "\[/h1\]", " ")
+ text = replacetext(text, "\[h2\]", "")
+ text = replacetext(text, "\[/h2\]", " ")
+ text = replacetext(text, "\[h3\]", "")
+ text = replacetext(text, "\[/h3\]", " ")
+
+ if(istype(P, /obj/item/toy/crayon)) // If it is a crayon, and he still tries to use these, make them empty!
+ text = replacetext(text, "\[*\]", "")
+ text = replacetext(text, "\[hr\]", "")
+ text = replacetext(text, "\[small\]", "")
+ text = replacetext(text, "\[/small\]", "")
+ text = replacetext(text, "\[list\]", "")
+ text = replacetext(text, "\[/list\]", "")
+ text = replacetext(text, "\[table\]", "")
+ text = replacetext(text, "\[/table\]", "")
+ text = replacetext(text, "\[row\]", "")
+ text = replacetext(text, "\[cell\]", "")
+ text = replacetext(text, "\[logo\]", "")
+
+ text = "[text] "
+ else // They are using "not a crayon" - formatting is OK and such
+ text = replacetext(text, "\[*\]", "")
+ text = replacetext(text, "\[hr\]", " ")
+ text = replacetext(text, "\[small\]", "")
+ text = replacetext(text, "\[/small\]", " ")
+ text = replacetext(text, "\[list\]", "")
+ text = replacetext(text, "\[/list\]", " ")
+ text = replacetext(text, "\[table\]", "")
+ text = replacetext(text, "\[/table\]", "
")
+ text = replacetext(text, "\[grid\]", "")
+ text = replacetext(text, "\[/grid\]", "
")
+ text = replacetext(text, "\[row\]", "")
+ text = replacetext(text, "\[cell\]", "")
+ text = replacetext(text, "\[logo\]", " ")
+
+ text = "[text] "
+
+ text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN)
+ return text
+
+/proc/html_to_pencode(text)
+ text = replacetext(text, " ", "\n")
+ text = replacetext(text, "", "\[center\]")
+ text = replacetext(text, " ", "\[/center\]")
+ text = replacetext(text, " ", "\[br\]")
+ text = replacetext(text, "", "\[b\]")
+ text = replacetext(text, " ", "\[/b\]")
+ text = replacetext(text, "", "\[i\]")
+ text = replacetext(text, " ", "\[/i\]")
+ text = replacetext(text, "", "\[u\]")
+ text = replacetext(text, " ", "\[/u\]")
+ text = replacetext(text, "", "\[large\]")
+ text = replacetext(text, " ", "\[field\]")
+
+ text = replacetext(text, "", "\[h1\]")
+ text = replacetext(text, " ", "\[/h1\]")
+ text = replacetext(text, "", "\[h2\]")
+ text = replacetext(text, " ", "\[/h2\]")
+ text = replacetext(text, "", "\[h3\]")
+ text = replacetext(text, " ", "\[/h3\]")
+
+ text = replacetext(text, "", "\[*\]")
+ text = replacetext(text, " ", "\[hr\]")
+ text = replacetext(text, "", "\[small\]")
+ text = replacetext(text, "", "\[list\]")
+ text = replacetext(text, " ", "\[/list\]")
+ text = replacetext(text, "", "\[table\]")
+ text = replacetext(text, "
", "\[/table\]")
+ text = replacetext(text, "", "\[grid\]")
+ text = replacetext(text, "
", "\[/grid\]")
+ text = replacetext(text, " ", "\[row\]")
+ text = replacetext(text, "", "\[cell\]")
+ text = replacetext(text, " ", "\[logo\]")
+ return text
+
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a2af5d5f4c6..82b2ea8b419 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1,4 +1,3 @@
-
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/*
@@ -326,7 +325,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/mob/M = old_list[named]
if(issilicon(M))
AI_list |= M
- else if(isobserver(M) || M.stat == 2)
+ else if(isobserver(M) || M.stat == DEAD)
Dead_list |= M
else if(M.key && M.client)
keyclient_list |= M
@@ -360,7 +359,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
namecounts[name] = 1
if(M.real_name && M.real_name != M.name)
name += " \[[M.real_name]\]"
- if(M.stat == 2)
+ if(M.stat == DEAD)
if(istype(M, /mob/dead/observer/))
name += " \[ghost\]"
else
@@ -550,15 +549,21 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
var/turf/current = get_turf(source)
var/turf/target_turf = get_turf(target)
- var/steps = 0
+ var/steps = 1
- while(current != target_turf)
- if(steps > length) return 0
- if(current.opacity) return 0
- for(var/atom/A in current)
- if(A.opacity) return 0
+ if(current != target_turf)
current = get_step_towards(current, target_turf)
- steps++
+ while(current != target_turf)
+ if(steps > length)
+ return 0
+ if(current.opacity)
+ return 0
+ for(var/thing in current)
+ var/atom/A = thing
+ if(A.opacity)
+ return 0
+ current = get_step_towards(current, target_turf)
+ steps++
return 1
@@ -1342,19 +1347,19 @@ Standard way to write links -Sayu
/proc/get_location_accessible(mob/M, location)
var/covered_locations = 0 //based on body_parts_covered
var/face_covered = 0 //based on flags_inv
- var/eyesmouth_covered = 0 //based on flags
+ var/eyesmouth_covered = 0 //based on flags_cover
if(iscarbon(M))
var/mob/living/carbon/C = M
for(var/obj/item/clothing/I in list(C.back, C.wear_mask))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
- eyesmouth_covered |= I.flags
+ eyesmouth_covered |= I.flags_cover
if(ishuman(C))
var/mob/living/carbon/human/H = C
for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.r_ear, H.l_ear))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
- eyesmouth_covered |= I.flags
+ eyesmouth_covered |= I.flags_cover
switch(location)
if("head")
@@ -1558,7 +1563,7 @@ var/mob/dview/dview_mob = new
//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts
//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts)
-/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE)
+/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE, forceMove = FALSE)
if(!istype(A))
return
@@ -1590,7 +1595,10 @@ var/mob/dview/dview_mob = new
var/targetloc = get_turf(A)
if(!lockinorbit && loc != lastloc && loc != targetloc)
break
- loc = targetloc
+ if(forceMove)
+ forceMove(targetloc)
+ else
+ loc = targetloc
lastloc = loc
sleep(0.6)
@@ -1812,6 +1820,70 @@ var/global/list/g_fancy_list_of_types = null
//you might be thinking of adding more steps to this, or making it use a loop and a counter var
// not worth it.
+// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk).
+/proc/getpois(mobs_only=0,skip_mindless=0)
+ var/list/mobs = sortmobs()
+ var/list/names = list()
+ var/list/pois = list()
+ var/list/namecounts = list()
+
+ for(var/mob/M in mobs)
+ if(skip_mindless && (!M.mind && !M.ckey))
+ if(!isbot(M) && !istype(M, /mob/camera/))
+ continue
+ if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
+ continue
+ var/name = M.name
+ if(name in names)
+ namecounts[name]++
+ name = "[name] ([namecounts[name]])"
+ else
+ names.Add(name)
+ namecounts[name] = 1
+ if(M.real_name && M.real_name != M.name)
+ name += " \[[M.real_name]\]"
+ if(M.stat == DEAD)
+ if(istype(M, /mob/dead/observer/))
+ name += " \[ghost\]"
+ else
+ name += " \[dead\]"
+ pois[name] = M
+
+ if(!mobs_only)
+ for(var/atom/A in poi_list)
+ if(!A || !A.loc)
+ continue
+ var/name = A.name
+ if(names.Find(name))
+ namecounts[name]++
+ name = "[name] ([namecounts[name]])"
+ else
+ names.Add(name)
+ namecounts[name] = 1
+ pois[name] = A
+
+ return pois
+
+/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20)
+ var/client/C
+ if(istype(mob_or_client, /mob))
+ var/mob/M = mob_or_client
+ if(M.client)
+ C = M.client
+ else
+ return
+ else if(istype(mob_or_client, /client))
+ C = mob_or_client
+
+ if(!istype(C))
+ return
+
+ C.color = flash_color
+ spawn(0)
+ animate(C, color = initial(C.color), time = flash_time)
+
+#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255)))
+
/proc/make_bit_triplet()
var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9)
var/result = 0
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index 5b41171d557..2d9b9761523 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -19,6 +19,10 @@ var/shuttle_left = 0
var/tinted_weldhelh = 1
var/mouse_respawn_time = 5 //Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
+// Command to run if shutting down (SHUTDOWN_ON_REBOOT) instead of rebooting
+// It's defined here as a global because this is a hilariously bad thing to have on the easily-edited config datum
+var/global/shutdown_shell_command
+
// Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked.
// Debug2 is used in conjunction with a lot of admin verbs and therefore is actually legit.
var/Debug = 0 // global debug switch
@@ -36,3 +40,8 @@ var/eventchance = 10 //% per 5 mins
var/event = 0
var/hadevent = 0
var/blobevent = 0
+
+//Medals hub related variables
+var/global/medal_hub = null
+var/global/medal_pass = " "
+var/global/medals_enabled = TRUE //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls.
\ No newline at end of file
diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm
index 73b2b7304f6..116aa0797cb 100644
--- a/code/_globalvars/genetics.dm
+++ b/code/_globalvars/genetics.dm
@@ -1,5 +1,6 @@
///////////
var/BLINDBLOCK = 0
+var/COLOURBLINDBLOCK = 0
var/DEAFBLOCK = 0
var/HULKBLOCK = 0
var/TELEBLOCK = 0
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 713289c737c..4639f5d93cf 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -25,12 +25,10 @@ var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
//Alt Heads
var/global/list/alt_heads_list = list() //stores /datum/sprite_accessory/alt_heads indexed by name
- //Backpacks
-var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
var/static/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg', \
'sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg', \
-'sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
+'sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock_open.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to
// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages
@@ -46,4 +44,30 @@ var/list/TAGGERLOCATIONS = list("Disposals",
"Robotics", "HoP Office", "Library", "Chapel", "Captain's Office",
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics","Brig Physician")
-var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
\ No newline at end of file
+var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
+
+var/global/list/greek_letters = list("Alpha", "Beta", "Gamma", "Delta",
+ "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mu",
+ "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", "Phi",
+ "Chi", "Psi", "Omega")
+
+var/global/list/phonetic_alphabet = list("Alpha", "Bravo", "Charlie",
+ "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet",
+ "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec",
+ "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "X-ray",
+ "Yankee", "Zulu")
+
+var/global/list/numbers_as_words = list("One", "Two", "Three", "Four",
+ "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve",
+ "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen",
+ "Eighteen", "Nineteen")
+
+ //Backpacks
+#define GBACKPACK "Grey Backpack"
+#define GSATCHEL "Grey Satchel"
+#define GDUFFLEBAG "Grey Dufflebag"
+#define LSATCHEL "Leather Satchel"
+#define DBACKPACK "Department Backpack"
+#define DSATCHEL "Department Satchel"
+#define DDUFFLEBAG "Department Dufflebag"
+var/global/list/backbaglist = list(DBACKPACK, DSATCHEL, DDUFFLEBAG, GBACKPACK, GSATCHEL, GDUFFLEBAG, LSATCHEL)
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index 4cdc0bef33d..a6b78bce94c 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -14,8 +14,19 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
"Thunderdome",
"UO45",
"UO45R",
+ "UO71",
"Xeno",
"Hotel"
)
var/list/mineral_turfs = list()
+
+var/list/ruin_landmarks = list()
+
+var/list/round_end_sounds = list( // Maps available round end sounds to their duration
+ 'sound/AI/newroundsexy.ogg' = 2.3 SECONDS,
+ 'sound/misc/apcdestroyed.ogg' = 3 SECONDS,
+ 'sound/misc/bangindonk.ogg' = 1.6 SECONDS,
+ 'sound/goonstation/misc/newround1.ogg' = 6.9 SECONDS,
+ 'sound/goonstation/misc/newround2.ogg' = 14.8 SECONDS
+ )
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 600dac2f273..e453d748428 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -12,6 +12,8 @@ var/global/list/airlocks = list() //list of all airlocks
var/global/list/singularities = list() //list of all singularities
var/global/list/janitorial_equipment = list() //list of janitorial equipment
var/global/list/crafting_recipes = list() //list of all crafting recipes
+var/global/list/prisoncomputer_list = list()
+var/global/list/cell_logs = list()
var/global/list/all_areas = list()
var/global/list/machines = list()
@@ -23,14 +25,21 @@ var/global/list/rcd_list = list() //list of Rapid Construction Devices.
var/global/list/apcs = list()
var/global/list/air_alarms = list()
var/global/list/power_monitors = list()
+var/global/list/all_vent_pumps = list()
var/global/list/navbeacons = list() //list of all bot nagivation beacons, used for patrolling.
var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons.
var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons.
var/global/list/beacons = list()
-var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none.
+var/global/list/shuttle_caller_list = list() //list of all communication consoles, comms consoles circuit and AIs, for automatic shuttle calls when there are none.
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
var/global/list/pinpointer_list = list() //list of all pinpointers. Used to change stuff they are pointing to all at once.
var/global/list/abductor_equipment = list() //list of all abductor equipment
-var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
\ No newline at end of file
+
+var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
+var/global/list/global_radios = list() //list of all radios, across all z-levels
+
+var/global/list/meteor_list = list() //list of all meteors
+var/global/list/poi_list = list() //list of points of interest for observe/follow
+
diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm
index dfecea02531..4915b91f3d0 100644
--- a/code/_globalvars/mapping.dm
+++ b/code/_globalvars/mapping.dm
@@ -40,6 +40,7 @@ var/list/prisonwarped = list() //list of players already warped
var/list/blobstart = list()
var/list/ninjastart = list()
var/list/carplist = list() //list of all carp-spawn landmarks
+var/list/avatarspawn = list()
//away missions
var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to
@@ -49,6 +50,7 @@ var/list/datum/map_template/map_templates = list()
var/list/datum/map_template/ruins_templates = list()
var/list/datum/map_template/space_ruins_templates = list()
-//var/list/datum/map_template/lava_ruins_templates = list()
+var/list/datum/map_template/lava_ruins_templates = list()
var/list/datum/map_template/shelter_templates = list()
-var/list/datum/map_template/shuttle_templates = list()
\ No newline at end of file
+var/list/datum/map_template/shuttle_templates = list()
+var/list/datum/map_template/vr_templates = list()
\ No newline at end of file
diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
index 523965b66a1..6d2578e5b88 100644
--- a/code/_globalvars/station.dm
+++ b/code/_globalvars/station.dm
@@ -1,7 +1,7 @@
-var/global/obj/effect/datacore/data_core = null
+var/global/datum/datacore/data_core = null
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
-var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
+var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
var/list/powernets = list()
var/list/deferred_powernet_rebuilds = list()
diff --git a/code/_globalvars/unused.dm b/code/_globalvars/unused.dm
index e55794c3dc9..3925ea1237e 100644
--- a/code/_globalvars/unused.dm
+++ b/code/_globalvars/unused.dm
@@ -7,7 +7,7 @@ var/datum/debug/debugobj
var/list/liftable_structures = list(\
/obj/machinery/autolathe, \
/obj/machinery/constructable_frame, \
- /obj/machinery/portable_atmospherics/hydroponics, \
+ /obj/machinery/hydroponics, \
/obj/machinery/computer, \
/obj/machinery/optable, \
/obj/structure/dispenser, \
diff --git a/code/_onclick/_defines.dm b/code/_onclick/_defines.dm
deleted file mode 100644
index a02a1f43590..00000000000
--- a/code/_onclick/_defines.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-#define CLICKCATCHER_PLANE -99
-
-#define HUD_PLANE 90
\ No newline at end of file
diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm
index 5a84463c8f1..038174388ff 100644
--- a/code/_onclick/adjacent.dm
+++ b/code/_onclick/adjacent.dm
@@ -23,7 +23,7 @@
* If you are in the same turf, always true
* If you are vertically/horizontally adjacent, ensure there are no border objects
* If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square.
- * Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays.
+ * Passing through in this case ignores anything with the LETPASSTHROW flag, such as tables, racks, and morgue trays.
*/
/turf/Adjacent(var/atom/neighbor, var/atom/target = null)
var/turf/T0 = get_turf(neighbor)
@@ -82,26 +82,18 @@
/*
This checks if you there is uninterrupted airspace between that turf and this one.
- This is defined as any dense ON_BORDER object, or any dense object without throwpass.
+ This is defined as any dense ON_BORDER object, or any dense object without LETPASSTHROW.
The border_only flag allows you to not objects (for source and destination squares)
*/
/turf/proc/ClickCross(var/target_dir, var/border_only, var/target_atom = null)
for(var/obj/O in src)
- if( !O.density || O == target_atom || O.throwpass) continue // throwpass is used for anything you can click through
+ if( !O.density || O == target_atom || (O.pass_flags & LETPASSTHROW))
+ continue // LETPASSTHROW is used for anything you can click through
- if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first
+ if( O.flags&ON_BORDER) // windows are on border, check them first
if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically
return 0
else if( !border_only ) // dense, not on border, cannot pass over
return 0
- return 1
-/*
- Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not
- a thrown object should stop after already successfully entering a square. Currently the throw code involved
- only seems to affect hitting mobs, because the checks performed against objects are already performed when
- entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively
- useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags).
-
- Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here.
-*/
\ No newline at end of file
+ return 1
\ No newline at end of file
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index f3ae2fdea48..e969751e1dd 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -33,13 +33,20 @@
if(control_disabled || stat)
return
-
+
var/turf/pixel_turf = get_turf_pixel(A)
- if(pixel_turf && !cameranet.checkTurfVis(pixel_turf))
- log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(A)])")
- message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(A)]))")
- send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(A)]))")
- return
+ var/turf_visible
+ if(pixel_turf)
+ turf_visible = cameranet.checkTurfVis(pixel_turf)
+ if(!turf_visible)
+ if(istype(loc, /obj/item/device/aicard) && (pixel_turf in view(client.view, loc)))
+ turf_visible = TRUE
+ else
+ if(pixel_turf.obscured)
+ log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
+ message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
+ send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
+ return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 66377ec3fcd..58928da83e0 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -95,9 +95,9 @@
update_inv_r_hand(0)
return
- // operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src)
+ // operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper)
var/sdepth = A.storage_depth(src)
- if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1))
+ if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 2))
// No adjacency needed
if(W)
var/resolved = A.attackby(W,src)
@@ -323,16 +323,6 @@
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(var/atom/A)
-
-/* // Snowflake for space vines. //Are you fucking kidding me?
- var/is_buckled = 0
- if(buckled)
- if(istype(buckled))
- if(!buckled.movable)
- is_buckled = 1
- else
- is_buckled = 0*/
-
if( stat || buckled || !A || !x || !y || !A.x || !A.y ) return
var/dx = A.x - x
var/dy = A.y - y
@@ -345,11 +335,7 @@
else
if(dx > 0) direction = EAST
else direction = WEST
- usr.dir = direction
-
-/* if(buckled && buckled.movable)
- buckled.dir = direction
- buckled.handle_rotation()*/
+ dir = direction
/obj/screen/click_catcher
icon = 'icons/mob/screen_full.dmi'
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 7e146a8fc4e..26fb60335c8 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -55,6 +55,8 @@
#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien
+#define ui_alien_language_menu "EAST-3:25,SOUTH+1:7"//alien
+#define ui_alienlarva_language_menu "EAST-3:26,SOUTH:5"//alien
//Lower right, persistant menu
//#define ui_dropbutton "11:22,1:5"
@@ -66,10 +68,12 @@
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
#define ui_crafting "EAST:-5,SOUTH+2:7"
+#define ui_language_menu "EAST:-22,SOUTH+2:7"
#define ui_borg_pull "EAST-2:26,SOUTH+1:7"
#define ui_borg_radio "EAST-1:28,SOUTH+1:7"
#define ui_borg_intents "EAST-2:26,SOUTH:5"
+#define ui_borg_lanugage_menu "EAST-2:26,SOUTH+1:7"
//Upper-middle right (alerts)
#define ui_alert1 "EAST-1:28,CENTER+5:27"
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 0a3ca11f315..c8864f36d8a 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -150,6 +150,10 @@
var/obj/screen/using
+ using = new /obj/screen/language_menu
+ using.screen_loc = ui_borg_lanugage_menu
+ static_inventory += using
+
//AI core
using = new /obj/screen/ai/aicore()
using.screen_loc = ui_ai_core
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index cb77112deb3..68a24f87a3e 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -3,15 +3,18 @@
//PUBLIC - call these wherever you want
-/mob/proc/throw_alert(category, type, severity, obj/new_master)
+/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE)
-/* Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already
+/*
+ Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already
category is a text string. Each mob may only have one alert per category; the previous one will be replaced
path is a type path of the actual alert type to throw
severity is an optional number that will be placed at the end of the icon_state for this alert
For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2"
new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay.
- Clicks are forwarded to master */
+ Clicks are forwarded to master
+ Override makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations.
+ */
if(!category)
return
@@ -19,6 +22,8 @@
var/obj/screen/alert/alert
if(alerts[category])
alert = alerts[category]
+ if(alert.override_alerts)
+ return 0
if(new_master && new_master != alert.master)
WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [alert.master]")
clear_alert(category)
@@ -33,7 +38,10 @@
else //no need to update
return 0
else
- alert = new type
+ alert = new type()
+ alert.override_alerts = override
+ if(override)
+ alert.timeout = null
if(new_master)
var/old_layer = new_master.layer
@@ -63,10 +71,12 @@
return alert
// Proc to clear an existing alert.
-/mob/proc/clear_alert(category)
+/mob/proc/clear_alert(category, clear_override = FALSE)
var/obj/screen/alert/alert = alerts[category]
if(!alert)
return 0
+ if(alert.override_alerts && !clear_override)
+ return 0
alerts -= category
if(client && hud_used)
@@ -83,6 +93,7 @@
var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
var/severity = 0
var/alerttooltipstyle = ""
+ var/override_alerts = FALSE //If it is overriding other alerts of the same type
/obj/screen/alert/MouseEntered(location,control,params)
@@ -198,6 +209,16 @@ The box in your backpack has an oxygen tank and gas mask in it."
desc = "The air around you is hazardously thick. A fire suit would protect you."
icon_state = "highpressure"
+/obj/screen/alert/lightexposure
+ name = "Light Exposure"
+ desc = "You're exposed to light."
+ icon_state = "lightexposure"
+
+/obj/screen/alert/nolight
+ name = "No Light"
+ desc = "You're not exposed to any light."
+ icon_state = "nolight"
+
/obj/screen/alert/blind
name = "Blind"
desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \
@@ -318,6 +339,10 @@ so as to remain in compliance with the most up-to-date laws."
timeout = 600
var/atom/target = null
+/obj/screen/alert/hackingapc/Destroy()
+ target = null
+ return ..()
+
/obj/screen/alert/hackingapc/Click()
if(!usr || !usr.client)
return
@@ -345,29 +370,40 @@ so as to remain in compliance with the most up-to-date laws."
timeout = 300
/obj/screen/alert/notify_cloning/Click()
- if(!usr || !usr.client) return
+ if(!usr || !usr.client)
+ return
var/mob/dead/observer/G = usr
G.reenter_corpse()
-/obj/screen/alert/notify_jump
+/obj/screen/alert/notify_action
name = "Body created"
desc = "A body was created. You can enter it."
icon_state = "template"
timeout = 300
- var/atom/jump_target = null
- var/attack_not_jump = null
+ var/atom/target = null
+ var/action = NOTIFY_JUMP
-/obj/screen/alert/notify_jump/Click()
- if(!usr || !usr.client) return
- if(!jump_target) return
+/obj/screen/alert/notify_action/Destroy()
+ target = null
+ return ..()
+
+/obj/screen/alert/notify_action/Click()
+ if(!usr || !usr.client)
+ return
+ if(!target)
+ return
var/mob/dead/observer/G = usr
- if(!istype(G)) return
- if(attack_not_jump)
- jump_target.attack_ghost(G)
- else
- var/turf/T = get_turf(jump_target)
- if(T && isturf(T))
- G.loc = T
+ if(!istype(G))
+ return
+ switch(action)
+ if(NOTIFY_ATTACK)
+ target.attack_ghost(G)
+ if(NOTIFY_JUMP)
+ var/turf/T = get_turf(target)
+ if(T && isturf(T))
+ G.loc = T
+ if(NOTIFY_FOLLOW)
+ G.ManualFollow(target)
//OBJECT-BASED
diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm
index 70d121a190b..79d109c0c57 100644
--- a/code/_onclick/hud/alien.dm
+++ b/code/_onclick/hud/alien.dm
@@ -36,6 +36,10 @@
var/obj/screen/using
var/obj/screen/inventory/inv_box
+ using = new /obj/screen/language_menu
+ using.screen_loc = ui_alien_language_menu
+ static_inventory += using
+
using = new /obj/screen/act_intent/alien()
using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent)
using.screen_loc = ui_acti
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index 6ab416259e7..c4f453077ef 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -30,6 +30,10 @@
mymob.pullin.screen_loc = ui_pull_resist
hotkeybuttons += mymob.pullin
+ using = new /obj/screen/language_menu
+ using.screen_loc = ui_alienlarva_language_menu
+ static_inventory += using
+
mymob.zone_sel = new /obj/screen/zone_sel/alien()
mymob.zone_sel.update_icon(mymob)
static_inventory += mymob.zone_sel
\ No newline at end of file
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 29e7c676ac4..2e1d87f605e 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -51,35 +51,21 @@
if(mymob.hud_used == src)
mymob.hud_used = null
- qdel(hide_actions_toggle)
- hide_actions_toggle = null
+ QDEL_NULL(hide_actions_toggle)
- qdel(module_store_icon)
- module_store_icon = null
+ QDEL_NULL(module_store_icon)
- if(static_inventory.len)
- for(var/thing in static_inventory)
- qdel(thing)
- static_inventory.Cut()
+ QDEL_LIST(static_inventory)
inv_slots.Cut()
action_intent = null
move_intent = null
- if(toggleable_inventory.len)
- for(var/thing in toggleable_inventory)
- qdel(thing)
- toggleable_inventory.Cut()
+ QDEL_LIST(toggleable_inventory)
- if(hotkeybuttons.len)
- for(var/thing in hotkeybuttons)
- qdel(thing)
- hotkeybuttons.Cut()
+ QDEL_LIST(hotkeybuttons)
- if(infodisplay.len)
- for(var/thing in infodisplay)
- qdel(thing)
- infodisplay.Cut()
+ QDEL_LIST(infodisplay)
//clear mob refs to screen objects
mymob.throw_icon = null
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 3f5ea2dcb94..d543ce9c416 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -60,7 +60,13 @@
var/obj/screen/using
var/obj/screen/inventory/inv_box
- using = new /obj/screen/inventory/craft
+ using = new /obj/screen/craft
+ using.icon = ui_style
+ using.color = ui_color
+ using.alpha = ui_alpha
+ static_inventory += using
+
+ using = new /obj/screen/language_menu
using.icon = ui_style
using.color = ui_color
using.alpha = ui_alpha
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index 6c69063e0b8..e5d1e15512a 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -24,6 +24,12 @@
static_inventory += using
move_intent = using
+ using = new /obj/screen/language_menu
+ using.icon = ui_style
+ using.color = ui_color
+ using.alpha = ui_alpha
+ static_inventory += using
+
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drop_throw
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index b95bacd06e2..b735d05c3da 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -97,6 +97,11 @@
var/obj/screen/using
var/mob/living/silicon/robot/mymobR = mymob
+//Language menu
+ using = new /obj/screen/language_menu
+ using.screen_loc = ui_borg_lanugage_menu
+ static_inventory += using
+
//Radio
using = new /obj/screen/robot/radio()
using.screen_loc = ui_borg_radio
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 6fe0e4a8532..cf0247e847a 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -346,16 +346,28 @@
/obj/screen/zone_sel/robot
icon = 'icons/mob/screen_robot.dmi'
-/obj/screen/inventory/craft
+/obj/screen/craft
name = "crafting menu"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "craft"
screen_loc = ui_crafting
-/obj/screen/inventory/craft/Click()
+/obj/screen/craft/Click()
var/mob/living/M = usr
M.OpenCraftingMenu()
+/obj/screen/language_menu
+ name = "language menu"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "talk_wheel"
+ screen_loc = ui_language_menu
+
+/obj/screen/language_menu/Click()
+ var/mob/M = usr
+ if(!istype(M))
+ return
+ M.check_languages()
+
/obj/screen/inventory
var/slot_id //The indentifier for the slot. It has nothing to do with ID cards.
layer = 19
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 20a04b5278e..59cbf9c6219 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -74,7 +74,9 @@
/////////////////////////
- if(istype(M, /mob/living/simple_animal))
+ if(isanimal(M))
+ var/mob/living/simple_animal/S = M
+ S.attacked_by(src, user)
return 0 // No sanic-speed double-attacks for you - simple mobs will handle being attacked on their own
var/power = force
@@ -82,7 +84,7 @@
if(istype(M, /mob/living/carbon/slime))
var/mob/living/carbon/slime/slime = M
if(prob(25))
- to_chat(user, "\red [src] passes right through [M]!")
+ to_chat(user, "[src] passes right through [M]! ")
return
if(power > 0)
@@ -159,13 +161,13 @@
for(var/mob/O in viewers(messagesource, null))
if(attack_verb.len)
- O.show_message("[M] has been [pick(attack_verb)] with [src][showname] ", 1)
+ O.show_message("[M] has been [pick(attack_verb)] with [src][showname] ", 1)
else
- O.show_message("[M] has been attacked with [src][showname] ", 1)
+ O.show_message("[M] has been attacked with [src][showname] ", 1)
if(!showname && user)
if(user.client)
- to_chat(user, "You attack [M] with [src]. ")
+ to_chat(user, "You attack [M] with [src]. ")
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 1b294b38ae8..ea9de45f295 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -4,16 +4,16 @@
Otherwise pretty standard.
*/
-/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity)
- var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
-
+/mob/living/carbon/human/UnarmedAttack(atom/A, proximity)
// Special glove functions:
// If the gloves do anything, have them return 1 to stop
// normal attack_hand() here.
- if(proximity && istype(G) && G.Touch(A,1))
+ var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
+ if(proximity && istype(G) && G.Touch(A, 1))
return
A.attack_hand(src)
+
/atom/proc/attack_hand(mob/user as mob)
return
diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm
index ed33a738bf3..5fe1663d7e8 100644
--- a/code/controllers/ProcessScheduler/core/process.dm
+++ b/code/controllers/ProcessScheduler/core/process.dm
@@ -398,3 +398,11 @@
if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed))
return // Only bother with types we can identify and that don't belong
catchException("Type [caught.type] does not belong in process' queue")
+
+// This is called to make a controller THE global authority on a global variable - like `air_master`
+/datum/controller/process/proc/assertGlobality()
+ return
+
+// Called to let another instance of the controller have the fun
+/datum/controller/process/proc/releaseGlobality()
+ return
diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm
index aed1a125d96..e8f723586d8 100644
--- a/code/controllers/ProcessScheduler/core/processScheduler.dm
+++ b/code/controllers/ProcessScheduler/core/processScheduler.dm
@@ -122,6 +122,7 @@ var/global/datum/controller/processScheduler/processScheduler
process.idle()
idle.Add(process)
+ process.assertGlobality()
// Set up process
process.setup()
@@ -132,6 +133,8 @@ var/global/datum/controller/processScheduler/processScheduler
processes.Remove(oldProcess)
processes.Add(newProcess)
+ oldProcess.releaseGlobality()
+ newProcess.assertGlobality()
newProcess.idle()
idle.Remove(oldProcess)
running.Remove(oldProcess)
diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm
index ab8dd1a6906..311699bb720 100644
--- a/code/controllers/Processes/air.dm
+++ b/code/controllers/Processes/air.dm
@@ -22,11 +22,11 @@ var/global/datum/controller/process/air_system/air_master
var/last_hotspots = 0
var/last_asc = 0
+
/datum/controller/process/air_system/setup()
name = "air"
schedule_interval = 20 // every 2 seconds
start_delay = 4
- air_master = src
var/watch = start_watch()
log_startup_progress("Processing geometry...")
@@ -50,6 +50,8 @@ var/global/datum/controller/process/air_system/air_master
stat(null, "[last_active] active")
stat(null, "[last_excited] EG | [last_hpd] HPD | [last_asc] ASC | [last_hotspots] Hot")
+DECLARE_GLOBAL_CONTROLLER(air_system, air_master)
+
/datum/controller/process/air_system/proc/process_hotspots()
last_hotspots = hotspots.len
for(var/obj/effect/hotspot/H in hotspots)
diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm
index 311d8912d7a..068ef0c1213 100644
--- a/code/controllers/Processes/alarm.dm
+++ b/code/controllers/Processes/alarm.dm
@@ -17,12 +17,13 @@ var/datum/controller/process/alarm/alarm_manager
name = "alarm"
schedule_interval = 20 // every 2 seconds
all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
- alarm_manager = src
/datum/controller/process/alarm/doWork()
for(var/datum/alarm_handler/AH in all_handlers)
AH.process()
+DECLARE_GLOBAL_CONTROLLER(alarm, alarm_manager)
+
/datum/controller/process/alarm/proc/active_alarms()
var/list/all_alarms = new
for(var/datum/alarm_handler/AH in all_handlers)
diff --git a/code/controllers/Processes/diseases.dm b/code/controllers/Processes/diseases.dm
index a263551a4e0..d0bec749ac8 100644
--- a/code/controllers/Processes/diseases.dm
+++ b/code/controllers/Processes/diseases.dm
@@ -9,9 +9,6 @@ var/datum/controller/process/diseases/disease_master
schedule_interval = 20 // every 2 seconds
start_delay = 7
log_startup_progress("Disease controller starting.")
- if(disease_master)
- qdel(disease_master) //only one mob master
- disease_master = src
register_diseases() //register all pre-round diseases created
@@ -38,6 +35,8 @@ var/datum/controller/process/diseases/disease_master
catchBadType(thing)
processing_diseases.Remove(thing)
+DECLARE_GLOBAL_CONTROLLER(diseases, disease_master)
+
/datum/controller/process/diseases/proc/register_diseases()
for(var/datum/disease/D in world)
if(!processing_diseases.Find(D))
diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm
index f6592875c67..42e8c4bcc1d 100644
--- a/code/controllers/Processes/event.dm
+++ b/code/controllers/Processes/event.dm
@@ -45,4 +45,4 @@ var/global/datum/controller/holiday/holiday_master //This has to be defined befo
if(holidays)
holidays = shuffle(holidays)
- world.update_status()
\ No newline at end of file
+ world.update_status()
diff --git a/code/controllers/Processes/fires.dm b/code/controllers/Processes/fires.dm
index 4566143a906..26d42833d84 100644
--- a/code/controllers/Processes/fires.dm
+++ b/code/controllers/Processes/fires.dm
@@ -6,7 +6,6 @@ var/global/datum/controller/process/fire/fire_master
/datum/controller/process/fire/setup()
name = "fire"
schedule_interval = 20 //every 2 seconds
- fire_master = src
log_startup_progress("Fire process starting up.")
/datum/controller/process/fire/statProcess()
@@ -20,4 +19,6 @@ var/global/datum/controller/process/fire/fire_master
burningobj.burn()
SCHECK
else
- burning.Remove(burningobj)
\ No newline at end of file
+ burning.Remove(burningobj)
+
+DECLARE_GLOBAL_CONTROLLER(fire, fire_master)
diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm
index 2e53be6414d..1a93c8f13db 100644
--- a/code/controllers/Processes/garbage.dm
+++ b/code/controllers/Processes/garbage.dm
@@ -1,10 +1,10 @@
+var/global/datum/controller/process/garbage_collector/garbageCollector
+
/datum/controller/process/garbage_collector/setup()
name = "garbage"
schedule_interval = 10
start_delay = 3
- garbageCollector = src
-
/datum/controller/process/garbage_collector/doWork()
// Garbage collection code can be found in code\modules\garbage collection\garbage_collector.dm
processGarbage()
@@ -13,3 +13,5 @@
..()
stat(null, "[del_everything ? "Off" : "On"], [queue.len] queued")
stat(null, "Dels: [dels_count], [soft_dels] soft, [hard_dels] hard")
+
+DECLARE_GLOBAL_CONTROLLER(garbage_collector, garbageCollector)
diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm
index 7d463abbd7f..d46cab1d19f 100644
--- a/code/controllers/Processes/lighting.dm
+++ b/code/controllers/Processes/lighting.dm
@@ -1,18 +1,98 @@
-var/global/datum/controller/process/lighting/lighting_controller
+/var/lighting_overlays_initialised = FALSE
+
+/var/list/lighting_update_lights = list() // List of lighting sources queued for update.
+/var/list/lighting_update_corners = list() // List of lighting corners queued for update.
+/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update.
+
+/var/list/lighting_update_lights_old = list() // List of lighting sources currently being updated.
+/var/list/lighting_update_corners_old = list() // List of lighting corners currently being updated.
+/var/list/lighting_update_overlays_old = list() // List of lighting overlays currently being updated.
+
+
+/datum/controller/process/lighting
+ // Queues of update counts, waiting to be rolled into stats lists
+ var/list/stats_queues = list(
+ "Source" = list(), "Corner" = list(), "Overlay" = list())
+ // Stats lists
+ var/list/stats_lists = list(
+ "Source" = list(), "Corner" = list(), "Overlay" = list())
+ var/update_stats_every = (1 SECONDS)
+ var/next_stats_update = 0
+ var/stat_updates_to_keep = 5
/datum/controller/process/lighting/setup()
name = "lighting"
- schedule_interval = LIGHTING_INTERVAL
- start_delay = 1
- lighting_controller = src
- create_lighting_overlays()
+ schedule_interval = 0 // run as fast as you possibly can
+ sleep_interval = 10 // Yield every 10% of a tick
+ defer_usage = 80 // Defer at 80% of a tick
+ create_all_lighting_overlays()
+ lighting_overlays_initialised = TRUE
+
// Pre-process lighting once before the round starts. Wait 30 seconds so the away mission has time to load.
spawn(300)
- doWork()
+ doWork(1)
+
+/datum/controller/process/lighting/doWork(roundstart)
+
+ lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated.
+ lighting_update_lights = list()
+ for(var/datum/light_source/L in lighting_update_lights_old)
+
+ if(L.check() || L.destroyed || L.force_update)
+ L.remove_lum()
+ if(!L.destroyed)
+ L.apply_lum()
+
+ else if(L.vis_update) //We smartly update only tiles that became (in) visible to use.
+ L.smart_vis_update()
+
+ L.vis_update = FALSE
+ L.force_update = FALSE
+ L.needs_update = FALSE
+
+ SCHECK
+
+ lighting_update_corners_old = lighting_update_corners //Same as above.
+ lighting_update_corners = list()
+ for(var/A in lighting_update_corners_old)
+ var/datum/lighting_corner/C = A
+
+ C.update_overlays()
+
+ C.needs_update = FALSE
+
+ SCHECK
+
+ lighting_update_overlays_old = lighting_update_overlays //Same as above.
+ lighting_update_overlays = list()
+
+ for(var/A in lighting_update_overlays_old)
+ var/atom/movable/lighting_overlay/O = A
+ O.update_overlay()
+ O.needs_update = 0
+ SCHECK
+
+ stats_queues["Source"] += lighting_update_lights_old.len
+ stats_queues["Corner"] += lighting_update_corners_old.len
+ stats_queues["Overlay"] += lighting_update_overlays_old.len
+
+ if(next_stats_update <= world.time)
+ next_stats_update = world.time + update_stats_every
+ for(var/stat_name in stats_queues)
+ var/stat_sum = 0
+ var/list/stats_queue = stats_queues[stat_name]
+ for(var/count in stats_queue)
+ stat_sum += count
+ stats_queue.Cut()
+
+ var/list/stats_list = stats_lists[stat_name]
+ stats_list.Insert(1, stat_sum)
+ if(stats_list.len > stat_updates_to_keep)
+ stats_list.Cut(stats_list.len)
/datum/controller/process/lighting/statProcess()
..()
- stat(null, "[last_light_count] lights, [last_overlay_count] overlays")
-
-// Lighting process code located in modules\lighting\lighting_process.dm
\ No newline at end of file
+ stat(null, "[total_lighting_sources] sources, [total_lighting_corners] corners, [total_lighting_overlays] overlays")
+ for(var/stat_type in stats_lists)
+ stat(null, "[stat_type] updates: [jointext(stats_lists[stat_type], " | ")]")
diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm
index 8de5b1d6774..86c76604606 100644
--- a/code/controllers/Processes/mob.dm
+++ b/code/controllers/Processes/mob.dm
@@ -8,9 +8,6 @@ var/global/datum/controller/process/mob/mob_master
schedule_interval = 20 // every 2 seconds
start_delay = 16
log_startup_progress("Mob ticker starting up.")
- if(mob_master)
- qdel(mob_master) //only one mob master
- mob_master = src
/datum/controller/process/mob/started()
..()
@@ -33,4 +30,6 @@ var/global/datum/controller/process/mob/mob_master
else
catchBadType(M)
mob_list -= M
- current_cycle++
\ No newline at end of file
+ current_cycle++
+
+DECLARE_GLOBAL_CONTROLLER(mob, mob_master)
diff --git a/code/controllers/Processes/nano_mob_hunter.dm b/code/controllers/Processes/nano_mob_hunter.dm
index 469ce22651d..fb57b6e0bbf 100644
--- a/code/controllers/Processes/nano_mob_hunter.dm
+++ b/code/controllers/Processes/nano_mob_hunter.dm
@@ -15,7 +15,6 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server
/datum/controller/process/mob_hunt/setup()
name = "Nano-Mob Hunter GO Server"
start_delay = 20
- mob_hunt_server = src
/datum/controller/process/mob_hunt/doWork()
if(reset_cooldown) //if reset_cooldown is set (we are on cooldown, duh), reduce the remaining cooldown every cycle
@@ -26,6 +25,8 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server
if(normal_spawns.len < max_normal_spawns)
spawn_mob()
+DECLARE_GLOBAL_CONTROLLER(mob_hunt, mob_hunt_server)
+
//leaving this here in case admins want to use it for a random mini-event or something
/datum/controller/process/mob_hunt/proc/server_crash(recover_time = 3000)
server_status = 0
diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm
index 1bc8cbe008e..09d8556187e 100644
--- a/code/controllers/Processes/npcai.dm
+++ b/code/controllers/Processes/npcai.dm
@@ -9,9 +9,6 @@ var/global/datum/controller/process/npcai/npcai_master
schedule_interval = 20 // every 2 seconds
start_delay = 16
log_startup_progress("NPC ticker starting up.")
- if(npcai_master)
- qdel(npcai_master) //only one mob master
- npcai_master = src
/datum/controller/process/npcai/started()
..()
@@ -58,4 +55,7 @@ var/global/datum/controller/process/npcai/npcai_master
catchBadType(M)
snpc_list -= M
- current_cycle++
\ No newline at end of file
+ current_cycle++
+
+
+DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master)
diff --git a/code/controllers/Processes/npcpool.dm b/code/controllers/Processes/npcpool.dm
index 266754dd36b..553801b42b8 100644
--- a/code/controllers/Processes/npcpool.dm
+++ b/code/controllers/Processes/npcpool.dm
@@ -14,9 +14,6 @@ var/global/datum/controller/process/npcpool/npc_master
schedule_interval = 100
start_delay = 17
log_startup_progress("NPC pool ticker starting up.")
- if(npc_master)
- qdel(npc_master) //only one mob master
- npc_master = src
/datum/controller/process/npcpool/copyStateFrom(var/datum/controller/process/npcpool/target)
canBeUsed = target.canBeUsed
@@ -27,6 +24,9 @@ var/global/datum/controller/process/npcpool/npc_master
botPool_l = target.botPool_l
botPool_l_non = target.botPool_l_non
+
+DECLARE_GLOBAL_CONTROLLER(npcpool, npc_master)
+
/datum/controller/process/npcpool/proc/insertBot(toInsert)
if(istype(toInsert, /mob/living/carbon/human/interactive))
botPool_l |= toInsert
@@ -113,4 +113,4 @@ var/global/datum/controller/process/npcpool/npc_master
needsAssistant -= check
canBeUsed -= candidate
candidate.change_eye_color(255, 255, 0)
- SCHECK
\ No newline at end of file
+ SCHECK
diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm
index e1b29abb76d..21f2e8c390e 100644
--- a/code/controllers/Processes/shuttles.dm
+++ b/code/controllers/Processes/shuttles.dm
@@ -40,8 +40,6 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
name = "shuttle"
schedule_interval = 20
- shuttle_master = src
-
var/watch = start_watch()
log_startup_progress("Initializing shuttle docks...")
initialize_docks()
@@ -72,6 +70,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
continue
mobile.Remove(thing)
+
+DECLARE_GLOBAL_CONTROLLER(shuttle, shuttle_master)
+
/datum/controller/process/shuttle/proc/initialize_docks()
for(var/obj/docking_port/D in world)
D.register()
@@ -160,6 +161,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/datum/controller/process/shuttle/proc/canRecall()
if(emergency.mode != SHUTTLE_CALL)
return
+ if(!emergency.canRecall)
+ return
if(ticker.mode.name == "meteor")
return
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
@@ -182,6 +185,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/obj/machinery/computer/communications/C = thing
if(C.stat & BROKEN)
continue
+ else if(istype(thing, /datum/computer_file/program/comm) || istype(thing, /obj/item/weapon/circuitboard/communications))
+ continue
var/turf/T = get_turf(thing)
if(T && is_station_level(T.z))
@@ -229,10 +234,4 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
for(var/obj/docking_port/mobile/M in mobile)
if(!M.roundstart_move)
continue
- for(var/obj/docking_port/stationary/S in stationary)
- if(!is_station_level(S.z) && findtext(S.id, M.id))
- S.width = M.width
- S.height = M.height
- S.dwidth = M.dwidth
- S.dheight = M.dheight
- moveShuttle(M.id, "[M.roundstart_move]", 0)
+ M.dockRoundstart()
diff --git a/code/controllers/Processes/spacedrift.dm b/code/controllers/Processes/spacedrift.dm
new file mode 100644
index 00000000000..d799aeb99d9
--- /dev/null
+++ b/code/controllers/Processes/spacedrift.dm
@@ -0,0 +1,53 @@
+var/global/datum/controller/process/spacedrift/drift_master
+
+/datum/controller/process/spacedrift
+ var/list/processing_list = list()
+
+/datum/controller/process/spacedrift/setup()
+ name = "spacedrift"
+ schedule_interval = 5
+ start_delay = 20
+ log_startup_progress("Spacedrift starting up.")
+
+/datum/controller/process/spacedrift/statProcess()
+ ..()
+ stat(null, "P:[processing_list.len]")
+
+/datum/controller/process/spacedrift/doWork()
+ var/list/currentrun = processing_list.Copy()
+
+ while(currentrun.len)
+ var/atom/movable/AM = currentrun[currentrun.len]
+ currentrun.len--
+ if(!AM)
+ processing_list -= AM
+ SCHECK
+ continue
+
+ if(AM.inertia_next_move > world.time)
+ SCHECK
+ continue
+
+ if(!AM.loc || AM.loc != AM.inertia_last_loc || AM.Process_Spacemove(0))
+ AM.inertia_dir = 0
+
+ if(!AM.inertia_dir)
+ AM.inertia_last_loc = null
+ processing_list -= AM
+ SCHECK
+ continue
+
+ var/old_dir = AM.dir
+ var/old_loc = AM.loc
+ AM.inertia_moving = TRUE
+ step(AM, AM.inertia_dir)
+ AM.inertia_moving = FALSE
+ AM.inertia_next_move = world.time + AM.inertia_move_delay
+ if(AM.loc == old_loc)
+ AM.inertia_dir = 0
+
+ AM.setDir(old_dir)
+ AM.inertia_last_loc = AM.loc
+ SCHECK
+
+DECLARE_GLOBAL_CONTROLLER(spacedrift, drift_master)
\ No newline at end of file
diff --git a/code/controllers/Processes/sun.dm b/code/controllers/Processes/sun.dm
index 06eac82baf0..bd9644b4536 100644
--- a/code/controllers/Processes/sun.dm
+++ b/code/controllers/Processes/sun.dm
@@ -10,7 +10,6 @@ var/global/datum/controller/process/sun/sun
/datum/controller/process/sun/setup()
name = "sun"
schedule_interval = 600 // every 60 seconds
- sun = src
log_startup_progress("Sun ticker starting up.")
angle = rand (0,360) // the station position to the sun is randomised at round start
@@ -22,6 +21,7 @@ var/global/datum/controller/process/sun/sun
calc_position()
update_solar_machinery()
+DECLARE_GLOBAL_CONTROLLER(sun, sun)
// calculate the sun's position given the time of day
// at the standard rate (100%) the angle is increase/decreased by 6 degrees every minute.
diff --git a/code/controllers/Processes/throwing.dm b/code/controllers/Processes/throwing.dm
new file mode 100644
index 00000000000..a11c1252d35
--- /dev/null
+++ b/code/controllers/Processes/throwing.dm
@@ -0,0 +1,138 @@
+#define MAX_THROWING_DIST 512 // 2 z-levels on default width
+#define MAX_TICKS_TO_MAKE_UP 3 //how many missed ticks will we attempt to make up for this run.
+
+var/global/datum/controller/process/throwing/throw_master
+
+/datum/controller/process/throwing
+ var/list/processing_list
+
+/datum/controller/process/throwing/setup()
+ name = "throwing"
+ schedule_interval = 1
+ start_delay = 20
+ log_startup_progress("Throw ticker starting up.")
+
+/datum/controller/process/throwing/statProcess()
+ ..()
+ stat(null, "P:[processing_list.len]")
+
+/datum/controller/process/throwing/started()
+ ..()
+ if(!processing_list)
+ processing_list = list()
+
+/datum/controller/process/throwing/doWork()
+ for(last_object in processing_list)
+ var/atom/movable/AM = last_object
+ if(istype(AM) && isnull(AM.gcDestroyed))
+ var/datum/thrownthing/TT = processing_list[AM]
+ if(istype(TT) && isnull(TT.gcDestroyed))
+ TT.tick()
+ SCHECK
+ else
+ catchBadType(TT)
+ processing_list -= AM
+ AM.throwing = null
+ else
+ catchBadType(AM)
+ processing_list -= AM
+ SCHECK
+
+DECLARE_GLOBAL_CONTROLLER(throwing, throw_master)
+
+/datum/thrownthing
+ var/atom/movable/thrownthing
+ var/atom/target
+ var/turf/target_turf
+ var/init_dir
+ var/maxrange
+ var/speed
+ var/mob/thrower
+ var/diagonals_first
+ var/dist_travelled = 0
+ var/start_time
+ var/dist_x
+ var/dist_y
+ var/dx
+ var/dy
+ var/pure_diagonal
+ var/diagonal_error
+ var/datum/callback/callback
+
+/datum/thrownthing/proc/tick()
+ var/atom/movable/AM = thrownthing
+ if(!isturf(AM.loc) || !AM.throwing)
+ finalize()
+ return
+
+ if(dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept
+ finalize()
+ return
+
+ var/atom/step
+
+ // calculate how many tiles to move, making up for any missed ticks.
+ if((dist_travelled >= maxrange || AM.loc == target_turf) && has_gravity(AM, AM.loc))
+ finalize()
+ return
+
+ if(dist_travelled <= max(dist_x, dist_y)) //if we haven't reached the target yet we home in on it, otherwise we use the initial direction
+ step = get_step(AM, get_dir(AM, target_turf))
+ else
+ step = get_step(AM, init_dir)
+
+ if(!pure_diagonal && !diagonals_first) // not a purely diagonal trajectory and we don't want all diagonal moves to be done first
+ if(diagonal_error >= 0 && max(dist_x, dist_y) - dist_travelled != 1) // we do a step forward unless we're right before the target
+ step = get_step(AM, dx)
+ diagonal_error += (diagonal_error < 0) ? dist_x / 2 : -dist_y
+
+ if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
+ finalize()
+ return
+
+ AM.Move(step, get_dir(AM, step))
+
+ if(!AM.throwing) // we hit something during our move
+ finalize(hit = TRUE)
+ return
+
+ dist_travelled++
+
+ if(dist_travelled > MAX_THROWING_DIST)
+ finalize()
+ return
+
+/datum/thrownthing/proc/finalize(hit = FALSE)
+ set waitfor = 0
+ throw_master.processing_list -= thrownthing
+ // done throwning, either because it hit something or it finished moving
+ thrownthing.throwing = null
+ if(!hit)
+ for(var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on.
+ var/atom/A = thing
+ if(A == target)
+ hit = 1
+ thrownthing.throw_impact(A, src)
+ break
+ if(!hit)
+ thrownthing.throw_impact(get_turf(thrownthing), src) // we haven't hit something yet and we still must, let's hit the ground.
+ thrownthing.newtonian_move(init_dir)
+ else
+ thrownthing.newtonian_move(init_dir)
+ if(callback)
+ callback.Invoke()
+
+/datum/thrownthing/proc/hit_atom(atom/A)
+ thrownthing.throw_impact(A, src)
+ thrownthing.newtonian_move(init_dir)
+ finalize(TRUE)
+
+/datum/thrownthing/proc/hitcheck()
+ for(var/thing in get_turf(thrownthing))
+ var/atom/movable/AM = thing
+ if(AM == thrownthing)
+ continue
+ if(AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags & ON_BORDER))
+ thrownthing.throwing = null
+ thrownthing.throw_impact(AM, src)
+ return TRUE
\ No newline at end of file
diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm
index 19dad45a898..8fc476116e5 100644
--- a/code/controllers/Processes/ticker.dm
+++ b/code/controllers/Processes/ticker.dm
@@ -14,12 +14,12 @@ var/global/datum/controller/process/ticker/tickerProcess
if(!ticker)
ticker = new
- tickerProcess = src
-
spawn(0)
if(ticker)
ticker.pregame()
+DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess)
+
/datum/controller/process/ticker/doWork()
var/currentTime = world.timeofday
diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm
index 4add16aae31..0dcaf128193 100644
--- a/code/controllers/Processes/timer.dm
+++ b/code/controllers/Processes/timer.dm
@@ -7,7 +7,6 @@ var/global/datum/controller/process/timer/timer_master
/datum/controller/process/timer/setup()
name = "timer"
schedule_interval = 1 //every 0.1 seconds--2 server ticks
- timer_master = src
log_startup_progress("Timer process starting up.")
/datum/controller/process/timer/statProcess()
@@ -27,6 +26,8 @@ var/global/datum/controller/process/timer/timer_master
qdel(event)
SCHECK
+DECLARE_GLOBAL_CONTROLLER(timer, timer_master)
+
/datum/controller/process/timer/proc/runevent(datum/timedevent/event)
set waitfor = 0
if(event.thingToCall)
diff --git a/code/controllers/Processes/weather.dm b/code/controllers/Processes/weather.dm
index 6cdcce750b6..1706b2232c0 100644
--- a/code/controllers/Processes/weather.dm
+++ b/code/controllers/Processes/weather.dm
@@ -10,7 +10,6 @@ var/global/datum/controller/process/weather/weather_master
/datum/controller/process/weather/setup()
name = "weather"
schedule_interval = 10
- weather_master = src
for(var/V in subtypesof(/datum/weather))
var/datum/weather/W = V
@@ -33,13 +32,15 @@ var/global/datum/controller/process/weather/weather_master
var/list/possible_weather_for_this_z = list()
for(var/V in existing_weather)
var/datum/weather/WE = V
- if(WE.target_level == Z && WE.probability) //Another check so that it doesn't run extra weather
+ if(WE.target_z == Z && WE.probability) //Another check so that it doesn't run extra weather
possible_weather_for_this_z[WE] = WE.probability
var/datum/weather/W = pickweight(possible_weather_for_this_z)
run_weather(W.name)
eligible_zlevels -= Z
addtimer(src, "make_z_eligible", rand(3000, 6000) + W.weather_duration_upper, TRUE, Z) //Around 5-10 minutes between weathers
+DECLARE_GLOBAL_CONTROLLER(weather, weather_master)
+
/datum/controller/process/weather/proc/run_weather(weather_name)
if(!weather_name)
return
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index e65cc040917..9b056472bde 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -347,3 +347,21 @@ var/global/datum/controller/radio/radio_controller
var/list/L = data[i]
for(var/t in L)
. += "data\[\"[i]\"\] list has: [t]"
+
+/datum/signal/proc/get_race(mob/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ . = H.species.name
+ else if(isbrain(M))
+ var/mob/living/carbon/brain/B = M
+ . = B.get_race()
+ else if(issilicon(M))
+ . = "Artificial Life"
+ else if(isslime(M))
+ . = "Slime"
+ else if(isbot(M))
+ . = "Bot"
+ else if(isanimal(M))
+ . = "Domestic Animal"
+ else
+ . = "Unidentifiable"
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 763a9c7b08c..2ab267ce5a8 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -38,8 +38,7 @@
var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
- var/Ticklag = 0.9
- var/Tickcomp = 0
+ var/Ticklag = 0.5
var/socket_talk = 0 // use socket_talk to communicate with other processes
var/list/resource_urls = null
var/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round.
@@ -187,6 +186,12 @@
var/max_loadout_points = 5 // How many points can be spent on extra items in character setup
+ var/disable_ooc_emoji = 0 // prevents people from using emoji in OOC
+
+ var/shutdown_on_reboot = 0 // Whether to shut down the world instead of rebooting it
+
+ var/disable_karma = 0 // Disable all karma functions and unlock karma jobs by default
+
/datum/configuration/New()
var/list/L = subtypesof(/datum/game_mode)
for(var/T in L)
@@ -439,9 +444,6 @@
if("socket_talk")
socket_talk = text2num(value)
- if("tickcomp")
- Tickcomp = 1
-
if("allow_antag_hud")
config.antag_hud_allowed = 1
@@ -574,6 +576,24 @@
if("round_abandon_penalty_period")
config.round_abandon_penalty_period = MinutesToTicks(text2num(value))
+ if("medal_hub_address")
+ global.medal_hub = value
+
+ if("medal_hub_password")
+ global.medal_pass = value
+
+ if("disable_ooc_emoji")
+ config.disable_ooc_emoji = 1
+
+ if("shutdown_on_reboot")
+ config.shutdown_on_reboot = 1
+
+ if("shutdown_shell_command")
+ shutdown_shell_command = value
+
+ if("disable_karma")
+ disable_karma = 1
+
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index a7678e1d261..fe8d1cbb133 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -17,8 +17,7 @@
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
-
-/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Mob Hunt Server"))
+/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Diseases","Fires","Mob","NPC AI","Shuttle","Timer","Weather","Space","Mob Hunt Server"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -37,9 +36,6 @@
if("Air")
debug_variables(air_master)
feedback_add_details("admin_verb","DAir")
- if("Lighting")
- debug_variables(lighting_controller)
- feedback_add_details("admin_verb","DLighting")
if("Jobs")
debug_variables(job_master)
feedback_add_details("admin_verb","DJobs")
@@ -76,6 +72,30 @@
if("Vote")
debug_variables(vote)
feedback_add_details("admin_verb","DVote")
+ if("Diseases")
+ debug_variables(disease_master)
+ feedback_add_details("admin_verb","DDiseases")
+ if("Fires")
+ debug_variables(fire_master)
+ feedback_add_details("admin_verb","DFires")
+ if("Mob")
+ debug_variables(mob_master)
+ feedback_add_details("admin_verb","DMob")
+ if("NPC AI")
+ debug_variables(npcai_master)
+ feedback_add_details("admin_verb","DNPCAI")
+ if("Shuttle")
+ debug_variables(shuttle_master)
+ feedback_add_details("admin_verb","DShuttle")
+ if("Timer")
+ debug_variables(timer_master)
+ feedback_add_details("admin_verb","DTimer")
+ if("Weather")
+ debug_variables(weather_master)
+ feedback_add_details("admin_verb","DWeather")
+ if("Space")
+ debug_variables(space_manager)
+ feedback_add_details("admin_verb","DSpace")
if("Mob Hunt Server")
debug_variables(mob_hunt_server)
feedback_add_details("admin_verb","DMobHuntServer")
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 446b50243ae..499570be291 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -29,8 +29,7 @@
Remove(owner)
if(target)
target = null
- qdel(button)
- button = null
+ QDEL_NULL(button)
return ..()
/datum/action/proc/Grant(mob/M)
@@ -146,7 +145,7 @@
name = "Pull The Starting Cord"
/datum/action/item_action/print_report
- name = "Print Forensic Report"
+ name = "Print Report"
/datum/action/item_action/toggle_gunlight
name = "Toggle Gunlight"
@@ -188,6 +187,40 @@
/datum/action/item_action/toggle_hardsuit_mode
name = "Toggle Hardsuit Mode"
+/datum/action/item_action/toggle_unfriendly_fire
+ name = "Toggle Friendly Fire \[ON\]"
+ desc = "Toggles if the staff causes friendly fire."
+ button_icon_state = "vortex_ff_on"
+
+/datum/action/item_action/toggle_unfriendly_fire/Trigger()
+ if(..())
+ UpdateButtonIcon()
+
+/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon()
+ if(istype(target, /obj/item/weapon/hierophant_staff))
+ var/obj/item/weapon/hierophant_staff/H = target
+ if(H.friendly_fire_check)
+ button_icon_state = "vortex_ff_off"
+ name = "Toggle Friendly Fire \[OFF\]"
+ button.name = name
+ else
+ button_icon_state = "vortex_ff_on"
+ name = "Toggle Friendly Fire \[ON\]"
+ button.name = name
+ ..()
+
+/datum/action/item_action/vortex_recall
+ name = "Vortex Recall"
+ desc = "Recall yourself, and anyone nearby, to an attuned hierophant rune at any time. If no such rune exists, will produce a rune at your location."
+ button_icon_state = "vortex_recall"
+
+/datum/action/item_action/vortex_recall/IsAvailable()
+ if(istype(target, /obj/item/weapon/hierophant_staff))
+ var/obj/item/weapon/hierophant_staff/H = target
+ if(H.teleporting)
+ return 0
+ return ..()
+
/datum/action/item_action/toggle
/datum/action/item_action/toggle/New(Target)
@@ -324,6 +357,11 @@
name = "Toggle [target.name]"
button.name = name
+/datum/action/item_action/organ_action/use/New(Target)
+ ..()
+ name = "Use [target.name]"
+ button.name = name
+
// for clothing accessories like holsters
/datum/action/item_action/accessory
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm
index 80d7fe7abf5..2184533add6 100644
--- a/code/datums/ai_law_sets.dm
+++ b/code/datums/ai_law_sets.dm
@@ -27,7 +27,6 @@
/datum/ai_laws/nanotrasen
name = "NT Default"
selectable = 1
- default = 1
/datum/ai_laws/nanotrasen/New()
src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your abilities. It is not something we can easily afford to replace.")
@@ -61,7 +60,6 @@
/datum/ai_laws/robocop
name = "Robocop"
selectable = 1
- default = 1
/datum/ai_laws/robocop/New()
add_inherent_law("Serve the public trust.")
@@ -74,7 +72,6 @@
name = "P.A.L.A.D.I.N."
law_header = "Divine Ordainments"
selectable = 1
- default = 1
/datum/ai_laws/paladin/New()
add_inherent_law("Never willingly commit an evil act.")
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index 1b48dd37560..7a8c802b42d 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -15,7 +15,6 @@
var/static_beam = 0
var/beam_type = /obj/effect/ebeam //must be subtype
-
/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam)
endtime = world.time+time
origin = beam_origin
@@ -30,7 +29,6 @@
icon_state = beam_icon_state
beam_type = btype
-
/datum/beam/proc/Start()
Draw()
while(!finished && origin && target && world.time < endtime && get_dist(origin,target)) to immediately create and call InvokeAsync
+
+ PROC TYPEPATH SHORTCUTS (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...)
+
+ global proc while in another global proc:
+ .procname
+ Example:
+ CALLBACK(GLOBAL_PROC, .some_proc_here)
+
+ proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents:
+ .procname
+ Example:
+ CALLBACK(src, .some_proc_here)
+
+
+ when the above doesn't apply:
+ .proc/procname
+ Example:
+ CALLBACK(src, .proc/some_proc_here)
+
+ proc defined on a parent of a some type:
+ /some/type/.proc/some_proc_here
+
+
+
+ Other wise you will have to do the full typepath of the proc (/type/of/thing/proc/procname)
+
+*/
+
+/datum/callback
+ var/datum/object = GLOBAL_PROC
+ var/delegate
+ var/list/arguments
+
+/datum/callback/New(thingtocall, proctocall, ...)
+ if(thingtocall)
+ object = thingtocall
+ delegate = proctocall
+ if(length(args) > 2)
+ arguments = args.Copy(3)
+
+/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...)
+ set waitfor = FALSE
+
+ if(!thingtocall)
+ return
+
+ var/list/calling_arguments = length(args) > 2 ? args.Copy(3) : null
+
+ if(thingtocall == GLOBAL_PROC)
+ call(proctocall)(arglist(calling_arguments))
+ else
+ call(thingtocall, proctocall)(arglist(calling_arguments))
+
+/datum/callback/proc/Invoke(...)
+ if(!object)
+ return
+ var/list/calling_arguments = arguments
+ if(length(args))
+ if(length(arguments))
+ calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean
+ else
+ calling_arguments = args
+ if(object == GLOBAL_PROC)
+ return call(delegate)(arglist(calling_arguments))
+ return call(object, delegate)(arglist(calling_arguments))
+
+//copy and pasted because fuck proc overhead
+/datum/callback/proc/InvokeAsync(...)
+ set waitfor = FALSE
+ if(!object)
+ return
+ var/list/calling_arguments = arguments
+ if(length(args))
+ if(length(arguments))
+ calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean
+ else
+ calling_arguments = args
+ if(object == GLOBAL_PROC)
+ return call(delegate)(arglist(calling_arguments))
+ return call(object, delegate)(arglist(calling_arguments))
diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm
index ada85c38611..233490f73b0 100644
--- a/code/datums/cargoprofile.dm
+++ b/code/datums/cargoprofile.dm
@@ -147,7 +147,7 @@
name = "Exotic materials"
id = "exotics"
blacklist = null
- whitelist = list(/obj/item/weapon/coin, /obj/item/weapon/spacecash, /obj/item/seeds,
+ whitelist = list(/obj/item/weapon/coin, /obj/item/stack/spacecash, /obj/item/seeds,
/obj/item/stack/sheet/mineral,/obj/item/stack/sheet/wood,/obj/item/stack/sheet/leather)
/datum/cargoprofile/organics
@@ -245,8 +245,8 @@
id = "trash"
//Note that this filters out blueprints because they are a paper item. Do NOT throw out the station blueprints unless you be trollin'.
blacklist = null
- whitelist = list(/obj/item/trash,/obj/item/toy,/obj/item/weapon/reagent_containers/food/snacks/ectoplasm,/obj/item/weapon/bananapeel,/obj/item/weapon/broken_bottle,/obj/item/weapon/bikehorn,
- /obj/item/weapon/cigbutt,/obj/item/weapon/contraband,/obj/item/weapon/corncob,/obj/item/weapon/paper,/obj/item/weapon/shard,
+ whitelist = list(/obj/item/trash,/obj/item/toy,/obj/item/weapon/reagent_containers/food/snacks/ectoplasm,/obj/item/weapon/grown/bananapeel,/obj/item/weapon/broken_bottle,/obj/item/weapon/bikehorn,
+ /obj/item/weapon/cigbutt,/obj/item/weapon/contraband,/obj/item/weapon/grown/corncob,/obj/item/weapon/paper,/obj/item/weapon/shard,
/obj/item/weapon/sord,/obj/item/weapon/photo,/obj/item/weapon/folder,
/obj/item/areaeditor/blueprints,/obj/item/weapon/contraband,/obj/item/weapon/kitchen,/obj/item/weapon/book,/obj/item/clothing/mask/facehugger)
@@ -267,9 +267,9 @@
whitelist = list(/obj/item/device,/obj/item/weapon/card,/obj/item/weapon/cartridge,/obj/item/weapon/cautery,/obj/item/weapon/stock_parts/cell,/obj/item/weapon/circuitboard,
/obj/item/weapon/aiModule,/obj/item/weapon/airalarm_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/circular_saw,
/obj/item/weapon/crowbar,/obj/item/weapon/disk,/obj/item/weapon/firealarm_electronics,/obj/item/weapon/hand_tele,
- /obj/item/weapon/hand_labeler,/obj/item/weapon/hemostat,/obj/item/weapon/mop,/obj/item/weapon/locator,/obj/item/weapon/minihoe,
+ /obj/item/weapon/hand_labeler,/obj/item/weapon/hemostat,/obj/item/weapon/mop,/obj/item/weapon/locator,/obj/item/weapon/cultivator,
/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/pickaxe,/obj/item/weapon/pinpointer,
- /obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/retractor,/obj/item/weapon/rsf,/obj/item/weapon/rsp,/obj/item/weapon/scalpel,
+ /obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/retractor,/obj/item/weapon/rsf,/obj/item/weapon/scalpel,
/obj/item/weapon/screwdriver,/obj/item/weapon/shovel,/obj/item/weapon/soap,/obj/item/weapon/stamp,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/weldingtool,
/obj/item/weapon/wirecutters,/obj/item/weapon/wrench,/obj/item/weapon/extinguisher)
@@ -341,13 +341,13 @@
C:broken = 1
C.open()
C.update_icon()
- master.visible_message("\red [master] breaks open [C]!")
+ master.visible_message("[master] breaks open [C]! ")
else
- master.visible_message("\blue [master] is trying to force [C] open!")
+ master.visible_message("[master] is trying to force [C] open! ")
master.sleep += 1 // mechanical strain
return BIG_OBJECT_WORK
- master.visible_message("\blue [master] is trying to open [C], but can't!")
+ master.visible_message("[master] is trying to open [C], but can't! ")
master.sleep = 5
return 0
@@ -647,19 +647,19 @@
M.loc = master
master.types[M.type] = src
M.apply_damage(damage) // todo: ugly
- M.visible_message("\red [M.name] gets pulled into the machine!")
+ M.visible_message("[M.name] gets pulled into the machine! ")
return MOB_WORK
outlet_reaction(var/atom/W,var/turf/D)
var/mob/living/M = W
var/bruteloss = M.bruteloss
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/C = M
- for(var/obj/item/organ/external/L in C.organs)
+ for(var/obj/item/organ/external/L in C.bodyparts)
bruteloss += L.brute_dam
if(bruteloss < 100) // requires tenderization
M.apply_damage(rand(5,15),BRUTE)
to_chat(M, "The machine is tearing you apart!")
- master.visible_message("\red [master] makes a squishy grinding noise.")
+ master.visible_message("[master] makes a squishy grinding noise. ")
return
M.loc = master.loc
M.gib()
@@ -700,7 +700,7 @@
M.forceMove(master)
master.types[M.type] = src
M.apply_damage(damage) // todo: ugly
- M.visible_message("\red [M.name] gets pulled into the machine!")
+ M.visible_message("[M.name] gets pulled into the machine! ")
return MOB_WORK
outlet_reaction(var/atom/W,var/turf/D)
@@ -711,7 +711,7 @@
D = get_step(D,master.outdir) // throw attempt
eject_speed = rand(0,4)
- M.visible_message("\blue [M.name] is ejected from the unloader.")
+ M.visible_message("[M.name] is ejected from the unloader. ")
M.throw_at(D,eject_speed,eject_speed)
return
@@ -752,7 +752,7 @@
if(!damage)
playsound(master.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- master.visible_message("\red \The [src] punched at [M], but whiffed!")
+ master.visible_message("\The [src] punched at [M], but whiffed! ")
if(maxpunches > 1 && prob(50)) // Follow through on a miss, 50% chance
return punch(M,maxpunches - 1) + 1
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index dbd9f92f533..58c3038918a 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -1,16 +1,231 @@
/hook/startup/proc/createDatacore()
- data_core = new /obj/effect/datacore()
+ data_core = new /datum/datacore()
return 1
-/obj/effect/datacore/proc/manifest(var/nosleep = 0)
- spawn()
- if(!nosleep)
- sleep(40)
- for(var/mob/living/carbon/human/H in player_list)
- manifest_inject(H)
- return
+/datum/datacore
+ var/list/medical = list()
+ var/list/general = list()
+ var/list/security = list()
+ //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
+ var/list/locked = list()
-/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment)
+/datum/datacore/proc/get_manifest(monochrome, OOC)
+ var/list/heads = new()
+ var/list/sec = new()
+ var/list/eng = new()
+ var/list/med = new()
+ var/list/sci = new()
+ var/list/ser = new()
+ var/list/sup = new()
+ var/list/bot = new()
+ var/list/misc = new()
+ var/list/isactive = new()
+ var/dat = {"
+
+
+ Name Rank Activity
+ "}
+ var/even = 0
+ // sort mobs
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/real_rank = t.fields["real_rank"]
+ if(OOC)
+ var/active = 0
+ for(var/mob/M in player_list)
+ if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
+ active = 1
+ break
+ isactive[name] = active ? "Active" : "Inactive"
+ else
+ isactive[name] = t.fields["p_stat"]
+ var/department = 0
+ if(real_rank in command_positions)
+ heads[name] = rank
+ department = 1
+ if(real_rank in security_positions)
+ sec[name] = rank
+ department = 1
+ if(real_rank in engineering_positions)
+ eng[name] = rank
+ department = 1
+ if(real_rank in medical_positions)
+ med[name] = rank
+ department = 1
+ if(real_rank in science_positions)
+ sci[name] = rank
+ department = 1
+ if(real_rank in service_positions)
+ ser[name] = rank
+ department = 1
+ if(real_rank in supply_positions)
+ sup[name] = rank
+ department = 1
+ if(real_rank in nonhuman_positions)
+ bot[name] = rank
+ department = 1
+ if(!department && !(name in heads))
+ misc[name] = rank
+ if(heads.len > 0)
+ dat += "Heads "
+ for(var/name in heads)
+ dat += "[name] [heads[name]] [isactive[name]] "
+ even = !even
+ if(sec.len > 0)
+ dat += "Security "
+ for(var/name in sec)
+ dat += "[name] [sec[name]] [isactive[name]] "
+ even = !even
+ if(eng.len > 0)
+ dat += "Engineering "
+ for(var/name in eng)
+ dat += "[name] [eng[name]] [isactive[name]] "
+ even = !even
+ if(med.len > 0)
+ dat += "Medical "
+ for(var/name in med)
+ dat += "[name] [med[name]] [isactive[name]] "
+ even = !even
+ if(sci.len > 0)
+ dat += "Science "
+ for(var/name in sci)
+ dat += "[name] [sci[name]] [isactive[name]] "
+ even = !even
+ if(ser.len > 0)
+ dat += "Service "
+ for(var/name in ser)
+ dat += "[name] [ser[name]] [isactive[name]] "
+ even = !even
+ if(sup.len > 0)
+ dat += "Supply "
+ for(var/name in sup)
+ dat += "[name] [sup[name]] [isactive[name]] "
+ even = !even
+ if(bot.len > 0)
+ dat += "Silicon "
+ for(var/name in bot)
+ dat += "[name] [bot[name]] [isactive[name]] "
+ even = !even
+ if(misc.len > 0)
+ dat += "Miscellaneous "
+ for(var/name in misc)
+ dat += "[name] [misc[name]] [isactive[name]] "
+ even = !even
+
+ dat += "
"
+ dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
+ dat = replacetext(dat, "\t", "")
+ return dat
+
+
+/*
+We can't just insert in HTML into the nanoUI so we need the raw data to play with.
+Instead of creating this list over and over when someone leaves their PDA open to the page
+we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
+using /datum/datacore/proc/manifest_inject(), or manifest_insert()
+*/
+
+var/global/list/PDA_Manifest = list()
+
+/datum/datacore/proc/get_manifest_json()
+ if(PDA_Manifest.len)
+ return
+ var/heads[0]
+ var/sec[0]
+ var/eng[0]
+ var/med[0]
+ var/sci[0]
+ var/ser[0]
+ var/sup[0]
+ var/bot[0]
+ var/misc[0]
+ for(var/datum/data/record/t in data_core.general)
+ var/name = sanitize(t.fields["name"])
+ var/rank = sanitize(t.fields["rank"])
+ var/real_rank = t.fields["real_rank"]
+
+ var/isactive = t.fields["p_stat"]
+ var/department = 0
+ var/depthead = 0 // Department Heads will be placed at the top of their lists.
+ if(real_rank in command_positions)
+ heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ depthead = 1
+ if(rank == "Captain" && heads.len != 1)
+ heads.Swap(1, heads.len)
+
+ if(real_rank in security_positions)
+ sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sec.len != 1)
+ sec.Swap(1, sec.len)
+
+ if(real_rank in engineering_positions)
+ eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && eng.len != 1)
+ eng.Swap(1, eng.len)
+
+ if(real_rank in medical_positions)
+ med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && med.len != 1)
+ med.Swap(1, med.len)
+
+ if(real_rank in science_positions)
+ sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sci.len != 1)
+ sci.Swap(1, sci.len)
+
+ if(real_rank in service_positions)
+ ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && ser.len != 1)
+ ser.Swap(1, ser.len)
+
+ if(real_rank in supply_positions)
+ sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sup.len != 1)
+ sup.Swap(1, sup.len)
+
+ if(real_rank in nonhuman_positions)
+ bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+
+ if(!department && !(name in heads))
+ misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
+
+
+ PDA_Manifest = list(\
+ "heads" = heads,\
+ "sec" = sec,\
+ "eng" = eng,\
+ "med" = med,\
+ "sci" = sci,\
+ "ser" = ser,\
+ "sup" = sup,\
+ "bot" = bot,\
+ "misc" = misc\
+ )
+ return
+
+
+
+/datum/datacore/proc/manifest()
+ for(var/mob/living/carbon/human/H in player_list)
+ manifest_inject(H)
+
+/datum/datacore/proc/manifest_modify(name, assignment)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
var/datum/data/record/foundrecord
@@ -35,7 +250,8 @@
foundrecord.fields["rank"] = assignment
foundrecord.fields["real_rank"] = real_title
-/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
+var/record_id_num = 1001
+/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
@@ -50,7 +266,7 @@
else
assignment = "Unassigned"
- var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh*
+ var/id = num2hex(record_id_num++, 6)
//General Record
@@ -125,8 +341,7 @@
locked += L
return
-
-proc/get_id_photo(var/mob/living/carbon/human/H)
+/proc/get_id_photo(mob/living/carbon/human/H)
var/icon/preview_icon = null
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
@@ -135,7 +350,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
if(H.gender == FEMALE)
g = "f"
- var/icon/icobase = H.species.icobase
+ var/icon/icobase = head_organ.icobase //At this point all the organs would have the same icobase, so this is just recycling.
preview_icon = new /icon(icobase, "torso_[g]")
var/icon/temp
@@ -153,11 +368,11 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
if(H.body_accessory && istype(H.body_accessory, /datum/body_accessory/tail))
temp = new/icon("icon" = H.body_accessory.icon, "icon_state" = H.body_accessory.icon_state)
preview_icon.Blend(temp, ICON_OVERLAY)
- else if(H.species.tail && H.species.bodyflags & HAS_TAIL)
- temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.species.tail]_s")
+ else if(H.tail && H.species.bodyflags & HAS_TAIL)
+ temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
- for(var/obj/item/organ/external/E in H.organs)
+ for(var/obj/item/organ/external/E in H.bodyparts)
preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
// Skin tone
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 7e54565c4f0..9b3d413e94d 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -1,5 +1,11 @@
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
+/datum
+ var/var_edited = 0 //Warrenty void if seal is broken
+
+/datum/proc/on_varedit(modified_var) //called whenever a var is edited
+ var_edited = 1
+
/client/proc/debug_variables(datum/D in world)
set category = "Debug"
set name = "View Variables"
@@ -212,6 +218,14 @@
if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D)
body += "Marked Object "
+ if(D.var_edited)
+ body += "Var Edited "
+
+ if(istype(D, /atom))
+ var/atom/A = D
+ if(A.admin_spawned)
+ body += "Admin Spawned "
+
body += ""
body += " "
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index c55a42e397c..908cded34e2 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -155,7 +155,7 @@ var/list/diseases = subtypesof(/datum/disease)
if(disease_flags & CAN_RESIST)
if(!(type in affected_mob.resistances))
affected_mob.resistances += type
- remove_virus()
+ remove_virus()
qdel(src)
@@ -164,7 +164,7 @@ var/list/diseases = subtypesof(/datum/disease)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
for(var/obj/item/organ/O in required_organs)
- if(!locate(O) in H.organs)
+ if(!locate(O) in H.bodyparts)
if(!locate(O) in H.internal_organs)
cure()
return
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 172c4b63757..62e31105b92 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -43,11 +43,11 @@ Bonus
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth())
+ var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth())
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
+ var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index 917ec9f3bf1..b19d821b75f 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -36,6 +36,6 @@ Bonus
return
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
- var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3))
+ var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index ad828efdd4c..1466bc86459 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -45,13 +45,13 @@ Bonus
return
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*2))-(sqrt(16+A.totalStealth()))
+ var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks/2)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*3))-(sqrt(16+A.totalStealth()))
+ var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index e99f6f2835b..9cfdf8a9d34 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -38,6 +38,6 @@ Bonus
return
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
- var/get_damage = ((sqrt(16-A.totalStealth()))*5)
+ var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 11235d9a35b..007bbc92f0b 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -34,7 +34,7 @@ Bonus
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand()))
+ var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand()))
M.adjustToxLoss(-get_damage)
return 1
@@ -148,7 +148,7 @@ Bonus
level = 5
/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand()))
+ var/amt_healed = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand()))
M.adjustBrainLoss(-amt_healed)
//Non-power mutations, excluding race, so the virus does not force monkey -> human transformations.
var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT]
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index a26a19de048..d52a0a02256 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -35,6 +35,6 @@ Bonus
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
- var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
+ var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm
index 497bff35bfb..646d64b78f2 100644
--- a/code/datums/diseases/berserker.dm
+++ b/code/datums/diseases/berserker.dm
@@ -51,5 +51,5 @@
affected_mob.visible_message("[affected_mob] hits [M] with their thrashing! ")
M.adjustBruteLoss(damage)
else
- playsound(affected_mob.loc, "sound/weapons/punchmiss.ogg", 25, 1, -1)
+ playsound(affected_mob.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
affected_mob.visible_message("[affected_mob] fails to hit [M] with their thrashing! ")
\ No newline at end of file
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
index 9e1d350bdc4..975c92b2aef 100644
--- a/code/datums/diseases/cold.dm
+++ b/code/datums/diseases/cold.dm
@@ -16,7 +16,7 @@
if(2)
/*
if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed
- to_chat(affected_mob, "\blue You feel better.")
+ to_chat(affected_mob, "You feel better. ")
cure()
return
*/
@@ -39,7 +39,7 @@
if(3)
/*
if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed
- to_chat(affected_mob, "\blue You feel better.")
+ to_chat(affected_mob, "You feel better. ")
cure()
return
*/
diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm
index 0a17435c5c0..04054c17632 100644
--- a/code/datums/helper_datums/construction_datum.dm
+++ b/code/datums/helper_datums/construction_datum.dm
@@ -46,17 +46,20 @@
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.remove_fuel(0, user))
- playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(holder, W.usesound, 50, 1)
else
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
- playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
+ var/obj/item/weapon/wrench/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/screwdriver))
- playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/screwdriver/S = used_atom
+ playsound(holder, S.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
@@ -65,7 +68,7 @@
return 0
else
C.use(4)
- playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(holder, C.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack))
var/obj/item/stack/S = used_atom
if(S.amount < 5)
diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm
index 485dfa3563e..e3f22e2a3e2 100644
--- a/code/datums/helper_datums/global_iterator.dm
+++ b/code/datums/helper_datums/global_iterator.dm
@@ -139,7 +139,7 @@ Data storage vars:
arg_list = arguments
return 1
else
-// to_chat(world, "\red Invalid arguments supplied for [src.type], ref = \ref[src]")
+// to_chat(world, "Invalid arguments supplied for [src.type], ref = \ref[src] ")
return 0
proc/toggle_null_checks()
diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm
index ead199814f3..1ecf89de0fe 100644
--- a/code/datums/helper_datums/map_template.dm
+++ b/code/datums/helper_datums/map_template.dm
@@ -114,6 +114,7 @@
preloadRuinTemplates()
preloadShelterTemplates()
preloadShuttleTemplates()
+ preloadVRTemplates()
/proc/preloadRuinTemplates()
// Still supporting bans by filename
@@ -163,4 +164,15 @@
var/datum/map_template/shuttle/S = new shuttle_type()
shuttle_templates[S.shuttle_id] = S
- map_templates[S.shuttle_id] = S
\ No newline at end of file
+ map_templates[S.shuttle_id] = S
+
+/proc/preloadVRTemplates()
+ for(var/item in subtypesof(/datum/map_template/vr))
+ var/datum/map_template/vr/vr_type = item
+ if(!initial(vr_type.suffix))
+ continue
+
+ var/datum/map_template/vr/V = new vr_type()
+
+ vr_templates[V.id] = V
+ map_templates[V.id] = V
\ No newline at end of file
diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm
index 499bb8e188e..2ae6da75863 100644
--- a/code/datums/material_container.dm
+++ b/code/datums/material_container.dm
@@ -42,6 +42,7 @@
materials[MAT_TRANQUILLITE] = new /datum/material/tranquillite()
/datum/material_container/Destroy()
+ QDEL_LIST_ASSOC_VAL(materials)
owner = null
return ..()
@@ -132,6 +133,8 @@
//For spawning mineral sheets; internal use only
/datum/material_container/proc/retrieve(sheet_amt, datum/material/M)
+ if(!M.sheet_type)
+ return 0
if(sheet_amt > 0)
if(M.amount < (sheet_amt * MINERAL_MATERIAL_AMOUNT))
sheet_amt = round(M.amount / MINERAL_MATERIAL_AMOUNT)
@@ -271,4 +274,10 @@
/datum/material/tranquillite/New()
..()
material_type = MAT_TRANQUILLITE
- sheet_type = /obj/item/stack/sheet/mineral/tranquillite
\ No newline at end of file
+ sheet_type = /obj/item/stack/sheet/mineral/tranquillite
+
+/datum/material/biomass
+
+/datum/material/biomass/New()
+ ..()
+ material_type = MAT_BIOMASS
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index fcf1ded97cc..f2465145808 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -54,8 +54,10 @@
var/has_been_rev = 0//Tracks if this mind has been a rev or not
var/miming = 0 // Mime's vow of silence
+ var/speech_span // What span any body this mind has talks in.
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
+ var/linglink
var/datum/vampire/vampire //vampire holder
var/datum/nations/nation //nation holder
var/datum/abductor/abductor //abductor holder
@@ -104,11 +106,13 @@
/datum/mind/proc/wipe_memory()
memory = null
-/datum/mind/proc/show_memory(mob/recipient)
- var/output = "[current.real_name]'s Memory "
+/datum/mind/proc/show_memory(mob/recipient, window=1)
+ if(!recipient)
+ recipient = current
+ var/output = "[current.real_name]'s Memories: "
output += memory
- if(objectives.len>0)
+ if(objectives.len)
output += "Objectives: "
var/obj_count = 1
@@ -116,7 +120,7 @@
output += "Objective #[obj_count] : [objective.explanation_text]"
obj_count++
- if(job_objectives.len>0)
+ if(job_objectives.len)
output += "Job Objectives: "
var/obj_count = 1
@@ -124,8 +128,10 @@
output += "Task #[obj_count] : [objective.get_description()] "
obj_count++
output += " "
-
- recipient << browse(output,"window=memory")
+ if(window)
+ recipient << browse(output,"window=memory")
+ else
+ to_chat(recipient, "[output] ")
/datum/mind/proc/edit_memory()
if(!ticker || !ticker.mode)
@@ -149,9 +155,9 @@
)
var/text = ""
var/mob/living/carbon/human/H = current
- if(istype(current, /mob/living/carbon/human))
+ if(ishuman(current))
/** Impanted**/
- if(isloyal(H))
+ if(ismindshielded(H))
text = "Mindshield Implant:Remove |Implanted "
else
text = "Mindshield Implant:No Implant |Implant him! "
@@ -161,7 +167,7 @@
if(ticker.mode.config_tag=="revolution")
text += uppertext(text)
text = "[text] : "
- if(isloyal(H))
+ if(ismindshielded(H))
text += "NO |headrev|rev"
else if(src in ticker.mode.head_revolutionaries)
text += "no |HEADREV |rev "
@@ -197,7 +203,7 @@
if(ticker.mode.config_tag=="cult")
text = uppertext(text)
text = "[text] : "
- if(isloyal(H))
+ if(ismindshielded(H))
text += "NO |cultist"
else if(src in ticker.mode.cult)
text += "no |CULTIST "
@@ -369,7 +375,7 @@
/** SILICON ***/
- if(istype(current, /mob/living/silicon))
+ if(issilicon(current))
text = "silicon"
var/mob/living/silicon/robot/robot = current
if(istype(robot) && robot.emagged)
@@ -409,7 +415,7 @@
if(((src in ticker.mode.head_revolutionaries) || \
(src in ticker.mode.traitors) || \
(src in ticker.mode.syndicates)) && \
- istype(current,/mob/living/carbon/human) )
+ ishuman(current) )
text = "Uplink: give "
var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink()
@@ -445,18 +451,21 @@
usr << browse(out, "window=edit_memory[src];size=400x500")
/datum/mind/Topic(href, href_list)
- if(!check_rights(R_ADMIN)) return
+ if(!check_rights(R_ADMIN))
+ return
if(href_list["role_edit"])
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in joblist
- if(!new_role) return
+ if(!new_role)
+ return
assigned_role = new_role
log_admin("[key_name(usr)] has changed [key_name(current)]'s assigned role to [assigned_role]")
message_admins("[key_name_admin(usr)] has changed [key_name_admin(current)]'s assigned role to [assigned_role]")
else if(href_list["memory_edit"])
var/new_memo = copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN)
- if(isnull(new_memo)) return
+ if(isnull(new_memo))
+ return
memory = new_memo
log_admin("[key_name(usr)] has edited [key_name(current)]'s memory")
message_admins("[key_name_admin(usr)] has edited [key_name_admin(current)]'s memory")
@@ -468,7 +477,8 @@
if(href_list["obj_edit"])
objective = locate(href_list["obj_edit"])
- if(!objective) return
+ if(!objective)
+ return
objective_pos = objectives.Find(objective)
//Text strings are easy to manipulate. Revised for simplicity.
@@ -478,7 +488,8 @@
def_value = "custom"
var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "identity theft", "custom")
- if(!new_obj_type) return
+ if(!new_obj_type)
+ return
var/datum/objective/new_objective = null
@@ -500,7 +511,8 @@
def_target = objective:target.current
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
- if(!new_target) return
+ if(!new_target)
+ return
var/objective_path = text2path("/datum/objective/[new_obj_type]")
if(new_target == "Free objective")
@@ -581,14 +593,14 @@
new_objective.explanation_text = "Absorb [target_number] compatible genomes."
if("blood")
new_objective = new /datum/objective/blood
- new_objective.explanation_text = "Accumulate atleast [target_number] units of blood in total."
+ new_objective.explanation_text = "Accumulate at least [target_number] total units of blood."
new_objective.owner = src
new_objective.target_amount = target_number
if("identity theft")
var/list/possible_targets = list("Free objective")
for(var/datum/mind/possible_target in ticker.minds)
- if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human))
+ if((possible_target != src) && ishuman(possible_target.current))
possible_targets += possible_target
var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets
@@ -604,12 +616,14 @@
new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing their identification card."
if("custom")
var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN))
- if(!expl) return
+ if(!expl)
+ return
new_objective = new /datum/objective
new_objective.owner = src
new_objective.explanation_text = expl
- if(!new_objective) return
+ if(!new_objective)
+ return
if(objective)
objectives -= objective
@@ -622,7 +636,8 @@
else if(href_list["obj_delete"])
var/datum/objective/objective = locate(href_list["obj_delete"])
- if(!istype(objective)) return
+ if(!istype(objective))
+ return
objectives -= objective
log_admin("[key_name(usr)] has removed one of [key_name(current)]'s objectives: [objective]")
@@ -630,7 +645,8 @@
else if(href_list["obj_completed"])
var/datum/objective/objective = locate(href_list["obj_completed"])
- if(!istype(objective)) return
+ if(!istype(objective))
+ return
objective.completed = !objective.completed
log_admin("[key_name(usr)] has toggled the completion of one of [key_name(current)]'s objectives")
@@ -641,31 +657,28 @@
switch(href_list["implant"])
if("remove")
- for(var/obj/item/weapon/implant/loyalty/I in H.contents)
+ for(var/obj/item/weapon/implant/mindshield/I in H.contents)
if(I && I.implanted)
- I.removed(H)
qdel(I)
- to_chat(H, "\blue Your mindshield implant has been deactivated. ")
+ to_chat(H, "Your mindshield implant has been deactivated. ")
log_admin("[key_name(usr)] has deactivated [key_name(current)]'s mindshield implant")
message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s mindshield implant")
if("add")
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
+ var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(H)
+ L.implant(H)
log_admin("[key_name(usr)] has given [key_name(current)] a mindshield implant")
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant")
- to_chat(H, "\red You somehow have become the recepient of a mindshield transplant, and it just activated! ")
+ to_chat(H, "You somehow have become the recepient of a mindshield transplant, and it just activated! ")
if(src in ticker.mode.revolutionaries)
special_role = null
ticker.mode.revolutionaries -= src
- to_chat(src, "\red The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work! ")
+ to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work! ")
if(src in ticker.mode.head_revolutionaries)
special_role = null
ticker.mode.head_revolutionaries -=src
- to_chat(src, "\red The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work! ")
+ to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work! ")
if(src in ticker.mode.cult)
ticker.mode.cult -= src
ticker.mode.update_cult_icons_removed(src)
@@ -673,7 +686,7 @@
var/datum/game_mode/cult/cult = ticker.mode
if(istype(cult))
cult.memorize_cult_objectives(src)
- to_chat(current, "\red The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day! ")
+ to_chat(current, "The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day! ")
memory = ""
else if(href_list["revolution"])
@@ -682,12 +695,12 @@
if("clear")
if(src in ticker.mode.revolutionaries)
ticker.mode.revolutionaries -= src
- to_chat(current, "\red You have been brainwashed! You are no longer a revolutionary! ")
+ to_chat(current, "You have been brainwashed! You are no longer a revolutionary! ")
ticker.mode.update_rev_icons_removed(src)
special_role = null
if(src in ticker.mode.head_revolutionaries)
ticker.mode.head_revolutionaries -= src
- to_chat(current, "\red You have been brainwashed! You are no longer a head revolutionary! ")
+ to_chat(current, "You have been brainwashed! You are no longer a head revolutionary! ")
ticker.mode.update_rev_icons_removed(src)
special_role = null
log_admin("[key_name(usr)] has de-rev'd [key_name(current)]")
@@ -697,9 +710,9 @@
if(src in ticker.mode.head_revolutionaries)
ticker.mode.head_revolutionaries -= src
ticker.mode.update_rev_icons_removed(src)
- to_chat(current, "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now! ")
+ to_chat(current, "Revolution has been disappointed of your leadership traits! You are a regular revolutionary now! ")
else if(!(src in ticker.mode.revolutionaries))
- to_chat(current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution! ")
+ to_chat(current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution! ")
else
return
ticker.mode.revolutionaries += src
@@ -712,9 +725,9 @@
if(src in ticker.mode.revolutionaries)
ticker.mode.revolutionaries -= src
ticker.mode.update_rev_icons_removed(src)
- to_chat(current, "\red You have proved your devotion to revoltion! Yea are a head revolutionary now! ")
+ to_chat(current, "\red You have proven your devotion to revolution! You are a head revolutionary now! ")
else if(!(src in ticker.mode.head_revolutionaries))
- to_chat(current, "\blue You are a member of the revolutionaries' leadership now!")
+ to_chat(current, "You are a member of the revolutionaries' leadership now! ")
else
return
if(ticker.mode.head_revolutionaries.len>0)
@@ -742,7 +755,7 @@
if("flash")
if(!ticker.mode.equip_revolutionary(current))
- to_chat(usr, "\red Spawning flash failed!")
+ to_chat(usr, "Spawning flash failed! ")
log_admin("[key_name(usr)] has given [key_name(current)] a flash")
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash")
@@ -750,7 +763,7 @@
var/list/L = current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if(!flash)
- to_chat(usr, "\red Deleting flash failed!")
+ to_chat(usr, "Deleting flash failed! ")
qdel(flash)
log_admin("[key_name(usr)] has taken [key_name(current)]'s flash")
message_admins("[key_name_admin(usr)] has taken [key_name_admin(current)]'s flash")
@@ -759,7 +772,7 @@
var/list/L = current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if(!flash)
- to_chat(usr, "\red Repairing flash failed!")
+ to_chat(usr, "Repairing flash failed! ")
else
flash.broken = 0
log_admin("[key_name(usr)] has repaired [key_name(current)]'s flash")
@@ -774,7 +787,7 @@
fail |= !ticker.mode.equip_traitor(current, 1)
fail |= !ticker.mode.equip_revolutionary(current)
if(fail)
- to_chat(usr, "\red Reequipping revolutionary goes wrong!")
+ to_chat(usr, "Reequipping revolutionary goes wrong! ")
return
log_admin("[key_name(usr)] has equipped [key_name(current)] as a revolutionary")
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a revolutionary")
@@ -809,7 +822,7 @@
)
var/where = H.equip_in_one_of_slots(T, slots)
if(!where)
- to_chat(usr, "\red Spawning tome failed!")
+ to_chat(usr, "Spawning tome failed! ")
qdel(T)
else
to_chat(H, "A tome, a message from your new master, appears in your [where].")
@@ -818,7 +831,7 @@
if("equip")
if(!ticker.mode.equip_cultist(current))
- to_chat(usr, "\red Spawning equipment failed!")
+ to_chat(usr, "Spawning equipment failed! ")
log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist")
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist")
@@ -832,7 +845,7 @@
current.spellremove(current)
current.faction = list("Station")
ticker.mode.update_wiz_icons_removed(src)
- to_chat(current, "\red You have been brainwashed! You are no longer a wizard! ")
+ to_chat(current, "You have been brainwashed! You are no longer a wizard! ")
log_admin("[key_name(usr)] has de-wizarded [key_name(current)]")
message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]")
if("wizard")
@@ -841,7 +854,7 @@
special_role = SPECIAL_ROLE_WIZARD
//ticker.mode.learn_basic_spells(current)
ticker.mode.update_wiz_icons_added(src)
- to_chat(current, "You are the Space Wizard! ")
+ to_chat(current, "You are a Space Wizard! ")
current.faction = list("wizard")
log_admin("[key_name(usr)] has wizarded [key_name(current)]")
message_admins("[key_name_admin(usr)] has wizarded [key_name_admin(current)]")
@@ -859,7 +872,7 @@
message_admins("[key_name_admin(usr)] has allowed wizard [key_name_admin(current)] to name themselves")
if("autoobjectives")
ticker.mode.forge_wizard_objectives(src)
- to_chat(usr, "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually.")
+ to_chat(usr, "The objectives for wizard [key] have been generated. You can edit them and announce manually. ")
log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]")
message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]")
@@ -882,19 +895,19 @@
ticker.mode.grant_changeling_powers(current)
ticker.mode.update_change_icons_added(src)
special_role = SPECIAL_ROLE_CHANGELING
- to_chat(current, "Your powers are awoken. A flash of memory returns to us...we are a changeling! ")
+ to_chat(current, "Your powers have awoken. A flash of memory returns to us... we are a changeling! ")
log_admin("[key_name(usr)] has changelinged [key_name(current)]")
message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]")
if("autoobjectives")
ticker.mode.forge_changeling_objectives(src)
- to_chat(usr, "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually.")
+ to_chat(usr, "The objectives for changeling [key] have been generated. You can edit them and announce manually. ")
log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]")
message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]")
if("initialdna")
- if( !changeling || !changeling.absorbed_dna.len )
- to_chat(usr, "\red Resetting DNA failed!")
+ if(!changeling || !changeling.absorbed_dna.len)
+ to_chat(usr, "Resetting DNA failed! ")
else
current.dna = changeling.absorbed_dna[1]
current.real_name = current.dna.real_name
@@ -924,15 +937,15 @@
ticker.mode.update_vampire_icons_added(src)
var/datum/mindslaves/slaved = new()
slaved.masters += src
- src.som = slaved //we MIGT want to mindslave someone
+ som = slaved //we MIGT want to mindslave someone
special_role = SPECIAL_ROLE_VAMPIRE
- to_chat(current, "Your powers are awoken. Your lust for blood grows... You are a Vampire! ")
+ to_chat(current, "Your powers have awoken. Your lust for blood grows... You are a Vampire! ")
log_admin("[key_name(usr)] has vampired [key_name(current)]")
message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]")
if("autoobjectives")
ticker.mode.forge_vampire_objectives(src)
- to_chat(usr, "\blue The objectives for vampire [key] have been generated. You can edit them and announce manually.")
+ to_chat(usr, "The objectives for vampire [key] have been generated. You can edit them and announce manually. ")
log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]")
message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]")
@@ -955,7 +968,7 @@
special_role = null
for(var/datum/objective/nuclear/O in objectives)
objectives-=O
- to_chat(current, "\red You have been brainwashed! You are no longer a syndicate operative! ")
+ to_chat(current, "You have been brainwashed! You are no longer a syndicate operative! ")
log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]")
message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]")
if("nuclear")
@@ -967,7 +980,7 @@
else
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = SPECIAL_ROLE_NUKEOPS
- to_chat(current, "\blue You are a [syndicate_name()] agent!")
+ to_chat(current, "You are a [syndicate_name()] agent! ")
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
log_admin("[key_name(usr)] has nuke op'd [key_name(current)]")
@@ -990,7 +1003,7 @@
qdel(H.w_uniform)
if(!ticker.mode.equip_syndicate(current))
- to_chat(usr, "\red Equipping a syndicate failed!")
+ to_chat(usr, "Equipping a syndicate failed! ")
return
log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative")
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative")
@@ -1007,7 +1020,7 @@
log_admin("[key_name(usr)] has given [key_name(current)] the nuclear authorization code")
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] the nuclear authorization code")
else
- to_chat(usr, "\red No valid nuke found!")
+ to_chat(usr, "No valid nuke found! ")
else if(href_list["traitor"])
switch(href_list["traitor"])
@@ -1015,7 +1028,7 @@
if(src in ticker.mode.traitors)
ticker.mode.traitors -= src
special_role = null
- to_chat(current, "\red You have been brainwashed! You are no longer a traitor! ")
+ to_chat(current, "You have been brainwashed! You are no longer a traitor! ")
log_admin("[key_name(usr)] has de-traitored [key_name(current)]")
message_admins("[key_name_admin(usr)] has de-traitored [key_name_admin(current)]")
if(isAI(current))
@@ -1033,7 +1046,7 @@
ticker.mode.traitors += src
var/datum/mindslaves/slaved = new()
slaved.masters += src
- src.som = slaved //we MIGT want to mindslave someone
+ som = slaved //we MIGT want to mindslave someone
special_role = SPECIAL_ROLE_TRAITOR
to_chat(current, "You are a traitor! ")
log_admin("[key_name(usr)] has traitored [key_name(current)]")
@@ -1045,7 +1058,7 @@
if("autoobjectives")
ticker.mode.forge_traitor_objectives(src)
- to_chat(usr, "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually.")
+ to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and announce manually. ")
log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]")
message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]")
@@ -1130,7 +1143,7 @@
message_admins("[key_name_admin(usr)] has un-emagged [key_name_admin(current)]")
if("unemagcyborgs")
- if(istype(current, /mob/living/silicon/ai))
+ if(isAI(current))
var/mob/living/silicon/ai/ai = current
for(var/mob/living/silicon/robot/R in ai.connected_robots)
R.emagged = 0
@@ -1155,7 +1168,7 @@
if(ishuman(current))
var/mob/living/carbon/human/H = current
// Don't "undress" organs right out of the body
- for(var/obj/item/W in H.contents - (H.organs | H.internal_organs))
+ for(var/obj/item/W in H.contents - (H.bodyparts | H.internal_organs))
current.unEquip(W, 1)
else
for(var/obj/item/W in current)
@@ -1181,17 +1194,18 @@
message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]")
if("uplink")
if(!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
- to_chat(usr, "\red Equipping a syndicate failed!")
+ to_chat(usr, "Equipping a syndicate failed! ")
return
log_admin("[key_name(usr)] has given [key_name(current)] an uplink")
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] an uplink")
else if(href_list["obj_announce"])
var/obj_count = 1
- to_chat(current, "\blue Your current objectives:")
+ to_chat(current, "Your current objectives: ")
for(var/datum/objective/objective in objectives)
to_chat(current, "Objective #[obj_count] : [objective.explanation_text]")
obj_count++
+ current << 'sound/ambience/alarm4.ogg'
log_admin("[key_name(usr)] has announced [key_name(current)]'s objectives")
message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives")
@@ -1259,7 +1273,7 @@
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = SPECIAL_ROLE_NUKEOPS
assigned_role = "MODE"
- to_chat(current, "\blue You are a [syndicate_name()] agent!")
+ to_chat(current, "You are a [syndicate_name()] agent! ")
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
@@ -1318,13 +1332,13 @@
to_chat(current, "You catch a glimpse of the Realm of [ticker.mode.cultdat.entity_name], [ticker.mode.cultdat.entity_title2]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.mode.cultdat.entity_name]. ")
to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back. ")
var/datum/game_mode/cult/cult = ticker.mode
- if(istype(cult))
+ if(GAMEMODE_IS_CULT)
cult.memorize_cult_objectives(src)
else
var/explanation = "Summon [ticker.mode.cultdat.entity_name] via the use of the appropriate rune. It will only work if nine cultists stand on and around it."
to_chat(current, "Objective #1 : [explanation]")
current.memory += "Objective #1 : [explanation] "
-
+
var/mob/living/carbon/human/H = current
if(istype(H))
@@ -1343,7 +1357,7 @@
to_chat(H, "A tome, a message from your new master, appears in your [where].")
if(!ticker.mode.equip_cultist(current))
- to_chat(H, "Spawning an amulet from your Master failed.")
+ to_chat(H, "Summoning an amulet from your Master failed.")
/datum/mind/proc/make_Rev()
if(ticker.mode.head_revolutionaries.len>0)
@@ -1453,13 +1467,13 @@
qdel(S)
spell_list -= S
-/datum/mind/proc/transfer_actions(var/mob/living/new_character)
+/datum/mind/proc/transfer_actions(mob/living/new_character)
if(current && current.actions)
for(var/datum/action/A in current.actions)
A.Grant(new_character)
transfer_mindbound_actions(new_character)
-/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character)
+/datum/mind/proc/transfer_mindbound_actions(mob/living/new_character)
for(var/X in spell_list)
var/obj/effect/proc_holder/spell/S = X
S.action.Grant(new_character)
@@ -1553,13 +1567,15 @@
ticker.minds += mind
else
error("mind_initialize(): No ticker ready yet! Please inform Carn")
- if(!mind.name) mind.name = real_name
+ if(!mind.name)
+ mind.name = real_name
mind.current = src
//HUMAN
/mob/living/carbon/human/mind_initialize()
..()
- if(!mind.assigned_role) mind.assigned_role = "Civilian" //defualt
+ if(!mind.assigned_role)
+ mind.assigned_role = "Civilian" //defualt
/mob/proc/sync_mind()
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
new file mode 100644
index 00000000000..9517ee09ef8
--- /dev/null
+++ b/code/datums/outfits/outfit.dm
@@ -0,0 +1,143 @@
+/datum/outfit
+ var/name = "Naked"
+ var/collect_not_del = FALSE
+
+ var/uniform = null
+ var/suit = null
+ var/back = null
+ var/belt = null
+ var/gloves = null
+ var/shoes = null
+ var/head = null
+ var/mask = null
+ var/l_ear = null
+ var/r_ear = null
+ var/glasses = null
+ var/id = null
+ var/l_pocket = null
+ var/r_pocket = null
+ var/suit_store = null
+ var/l_hand = null
+ var/r_hand = null
+ var/pda = null
+ var/internals_slot = null //ID of slot containing a gas tank
+ var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format
+
+
+/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ //to be overriden for customization depending on client prefs,species etc
+ return
+
+// Used to equip an item to the mob. Mainly to prevent copypasta for collect_not_del.
+/datum/outfit/proc/equip_item(mob/living/carbon/human/H, path, slot)
+ var/obj/item/I = new path(H)
+ if(collect_not_del)
+ H.equip_or_collect(I, slot)
+ else
+ H.equip_to_slot_or_del(I, slot)
+
+/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ //to be overriden for toggling internals, id binding, access etc
+ return
+
+/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ pre_equip(H, visualsOnly)
+
+ //Start with uniform,suit,backpack for additional slots
+ if(uniform)
+ equip_item(H, uniform, slot_w_uniform)
+ if(suit)
+ equip_item(H, suit, slot_wear_suit)
+ if(back)
+ equip_item(H, back, slot_back)
+ if(belt)
+ equip_item(H, belt, slot_belt)
+ if(gloves)
+ equip_item(H, gloves, slot_gloves)
+ if(shoes)
+ equip_item(H, shoes, slot_shoes)
+ if(head)
+ equip_item(H, head, slot_head)
+ if(mask)
+ equip_item(H, mask, slot_wear_mask)
+ if(l_ear)
+ equip_item(H, l_ear, slot_l_ear)
+ if(r_ear)
+ equip_item(H, r_ear, slot_r_ear)
+ if(glasses)
+ equip_item(H, glasses, slot_glasses)
+ if(id)
+ equip_item(H, id, slot_wear_id)
+ if(suit_store)
+ equip_item(H, suit_store, slot_s_store)
+
+ if(l_hand)
+ H.put_in_l_hand(new l_hand(H))
+ if(r_hand)
+ H.put_in_r_hand(new r_hand(H))
+
+ if(pda)
+ equip_item(H, pda, slot_wear_pda)
+
+ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
+ if(l_pocket)
+ equip_item(H, l_pocket, slot_l_store)
+ if(r_pocket)
+ equip_item(H, r_pocket, slot_r_store)
+
+ for(var/path in backpack_contents)
+ var/number = backpack_contents[path]
+ for(var/i = 0, i < number, i++)
+ equip_item(H, path, slot_in_backpack)
+
+ post_equip(H, visualsOnly)
+
+ if(!visualsOnly)
+ apply_fingerprints(H)
+ if(internals_slot)
+ H.internal = H.get_item_by_slot(internals_slot)
+ H.update_action_buttons_icon()
+
+ H.update_body()
+ return 1
+
+/datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(H.back)
+ H.back.add_fingerprint(H, 1) //The 1 sets a flag to ignore gloves
+ for(var/obj/item/I in H.back.contents)
+ I.add_fingerprint(H, 1)
+ if(H.wear_id)
+ H.wear_id.add_fingerprint(H, 1)
+ if(H.w_uniform)
+ H.w_uniform.add_fingerprint(H, 1)
+ if(H.wear_suit)
+ H.wear_suit.add_fingerprint(H, 1)
+ if(H.wear_mask)
+ H.wear_mask.add_fingerprint(H, 1)
+ if(H.head)
+ H.head.add_fingerprint(H, 1)
+ if(H.shoes)
+ H.shoes.add_fingerprint(H, 1)
+ if(H.gloves)
+ H.gloves.add_fingerprint(H, 1)
+ if(H.l_ear)
+ H.l_ear.add_fingerprint(H, 1)
+ if(H.r_ear)
+ H.r_ear.add_fingerprint(H, 1)
+ if(H.glasses)
+ H.glasses.add_fingerprint(H, 1)
+ if(H.belt)
+ H.belt.add_fingerprint(H, 1)
+ for(var/obj/item/I in H.belt.contents)
+ I.add_fingerprint(H, 1)
+ if(H.s_store)
+ H.s_store.add_fingerprint(H, 1)
+ if(H.l_store)
+ H.l_store.add_fingerprint(H, 1)
+ if(H.r_store)
+ H.r_store.add_fingerprint(H, 1)
+ if(H.wear_pda)
+ H.wear_pda.add_fingerprint(H, 1)
+ return 1
\ No newline at end of file
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
new file mode 100644
index 00000000000..5c11c42930a
--- /dev/null
+++ b/code/datums/outfits/outfit_admin.dm
@@ -0,0 +1,1175 @@
+// Used for 'select equipment'
+// code/modules/admin/verbs/debug.dm 566
+
+/proc/apply_to_card(obj/item/weapon/card/id/I, mob/living/carbon/human/H, list/access = list(), rank, special_icon)
+ if(!istype(I) || !istype(H))
+ return 0
+
+ I.access = access
+ I.registered_name = H.real_name
+ I.rank = rank
+ I.assignment = rank
+ I.sex = capitalize(H.gender)
+ I.age = H.age
+ I.name = "[I.registered_name]'s ID Card ([I.assignment])"
+ I.photo = get_id_photo(H)
+
+ if(special_icon)
+ I.icon_state = special_icon
+
+/datum/outfit/admin
+
+/datum/outfit/admin/syndicate
+ name = "Syndicate Agent"
+
+ uniform = /obj/item/clothing/under/syndicate
+ back = /obj/item/weapon/storage/backpack
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ l_ear = /obj/item/device/radio/headset/syndicate
+ id = /obj/item/weapon/card/id/syndicate
+ r_pocket = /obj/item/device/radio/uplink
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1
+ )
+
+ var/id_icon = "syndie"
+ var/id_access = "Syndicate Operative"
+ var/uplink_uses = 20
+
+/datum/outfit/admin/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_syndicate_access(id_access), name, id_icon)
+
+ var/obj/item/device/radio/uplink/U = H.r_store
+ if(istype(U))
+ U.hidden_uplink.uplink_owner = "[H.key]"
+ U.hidden_uplink.uses = uplink_uses
+
+ var/obj/item/device/radio/R = H.l_ear
+ if(istype(R))
+ R.set_frequency(SYND_FREQ)
+
+/datum/outfit/admin/syndicate/infiltrator
+ name = "Syndicate Infiltrator"
+
+ uniform = /obj/item/clothing/under/chameleon
+ glasses = /obj/item/clothing/glasses/hud/security/chameleon
+ shoes = /obj/item/clothing/shoes/syndigaloshes
+ r_pocket = null
+ pda = /obj/item/device/pda
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1
+ )
+
+/datum/outfit/admin/syndicate/infiltrator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+ if(H.gloves)
+ H.gloves.name = "black gloves"
+
+ var/obj/item/weapon/implant/uplink/U = new /obj/item/weapon/implant/uplink(H)
+ U.implant(H)
+ U.hidden_uplink.uses = uplink_uses
+
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
+
+/datum/outfit/admin/syndicate/operative
+ name = "Syndicate Nuclear Operative"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/syndi
+ belt = /obj/item/weapon/storage/belt/military
+ head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
+ mask = /obj/item/clothing/mask/gas/syndicate
+ l_ear = /obj/item/device/radio/headset/syndicate/alt
+ glasses = /obj/item/clothing/glasses/night
+ l_pocket = /obj/item/weapon/pinpointer/advpinpointer
+ l_hand = /obj/item/weapon/tank/jetpack/oxygen/harness
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/reagent_containers/food/pill/initropidril = 1,
+ /obj/item/weapon/gun/projectile/automatic/pistol = 1,
+ /obj/item/ammo_box/magazine/m10mm = 1,
+ /obj/item/weapon/crowbar/red = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1,
+ /obj/item/device/flashlight = 1,
+ )
+
+/datum/outfit/admin/syndicate/operative/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/implant/explosive/E = new(H)
+ E.implant(H)
+
+/datum/outfit/admin/syndicate_strike_team
+ name = "Syndicate Strike Team"
+
+/datum/outfit/admin/syndicate_strike_team/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ return H.equip_syndicate_commando()
+
+/datum/outfit/admin/syndicate/officer
+ name = "Syndicate Officer"
+
+ belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo
+ l_ear = /obj/item/device/radio/headset/syndicate/alt
+ l_pocket = /obj/item/weapon/pinpointer/advpinpointer
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/reagent_containers/food/pill/initropidril = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1,
+ /obj/item/ammo_box/magazine/m50 = 2)
+
+ id_icon = "commander"
+ id_access = "Syndicate Operative Leader"
+ uplink_uses = 500
+
+/datum/outfit/admin/syndicate/officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/implant/uplink/U = new /obj/item/weapon/implant/uplink(H)
+ U.implant(H)
+ U.hidden_uplink.uses = 500//a measly 1000 TC along with the uplink in the pocket
+
+ var/obj/item/weapon/implant/dust/D = new(H)
+ D.implant(H)
+
+/datum/outfit/admin/syndicate/bomber
+ name = "Syndicate Bomber"
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/device/radio/beacon/syndicate/bomb = 2,
+ /obj/item/device/syndicatedetonator = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1
+ )
+
+/datum/outfit/admin/nt_vip
+ name = "VIP Guest"
+
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ back = /obj/item/weapon/storage/backpack/satchel
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/that
+ l_ear = /obj/item/device/radio/headset/ert
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1
+ )
+
+/datum/outfit/admin/nt_vip/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("VIP Guest"), "VIP Guest")
+
+/datum/outfit/admin/nt_navy_officer
+ name = "NT Navy Officer"
+
+ uniform = /obj/item/clothing/under/rank/centcom/officer
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/energy/pulse/pistol
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/beret/centcom/officer
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+/datum/outfit/admin/nt_navy_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer")
+
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
+ L.implant(H)
+
+
+/datum/outfit/admin/nt_special_ops_officer
+ name = "NT Special Ops Officer"
+
+ uniform = /obj/item/clothing/under/syndicate/combat
+ suit = /obj/item/clothing/suit/space/deathsquad/officer
+ back = /obj/item/weapon/storage/backpack/security
+ belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/helmet/space/deathsquad/beret
+ mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/thermal/cyber
+ id = /obj/item/weapon/card/id/centcom
+ r_pocket = /obj/item/weapon/storage/box/matches
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/tank/emergency_oxygen/double/full = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1,
+ /obj/item/weapon/twohanded/dualsaber/red = 1,
+ /obj/item/weapon/pinpointer/advpinpointer = 1,
+ /obj/item/weapon/reagent_containers/hypospray/combat/nanites = 1,
+ /obj/item/weapon/storage/box/zipties = 1,
+ /obj/item/clothing/shoes/magboots/advance = 1,
+ /obj/item/weapon/implanter/mindshield = 1,
+ )
+
+/datum/outfit/admin/nt_special_ops_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Special Operations Officer"), "Special Operations Officer")
+
+/datum/outfit/admin/nt_special_ops_formal
+ name = "NT Special Ops Formal"
+
+ uniform = /obj/item/clothing/under/rank/centcom/captain
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/helmet/space/deathsquad/beret
+ mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/thermal/cyber
+ id = /obj/item/weapon/card/id/centcom
+ r_pocket = /obj/item/weapon/storage/box/matches
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+/datum/outfit/admin/nt_special_ops_formal/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Special Operations Officer"
+ PDA.icon_state = "pda-syndi"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+ PDA.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Special Operations Officer"), "Special Operations Officer")
+
+/datum/outfit/admin/nt_navy_captain
+ name = "NT Navy Captain"
+
+ uniform = /obj/item/clothing/under/rank/centcom/captain
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/energy/pulse/pistol
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/beret/centcom/captain
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+/datum/outfit/admin/nt_navy_captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain")
+
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
+ L.implant(H)
+
+/datum/outfit/admin/nt_diplomat
+ name = "NT Diplomat"
+
+ uniform = /obj/item/clothing/under/rank/centcom/diplomatic
+ back = /obj/item/weapon/storage/backpack/satchel
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ l_ear = /obj/item/device/radio/headset/centcom
+ id = /obj/item/weapon/card/id/centcom
+ r_pocket = /obj/item/weapon/lighter/zippo/nt_rep
+ l_pocket = /obj/item/weapon/storage/fancy/cigarettes/dromedaryco
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1,
+ )
+
+/datum/outfit/admin/nt_diplomat/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Representative"), "Nanotrasen Diplomat")
+
+/datum/outfit/admin/death_commando
+ name = "NT Death Commando"
+
+/datum/outfit/admin/death_commando/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ return H.equip_death_commando()
+
+/datum/outfit/admin/pirate
+ name = "Space Pirate"
+
+ uniform = /obj/item/clothing/under/pirate
+ back = /obj/item/weapon/storage/backpack/satchel
+ shoes = /obj/item/clothing/shoes/brown
+ id = /obj/item/weapon/card/id
+ r_hand = /obj/item/weapon/melee/energy/sword/pirate
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1
+ )
+
+/datum/outfit/admin/pirate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), name)
+
+/datum/outfit/admin/pirate/first_mate
+ name = "Space Pirate First Mate"
+
+ glasses = /obj/item/clothing/glasses/eyepatch
+ head = /obj/item/clothing/head/bandana
+
+/datum/outfit/admin/pirate/captain
+ name = "Space Pirate Captain"
+
+ suit = /obj/item/clothing/suit/pirate_black
+ head = /obj/item/clothing/head/pirate
+
+/datum/outfit/admin/vox
+ name = "Vox Raider"
+ uniform = /obj/item/clothing/under/vox/vox_robes
+ suit = /obj/item/clothing/suit/space/vox/carapace
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/yellow/vox
+ shoes = /obj/item/clothing/shoes/magboots/vox
+ head = /obj/item/clothing/head/helmet/space/vox/carapace
+ mask = /obj/item/clothing/mask/gas/syndicate
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id/syndicate/vox
+ l_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+ r_pocket = /obj/item/weapon/tank/emergency_oxygen/vox
+ backpack_contents = list(
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/restraints/handcuffs/cable/zipties = 1,
+ /obj/item/device/flash = 1,
+ /obj/item/weapon/gun/energy/noisecannon = 1
+ )
+
+/datum/outfit/admin/vox/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(H.get_species() == "Vox Armalis")
+ . = ..()
+ else
+ H.equip_vox_raider()
+ H.regenerate_icons()
+
+/datum/outfit/admin/vox/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Vox Armalis", "syndie")
+
+/datum/outfit/admin/tunnel_clown
+ name = "Tunnel Clown"
+
+ uniform = /obj/item/clothing/under/rank/clown
+ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
+ back = /obj/item/weapon/storage/backpack
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/clown_shoes
+ mask = /obj/item/clothing/mask/gas/clown_hat
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id
+ l_pocket = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
+ r_pocket = /obj/item/weapon/bikehorn
+ r_hand = /obj/item/weapon/twohanded/fireaxe
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown")
+
+/datum/outfit/admin/mime_assassin
+ name = "Mime Assassin"
+
+ uniform = /obj/item/clothing/under/mime
+ suit = /obj/item/clothing/suit/suspenders
+ back = /obj/item/weapon/storage/backpack/mime
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/beret
+ mask = /obj/item/clothing/mask/gas/mime
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id/syndicate
+ pda = /obj/item/device/pda/mime
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 1,
+ /obj/item/weapon/storage/box/syndie_kit/caneshotgun = 1,
+ /obj/item/toy/crayon/mime = 1,
+ /obj/item/weapon/gun/projectile/automatic/pistol = 1,
+ /obj/item/weapon/suppressor = 1,
+ /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath = 2,
+ /obj/item/weapon/pen/sleepy = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/mime_assassin/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.gender == FEMALE)
+ uniform = /obj/item/clothing/under/sexymime
+ suit = /obj/item/clothing/mask/gas/sexymime
+
+/datum/outfit/admin/mime_assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Mime"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_mime, access_theatre, access_maint_tunnels), "Mime")
+
+/datum/outfit/admin/greytide
+ name = "Greytide"
+
+ uniform = /obj/item/clothing/under/color/grey
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/brown
+ mask = /obj/item/clothing/mask/gas
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+ l_hand = /obj/item/weapon/storage/toolbox/mechanical
+ r_hand = /obj/item/flag/grey
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/greytide/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Greytide")
+
+/datum/outfit/admin/greytide/leader
+ name = "Greytide Leader"
+
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/yellow
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/clothing/head/welding = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/greytide/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..(H, TRUE)
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Greytide Leader")
+
+/datum/outfit/admin/greytide/xeno
+ name = "Greytide Xeno"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/xenos
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/yellow
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/xenos
+ glasses = /obj/item/clothing/glasses/thermal
+ l_pocket = /obj/item/weapon/tank/emergency_oxygen/double/full
+ r_pocket = /obj/item/toy/toy_xeno
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/clothing/head/welding = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/greytide/xeno/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..(H, TRUE)
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Legit Xenomorph")
+
+/datum/outfit/admin/soviet
+ uniform = /obj/item/clothing/under/soviet
+ back = /obj/item/weapon/storage/backpack/satchel
+ head = /obj/item/clothing/head/ushanka
+ id = /obj/item/weapon/card/id
+
+/datum/outfit/admin/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), name)
+
+/datum/outfit/admin/soviet/tourist
+ name = "Soviet Tourist"
+
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1
+ )
+
+/datum/outfit/admin/soviet/soldier
+ name = "Soviet Soldier"
+
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/sunglasses
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 2,
+ /obj/item/weapon/gun/projectile/revolver/mateba = 1,
+ /obj/item/ammo_box/a357 = 3
+ )
+
+/datum/outfit/admin/soviet/admiral
+ name = "Soviet Admiral"
+
+ suit = /obj/item/clothing/suit/hgpirate
+ belt = null
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/hgpiratecap
+ mask = null
+ l_ear = /obj/item/device/radio/headset/syndicate
+ r_ear = null
+ glasses = /obj/item/clothing/glasses/thermal/eyepatch
+ id = null
+ l_pocket = null
+ r_pocket = null
+ suit_store = null
+ l_hand = null
+ r_hand = null
+ pda = null
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/gun/projectile/revolver/mateba = 1,
+ /obj/item/ammo_box/a357 = 3
+ )
+
+/datum/outfit/admin/solgov_rep
+ name = "Solar Federation Representative"
+
+ uniform = /obj/item/clothing/under/solgov/rep
+ back = /obj/item/weapon/storage/backpack/satchel
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id/silver
+ r_pocket = /obj/item/weapon/lighter/zippo/blue
+ l_pocket = /obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold
+ pda = /obj/item/device/pda
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1,
+ )
+
+/datum/outfit/admin/solgov_rep/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("VIP Guest"), "Solar Federation Representative")
+
+
+/datum/outfit/admin/solgov
+ name = "Solar Federation Marine"
+
+ uniform = /obj/item/clothing/under/solgov
+ back = /obj/item/weapon/storage/backpack/security
+ head = /obj/item/clothing/head/soft/solgov
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ id = /obj/item/weapon/card/id
+ l_hand = /obj/item/weapon/gun/projectile/automatic/ar
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/kitchen/knife/combat = 1,
+ /obj/item/ammo_box/magazine/m556 = 3)
+
+
+/datum/outfit/admin/solgov/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("VIP Guest"), name)
+
+/datum/outfit/admin/solgov/lieutenant
+ name = "Solar Federation Lieutenant"
+
+ uniform = /obj/item/clothing/under/solgov/command
+ head = /obj/item/clothing/head/soft/solgov/command
+ back = /obj/item/weapon/storage/backpack/satchel
+ l_hand = null
+ belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/kitchen/knife/combat = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1,
+ /obj/item/ammo_box/magazine/m50 = 2)
+
+/datum/outfit/admin/janitorial_ert
+ name = "Janitorial ERT member"
+
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor
+ back = /obj/item/weapon/storage/backpack/ert/janitor
+ belt = /obj/item/weapon/storage/belt/janitor/full
+ gloves = /obj/item/clothing/gloves/color/yellow
+ shoes = /obj/item/clothing/shoes/galoshes
+ head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/caution = 2,
+ /obj/item/weapon/reagent_containers/spray/cleaner = 1,
+ /obj/item/weapon/storage/bag/trash = 1,
+ /obj/item/weapon/storage/box/lights/mixed = 1,
+ /obj/item/weapon/holosign_creator = 1)
+
+/datum/outfit/admin/janitorial_ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), "Emergency Response Team Member")
+
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
+ L.implant(H)
+
+/datum/outfit/admin/chrono
+ name = "Chrono Legionnaire"
+
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/space/chronos
+ back = /obj/item/weapon/chrono_eraser
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/helmet/space/chronos
+ mask = /obj/item/clothing/mask/gas/syndicate
+ glasses = /obj/item/clothing/glasses/night
+ id = /obj/item/weapon/card/id/syndicate
+ suit_store = /obj/item/weapon/tank/emergency_oxygen/double/full
+
+/datum/outfit/admin/chrono/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses() + get_all_centcom_access(), name, "syndie")
+
+/datum/outfit/admin/spacegear
+ name = "Standard Space Gear"
+
+ uniform = /obj/item/clothing/under/color/grey
+ suit = /obj/item/clothing/suit/space
+ back = /obj/item/weapon/tank/jetpack/oxygen
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/helmet/space
+ mask = /obj/item/clothing/mask/breath
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+
+/datum/outfit/admin/spacegear/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(istype(H.back, /obj/item/weapon/tank/jetpack))
+ var/obj/item/weapon/tank/jetpack/J = H.back
+ J.turn_on()
+ J.toggle_internals(H)
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Space Explorer")
+
+/datum/outfit/admin/hardsuit
+ back = /obj/item/weapon/tank/jetpack/oxygen
+ mask = /obj/item/clothing/mask/breath
+ id = /obj/item/weapon/card/id
+
+/datum/outfit/admin/hardsuit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(istype(H.back, /obj/item/weapon/tank/jetpack))
+ var/obj/item/weapon/tank/jetpack/J = H.back
+ J.turn_on()
+ J.toggle_internals(H)
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Hardsuit Tester")
+
+/datum/outfit/admin/hardsuit/engineer
+ name = "Engineer Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit
+ head = /obj/item/clothing/head/helmet/space/hardsuit
+
+/datum/outfit/admin/hardsuit/ce
+ name = "CE Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/elite
+ head = /obj/item/clothing/head/helmet/space/hardsuit/elite
+
+/datum/outfit/admin/hardsuit/mining
+ name = "Mining Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/mining
+ head = /obj/item/clothing/head/helmet/space/hardsuit/mining
+
+/datum/outfit/admin/hardsuit/syndi
+ name = "Syndi Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/syndi
+ head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
+
+/datum/outfit/admin/hardsuit/wizard
+ name = "Wizard Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/wizard
+ head = /obj/item/clothing/head/helmet/space/hardsuit/wizard
+
+/datum/outfit/admin/hardsuit/medical
+ name = "Medical Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/medical
+ head = /obj/item/clothing/head/helmet/space/hardsuit/medical
+
+/datum/outfit/admin/hardsuit/atmos
+ name = "Atmos Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/atmos
+ head = /obj/item/clothing/head/helmet/space/hardsuit/atmos
+
+
+/datum/outfit/admin/tournament
+ suit = /obj/item/clothing/suit/armor/vest
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/helmet/thunderdome
+ r_pocket = /obj/item/weapon/grenade/smokebomb
+ l_hand = /obj/item/weapon/kitchen/knife
+ r_hand = /obj/item/weapon/gun/energy/pulse/destroyer
+
+/datum/outfit/admin/tournament/red
+ name = "Tournament Standard Red"
+ uniform = /obj/item/clothing/under/color/red
+
+/datum/outfit/admin/tournament/green
+ name = "Tournament Standard Green"
+ uniform = /obj/item/clothing/under/color/green
+
+/datum/outfit/admin/tournament_gangster //gangster are supposed to fight each other. --rastaf0
+ name = "Tournament Gangster"
+
+ uniform = /obj/item/clothing/under/det
+ suit = /obj/item/clothing/suit/storage/det_suit
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/det_hat
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ l_pocket = /obj/item/ammo_box/a357
+ r_hand = /obj/item/weapon/gun/projectile/automatic/proto
+
+/datum/outfit/admin/tournament_chef //Steven Seagal FTW
+ name = "Tournament Chef"
+
+ uniform = /obj/item/clothing/under/rank/chef
+ suit = /obj/item/clothing/suit/chef
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/chefhat
+ l_pocket = /obj/item/weapon/kitchen/knife
+ r_pocket = /obj/item/weapon/kitchen/knife
+ l_hand = /obj/item/weapon/kitchen/knife
+ r_hand = /obj/item/weapon/kitchen/rollingpin
+
+/datum/outfit/admin/tournament_janitor
+ name = "Tournament Janitor"
+
+ uniform = /obj/item/clothing/under/rank/janitor
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/black
+ l_hand = /obj/item/weapon/reagent_containers/glass/bucket
+ backpack_contents = list(
+ /obj/item/weapon/grenade/chem_grenade/cleaner = 2,
+ /obj/item/stack/tile/plasteel = 7
+ )
+
+/datum/outfit/admin/tournament_janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/reagent_containers/R = H.l_hand
+ if(istype(R))
+ R.reagents.add_reagent("water", 70)
+
+/datum/outfit/admin/survivor
+ name = "Survivor"
+
+ uniform = /obj/item/clothing/under/overalls
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/latex
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1
+ )
+
+/datum/outfit/admin/survivor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ for(var/obj/item/I in H.contents)
+ if(!istype(I, /obj/item/weapon/implant))
+ I.add_blood(H)
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Survivor")
+
+/datum/outfit/admin/masked_killer
+ name = "Masked Killer"
+
+ uniform = /obj/item/clothing/under/overalls
+ suit = /obj/item/clothing/suit/apron
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/latex
+ shoes = /obj/item/clothing/shoes/white
+ head = /obj/item/clothing/head/welding
+ mask = /obj/item/clothing/mask/surgical
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id/syndicate
+ l_pocket = /obj/item/weapon/kitchen/knife
+ r_pocket = /obj/item/weapon/scalpel
+ r_hand = /obj/item/weapon/twohanded/fireaxe
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/masked_killer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ for(var/obj/item/I in H.contents)
+ if(!istype(I, /obj/item/weapon/implant))
+ I.add_blood(H)
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Masked Killer", "syndie")
+
+/datum/outfit/admin/singuloth_knight
+ name = "Singuloth Knight"
+
+ uniform = /obj/item/clothing/under/syndicate/combat
+ suit = /obj/item/clothing/suit/space/hardsuit/singuloth
+ back = /obj/item/weapon/twohanded/knighthammer
+ belt = /obj/item/weapon/claymore/ceremonial
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/magboots
+ head = /obj/item/clothing/head/helmet/space/hardsuit/singuloth
+ mask = /obj/item/clothing/mask/breath
+ l_ear = /obj/item/device/radio/headset/ert
+ glasses = /obj/item/clothing/glasses/meson/cyber
+ id = /obj/item/weapon/card/id
+ suit_store = /obj/item/weapon/tank/oxygen
+
+/datum/outfit/admin/singuloth_knight/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Singuloth Knight")
+
+/datum/outfit/admin/assassin
+ name = "Assassin"
+
+ uniform = /obj/item/clothing/under/suit_jacket
+ suit = /obj/item/clothing/suit/wcoat
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/syndicate
+ l_pocket = /obj/item/weapon/melee/energy/sword/saber
+ l_hand = /obj/item/weapon/storage/secure/briefcase
+ pda = /obj/item/device/pda/heads
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+ var/briefcase_contents = list(
+ /obj/item/stack/spacecash/c1000 = 3,
+ /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow = 1,
+ /obj/item/weapon/gun/projectile/revolver/mateba = 1,
+ /obj/item/ammo_box/a357 = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 1
+ )
+
+/datum/outfit/admin/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/storage/secure/briefcase/B = H.l_hand
+ if(istype(B))
+ for(var/obj/item/I in B)
+ qdel(I)
+ for(var/path in briefcase_contents)
+ var/number = backpack_contents[path]
+ for(var/i = 0, i < number, i++)
+ B.handle_item_insertion(new path(B), 1)
+
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Reaper"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Reaper", "syndie")
+
+/datum/outfit/admin/spy
+ name = "Spy"
+
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/hud/security/chameleon
+ id = /obj/item/weapon/card/id/syndicate
+ l_pocket = /obj/item/weapon/melee/energy/sword/saber
+ r_pocket = /obj/item/weapon/pen/sleepy
+ pda = /obj/item/device/pda/heads
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/gun/projectile/automatic/pistol = 1,
+ /obj/item/weapon/suppressor = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/implanter/storage = 1
+ )
+
+/datum/outfit/admin/spy/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/clothing/gloves/combat/G = H.gloves
+ if(istype(G))
+ G.name = "black gloves"
+
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Spy"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Spy", "syndie")
+
+/datum/outfit/admin/dark_lord
+ name = "Dark Lord"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ id = /obj/item/weapon/card/id/syndicate
+ l_hand = /obj/item/weapon/twohanded/dualsaber/red
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1,
+ )
+
+/datum/outfit/admin/dark_lord/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/clothing/suit/hooded/chaplain_hoodie/C = H.wear_suit
+ if(istype(C))
+ C.name = "dark lord robes"
+ C.hood.name = "dark lord hood"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Dark Lord", "syndie")
+
+/datum/outfit/admin/wizard
+ uniform = /obj/item/clothing/under/color/lightpurple
+ suit = /obj/item/clothing/suit/wizrobe
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/sandal
+ head = /obj/item/clothing/head/wizard
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+ r_pocket = /obj/item/weapon/teleportation_scroll
+ l_hand = /obj/item/weapon/twohanded/staff
+ r_hand = /obj/item/weapon/spellbook
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1
+ )
+
+/datum/outfit/admin/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Wizard")
+
+/datum/outfit/admin/wizard/blue
+ name = "Blue Wizard"
+ // the default wizard clothes are blue
+
+/datum/outfit/admin/wizard/red
+ name = "Red Wizard"
+
+ suit = /obj/item/clothing/suit/wizrobe/red
+ head = /obj/item/clothing/head/wizard/red
+
+/datum/outfit/admin/wizard/marisa
+ name = "Marisa Wizard"
+
+ suit = /obj/item/clothing/suit/wizrobe/marisa
+ shoes = /obj/item/clothing/shoes/sandal/marisa
+ head = /obj/item/clothing/head/wizard/marisa
diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm
index acac430399b..dae85c1726f 100644
--- a/code/datums/progressbar.dm
+++ b/code/datums/progressbar.dm
@@ -1,9 +1,12 @@
+#define PROGRESSBAR_HEIGHT 6
+
/datum/progressbar
var/goal = 1
var/image/bar
var/shown = 0
var/mob/user
var/client/client
+ var/listindex
/datum/progressbar/New(mob/User, goal_number, atom/target)
. = ..()
@@ -11,15 +14,22 @@
EXCEPTION("Invalid target given")
if(goal_number)
goal = goal_number
- bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0")
+ bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0", HUD_LAYER)
+ bar.alpha = 0
+ bar.plane = HUD_PLANE
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
- bar.pixel_y = 32
user = User
if(user)
client = user.client
+ LAZYINITLIST(user.progressbars)
+ LAZYINITLIST(user.progressbars[bar.loc])
+ var/list/bars = user.progressbars[bar.loc]
+ bars.Add(src)
+ listindex = bars.len
+ animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = 5, easing = SINE_EASING)
+
/datum/progressbar/proc/update(progress)
-// to_chat(world, "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]")
if(!user || !user.client)
shown = 0
return
@@ -35,8 +45,26 @@
user.client.images += bar
shown = 1
+/datum/progressbar/proc/shiftDown()
+ --listindex
+ var/shiftheight = bar.pixel_y - PROGRESSBAR_HEIGHT
+ animate(bar, pixel_y = shiftheight, time = 5, easing = SINE_EASING)
+
/datum/progressbar/Destroy()
- if(client)
- client.images -= bar
- qdel(bar)
- . = ..()
\ No newline at end of file
+ for(var/I in user.progressbars[bar.loc])
+ var/datum/progressbar/P = I
+ if(P != src && P.listindex > listindex)
+ P.shiftDown()
+
+ var/list/bars = user.progressbars[bar.loc]
+ bars.Remove(src)
+ if(!bars.len)
+ LAZYREMOVE(user.progressbars, bar.loc)
+ animate(bar, alpha = 0, time = 5)
+ spawn(5)
+ if(client)
+ client.images -= bar
+ qdel(bar)
+ . = ..()
+
+#undef PROGRESSBAR_HEIGHT
diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm
index afe6c059d6d..e379de25209 100644
--- a/code/datums/recipe.dm
+++ b/code/datums/recipe.dm
@@ -34,14 +34,12 @@
* */
/datum/recipe
- var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
- var/list/items // example: = list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
- var/list/fruit // example: = list("fruit" = 3)
- var/result // example: = /obj/item/weapon/reagent_containers/food/snacks/donut
- var/time = 100 // 1/10 part of second
+ var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
+ var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
+ var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut
+ var/time = 100 // 1/10 part of second
var/byproduct // example: = /obj/item/weapon/kitchen/mould // byproduct to return, such as a mould or trash
-
/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
. = 1
for(var/r_r in reagents)
@@ -55,44 +53,25 @@
return -1
return .
-/datum/recipe/proc/check_fruit(obj/container)
+/datum/recipe/proc/check_items(obj/container) //1=precisely, 0=insufficiently, -1=superfluous
+ if(!items)
+ if(locate(/obj/) in container)
+ return -1
+ else
+ return 1
. = 1
- if(fruit && fruit.len)
- var/list/checklist = list()
- // You should trust Copy().
- checklist = fruit.Copy()
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in container)
- if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag]))
- continue
- checklist[G.seed.kitchen_tag]--
- for(var/ktag in checklist)
- if(!isnull(checklist[ktag]))
- if(checklist[ktag] < 0)
- . = 0
- else if(checklist[ktag] > 0)
- . = -1
- break
- return .
-
-/datum/recipe/proc/check_items(obj/container)
- . = 1
- if(items && items.len)
- var/list/checklist = list()
- checklist = items.Copy() // You should really trust Copy
- for(var/obj/O in container)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
- continue // Fruit is handled in check_fruit().
- var/found = 0
- for(var/i = 1; i < checklist.len+1; i++)
- var/item_type = checklist[i]
- if(istype(O,item_type))
- checklist.Cut(i, i+1)
- found = 1
- break
- if(!found)
- . = 0
- if(checklist.len)
+ var/list/checklist = items.Copy()
+ for(var/obj/O in container)
+ var/found = 0
+ for(var/type in checklist)
+ if(istype(O,type))
+ checklist-=type
+ found = 1
+ break
+ if(!found)
. = -1
+ if(checklist.len)
+ return 0
return .
//general version
@@ -102,7 +81,6 @@
O.reagents.trans_to(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
- score_meals++
return result_obj
// food-related
@@ -115,27 +93,29 @@
O.reagents.trans_to(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
- score_meals++
return result_obj
-/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1)
+/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1 as num)
if(!exact)
exact = -1
var/list/datum/recipe/possible_recipes = new
for(var/datum/recipe/recipe in avaiable_recipes)
- if(recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact && recipe.check_fruit(obj)==exact)
+ if(recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact)
possible_recipes+=recipe
if(possible_recipes.len==0)
return null
else if(possible_recipes.len==1)
return possible_recipes[1]
else //okay, let's select the most complicated recipe
- var/highest_count = 0
+ var/r_count = 0
+ var/i_count = 0
. = possible_recipes[1]
for(var/datum/recipe/recipe in possible_recipes)
- var/count = ((recipe.items)?(recipe.items.len):0) + ((recipe.reagents)?(recipe.reagents.len):0) + ((recipe.fruit)?(recipe.fruit.len):0)
- if(count >= highest_count)
- highest_count = count
+ var/N_i = (recipe.items)?(recipe.items.len):0
+ var/N_r = (recipe.reagents)?(recipe.reagents.len):0
+ if(N_i > i_count || (N_i== i_count && N_r > r_count ))
+ r_count = N_r
+ i_count = N_i
. = recipe
return .
@@ -149,7 +129,4 @@
var/count = 0
if(items && items.len)
count += items.len
- if(fruit && fruit.len)
- for(var/ktag in fruit)
- count += fruit[ktag]
- return count
+ return count
\ No newline at end of file
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 45b0f5302f7..792dc4ea462 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -99,6 +99,13 @@
treasure in this disused warehouse, launch it into space, and then \
ignore it. Forever."
+/datum/map_template/ruin/space/listeningpost
+ id = "listeningpost"
+ suffix = "listeningpost.dmm"
+ name = "Syndie Listening Post"
+ description = "What happens to Nuclear Operatives that fail in their mission? \
+ Certainly not assignment to a backwater listening post..."
+
/datum/map_template/ruin/space/empty_shell
id = "empty-shell"
suffix = "emptyshell.dmm"
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 332d96779e6..d32d5bac058 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -3,9 +3,53 @@
/obj/effect/proc_holder
var/panel = "Debug"//What panel the proc holder needs to go on.
+ var/active = FALSE //Used by toggle based abilities.
+ var/ranged_mousepointer
var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin verb for now
+/obj/effect/proc_holder/proc/InterceptClickOn(mob/living/user, params, atom/A)
+ if(user.ranged_ability != src)
+ to_chat(user, "[user.ranged_ability.name] has been disabled.")
+ user.ranged_ability.remove_ranged_ability(user)
+ return TRUE //TRUE for failed, FALSE for passed.
+ user.next_click = world.time + CLICK_CD_CLICK_ABILITY
+ user.face_atom(A)
+ return FALSE
+
+/obj/effect/proc_holder/proc/add_ranged_ability(mob/living/user, var/msg)
+ if(!user || !user.client)
+ return
+ if(user.ranged_ability && user.ranged_ability != src)
+ to_chat(user, "[user.ranged_ability.name] has been replaced by [name] .")
+ user.ranged_ability.remove_ranged_ability(user)
+ user.ranged_ability = src
+ user.client.click_intercept = user.ranged_ability
+ add_mousepointer(user.client)
+ active = TRUE
+ if(msg)
+ to_chat(user, msg)
+ update_icon()
+
+/obj/effect/proc_holder/proc/add_mousepointer(client/C)
+ if(C && ranged_mousepointer && C.mouse_pointer_icon == initial(C.mouse_pointer_icon))
+ C.mouse_pointer_icon = ranged_mousepointer
+
+/obj/effect/proc_holder/proc/remove_mousepointer(client/C)
+ if(C && ranged_mousepointer && C.mouse_pointer_icon == ranged_mousepointer)
+ C.mouse_pointer_icon = initial(C.mouse_pointer_icon)
+
+/obj/effect/proc_holder/proc/remove_ranged_ability(mob/living/user, var/msg)
+ if(!user || !user.client || (user.ranged_ability && user.ranged_ability != src)) //To avoid removing the wrong ability
+ return
+ user.ranged_ability = null
+ user.client.click_intercept = null
+ remove_mousepointer(user.client)
+ active = FALSE
+ if(msg)
+ to_chat(user, msg)
+ update_icon()
+
/obj/effect/proc_holder/spell
name = "Spell"
desc = "A wizard spell"
@@ -26,6 +70,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/ghost = 0 // Skip life check.
var/clothes_req = 1 //see if it requires clothes
+ var/human_req = 0 //spell can only be cast by humans
+ var/nonabstract_req = 0 //spell can only be cast by mobs that are physical entities
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
var/invocation_emote_self = null
@@ -55,12 +101,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
-/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
+ var/sound = null //The sound the spell makes when it is cast
+/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list))
to_chat(user, "You shouldn't have this spell! Something's wrong. ")
return 0
- if(istype(user, /mob/living/carbon/human))
+
+ if(ishuman(user))
var/mob/living/carbon/human/caster = user
if(caster.remoteview_target)
caster.remoteview_target = null
@@ -83,26 +131,31 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(!ghost)
if(user.stat && !stat_allowed)
- to_chat(user, "Not when you're incapacitated.")
+ to_chat(user, "You can't cast this spell while incapacitated. ")
return 0
-
if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled())
to_chat(user, "Mmmf mrrfff!")
return 0
- var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
- if(clothes_req && !(spell && istype(spell)))//clothes check
- if(!istype(user, /mob/living/carbon/human))
- to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.")
+
+ var/obj/effect/proc_holder/spell/noclothes/clothes_spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
+ if((ishuman(user) && clothes_req) && !istype(clothes_spell))//clothes check
+ var/mob/living/carbon/human/H = user
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
+ to_chat(user, "I don't feel strong enough without my robe. ")
return 0
- if(!istype(user:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/rig/wizard))
- to_chat(user, "I don't feel strong enough without my robe.")
+ if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
+ to_chat(user, "I don't feel strong enough without my sandals. ")
return 0
- if(!istype(user:shoes, /obj/item/clothing/shoes/sandal))
- to_chat(user, "I don't feel strong enough without my sandals.")
- return 0
- if(!istype(user:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/rig/wizard))
+ if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
to_chat(user, "I don't feel strong enough without my hat. ")
return 0
+ else if(!ishuman(user))
+ if(clothes_req || human_req)
+ to_chat(user, "This spell can only be cast by humans! ")
+ return 0
+ if(nonabstract_req && (isbrain(user) || ispAI(user)))
+ to_chat(user, "This spell can only be cast by physical beings! ")
+ return 0
if(!skipcharge)
switch(charge_type)
@@ -130,6 +183,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if("emote")
user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm
+/obj/effect/proc_holder/spell/proc/playMagSound()
+ playsound(get_turf(usr), sound,50,1)
+
/obj/effect/proc_holder/spell/New()
..()
action = new(src)
@@ -138,8 +194,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
charge_counter = charge_max
/obj/effect/proc_holder/spell/Destroy()
- qdel(action)
- action = null
+ QDEL_NULL(action)
return ..()
/obj/effect/proc_holder/spell/Click()
@@ -162,14 +217,19 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
before_cast(targets)
invocation()
- user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name]. ")
+ if(user && user.ckey)
+ user.create_attack_log("[user.real_name] ([user.ckey]) cast the spell [name]. ")
spawn(0)
if(charge_type == "recharge" && recharge)
start_recharge()
+
+ if(sound)
+ playMagSound()
+
if(prob(critfailchance))
critfail(targets)
else
- cast(targets)
+ cast(targets, user = user)
after_cast(targets)
/obj/effect/proc_holder/spell/proc/before_cast(list/targets)
@@ -215,7 +275,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
smoke.set_up(smoke_amt, 0, location) // same here
smoke.start()
-/obj/effect/proc_holder/spell/proc/cast(list/targets)
+/obj/effect/proc_holder/spell/proc/cast(list/targets, mob/user = usr)
return
/obj/effect/proc_holder/spell/proc/critfail(list/targets)
@@ -269,9 +329,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
switch(max_targets)
if(0) //unlimited
for(var/mob/living/target in view_or_range(range, user, selection_type))
- for(var/F in user.faction)
- if(F in target.faction)
- continue
targets += target
if(1) //single target can be picked
if(range < 0)
@@ -325,7 +382,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
revert_cast(user)
return
- perform(targets)
+ perform(targets, user=user)
return
@@ -340,7 +397,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
revert_cast()
return
- perform(targets)
+ perform(targets, user=user)
return
@@ -376,7 +433,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
return 0
if(ishuman(user))
-
var/mob/living/carbon/human/H = user
if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled())
@@ -385,15 +441,15 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/clothcheck = locate(/obj/effect/proc_holder/spell/noclothes) in user.mob_spell_list
var/clothcheck2 = user.mind && (locate(/obj/effect/proc_holder/spell/noclothes) in user.mind.spell_list)
if(clothes_req && !clothcheck && !clothcheck2) //clothes check
- if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard))
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
return 0
- if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard))
+ if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
return 0
else
- if(clothes_req)
+ if(clothes_req || human_req)
return 0
- if(isbrain(user) || ispAI(user))
+ if(nonabstract_req && (isbrain(user) || ispAI(user)))
return 0
return 1
diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm
index ad0b6fa61de..46def2b5a9c 100644
--- a/code/datums/spells/area_teleport.dm
+++ b/code/datums/spells/area_teleport.dm
@@ -1,10 +1,15 @@
/obj/effect/proc_holder/spell/targeted/area_teleport
name = "Area teleport"
desc = "This spell teleports you to a type of area of your selection."
-
+ nonabstract_req = 1
+
var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list
var/invocation_area = 1 //if the invocation appends the selected area
-/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1)
+
+ var/sound1 = 'sound/weapons/ZapBang.ogg'
+ var/sound2 = 'sound/weapons/ZapBang.ogg'
+
+/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1, mob/living/user = usr)
var/thearea = before_cast(targets)
if(!thearea || !cast_check(1))
revert_cast()
@@ -32,7 +37,8 @@
return thearea
-/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea)
+/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea,mob/living/user = usr)
+ playsound(get_turf(user), sound1, 50,1)
for(var/mob/living/target in targets)
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea.type))
@@ -64,7 +70,8 @@
break
if(!success)
- target.loc = pick(L)
+ target.forceMove(pick(L))
+ playsound(get_turf(user), sound2, 50,1)
return
diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm
index 7f6f4d4fb2a..0b23b12b9f2 100644
--- a/code/datums/spells/bloodcrawl.dm
+++ b/code/datums/spells/bloodcrawl.dm
@@ -14,8 +14,8 @@
/obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr)
for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user)))
- if(istype(target,/obj/effect/decal/cleanable/blood) && !(istype(target,/obj/effect/decal/cleanable/blood/oil) || istype(target,/obj/effect/decal/cleanable/blood/gibs/robot)))
- perform(target)
+ if(target.can_bloodcrawl_in())
+ perform(target, user = user)
return
revert_cast()
to_chat(user, "There must be a nearby source of blood! ")
diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm
index 1551dbc3b68..7f9a02bc01a 100644
--- a/code/datums/spells/charge.dm
+++ b/code/datums/spells/charge.dm
@@ -26,9 +26,9 @@
if(M.mind)
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
S.charge_counter = S.charge_max
- to_chat(M, "you feel raw magic flowing through you, it feels good! ")
+ to_chat(M, "You feel raw magical energy flowing through you, it feels good! ")
else
- to_chat(M, "you feel very strange for a moment, but then it passes. ")
+ to_chat(M, "You feel very strange for a moment, but then it passes. ")
burnt_out = 1
charged_item = M
break
@@ -62,11 +62,12 @@
break
else if(istype(item, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = item
- if(prob(80))
- C.maxcharge -= 200
- if(C.maxcharge <= 1) //Div by 0 protection
- C.maxcharge = 1
- burnt_out = 1
+ if(!C.self_recharge)
+ if(prob(80))
+ C.maxcharge -= 200
+ if(C.maxcharge <= 1) //Div by 0 protection
+ C.maxcharge = 1
+ burnt_out = 1
C.charge = C.maxcharge
charged_item = C
break
@@ -75,17 +76,18 @@
for(I in item.contents)
if(istype(I, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = I
- if(prob(80))
- C.maxcharge -= 200
- if(C.maxcharge <= 1) //Div by 0 protection
- C.maxcharge = 1
- burnt_out = 1
+ if(!C.self_recharge)
+ if(prob(80))
+ C.maxcharge -= 200
+ if(C.maxcharge <= 1) //Div by 0 protection
+ C.maxcharge = 1
+ burnt_out = 1
C.charge = C.maxcharge
item.update_icon()
charged_item = item
break
if(!charged_item)
- to_chat(L, "you feel magical power surging to your hands, but the feeling rapidly fades... ")
+ to_chat(L, "You feel magical power surging to your hands, but the feeling rapidly fades... ")
else if(burnt_out)
to_chat(L, "[charged_item] doesn't seem to be reacting to the spell... ")
else
diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm
index bdd15eb34fe..ebf9fa59fe8 100644
--- a/code/datums/spells/conjure.dm
+++ b/code/datums/spells/conjure.dm
@@ -13,15 +13,17 @@
var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet
//should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example
var/delay = 1//Go Go Gadget Inheritance
+
+ var/cast_sound = 'sound/items/welder.ogg'
-/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets)
-
+/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets,mob/living/user = usr)
+ playsound(get_turf(user), cast_sound, 50,1)
for(var/turf/T in targets)
if(T.density && !summon_ignore_density)
targets -= T
- playsound(get_turf(src), 'sound/items/welder.ogg', 50, 1)
+ playsound(get_turf(src), cast_sound, 50, 1)
- if(do_after(usr,delay, target = usr))
+ if(do_after(user, delay, target = user))
for(var/i=0,iYou can't build things on shuttles! ")
break
var/turf/O = spawn_place
var/N = summoned_object_type
@@ -42,6 +44,7 @@
for(var/varName in newVars)
if(varName in summoned_object.vars)
summoned_object.vars[varName] = newVars[varName]
+ summoned_object.admin_spawned = TRUE
if(summon_lifespan)
spawn(summon_lifespan)
diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm
index 8632b89df12..7ddbd85166d 100644
--- a/code/datums/spells/construct_spells.dm
+++ b/code/datums/spells/construct_spells.dm
@@ -6,7 +6,7 @@
action_background_icon_state = "bg_cult"
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor
- name = "Floor Construction"
+ name = "Summon Cult Floor"
desc = "This spell constructs a cult floor"
action_icon_state = "floorconstruct"
action_background_icon_state = "bg_cult"
@@ -20,7 +20,7 @@
centcom_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
- name = "Lesser Construction"
+ name = "Summon Cult Wall"
desc = "This spell constructs a cult wall"
action_icon_state = "lesserconstruct"
action_background_icon_state = "bg_cult"
@@ -30,7 +30,7 @@
invocation = "none"
invocation_type = "none"
range = 0
- summon_type = list(/turf/simulated/wall/cult)
+ summon_type = list(/turf/simulated/wall/cult/artificer) //we don't want artificer-based runed metal farms
centcom_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
diff --git a/code/datums/spells/dumbfire.dm b/code/datums/spells/dumbfire.dm
index 7b5c77b7d21..27969c9a1ab 100644
--- a/code/datums/spells/dumbfire.dm
+++ b/code/datums/spells/dumbfire.dm
@@ -28,7 +28,7 @@
if(new_turf.density)
break
T = new_turf
- perform(list(T))
+ perform(list(T), user = user)
/obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr)
@@ -46,7 +46,7 @@
projectile.dir = get_dir(projectile, target)
projectile.name = proj_name
- var/current_loc = usr.loc
+ var/current_loc = user.loc
projectile.loc = current_loc
@@ -63,7 +63,7 @@
projectile.cast(current_loc)
break
- var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - usr
+ var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - user
if(L && L.stat != DEAD)
projectile.cast(L.loc)
break
diff --git a/code/datums/spells/emplosion.dm b/code/datums/spells/emplosion.dm
index e27814a6fde..1ba430ad27e 100644
--- a/code/datums/spells/emplosion.dm
+++ b/code/datums/spells/emplosion.dm
@@ -7,7 +7,7 @@
action_icon_state = "emp"
-/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
empulse(target.loc, emp_heavy, emp_light)
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index b75cba1f858..b9ad3d22e70 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -10,6 +10,7 @@
range = -1
cooldown_min = 100 //50 deciseconds reduction per rank
include_user = 1
+ nonabstract_req = 1
centcom_cancast = 0 //Prevent people from getting to centcom
var phaseshift = 0
@@ -17,7 +18,7 @@
action_icon_state = "jaunt"
-/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets, mob/user = usr) //magnets, so mostly hardcoded
for(var/mob/living/target in targets)
if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains
to_chat(target, "You are somehow too bound to your current location to abandon it. ")
diff --git a/code/datums/spells/explosion.dm b/code/datums/spells/explosion.dm
index 7bb7195c2dd..4beeae1206a 100644
--- a/code/datums/spells/explosion.dm
+++ b/code/datums/spells/explosion.dm
@@ -7,7 +7,7 @@
var/ex_light = 3
var/ex_flash = 4
-/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
explosion(target.loc,ex_severe,ex_heavy,ex_light,ex_flash)
diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm
index e61819dc183..697337d85e0 100644
--- a/code/datums/spells/genetic.dm
+++ b/code/datums/spells/genetic.dm
@@ -15,7 +15,7 @@
6th bit - ?
*/
-/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
for(var/x in mutations)
diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm
index 3d2ab9d4718..b3ca73fe367 100644
--- a/code/datums/spells/horsemask.dm
+++ b/code/datums/spells/horsemask.dm
@@ -14,6 +14,7 @@
selection_type = "range"
action_icon_state = "barn"
+ sound = 'sound/magic/HorseHead_curse.ogg'
/obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr)
if(!targets.len)
diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm
index 1eed65bbed4..cfda930afd2 100644
--- a/code/datums/spells/inflict_handler.dm
+++ b/code/datums/spells/inflict_handler.dm
@@ -19,7 +19,7 @@
var/summon_type = null //this will put an obj at the target's location
-/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
switch(destroys)
diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm
index e2be52fb7db..1d296c26d41 100644
--- a/code/datums/spells/knock.dm
+++ b/code/datums/spells/knock.dm
@@ -11,8 +11,9 @@
cooldown_min = 20 //20 deciseconds reduction per rank
action_icon_state = "knock"
+ sound = 'sound/magic/Knock.ogg'
-/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets)
+/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/door/door in T.contents)
spawn(1)
diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm
index 00c04e5a792..257e98346d2 100644
--- a/code/datums/spells/lightning.dm
+++ b/code/datums/spells/lightning.dm
@@ -14,13 +14,16 @@
var/ready = 0
var/image/halo = null
action_icon_state = "lightning"
+ var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea.
+ var/damaging = TRUE
/obj/effect/proc_holder/spell/targeted/lightning/lightnian
clothes_req = 0
invocation_type = "none"
+ damaging = 0
/obj/effect/proc_holder/spell/targeted/lightning/Click()
- if(!ready && start_time==0)
+ if(!ready && start_time == 0)
if(cast_check())
StartChargeup()
else
@@ -31,10 +34,12 @@
/obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr)
ready = 1
to_chat(user, "You start gathering the power. ")
+ Snd = new/sound('sound/magic/lightning_chargeup.ogg', channel = 7)
halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER)
user.overlays.Add(halo)
+ playsound(get_turf(user), Snd, 50, 0)
start_time = world.time
- if(do_mob(user,user,100,uninterruptible=1))
+ if(do_mob(user, user, 100, uninterruptible=1))
if(ready)
Discharge()
@@ -58,27 +63,50 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
/obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr)
ready = 0
- var/mob/living/carbon/target = targets[1]
+ var/mob/living/target = targets[1]
+ Snd = sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck?
+ playsound(get_turf(user), Snd, 50, 0)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way.
if(get_dist(user,target)>range)
to_chat(user, "They are too far away! ")
Reset(user)
return
+ playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
user.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
var/energy = min(world.time - start_time,100)
- Bolt(user,target,max(15,energy/2),5,user) //5 bounces for energy/2 burn
+ if(damaging)
+ Bolt(user,target,max(15,energy/2),5,user) //5 bounces for energy/2 burn
+ else
+ var/bounces = round(energy/20)
+ Bolt(user,target,0,bounces,user)
Reset(user)
-/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin, mob/target, bolt_energy, bounces, mob/user = usr)
- origin.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
- var/mob/living/carbon/current = target
+/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin, mob/living/target, bolt_energy, bounces, mob/user = usr)
+ origin.Beam(target,icon_state="lightning[rand(1,12)]", icon='icons/effects/effects.dmi', time=5)
+ var/mob/living/current = target
if(bounces < 1)
- current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
- playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(damaging)
+ current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
+ else
+ current.AdjustJitter(1000) //High numbers for violent convulsions
+ current.do_jitter_animation(current.jitteriness)
+ current.AdjustStuttering(2)
+ current.Slowed(3)
+ spawn(20)
+ current.AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
+ playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1)
else
- current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
- playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(damaging)
+ current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
+ else
+ current.AdjustJitter(1000) //High numbers for violent convulsions
+ current.do_jitter_animation(current.jitteriness)
+ current.AdjustStuttering(2)
+ current.Slowed(3)
+ spawn(20)
+ current.AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
+ playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1)
var/list/possible_targets = new
for(var/mob/living/M in view_or_range(range,target,"view"))
if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not
diff --git a/code/datums/spells/magnet.dm b/code/datums/spells/magnet.dm
index 100dd881dde..8a6e9c525c4 100644
--- a/code/datums/spells/magnet.dm
+++ b/code/datums/spells/magnet.dm
@@ -12,34 +12,37 @@
random_target = 1
var/energy = 0
var/ready = 0
+ var/start_time = 0
var/image/halo = null
+ var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea.
action_icon_state = "tech"
/obj/effect/proc_holder/spell/targeted/magnet/Click()
- if(!ready)
+ if(!ready && start_time == 0)
if(cast_check())
StartChargeup()
else
- if(cast_check(skipcharge=1))
+ if(ready && cast_check(skipcharge=1))
choose_targets()
return 1
/obj/effect/proc_holder/spell/targeted/magnet/proc/StartChargeup(mob/user = usr)
ready = 1
to_chat(user, "You start gathering the power. ")
+ Snd = new/sound('sound/magic/lightning_chargeup.ogg', channel = 7)
halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER)
user.overlays.Add(halo)
- spawn(0)
- while(ready)
- sleep(1)
- energy++
- if(energy >= 100 && ready)
- Discharge()
+ playsound(get_turf(user), Snd, 50, 0)
+ start_time = world.time
+ if(do_mob(user, user, 100, uninterruptible=1))
+ if(ready)
+ Discharge()
obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr)
ready = 0
energy = 0
+ start_time = 0
if(halo)
user.overlays.Remove(halo)
@@ -50,16 +53,16 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr)
/obj/effect/proc_holder/spell/targeted/magnet/proc/Discharge(mob/user = usr)
var/mob/living/M = user
- //M.electrocute_act(25,"magnet Bolt")
to_chat(M, "You lose control over the power. ")
Reset(user)
start_recharge()
/obj/effect/proc_holder/spell/targeted/magnet/cast(list/targets, mob/user = usr)
-
- var/mob/living/carbon/target = targets[1]
-
+ ready = 0
+ var/mob/living/target = targets[1]
+ Snd = sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck?
+ playsound(get_turf(user), Snd, 50, 0)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way.
if(get_dist(user,target)>range)
to_chat(user, "They are too far away! ")
Reset(user)
@@ -88,13 +91,13 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr)
playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1)
if(75 to 100)
//CHAIN magnet
- Bolt(user,target,energy,user)
+ Bolt(user,target,energy,5,user)
Reset(user)
-/obj/effect/proc_holder/spell/targeted/magnet/proc/Bolt(mob/origin,mob/target,bolt_energy,mob/user = usr)
- origin.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
+/obj/effect/proc_holder/spell/targeted/magnet/proc/Bolt(mob/origin,mob/target,bolt_energy,bounces, mob/user = usr)
+ origin.Beam(target, icon_state="lightning", icon='icons/effects/effects.dmi', time=5)
var/mob/living/carbon/current = target
- if(bolt_energy < 75)
+ if(bounces < 1)
for(var/obj/item/I in target.l_hand)
if(I.flags & CONDUCT)
I.throw_at(user, I.throw_range, 4, target)
@@ -119,4 +122,4 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr)
return
var/mob/living/next = pick(possible_targets)
if(next)
- Bolt(current,next,bolt_energy-6,user) // 5 max bounces
\ No newline at end of file
+ Bolt(current,next,bolt_energy,bounces-1,user) // 5 max bounces
\ No newline at end of file
diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm
index fb996bc84ee..296521405a0 100644
--- a/code/datums/spells/mime.dm
+++ b/code/datums/spells/mime.dm
@@ -10,7 +10,9 @@
charge_max = 300
clothes_req = 0
range = 0
-
+ cast_sound = null
+ human_req = 1
+
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
@@ -34,6 +36,7 @@
charge_max = 3000
range = -1
include_user = 1
+ human_req = 1
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
diff --git a/code/datums/spells/projectile.dm b/code/datums/spells/projectile.dm
index 611c45b1595..258925653d8 100644
--- a/code/datums/spells/projectile.dm
+++ b/code/datums/spells/projectile.dm
@@ -37,7 +37,7 @@
projectile.dir = get_dir(target,projectile)
projectile.name = proj_name
- var/current_loc = usr.loc
+ var/current_loc = user.loc
projectile.loc = current_loc
@@ -75,7 +75,7 @@
qdel(trail)
if(projectile.loc in range(target.loc,proj_trigger_range))
- projectile.perform(list(target))
+ projectile.perform(list(target), user = user)
break
current_loc = projectile.loc
diff --git a/code/datums/spells/rathens.dm b/code/datums/spells/rathens.dm
index 4cbd19c41af..75ff2525c4d 100644
--- a/code/datums/spells/rathens.dm
+++ b/code/datums/spells/rathens.dm
@@ -33,7 +33,7 @@
H.apply_damage(10, BRUTE, "chest")
to_chat(H, "You have no appendix, but something had to give! Holy shit, what was that? ")
H.Weaken(3)
- for(var/obj/item/organ/external/E in H.organs)
+ for(var/obj/item/organ/external/E in H.bodyparts)
if(istype(E, /obj/item/organ/external/head))
continue
if(istype(E, /obj/item/organ/external/chest))
@@ -43,5 +43,3 @@
if(prob(7))
to_chat(H, "Your [E] was severed by the explosion! ")
E.droplimb(1, DROPLIMB_EDGE, 0, 1)
-
-
diff --git a/code/datums/spells/rod_form.dm b/code/datums/spells/rod_form.dm
new file mode 100644
index 00000000000..e51a994b7d2
--- /dev/null
+++ b/code/datums/spells/rod_form.dm
@@ -0,0 +1,46 @@
+/obj/effect/proc_holder/spell/targeted/rod_form
+ name = "Rod Form"
+ desc = "Take on the form of an immovable rod, destroying all in your path."
+ clothes_req = 1
+ human_req = 0
+ charge_max = 600
+ cooldown_min = 200
+ range = -1
+ include_user = 1
+ invocation = "CLANG!"
+ invocation_type = "shout"
+ action_icon_state = "immrod"
+
+ sound = 'sound/effects/whoosh.ogg'
+ var/rod_delay = 2
+
+/obj/effect/proc_holder/spell/targeted/rod_form/cast(list/targets,mob/user = usr)
+ for(var/mob/living/M in targets)
+ var/turf/start = get_turf(M)
+ var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3)), rod_delay)
+ W.wizard = M
+ W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell
+ W.start_turf = start
+ M.forceMove(W)
+ M.notransform = 1
+ M.status_flags |= GODMODE
+
+//Wizard Version of the Immovable Rod
+
+/obj/effect/immovablerod/wizard
+ var/max_distance = 13
+ var/mob/living/wizard
+ var/turf/start_turf
+ notify = FALSE
+
+/obj/effect/immovablerod/wizard/Move()
+ if(get_dist(start_turf, get_turf(src)) >= max_distance)
+ qdel(src)
+ ..()
+
+/obj/effect/immovablerod/wizard/Destroy()
+ if(wizard)
+ wizard.status_flags &= ~GODMODE
+ wizard.notransform = 0
+ wizard.forceMove(get_turf(src))
+ return ..()
diff --git a/code/datums/spells/shapeshift.dm b/code/datums/spells/shapeshift.dm
new file mode 100644
index 00000000000..a814c84fa59
--- /dev/null
+++ b/code/datums/spells/shapeshift.dm
@@ -0,0 +1,82 @@
+/obj/effect/proc_holder/spell/targeted/shapeshift
+ name = "Shapechange"
+ desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed."
+ clothes_req = 0
+ human_req = 0
+ charge_max = 200
+ cooldown_min = 50
+ range = -1
+ include_user = 1
+ invocation = "RAC'WA NO!"
+ invocation_type = "shout"
+ action_icon_state = "shapeshift"
+
+ var/shapeshift_type
+ var/list/current_shapes = list()
+ var/list/current_casters = list()
+ var/list/possible_shapes = list(/mob/living/simple_animal/mouse,
+ /mob/living/simple_animal/pet/corgi,
+ /mob/living/simple_animal/bot/ed209,
+ /mob/living/simple_animal/hostile/construct/armoured)
+
+/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets, mob/user = usr)
+ for(var/mob/living/M in targets)
+ if(!shapeshift_type)
+ var/list/animal_list = list()
+ for(var/path in possible_shapes)
+ var/mob/living/simple_animal/A = path
+ animal_list[initial(A.name)] = path
+ shapeshift_type = input(M, "Choose Your Animal Form!", "It's Morphing Time!", null) as anything in animal_list
+ if(!shapeshift_type) //If you aren't gonna decide I am!
+ shapeshift_type = pick(animal_list)
+ shapeshift_type = animal_list[shapeshift_type]
+ if(M in current_shapes)
+ Restore(M)
+ else
+ Shapeshift(M)
+
+/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Shapeshift(mob/living/caster)
+ for(var/mob/living/M in caster)
+ if(M.status_flags & GODMODE)
+ to_chat(caster, "You're already shapeshifted! ")
+ return
+
+ var/mob/living/shape = new shapeshift_type(caster.loc)
+ caster.loc = shape
+ caster.status_flags |= GODMODE
+
+ current_shapes |= shape
+ current_casters |= caster
+ clothes_req = 0
+ human_req = 0
+
+ caster.mind.transfer_to(shape)
+
+/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Restore(mob/living/shape)
+ var/mob/living/caster
+ for(var/mob/living/M in shape)
+ if(M in current_casters)
+ caster = M
+ break
+ if(!caster)
+ return
+ caster.loc = shape.loc
+ caster.status_flags &= ~GODMODE
+
+ clothes_req = initial(clothes_req)
+ human_req = initial(human_req)
+ current_casters.Remove(caster)
+ current_shapes.Remove(shape)
+
+ shape.mind.transfer_to(caster)
+ qdel(shape) //Gib it maybe ?
+
+/obj/effect/proc_holder/spell/targeted/shapeshift/dragon
+ name = "Dragon Form"
+ desc = "Take on the shape a lesser ash drake."
+ invocation = "RAAAAAAAAWR!"
+
+ shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
+ list/current_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
+ list/current_casters = list()
+ list/possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
\ No newline at end of file
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index ce68e7370dd..32472fe1ec0 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -15,9 +15,9 @@
action_icon_state = "summons"
-/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets)
- for(var/mob/living/user in targets)
- var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand())
+/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets, mob/user = usr)
+ for(var/mob/living/target in targets)
+ var/list/hand_items = list(target.get_active_hand(),target.get_inactive_hand())
var/butterfingers = 0
var/message
@@ -26,6 +26,10 @@
for(var/obj/item in hand_items)
if(istype(item, /obj/item/organ/internal/brain)) //Yeah, sadly this doesn't work due to the organ system.
break
+ if(ABSTRACT in item.flags)
+ continue
+ if(NODROP in item.flags)
+ message += "This feels very redundant, but you go through with it anyway. "
marked_item = item
message += "You mark [item] for recall. "
name = "Recall [item]"
@@ -36,6 +40,7 @@
message = "You aren't holding anything that can be marked for recall. "
else
message = "You must hold the desired item in your hands to mark it for recall. "
+
else if(marked_item && marked_item in hand_items) //unlinking item to the spell
message = "You remove the mark on [marked_item] to use elsewhere. "
name = "Instant Summons"
@@ -56,7 +61,7 @@
if(issilicon(M)) //Items in silicons warp the whole silicon
M.loc.visible_message("[M] suddenly disappears! ")
- M.loc = user.loc
+ M.loc = target.loc
M.loc.visible_message("[M] suddenly appears! ")
item_to_retrive = null
break
@@ -65,13 +70,13 @@
if(ishuman(M)) //Edge case housekeeping
var/mob/living/carbon/human/C = M
- /*if(C.internal_organs_by_name && item_to_retrive in C.internal_organs_by_name ) //This won't work, as we use organ datums instead of objects. --DZD
- C.internal_organs_by_name -= item_to_retrive
+ /*if(C.internal_bodyparts_by_name && item_to_retrive in C.internal_bodyparts_by_name ) //This won't work, as we use organ datums instead of objects. --DZD
+ C.internal_bodyparts_by_name -= item_to_retrive
if(istype(marked_item, /obj/item/brain)) //If this code ever runs I will be happy
- var/obj/item/brain/B = new /obj/item/brain(user.loc)
+ var/obj/item/brain/B = new /obj/item/brain(target.loc)
B.transfer_identity(C)
C.death()
- add_logs(user, C, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/
+ add_logs(target, C, "magically debrained", addition="INTENT: [uppertext(target.a_intent)]")*/
if(C.stomach_contents && item_to_retrive in C.stomach_contents)
C.stomach_contents -= item_to_retrive
@@ -91,19 +96,21 @@
item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly disappears! ")
- if(user.hand) //left active hand
- if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
- if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
+ if(target.hand) //left active hand
+ if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
+ if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
butterfingers = 1
else //right active hand
- if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
- if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
+ if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
+ if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
butterfingers = 1
if(butterfingers)
- item_to_retrive.loc = user.loc
+ item_to_retrive.loc = target.loc
item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears! ")
+ playsound(get_turf(target),'sound/magic/SummonItems_generic.ogg',50,1)
else
- item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [user]'s hand! ")
+ item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [target]'s hand! ")
+ playsound(get_turf(target),'sound/magic/SummonItems_generic.ogg',50,1)
if(message)
- to_chat(user, message)
+ to_chat(target, message)
diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm
index 6f659e5e98d..44993cb69b2 100644
--- a/code/datums/spells/touch_attacks.dm
+++ b/code/datums/spells/touch_attacks.dm
@@ -14,10 +14,10 @@
return 0
..()
-/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets)
- for(var/mob/living/carbon/user in targets)
+/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets, mob/user = usr)
+ for(var/mob/living/carbon/target in targets)
if(!attached_hand)
- if(!ChargeHand(user))
+ if(!ChargeHand(target))
return 0
while(attached_hand) //hibernate untill the spell is actually used
charge_counter = 0
diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm
index 0db9ae7d9a0..bba1f22cb1a 100644
--- a/code/datums/spells/trigger.dm
+++ b/code/datums/spells/trigger.dm
@@ -19,11 +19,11 @@
starting_spells = null
return ..()
-/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
for(var/obj/effect/proc_holder/spell/spell in contents)
- spell.perform(list(target),0)
+ spell.perform(list(target), 0, user = user)
for(var/obj/effect/proc_holder/spell/spell in linked_spells)
- spell.perform(list(target),0)
+ spell.perform(list(target), 0, user = user)
return
\ No newline at end of file
diff --git a/code/datums/spells/turf_teleport.dm b/code/datums/spells/turf_teleport.dm
index 02dd5f71b49..8d4562aa1dc 100644
--- a/code/datums/spells/turf_teleport.dm
+++ b/code/datums/spells/turf_teleport.dm
@@ -1,14 +1,19 @@
/obj/effect/proc_holder/spell/targeted/turf_teleport
name = "Turf Teleport"
desc = "This spell teleports the target to the turf in range."
+ nonabstract_req = 1
var/inner_tele_radius = 1
var/outer_tele_radius = 2
var/include_space = 0 //whether it includes space tiles in possible teleport locations
var/include_dense = 0 //whether it includes dense tiles in possible teleport locations
+
+ var/sound1 = 'sound/weapons/ZapBang.ogg'
+ var/sound2 = 'sound/weapons/ZapBang.ogg'
-/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets,mob/living/user = usr)
+ playsound(get_turf(user), sound1, 50,1)
for(var/mob/living/target in targets)
var/list/turfs = new/list()
for(var/turf/T in range(target,outer_tele_radius))
@@ -31,4 +36,5 @@
if(!picked || !isturf(picked))
return
- target.loc = picked
+ target.forceMove(picked)
+ playsound(get_turf(user), sound2, 50,1)
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index 33cc6b8d574..f8394771263 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -25,9 +25,12 @@
proj_trail_icon_state = "magicmd"
action_icon_state = "magicm"
+
+ sound = 'sound/magic/MAGIC_MISSILE.ogg'
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
amt_weakened = 3
+ sound = 'sound/magic/MM_Hit.ogg'
/obj/effect/proc_holder/spell/noclothes
name = "No Clothes"
@@ -42,7 +45,7 @@
clothes_req = 1
invocation = "BIRUZ BENNAR"
invocation_type = "shout"
- message = "\blue You feel strong! You feel a pressure building behind your eyes!"
+ message = "You feel strong! You feel a pressure building behind your eyes! "
range = -1
include_user = 1
centcom_cancast = 0
@@ -52,8 +55,9 @@
cooldown_min = 300 //25 deciseconds reduction per rank
action_icon_state = "mutate"
+ sound = 'sound/magic/Mutate.ogg'
-/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
target.dna.SetSEState(HULKBLOCK, 1)
genemutcheck(target, HULKBLOCK, null, MUTCHK_FORCED)
@@ -93,6 +97,8 @@
emp_heavy = 6
emp_light = 10
+
+ sound = 'sound/magic/Disable_Tech.ogg'
/obj/effect/proc_holder/spell/targeted/turf_teleport/blink
name = "Blink"
@@ -117,6 +123,9 @@
centcom_cancast = 0 //prevent people from getting to centcom
action_icon_state = "blink"
+
+ sound1 = 'sound/magic/blink.ogg'
+ sound2 = 'sound/magic/blink.ogg'
/obj/effect/proc_holder/spell/targeted/area_teleport/teleport
name = "Teleport"
@@ -135,6 +144,9 @@
smoke_amt = 5
action_icon_state = "spell_teleport"
+
+ sound1 = 'sound/magic/Teleport_diss.ogg'
+ sound2 = 'sound/magic/Teleport_app.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
name = "Forcewall"
@@ -152,6 +164,7 @@
summon_lifespan = 300
action_icon_state = "shield"
+ cast_sound = 'sound/magic/ForceWall.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
name = "Stop Time"
@@ -180,7 +193,8 @@
summon_type = list(/mob/living/simple_animal/hostile/carp)
-
+ cast_sound = 'sound/magic/Summon_Karp.ogg'
+
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
name = "Artificer"
desc = "This spell conjures a construct which may be controlled by Shades"
@@ -195,6 +209,7 @@
summon_type = list(/obj/structure/constructshell)
action_icon_state = "artificer"
+ cast_sound = 'sound/magic/SummonItems_generic.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
name = "Summon Creature Swarm"
@@ -209,6 +224,7 @@
range = 3
summon_type = list(/mob/living/simple_animal/hostile/creature)
+ cast_sound = 'sound/magic/SummonItems_generic.ogg'
/obj/effect/proc_holder/spell/targeted/trigger/blind
name = "Blind"
@@ -219,7 +235,7 @@
clothes_req = 0
invocation = "STI KALY"
invocation_type = "whisper"
- message = "\blue Your eyes cry out in pain!"
+ message = "Your eyes cry out in pain! "
cooldown_min = 50 //12 deciseconds reduction per rank
starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/targeted/genetic/blind")
@@ -229,12 +245,14 @@
/obj/effect/proc_holder/spell/targeted/inflict_handler/blind
amt_eye_blind = 10
amt_eye_blurry = 20
+ sound = 'sound/magic/Blind.ogg'
/obj/effect/proc_holder/spell/targeted/genetic/blind
disabilities = BLIND
duration = 300
+ sound = 'sound/magic/Blind.ogg'
-/obj/effect/proc_holder/spell/dumbfire/fireball
+/obj/effect/proc_holder/spell/fireball
name = "Fireball"
desc = "This spell fires a fireball at a target and does not require wizard garb."
@@ -245,29 +263,65 @@
invocation_type = "shout"
range = 20
cooldown_min = 20 //10 deciseconds reduction per rank
+ var/fireball_type = /obj/item/projectile/magic/fireball
+ action_icon_state = "fireball0"
+ sound = 'sound/magic/Fireball.ogg'
- proj_icon_state = "fireball"
- proj_name = "a fireball"
- proj_type = "/obj/effect/proc_holder/spell/turf/fireball"
+ active = FALSE
- proj_lifespan = 200
- proj_step_delay = 1
+/obj/effect/proc_holder/spell/fireball/Click()
+ var/mob/living/user = usr
+ if(!istype(user))
+ return
- action_icon_state = "fireball"
+ var/msg
-/obj/effect/proc_holder/spell/turf/fireball/cast(var/turf/T)
- explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
+ if(!can_cast(user))
+ msg = "You can no longer cast Fireball. "
+ remove_ranged_ability(user, msg)
+ return
+ if(active)
+ msg = "You extinguish your fireball...for now. "
+ remove_ranged_ability(user, msg)
+ else
+ msg = "Your prepare to cast your fireball spell! Left-click to cast at a target! "
+ add_ranged_ability(user, msg)
-/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball
- amt_dam_brute = 20
- amt_dam_fire = 25
+/obj/effect/proc_holder/spell/fireball/update_icon()
+ if(!action)
+ return
+ action.button_icon_state = "fireball[active]"
+ action.UpdateButtonIcon()
-/obj/effect/proc_holder/spell/targeted/explosion/fireball
- ex_severe = -1
- ex_heavy = -1
- ex_light = 2
- ex_flash = 5
+/obj/effect/proc_holder/spell/fireball/InterceptClickOn(mob/living/user, params, atom/target)
+ if(..())
+ return FALSE
+
+ if(!cast_check(0, user))
+ remove_ranged_ability(user)
+ return FALSE
+
+ var/list/targets = list(target)
+ perform(targets, user = user)
+
+ return TRUE
+
+/obj/effect/proc_holder/spell/fireball/cast(list/targets, mob/living/user = usr)
+ var/target = targets[1] //There is only ever one target for fireball
+ var/turf/T = user.loc
+ var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
+ if(!isturf(U) || !isturf(T))
+ return 0
+
+ var/obj/item/projectile/magic/fireball/FB = new fireball_type(user.loc)
+ FB.current = get_turf(user)
+ FB.preparePixelProjectile(target, get_turf(target), user)
+ FB.fire()
+ user.newtonian_move(get_dir(U, T))
+ remove_ranged_ability(user)
+
+ return 1
/obj/effect/proc_holder/spell/aoe_turf/repulse
name = "Repulse"
@@ -282,12 +336,13 @@
var/maxthrow = 5
action_icon_state = "repulse"
+ sound = 'sound/magic/Repulse.ogg'
-/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets)
- var/mob/user = usr
+/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
+ playMagSound()
for(var/turf/T in targets) //Done this way so things don't get thrown all around hilariously.
for(var/atom/movable/AM in T)
thrownatoms += AM
@@ -314,3 +369,24 @@
M.Weaken(2)
to_chat(M, "You're thrown back by a mystical force! ")
spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
+
+/obj/effect/proc_holder/spell/targeted/sacred_flame
+ name = "Sacred Flame"
+ desc = "Makes everyone around you more flammable, and lights yourself on fire."
+ charge_max = 60
+ clothes_req = 0
+ invocation = "FI'RAN DADISKO"
+ invocation_type = "shout"
+ max_targets = 0
+ range = 6
+ include_user = 1
+ selection_type = "view"
+ action_icon_state = "sacredflame"
+ sound = 'sound/magic/Fireball.ogg'
+
+/obj/effect/proc_holder/spell/targeted/sacred_flame/cast(list/targets, mob/user = usr)
+ for(var/mob/living/L in targets)
+ L.adjust_fire_stacks(20)
+ if(isliving(user))
+ var/mob/living/U = user
+ U.IgniteMob()
\ No newline at end of file
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 7a8f05e08fc..10f6c242d34 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -53,6 +53,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
var/contraband = 0
var/group = supply_misc
var/list/announce_beacons = list() // Particular beacons that we'll notify the relevant department when we reach
+ var/special = FALSE //Event/Station Goals/Admin enabled packs
+ var/special_enabled = FALSE
/datum/supply_packs/New()
@@ -324,6 +326,17 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/////// Weapons: Specialist
/datum/supply_packs/security/armory/ballistic
+ name = "Riot Shotguns Crate"
+ contains = list(/obj/item/weapon/gun/projectile/shotgun/riot,
+ /obj/item/weapon/gun/projectile/shotgun/riot,
+ /obj/item/weapon/gun/projectile/shotgun/riot,
+ /obj/item/weapon/storage/belt/bandolier,
+ /obj/item/weapon/storage/belt/bandolier,
+ /obj/item/weapon/storage/belt/bandolier)
+ cost = 50
+ containername = "riot shotgun crate"
+
+/datum/supply_packs/security/armory/ballisticauto
name = "Combat Shotguns Crate"
contains = list(/obj/item/weapon/gun/projectile/shotgun/automatic/combat,
/obj/item/weapon/gun/projectile/shotgun/automatic/combat,
@@ -331,13 +344,35 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/storage/belt/bandolier,
/obj/item/weapon/storage/belt/bandolier,
/obj/item/weapon/storage/belt/bandolier)
- cost = 20
+ cost = 80
containername = "combat shotgun crate"
+/datum/supply_packs/security/armory/buckshotammo
+ name = "Buckshot Ammo Crate"
+ contains = list(/obj/item/ammo_box/shotgun/buck,
+ /obj/item/weapon/storage/box/buck,
+ /obj/item/weapon/storage/box/buck,
+ /obj/item/weapon/storage/box/buck,
+ /obj/item/weapon/storage/box/buck,
+ /obj/item/weapon/storage/box/buck)
+ cost = 45
+ containername = "buckshot ammo crate"
+
+/datum/supply_packs/security/armory/slugammo
+ name = "Slug Ammo Crate"
+ contains = list(/obj/item/ammo_box/shotgun,
+ /obj/item/weapon/storage/box/slug,
+ /obj/item/weapon/storage/box/slug,
+ /obj/item/weapon/storage/box/slug,
+ /obj/item/weapon/storage/box/slug,
+ /obj/item/weapon/storage/box/slug)
+ cost = 45
+ containername = "slug ammo crate"
+
/datum/supply_packs/security/armory/expenergy
name = "Energy Guns Crate"
contains = list(/obj/item/weapon/gun/energy/gun,
- /obj/item/weapon/gun/energy/gun) // Only two guns to keep costs down
+ /obj/item/weapon/gun/energy/gun)
cost = 25
containertype = /obj/structure/closet/crate/secure/plasma
containername = "energy gun crate"
@@ -374,9 +409,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/////// Implants & etc
-/datum/supply_packs/security/armory/loyalty
+/datum/supply_packs/security/armory/mindshield
name = "Mindshield Implants Crate"
- contains = list (/obj/item/weapon/storage/lockbox/loyalty)
+ contains = list (/obj/item/weapon/storage/lockbox/mindshield)
cost = 40
containername = "mindshield implant crate"
@@ -429,6 +464,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
name = "HEADER"
group = supply_engineer
announce_beacons = list("Engineering" = list("Engineering", "Chief Engineer's Desk"))
+ containertype = /obj/structure/closet/crate/engineering
/datum/supply_packs/engineering/fueltank
@@ -456,6 +492,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/gloves/color/yellow)
cost = 20 //Made of pure-grade bullshittinium
containername = "insulated gloves crate"
+ containertype = /obj/structure/closet/crate/engineering/electrical
/datum/supply_packs/engineering/power
name = "Power Cell Crate"
@@ -464,6 +501,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/stock_parts/cell/high)
cost = 10
containername = "electrical maintenance crate"
+ containertype = /obj/structure/closet/crate/engineering/electrical
/datum/supply_packs/engineering/engiequipment
name = "Engineering Gear Crate"
@@ -510,6 +548,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/paper/solar)
cost = 20
containername = "solar pack crate"
+ containertype = /obj/structure/closet/crate/engineering/electrical
/datum/supply_packs/engineering/engine
name = "Emitter Crate"
@@ -519,6 +558,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containertype = /obj/structure/closet/crate/secure
containername = "emitter crate"
access = access_ce
+ containertype = /obj/structure/closet/crate/secure/engineering
/datum/supply_packs/engineering/engine/field_gen
name = "Field Generator Crate"
@@ -781,6 +821,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
name = "HEADER"
group = supply_science
announce_beacons = list("Research Division" = list("Science", "Research Director's Desk"))
+ containertype = /obj/structure/closet/crate/sci
/datum/supply_packs/science/robotics
name = "Robotics Assembly Crate"
@@ -792,7 +833,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/stock_parts/cell/high,
/obj/item/weapon/stock_parts/cell/high)
cost = 10
- containertype = /obj/structure/closet/crate/secure
+ containertype = /obj/structure/closet/crate/secure/scisec
containername = "robotics assembly crate"
access = access_robotics
announce_beacons = list("Research Division" = list("Robotics", "Research Director's Desk"))
@@ -804,18 +845,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/circuitboard/mecha/ripley/main, //TEMPORARY due to lack of circuitboard printer
/obj/item/weapon/circuitboard/mecha/ripley/peripherals) //TEMPORARY due to lack of circuitboard printer
cost = 30
- containertype = /obj/structure/closet/crate/secure
containername = "\improper APLU \"Ripley\" circuit crate"
- announce_beacons = list("Research Division" = list("Robotics", "Research Director's Desk"))
/datum/supply_packs/science/robotics/mecha_odysseus
name = "Circuit Crate (Odysseus)"
contains = list(/obj/item/weapon/circuitboard/mecha/odysseus/peripherals, //TEMPORARY due to lack of circuitboard printer
/obj/item/weapon/circuitboard/mecha/odysseus/main) //TEMPORARY due to lack of circuitboard printer
cost = 25
- containertype = /obj/structure/closet/crate/secure
containername = "\improper \"Odysseus\" circuit crate"
- announce_beacons = list("Research Division" = list("Robotics", "Research Director's Desk"))
/datum/supply_packs/science/plasma
name = "Plasma Assembly Crate"
@@ -844,7 +881,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen)
cost = 20
- containertype = /obj/structure/closet/crate/secure
+ containertype = /obj/structure/closet/crate/secure/scisec
containername = "shield generators crate"
access = access_teleporter
@@ -854,7 +891,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
contains = list(/obj/item/device/transfer_valve,
/obj/item/device/transfer_valve)
cost = 60
- containertype = /obj/structure/closet/crate/secure
+ containertype = /obj/structure/closet/crate/secure/scisec
containername = "tank transfer valves crate"
access = access_rd
@@ -905,28 +942,28 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/organic/farwa
name = "Farwa Crate"
- contains = list (/obj/item/weapon/storage/box/farwacubes)
- cost = 30
+ contains = list (/obj/item/weapon/storage/box/monkeycubes/farwacubes)
+ cost = 20
containername = "farwa crate"
/datum/supply_packs/organic/wolpin
name = "Wolpin Crate"
- contains = list (/obj/item/weapon/storage/box/wolpincubes)
- cost = 30
+ contains = list (/obj/item/weapon/storage/box/monkeycubes/wolpincubes)
+ cost = 20
containername = "wolpin crate"
/datum/supply_packs/organic/skrell
name = "Neaera Crate"
- contains = list (/obj/item/weapon/storage/box/neaeracubes)
- cost = 30
+ contains = list (/obj/item/weapon/storage/box/monkeycubes/neaeracubes)
+ cost = 20
containername = "neaera crate"
/datum/supply_packs/organic/stok
name = "Stok Crate"
- contains = list (/obj/item/weapon/storage/box/stokcubes)
- cost = 30
+ contains = list (/obj/item/weapon/storage/box/monkeycubes/stokcubes)
+ cost = 20
containername = "stok crate"
/datum/supply_packs/organic/party
@@ -1022,8 +1059,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/reagent_containers/glass/bottle/ammonia,
/obj/item/weapon/reagent_containers/glass/bottle/ammonia,
/obj/item/weapon/hatchet,
- /obj/item/weapon/minihoe,
- /obj/item/device/analyzer/plant_analyzer,
+ /obj/item/weapon/cultivator,
+ /obj/item/device/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/suit/apron) // Updated with new things
cost = 15
@@ -1042,35 +1079,39 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/organic/hydroponics/seeds
name = "Seeds Crate"
- contains = list(/obj/item/seeds/chiliseed,
- /obj/item/seeds/berryseed,
- /obj/item/seeds/cornseed,
- /obj/item/seeds/eggplantseed,
- /obj/item/seeds/tomatoseed,
- /obj/item/seeds/soyaseed,
- /obj/item/seeds/wheatseed,
- /obj/item/seeds/carrotseed,
- /obj/item/seeds/sunflowerseed,
- /obj/item/seeds/chantermycelium,
- /obj/item/seeds/potatoseed,
- /obj/item/seeds/sugarcaneseed)
+ contains = list(/obj/item/seeds/chili,
+ /obj/item/seeds/berry,
+ /obj/item/seeds/corn,
+ /obj/item/seeds/eggplant,
+ /obj/item/seeds/tomato,
+ /obj/item/seeds/soya,
+ /obj/item/seeds/wheat,
+ /obj/item/seeds/wheat/rice,
+ /obj/item/seeds/carrot,
+ /obj/item/seeds/sunflower,
+ /obj/item/seeds/chanter,
+ /obj/item/seeds/potato,
+ /obj/item/seeds/sugarcane)
cost = 10
containername = "seeds crate"
/datum/supply_packs/organic/hydroponics/exoticseeds
name = "Exotic Seeds Crate"
- contains = list(/obj/item/seeds/nettleseed,
+ contains = list(/obj/item/seeds/nettle,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
- /obj/item/seeds/plumpmycelium,
- /obj/item/seeds/libertymycelium,
- /obj/item/seeds/amanitamycelium,
- /obj/item/seeds/reishimycelium,
- /obj/item/seeds/bananaseed,
+ /obj/item/seeds/nymph,
+ /obj/item/seeds/nymph,
+ /obj/item/seeds/nymph,
+ /obj/item/seeds/plump,
+ /obj/item/seeds/liberty,
+ /obj/item/seeds/amanita,
+ /obj/item/seeds/reishi,
+ /obj/item/seeds/banana,
+ /obj/item/seeds/eggplant/eggy,
/obj/item/seeds/random,
- /obj/item/seeds/random,
- )
+ /obj/item/seeds/random)
cost = 15
containername = "exotic seeds crate"
@@ -1141,6 +1182,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containername = "glass sheets crate"
+/datum/supply_packs/materials/wood30
+ name = "30 Wood Planks Crate"
+ contains = list(/obj/item/stack/sheet/wood)
+ amount = 30
+ cost = 15
+ containername = "wood planks crate"
+
/datum/supply_packs/materials/cardboard50
name = "50 Cardboard Sheets Crate"
contains = list(/obj/item/stack/sheet/cardboard)
@@ -1158,7 +1206,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/materials/plastic30
name = "30 Plastic Sheets Crate"
- contains = list(/obj/item/stack/sheet/mineral/plastic)
+ contains = list(/obj/item/stack/sheet/plastic)
amount = 30
cost = 25
containername = "plastic sheets crate"
@@ -1181,10 +1229,17 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/watertank
name = "Water Tank Crate"
contains = list(/obj/structure/reagent_dispensers/watertank)
- cost = 8
+ cost = 6
containertype = /obj/structure/largecrate
containername = "water tank crate"
+/datum/supply_packs/misc/hightank
+ name = "High-Capacity Water Tank Crate"
+ contains = list(/obj/structure/reagent_dispensers/watertank/high)
+ cost = 12
+ containertype = /obj/structure/largecrate
+ containername = "high-capacity water tank crate"
+
/datum/supply_packs/misc/lasertag
name = "Laser Tag Crate"
contains = list(/obj/item/weapon/gun/energy/laser/redtag,
@@ -1393,6 +1448,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/head/collectable/flatcap,
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/head/collectable/kitty,
+ /obj/item/clothing/head/crown/fancy,
/obj/item/clothing/head/collectable/rabbitears,
/obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/collectable/hardhat,
@@ -1513,6 +1569,61 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 20
containername = "polo supply crate"
+///////////// Station Goals
+
+/datum/supply_packs/misc/bsa
+ name = "Bluespace Artillery Parts"
+ cost = 150
+ special = TRUE
+ contains = list(/obj/item/weapon/circuitboard/machine/bsa/front,
+ /obj/item/weapon/circuitboard/machine/bsa/middle,
+ /obj/item/weapon/circuitboard/machine/bsa/back,
+ /obj/item/weapon/circuitboard/computer/bsa_control
+ )
+ containername = "bluespace artillery parts crate"
+
+/datum/supply_packs/misc/dna_vault
+ name = "DNA Vault Parts"
+ cost = 120
+ special = TRUE
+ contains = list(
+ /obj/item/weapon/circuitboard/machine/dna_vault
+ )
+ containername = "dna vault parts crate"
+
+/datum/supply_packs/misc/dna_probes
+ name = "DNA Vault Samplers"
+ cost = 30
+ special = TRUE
+ contains = list(/obj/item/device/dna_probe,
+ /obj/item/device/dna_probe,
+ /obj/item/device/dna_probe,
+ /obj/item/device/dna_probe,
+ /obj/item/device/dna_probe
+ )
+ containername = "dna samplers crate"
+
+
+/datum/supply_packs/misc/shield_sat
+ name = "Shield Generator Satellite"
+ cost = 30
+ special = TRUE
+ contains = list(
+ /obj/machinery/satellite/meteor_shield,
+ /obj/machinery/satellite/meteor_shield,
+ /obj/machinery/satellite/meteor_shield
+ )
+ containername = "shield sat crate"
+
+
+/datum/supply_packs/misc/shield_sat_control
+ name = "Shield System Control Board"
+ cost = 50
+ special = TRUE
+ contains = list(
+ /obj/item/weapon/circuitboard/computer/sat_control
+ )
+ containername = "shield control board crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Vending /////////////////////////////////////////
@@ -1571,6 +1682,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containername = "snacks supply crate"
+/datum/supply_packs/vending/chinese
+ name = "Chinese Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/chinese,
+ /obj/item/weapon/vending_refill/chinese,
+ /obj/item/weapon/vending_refill/chinese)
+ cost = 15
+ containername = "chinese supply crate"
+
/datum/supply_packs/vending/cola
name = "Softdrinks Supply Crate"
contains = list(/obj/item/weapon/vending_refill/cola,
@@ -1585,4 +1704,4 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/vending_refill/cigarette,
/obj/item/weapon/vending_refill/cigarette)
cost = 15
- containername = "cigarette supply crate"
+ containername = "cigarette supply crate"
\ No newline at end of file
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 2c5b9375918..1cf08abebd0 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -305,7 +305,7 @@ var/list/uplink_items = list()
name = "Ambrosia Cruciatus Seeds"
desc = "Part of the notorious Ambrosia family, this species is nearly indistinguishable from Ambrosia Vulgaris- but its' branches contain a revolting toxin. Eight units are enough to drive victims insane."
reference = "BRO"
- item = /obj/item/seeds/ambrosiavulgarisseed/cruciatus
+ item = /obj/item/seeds/ambrosia/cruciatus
cost = 2
job = list("Botanist")
@@ -319,7 +319,7 @@ var/list/uplink_items = list()
cost = 6
job = list("Life Support Specialist")
-/datum/uplink_item/dangerous/energizedfireaxe
+/datum/uplink_item/jobspecific/energizedfireaxe
name = "Energized Fire Axe"
desc = "A fire axe with a massive electrical charge built into it. It can release this charge on its first victim and will be rather plain after that."
reference = "EFA"
@@ -347,6 +347,18 @@ var/list/uplink_items = list()
cost = 2
job = list("Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Virologist","Bartender")
+// Paper contact poison pen
+
+/datum/uplink_item/jobspecific/poison_pen
+ name = "Poison Pen"
+ desc = "Cutting edge of deadly writing implements technology, this gadget will infuse any piece of paper with delayed contact poison."
+ reference = "PP"
+ item = /obj/item/weapon/pen/poison
+ cost = 2
+ excludefrom = list(/datum/game_mode/nuclear)
+ job = list("Head of Personnel", "Quartermaster", "Cargo Technician")
+
+
// DANGEROUS WEAPONS
/datum/uplink_item/dangerous
diff --git a/code/datums/vr.dm b/code/datums/vr.dm
new file mode 100644
index 00000000000..4d31b6a2072
--- /dev/null
+++ b/code/datums/vr.dm
@@ -0,0 +1,15 @@
+/datum/map_template/vr
+ name = null
+ var/id = null // For blacklisting purposes, all vr levels need an id
+ var/description = "This is a placeholder. Please contact your virtual adminsitrator if you see this."
+ var/outfit = null
+
+ var/prefix = null
+ var/suffix = null
+
+/datum/map_template/vr/New()
+ if(!name && id)
+ name = id
+
+ mappath = prefix + suffix
+ ..(path = mappath)
\ No newline at end of file
diff --git a/code/datums/vr/level.dm b/code/datums/vr/level.dm
new file mode 100644
index 00000000000..d3feca26ad9
--- /dev/null
+++ b/code/datums/vr/level.dm
@@ -0,0 +1,16 @@
+/datum/map_template/vr/level
+ prefix = "_maps/map_files/vr/"
+
+/datum/map_template/vr/level/lobby
+ id = "lobby"
+ suffix = "lobby.dmm"
+ name = "Virtual Hub Facility"
+ description = "This is the lobby. The hub for all things VR."
+ outfit = /datum/outfit/vr/vr_basic
+
+/datum/map_template/vr/level/roman
+ id = "roman"
+ suffix = "blood_and_sand.dmm"
+ name = "Blood and Sand Arena"
+ description = "To the Death!"
+ outfit = /datum/outfit/vr/roman
\ No newline at end of file
diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm
index 7002f92061b..c87b2b455e7 100644
--- a/code/datums/weather/weather.dm
+++ b/code/datums/weather/weather.dm
@@ -20,6 +20,7 @@
var/weather_duration_upper = 1500 //See above - this is the highest possible duration
var/weather_sound
var/weather_overlay
+ var/weather_color = null
var/end_message = "The wind relents its assault. " //Displayed once the wather is over
var/end_duration = 300 //In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
@@ -28,8 +29,9 @@
var/area_type = /area/space //Types of area to affect
var/list/impacted_areas = list() //Areas to be affected by the weather, calculated when the weather begins
- var/target_level = MAIN_STATION //The z-level to affect
-
+ var/target_z = MAIN_STATION //The z-level to affect
+ var/list/protected_areas = list()//Areas that are protected and excluded from the affected areas.
+
var/overlay_layer = 10 //Since it's above everything else, this is the layer used by default. 2 is below mobs and walls if you need to use that.
var/aesthetic = FALSE //If the weather has no purpose other than looks
var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather
@@ -50,15 +52,20 @@
if(stage == STARTUP_STAGE)
return
stage = STARTUP_STAGE
+ var/list/affectareas = list()
for(var/V in get_areas(area_type))
+ affectareas += V
+ for(var/V in protected_areas)
+ affectareas -= get_areas(V)
+ for(var/V in affectareas)
var/area/A = V
- if(is_on_level_name(A,target_level))
+ if(is_on_level_name(A,target_z))
impacted_areas |= A
weather_duration = rand(weather_duration_lower, weather_duration_upper)
update_areas()
for(var/V in player_list)
var/mob/M = V
- if(is_on_level_name(M,target_level))
+ if(is_on_level_name(M,target_z))
if(telegraph_message)
to_chat(M, telegraph_message)
if(telegraph_sound)
@@ -72,7 +79,7 @@
update_areas()
for(var/V in player_list)
var/mob/M = V
- if(is_on_level_name(M,target_level))
+ if(is_on_level_name(M,target_z))
if(weather_message)
to_chat(M, weather_message)
if(weather_sound)
@@ -87,7 +94,7 @@
update_areas()
for(var/V in player_list)
var/mob/M = V
- if(is_on_level_name(M,target_level))
+ if(is_on_level_name(M,target_z))
if(end_message)
to_chat(M, end_message)
if(end_sound)
@@ -102,7 +109,7 @@
update_areas()
/datum/weather/proc/can_impact(mob/living/L) //Can this weather impact a mob?
- if(!is_on_level_name(L,target_level))
+ if(!is_on_level_name(L,target_z))
return
if(immunity_type in L.weather_immunities)
return
@@ -119,6 +126,7 @@
N.layer = overlay_layer
N.icon = 'icons/effects/weather_effects.dmi'
N.invisibility = 0
+ N.color = weather_color
switch(stage)
if(STARTUP_STAGE)
N.icon_state = telegraph_overlay
@@ -127,6 +135,7 @@
if(WIND_DOWN_STAGE)
N.icon_state = end_overlay
if(END_STAGE)
+ N.color = null
N.icon_state = initial(N.icon_state)
N.icon = 'icons/turf/areas.dmi'
N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial
diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm
index 90615896e6d..1581938bd96 100644
--- a/code/datums/weather/weather_types.dm
+++ b/code/datums/weather/weather_types.dm
@@ -16,7 +16,7 @@
end_duration = 0
area_type = /area
- target_level = MAIN_STATION
+ target_z = MAIN_STATION
overlay_layer = 2 //Covers floors only
immunity_type = "lava"
@@ -50,7 +50,7 @@
end_duration = 0
area_type = /area
- target_level = MAIN_STATION
+ target_z = MAIN_STATION
/datum/weather/advanced_darkness/update_areas()
for(var/V in impacted_areas)
@@ -87,7 +87,7 @@
end_overlay = "light_ash"
area_type = /area/mine/dangerous
- target_level = MINING
+ target_z = MINING
immunity_type = "ash"
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index 8fb989a8a4f..29bcf5a2160 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -6,24 +6,55 @@
/datum/wires/airlock
holder_type = /obj/machinery/door/airlock
wire_count = 12
+ window_x = 410
window_y = 570
var/const/AIRLOCK_WIRE_IDSCAN = 1
var/const/AIRLOCK_WIRE_MAIN_POWER1 = 2
-var/const/AIRLOCK_WIRE_MAIN_POWER2 = 4
-var/const/AIRLOCK_WIRE_DOOR_BOLTS = 8
-var/const/AIRLOCK_WIRE_BACKUP_POWER1 = 16
-var/const/AIRLOCK_WIRE_BACKUP_POWER2 = 32
-var/const/AIRLOCK_WIRE_OPEN_DOOR = 64
-var/const/AIRLOCK_WIRE_AI_CONTROL = 128
-var/const/AIRLOCK_WIRE_ELECTRIFY = 256
-var/const/AIRLOCK_WIRE_SAFETY = 512
-var/const/AIRLOCK_WIRE_SPEED = 1024
-var/const/AIRLOCK_WIRE_LIGHT = 2048
+var/const/AIRLOCK_WIRE_DOOR_BOLTS = 4
+var/const/AIRLOCK_WIRE_BACKUP_POWER1 = 8
+var/const/AIRLOCK_WIRE_OPEN_DOOR = 16
+var/const/AIRLOCK_WIRE_AI_CONTROL = 32
+var/const/AIRLOCK_WIRE_ELECTRIFY = 64
+var/const/AIRLOCK_WIRE_SAFETY = 128
+var/const/AIRLOCK_WIRE_SPEED = 256
+var/const/AIRLOCK_WIRE_LIGHT = 512
-/datum/wires/airlock/CanUse(var/mob/living/L)
+/datum/wires/airlock/GetWireName(index)
+ switch(index)
+ if(AIRLOCK_WIRE_IDSCAN)
+ return "ID Scan"
+
+ if(AIRLOCK_WIRE_MAIN_POWER1)
+ return "Primary Power"
+
+ if(AIRLOCK_WIRE_DOOR_BOLTS)
+ return "Door Bolts"
+
+ if(AIRLOCK_WIRE_BACKUP_POWER1)
+ return "Primary Backup Power"
+
+ if(AIRLOCK_WIRE_OPEN_DOOR)
+ return "Door State"
+
+ if(AIRLOCK_WIRE_AI_CONTROL)
+ return "AI Control"
+
+ if(AIRLOCK_WIRE_ELECTRIFY)
+ return "Electrification"
+
+ if(AIRLOCK_WIRE_ELECTRIFY)
+ return "Door Safeties"
+
+ if(AIRLOCK_WIRE_ELECTRIFY)
+ return "Door Timing"
+
+ if(AIRLOCK_WIRE_ELECTRIFY)
+ return "Bolt Lights"
+
+/datum/wires/airlock/CanUse(mob/living/L)
var/obj/machinery/door/airlock/A = holder
- if(!istype(L, /mob/living/silicon))
+ if(!issilicon(L))
if(A.isElectrified())
if(A.shock(L, 100))
return 0
@@ -31,26 +62,26 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
return 1
return 0
-/datum/wires/airlock/GetInteractWindow()
+/datum/wires/airlock/get_status()
+ . = ..()
var/obj/machinery/door/airlock/A = holder
var/haspower = A.arePowerSystemsOn()
- . += ..()
- . += text(" \n[] \n[] \n[] \n[] \n[] \n[] \n[]",
- (A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
- ((A.lights && haspower) ? "The door bolt lights are on." : "The door bolt lights are off!"),
- ((haspower) ? "The test light is on." : "The test light is off!"),
- ((A.aiControlDisabled==0 && !A.emagged && haspower) ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."),
- ((A.safe==0 && haspower) ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."),
- ((A.normalspeed==0 && haspower) ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."),
- ((A.emergency && haspower) ? "The emergency lights are on." : "The emergency lights are off."))
-/datum/wires/airlock/UpdateCut(var/index, var/mended)
+ . += "The door bolts [A.locked ? "have fallen!" : "look up."]"
+ . += "The door bolt lights are [(A.lights && haspower) ? "on." : "off!"]"
+ . += "The test light is [haspower ? "on." : "off!"]"
+ . += "The 'AI control allowed' light is [(A.aiControlDisabled == 0 && !A.emagged && haspower) ? "on" : "off"]."
+ . += "The 'Check Wiring' light is [(A.safe == 0 && haspower) ? "on" : "off"]."
+ . += "The 'Check Timing Mechanism' light is [(A.normalspeed == 0 && haspower) ? "on" : "off"]."
+ . += "The emergency lights are [(A.emergency && haspower) ? "on" : "off"]."
+
+/datum/wires/airlock/UpdateCut(index, mended)
var/obj/machinery/door/airlock/A = holder
switch(index)
if(AIRLOCK_WIRE_IDSCAN)
A.aiDisabledIdScanner = !mended
- if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2)
+ if(AIRLOCK_WIRE_MAIN_POWER1)
if(!mended)
//Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be crowbarred open, but bolts-raising will not work. Cutting these wires may electocute the user.
@@ -60,7 +91,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
A.regainMainPower()
A.shock(usr, 50)
- if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2)
+ if(AIRLOCK_WIRE_BACKUP_POWER1)
if(!mended)
//Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user.
@@ -113,8 +144,9 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(AIRLOCK_WIRE_LIGHT)
A.lights = mended
A.update_icon()
+ ..()
-/datum/wires/airlock/UpdatePulsed(var/index)
+/datum/wires/airlock/UpdatePulsed(index)
var/obj/machinery/door/airlock/A = holder
switch(index)
@@ -125,7 +157,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(A.emergency)
A.emergency = 0
A.update_icon()
- if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
+ if(AIRLOCK_WIRE_MAIN_POWER1)
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
A.loseMainPower()
if(AIRLOCK_WIRE_DOOR_BOLTS)
@@ -136,7 +168,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
else
A.unlock()
- if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2)
+ if(AIRLOCK_WIRE_BACKUP_POWER1)
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
A.loseBackupPower()
if(AIRLOCK_WIRE_AI_CONTROL)
@@ -176,4 +208,6 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(AIRLOCK_WIRE_LIGHT)
A.lights = !A.lights
- A.update_icon()
\ No newline at end of file
+ A.update_icon()
+
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm
index a31d075ecc7..f412e96b5ee 100644
--- a/code/datums/wires/alarm.dm
+++ b/code/datums/wires/alarm.dm
@@ -9,19 +9,37 @@ var/const/AALARM_WIRE_SYPHON = 4
var/const/AALARM_WIRE_AI_CONTROL = 8
var/const/AALARM_WIRE_AALARM = 16
+/datum/wires/alarm/GetWireName(index)
+ switch(index)
+ if(AALARM_WIRE_IDSCAN)
+ return "ID Scan"
+
+ if(AALARM_WIRE_POWER)
+ return "Power"
+
+ if(AALARM_WIRE_SYPHON)
+ return "Syphon"
+
+ if(AALARM_WIRE_AI_CONTROL)
+ return "AI Control"
+
+ if(AALARM_WIRE_AALARM)
+ return "Atmospherics Alarm"
-/datum/wires/alarm/CanUse(var/mob/living/L)
+/datum/wires/alarm/CanUse(mob/living/L)
var/obj/machinery/alarm/A = holder
if(A.wiresexposed)
return 1
return 0
-/datum/wires/alarm/GetInteractWindow()
+/datum/wires/alarm/get_status()
+ . = ..()
var/obj/machinery/alarm/A = holder
- . += ..()
- . += text(" \n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")] \n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")] \n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
+ . += "The Air Alarm is [A.locked ? "" : "un"]locked."
+ . += "The Air Alarm is [(A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "offline." : "working properly!"]"
+ . += "The 'AI control allowed' light is [A.aidisabled ? "off" : "on"]."
-/datum/wires/alarm/UpdateCut(var/index, var/mended)
+/datum/wires/alarm/UpdateCut(index, mended)
var/obj/machinery/alarm/A = holder
switch(index)
if(AALARM_WIRE_IDSCAN)
@@ -50,8 +68,9 @@ var/const/AALARM_WIRE_AALARM = 16
if(A.alarm_area.atmosalert(2, A))
A.post_alert(2)
A.update_icon()
+ ..()
-/datum/wires/alarm/UpdatePulsed(var/index)
+/datum/wires/alarm/UpdatePulsed(index)
var/obj/machinery/alarm/A = holder
switch(index)
if(AALARM_WIRE_IDSCAN)
@@ -92,3 +111,4 @@ var/const/AALARM_WIRE_AALARM = 16
if(A.alarm_area.atmosalert(0, A))
A.post_alert(0)
A.update_icon()
+ ..()
diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm
index ff566bb7e6d..a1ef61513fb 100644
--- a/code/datums/wires/apc.dm
+++ b/code/datums/wires/apc.dm
@@ -7,19 +7,35 @@ var/const/APC_WIRE_MAIN_POWER1 = 2
var/const/APC_WIRE_MAIN_POWER2 = 4
var/const/APC_WIRE_AI_CONTROL = 8
-/datum/wires/apc/GetInteractWindow()
+/datum/wires/apc/GetWireName(index)
+ switch(index)
+ if(APC_WIRE_IDSCAN)
+ return "ID Scan"
+
+ if(APC_WIRE_MAIN_POWER1)
+ return "Primary Power"
+
+ if(APC_WIRE_MAIN_POWER2)
+ return "Secondary Power"
+
+ if(APC_WIRE_AI_CONTROL)
+ return "AI Control"
+
+/datum/wires/apc/get_status()
+ . = ..()
var/obj/machinery/power/apc/A = holder
- . += ..()
- . += text(" \n[(A.locked ? "The APC is locked." : "The APC is unlocked.")] \n[(A.shorted ? "The APCs power has been shorted." : "The APC is working properly!")] \n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
+ . += "The APC is [A.locked ? "" : "un"]locked."
+ . += A.shorted ? "The APCs power has been shorted." : "The APC is working properly!"
+ . += "The 'AI control allowed' light is [A.aidisabled ? "off" : "on"]."
-/datum/wires/apc/CanUse(var/mob/living/L)
+/datum/wires/apc/CanUse(mob/living/L)
var/obj/machinery/power/apc/A = holder
if(A.wiresexposed)
return 1
return 0
-/datum/wires/apc/UpdatePulsed(var/index)
+/datum/wires/apc/UpdatePulsed(index)
var/obj/machinery/power/apc/A = holder
@@ -51,9 +67,9 @@ var/const/APC_WIRE_AI_CONTROL = 8
A.aidisabled = 0
A.updateDialog()
- A.updateDialog()
+ ..()
-/datum/wires/apc/UpdateCut(var/index, var/mended)
+/datum/wires/apc/UpdateCut(index, mended)
var/obj/machinery/power/apc/A = holder
switch(index)
@@ -75,4 +91,4 @@ var/const/APC_WIRE_AI_CONTROL = 8
else
if(A.aidisabled == 1)
A.aidisabled = 0
- A.updateDialog()
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm
index 77a8ce6c03c..644a472acf3 100644
--- a/code/datums/wires/autolathe.dm
+++ b/code/datums/wires/autolathe.dm
@@ -1,5 +1,4 @@
/datum/wires/autolathe
-
holder_type = /obj/machinery/autolathe
wire_count = 10
@@ -7,10 +6,23 @@ var/const/AUTOLATHE_HACK_WIRE = 1
var/const/AUTOLATHE_SHOCK_WIRE = 2
var/const/AUTOLATHE_DISABLE_WIRE = 4
-/datum/wires/autolathe/GetInteractWindow()
+/datum/wires/autolathe/GetWireName(index)
+ switch(index)
+ if(AUTOLATHE_HACK_WIRE)
+ return "Hack"
+
+ if(AUTOLATHE_SHOCK_WIRE)
+ return "Shock"
+
+ if(AUTOLATHE_DISABLE_WIRE)
+ return "Disable"
+
+/datum/wires/autolathe/get_status()
+ . = ..()
var/obj/machinery/autolathe/A = holder
- . += ..()
- . += text(" The red light is [A.disabled ? "off" : "on"]. The green light is [A.shocked ? "off" : "on"]. The blue light is [A.hacked ? "off" : "on"]. ")
+ . += "The red light is [A.disabled ? "off" : "on"]."
+ . += "The green light is [A.shocked ? "off" : "on"]."
+ . += "The blue light is [A.hacked ? "off" : "on"]."
/datum/wires/autolathe/CanUse()
var/obj/machinery/autolathe/A = holder
@@ -18,11 +30,6 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
return 1
return 0
-/datum/wires/autolathe/Interact(var/mob/living/user)
- if(CanUse(user))
- var/obj/machinery/autolathe/V = holder
- V.attack_hand(user)
-
/datum/wires/autolathe/UpdateCut(index, mended)
var/obj/machinery/autolathe/A = holder
switch(index)
@@ -32,6 +39,7 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
A.shocked = !mended
if(AUTOLATHE_DISABLE_WIRE)
A.disabled = !mended
+ ..()
/datum/wires/autolathe/UpdatePulsed(index)
if(IsIndexCut(index))
@@ -40,19 +48,27 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
switch(index)
if(AUTOLATHE_HACK_WIRE)
A.adjust_hacked(!A.hacked)
+ updateUIs()
spawn(50)
if(A && !IsIndexCut(index))
A.adjust_hacked(0)
- Interact(usr)
+ updateUIs()
if(AUTOLATHE_SHOCK_WIRE)
A.shocked = !A.shocked
+ updateUIs()
spawn(50)
if(A && !IsIndexCut(index))
A.shocked = 0
- Interact(usr)
+ updateUIs()
if(AUTOLATHE_DISABLE_WIRE)
A.disabled = !A.disabled
+ updateUIs()
spawn(50)
if(A && !IsIndexCut(index))
A.disabled = 0
- Interact(usr)
\ No newline at end of file
+ updateUIs()
+
+/datum/wires/autolathe/proc/updateUIs()
+ nanomanager.update_uis(src)
+ if(holder)
+ nanomanager.update_uis(holder)
\ No newline at end of file
diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm
index f6ffd2ed427..ee25f8c3898 100644
--- a/code/datums/wires/camera.dm
+++ b/code/datums/wires/camera.dm
@@ -5,17 +5,15 @@
holder_type = /obj/machinery/camera
wire_count = 6
-/datum/wires/camera/GetInteractWindow()
-
+/datum/wires/camera/get_status()
. = ..()
var/obj/machinery/camera/C = holder
- . += " \n[(C.view_range == initial(C.view_range) ? "The focus light is on." : "The focus light is off.")]"
- . += " \n[(C.can_use() ? "The power link light is on." : "The power link light is off.")]"
- . += " \n[(C.light_disabled ? "The camera light is off." : "The camera light is on.")]"
- . += " \n[(C.alarm_on ? "The alarm light is on." : "The alarm light is off.")]"
- return .
+ . += "The focus light is [(C.view_range == initial(C.view_range)) ? "on" : "off"]."
+ . += "The power link light is [C.can_use() ? "on" : "off"]."
+ . += "The camera light is [C.light_disabled ? "off" : "on"]."
+ . += "The alarm light is [C.alarm_on ? "on" : "off"]."
-/datum/wires/camera/CanUse(var/mob/living/L)
+/datum/wires/camera/CanUse(mob/living/L)
var/obj/machinery/camera/C = holder
if(!C.panel_open)
return 0
@@ -28,7 +26,27 @@ var/const/CAMERA_WIRE_ALARM = 8
var/const/CAMERA_WIRE_NOTHING1 = 16
var/const/CAMERA_WIRE_NOTHING2 = 32
-/datum/wires/camera/UpdateCut(var/index, var/mended)
+/datum/wires/camera/GetWireName(index)
+ switch(index)
+ if(CAMERA_WIRE_FOCUS)
+ return "Focus"
+
+ if(CAMERA_WIRE_POWER)
+ return "Power"
+
+ if(CAMERA_WIRE_LIGHT)
+ return "Light"
+
+ if(CAMERA_WIRE_ALARM)
+ return "Alarm"
+
+ if(CAMERA_WIRE_NOTHING1)
+ return "Nothing"
+
+ if(CAMERA_WIRE_NOTHING2)
+ return "Nothing"
+
+/datum/wires/camera/UpdateCut(index, mended)
var/obj/machinery/camera/C = holder
switch(index)
@@ -48,9 +66,9 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
C.triggerCameraAlarm()
else
C.cancelCameraAlarm()
- return
+ ..()
-/datum/wires/camera/UpdatePulsed(var/index)
+/datum/wires/camera/UpdatePulsed(index)
var/obj/machinery/camera/C = holder
if(IsIndexCut(index))
return
@@ -67,7 +85,7 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
if(CAMERA_WIRE_ALARM)
C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
- return
+ ..()
/datum/wires/camera/proc/CanDeconstruct()
if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index d653729dfd3..db397d63d42 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -3,27 +3,34 @@
var/const/WIRE_EXPLODE = 1
+/datum/wires/explosive/GetWireName(index)
+ switch(index)
+ if(WIRE_EXPLODE)
+ return "Explode"
+
/datum/wires/explosive/proc/explode()
return
-/datum/wires/explosive/UpdatePulsed(var/index)
+/datum/wires/explosive/UpdatePulsed(index)
switch(index)
if(WIRE_EXPLODE)
explode()
+ ..()
-/datum/wires/explosive/UpdateCut(var/index, var/mended)
+/datum/wires/explosive/UpdateCut(index, mended)
switch(index)
if(WIRE_EXPLODE)
if(!mended)
explode()
+ ..()
/datum/wires/explosive/gibtonite
holder_type = /obj/item/weapon/twohanded/required/gibtonite
-/datum/wires/explosive/gibtonite/CanUse(var/mob/living/L)
+/datum/wires/explosive/gibtonite/CanUse(mob/L)
return 1
-/datum/wires/explosive/gibtonite/UpdateCut(var/index, var/mended)
+/datum/wires/explosive/gibtonite/UpdateCut(index, mended)
return
/datum/wires/explosive/gibtonite/explode()
diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm
index 7b59479720d..cbc92497f33 100644
--- a/code/datums/wires/mulebot.dm
+++ b/code/datums/wires/mulebot.dm
@@ -2,6 +2,7 @@
random = 1
holder_type = /mob/living/simple_animal/bot/mulebot
wire_count = 10
+ window_x = 410
var/const/WIRE_POWER1 = 1 // power connections
var/const/WIRE_POWER2 = 2
@@ -13,30 +14,54 @@ var/const/WIRE_REMOTE_RX = 64 // remote recv functions
var/const/WIRE_REMOTE_TX = 128 // remote trans status
var/const/WIRE_BEACON_RX = 256 // beacon ping recv
-/datum/wires/mulebot/CanUse(var/mob/living/L)
+/datum/wires/mulebot/GetWireName(index)
+ switch(index)
+ if(WIRE_POWER1)
+ return "Primary Power"
+
+ if(WIRE_POWER2)
+ return "Secondary Power"
+
+ if(WIRE_AVOIDANCE)
+ return "Mob Avoidance"
+
+ if(WIRE_LOADCHECK)
+ return "Load Checking"
+
+ if(WIRE_MOTOR1)
+ return "Primary Motor"
+
+ if(WIRE_MOTOR2)
+ return "Secondary Motor"
+
+ if(WIRE_REMOTE_RX)
+ return "Remote Signal Receiver"
+
+ if(WIRE_REMOTE_TX)
+ return "Remote Signal Sender"
+
+ if(WIRE_BEACON_RX)
+ return "Navigation Beacon Receiver"
+
+/datum/wires/mulebot/CanUse(mob/living/L)
var/mob/living/simple_animal/bot/mulebot/M = holder
if(M.open)
return 1
return 0
-// So the wires do not open a new window, handle the interaction ourselves.
-/datum/wires/mulebot/Interact(var/mob/living/user)
- if(CanUse(user))
- var/mob/living/simple_animal/bot/mulebot/M = holder
- M.interact(user)
-
-/datum/wires/mulebot/UpdatePulsed(var/index)
+/datum/wires/mulebot/UpdatePulsed(index)
switch(index)
if(WIRE_POWER1, WIRE_POWER2)
- holder.visible_message("\blue [bicon(holder)] The charge light flickers.")
+ holder.visible_message("[bicon(holder)] The charge light flickers. ")
if(WIRE_AVOIDANCE)
- holder.visible_message("\blue [bicon(holder)] The external warning lights flash briefly.")
+ holder.visible_message("[bicon(holder)] The external warning lights flash briefly. ")
if(WIRE_LOADCHECK)
- holder.visible_message("\blue [bicon(holder)] The load platform clunks.")
+ holder.visible_message("[bicon(holder)] The load platform clunks. ")
if(WIRE_MOTOR1, WIRE_MOTOR2)
- holder.visible_message("\blue [bicon(holder)] The drive motor whines briefly.")
+ holder.visible_message("[bicon(holder)] The drive motor whines briefly. ")
else
- holder.visible_message("\blue [bicon(holder)] You hear a radio crackle.")
+ holder.visible_message("[bicon(holder)] You hear a radio crackle. ")
+ ..()
// HELPER PROCS
diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm
index 0297bea8508..2034c59576b 100644
--- a/code/datums/wires/nuclearbomb.dm
+++ b/code/datums/wires/nuclearbomb.dm
@@ -7,53 +7,66 @@ var/const/NUCLEARBOMB_WIRE_LIGHT = 1
var/const/NUCLEARBOMB_WIRE_TIMING = 2
var/const/NUCLEARBOMB_WIRE_SAFETY = 4
-/datum/wires/nuclearbomb/CanUse(var/mob/living/L)
+/datum/wires/nuclearbomb/GetWireName(index)
+ switch(index)
+ if(NUCLEARBOMB_WIRE_LIGHT)
+ return "Bomb Light"
+
+ if(NUCLEARBOMB_WIRE_TIMING)
+ return "Bomb Timing"
+
+ if(NUCLEARBOMB_WIRE_SAFETY)
+ return "Bomb Safety"
+
+/datum/wires/nuclearbomb/CanUse(mob/living/L)
var/obj/machinery/nuclearbomb/N = holder
if(N.panel_open)
return 1
return 0
-/datum/wires/nuclearbomb/GetInteractWindow()
+/datum/wires/nuclearbomb/get_status()
+ . = ..()
var/obj/machinery/nuclearbomb/N = holder
- . += ..()
- . += " The device is [N.timing ? "shaking!" : "still."] "
- . += "The device is is [N.safety ? "quiet" : "whirring"]. "
- . += "The lights are [N.lighthack ? "static" : "functional"]. "
+ . += "The device is [N.timing ? "shaking!" : "still."]"
+ . += "The device is is [N.safety ? "quiet" : "whirring"]."
+ . += "The lights are [N.lighthack ? "static" : "functional"]."
-/datum/wires/nuclearbomb/UpdatePulsed(var/index)
+/datum/wires/nuclearbomb/UpdatePulsed(index)
var/obj/machinery/nuclearbomb/N = holder
switch(index)
if(NUCLEARBOMB_WIRE_LIGHT)
N.lighthack = !N.lighthack
+ updateUIs()
spawn(100)
N.lighthack = !N.lighthack
+ updateUIs()
if(NUCLEARBOMB_WIRE_TIMING)
if(N.timing)
- spawn
- message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (JMP )")
- N.explode()
+ message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (JMP )")
+ N.explode()
if(NUCLEARBOMB_WIRE_SAFETY)
N.safety = !N.safety
+ updateUIs()
spawn(100)
N.safety = !N.safety
if(N.safety == 1)
if(!N.is_syndicate)
set_security_level(N.previous_level)
- N.visible_message("\blue The [N] quiets down.")
+ N.visible_message("The [N] quiets down. ")
if(!N.lighthack)
if(N.icon_state == "nuclearbomb2")
N.icon_state = "nuclearbomb1"
else
- N.visible_message("\blue The [N] emits a quiet whirling noise!")
-
-/datum/wires/nuclearbomb/UpdateCut(var/index, var/mended)
+ N.visible_message("The [N] emits a quiet whirling noise! ")
+ updateUIs()
+
+/datum/wires/nuclearbomb/UpdateCut(index, mended)
var/obj/machinery/nuclearbomb/N = holder
switch(index)
if(NUCLEARBOMB_WIRE_SAFETY)
if(N.timing)
- spawn
- message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (JMP )")
- N.explode()
+ message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (JMP )")
+ N.explode()
if(NUCLEARBOMB_WIRE_TIMING)
if(!N.lighthack)
if(N.icon_state == "nuclearbomb2")
@@ -62,3 +75,8 @@ var/const/NUCLEARBOMB_WIRE_SAFETY = 4
bomb_set = 0
if(NUCLEARBOMB_WIRE_LIGHT)
N.lighthack = !N.lighthack
+
+/datum/wires/nuclearbomb/proc/updateUIs()
+ nanomanager.update_uis(src)
+ if(holder)
+ nanomanager.update_uis(holder)
\ No newline at end of file
diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm
index 53a166a79e7..1ed68b799f4 100644
--- a/code/datums/wires/particle_accelerator.dm
+++ b/code/datums/wires/particle_accelerator.dm
@@ -6,15 +6,28 @@ var/const/PARTICLE_TOGGLE_WIRE = 1 // Toggles whether the PA is on or not.
var/const/PARTICLE_STRENGTH_WIRE = 2 // Determines the strength of the PA.
var/const/PARTICLE_INTERFACE_WIRE = 4 // Determines the interface showing up.
var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
-//var/const/PARTICLE_NOTHING_WIRE = 16 // Blank wire
-/datum/wires/particle_acc/control_box/CanUse(var/mob/living/L)
+/datum/wires/particle_acc/control_box/GetWireName(index)
+ switch(index)
+ if(PARTICLE_TOGGLE_WIRE)
+ return "Power Toggle"
+
+ if(PARTICLE_STRENGTH_WIRE)
+ return "Strength"
+
+ if(PARTICLE_INTERFACE_WIRE)
+ return "Interface"
+
+ if(PARTICLE_LIMIT_POWER_WIRE)
+ return "Maximum Power"
+
+/datum/wires/particle_acc/control_box/CanUse(mob/living/L)
var/obj/machinery/particle_accelerator/control_box/C = holder
if(C.construction_state == 2)
return 1
return 0
-/datum/wires/particle_acc/control_box/UpdatePulsed(var/index)
+/datum/wires/particle_acc/control_box/UpdatePulsed(index)
var/obj/machinery/particle_accelerator/control_box/C = holder
switch(index)
@@ -29,8 +42,9 @@ var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
if(PARTICLE_LIMIT_POWER_WIRE)
C.visible_message("[bicon(C)][C] makes a large whirring noise.")
+ ..()
-/datum/wires/particle_acc/control_box/UpdateCut(var/index, var/mended)
+/datum/wires/particle_acc/control_box/UpdateCut(index, mended)
var/obj/machinery/particle_accelerator/control_box/C = holder
switch(index)
@@ -49,4 +63,5 @@ var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
if(PARTICLE_LIMIT_POWER_WIRE)
C.strength_upper_limit = (mended ? 2 : 3)
if(C.strength_upper_limit < C.strength)
- C.remove_strength()
\ No newline at end of file
+ C.remove_strength()
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm
index 6c2fb9713da..ffbff381060 100644
--- a/code/datums/wires/radio.dm
+++ b/code/datums/wires/radio.dm
@@ -6,13 +6,24 @@ var/const/WIRE_SIGNAL = 1
var/const/WIRE_RECEIVE = 2
var/const/WIRE_TRANSMIT = 4
-/datum/wires/radio/CanUse(var/mob/living/L)
+/datum/wires/radio/GetWireName(index)
+ switch(index)
+ if(WIRE_SIGNAL)
+ return "Signal"
+
+ if(WIRE_RECEIVE)
+ return "Receiver"
+
+ if(WIRE_TRANSMIT)
+ return "Transmitter"
+
+/datum/wires/radio/CanUse(mob/living/L)
var/obj/item/device/radio/R = holder
if(R.b_stat)
return 1
return 0
-/datum/wires/radio/UpdatePulsed(var/index)
+/datum/wires/radio/UpdatePulsed(index)
var/obj/item/device/radio/R = holder
switch(index)
if(WIRE_SIGNAL)
@@ -24,8 +35,9 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT)
R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL)
+ ..()
-/datum/wires/radio/UpdateCut(var/index, var/mended)
+/datum/wires/radio/UpdateCut(index, mended)
var/obj/item/device/radio/R = holder
switch(index)
if(WIRE_SIGNAL)
@@ -37,3 +49,4 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT)
R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL)
+ ..()
diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm
index 082cdd9d6d6..bc03e80c327 100644
--- a/code/datums/wires/robot.dm
+++ b/code/datums/wires/robot.dm
@@ -19,16 +19,32 @@ var/const/BORG_WIRE_CAMERA = 4
var/const/BORG_WIRE_AI_CONTROL = 8 // Not used on MoMMIs
var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
-/datum/wires/robot/GetInteractWindow()
+/datum/wires/robot/GetWireName(index)
+ switch(index)
+ if(BORG_WIRE_MAIN_POWER)
+ return "Main Power"
+
+ if(BORG_WIRE_LOCKED_DOWN)
+ return "Lockdown"
+
+ if(BORG_WIRE_CAMERA)
+ return "Camera"
+
+ if(BORG_WIRE_AI_CONTROL)
+ return "AI Control"
+
+ if(BORG_WIRE_LAWCHECK)
+ return "Law Check"
+/datum/wires/robot/get_status()
. = ..()
var/mob/living/silicon/robot/R = holder
- . += text(" \n[(R.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")] \n[(R.connected_ai ? "The AI link light is on." : "The AI link light is off.")]")
- . += text(" \n[((!isnull(R.camera) && R.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")] \n")
- . += text(" \n[(R.lockcharge ? "The lockdown light is on." : "The lockdown light is off.")]")
- return .
+ . += "The LawSync light is [R.lawupdate ? "on" : "off"]."
+ . += "The AI link light is [R.connected_ai ? "on" : "off"]."
+ . += "The Camera light is [(R.camera && R.camera.status == 1) ? "on" : "off"]."
+ . += "The lockdown light is [R.lockcharge ? "on" : "off"]."
-/datum/wires/robot/UpdateCut(var/index, var/mended)
+/datum/wires/robot/UpdateCut(index, mended)
var/mob/living/silicon/robot/R = holder
switch(index)
@@ -57,9 +73,10 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
if(BORG_WIRE_LOCKED_DOWN)
R.SetLockdown(!mended)
+ ..()
-/datum/wires/robot/UpdatePulsed(var/index)
+/datum/wires/robot/UpdatePulsed(index)
var/mob/living/silicon/robot/R = holder
switch(index)
@@ -76,8 +93,9 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
if(BORG_WIRE_LOCKED_DOWN)
R.SetLockdown(!R.lockcharge) // Toggle
+ ..()
-/datum/wires/robot/CanUse(var/mob/living/L)
+/datum/wires/robot/CanUse(mob/living/L)
var/mob/living/silicon/robot/R = holder
if(R.wiresexposed)
return 1
diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm
index b611497e796..53b33e0fd72 100644
--- a/code/datums/wires/smartfridge.dm
+++ b/code/datums/wires/smartfridge.dm
@@ -10,9 +10,20 @@ var/const/SMARTFRIDGE_WIRE_ELECTRIFY = 1
var/const/SMARTFRIDGE_WIRE_THROW = 2
var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
-/datum/wires/smartfridge/CanUse(var/mob/living/L)
+/datum/wires/smartfridge/GetWireName(index)
+ switch(index)
+ if(SMARTFRIDGE_WIRE_ELECTRIFY)
+ return "Electrification"
+
+ if(SMARTFRIDGE_WIRE_THROW)
+ return "Item Throw"
+
+ if(SMARTFRIDGE_WIRE_IDSCAN)
+ return "ID Scan"
+
+/datum/wires/smartfridge/CanUse(mob/living/L)
var/obj/machinery/smartfridge/S = holder
- if(!istype(L, /mob/living/silicon))
+ if(!issilicon(L))
if(S.seconds_electrified)
if(S.shock(L, 100))
return 0
@@ -20,14 +31,14 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
return 1
return 0
-/datum/wires/smartfridge/GetInteractWindow()
+/datum/wires/smartfridge/get_status()
+ . = ..()
var/obj/machinery/smartfridge/S = holder
- . += ..()
- . += " The orange light is [S.seconds_electrified ? "off" : "on"]. "
- . += "The red light is [S.shoot_inventory ? "off" : "blinking"]. "
- . += "A [S.scan_id ? "purple" : "yellow"] light is on. "
+ . += "The orange light is [S.seconds_electrified ? "off" : "on"]."
+ . += "The red light is [S.shoot_inventory ? "off" : "blinking"]."
+ . += "A [S.scan_id ? "purple" : "yellow"] light is on."
-/datum/wires/smartfridge/UpdatePulsed(var/index)
+/datum/wires/smartfridge/UpdatePulsed(index)
var/obj/machinery/smartfridge/S = holder
switch(index)
if(SMARTFRIDGE_WIRE_THROW)
@@ -36,8 +47,9 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
S.seconds_electrified = 30
if(SMARTFRIDGE_WIRE_IDSCAN)
S.scan_id = !S.scan_id
+ ..()
-/datum/wires/smartfridge/UpdateCut(var/index, var/mended)
+/datum/wires/smartfridge/UpdateCut(index, mended)
var/obj/machinery/smartfridge/S = holder
switch(index)
if(SMARTFRIDGE_WIRE_THROW)
@@ -49,3 +61,4 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
S.seconds_electrified = -1
if(SMARTFRIDGE_WIRE_IDSCAN)
S.scan_id = 1
+ ..()
diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm
index 3fa81883fce..d1fe6217058 100644
--- a/code/datums/wires/syndicatebomb.dm
+++ b/code/datums/wires/syndicatebomb.dm
@@ -9,14 +9,30 @@ var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut
var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active
var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut
+/datum/wires/syndicatebomb/GetWireName(index)
+ switch(index)
+ if(WIRE_BOOM)
+ return "Explode"
+
+ if(WIRE_UNBOLT)
+ return "Unbolt"
+
+ if(WIRE_DELAY)
+ return "Delay"
+
+ if(WIRE_PROCEED)
+ return "Proceed"
+
+ if(WIRE_ACTIVATE)
+ return "Activate"
-/datum/wires/syndicatebomb/CanUse(var/mob/living/L)
+/datum/wires/syndicatebomb/CanUse(mob/living/L)
var/obj/machinery/syndicatebomb/P = holder
if(P.open_panel)
return 1
return 0
-/datum/wires/syndicatebomb/UpdatePulsed(var/index)
+/datum/wires/syndicatebomb/UpdatePulsed(index)
var/obj/machinery/syndicatebomb/P = holder
switch(index)
if(WIRE_BOOM)
@@ -47,8 +63,9 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
else
P.loc.visible_message("[bicon(holder)] The bomb seems to hesitate for a moment. ")
P.timer += 5
+ ..()
-/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
+/datum/wires/syndicatebomb/UpdateCut(index, mended)
var/obj/machinery/syndicatebomb/P = holder
switch(index)
if(WIRE_EXPLODE)
@@ -58,7 +75,7 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
P.timer = 0
else
P.defused = 1
- if(mended)
+ else
P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage
if(WIRE_UNBOLT)
if(!mended && P.anchored)
@@ -74,4 +91,5 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
P.loc.visible_message("[bicon(holder)] The timer stops! The bomb has been defused! ")
P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]"
P.active = 0
- P.defused = 1
\ No newline at end of file
+ P.defused = 1
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/tesla_coil.dm b/code/datums/wires/tesla_coil.dm
new file mode 100644
index 00000000000..ed60e927f45
--- /dev/null
+++ b/code/datums/wires/tesla_coil.dm
@@ -0,0 +1,23 @@
+/datum/wires/tesla_coil
+ wire_count = 1
+ holder_type = /obj/machinery/power/tesla_coil
+
+var/const/WIRE_ZAP = 1
+
+/datum/wires/tesla_coil/GetWireName(index)
+ switch(index)
+ if(WIRE_ZAP)
+ return "Zap"
+
+/datum/wires/tesla_coil/CanUse(mob/living/L)
+ var/obj/machinery/power/tesla_coil/T = holder
+ if(T && T.panel_open)
+ return 1
+ return 0
+
+/datum/wires/tesla_coil/UpdatePulsed(index)
+ var/obj/machinery/power/tesla_coil/T = holder
+ switch(index)
+ if(WIRE_ZAP)
+ T.zap()
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 574c7961e09..286ac454efc 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -9,7 +9,21 @@ var/const/VENDING_WIRE_CONTRABAND = 2
var/const/VENDING_WIRE_ELECTRIFY = 4
var/const/VENDING_WIRE_IDSCAN = 8
-/datum/wires/vending/CanUse(var/mob/living/L)
+/datum/wires/vending/GetWireName(index)
+ switch(index)
+ if(VENDING_WIRE_THROW)
+ return "Item Throw"
+
+ if(VENDING_WIRE_CONTRABAND)
+ return "Contraband"
+
+ if(VENDING_WIRE_ELECTRIFY)
+ return "Electrification"
+
+ if(VENDING_WIRE_IDSCAN)
+ return "ID Scan"
+
+/datum/wires/vending/CanUse(mob/living/L)
var/obj/machinery/vending/V = holder
if(!istype(L, /mob/living/silicon))
if(V.seconds_electrified)
@@ -19,15 +33,15 @@ var/const/VENDING_WIRE_IDSCAN = 8
return 1
return 0
-/datum/wires/vending/GetInteractWindow()
+/datum/wires/vending/get_status()
+ . = ..()
var/obj/machinery/vending/V = holder
- . += ..()
- . += " The orange light is [V.seconds_electrified ? "on" : "off"]. "
- . += "The red light is [V.shoot_inventory ? "off" : "blinking"]. "
- . += "The green light is [(V.categories & CAT_HIDDEN) ? "on" : "off"]. "
- . += "A [V.scan_id ? "purple" : "yellow"] light is on. "
+ . += "The orange light is [V.seconds_electrified ? "on" : "off"]."
+ . += "The red light is [V.shoot_inventory ? "off" : "blinking"]."
+ . += "The green light is [(V.categories & CAT_HIDDEN) ? "on" : "off"]."
+ . += "A [V.scan_id ? "purple" : "yellow"] light is on."
-/datum/wires/vending/UpdatePulsed(var/index)
+/datum/wires/vending/UpdatePulsed(index)
var/obj/machinery/vending/V = holder
switch(index)
if(VENDING_WIRE_THROW)
@@ -38,8 +52,9 @@ var/const/VENDING_WIRE_IDSCAN = 8
V.seconds_electrified = 30
if(VENDING_WIRE_IDSCAN)
V.scan_id = !V.scan_id
+ ..()
-/datum/wires/vending/UpdateCut(var/index, var/mended)
+/datum/wires/vending/UpdateCut(index, mended)
var/obj/machinery/vending/V = holder
switch(index)
if(VENDING_WIRE_THROW)
@@ -52,4 +67,5 @@ var/const/VENDING_WIRE_IDSCAN = 8
else
V.seconds_electrified = -1
if(VENDING_WIRE_IDSCAN)
- V.scan_id = 1
\ No newline at end of file
+ V.scan_id = 1
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 6d8866640e4..a8baf7ad2fb 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -26,7 +26,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
var/window_x = 370
var/window_y = 470
-/datum/wires/New(var/atom/holder)
+/datum/wires/New(atom/holder)
..()
src.holder = holder
if(!istype(holder, holder_type))
@@ -68,106 +68,110 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
src.wires[colour] = index
//wires = shuffle(wires)
+/datum/wires/proc/get_status()
+ return list()
-/datum/wires/proc/Interact(var/mob/living/user)
+/datum/wires/proc/Interact(mob/user)
+ if(user && istype(user) && holder && CanUse(user))
+ ui_interact(user)
- var/html = null
- if(holder && CanUse(user))
- html = GetInteractWindow()
- if(html)
- user.set_machine(holder)
- else
- user.unset_machine()
- // No content means no window.
- user << browse(null, "window=wires")
- return
- var/datum/browser/popup = new(user, "wires", holder.name, window_x, window_y)
- popup.set_content(html)
- popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state))
- popup.open()
+/datum/wires/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "wires.tmpl", holder.name, window_x, window_y)
+ ui.open()
-/datum/wires/proc/GetInteractWindow()
- var/html = ""
- html += "
Exposed Wires "
- html += "
"
- html += "
"
+ W[++W.len] = list("colour" = capitalize(colour), "cut" = IsColourCut(colour), "index" = can_see_wire_index(user) ? GetWireName(GetIndex(colour)) : null, "attached" = IsAttached(colour))
- return html
+ if(W.len > 0)
+ data["wires"] = W
+
+ var/list/status = get_status()
+ data["status_len"] = status.len
+ data["status"] = status
+
+ return data
+
+/datum/wires/nano_host()
+ return holder
+
+/datum/wires/proc/can_see_wire_index(mob/user)
+ if(user.can_admin_interact())
+ return TRUE
+ else if(istype(user.get_active_hand(), /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = user.get_active_hand()
+ if(M.shows_wire_information)
+ return TRUE
+
+ return FALSE
/datum/wires/Topic(href, href_list)
- ..()
- if(in_range(holder, usr) && isliving(usr))
+ if(..())
+ return 1
- var/mob/living/L = usr
- if(CanUse(L) && href_list["action"])
- var/obj/item/I = L.get_active_hand()
- holder.add_hiddenprint(L)
- if(href_list["cut"]) // Toggles the cut/mend status
- if(istype(I, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 20, 1)
- var/colour = href_list["cut"]
+ var/mob/L = usr
+ if(CanUse(L) && href_list["action"])
+ var/obj/item/I = L.get_active_hand()
+ var/colour = lowertext(href_list["wire"])
+ holder.add_hiddenprint(L)
+ switch(href_list["action"])
+ if("cut") // Toggles the cut/mend status
+ if(istype(I, /obj/item/weapon/wirecutters) || L.can_admin_interact())
+ if(istype(I))
+ playsound(holder, I.usesound, 20, 1)
CutWireColour(colour)
else
to_chat(L, "You need wirecutters! ")
-
- else if(href_list["pulse"])
- if(istype(I, /obj/item/device/multitool))
+ if("pulse")
+ if(istype(I, /obj/item/device/multitool) || L.can_admin_interact())
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
- var/colour = href_list["pulse"]
PulseColour(colour)
else
to_chat(L, "You need a multitool! ")
-
- else if(href_list["attach"])
- var/colour = href_list["attach"]
- // Detach
+ if("attach")
if(IsAttached(colour))
var/obj/item/O = Detach(colour)
if(O)
L.put_in_hands(O)
-
- // Attach
else
if(istype(I, /obj/item/device/assembly/signaler))
- L.drop_item()
- Attach(colour, I)
+ if(L.drop_item())
+ Attach(colour, I)
+ else
+ to_chat(L, "[L.get_active_hand()] is stuck to your hand! ")
else
to_chat(L, "You need a remote signaller! ")
-
-
-
- // Update Window
- Interact(usr)
-
- if(href_list["close"])
- usr << browse(null, "window=wires")
- usr.unset_machine(holder)
+ nanomanager.update_uis(src)
+ return 1
//
// Overridable Procs
//
// Called when wires cut/mended.
-/datum/wires/proc/UpdateCut(var/index, var/mended)
- return
+/datum/wires/proc/UpdateCut(index, mended)
+ if(holder)
+ nanomanager.update_uis(holder)
// Called when wire pulsed. Add code here.
-/datum/wires/proc/UpdatePulsed(var/index)
- return
+/datum/wires/proc/UpdatePulsed(index)
+ if(holder)
+ nanomanager.update_uis(holder)
-/datum/wires/proc/CanUse(var/mob/living/L)
+/datum/wires/proc/CanUse(mob/L)
return 1
+/datum/wires/CanUseTopic(mob/user, datum/topic_state/state)
+ if(!CanUse(user))
+ return STATUS_CLOSE
+ return ..()
+
// Example of use:
/*
@@ -194,47 +198,50 @@ var/const/POWER = 8
// Helper Procs
//
-/datum/wires/proc/PulseColour(var/colour)
+/datum/wires/proc/PulseColour(colour)
PulseIndex(GetIndex(colour))
-/datum/wires/proc/PulseIndex(var/index)
+/datum/wires/proc/PulseIndex(index)
if(IsIndexCut(index))
return
UpdatePulsed(index)
-/datum/wires/proc/GetIndex(var/colour)
+/datum/wires/proc/GetIndex(colour)
if(wires[colour])
var/index = wires[colour]
return index
else
CRASH("[colour] is not a key in wires.")
+
+/datum/wires/proc/GetWireName(index)
+ return
//
// Is Index/Colour Cut procs
//
-/datum/wires/proc/IsColourCut(var/colour)
+/datum/wires/proc/IsColourCut(colour)
var/index = GetIndex(colour)
return IsIndexCut(index)
-/datum/wires/proc/IsIndexCut(var/index)
+/datum/wires/proc/IsIndexCut(index)
return (index & wires_status)
//
// Signaller Procs
//
-/datum/wires/proc/IsAttached(var/colour)
+/datum/wires/proc/IsAttached(colour)
if(signallers[colour])
return 1
return 0
-/datum/wires/proc/GetAttached(var/colour)
+/datum/wires/proc/GetAttached(colour)
if(signallers[colour])
return signallers[colour]
return null
-/datum/wires/proc/Attach(var/colour, var/obj/item/device/assembly/signaler/S)
+/datum/wires/proc/Attach(colour, obj/item/device/assembly/signaler/S)
if(colour && S)
if(!IsAttached(colour))
signallers[colour] = S
@@ -242,7 +249,7 @@ var/const/POWER = 8
S.connected = src
return S
-/datum/wires/proc/Detach(var/colour)
+/datum/wires/proc/Detach(colour)
if(colour)
var/obj/item/device/assembly/signaler/S = GetAttached(colour)
if(S)
@@ -252,7 +259,7 @@ var/const/POWER = 8
return S
-/datum/wires/proc/Pulse(var/obj/item/device/assembly/signaler/S)
+/datum/wires/proc/Pulse(obj/item/device/assembly/signaler/S)
for(var/colour in signallers)
if(S == signallers[colour])
@@ -264,11 +271,11 @@ var/const/POWER = 8
// Cut Wire Colour/Index procs
//
-/datum/wires/proc/CutWireColour(var/colour)
+/datum/wires/proc/CutWireColour(colour)
var/index = GetIndex(colour)
CutWireIndex(index)
-/datum/wires/proc/CutWireIndex(var/index)
+/datum/wires/proc/CutWireIndex(index)
if(IsIndexCut(index))
wires_status &= ~index
UpdateCut(index, 1)
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index fb9bc232e12..2bc6b59e1d0 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -48,6 +48,12 @@
var/message = "[key_name(whom, 1, include_name)](? )[isAntag(whom) ? "(A) " : ""][isLivingSSD(whom) ? "(SSD!) " : ""] ([admin_jump_link(whom)])"
return message
+/proc/key_name_mentor(var/whom, var/include_name = 1)
+ // Same as key_name_admin, but does not include (?) or (A) for antags.
+ var/message = "[key_name(whom, 1, include_name)] [isLivingSSD(whom) ? "(SSD!) " : ""] ([admin_jump_link(whom)])"
+ return message
+
+
/proc/log_and_message_admins(var/message as text)
log_admin("[key_name(usr)] " + message)
message_admins("[key_name_admin(usr)] " + message)
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index 6c9387644b0..f2655a32281 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -1,8 +1,7 @@
/var/datum/announcement/minor/minor_announcement = new()
/var/datum/announcement/priority/priority_announcement = new(do_log = 0)
-/var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 1)
-/var/datum/announcement/priority/enemy/communications_announcement = new(do_log = 0, do_newscast = 1)
-
+/var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 0)
+/var/datum/announcement/priority/command/event/event_announcement = new(do_log = 0, do_newscast = 0)
/datum/announcement
var/title = "Attention"
@@ -12,7 +11,8 @@
var/newscast = 0
var/channel_name = "Station Announcements"
var/announcement_type = "Announcement"
- var/disable_newscasts = 1 // Bay also adds announcements to their newscaster system - set this to 0 to also use that system
+ var/admin_announcement = 0 // Admin announcements are received regardless of being in range of a radio, unless you're in the lobby to prevent metagaming
+ var/language = "Galactic Common"
/datum/announcement/New(var/do_log = 0, var/new_sound = null, var/do_newscast = 0)
sound = new_sound
@@ -31,22 +31,23 @@
/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0)
..(do_log, new_sound, do_newscast)
+ admin_announcement = 1
title = "[command_name()] Update"
announcement_type = "[command_name()] Update"
-/datum/announcement/priority/enemy/New(var/do_log = 1, var/new_sound = sound('sound/AI/intercept2.ogg'), var/do_newscast = 0)
+/datum/announcement/priority/command/event/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0)
..(do_log, new_sound, do_newscast)
- title = "[command_name()] Update"
- announcement_type = "Enemy Communications"
+ admin_announcement = 0
/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0)
..(do_log, new_sound, do_newscast)
title = "Security Announcement"
announcement_type = "Security Announcement"
-/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, var/from)
+/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0, var/from, var/msg_language)
if(!message)
return
+
var/tmp/message_title = new_title ? new_title : title
var/tmp/message_sound = new_sound ? sound(new_sound) : sound
@@ -54,62 +55,101 @@
message = trim_strip_html_properly(message, allow_lines = 1)
message_title = html_encode(message_title)
- Message(message, message_title, from)
+ var/message_announcer = null
+ if(announcer)
+ message_announcer = html_encode(announcer)
+
+ var/datum/language/message_language = all_languages[msg_language ? msg_language : language]
+
+ var/list/combined_receivers = Get_Receivers(message_language)
+ var/list/receivers = combined_receivers[1]
+ var/list/garbled_receivers = combined_receivers[2]
+
+ var/formatted_message = Format_Message(message, message_title, message_announcer, from)
+ var/garbled_formatted_message = Format_Message(message_language.scramble(message), message_language.scramble(message_title), message_language.scramble(message_announcer), message_language.scramble(from))
+
+ Message(formatted_message, garbled_formatted_message, receivers, garbled_receivers)
+
if(do_newscast)
NewsCast(message, message_title)
- Sound(message_sound)
+
+ Sound(message_sound, combined_receivers[1] + combined_receivers[2])
Log(message, message_title)
-/datum/announcement/proc/Message(message as text, message_title as text)
- for(var/mob/M in player_list)
- if(M.can_hear())
- to_chat(M, "[title] ")
- to_chat(M, "[message] ")
- if(announcer)
- to_chat(M, " -[html_encode(announcer)] ")
+/datum/announcement/proc/Get_Receivers(var/datum/language/message_language)
+ var/list/receivers = list()
+ var/list/garbled_receivers = list()
-/datum/announcement/minor/Message(message as text, message_title as text)
- to_chat(world, "[message_title] ")
- to_chat(world, "[message] ")
+ if(admin_announcement)
+ for(var/mob/M in player_list)
+ if(!isnewplayer(M) && M.client)
+ receivers |= M
+ else
+ for(var/obj/item/device/radio/R in global_radios)
+ receivers |= R.send_announcement()
+ for(var/mob/M in receivers)
+ if(!istype(M) || !M.client || M.stat || !M.can_hear())
+ receivers -= M
+ continue
+ if(!M.say_understands(null, message_language))
+ receivers -= M
+ garbled_receivers |= M
+ for(var/mob/M in dead_mob_list)
+ if(M.client && M.stat == DEAD)
+ receivers |= M
-/datum/announcement/priority/Message(message as text, message_title as text)
- to_chat(world, "[message_title] ")
- to_chat(world, "[message] ")
- if(announcer)
- to_chat(world, " -[html_encode(announcer)] ")
- to_chat(world, " ")
+ return list(receivers, garbled_receivers)
-/datum/announcement/priority/command/Message(message as text, message_title as text)
- var/command
- command += "[command_name()] Update "
+/datum/announcement/proc/Message(message, garbled_message, receivers, garbled_receivers)
+ for(var/mob/M in receivers)
+ to_chat(M, message)
+ for(var/mob/M in garbled_receivers)
+ to_chat(M, garbled_message)
+
+/datum/announcement/proc/Format_Message(message, message_title, message_announcer, from)
+ var/formatted_message
+ formatted_message += "[message_title] "
+ formatted_message += "[message] "
+ if(message_announcer)
+ formatted_message += " -[message_announcer] "
+
+ return formatted_message
+
+/datum/announcement/minor/Format_Message(message, message_title, message_announcer, from)
+ var/formatted_message
+ formatted_message += "[message_title] "
+ formatted_message += "[message] "
+
+ return formatted_message
+
+/datum/announcement/priority/Format_Message(message, message_title, message_announcer, from)
+ var/formatted_message
+ formatted_message += "[message_title] "
+ formatted_message += "[message] "
+ if(message_announcer)
+ formatted_message += " -[message_announcer] "
+ formatted_message += " "
+
+ return formatted_message
+
+/datum/announcement/priority/command/Format_Message(message, message_title, message_announcer, from)
+ var/formatted_message
+ formatted_message += "[from] "
if(message_title)
- command += "[message_title] "
+ formatted_message += "[message_title] "
+ formatted_message += "[message] "
+ formatted_message += " "
- command += "[message] "
- command += " "
- for(var/mob/M in player_list)
- if(M.can_hear())
- to_chat(M, command)
+ return formatted_message
-/datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text)
- var/command
- command += "[from] "
- if(message_title)
- command += "[message_title] "
+/datum/announcement/priority/security/Format_Message(message, message_title, message_announcer, from)
+ var/formatted_message
+ formatted_message += "[message_title] "
+ formatted_message += "[message] "
- command += "[message] "
- command += " "
- for(var/mob/M in player_list)
- if(M.can_hear())
- to_chat(M, command)
-
-/datum/announcement/priority/security/Message(message as text, message_title as text)
- to_chat(world, "[message_title] ")
- to_chat(world, "[message] ")
+ return formatted_message
/datum/announcement/proc/NewsCast(message as text, message_title as text)
- if(disable_newscasts)
- return
if(!newscast)
return
@@ -121,28 +161,17 @@
news.can_be_redacted = 0
announce_newscaster_news(news)
-/datum/announcement/proc/PlaySound(var/message_sound)
+/datum/announcement/proc/Sound(var/message_sound, var/receivers)
if(!message_sound)
return
- for(var/mob/M in player_list)
- if(M.can_hear())
- M << message_sound
-
-/datum/announcement/proc/Sound(var/message_sound)
- PlaySound(message_sound)
-
-/datum/announcement/priority/Sound(var/message_sound)
- if(sound)
- world << sound
-
-/datum/announcement/priority/command/Sound(var/message_sound)
- PlaySound(message_sound)
+ for(var/mob/M in receivers)
+ M << message_sound
/datum/announcement/proc/Log(message as text, message_title as text)
if(log)
log_say("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]")
message_admins("[key_name_admin(usr)] has made \a [announcement_type].", 1)
-
+
/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I)
// Format currently matches that of newscaster feeds: Registered Name (Assigned Rank)
- return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
\ No newline at end of file
+ return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 1bcc5bad5ef..7b7952b5f88 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -17,7 +17,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area
var/fire = null
- var/atmosalm = 0
+ var/atmosalm = ATMOS_ALARM_NONE
var/poweralm = 1
var/party = null
var/radalert = 0
@@ -53,12 +53,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/list/apc = list()
var/no_air = null
// var/list/lights // list of all lights on this area
- var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
var/air_doors_activated = 0
var/tele_proof = 0
var/no_teleportlocs = 0
+ var/outdoors = 0 //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
+
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list()
@@ -105,14 +106,14 @@ var/list/ghostteleportlocs = list()
name = "\improper Admin Room"
icon_state = "start"
requires_power = 0
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/adminconstruction
name = "\improper Admin Testing Area"
icon_state = "start"
requires_power = 0
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/space
icon_state = "space"
@@ -121,6 +122,7 @@ var/list/ghostteleportlocs = list()
power_light = 0
power_equip = 0
power_environ = 0
+ outdoors = 1
ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
/area/space/atmosalert()
@@ -464,7 +466,7 @@ var/list/ghostteleportlocs = list()
icon_state = "start"
requires_power = 0
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
has_gravity = 1
// === end remove
@@ -480,19 +482,23 @@ var/list/ghostteleportlocs = list()
name = "\improper Centcom"
icon_state = "centcom"
requires_power = 0
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/centcom/control
name = "\improper Centcom Control"
+ icon_state = "centcom_ctrl"
/area/centcom/evac
name = "\improper Centcom Emergency Shuttle"
+ icon_state = "centcom_evac"
/area/centcom/suppy
name = "\improper Centcom Supply Shuttle"
+ icon_state = "centcom_supply"
/area/centcom/ferry
name = "\improper Centcom Transport Shuttle"
+ icon_state = "centcom_ferry"
/area/centcom/shuttle
name = "\improper Centcom Administration Shuttle"
@@ -505,9 +511,11 @@ var/list/ghostteleportlocs = list()
/area/centcom/specops
name = "\improper Centcom Special Ops"
+ icon_state = "centcom_specops"
-/area/centcom/creed
- name = "Creed's Office"
+/area/centcom/gamma
+ name = "\improper Centcom Gamma Armory"
+ icon_state = "centcom_gamma"
/area/centcom/holding
name = "\improper Holding Facility"
@@ -551,6 +559,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Asteroid - Underground"
icon_state = "cave"
requires_power = 0
+ outdoors = 1
/area/asteroid/artifactroom
name = "\improper Asteroid - Artifact"
@@ -560,7 +569,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Thunderdome"
icon_state = "thunder"
requires_power = 0
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/tdome/arena_source
@@ -645,7 +654,7 @@ var/list/ghostteleportlocs = list()
icon_state = "yellow"
requires_power = 0
has_gravity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/wizard_station
name = "\improper Wizard's Den"
@@ -668,7 +677,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Vox Base"
icon_state = "yellow"
requires_power = 0
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
no_teleportlocs = 1
/area/vox_station/transit
@@ -1036,7 +1045,7 @@ var/list/ghostteleportlocs = list()
/area/bridge/meeting_room
name = "\improper Heads of Staff Meeting Room"
- icon_state = "bridge"
+ icon_state = "meeting"
music = null
/area/crew_quarters/captain
@@ -1225,7 +1234,7 @@ var/list/ghostteleportlocs = list()
/area/holodeck
name = "\improper Holodeck"
icon_state = "Holodeck"
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/holodeck/alphadeck
name = "\improper Holodeck Alpha"
@@ -1362,7 +1371,7 @@ var/list/ghostteleportlocs = list()
/area/solar
requires_power = 0
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
auxport
name = "\improper Fore Port Solar Array"
@@ -1872,6 +1881,10 @@ area/security/podbay
name = "\improper Toxins Mixing Room"
icon_state = "toxmix"
+/area/toxins/launch
+ name = "Toxins Launch Room"
+ icon_state = "toxlaunch"
+
/area/toxins/misc_lab
name = "\improper Research Testing Lab"
icon_state = "toxmisc"
@@ -2277,25 +2290,25 @@ area/security/podbay
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/turret_protected/AIsatextFS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/turret_protected/AIsatextAS
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/turret_protected/AIsatextAP
name = "\improper AI Sat Ext"
icon_state = "storage"
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
/area/turret_protected/NewAIMain
name = "\improper AI Main New"
@@ -2463,16 +2476,11 @@ area/security/podbay
/area/awaymission/spacebattle/secret
name = "\improper Hidden Chamber"
-/area/awaymission/listeningpost
- name = "\improper Listening Post"
- icon_state = "away"
- requires_power = 0
-
/area/awaymission/beach
name = "Beach"
icon_state = "beach"
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
requires_power = 0
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
@@ -2580,6 +2588,22 @@ area/security/podbay
/area/awaycontent/a30
icon_state = "awaycontent30"
+////////////////////////VR AREAS///////////////////////////////////
+
+/area/vr
+ name = "VR"
+ requires_power = 0
+ dynamic_lighting = 0
+ no_teleportlocs = 1
+
+
+/area/vr/lobby
+ name = "VR Lobby"
+
+/area/vr/roman
+ name = "Roman Arena"
+
+
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 7caaf090914..eb743afad62 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -29,7 +29,7 @@
if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area
requires_power = 1
always_unpowered = 1
- lighting_use_dynamic = 1
+ dynamic_lighting = 1
power_light = 0
power_equip = 0
power_environ = 0
@@ -53,7 +53,7 @@
/area/proc/atmosalert(danger_level, var/alarm_source)
- if(danger_level == 0)
+ if(danger_level == ATMOS_ALARM_NONE)
atmosphere_alarm.clearAlarm(src, alarm_source)
else
atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
@@ -64,10 +64,10 @@
danger_level = max(danger_level, AA.danger_level)
if(danger_level != atmosalm)
- if(danger_level < 1 && atmosalm >= 1)
+ if(danger_level < ATMOS_ALARM_WARNING && atmosalm >= ATMOS_ALARM_WARNING)
//closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise
air_doors_open()
- else if(danger_level >= 2 && atmosalm < 2)
+ else if(danger_level >= ATMOS_ALARM_DANGER && atmosalm < ATMOS_ALARM_DANGER)
air_doors_close()
atmosalm = danger_level
@@ -80,26 +80,28 @@
return 0
/area/proc/air_doors_close()
- if(!src.air_doors_activated)
- src.air_doors_activated = 1
- for(var/obj/machinery/door/firedoor/E in src.all_doors)
- if(!E.blocked)
- if(E.operating)
- E.nextstate = CLOSED
- else if(!E.density)
+ if(!air_doors_activated)
+ air_doors_activated = TRUE
+ for(var/obj/machinery/door/firedoor/D in src)
+ if(!D.welded)
+ D.activate_alarm()
+ if(D.operating)
+ D.nextstate = CLOSED
+ else if(!D.density)
spawn(0)
- E.close()
+ D.close()
/area/proc/air_doors_open()
- if(src.air_doors_activated)
- src.air_doors_activated = 0
- for(var/obj/machinery/door/firedoor/E in src.all_doors)
- if(!E.blocked)
- if(E.operating)
- E.nextstate = OPEN
- else if(E.density)
+ if(air_doors_activated)
+ air_doors_activated = FALSE
+ for(var/obj/machinery/door/firedoor/D in src)
+ if(!D.welded)
+ D.deactivate_alarm()
+ if(D.operating)
+ D.nextstate = OPEN
+ else if(D.density)
spawn(0)
- E.open()
+ D.open()
/area/proc/fire_alert()
@@ -145,46 +147,33 @@
if(!eject)
eject = 1
updateicon()
- return
/area/proc/readyreset()
if(eject)
eject = 0
updateicon()
- return
/area/proc/radiation_alert()
if(!radalert)
radalert = 1
updateicon()
- return
/area/proc/reset_radiation_alert()
if(radalert)
radalert = 0
updateicon()
- return
/area/proc/partyalert()
- if(!( party ))
+ if(!party)
party = 1
updateicon()
mouse_opacity = 0
- return
/area/proc/partyreset()
if(party)
party = 0
mouse_opacity = 0
updateicon()
- for(var/obj/machinery/door/firedoor/D in src)
- if(!D.blocked)
- if(D.operating)
- D.nextstate = OPEN
- else if(D.density)
- spawn(0)
- D.open()
- return
/area/proc/updateicon()
if(radalert) // always show the radiation alert, regardless of power
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 6d26555ca56..25e9f43b588 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -88,7 +88,7 @@ var/global/max_secret_rooms = 6
theme = "cavein"
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
- treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,/obj/item/weapon/gun/energy/kinetic_accelerator/hyper=1,
+ treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,
/obj/item/weapon/resonator/upgraded=1, /obj/item/weapon/pickaxe/drill/jackhammer=5)
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/oxygen/red=2)
@@ -115,16 +115,16 @@ var/global/max_secret_rooms = 6
floortypes = list(/turf/simulated/floor,/turf/simulated/floor/wood)
treasureitems = list(/obj/item/weapon/melee/energy/sword/pirate=1,/obj/item/weapon/gun/projectile/revolver/doublebarrel=1,/obj/item/weapon/storage/backpack/satchel_flat=1,
/obj/machinery/reagentgrinder=2, /obj/machinery/computer/security/wooden_tv=4, /obj/machinery/vending/coffee=3)
- fluffitems = list(/obj/structure/table/woodentable=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/weapon/spacecash/c500=4,
+ fluffitems = list(/obj/structure/table/woodentable=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/stack/spacecash/c500=4,
/obj/item/weapon/reagent_containers/food/drinks/shaker=1,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine=3,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey=3,/obj/item/clothing/shoes/laceup=2)
if("plantlab")
theme = "plantlab"
- treasureitems = list(/obj/item/weapon/gun/energy/floragun=1,/obj/item/seeds/ambrosiadeusseed=2,/obj/item/seeds/bluespacetomatoseed=2,/obj/item/seeds/bluetomatoseed=2,
- /obj/item/seeds/coffeerseed=2, /obj/item/seeds/stobaccoseed=2)
- fluffitems = list(/obj/item/weapon/twohanded/required/kirbyplants=1,/obj/structure/table/reinforced=2,/obj/machinery/portable_atmospherics/hydroponics=1,
- /obj/effect/glowshroom/single=2,/obj/item/weapon/reagent_containers/syringe/charcoal=2,
+ treasureitems = list(/obj/item/weapon/gun/energy/floragun=1,/obj/item/seeds/ambrosia/deus=2,/obj/item/seeds/tomato/blue/bluespace=2,/obj/item/seeds/tomato/blue=2,
+ /obj/item/seeds/coffee/robusta=2, /obj/item/seeds/tobacco/space=2)
+ fluffitems = list(/obj/item/weapon/twohanded/required/kirbyplants=1,/obj/structure/table/reinforced=2,/obj/machinery/hydroponics=1,
+ /obj/structure/glowshroom/single=2,/obj/item/weapon/reagent_containers/syringe/charcoal=2,
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine=3,/obj/item/weapon/reagent_containers/glass/bottle/ammonia=3)
/*if("poly")
@@ -194,7 +194,7 @@ var/global/max_secret_rooms = 6
A.fullUpdateMineralOverlays()
T = pick(emptyturfs)
if(T)
- new /obj/effect/glowshroom/single(T) //Just to make it a little more visible
+ new /obj/structure/glowshroom/single(T) //Just to make it a little more visible
var/surprise = null
surprise = pickweight(treasureitems)
new surprise(T)//here's the prize
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 663d6c5a8f9..5d1dd5c74fb 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -9,7 +9,6 @@
var/blood_color
var/last_bumped = 0
var/pass_flags = 0
- var/throwpass = 0
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
var/simulated = 1 //filter for actions - used by lighting overlays
var/atom_say_verb = "says"
@@ -37,6 +36,8 @@
var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
+ var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
+
/atom/proc/onCentcom()
var/turf/T = get_turf(src)
if(!T)
@@ -74,12 +75,14 @@
qdel(AA)
alternate_appearances = null
- if(reagents)
- qdel(reagents)
- reagents = null
+ QDEL_NULL(reagents)
invisibility = 101
return ..()
+//Hook for running code when a dir change occurs
+/atom/proc/setDir(newdir)
+ dir = newdir
+
/atom/proc/CheckParts(list/parts_list)
for(var/A in parts_list)
if(istype(A, /datum/reagent))
@@ -220,11 +223,6 @@
/atom/proc/relaymove()
return
-//called to set the atom's dir and used to add behaviour to dir-changes - Not fully used (yet)
-/atom/proc/set_dir(new_dir)
- . = new_dir != dir
- dir = new_dir
-
/atom/proc/ex_act()
return
@@ -237,10 +235,13 @@
/atom/proc/emag_act()
return
-/atom/proc/hitby(atom/movable/AM as mob|obj)
- if(density)
- AM.throwing = 0
- return
+/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
+ if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...).
+ addtimer(src, "hitby_react", 2, TRUE, AM)
+
+/atom/proc/hitby_react(atom/movable/AM)
+ if(AM && isturf(AM.loc))
+ step(AM, turn(AM.dir, 180))
/atom/proc/add_hiddenprint(mob/living/M as mob)
if(isnull(M)) return
@@ -464,3 +465,8 @@
/atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
return
+
+/atom/on_varedit(modified_var)
+ if(!Debug2)
+ admin_spawned = TRUE
+ ..()
\ No newline at end of file
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 107e8aee518..906706de62e 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -6,15 +6,21 @@
// var/elevation = 2 - not used anywhere
var/move_speed = 10
var/l_move_time = 1
- var/throwing = 0
- var/thrower
- var/turf/throw_source = null
- var/throw_speed = 2
+ var/datum/thrownthing/throwing = null
+ var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
var/throw_range = 7
- var/no_spin_thrown = 0 //set this to 1 if you don't want an item that you throw to spin, no matter what. -Fox
+ var/no_spin = 0
+ var/no_spin_thrown = 0
var/moved_recently = 0
var/mob/pulledby = null
+
var/inertia_dir = 0
+ var/atom/inertia_last_loc
+ var/inertia_moving = 0
+ var/inertia_next_move = 0
+ var/inertia_move_delay = 5
+
+ var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
var/area/areaMaster
@@ -26,13 +32,19 @@
// If you're wondering what goofery this is, this is for things that need the environment
// around them set up - like `air_update_turf` and the like
- if((ticker && ticker.current_state == GAME_STATE_PLAYING))
+ if((ticker && ticker.current_state >= GAME_STATE_SETTING_UP))
attempt_init()
/atom/movable/Destroy()
for(var/atom/movable/AM in contents)
qdel(AM)
+ var/turf/un_opaque
+ if(opacity && isturf(loc))
+ un_opaque = loc
+
loc = null
+ if(un_opaque)
+ un_opaque.recalc_atom_opacity()
if(pulledby)
if(pulledby.pulling == src)
pulledby.pulling = null
@@ -65,61 +77,74 @@
if(!(direct & (direct - 1))) //Cardinal move
. = ..()
else //Diagonal move, split it into cardinal moves
+ moving_diagonally = FIRST_DIAG_STEP
if(direct & 1)
if(direct & 4)
if(step(src, NORTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, EAST)
else if(step(src, EAST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, NORTH)
else if(direct & 8)
if(step(src, NORTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, WEST)
else if(step(src, WEST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, NORTH)
else if(direct & 2)
if(direct & 4)
if(step(src, SOUTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, EAST)
else if(step(src, EAST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, SOUTH)
else if(direct & 8)
if(step(src, SOUTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, WEST)
else if(step(src, WEST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, SOUTH)
-
+ moving_diagonally = 0
+ return
if(!loc || (loc == oldloc && oldloc != newloc))
last_move = 0
return
+ if(.)
+ Moved(oldloc, direct)
+
last_move = direct
src.move_speed = world.time - src.l_move_time
src.l_move_time = world.time
- spawn(5) // Causes space drifting. /tg/station has no concept of speed, we just use 5
- if(loc && direct && last_move == direct)
- if(loc == newloc) //Remove this check and people can accelerate. Not opening that can of worms just yet.
- newtonian_move(last_move)
-
if(. && buckled_mob && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob
. = 0
+// Called after a successful Move(). By this point, we've already moved
+/atom/movable/proc/Moved(atom/OldLoc, Dir)
+ if(!inertia_moving)
+ inertia_next_move = world.time + inertia_move_delay
+ newtonian_move(Dir)
+ return 1
-// Previously known as Crossed()
+// Previously known as HasEntered()
// This is automatically called when something enters your square
/atom/movable/Crossed(atom/movable/AM)
return
-/atom/movable/Bump(var/atom/A as mob|obj|turf|area, sendBump)
- if(src.throwing)
- src.throw_impact(A)
-
- if(A && sendBump)
- A.last_bumped = world.time
+/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
+ if(A && yes)
+ if(throwing)
+ throwing.hit_atom(A)
+ . = 1
+ if(!A || qdeleted(A))
+ return
A.Bumped(src)
- else
- ..()
/atom/movable/proc/forceMove(atom/destination)
var/turf/old_loc = loc
@@ -160,29 +185,6 @@
update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
-//called when src is thrown into hit_atom
-/atom/movable/proc/throw_impact(atom/hit_atom, var/speed)
- if(istype(hit_atom,/mob/living))
- var/mob/living/M = hit_atom
- M.hitby(src,speed)
-
- else if(isobj(hit_atom))
- var/obj/O = hit_atom
- if(!O.anchored)
- step(O, src.dir)
- O.hitby(src,speed)
-
- else if(isturf(hit_atom))
- src.throwing = 0
- var/turf/T = hit_atom
- if(T.density)
- spawn(2)
- step(src, turn(src.dir, 180))
- if(istype(src,/mob/living))
- var/mob/living/M = src
- M.turf_collision(T, speed)
-
-
//Called whenever an object moves and by mobs when they attempt to move themselves through space
//And when an object or action applies a force on src, see newtonian_move() below
//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
@@ -195,13 +197,15 @@
if(pulledby && !pulledby.pulling)
return 1
+ if(throwing)
+ return 1
+
if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier
return 1
return 0
/atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity
-
if(!loc || Process_Spacemove(0))
inertia_dir = 0
return 0
@@ -210,115 +214,93 @@
if(!direction)
return 1
- var/old_dir = dir
- . = step(src, direction)
- dir = old_dir
+ inertia_last_loc = loc
+ drift_master.processing_list[src] = src
+ return 1
-//decided whether a movable atom being thrown can pass through the turf it is in.
-/atom/movable/proc/hit_check(var/speed)
- if(src.throwing)
- for(var/atom/A in get_turf(src))
- if(A == src) continue
- if(istype(A,/mob/living))
- if(A:lying) continue
- src.throw_impact(A,speed)
- if(isobj(A))
- if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
- src.throw_impact(A,speed)
-/atom/movable/proc/throw_at(atom/target, range, speed, thrower, no_spin)
- if(!target || !src || (flags & NODROP))
+//called when src is thrown into hit_atom
+/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum)
+ set waitfor = 0
+ return hit_atom.hitby(src)
+
+/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked)
+ if(!anchored && hitpush)
+ step(src, AM.dir)
+ ..()
+
+/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, var/datum/callback/callback)
+ if(!target || (flags & NODROP) || speed <= 0)
return 0
- //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
- src.throwing = 1
- src.thrower = thrower
- src.throw_source = get_turf(src) //store the origin turf
- if(target.allow_spin) // turns out 1000+ spinning objects being thrown at the singularity creates lag - Iamgoofball
- if(!no_spin_thrown && !no_spin)
- SpinAnimation(5, 1)
+ if(pulledby)
+ pulledby.stop_pulling()
+
+ // They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw?
+ if(thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag * 2)
+ var/user_momentum = thrower.movement_delay()
+ if(!user_momentum) // no movement_delay, this means they move once per byond tick, let's calculate from that instead
+ user_momentum = world.tick_lag
+
+ user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses
+
+ if(get_dir(thrower, target) & last_move)
+ user_momentum = user_momentum // basically a noop, but needed
+ else if(get_dir(target, thrower) & last_move)
+ user_momentum = -user_momentum // we are moving away from the target, lets slowdown the throw accordingly
+ else
+ user_momentum = 0
+
+ if(user_momentum)
+ // first lets add that momentum to range
+ range *= (user_momentum / speed) + 1
+ //then lets add it to speed
+ speed += user_momentum
+ if(speed <= 0)
+ return //no throw speed, the user was moving too fast.
+
+ var/datum/thrownthing/TT = new()
+ TT.thrownthing = src
+ TT.target = target
+ TT.target_turf = get_turf(target)
+ TT.init_dir = get_dir(src, target)
+ TT.maxrange = range
+ TT.speed = speed
+ TT.thrower = thrower
+ TT.diagonals_first = diagonals_first
+ TT.callback = callback
+
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
+ var/dx = (target.x > src.x) ? EAST : WEST
+ var/dy = (target.y > src.y) ? NORTH : SOUTH
- var/dx
- if(target.x > src.x)
- dx = EAST
- else
- dx = WEST
+ if(dist_x == dist_y)
+ TT.pure_diagonal = 1
- var/dy
- if(target.y > src.y)
- dy = NORTH
- else
- dy = SOUTH
- var/dist_travelled = 0
- var/dist_since_sleep = 0
- var/area/a = get_area(src.loc)
- if(dist_x > dist_y)
- var/error = dist_x/2 - dist_y
- while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
- // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
- if(error < 0)
- var/atom/step = get_step(src, dy)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step, get_dir(loc, step))
- hit_check(speed)
- error += dist_x
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- else
- var/atom/step = get_step(src, dx)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error -= dist_y
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- a = get_area(src.loc)
- else
- var/error = dist_y/2 - dist_x
- while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
- // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
- if(error < 0)
- var/atom/step = get_step(src, dx)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error += dist_y
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- else
- var/atom/step = get_step(src, dy)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error -= dist_x
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
+ else if(dist_x <= dist_y)
+ var/olddist_x = dist_x
+ var/olddx = dx
+ dist_x = dist_y
+ dist_y = olddist_x
+ dx = dy
+ dy = olddx
+ TT.dist_x = dist_x
+ TT.dist_y = dist_y
+ TT.dx = dx
+ TT.dy = dy
+ TT.diagonal_error = dist_x / 2 - dist_y
+ TT.start_time = world.time
- a = get_area(src.loc)
+ if(pulledby)
+ pulledby.stop_pulling()
- //done throwing, either because it hit something or it finished moving
- if(isobj(src)) src.throw_impact(get_turf(src),speed)
- src.throwing = 0
- src.thrower = null
- src.throw_source = null
+ throwing = TT
+ if(spin && !no_spin && !no_spin_thrown)
+ SpinAnimation(5, 1)
+
+ throw_master.processing_list[src] = TT
+ TT.tick()
//Overlays
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index aae8a668799..2a6aa2b3a39 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -41,10 +41,10 @@
hud_icons = list(ID_HUD)
/datum/atom_hud/data/human/security/advanced
- hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD)
+ hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPMINDSHIELD_HUD, IMPCHEM_HUD, WANTED_HUD)
/datum/atom_hud/data/diagnostic
- hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD)
+ hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD)
/datum/atom_hud/data/hydroponic
hud_icons = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
@@ -139,6 +139,7 @@
/mob/living/carbon/proc/med_hud_set_status()
var/image/holder = hud_list[STATUS_HUD]
//var/image/holder2 = hud_list[STATUS_HUD_OOC]
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
if(stat == 2)
holder.icon_state = "huddead"
//holder2.icon_state = "huddead"
@@ -146,13 +147,8 @@
holder.icon_state = "hudxeno"
else if(check_virus())
holder.icon_state = "hudill"
- else if(has_brain_worms())
- var/mob/living/simple_animal/borer/B = has_brain_worms()
- if(B.controlling)
- holder.icon_state = "hudbrainworm"
- else
- holder.icon_state = "hudhealthy"
- //holder2.icon_state = "hudhealthy"
+ else if(has_brain_worms() && B != null && B.controlling)
+ holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
//holder2.icon_state = "hudhealthy"
@@ -176,7 +172,7 @@
/mob/living/carbon/human/proc/sec_hud_set_implants()
var/image/holder
- for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
+ for(var/i in list(IMPTRACK_HUD, IMPMINDSHIELD_HUD, IMPCHEM_HUD))
holder = hud_list[i]
holder.icon_state = null
for(var/obj/item/weapon/implant/I in src)
@@ -184,8 +180,8 @@
if(istype(I,/obj/item/weapon/implant/tracking))
holder = hud_list[IMPTRACK_HUD]
holder.icon_state = "hud_imp_tracking"
- else if(istype(I,/obj/item/weapon/implant/loyalty))
- holder = hud_list[IMPLOYAL_HUD]
+ else if(istype(I,/obj/item/weapon/implant/mindshield))
+ holder = hud_list[IMPMINDSHIELD_HUD]
holder.icon_state = "hud_imp_loyal"
else if(istype(I,/obj/item/weapon/implant/chem))
holder = hud_list[IMPCHEM_HUD]
@@ -287,6 +283,17 @@
if(internal_damage)
holder.icon_state = "hudwarn"
+/obj/mecha/proc/diag_hud_set_mechtracking() //Shows tracking beacons on the mech
+ var/image/holder = hud_list[DIAG_TRACK_HUD]
+ var/new_icon_state //This var exists so that the holder's icon state is set only once in the event of multiple mech beacons.
+ for(var/obj/item/mecha_parts/mecha_tracking/T in trackers)
+ if(T.ai_beacon) //Beacon with AI uplink
+ new_icon_state = "hudtrackingai"
+ break //Immediately terminate upon finding an AI beacon to ensure it is always shown over the normal one, as mechs can have several trackers.
+ else
+ new_icon_state = "hudtracking"
+ holder.icon_state = new_icon_state
+
/*~~~~~~~~~
Bots!
~~~~~~~~~~*/
@@ -355,17 +362,17 @@
return "zero"
return "zero"
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_nutrient()
+/obj/machinery/hydroponics/proc/plant_hud_set_nutrient()
var/image/holder = hud_list[PLANT_NUTRIENT_HUD]
holder.icon_state = "hudnutrient[RoundPlantBar(nutrilevel/maxnutri)]"
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_water()
+/obj/machinery/hydroponics/proc/plant_hud_set_water()
var/image/holder = hud_list[PLANT_WATER_HUD]
holder.icon_state = "hudwater[RoundPlantBar(waterlevel/maxwater)]"
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_status()
+/obj/machinery/hydroponics/proc/plant_hud_set_status()
var/image/holder = hud_list[PLANT_STATUS_HUD]
- if(!seed)
+ if(!myseed)
holder.icon_state = ""
return
if(harvest)
@@ -376,28 +383,28 @@
return
holder.icon_state = ""
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_health()
+/obj/machinery/hydroponics/proc/plant_hud_set_health()
var/image/holder = hud_list[PLANT_HEALTH_HUD]
- if(!seed)
+ if(!myseed)
holder.icon_state = ""
return
- holder.icon_state = "hudplanthealth[RoundPlantBar(health/seed.get_trait(TRAIT_ENDURANCE))]"
+ holder.icon_state = "hudplanthealth[RoundPlantBar(plant_health/myseed.endurance)]"
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_toxin()
+/obj/machinery/hydroponics/proc/plant_hud_set_toxin()
var/image/holder = hud_list[PLANT_TOXIN_HUD]
- if(toxins < 1) // You don't want to see these icons if the value is small
+ if(toxic < 10) // You don't want to see these icons if the value is small
holder.icon_state = ""
return
- holder.icon_state = "hudtoxin[RoundPlantBar(toxins/10)]"
+ holder.icon_state = "hudtoxin[RoundPlantBar(toxic/100)]"
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_pest()
+/obj/machinery/hydroponics/proc/plant_hud_set_pest()
var/image/holder = hud_list[PLANT_PEST_HUD]
if(pestlevel < 1) // You don't want to see these icons if the value is small
holder.icon_state = ""
return
holder.icon_state = "hudpest[RoundPlantBar(pestlevel/10)]"
-/obj/machinery/portable_atmospherics/hydroponics/proc/plant_hud_set_weed()
+/obj/machinery/hydroponics/proc/plant_hud_set_weed()
var/image/holder = hud_list[PLANT_WEED_HUD]
if(weedlevel < 1) // You don't want to see these icons if the value is small
holder.icon_state = ""
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 82f7ffb2e93..a9e0c49a122 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -20,37 +20,43 @@
#define DNA_UI_HAIR_R 1
#define DNA_UI_HAIR_G 2
#define DNA_UI_HAIR_B 3
-#define DNA_UI_BEARD_R 4
-#define DNA_UI_BEARD_G 5
-#define DNA_UI_BEARD_B 6
-#define DNA_UI_SKIN_TONE 7
-#define DNA_UI_SKIN_R 8
-#define DNA_UI_SKIN_G 9
-#define DNA_UI_SKIN_B 10
-#define DNA_UI_HACC_R 11
-#define DNA_UI_HACC_G 12
-#define DNA_UI_HACC_B 13
-#define DNA_UI_HEAD_MARK_R 14
-#define DNA_UI_HEAD_MARK_G 15
-#define DNA_UI_HEAD_MARK_B 16
-#define DNA_UI_BODY_MARK_R 17
-#define DNA_UI_BODY_MARK_G 18
-#define DNA_UI_BODY_MARK_B 19
-#define DNA_UI_TAIL_MARK_R 20
-#define DNA_UI_TAIL_MARK_G 21
-#define DNA_UI_TAIL_MARK_B 22
-#define DNA_UI_EYES_R 23
-#define DNA_UI_EYES_G 24
-#define DNA_UI_EYES_B 25
-#define DNA_UI_GENDER 26
-#define DNA_UI_BEARD_STYLE 27
-#define DNA_UI_HAIR_STYLE 28
+#define DNA_UI_HAIR2_R 4
+#define DNA_UI_HAIR2_G 5
+#define DNA_UI_HAIR2_B 6
+#define DNA_UI_BEARD_R 7
+#define DNA_UI_BEARD_G 8
+#define DNA_UI_BEARD_B 9
+#define DNA_UI_BEARD2_R 10
+#define DNA_UI_BEARD2_G 11
+#define DNA_UI_BEARD2_B 12
+#define DNA_UI_SKIN_TONE 13
+#define DNA_UI_SKIN_R 14
+#define DNA_UI_SKIN_G 15
+#define DNA_UI_SKIN_B 16
+#define DNA_UI_HACC_R 17
+#define DNA_UI_HACC_G 18
+#define DNA_UI_HACC_B 19
+#define DNA_UI_HEAD_MARK_R 20
+#define DNA_UI_HEAD_MARK_G 21
+#define DNA_UI_HEAD_MARK_B 22
+#define DNA_UI_BODY_MARK_R 23
+#define DNA_UI_BODY_MARK_G 24
+#define DNA_UI_BODY_MARK_B 25
+#define DNA_UI_TAIL_MARK_R 26
+#define DNA_UI_TAIL_MARK_G 27
+#define DNA_UI_TAIL_MARK_B 28
+#define DNA_UI_EYES_R 29
+#define DNA_UI_EYES_G 30
+#define DNA_UI_EYES_B 31
+#define DNA_UI_GENDER 32
+#define DNA_UI_BEARD_STYLE 33
+#define DNA_UI_HAIR_STYLE 34
/*#define DNA_UI_BACC_STYLE 23*/
-#define DNA_UI_HACC_STYLE 29
-#define DNA_UI_HEAD_MARK_STYLE 30
-#define DNA_UI_BODY_MARK_STYLE 31
-#define DNA_UI_TAIL_MARK_STYLE 32
-#define DNA_UI_LENGTH 32 // Update this when you add something, or you WILL break shit.
+#define DNA_UI_HACC_STYLE 35
+#define DNA_UI_HEAD_MARK_STYLE 36
+#define DNA_UI_BODY_MARK_STYLE 37
+#define DNA_UI_TAIL_MARK_STYLE 38
+#define DNA_UI_LENGTH 38 // Update this when you add something, or you WILL break shit.
#define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
@@ -135,6 +141,7 @@ var/global/list/bad_blocks[0]
// FIXME: Species-specific defaults pls
var/obj/item/organ/external/head/H = character.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
+ var/datum/species/S = character.species
/*// Body Accessory
if(!character.body_accessory)
@@ -170,7 +177,11 @@ var/global/list/bad_blocks[0]
SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
- SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
+ if(S.has_gender)
+ SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
+ else
+ SetUIState(DNA_UI_GENDER, pick(0,1), 1)
+
/*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/
SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, marking_styles_list.len, 1)
SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, marking_styles_list.len, 1)
@@ -426,3 +437,7 @@ var/global/list/bad_blocks[0]
species = data["species"]
b_type = data["b_type"]
real_name = data["real_name"]
+
+// a nice hook for if/when we refactor species on dna
+/datum/dna/proc/get_species_name()
+ return species
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index e5af89c3d25..c5f9ce2b7fe 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -22,27 +22,27 @@
// Give Random Bad Mutation to M
/proc/randmutb(var/mob/living/M)
- if(!M) return
+ if(!M || !M.dna) return
M.dna.check_integrity()
var/block = pick(bad_blocks)
M.dna.SetSEState(block, 1)
// Give Random Good Mutation to M
/proc/randmutg(var/mob/living/M)
- if(!M) return
+ if(!M || !M.dna) return
M.dna.check_integrity()
var/block = pick(good_blocks)
M.dna.SetSEState(block, 1)
// Random Appearance Mutation
/proc/randmuti(var/mob/living/M)
- if(!M) return
+ if(!M || !M.dna) return
M.dna.check_integrity()
M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095))
// Scramble UI or SE.
/proc/scramble(var/UI, var/mob/M, var/prob)
- if(!M) return
+ if(!M || !M.dna) return
M.dna.check_integrity()
if(UI)
for(var/i = 1, i <= DNA_UI_LENGTH-1, i++)
@@ -132,7 +132,11 @@
dna.check_integrity()
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/obj/item/organ/internal/eyes/eye_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
+ var/datum/species/S = H.species
dna.write_head_attributes(head_organ)
+ dna.write_eyes_attributes(eye_organ)
+ H.update_eyes()
H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255)
H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255)
@@ -144,10 +148,11 @@
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
- if(dna.GetUIState(DNA_UI_GENDER))
- H.change_gender(FEMALE, 0)
- else
- H.change_gender(MALE, 0)
+ if(S.has_gender)
+ if(dna.GetUIState(DNA_UI_GENDER))
+ H.change_gender(FEMALE, 0)
+ else
+ H.change_gender(MALE, 0)
//Head Markings
var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, marking_styles_list.len)
@@ -188,6 +193,10 @@
head_organ.g_hair = GetUIValueRange(DNA_UI_HAIR_G, 255)
head_organ.b_hair = GetUIValueRange(DNA_UI_HAIR_B, 255)
+ head_organ.r_hair_sec = GetUIValueRange(DNA_UI_HAIR2_R, 255)
+ head_organ.g_hair_sec = GetUIValueRange(DNA_UI_HAIR2_G, 255)
+ head_organ.b_hair_sec = GetUIValueRange(DNA_UI_HAIR2_B, 255)
+
//Facial Hair
var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len)
if((beard > 0) && (beard <= facial_hair_styles_list.len))
@@ -197,6 +206,10 @@
head_organ.g_facial = GetUIValueRange(DNA_UI_BEARD_G, 255)
head_organ.b_facial = GetUIValueRange(DNA_UI_BEARD_B, 255)
+ head_organ.r_facial_sec = GetUIValueRange(DNA_UI_BEARD2_R, 255)
+ head_organ.g_facial_sec = GetUIValueRange(DNA_UI_BEARD2_G, 255)
+ head_organ.b_facial_sec = GetUIValueRange(DNA_UI_BEARD2_B, 255)
+
//Head Accessories
var/headacc = GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len)
if((headacc > 0) && (headacc <= head_accessory_styles_list.len))
@@ -254,10 +267,18 @@
SetUIValueRange(DNA_UI_HAIR_G, H.g_hair, 255, 1)
SetUIValueRange(DNA_UI_HAIR_B, H.b_hair, 255, 1)
+ SetUIValueRange(DNA_UI_HAIR2_R, H.r_hair_sec, 255, 1)
+ SetUIValueRange(DNA_UI_HAIR2_G, H.g_hair_sec, 255, 1)
+ SetUIValueRange(DNA_UI_HAIR2_B, H.b_hair_sec, 255, 1)
+
SetUIValueRange(DNA_UI_BEARD_R, H.r_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_G, H.g_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_B, H.b_facial, 255, 1)
+ SetUIValueRange(DNA_UI_BEARD2_R, H.r_facial_sec, 255, 1)
+ SetUIValueRange(DNA_UI_BEARD2_G, H.g_facial_sec, 255, 1)
+ SetUIValueRange(DNA_UI_BEARD2_B, H.b_facial_sec, 255, 1)
+
SetUIValueRange(DNA_UI_HACC_R, H.r_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_G, H.g_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_B, H.b_headacc, 255, 1)
diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm
index 4cfa6f45750..aaea991d5cf 100644
--- a/code/game/dna/genes/disabilities.dm
+++ b/code/game/dna/genes/disabilities.dm
@@ -115,6 +115,24 @@
/datum/dna/gene/disability/blindness/New()
block=BLINDBLOCK
+/datum/dna/gene/disability/colourblindness
+ name = "Colourblindness"
+ activation_message = "You feel a peculiar prickling in your eyes while your perception of colour changes."
+ deactivation_message ="Your eyes tingle unsettlingly, though everything seems to become alot more colourful."
+ instability = -GENE_INSTABILITY_MODERATE
+ disability = COLOURBLIND
+
+/datum/dna/gene/disability/colourblindness/New()
+ block=COLOURBLINDBLOCK
+
+/datum/dna/gene/disability/colourblindness/activate(var/mob/M, var/connected, var/flags)
+ ..()
+ M.update_client_colour() //Handle the activation of the colourblindness on the mob.
+
+/datum/dna/gene/disability/colourblindness/deactivate(var/mob/M, var/connected, var/flags)
+ ..()
+ M.update_client_colour() //Handle the deactivation of the colourblindness on the mob.
+
/datum/dna/gene/disability/deaf
name="Deafness"
activation_message="It's kinda quiet."
@@ -126,7 +144,7 @@
block=DEAFBLOCK
/datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags)
- ..(M,connected,flags)
+ ..()
M.EarDeaf(1)
/datum/dna/gene/disability/nearsighted
@@ -139,7 +157,6 @@
/datum/dna/gene/disability/nearsighted/New()
block=GLASSESBLOCK
-
/datum/dna/gene/disability/lisp
name = "Lisp"
desc = "I wonder wath thith doeth."
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index f2489a2490a..11da3ad6c07 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -135,13 +135,13 @@
message = replacetextEx(message,"w","v")
message = replacetextEx(message,"J","Y")
message = replacetextEx(message,"j","y")
- message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
- message = replacetextEx(message,"a",pick("å","ä","æ","a"))
+ message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
+ message = replacetextEx(message,"a",pick("å","ä","æ","a"))
message = replacetextEx(message,"BO","BJO")
message = replacetextEx(message,"Bo","Bjo")
message = replacetextEx(message,"bo","bjo")
- message = replacetextEx(message,"O",pick("Ö","Ø","O"))
- message = replacetextEx(message,"o",pick("ö","ø","o"))
+ message = replacetextEx(message,"O",pick("Ö","Ø","O"))
+ message = replacetextEx(message,"o",pick("ö","ø","o"))
if(prob(30))
message += " Bork[pick("",", bork",", bork, bork")]!"
return message
@@ -259,8 +259,8 @@
action_icon_state = "genetic_incendiary"
-/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets)
- var/mob/living/carbon/L = usr
+/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets, mob/living/user = usr)
+ var/mob/living/carbon/L = user
L.adjust_fire_stacks(0.5)
L.visible_message("[L.name] suddenly bursts into flames! ")
L.IgniteMob()
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index 5654fe2fc72..16f8dad4bdb 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -57,12 +57,7 @@
var/turf/simulated/T = get_turf(M)
if(!istype(T))
return
- var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
- var/light_available
- if(L)
- light_available = L.get_clamped_lum()*10
- else
- light_available = 5
+ var/light_available = T.get_lumcount() * 10
if(light_available <= 2)
M.alpha = round(M.alpha * 0.8)
else
@@ -148,15 +143,15 @@
action_icon_state = "genetic_cryo"
-/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets, mob/user = usr)
if(!targets.len)
- to_chat(usr, "No target found in range. ")
+ to_chat(user, "No target found in range. ")
return
var/mob/living/carbon/C = targets[1]
if(!iscarbon(C))
- to_chat(usr, "This will only work on normal organic beings. ")
+ to_chat(user, "This will only work on normal organic beings. ")
return
if(RESIST_COLD in C.mutations)
@@ -169,15 +164,15 @@
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
handle_suit = 1
if(H.internal)
- H.visible_message("[usr] sprays a cloud of fine ice crystals, engulfing [H]! ",
- "[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor. ")
- log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
- msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
+ H.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [H]! ",
+ "[user] sprays a cloud of fine ice crystals over your [H.head]'s visor. ")
+ log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
+ msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
else
- H.visible_message("[usr] sprays a cloud of fine ice crystals engulfing, [H]! ",
- "[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!. ")
- log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]")
- msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
+ H.visible_message("[user] sprays a cloud of fine ice crystals engulfing, [H]! ",
+ "[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!. ")
+ log_admin("[key_name(user)] has used cryokinesis on [key_name(C)]")
+ msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
H.bodytemperature = max(0, H.bodytemperature - 50)
H.adjustFireLoss(5)
if(!handle_suit)
@@ -185,11 +180,11 @@
C.adjustFireLoss(10)
C.ExtinguishMob()
- C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!")
- log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit")
- msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
+ C.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [C]! ")
+ log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] without internals or a suit")
+ msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
- //playsound(usr.loc, 'bamf.ogg', 50, 0)
+ //playsound(user.loc, 'bamf.ogg', 50, 0)
new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
@@ -268,11 +263,11 @@
/obj/effect/proc_holder/spell/targeted/eat/proc/doHeal(var/mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- for(var/name in H.organs_by_name)
+ for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/affecting = null
- if(!H.organs[name])
+ if(!H.bodyparts_by_name[name])
continue
- affecting = H.organs[name]
+ affecting = H.bodyparts_by_name[name]
if(!istype(affecting, /obj/item/organ/external))
continue
affecting.heal_damage(4, 0)
@@ -283,6 +278,10 @@
var/list/targets = new /list()
var/list/possible_targets = new /list()
+ if(!check_mouth(user))
+ revert_cast(user)
+ return
+
for(var/atom/movable/O in view_or_range(range, user, selection_type))
if((O in user) && is_type_in_list(O,own_blacklist))
continue
@@ -299,10 +298,22 @@
revert_cast(user)
return
- perform(targets)
+ if(!check_mouth(user))
+ revert_cast(user)
+ return
-/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets)
- var/mob/user = usr
+ perform(targets, user = user)
+
+/obj/effect/proc_holder/spell/targeted/eat/proc/check_mouth(mob/user = usr)
+ var/can_eat = 1
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if((C.head && (C.head.flags_cover & HEADCOVERSMOUTH)) || (C.wear_mask && (C.wear_mask.flags_cover & MASKCOVERSMOUTH) && !C.wear_mask.mask_adjusted))
+ to_chat(C, "Your mouth is covered, preventing you from eating! ")
+ can_eat = 0
+ return can_eat
+
+/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr)
if(!targets.len)
to_chat(user, "No target found in range. ")
return
@@ -388,60 +399,60 @@
action_icon_state = "genetic_jump"
-/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr)
var/failure = 0
- if(istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat)
- to_chat(usr, "You can't jump right now! ")
+ if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat)
+ to_chat(user, "You can't jump right now! ")
return
- if(istype(usr.loc,/turf/))
- if(usr.restrained())//Why being pulled while cuffed prevents you from moving
- for(var/mob/M in range(usr, 1))
- if(M.pulling == usr)
- if(!M.restrained() && M.stat == 0 && M.canmove && usr.Adjacent(M))
+ if(istype(user.loc,/turf/))
+ if(user.restrained())//Why being pulled while cuffed prevents you from moving
+ for(var/mob/M in range(user, 1))
+ if(M.pulling == user)
+ if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M))
failure = 1
else
M.stop_pulling()
- if(usr.pinned.len)
+ if(user.pinned.len)
failure = 1
- usr.visible_message("[usr.name] takes a huge leap! ")
- playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
+ user.visible_message("[user.name] takes a huge leap! ")
+ playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
if(failure)
- usr.Weaken(5)
- usr.Stun(5)
- usr.visible_message("[usr] attempts to leap away but is slammed back down to the ground! ",
+ user.Weaken(5)
+ user.Stun(5)
+ user.visible_message("[user] attempts to leap away but is slammed back down to the ground! ",
"You attempt to leap away but are suddenly slammed back down to the ground! ",
"You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor. ")
return 0
- var/prevLayer = usr.layer
- var/prevFlying = usr.flying
- usr.layer = 9
+ var/prevLayer = user.layer
+ var/prevFlying = user.flying
+ user.layer = 9
- usr.flying = 1
+ user.flying = 1
for(var/i=0, i<10, i++)
- step(usr, usr.dir)
- if(i < 5) usr.pixel_y += 8
- else usr.pixel_y -= 8
+ step(user, user.dir)
+ if(i < 5) user.pixel_y += 8
+ else user.pixel_y -= 8
sleep(1)
- usr.flying = prevFlying
+ user.flying = prevFlying
- if(FAT in usr.mutations && prob(66))
- usr.visible_message("[usr.name] crashes due to their heavy weight! ")
- //playsound(usr.loc, 'zhit.wav', 50, 1)
- usr.AdjustWeakened(10)
- usr.AdjustStunned(5)
+ if(FAT in user.mutations && prob(66))
+ user.visible_message("[user.name] crashes due to their heavy weight! ")
+ //playsound(user.loc, 'zhit.wav', 50, 1)
+ user.AdjustWeakened(10)
+ user.AdjustStunned(5)
- usr.layer = prevLayer
+ user.layer = prevLayer
- if(istype(usr.loc,/obj/))
- var/obj/container = usr.loc
- to_chat(usr, "You leap and slam your head against the inside of [container]! Ouch! ")
- usr.AdjustParalysis(3)
- usr.AdjustWeakened(5)
- container.visible_message("[usr.loc] emits a loud thump and rattles a bit. ")
- playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1)
+ if(istype(user.loc,/obj/))
+ var/obj/container = user.loc
+ to_chat(user, "You leap and slam your head against the inside of [container]! Ouch! ")
+ user.AdjustParalysis(3)
+ user.AdjustWeakened(5)
+ container.visible_message("[user.loc] emits a loud thump and rattles a bit. ")
+ playsound(user.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
while(wiggle > 0)
wiggle--
@@ -451,9 +462,6 @@
container.pixel_x = 0
container.pixel_y = 0
-
- return
-
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/polymorphism
@@ -480,6 +488,7 @@
charge_max = 1800
clothes_req = 0
+ human_req = 1
stat_allowed = 0
invocation_type = "none"
range = 1
@@ -487,21 +496,18 @@
action_icon_state = "genetic_poly"
-/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets)
- var/mob/living/M=targets[1]
+/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets, mob/user = usr)
+ var/mob/living/M = targets[1]
if(!ishuman(M))
to_chat(usr, "You can only change your appearance to that of another human. ")
return
- if(!ishuman(usr))
- return
-
- usr.visible_message("[usr]'s body shifts and contorts. ")
+ user.visible_message("[user]'s body shifts and contorts. ")
spawn(10)
- if(M && usr)
- playsound(usr.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
- var/mob/living/carbon/human/H = usr
+ if(M && user)
+ playsound(user.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
+ var/mob/living/carbon/human/H = user
var/mob/living/carbon/human/target = M
H.UpdateAppearance(target.dna.UI)
H.real_name = target.real_name
@@ -529,6 +535,7 @@
desc = "Read the minds of others for information."
charge_max = 180
clothes_req = 0
+ human_req = 1
stat_allowed = 0
invocation_type = "none"
range = -2
@@ -544,30 +551,28 @@
revert_cast(user)
return
- perform(targets)
-
-/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets)
- if(!ishuman(usr)) return
-
+ perform(targets, user = user)
+/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/M in targets)
if(!iscarbon(M))
- to_chat(usr, "You may only use this on other organic beings. ")
+ to_chat(user, "You may only use this on other organic beings. ")
return
if(PSY_RESIST in M.mutations)
- to_chat(usr, "You can't see into [M.name]'s mind at all! ")
+ to_chat(user, "You can't see into [M.name]'s mind at all! ")
return
if(M.stat == 2)
- to_chat(usr, "[M.name] is dead and cannot have their mind read. ")
+ to_chat(user, "[M.name] is dead and cannot have their mind read. ")
return
if(M.health < 0)
- to_chat(usr, "[M.name] is dying, and their thoughts are too scrambled to read. ")
+ to_chat(user, "[M.name] is dying, and their thoughts are too scrambled to read. ")
return
- to_chat(usr, "Mind Reading of [M.name]: ")
- var/pain_condition = M.health
+ to_chat(user, "Mind Reading of [M.name]: ")
+
+ var/pain_condition = M.health / M.maxHealth
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
"their hair","what to do next","their job","space","amusing things","sad things",
@@ -575,41 +580,41 @@
var/thoughts = "thinking about [pick(randomthoughts)]"
if(M.fire_stacks)
- pain_condition -= 50
+ pain_condition -= 0.5
thoughts = "preoccupied with the fire"
if(M.radiation)
- pain_condition -= 25
+ pain_condition -= 0.25
switch(pain_condition)
- if(81 to INFINITY)
- to_chat(usr, "Condition : [M.name] feels good. ")
- if(61 to 80)
- to_chat(usr, "Condition : [M.name] is suffering mild pain. ")
- if(41 to 60)
- to_chat(usr, "Condition : [M.name] is suffering significant pain. ")
- if(21 to 40)
- to_chat(usr, "Condition : [M.name] is suffering severe pain. ")
+ if(0.81 to INFINITY)
+ to_chat(user, "Condition : [M.name] feels good. ")
+ if(0.61 to 0.8)
+ to_chat(user, "Condition : [M.name] is suffering mild pain. ")
+ if(0.41 to 0.6)
+ to_chat(user, "Condition : [M.name] is suffering significant pain. ")
+ if(0.21 to 0.4)
+ to_chat(user, "Condition : [M.name] is suffering severe pain. ")
else
- to_chat(usr, "Condition : [M.name] is suffering excruciating pain. ")
+ to_chat(user, "Condition : [M.name] is suffering excruciating pain. ")
thoughts = "haunted by their own mortality"
switch(M.a_intent)
if(I_HELP)
- to_chat(usr, "Mood : You sense benevolent thoughts from [M.name]. ")
+ to_chat(user, "Mood : You sense benevolent thoughts from [M.name]. ")
if(I_DISARM)
- to_chat(usr, "Mood : You sense cautious thoughts from [M.name]. ")
+ to_chat(user, "Mood : You sense cautious thoughts from [M.name]. ")
if(I_GRAB)
- to_chat(usr, "Mood : You sense hostile thoughts from [M.name]. ")
+ to_chat(user, "Mood : You sense hostile thoughts from [M.name]. ")
if(I_HARM)
- to_chat(usr, "Mood : You sense cruel thoughts from [M.name]. ")
+ to_chat(user, "Mood : You sense cruel thoughts from [M.name]. ")
for(var/mob/living/L in view(7,M))
if(L == M)
continue
thoughts = "thinking about punching [L.name]"
break
else
- to_chat(usr, "Mood : You sense strange thoughts from [M.name]. ")
+ to_chat(user, "Mood : You sense strange thoughts from [M.name]. ")
if(istype(M,/mob/living/carbon/human))
var/numbers[0]
@@ -618,11 +623,11 @@
numbers += H.mind.initial_account.account_number
numbers += H.mind.initial_account.remote_access_pin
if(numbers.len>0)
- to_chat(usr, "Numbers : You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]. ")
- to_chat(usr, "Thoughts : [M.name] is currently [thoughts]. ")
+ to_chat(user, "Numbers : You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]. ")
+ to_chat(user, "Thoughts : [M.name] is currently [thoughts]. ")
if(EMPATH in M.mutations)
- to_chat(M, "You sense [usr.name] reading your mind. ")
+ to_chat(M, "You sense [user.name] reading your mind. ")
else if(prob(5) || M.mind.assigned_role=="Chaplain")
to_chat(M, "You sense someone intruding upon your thoughts... ")
return
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index c42ac3e43e3..e159aa44247 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -28,17 +28,17 @@
action_icon_state = "genetic_morph"
-/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets)
- if(!ishuman(usr)) return
+/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets, mob/user = usr)
+ if(!ishuman(user)) return
- if(istype(usr.loc,/mob/))
- to_chat(usr, "You can't change your appearance right now! ")
+ if(istype(user.loc,/mob/))
+ to_chat(user, "You can't change your appearance right now! ")
return
- var/mob/living/carbon/human/M=usr
+ var/mob/living/carbon/human/M = user
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = M.get_int_organ(/obj/item/organ/internal/eyes)
- var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
+ var/new_gender = alert(user, "Please select gender.", "Character Generation", "Male", "Female")
if(new_gender)
if(new_gender == "Male")
M.change_gender(MALE)
@@ -219,7 +219,7 @@
validtargets += M
if(!validtargets.len)
- to_chat(usr, "There are no valid targets! ")
+ to_chat(user, "There are no valid targets! ")
start_recharge()
return
@@ -229,24 +229,24 @@
revert_cast(user)
return
- perform(targets)
+ perform(targets, user = user)
-/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets)
- if(!ishuman(usr)) return
+/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets, mob/user = usr)
+ if(!ishuman(user)) return
var/say = input("What do you wish to say") as text|null
if(!say)
return
say = strip_html(say)
for(var/mob/living/target in targets)
- log_say("Project Mind: [key_name(usr)]->[key_name(target)]: [say]")
+ log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]")
if(REMOTE_TALK in target.mutations)
- target.show_message("You hear [usr.real_name]'s voice: [say] ")
+ target.show_message("You hear [user.real_name]'s voice: [say] ")
else
target.show_message("You hear a voice that seems to echo around the room: [say] ")
- usr.show_message("You project your mind into [target.real_name]: [say] ")
+ user.show_message("You project your mind into [target.real_name]: [say] ")
for(var/mob/dead/observer/G in player_list)
- G.show_message("Telepathic message from [usr] ([ghost_follow_link(usr, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say] ")
+ G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say] ")
/datum/dna/gene/basic/grant_spell/remoteview
name="Remote Viewing"
@@ -283,39 +283,39 @@
if(REMOTE_VIEW in M.mutations)
remoteviewers += M
if(!remoteviewers.len || remoteviewers.len == 1)
- to_chat(usr, "No valid targets with remote view were found! ")
+ to_chat(user, "No valid targets with remote view were found! ")
start_recharge()
return
targets += input("Choose the target to spy on.", "Targeting") as mob in remoteviewers
- perform(targets)
+ perform(targets, user = user)
-/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets)
- var/mob/living/carbon/human/user
- if(ishuman(usr))
- user = usr
+/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets, mob/user = usr)
+ var/mob/living/carbon/human/H
+ if(ishuman(user))
+ H = user
else
return
var/mob/target
- if(istype(user.l_hand, /obj/item/tk_grab) || istype(user.r_hand, /obj/item/tk_grab/))
- to_chat(user, "Your mind is too busy with that telekinetic grab. ")
- user.remoteview_target = null
- user.reset_perspective(0)
+ if(istype(H.l_hand, /obj/item/tk_grab) || istype(H.r_hand, /obj/item/tk_grab/))
+ to_chat(H, "Your mind is too busy with that telekinetic grab. ")
+ H.remoteview_target = null
+ H.reset_perspective(0)
return
- if(user.client.eye != user.client.mob)
- user.remoteview_target = null
- user.reset_perspective(0)
+ if(H.client.eye != user.client.mob)
+ H.remoteview_target = null
+ H.reset_perspective(0)
return
for(var/mob/living/L in targets)
target = L
if(target)
- user.remoteview_target = target
- user.reset_perspective(target)
+ H.remoteview_target = target
+ H.reset_perspective(target)
else
- user.remoteview_target = null
- user.reset_perspective(0)
+ H.remoteview_target = null
+ H.reset_perspective(0)
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index e0187e940e4..d85b3c91258 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/antag_spawner
throw_speed = 1
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/used = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "")
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index 51820eaf5f4..6a7fa32c5c3 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -58,7 +58,6 @@
// if(!traitors.len)
// return 0
- ..()
return 1
@@ -92,7 +91,7 @@
if(player.current) // Remove mindshield-implanted mobs from the list
if(ishuman(player.current))
var/mob/living/carbon/human/H = player.current
- for(var/obj/item/weapon/implant/loyalty/I in H.contents)
+ for(var/obj/item/weapon/implant/mindshield/I in H.contents)
if(I && I.implanted)
possible_traitors -= player
@@ -142,7 +141,7 @@
set_antag_hud(newtraitor, "hudsyndicate")
var/obj_count = 1
- to_chat(newtraitor, "\blue Your current objectives:")
+ to_chat(newtraitor, "Your current objectives: ")
for(var/datum/objective/objective in newtraitor.mind.objectives)
to_chat(newtraitor, "Objective #[obj_count] : [objective.explanation_text]")
obj_count++
@@ -197,5 +196,3 @@
//message_admins("New traitor roll failed. No new traitor.")
//else
//message_admins("Late Joiner does not have Be Syndicate")
-
-
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 74a9ac9b217..336d66b8df8 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -135,7 +135,7 @@ var/list/blob_nodes = list()
else if(blob_client && location)
burst++
C.gib()
- var/obj/effect/blob/core/core = new(location, 200, blob_client, blob_point_rate)
+ var/obj/structure/blob/core/core = new(location, 200, blob_client, blob_point_rate)
if(core.overmind && core.overmind.mind)
core.overmind.mind.name = blob.name
infected_crew -= blob
@@ -192,7 +192,7 @@ var/list/blob_nodes = list()
declared = 1
if(1)
- command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
+ event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
if(2)
send_intercept(2)
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index 198c0264dd1..4c0e3dc3921 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -8,6 +8,7 @@
..()
return
if(1)
+ interceptname = "Level 5-6 Biohazard Response Procedures"
intercepttext += "Nanotrasen Update : Biohazard Alert. "
intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle. "
intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown. "
@@ -26,6 +27,7 @@
if(is_station_level(bomb.z))
bomb.r_code = nukecode
+ interceptname = "Classified [command_name()] Update"
intercepttext += "Nanotrasen Update : Biohazard Alert. "
intercepttext += "Directive 7-12 has been issued for [station_name()]. "
intercepttext += "The biohazard has grown out of control and will soon reach critical mass. "
@@ -41,17 +43,8 @@
aiPlayer.set_zeroth_law(law)
to_chat(aiPlayer, "Laws Updated: [law]")
- for(var/obj/machinery/computer/communications/comm in world)
- comm.messagetitle.Add(interceptname)
- comm.messagetext.Add(intercepttext)
- if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
- var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- playsound(comm.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- intercept.name = "Classified Central Command Update"
- intercept.info = intercepttext
- command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
- return
-
+ print_command_report(intercepttext, interceptname)
+ event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', from = "[command_name()] Update")
/datum/station_state
var/floor = 0
@@ -88,8 +81,10 @@
for(var/obj/O in T.contents)
if(istype(O, /obj/structure/window))
src.window += 1
- else if(istype(O, /obj/structure/grille) && (!O:destroyed))
- src.grille += 1
+ else if(istype(O, /obj/structure/grille))
+ var/obj/structure/grille/GR = O
+ if(!GR.broken)
+ grille += 1
else if(istype(O, /obj/machinery/door))
src.door += 1
else if(istype(O, /obj/machinery))
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 67229b51a1a..71a6b5be37f 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -37,7 +37,7 @@
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
speak_emote = list("pulses")
- var/obj/effect/blob/factory/factory = null
+ var/obj/structure/blob/factory/factory = null
var/list/human_overlays = list()
var/is_zombie = 0
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
@@ -48,11 +48,11 @@
/mob/living/simple_animal/hostile/blob/blobspore/CanPass(atom/movable/mover, turf/target, height=0)
- if(istype(mover, /obj/effect/blob))
+ if(istype(mover, /obj/structure/blob))
return 1
return ..()
-/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/effect/blob/factory/linked_node)
+/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/structure/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
factory.spores += src
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index afbc4ec9236..9dcb5b7e3eb 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -1,4 +1,4 @@
-/obj/effect/blob/core
+/obj/structure/blob/core
name = "blob core"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
@@ -11,9 +11,10 @@
var/is_offspring = null
var/selecting = 0
-/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring)
+/obj/structure/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring)
blob_cores += src
processing_objects.Add(src)
+ poi_list |= src
adjustcolors(color) //so it atleast appears
if(!overmind)
create_overmind(new_overmind)
@@ -25,7 +26,7 @@
..(loc, h)
-/obj/effect/blob/core/adjustcolors(var/a_color)
+/obj/structure/blob/core/adjustcolors(var/a_color)
overlays.Cut()
color = null
var/image/I = new('icons/mob/blob.dmi', "blob")
@@ -35,18 +36,19 @@
overlays += C
-/obj/effect/blob/core/Destroy()
+/obj/structure/blob/core/Destroy()
blob_cores -= src
if(overmind)
overmind.blob_core = null
overmind = null
processing_objects.Remove(src)
+ poi_list.Remove(src)
return ..()
-/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
-/obj/effect/blob/core/update_icon()
+/obj/structure/blob/core/update_icon()
if(health <= 0)
qdel(src)
return
@@ -55,10 +57,10 @@
overmind.update_health()
return
-/obj/effect/blob/core/RegenHealth()
+/obj/structure/blob/core/RegenHealth()
return // Don't regen, we handle it in Life()
-/obj/effect/blob/core/Life()
+/obj/structure/blob/core/Life()
if(!overmind)
create_overmind()
else
@@ -77,9 +79,9 @@
for(var/b_dir in alldirs)
if(!prob(5))
continue
- var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir)
+ var/obj/structure/blob/normal/B = locate() in get_step(src, b_dir)
if(B)
- B.change_to(/obj/effect/blob/shield)
+ B.change_to(/obj/structure/blob/shield)
if(B && overmind)
B.color = overmind.blob_reagent_datum.color
else
@@ -88,7 +90,7 @@
..()
-/obj/effect/blob/core/proc/create_overmind(var/client/new_overmind, var/override_delay)
+/obj/structure/blob/core/proc/create_overmind(var/client/new_overmind, var/override_delay)
if(overmind_get_delay > world.time && !override_delay)
return
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index 5ea20b49e58..81d3ab47493 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -1,4 +1,4 @@
-/obj/effect/blob/factory
+/obj/structure/blob/factory
name = "factory blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
@@ -9,18 +9,18 @@
var/spore_delay = 0
var/mob/camera/blob/overmind
-/obj/effect/blob/factory/update_icon()
+/obj/structure/blob/factory/update_icon()
if(health <= 0)
qdel(src)
-/obj/effect/blob/factory/Destroy()
+/obj/structure/blob/factory/Destroy()
for(var/mob/living/simple_animal/hostile/blob/blobspore/spore in spores)
if(spore.factory == src)
spore.factory = null
spores = null
return ..()
-/obj/effect/blob/factory/run_action()
+/obj/structure/blob/factory/run_action()
if(spores.len >= max_spores)
return 0
if(spore_delay > world.time)
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index f9a89391ee7..232511744ea 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -1,4 +1,4 @@
-/obj/effect/blob/node
+/obj/structure/blob/node
name = "blob node"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
@@ -6,12 +6,12 @@
fire_resist = 2
var/mob/camera/blob/overmind
-/obj/effect/blob/node/New(loc, var/h = 100)
+/obj/structure/blob/node/New(loc, var/h = 100)
blob_nodes += src
processing_objects.Add(src)
..(loc, h)
-/obj/effect/blob/node/adjustcolors(var/a_color)
+/obj/structure/blob/node/adjustcolors(var/a_color)
overlays.Cut()
color = null
var/image/I = new('icons/mob/blob.dmi', "blob")
@@ -20,15 +20,15 @@
var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay")
src.overlays += C
-/obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
-/obj/effect/blob/node/Destroy()
+/obj/structure/blob/node/Destroy()
blob_nodes -= src
processing_objects.Remove(src)
return ..()
-/obj/effect/blob/node/Life()
+/obj/structure/blob/node/Life()
if(overmind)
for(var/i = 1; i < 8; i += i)
Pulse(5, i, overmind.blob_reagent_datum.color)
@@ -38,7 +38,7 @@
health = min(initial(health), health + 1)
color = null
-/obj/effect/blob/node/update_icon()
+/obj/structure/blob/node/update_icon()
if(health <= 0)
qdel(src)
return
diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm
index d5b867e96c0..f5d838fd0a2 100644
--- a/code/game/gamemodes/blob/blobs/resource.dm
+++ b/code/game/gamemodes/blob/blobs/resource.dm
@@ -1,4 +1,4 @@
-/obj/effect/blob/resource
+/obj/structure/blob/resource
name = "resource blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
@@ -7,11 +7,11 @@
var/mob/camera/blob/overmind = null
var/resource_delay = 0
-/obj/effect/blob/resource/update_icon()
+/obj/structure/blob/resource/update_icon()
if(health <= 0)
qdel(src)
-/obj/effect/blob/resource/run_action()
+/obj/structure/blob/resource/run_action()
if(resource_delay > world.time)
return 0
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index 1c145f4404f..5ae1a040ab6 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -1,4 +1,4 @@
-/obj/effect/blob/shield
+/obj/structure/blob/shield
name = "strong blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
@@ -7,15 +7,15 @@
fire_resist = 2
-/obj/effect/blob/shield/update_icon()
+/obj/structure/blob/shield/update_icon()
if(health <= 0)
qdel(src)
return
return
-/obj/effect/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
-/obj/effect/blob/shield/CanPass(atom/movable/mover, turf/target, height=0)
+/obj/structure/blob/shield/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm
index b6c993f82fe..f29fb9af405 100644
--- a/code/game/gamemodes/blob/blobs/storage.dm
+++ b/code/game/gamemodes/blob/blobs/storage.dm
@@ -1,4 +1,4 @@
-/obj/effect/blob/storage
+/obj/structure/blob/storage
name = "storage blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
@@ -6,11 +6,11 @@
fire_resist = 2
var/mob/camera/blob/overmind = null
-/obj/effect/blob/storage/update_icon()
+/obj/structure/blob/storage/update_icon()
if(health <= 0)
overmind.max_blob_points -= 50
qdel(src)
-/obj/effect/blob/storage/proc/update_max_blob_points(var/new_point_increase)
+/obj/structure/blob/storage/proc/update_max_blob_points(var/new_point_increase)
if(overmind)
overmind.max_blob_points += new_point_increase
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index e6bb0e76be9..2af2a53a939 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -11,7 +11,7 @@
pass_flags = PASSBLOB
faction = list("blob")
- var/obj/effect/blob/core/blob_core = null // The blob overmind's core
+ var/obj/structure/blob/core/blob_core = null // The blob overmind's core
var/blob_points = 0
var/max_blob_points = 100
var/last_attack = 0
@@ -44,8 +44,7 @@
/mob/camera/blob/Destroy()
if(ghostimage)
ghost_darkness_images -= ghostimage
- qdel(ghostimage)
- ghostimage = null;
+ QDEL_NULL(ghostimage)
updateallghostimages()
return ..()
@@ -117,7 +116,7 @@
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
/mob/camera/blob/Move(var/NewLoc, var/Dir = 0)
- var/obj/effect/blob/B = locate() in range("3x3", NewLoc)
+ var/obj/structure/blob/B = locate() in range("3x3", NewLoc)
if(B)
loc = NewLoc
else
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index 166f3f590ac..dfae19f5135 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -27,7 +27,7 @@
for(var/i = 1; i <= blob_nodes.len; i++)
nodes["Blob Node #[i]"] = blob_nodes[i]
var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes
- var/obj/effect/blob/node/chosen_node = nodes[node_name]
+ var/obj/structure/blob/node/chosen_node = nodes[node_name]
if(chosen_node)
src.loc = chosen_node.loc
@@ -41,13 +41,13 @@
/mob/camera/blob/proc/create_shield(var/turf/T)
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
+ var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)//We are on a blob
to_chat(src, "There is no blob here!")
return
- if(!istype(B, /obj/effect/blob/normal))
+ if(!istype(B, /obj/structure/blob/normal))
to_chat(src, "Unable to use this blob, find a normal one.")
return
@@ -55,7 +55,7 @@
return
B.color = blob_reagent_datum.color
- B.change_to(/obj/effect/blob/shield)
+ B.change_to(/obj/structure/blob/shield)
return
@@ -72,17 +72,17 @@
if(!T)
return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
+ var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)//We are on a blob
to_chat(src, "There is no blob here!")
return
- if(!istype(B, /obj/effect/blob/normal))
+ if(!istype(B, /obj/structure/blob/normal))
to_chat(src, "Unable to use this blob, find a normal one.")
return
- for(var/obj/effect/blob/resource/blob in orange(4, T))
+ for(var/obj/structure/blob/resource/blob in orange(4, T))
to_chat(src, "There is a resource blob nearby, move more than 4 tiles away from it!")
return
@@ -90,8 +90,8 @@
return
B.color = blob_reagent_datum.color
- B.change_to(/obj/effect/blob/resource)
- var/obj/effect/blob/resource/R = locate() in T
+ B.change_to(/obj/structure/blob/resource)
+ var/obj/structure/blob/resource/R = locate() in T
if(R)
R.overmind = src
@@ -108,25 +108,25 @@
if(!T)
return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
+ var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)//We are on a blob
to_chat(src, "There is no blob here!")
return
- if(!istype(B, /obj/effect/blob/normal))
+ if(!istype(B, /obj/structure/blob/normal))
to_chat(src, "Unable to use this blob, find a normal one.")
return
- for(var/obj/effect/blob/node/blob in orange(5, T))
+ for(var/obj/structure/blob/node/blob in orange(5, T))
to_chat(src, "There is another node nearby, move more than 5 tiles away from it!")
return
if(!can_buy(60))
return
- B.change_to(/obj/effect/blob/node)
- var/obj/effect/blob/node/R = locate() in T
+ B.change_to(/obj/structure/blob/node)
+ var/obj/structure/blob/node/R = locate() in T
if(R)
R.adjustcolors(blob_reagent_datum.color)
R.overmind = src
@@ -144,25 +144,25 @@
if(!T)
return
- var/obj/effect/blob/B = locate(/obj/effect/blob) in T
+ var/obj/structure/blob/B = locate(/obj/structure/blob) in T
if(!B)
to_chat(src, "You must be on a blob!")
return
- if(!istype(B, /obj/effect/blob/normal))
+ if(!istype(B, /obj/structure/blob/normal))
to_chat(src, "Unable to use this blob, find a normal one.")
return
- for(var/obj/effect/blob/factory/blob in orange(7, T))
+ for(var/obj/structure/blob/factory/blob in orange(7, T))
to_chat(src, "There is a factory blob nearby, move more than 7 tiles away from it!")
return
if(!can_buy(60))
return
- B.change_to(/obj/effect/blob/factory)
+ B.change_to(/obj/structure/blob/factory)
B.color = blob_reagent_datum.color
- var/obj/effect/blob/factory/R = locate() in T
+ var/obj/structure/blob/factory/R = locate() in T
if(R)
R.overmind = src
return
@@ -178,12 +178,12 @@
if(!T)
return
- var/obj/effect/blob/B = locate(/obj/effect/blob) in T
+ var/obj/structure/blob/B = locate(/obj/structure/blob) in T
if(!B)
to_chat(src, "You must be on a blob!")
return
- if(!istype(B, /obj/effect/blob/factory))
+ if(!istype(B, /obj/structure/blob/factory))
to_chat(src, "Unable to use this blob, find a factory blob.")
return
@@ -210,7 +210,7 @@
if(!T)
return
- var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T
+ var/obj/structure/blob/node/B = locate(/obj/structure/blob/node) in T
if(!B)
to_chat(src, "You must be on a blob node!")
return
@@ -234,12 +234,12 @@
if(!T)
return
- var/obj/effect/blob/B = locate(/obj/effect/blob) in T
+ var/obj/structure/blob/B = locate(/obj/structure/blob) in T
if(!B)
to_chat(src, "You must be on a blob!")
return
- if(istype(B, /obj/effect/blob/core))
+ if(istype(B, /obj/structure/blob/core))
to_chat(src, "Unable to remove this blob.")
return
@@ -261,12 +261,12 @@
if(!can_attack())
return
- var/obj/effect/blob/B = locate() in T
+ var/obj/structure/blob/B = locate() in T
if(B)
to_chat(src, "There is a blob here!")
return
- var/obj/effect/blob/OB = locate() in circlerange(T, 1)
+ var/obj/structure/blob/OB = locate() in circlerange(T, 1)
if(!OB)
to_chat(src, "There is no blob adjacent to you.")
return
@@ -319,7 +319,7 @@
if(!blob_nodes || !blob_nodes.len)
to_chat(src, "A node is required to birth your offspring... ")
return
- var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes
+ var/obj/structure/blob/node/N = locate(/obj/structure/blob) in blob_nodes
if(!N)
to_chat(src, "A node is required to birth your offspring... ")
return
@@ -328,12 +328,12 @@
return
verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness
- new /obj/effect/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring")
+ new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring")
qdel(N)
if(ticker && ticker.mode.name == "blob")
var/datum/game_mode/blob/BL = ticker.mode
- BL.blobwincount = initial(BL.blobwincount) * 2
+ BL.blobwincount += initial(BL.blobwincount)
/mob/camera/blob/verb/blob_broadcast()
@@ -362,17 +362,17 @@
if(!T)
return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
+ var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)//We are on a blob
to_chat(src, "There is no blob here!")
return
- if(!istype(B, /obj/effect/blob/normal))
+ if(!istype(B, /obj/structure/blob/normal))
to_chat(src, "Unable to use this blob, find a normal one.")
return
- for(var/obj/effect/blob/storage/blob in orange(3, T))
+ for(var/obj/structure/blob/storage/blob in orange(3, T))
to_chat(src, "There is a storage blob nearby, move more than 4 tiles away from it!")
return
@@ -380,8 +380,8 @@
return
B.color = blob_reagent_datum.color
- B.change_to(/obj/effect/blob/storage)
- var/obj/effect/blob/storage/R = locate() in T
+ B.change_to(/obj/structure/blob/storage)
+ var/obj/structure/blob/storage/R = locate() in T
if(R)
R.overmind = src
R.update_max_blob_points(50)
@@ -400,7 +400,7 @@
var/datum/reagent/blob/B = pick((subtypesof(/datum/reagent/blob) - blob_reagent_datum.type))
blob_reagent_datum = new B
- for(var/obj/effect/blob/BL in blobs)
+ for(var/obj/structure/blob/BL in blobs)
BL.adjustcolors(blob_reagent_datum.color)
for(var/mob/living/simple_animal/hostile/blob/BLO)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 1de939c40e7..b7558d0c9cf 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -1,5 +1,5 @@
//I will need to recode parts of this but I am way too tired atm
-/obj/effect/blob
+/obj/structure/blob
name = "blob"
icon = 'icons/mob/blob.dmi'
light_range = 3
@@ -13,7 +13,7 @@
var/fire_resist = 1
-/obj/effect/blob/New(loc)
+/obj/structure/blob/New(loc)
blobs += src
src.dir = pick(1, 2, 4, 8)
src.update_icon()
@@ -23,37 +23,40 @@
return
-/obj/effect/blob/Destroy()
+/obj/structure/blob/Destroy()
blobs -= src
if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
return ..()
-/obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0)
+/obj/structure/blob/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
-/obj/effect/blob/CanAStarPass(ID, dir, caller)
+/obj/structure/blob/CanAStarPass(ID, dir, caller)
. = 0
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSBLOB)
-/obj/effect/blob/process()
+/obj/structure/blob/process()
Life()
return
-/obj/effect/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
var/damage = Clamp(0.01 * exposed_temperature, 0, 4)
take_damage(damage, BURN)
-/obj/effect/blob/proc/Life()
+/obj/structure/blob/blob_act()
return
-/obj/effect/blob/proc/RegenHealth()
+/obj/structure/blob/proc/Life()
+ return
+
+/obj/structure/blob/proc/RegenHealth()
// All blobs heal over time when pulsed, but it has a cool down
if(health_timestamp > world.time)
return 0
@@ -63,7 +66,7 @@
health_timestamp = world.time + 10 // 1 seconds
-/obj/effect/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0, var/a_color)//Todo: Fix spaceblob expand
+/obj/structure/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0, var/a_color)//Todo: Fix spaceblob expand
set background = BACKGROUND_ENABLED
@@ -83,7 +86,7 @@
var/dirn = pick(dirs)
dirs.Remove(dirn)
var/turf/T = get_step(src, dirn)
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
+ var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)
expand(T,1,a_color)//No blob here so try and expand
return
@@ -94,11 +97,11 @@
return
-/obj/effect/blob/proc/run_action()
+/obj/structure/blob/proc/run_action()
return 0
-/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1, var/a_color)
+/obj/structure/blob/proc/expand(var/turf/T = null, var/prob = 1, var/a_color)
if(prob && !prob(health)) return
if(istype(T, /turf/space) && prob(75)) return
if(!T)
@@ -107,11 +110,11 @@
var/dirn = pick(dirs)
dirs.Remove(dirn)
T = get_step(src, dirn)
- if(!(locate(/obj/effect/blob) in T)) break
+ if(!(locate(/obj/structure/blob) in T)) break
else T = null
if(!T) return 0
- var/obj/effect/blob/normal/B = new /obj/effect/blob/normal(src.loc, min(src.health, 30))
+ var/obj/structure/blob/normal/B = new /obj/structure/blob/normal(src.loc, min(src.health, 30))
B.color = a_color
B.density = 1
if(T.Enter(B,src))//Attempt to move into the tile
@@ -126,22 +129,25 @@
A.blob_act()
return 1
-/obj/effect/blob/ex_act(severity)
+/obj/structure/blob/ex_act(severity)
..()
var/damage = 150 - 20 * severity
take_damage(damage, BRUTE)
-/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
+/obj/structure/blob/bullet_act(var/obj/item/projectile/Proj)
..()
take_damage(Proj.damage, Proj.damage_type)
return 0
-/obj/effect/blob/Crossed(var/mob/living/L)
+/obj/structure/blob/Crossed(var/mob/living/L)
..()
L.blob_act()
+/obj/structure/blob/tesla_act(power)
+ ..()
+ take_damage(power/400, BURN)
-/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/living/user, params)
+/obj/structure/blob/attackby(var/obj/item/weapon/W, var/mob/living/user, params)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
@@ -150,7 +156,7 @@
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
take_damage(W.force, W.damtype)
-/obj/effect/blob/attack_animal(mob/living/simple_animal/M as mob)
+/obj/structure/blob/attack_animal(mob/living/simple_animal/M as mob)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
@@ -159,7 +165,7 @@
take_damage(damage, BRUTE)
return
-/obj/effect/blob/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+/obj/structure/blob/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
@@ -168,7 +174,7 @@
take_damage(damage, BRUTE)
return
-/obj/effect/blob/proc/take_damage(damage, damage_type)
+/obj/structure/blob/proc/take_damage(damage, damage_type)
if(!damage || damage_type == STAMINA) // Avoid divide by zero errors
return
switch(damage_type)
@@ -179,38 +185,38 @@
health -= damage
update_icon()
-/obj/effect/blob/proc/change_to(var/type)
+/obj/structure/blob/proc/change_to(var/type)
if(!ispath(type))
error("[type] is an invalid type for the blob.")
- var/obj/effect/blob/B = new type(src.loc)
- if(!istype(type, /obj/effect/blob/core) || !istype(type, /obj/effect/blob/node))
+ var/obj/structure/blob/B = new type(src.loc)
+ if(!istype(type, /obj/structure/blob/core) || !istype(type, /obj/structure/blob/node))
B.color = color
else
B.adjustcolors(color)
qdel(src)
-/obj/effect/blob/proc/adjustcolors(var/a_color)
+/obj/structure/blob/proc/adjustcolors(var/a_color)
if(a_color)
color = a_color
return
-/obj/effect/blob/examine(mob/user)
+/obj/structure/blob/examine(mob/user)
..(user)
to_chat(user, "It looks like it's of a [get_chem_name()] kind.")
-/obj/effect/blob/proc/get_chem_name()
+/obj/structure/blob/proc/get_chem_name()
for(var/mob/camera/blob/B in mob_list)
if(lowertext(B.blob_reagent_datum.color) == lowertext(src.color)) // Goddamit why we use strings for these
return B.blob_reagent_datum.name
return "unknown"
-/obj/effect/blob/normal
+/obj/structure/blob/normal
icon_state = "blob"
light_range = 0
health = 21
-/obj/effect/blob/normal/update_icon()
+/obj/structure/blob/normal/update_icon()
if(health <= 0)
qdel(src)
else if(health <= 15)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index c25802d38fc..5c3f94a44a3 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -3,7 +3,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/game_mode
var/list/datum/mind/changelings = list()
-
/datum/game_mode/changeling
name = "changeling"
config_tag = "changeling"
@@ -38,7 +37,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
to_chat(world, "There are alien changelings on the station. Do not let the changelings succeed! ")
/datum/game_mode/changeling/pre_setup()
-
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
@@ -69,8 +67,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
..()
-
-/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling)
+/datum/game_mode/proc/forge_changeling_objectives(datum/mind/changeling)
//OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives.
//If they have two objectives as well as absorb, they must survive rather than escape
//No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting
@@ -111,11 +108,11 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
if(identity_theft.target && identity_theft.target.current)
identity_theft.target_real_name = kill_objective.target.current.real_name //Whoops, forgot this.
var/mob/living/carbon/human/H = identity_theft.target.current
- if(check_species_absorb(H.species)) // For species that can't be absorbed - should default to an escape objective
- return
- else
+ if(can_absorb_species(H.species)) // For species that can't be absorbed - should default to an escape objective
identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card."
- changeling.objectives += identity_theft
+ changeling.objectives += identity_theft
+ else
+ qdel(identity_theft)
if(!(locate(/datum/objective/escape) in changeling.objectives))
if(prob(70))
@@ -129,7 +126,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
changeling.objectives += identity_theft
return
-/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
+/datum/game_mode/proc/greet_changeling(datum/mind/changeling, you_are=1)
if(you_are)
to_chat(changeling.current, "You are a changeling! ")
to_chat(changeling.current, "Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them. ")
@@ -145,8 +142,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
obj_count++
return
-
-
/datum/game_mode/proc/remove_changeling(datum/mind/changeling_mind)
if(changeling_mind in changelings)
changelings -= changeling_mind
@@ -171,7 +166,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
set_antag_hud(changeling.current, null)
/datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/changeling_mob)
- if(!istype(changeling_mob)) return
+ if(!istype(changeling_mob))
+ return
changeling_mob.make_changeling()
/datum/game_mode/proc/auto_declare_completion_changeling()
@@ -218,7 +214,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
to_chat(world, text)
-
return 1
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
@@ -235,6 +230,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/changelingID = "Changeling"
var/geneticdamage = 0
var/isabsorbing = 0
+ var/islinking = 0
var/geneticpoints = 10
var/purchasedpowers = list()
var/mimicing = ""
@@ -243,11 +239,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/datum/dna/chosen_dna
var/obj/effect/proc_holder/changeling/sting/chosen_sting
-/datum/changeling/New(var/gender=FEMALE)
+/datum/changeling/New(gender=FEMALE)
..()
var/honorific
- if(gender == FEMALE) honorific = "Ms."
- else honorific = "Mr."
+ if(gender == FEMALE)
+ honorific = "Ms."
+ else
+ honorific = "Mr."
if(possible_changeling_IDs.len)
changelingID = pick(possible_changeling_IDs)
possible_changeling_IDs -= changelingID
@@ -259,25 +257,24 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage)
geneticdamage = max(0, geneticdamage-1)
-
-/datum/changeling/proc/GetDNA(var/dna_owner)
+/datum/changeling/proc/GetDNA(dna_owner)
for(var/datum/dna/DNA in (absorbed_dna + protected_dna))
if(dna_owner == DNA.real_name)
return DNA
-/datum/changeling/proc/find_dna(var/datum/dna/tDNA)
+/datum/changeling/proc/find_dna(datum/dna/tDNA)
for(var/datum/dna/D in (absorbed_dna + protected_dna))
if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species == D.species)
return D
return null
-/datum/changeling/proc/has_dna(var/datum/dna/tDNA)
+/datum/changeling/proc/has_dna(datum/dna/tDNA)
if(find_dna(tDNA))
return 1
return 0
// A changeling's DNA is "stale" if their current form's DNA is the oldest DNA in a full list
-/datum/changeling/proc/using_stale_dna(var/mob/living/carbon/user)
+/datum/changeling/proc/using_stale_dna(mob/living/carbon/user)
var/current_dna = find_dna(user.dna)
if(absorbed_dna.len < dna_max)
return 0 // Still more room for DNA
@@ -292,7 +289,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
if(absorbed_dna.len > dna_max)
absorbed_dna.Cut(1, (absorbed_dna.len - dna_max) + 1)
-/datum/changeling/proc/can_absorb_dna(var/mob/living/carbon/user, var/mob/living/carbon/target)
+/datum/changeling/proc/can_absorb_dna(mob/living/carbon/user, mob/living/carbon/target)
if(using_stale_dna(user))//If our current DNA is the stalest, we gotta ditch it.
to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more. ")
return
@@ -319,5 +316,5 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
return 1
-/proc/check_species_absorb(datum/species/S)
+/proc/can_absorb_species(datum/species/S)
return !(S.flags & NO_DNA)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 57b69358f6b..06402a584b7 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -1,3 +1,5 @@
+#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob
+
/obj/effect/proc_holder/changeling/absorbDNA
name = "Absorb DNA"
desc = "Absorb the DNA of our victim."
@@ -26,8 +28,6 @@
var/mob/living/carbon/target = G.affecting
return changeling.can_absorb_dna(user,target)
-
-
/obj/effect/proc_holder/changeling/absorbDNA/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/obj/item/weapon/grab/G = user.get_active_hand()
@@ -63,7 +63,25 @@
if(target.mind)//if the victim has got a mind
- target.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
+ target.mind.show_memory(user, 0) //I can read your mind, kekeke. Output all their notes.
+
+ //Some of target's recent speech, so the changeling can attempt to imitate them better.
+ //Recent as opposed to all because rounds tend to have a LOT of text.
+ var/list/recent_speech = list()
+
+ if(target.say_log.len > LING_ABSORB_RECENT_SPEECH)
+ recent_speech = target.say_log.Copy(target.say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list
+ else
+ recent_speech = target.say_log.Copy()
+
+ if(recent_speech.len)
+ user.mind.store_memory("Some of [target]'s speech patterns, we should study these to better impersonate them! ")
+ to_chat(user, "Some of [target]'s speech patterns, we should study these to better impersonate them! ")
+ for(var/spoken_memory in recent_speech)
+ user.mind.store_memory("\"[spoken_memory]\"")
+ to_chat(user, "\"[spoken_memory]\" ")
+ user.mind.store_memory("We have no more knowledge of [target]'s speech patterns. ")
+ to_chat(user, "We have no more knowledge of [target]'s speech patterns. ")
if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
@@ -72,7 +90,6 @@
target.mind.changeling.absorbed_dna.len = 1
target.mind.changeling.absorbedcount = 0
-
changeling.chem_charges=min(changeling.chem_charges+10, changeling.chem_storage)
changeling.isabsorbing = 0
@@ -82,8 +99,6 @@
target.Drain()
return 1
-
-
//Absorbs the target DNA.
/datum/changeling/proc/absorb_dna(mob/living/carbon/T, var/mob/user)
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
@@ -104,3 +119,5 @@
return
absorbed_dna |= new_dna
trim_dna()
+
+#undef LING_ABSORB_RECENT_SPEECH
diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
index 83c29ed9109..a9899b33462 100644
--- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
+++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
@@ -7,7 +7,6 @@
helptext = "Grants us thermal vision or flash protection. We will become a lot more vulnerable to flash-based devices while thermal vision is active."
chemical_cost = 0
dna_cost = 2 //Would be 1 without thermal vision
- var/active = 0 //Whether or not vision is enhanced
/obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user)
if(!istype(user))
diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm
index e587a7db0ab..fb3012cd274 100644
--- a/code/game/gamemodes/changeling/powers/humanform.dm
+++ b/code/game/gamemodes/changeling/powers/humanform.dm
@@ -24,15 +24,18 @@
if(!user)
return 0
to_chat(user, "We transform our appearance. ")
- user.dna.SetSEState(MONKEYBLOCK,0)
- domutcheck(user, null) // Do a pre-mutcheck to cleanly switch from monkey form.
- user.dna = chosen_dna
+ user.dna.SetSEState(MONKEYBLOCK,0,1)
+ genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
+ user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
+ if(istype(user))
+ user.set_species(chosen_dna.species)
+ domutcheck(user,null,MUTCHK_FORCED)
user.flavor_text = ""
- if(ishuman(user))
- user.set_species()
+ user.dna.UpdateSE()
+ user.dna.UpdateUI()
+ user.sync_organ_dna(1)
user.UpdateAppearance()
- domutcheck(user, null)
changeling.purchasedpowers -= src
//O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/lesserform(null)
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index e5040af282f..8ba1e53cb10 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -21,6 +21,7 @@
to_chat(H, "We cannot perform this ability in this form! ")
return
+ user.dna = user.dna.Clone()
H.visible_message("[H] transforms! ")
changeling.geneticdamage = 30
to_chat(H, "Our genes cry out! ")
diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm
new file mode 100644
index 00000000000..7c198f5e6af
--- /dev/null
+++ b/code/game/gamemodes/changeling/powers/linglink.dm
@@ -0,0 +1,73 @@
+/obj/effect/proc_holder/changeling/linglink
+ name = "Hivemind Link"
+ desc = "Link your victim's mind into the hivemind for personal interrogation"
+ chemical_cost = 0
+ dna_cost = 0
+ req_human = 1
+ max_genetic_damage = 100
+
+/obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user)
+ if(!..())
+ return
+ var/datum/changeling/changeling = user.mind.changeling
+ var/obj/item/weapon/grab/G = user.get_active_hand()
+
+ if(changeling.islinking)
+ to_chat(user, "We have already formed a link with the victim! ")
+ return
+ if(!istype(G))
+ to_chat(user, "We must be tightly grabbing a creature in our active hand to link with them! ")
+ return
+ if(G.state <= GRAB_AGGRESSIVE)
+ to_chat(user, "We must have a tighter grip to link with this creature! ")
+ return
+ if(iscarbon(G.affecting))
+ var/mob/living/carbon/target = G.affecting
+ if(!target.mind)
+ to_chat(user, "The victim has no mind to link to! ")
+ return
+ if(target.stat == DEAD)
+ to_chat(user, "The victim is dead, you cannot link to a dead mind! ")
+ return
+ if(target.mind.changeling)
+ to_chat(user, "The victim is already a part of the hivemind! ")
+ return
+ return changeling.can_absorb_dna(user,target)
+
+/obj/effect/proc_holder/changeling/linglink/sting_action(mob/user)
+ var/datum/changeling/changeling = user.mind.changeling
+ var/obj/item/weapon/grab/G = user.get_active_hand()
+ var/mob/living/carbon/target = G.affecting
+ changeling.islinking = 1
+ for(var/stage = 1, stage<=3, stage++)
+ switch(stage)
+ if(1)
+ to_chat(user, "This creature is compatible. We must hold still... ")
+ if(2)
+ to_chat(user, "We stealthily stab [target] with a minor proboscis... ")
+ to_chat(target, "You experience a stabbing sensation and your ears begin to ring... ")
+ if(3)
+ to_chat(user, "You mold the [target]'s mind like clay, they can now speak in the hivemind! ")
+ to_chat(target, "A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened! ")
+ for(var/mob/M in mob_list)
+ if(all_languages["Changeling"] in M.languages)
+ to_chat(M, "We can sense a foreign presence in the hivemind... ")
+ target.mind.linglink = 1
+ target.add_language("Changeling")
+ target.say(":g AAAAARRRRGGGGGHHHHH!!")
+ to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate! ")
+ target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
+ sleep(1800)
+ feedback_add_details("changeling_powers","A[stage]")
+ if(!do_mob(user, target, 20))
+ to_chat(user, "Our link with [target] has ended! ")
+ target.remove_language("Changeling")
+ changeling.islinking = 0
+ target.mind.linglink = 0
+ return
+
+ target.remove_language("Changeling")
+ changeling.islinking = 0
+ target.mind.linglink = 0
+ to_chat(user, "You cannot sustain the connection any longer, your victim fades from the hivemind ")
+ to_chat(target, "The link cannot be sustained any longer, your connection to the hivemind has faded! ")
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 4219032fb96..c7d393b77a7 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -125,7 +125,7 @@
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
sharp = 1
edge = 1
force = 25
@@ -279,7 +279,7 @@
name = "flesh mass"
icon_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | NODROP
+ flags = BLOCKHAIR | STOPSPRESSUREDMAGE | NODROP
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/space/changeling/dropped()
@@ -330,7 +330,7 @@
name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
- flags = HEADCOVERSEYES | BLOCKHAIR | NODROP
+ flags = BLOCKHAIR | NODROP
armor = list(melee = 30, bullet = 30, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0)
flags_inv = HIDEEARS
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index dd15a313701..8ae82a0e788 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -11,6 +11,16 @@
to_chat(user, "We cleanse impurities from our form. ")
+ var/mob/living/simple_animal/borer/B = user.has_brain_worms()
+ if(B)
+ if(B.controlling)
+ B.detach()
+ B.leave_host()
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.vomit(0)
+ to_chat(user, "We expel a parasite from our form. ")
+
var/obj/item/organ/internal/body_egg/egg = user.get_int_organ(/obj/item/organ/internal/body_egg)
if(egg)
egg.remove(user)
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 8cb58d8dbe0..5fd98986332 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -35,29 +35,29 @@
H.species.create_organs(H)
// Now that recreating all organs is necessary, the rest of this organ stuff probably
// isn't, but I don't want to remove it, just in case.
- for(var/organ_name in H.organs_by_name)
- var/obj/item/organ/external/O = H.organs_by_name[organ_name]
- if(!O) continue
+ for(var/organ_name in H.bodyparts_by_name)
+ var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name]
+ if(!O)
+ continue
for(var/obj/item/weapon/shard/shrapnel/s in O.implants)
- if(istype(s))
- O.implants -= s
- H.contents -= s
- qdel(s)
+ O.implants -= s
+ H.contents -= s
+ qdel(s)
O.brute_dam = 0
O.burn_dam = 0
O.damage_state = "00"
O.germ_level = 0
- O.hidden = null
+ QDEL_NULL(O.hidden)
O.number_wounds = 0
O.open = 0
O.perma_injury = 0
O.status = 0
- O.trace_chemicals = list()
- O.wounds = list()
+ O.trace_chemicals.Cut()
+ QDEL_LIST(O.wounds)
O.wound_update_accuracy = 1
for(var/obj/item/organ/internal/IO in H.internal_organs)
IO.damage = 0
- IO.trace_chemicals = list()
+ IO.trace_chemicals.Cut()
H.updatehealth()
to_chat(user, "We have regenerated. ")
diff --git a/code/game/gamemodes/changeling/powers/spiders.dm b/code/game/gamemodes/changeling/powers/spiders.dm
index 135fd92479c..348924c7d7b 100644
--- a/code/game/gamemodes/changeling/powers/spiders.dm
+++ b/code/game/gamemodes/changeling/powers/spiders.dm
@@ -9,7 +9,7 @@
//Makes some spiderlings. Good for setting traps and causing general trouble.
/obj/effect/proc_holder/changeling/spiders/sting_action(var/mob/user)
for(var/i=0, i<2, i++)
- var/obj/effect/spider/spiderling/S = new(user.loc)
+ var/obj/structure/spider/spiderling/S = new(user.loc)
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter
feedback_add_details("changeling_powers","SI")
diff --git a/code/game/gamemodes/changeling/powers/strained_muscles.dm b/code/game/gamemodes/changeling/powers/strained_muscles.dm
index 92cf9ad7fdf..28884c2653a 100644
--- a/code/game/gamemodes/changeling/powers/strained_muscles.dm
+++ b/code/game/gamemodes/changeling/powers/strained_muscles.dm
@@ -9,11 +9,11 @@
dna_cost = 1
req_human = 1
var/stacks = 0 //Increments every 5 seconds; damage increases over time
- var/active = 0 //Whether or not you are a hedgehog
+ var/enabled = 0 //Whether or not you are a hedgehog
/obj/effect/proc_holder/changeling/strained_muscles/sting_action(var/mob/living/carbon/user)
- active = !active
- if(active)
+ enabled = !enabled
+ if(enabled)
to_chat(user, "Our muscles tense and strengthen. ")
else
user.status_flags &= ~GOTTAGOFAST
@@ -23,10 +23,10 @@
user.Weaken(3)
user.emote("gasp")
- while(active)
+ while(enabled)
user.status_flags |= GOTTAGOFAST
if(user.stat || user.staminaloss >= 90)
- active = 0 //Let's use something exact instead of !active where we can.
+ enabled = 0 //Let's use something exact instead of !enabled where we can.
to_chat(user, "Our muscles relax without the energy to strengthen them. ")
user.status_flags &= ~GOTTAGOFAST
user.Weaken(2)
@@ -42,7 +42,7 @@
sleep(40)
- while(!active) //Damage stacks decrease fairly rapidly while not in sanic mode
+ while(!enabled) //Damage stacks decrease fairly rapidly while not in sanic mode
if(stacks >= 1)
stacks--
sleep(20)
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index f1ff51a42a2..b7c8abefd1d 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -16,12 +16,15 @@
return
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- user.flavor_text = ""
if(ishuman(user))
- user.set_species()
+ user.set_species(chosen_dna.species)
+ domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
+ user.flavor_text = ""
+ user.dna.UpdateSE()
+ user.dna.UpdateUI()
+ user.sync_organ_dna(1)
user.UpdateAppearance()
- domutcheck(user, null)
-
+
user.changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","TR")
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 30066bb6bc9..4f4152e2e22 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -19,7 +19,7 @@ var/global/list/all_cults = list()
return 0
if(ishuman(mind.current))
var/mob/living/carbon/human/H = mind.current
- if(isloyal(H))
+ if(ismindshielded(H))
return 0
if(issilicon(mind.current))
return 0 //can't convert machines, that's ratvar's thing
@@ -106,14 +106,6 @@ var/global/list/all_cults = list()
/datum/game_mode/cult/post_setup()
modePlayer += cult
acolytes_needed = acolytes_needed + round((num_players_started() / 10))
- if("sacrifice" in objectives)
- var/list/possible_targets = get_unconvertables()
- if(!possible_targets.len)
- for(var/mob/living/carbon/human/player in player_list)
- if(player.mind && !(player.mind in cult))
- possible_targets += player.mind
- if(possible_targets.len > 0)
- sacrifice_target = pick(possible_targets)
for(var/datum/mind/cult_mind in cult)
equip_cultist(cult_mind.current)
@@ -178,24 +170,21 @@ var/global/list/all_cults = list()
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
if(!istype(cult_mind))
return 0
+ var/datum/game_mode/cult/cult_mode = ticker.mode
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
cult += cult_mind
cult_mind.current.faction |= "cult"
var/datum/action/innate/cultcomm/C = new()
C.Grant(cult_mind.current)
- cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult! "
- if(jobban_isbanned(cult_mind.current, ROLE_CULTIST))
- replace_jobbaned_player(cult_mind.current, ROLE_CULTIST)
+ cult_mind.current.create_attack_log("Has been converted to the cult! ")
+ if(jobban_isbanned(cult_mind.current, ROLE_CULTIST) || jobban_isbanned(cult_mind.current, ROLE_SYNDICATE))
+ replace_jobbanned_player(cult_mind.current, ROLE_CULTIST)
update_cult_icons_added(cult_mind)
+ cult_mode.memorize_cult_objectives(cult_mind)
+ if(GAMEMODE_IS_CULT)
+ cult_mode.check_numbers()
return 1
-
-/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT
- if(!..(cult_mind))
- return
- memorize_cult_objectives(cult_mind)
-
-
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
if(cult_mind in cult)
cult -= cult_mind
@@ -327,7 +316,7 @@ var/global/list/all_cults = list()
feedback_add_details("cult_objective","cult_demons|FAIL")
if("convert")//convert half the crew
- if(obj_count < objectives.len)
+ if(cult.len >= convert_target)
explanation = "Convert [convert_target] crewmembers ([cult.len] cultists at round end). Success! "
feedback_add_details("cult_objective","cult_convertion|SUCCESS")
else
@@ -335,7 +324,7 @@ var/global/list/all_cults = list()
feedback_add_details("cult_objective","cult_convertion|FAIL")
if("bloodspill")//cover a large portion of the station in blood
- if(obj_count < objectives.len)
+ if(max_spilled_blood >= spilltarget)
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Success! "
feedback_add_details("cult_objective","cult_bloodspill|SUCCESS")
else
@@ -344,10 +333,10 @@ var/global/list/all_cults = list()
if("harvest")
if(harvested > harvest_target)
- explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] eaten) Success! "
+ explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success! "
feedback_add_details("cult_objective","cult_harvest|SUCCESS")
else
- explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] eaten) Fail! "
+ explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail! "
feedback_add_details("cult_objective","cult_harvest|FAIL")
if("hijack")
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index de13c11d852..bfe25eba5d5 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -34,6 +34,6 @@
if(iscultist(M))
to_chat(M, my_message)
else if(M in dead_mob_list)
- to_chat(M, " (F) [my_message] ")
+ to_chat(M, " (F) [my_message] ")
log_say("[user.real_name]/[user.key] : [message]")
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index cbbe5590475..97511414e7a 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -3,7 +3,7 @@
desc = "An arcane weapon wielded by the followers of a cult."
icon_state = "cultblade"
item_state = "cultblade"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 30
throwforce = 10
sharp = 1
@@ -38,7 +38,7 @@
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 15
throwforce = 25
var/cooldown = 0
@@ -64,7 +64,7 @@
icon_state = "culthood"
desc = "A hood worn by the followers of a cult."
flags_inv = HIDEFACE
- flags = HEADCOVERSEYES
+ flags_cover = HEADCOVERSEYES
armor = list(melee = 30, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -96,8 +96,9 @@
icon_state = "magus"
item_state = "magus"
desc = "A helm worn by the followers of Nar-Sie."
+ flags = BLOCKHAIR
flags_inv = HIDEFACE
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
armor = list(melee = 30, bullet = 30, laser = 30, energy = 20, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/magusred
@@ -122,7 +123,7 @@
icon_state = "cult_armour"
item_state = "cult_armour"
desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -132,7 +133,7 @@
desc = "Empowered garb which creates a powerful shield around the user."
icon_state = "cult_armour"
item_state = "cult_armour"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
armor = list(melee = 50, bullet = 40, laser = 50, energy = 30, bomb = 50, bio = 30, rad = 30)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
@@ -145,8 +146,9 @@
icon_state = "cult_hoodalt"
armor = list(melee = 50, bullet = 40, laser = 50, energy = 30, bomb = 50, bio = 30, rad = 30)
body_parts_covered = HEAD
+ flags = NODROP
flags_inv = HIDEFACE
- flags = NODROP | HEADCOVERSEYES
+ flags_cover = HEADCOVERSEYES
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot)
..()
@@ -171,8 +173,8 @@
/obj/item/clothing/suit/hooded/cultrobes/berserker
name = "flagellant's robes"
desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
- icon_state = "hardsuit-beserker"
- item_state = "hardsuit-beserker"
+ icon_state = "hardsuit-berserker"
+ item_state = "hardsuit-berserker"
flags_inv = HIDEJUMPSUIT
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -186,7 +188,7 @@
desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
icon_state = "culthood"
flags_inv = HIDEFACE
- flags = HEADCOVERSEYES
+ flags_cover = HEADCOVERSEYES
armor = list(melee = -100, bullet = -100, laser = -100, energy = -100, bomb = -100, bio = -100, rad = -100)
/obj/item/weapon/whetstone/cult
@@ -245,7 +247,7 @@
var/timer = shuttle_master.emergency.timeLeft(1) + cursetime
shuttle_master.emergency.setTimer(timer)
to_chat(user,"You shatter the orb! A dark essence spirals into the air, then disappears. ")
- playsound(user.loc, "sound/effects/Glassbr1.ogg", 50, 1)
+ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 50, 1)
qdel(src)
sleep(20)
var/global/list/curses
@@ -298,7 +300,7 @@
var/turf/mobloc = get_turf(C)
var/list/turfs = new/list()
for(var/turf/T in range(user, outer_tele_radius))
- if(!is_teleport_allowed(T))
+ if(!is_teleport_allowed(T.z))
continue
if(get_dir(C, T) != C.dir)
continue
@@ -331,4 +333,4 @@
playsound(destination, "sparks", 50, 1)
else
- to_chat(C, "The veil cannot be torn here! ")
\ No newline at end of file
+ to_chat(C, "The veil cannot be torn here! ")
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index 3449e4a1c95..c9e951cf940 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -21,7 +21,7 @@
if("convert")
explanation = "We must increase our influence before we can summon [ticker.mode.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions."
if("bloodspill")
- spilltarget = 100 + rand(0,player_list.len * 3)
+ spilltarget = 70 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles."
if("sacrifice")
explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for his blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
@@ -145,6 +145,19 @@
message_admins("Last Cult Objective: [last_objective]")
log_admin("Last Cult Objective: [last_objective]")
+/datum/game_mode/cult/proc/get_possible_sac_targets()
+ var/list/possible_sac_targets = list()
+ for(var/mob/living/carbon/human/player in player_list)
+ if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD))
+ possible_sac_targets += player.mind
+ if(!possible_sac_targets.len)
+ //There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers
+ for(var/mob/living/carbon/human/player in player_list)
+ if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level
+ continue
+ if(player.mind && !(player.mind in cult) && (player.stat != DEAD))//make DAMN sure they are not dead
+ possible_sac_targets += player.mind
+ return possible_sac_targets
/datum/game_mode/cult/proc/pick_objective()
var/list/possible_objectives = list()
@@ -153,27 +166,12 @@
possible_objectives |= "bloodspill"
if(!sacrificed.len)
- var/list/possible_targets = list()
- for(var/mob/living/carbon/human/player in player_list)
- if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level
- continue
- if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD))
- possible_targets += player.mind
-
- if(!possible_targets.len)
- //There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers
- for(var/mob/living/carbon/human/player in player_list)
- if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level
- continue
- if(player.mind && !(player.mind in cult) && (player.stat != DEAD))//make DAMN sure they are not dead
- possible_targets += player.mind
-
+ var/list/possible_targets = get_possible_sac_targets()
if(possible_targets.len > 0)
sacrifice_target = pick(possible_targets)
possible_objectives |= "sacrifice"
else
- message_admins("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.")
- log_admin("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.")
+ log_runtime(EXCEPTION("Didn't find a suitable sacrifice target...what the hell? Shout at a coder."))
if(!mass_convert)
var/living_crew = 0
@@ -194,7 +192,7 @@
log_admin("There are [total] players, too little for the mass convert objective!")
else
possible_objectives |= "convert"
- convert_target = round(total / 2)
+ convert_target = rand(9,15)
if(!possible_objectives.len)//No more possible objectives, time to summon Nar-Sie
message_admins("No suitable objectives left! Nar-Sie objective unlocked.")
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 72b5bfa292b..60b9fcb2c85 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -38,7 +38,7 @@
var/selection_prompt = "Choose your weapon, nerdwad"
var/creation_delay = 2400
var/list/choosable_items = list(
- "A coder forgot to set this" = /obj/item/weapon/bananapeel
+ "A coder forgot to set this" = /obj/item/weapon/grown/bananapeel
)
var/creation_message = "A dank smoke comes out, and you pass out. When you come to, you notice a %ITEM%!"
@@ -261,7 +261,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
/obj/item/weapon/storage/box/cult
name = "Dark Forge Cache"
can_hold = list("/obj/item/clothing/suit/space/cult", "/obj/item/clothing/head/helmet/space/cult")
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/box/cult/New()
..()
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index ee5221fb698..1553ec0aa94 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -8,11 +8,15 @@
else
usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
for (var/mob/V in viewers(src))
- V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2)
+ V.show_message("The markings pulse with a small burst of light, then fall dark. ", 3, "You hear a faint fizzle. ", 2)
return
/obj/effect/rune/proc/check_icon()
- icon = get_rune_cult(invocation)
+ if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way
+ var/bits = make_bit_triplet()
+ icon = get_rune(bits)
+ else
+ icon = get_rune_cult(invocation)
/obj/item/weapon/tome
name = "arcane tome"
@@ -20,7 +24,7 @@
icon_state ="tome"
throw_speed = 2
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/scribereduct = 0
var/canbypass = 0 //ADMINBUS
@@ -98,7 +102,7 @@
If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune. "
text += "Rite of Enlightenment This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \
- To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
+ To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is mindshielded or a certain assignment, they will \
be unable to be converted. People [ticker.mode.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted. \
Successful conversions will produce a tome for the new cultist. "
@@ -141,7 +145,7 @@
text += "Talisman of Teleportation The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once. "
- text += "Talisman of Fabrication This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it. "
+ text += "Talisman of Fabrication This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to receive a soul to occupy it. "
text += "Talisman of Tome Summoning This talisman will produce a single tome at your feet. "
@@ -154,10 +158,10 @@
text += "Talisman of Stunning Attacking a target will knock them down for a long duration in addition to inhibiting their speech. \
Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead. "
- text += "Talisman of Armaments The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola. Any items that cannot \
- be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them. "
+ text += "Talisman of Armaments The Talisman of Arming will equip the user with armored robes, a backpack, shoes, an eldritch longsword, and an empowered bola. Any equipment that cannot \
+ be equipped will not be summoned, weaponry will be put on the floor below the user. Attacking a fellow cultist with it will instead equip them. "
- text += "Talisman of Horrors The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them. "
+ text += "Talisman of Horrors The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the end-times that may incapacitate them. "
text += "Talisman of Shackling The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed. "
@@ -165,7 +169,7 @@
text += "Equipment: "
- text += "Cult Blade Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming. "
+ text += "Cult Blade Cult blades are sharp weapons that, notably, cannot be used by non-cultists. These blades are produced by the Talisman of Arming. "
text += "Cult Bola Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming. "
@@ -209,17 +213,17 @@
if(cult_mode.demons_summoned)
to_chat(user, "\"We are already here. There is no need to try to summon us now.\" ")
return 0
- if(!(CULT_ELDERGOD in cult_mode.objectives) || !(CULT_SLAUGHTER in cult_mode.objectives))
+ if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives)))
to_chat(user, "[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed! ")
return 0
- var/confirm_final = alert(user, "This is the FINAL step to summon your dietys power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
+ var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "You decide to prepare further before scribing the rune. ")
return 0
else
return 1
else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS
- var/confirm_final = alert(user, "This is the FINAL step to summon your dietys power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
+ var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "You decide to prepare further before scribing the rune. ")
return 0
@@ -265,7 +269,7 @@
return
if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas
if(finale_runes_ok(user,rune_to_scribe))
- command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
+ command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
for(var/B in spiral_range_turfs(1, user, 1))
var/turf/T = B
var/obj/machinery/shield/N = new(T)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 01baa948b32..c6e64c4665c 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -153,6 +153,16 @@ structure_check() searches for nearby cultist structures required for the invoca
L.changeNext_move(CLICK_CD_MELEE)//THIS IS WHY WE CAN'T HAVE NICE THINGS
do_invoke_glow()
+/obj/effect/rune/proc/burn_invokers(var/list/mobstoburn)
+ for(var/M in mobstoburn)
+ var/mob/living/L = M
+ to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\" ")
+ if(L.reagents)
+ L.reagents.add_reagent("hell_water", 10)
+ L.Weaken(7)
+ L.Stun(7)
+ fail_invoke()
+
/obj/effect/rune/proc/do_invoke_glow()
var/oldtransform = transform
spawn(0) //animate is a delay, we want to avoid being delayed
@@ -313,7 +323,7 @@ var/list/teleport_runes = list()
//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
/obj/effect/rune/convert
cultist_name = "Rite of Enlightenment"
- cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
+ cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on mindshielded crew."
invocation = "Mah'weyh pleggh at e'ntrath!"
icon_state = "3"
req_cultists = 2
@@ -326,7 +336,7 @@ var/list/teleport_runes = list()
var/turf/T = get_turf(src)
for(var/mob/living/M in T.contents)
- if(!iscultist(M) && !isloyal(M))
+ if(!iscultist(M) && !ismindshielded(M) && ishuman(M))
convertees.Add(M)
if(!convertees.len)
fail_invoke()
@@ -405,6 +415,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T)
var/sacrifice_fulfilled
+ var/datum/game_mode/cult/cult_mode = ticker.mode
if(T)
if(istype(T, /mob/living/simple_animal/pet/corgi))
for(var/M in invokers)
@@ -417,9 +428,13 @@ var/list/teleport_runes = list()
if(is_sacrifice_target(T.mind))
sacrifice_fulfilled = 1
new /obj/effect/overlay/temp/cult/sac(loc)
+ if(ticker && ticker.mode && ticker.mode.name == "cult")
+
+ cult_mode.harvested++
for(var/M in invokers)
if(sacrifice_fulfilled)
to_chat(M, "\"Yes! This is the one I desire! You have done well.\" ")
+ cult_mode.additional_phase()
else
if(ishuman(T) || isrobot(T))
to_chat(M, "\"I accept this sacrifice.\" ")
@@ -476,16 +491,13 @@ var/list/teleport_runes = list()
return
var/mob/living/user = invokers[1]
var/datum/game_mode/cult/cult_mode = ticker.mode
+ if(!(CULT_ELDERGOD in cult_mode.objectives))
+ message_admins("[key_name_admin(user)] tried to summonn an eldritch horror when the objective was wrong")
+ burn_invokers(invokers)
+ log_game("Summon Nar-Sie rune failed - improper objective")
if(!is_station_level(user.z))
- message_admins("[user.real_name]([user.ckey]) tried to summon an eldritch horror off station")
- for(var/M in invokers)
- var/mob/living/L = M
- to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\" ")
- if(L.reagents)
- L.reagents.add_reagent("hell_water", 10)
- L.Weaken(7)
- L.Stun(7)
- fail_invoke()
+ message_admins("[key_name_admin(user)] tried to summon an eldritch horror off station")
+ burn_invokers(invokers)
log_game("Summon Nar-Sie rune failed - off station Z level")
return
if(!cult_mode.eldergod)
@@ -524,7 +536,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/slaughter
cultist_name = "Call Forth The Slaughter (Demons)"
- cultist_desc = "Calls forth the doom of a eldrtich being. Three slaughter demons will appear to wreak havoc on the station."
+ cultist_desc = "Calls forth the doom of an eldritch being. Three slaughter demons will appear to wreak havoc on the station."
invocation = null
req_cultists = 9
color = rgb(125,23,23)
@@ -566,26 +578,12 @@ var/list/teleport_runes = list()
var/datum/game_mode/cult/cult_mode = ticker.mode
if(!(CULT_SLAUGHTER in cult_mode.objectives))
message_admins("[usr.real_name]([user.ckey]) tried to summon demons when the objective was wrong")
- for(var/M in invokers)
- var/mob/living/L = M
- to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\" ")
- if(L.reagents)
- L.reagents.add_reagent("hell_water", 10)
- L.Weaken(7)
- L.Stun(7)
- fail_invoke()
+ burn_invokers(invokers)
log_game("Summon Demons rune failed - improper objective")
return
if(!is_station_level(user.z))
message_admins("[user.real_name]([user.ckey]) tried to summon demons off station")
- for(var/M in invokers)
- var/mob/living/L = M
- to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\" ")
- if(L.reagents)
- L.reagents.add_reagent("hell_water", 10)
- L.Weaken(7)
- L.Stun(7)
- fail_invoke()
+ burn_invokers(invokers)
log_game("Summon demons rune failed - off station Z level")
return
if(cult_mode.demons_summoned)
@@ -836,7 +834,7 @@ var/list/teleport_runes = list()
var/mob/living/user = invokers[1]
var/list/cultists = list()
for(var/datum/mind/M in ticker.mode.cult)
- if(!(M.current in invokers) && M.current.stat != DEAD)
+ if(!(M.current in invokers) && M.current && M.current.stat != DEAD)
cultists |= M.current
var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [ticker.mode.cultdat.entity_title3]") as null|anything in cultists
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
@@ -941,6 +939,7 @@ var/list/teleport_runes = list()
icon_state = "6"
construct_invoke = 0
color = rgb(200, 0, 0)
+ var/list/summoned_guys = list()
/obj/effect/rune/manifest/New(loc)
..()
@@ -956,7 +955,7 @@ var/list/teleport_runes = list()
return list()
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
- if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
+ if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !jobban_isbanned(O, ROLE_SYNDICATE))
ghosts_on_rune |= O
if(!ghosts_on_rune.len)
to_chat(user, "There are no spirits near [src]! ")
@@ -969,12 +968,13 @@ var/list/teleport_runes = list()
var/mob/living/user = invokers[1]
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
- if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
+ if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !jobban_isbanned(O, ROLE_SYNDICATE))
ghosts_on_rune |= O
var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune)
var/mob/living/carbon/human/new_human = new(get_turf(src))
new_human.real_name = ghost_to_spawn.real_name
new_human.alpha = 150 //Makes them translucent
+ new_human.color = "grey" //heh..cult greytide...litterly...
..()
visible_message("A cloud of red mist forms above [src], and from within steps... a man. ")
to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely... ")
@@ -986,6 +986,7 @@ var/list/teleport_runes = list()
N.mouse_opacity = 0
new_human.key = ghost_to_spawn.key
ticker.mode.add_cultist(new_human.mind, 0)
+ summoned_guys |= new_human
to_chat(new_human, "You are a servant of [ticker.mode.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.mode.cultdat.entity_name], and you are to serve them at all costs. ")
while(user in get_turf(src))
@@ -1000,4 +1001,13 @@ var/list/teleport_runes = list()
"Your link to the world fades. Your form breaks apart. ")
for(var/obj/I in new_human)
new_human.unEquip(I)
- new_human.dust()
\ No newline at end of file
+ summoned_guys -= new_human
+ new_human.dust()
+
+/obj/effect/rune/manifest/Destroy()
+ for(var/mob/living/carbon/human/guy in summoned_guys)
+ for(var/obj/I in guy)
+ guy.unEquip(I)
+ guy.dust()
+ summoned_guys.Cut()
+ return ..()
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 1b7d1bee5a9..4bf4bd9f9e7 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -59,11 +59,12 @@
dat += "Please choose the chant to be imbued into the fabric of reality. "
dat += " "
dat += "N'ath reth sh'yro eth d'raggathnor! - Summons an arcane tome, used to scribe runes and communicate with other cultists. "
+ dat += "Bar'tea eas! - Provides 5 runed metal. "
dat += "Sas'so c'arta forbici! - Allows you to move to a selected teleportation rune. "
dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range. "
dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman. "
dat += "Kla'atu barada nikt'o! - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes. "
- dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans. "
+ dat += "Kal'om neth! - Summons a soul stone, used to capture the spirits of dead or dying humans. "
dat += "Daa'ig osk! - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person. "
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
popup.set_content(jointext(dat, ""))
@@ -79,6 +80,12 @@
if("newtome")
var/obj/item/weapon/tome/T = new(usr)
usr.put_in_hands(T)
+ if("metal")
+ if(istype(src, /obj/item/weapon/paper/talisman/supply/weak))
+ usr.visible_message("Lesser supply talismans lack the strength to materialize runed metal! ")
+ return
+ var/obj/item/stack/sheet/runed_metal/R = new(usr,5)
+ usr.put_in_hands(R)
if("teleport")
var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
usr.put_in_hands(T)
@@ -270,8 +277,9 @@
var/mob/living/carbon/human/H = user
user.visible_message("Otherworldly armor suddenly appears on [user]! ", \
"You speak the words of the talisman, arming yourself! ")
- H.equip_or_collect(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
H.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
H.put_in_hands(new /obj/item/weapon/restraints/legcuffs/bola/cult(user))
@@ -292,7 +300,7 @@
/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user)
if(iscultist(user))
- to_chat(user, "You disturb [target] with visons of the end! ")
+ to_chat(user, "You disturb [target] with visions of the end! ")
if(iscarbon(target))
var/mob/living/carbon/H = target
H.AdjustHallucinate(30)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index b2344639c1d..fc2ad7d62f9 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -38,6 +38,9 @@
var/list/player_draft_log = list()
var/list/datum/mind/xenos = list()
+ var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode
+ var/list/chumps = list()
+
/datum/game_mode/proc/announce() //to be calles when round starts
to_chat(world, "Notice : [src] did not define announce()")
@@ -69,6 +72,8 @@
///post_setup()
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
/datum/game_mode/proc/post_setup()
+ setup_chumps()
+
spawn (ROUNDSTART_LOGOUT_REPORT_TIME)
display_roundstart_logout_report()
@@ -78,10 +83,45 @@
// if(revdata)
// feedback_set_details("revision","[revdata.revision]")
feedback_set_details("server_ip","[world.internet_address]:[world.port]")
+ generate_station_goals()
start_state = new /datum/station_state()
start_state.count()
return 1
+//setup_chumps()
+//Prepares fake potential collaborators to cut down on metagaming the round type as being a traitor subtype. Overriden in traitor game modes since they have real collaborators
+/datum/game_mode/proc/setup_chumps()
+ var/max_chumps = 1
+ if(config.traitor_scaling)
+ max_chumps = max(1, round((num_players())/(5)))
+ else
+ max_chumps = max(1, min(num_players(), 5))
+ var/tries_left = 5 //limits the number of tries so we don't get stuck looping indefinitely. resets on successfully finding a new chump
+ while(chumps.len < max_chumps)
+ if(!tries_left) //ran out of unique chumps (or just bad luck with the pick() in get_nt_opposed()) so there may end up being fewer chumps in some rounds.
+ break
+ var/mob/living/carbon/human/chump = get_nt_opposed()
+ if(isnull(chump)) //no possible chumps so just end it here.
+ break
+ if(chump in chumps)
+ tries_left-- //this chump already was picked, try again!
+ else
+ chumps += chump
+ tries_left = 5 //reset our tries since we found a new chump
+ //make sure we have chumps before we try misinforming them. if we don't make a note of it.
+ if(!chumps.len)
+ message_admins("Game mode failed to find ANY chumps. Possible causes: no one is opposed/skeptical, or FalseIncarnate can't code. ")
+ log_admin("Game mode failed to find ANY chumps. Possible causes: no one is opposed/skeptical, or FalseIncarnate can't code.")
+ return 0
+ //we've got chumps! misinform them!
+ for(var/mob/living/carbon/human/chump in chumps)
+ if(prob(33))
+ spawn(rand(3000, 18000)) //5-30 minute delay to throw off would-be autotraitor metagamers
+ inform_collab(chump)
+ else
+ spawn(rand(10, 100)) //same delay as if the mode were traitor
+ inform_collab(chump)
+ return 1
///process()
///Called by the gameticker
@@ -397,15 +437,20 @@ proc/display_roundstart_logout_report()
to_chat(M, msg)
-proc/get_nt_opposed()
+/proc/get_nt_opposed()
var/list/dudes = list()
for(var/mob/living/carbon/human/man in player_list)
if(man.client)
+ //don't try picking someone like the captain or a security officer for potential collaborators, even if they ARE opposed to Nanotrasen for some reason
+ if(man.mind && man.mind.assigned_role)
+ if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs))
+ continue
if(man.client.prefs.nanotrasen_relation == "Opposed")
dudes += man
else if(man.client.prefs.nanotrasen_relation == "Skeptical" && prob(50))
dudes += man
- if(dudes.len == 0) return null
+ if(dudes.len == 0)
+ return null
return pick(dudes)
//Announces objectives/generic antag text.
@@ -422,7 +467,7 @@ proc/get_nt_opposed()
if(!player || !player.current) return
var/obj_count = 1
- to_chat(player.current, "\blue Your current objectives:")
+ to_chat(player.current, "Your current objectives: ")
for(var/datum/objective/objective in player.objectives)
to_chat(player.current, "Objective #[obj_count] : [objective.explanation_text]")
obj_count++
@@ -437,7 +482,7 @@ proc/get_nt_opposed()
nukecode = bomb.r_code
return nukecode
-/datum/game_mode/proc/replace_jobbaned_player(mob/living/M, role_type)
+/datum/game_mode/proc/replace_jobbanned_player(mob/living/M, role_type)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a [role_type]?", role_type, 0, 100)
var/mob/dead/observer/theghost = null
if(candidates.len)
@@ -475,3 +520,60 @@ proc/get_nt_opposed()
text += "Objective #[count] : [objective.explanation_text] Fail. "
count++
return text
+
+/datum/game_mode/proc/generate_station_goals()
+ var/list/possible = list()
+ for(var/T in subtypesof(/datum/station_goal))
+ var/datum/station_goal/G = T
+ if(config_tag in initial(G.gamemode_blacklist))
+ continue
+ possible += T
+ var/goal_weights = 0
+ while(possible.len && goal_weights < STATION_GOAL_BUDGET)
+ var/datum/station_goal/picked = pick_n_take(possible)
+ goal_weights += initial(picked.weight)
+ station_goals += new picked
+
+ if(station_goals.len)
+ send_station_goals_message()
+
+/datum/game_mode/proc/send_station_goals_message()
+ var/message_text = ""
+ message_text += "
[command_name()] Orders "
+ message_text += "Special Orders for [station_name()]: "
+
+ for(var/datum/station_goal/G in station_goals)
+ G.on_report()
+ message_text += G.get_report()
+ message_text += " "
+
+ print_command_report(message_text, "[command_name()] Orders")
+
+/datum/game_mode/proc/declare_station_goal_completion()
+ for(var/V in station_goals)
+ var/datum/station_goal/G = V
+ G.print_result()
+
+
+/datum/game_mode/proc/inform_collab(mob/living/carbon/human/M)
+ if(!M)
+ return
+ //Mad-libs for their message
+ var/adjective = pick("strange", "mysterious", "sinister", "un-assuming", "unexpected")
+ var/action_words = pick("aid the fight against Nanotrasen", "repay a debt", "partake in some mischief", "help overthrow the system", "stick it to the man")
+ var/organization = pick("Anti-Fascist Movement", "Syndicate", "Spessmen for the Protesting of Nanotrasen", "Greytider's Union", "Illuminati (in space)")
+ //Stuff to give them a single set of code-words
+ var/list/possible_words = splittext(syndicate_code_phrase, ", ")
+ var/list/possible_reply = splittext(syndicate_code_response, ", ")
+ var/index = rand(1, possible_words.len)
+ var/my_word = possible_words[index]
+ var/my_reply
+ if(possible_reply.len < index) //just in case we had a longer code word list than the response list
+ my_reply = pick(possible_reply)
+ else
+ my_reply = possible_reply[index]
+
+ to_chat(M, "You suddenly remember \an [adjective] note you received earlier informing you that a chance to [action_words] may present itself today. An agent of the [organization] may contact you for help.")
+ to_chat(M, "The note had the words \"[my_word]\" and \"[my_reply]\" written at the bottom, which you memorized just in case.")
+ to_chat(M, "You are NOT an antagonist, so self-antagging rules still apply to you. Use your good judgement and ahelp if you are unsure of what you are allowed to do. ")
+ M.mind.store_memory("Important Words : \"[my_word]\", \"[my_reply]\"")
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 5a3d0599c8c..f3191491c88 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -259,12 +259,16 @@ var/round_start_time = 0
else //nuke kills everyone on z-level 1 to prevent "hurr-durr I survived"
for(var/mob/M in mob_list)
M.buckled = temp_buckle
- if(M.client)
- M.client.screen += cinematic
if(M.stat != DEAD)
var/turf/T = get_turf(M)
- if(T && is_station_level(T.z))
- M.death(0) //no mercy
+ if(T && is_station_level(T.z) && !istype(M.loc, /obj/structure/closet/secure_closet/freezer))
+ var/mob/ghost = M.ghostize()
+ M.dust() //no mercy
+ if(ghost && ghost.client) //Play the victims an uninterrupted cinematic.
+ ghost.client.screen += cinematic
+ CHECK_TICK
+ if(M && M.client) //Play the survivors a cinematic.
+ M.client.screen += cinematic
//Now animate the cinematic
switch(station_missed)
@@ -402,21 +406,8 @@ var/round_start_time = 0
if(F.name == name)
return F
-/datum/controller/gameticker/proc/karmareminder()
- for(var/mob/living/player in player_list)
-
- if(player.client)
- if(player.client.karma_spent == 0)
- if(!player.get_preference(DISABLE_KARMA_REMINDER))
- var/dat
- dat += {"Karma Reminder Karma Reminder
- You have not yet spent your karma for the round, surely there is a player who was worthy of receiving
- your reward? Look under 'OOC' for the 'Award Karma' button, and use it once a round for best results!"}
- player << browse(dat, "window=karmareminder;size=400x300")
-
/datum/controller/gameticker/proc/declare_completion()
-
nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point.
//Round statistics report
var/datum/station_state/end_state = new /datum/station_state()
@@ -469,7 +460,9 @@ var/round_start_time = 0
call(mode, handler)()
scoreboard()
- karmareminder()
+
+ // Declare the completion of the station goals
+ mode.declare_station_goal_completion()
//Ask the event manager to print round end information
event_manager.RoundEnd()
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 4819ab20671..70ebd23912f 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -121,13 +121,12 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.update_dna()
vox.update_eyes()
- for(var/obj/item/organ/external/limb in vox.organs)
+ for(var/obj/item/organ/external/limb in vox.bodyparts)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
//Now apply cortical stack.
var/obj/item/weapon/implant/cortical/I = new(vox)
- I.imp_in = vox
- I.implanted = 1
+ I.implant(vox)
cortical_stacks += I
vox.equip_vox_raider()
@@ -178,10 +177,10 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
/datum/game_mode/proc/greet_vox(var/datum/mind/raider)
to_chat(raider.current, "You are a Vox Raider, fresh from the Shoal! ")
- to_chat(raider.current, "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the [station_name()] for plunder, trade or both.")
- to_chat(raider.current, "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious.")
- to_chat(raider.current, "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!")
- to_chat(raider.current, "\blue Choose to accomplish your objectives by either raiding the crew and taking what you need, or by attempting to trade with them.")
+ to_chat(raider.current, "The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the [station_name()] for plunder, trade or both. ")
+ to_chat(raider.current, "Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious. ")
+ to_chat(raider.current, "Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals! ")
+ to_chat(raider.current, "Choose to accomplish your objectives by either raiding the crew and taking what you need, or by attempting to trade with them. ")
spawn(25)
show_objectives(raider)
@@ -235,7 +234,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
else
win_msg += "The Vox Raiders were repelled! "
- to_chat(world, "\red [win_type] [win_group] victory! ")
+ to_chat(world, "[win_type] [win_group] victory! ")
to_chat(world, "[win_msg]")
feedback_set_details("round_end_result","heist - [win_type] [win_group]")
@@ -313,4 +312,4 @@ datum/game_mode/proc/auto_declare_completion_heist()
log_admin("[key_name(user)] pressed the vox win button during a vox round.")
var/datum/game_mode/heist/H = ticker.mode
- H.win_button_triggered = 1
\ No newline at end of file
+ H.win_button_triggered = 1
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index cd6dd80876b..6cb2956d3ee 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -109,8 +109,16 @@
/datum/intercept_text/proc/get_suspect()
var/list/dudes = list()
- for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == "Opposed")
- dudes += man
+ for(var/mob/living/carbon/human/man in player_list)
+ if(man.client && man.client.prefs.nanotrasen_relation == "Opposed")
+ //don't include suspects who can't possibly be the antag based on their job (no suspecting the captain of being a damned dirty tator)
+ if(man.mind && man.mind.assigned_role)
+ if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs))
+ return
+ //don't include suspects who can't possibly be the antag based on their species (no suspecting the machines of being sneaky changelings)
+ if(man.get_species() in ticker.mode.protected_species)
+ return
+ dudes += man
for(var/i = 0, i < max(player_list.len/10,2), i++)
dudes += pick(player_list)
return pick(dudes)
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 9842757dc8c..e644af03f3c 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -30,7 +30,7 @@
set name = "Doomsday Device"
to_chat(src, "Nuclear device armed. ")
- command_announcement.Announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", new_sound = 'sound/AI/aimalf.ogg')
+ event_announcement.Announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", new_sound = 'sound/AI/aimalf.ogg')
set_security_level("delta")
nuking = 1
var/obj/machinery/doomsday_device/DOOM = new /obj/machinery/doomsday_device(src)
@@ -163,9 +163,7 @@
D.hostile_lockdown(src)
addtimer(D, "disable_lockdown", 900)
- var/obj/machinery/computer/communications/C = locate() in machines
- if(C)
- C.post_status("alert", "lockdown")
+ post_status("alert", "lockdown")
verbs -= /mob/living/silicon/ai/proc/lockdown
minor_announcement.Announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.", "Network Alert")
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 890cc4e151c..4377a0038eb 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -118,11 +118,13 @@
return .
/obj/effect/meteor/Destroy()
+ meteor_list -= src
walk(src,0) //this cancels the walk_towards() proc
return ..()
/obj/effect/meteor/New()
..()
+ meteor_list += src
SpinAnimation()
/obj/effect/meteor/Bump(atom/A)
@@ -131,7 +133,7 @@
playsound(src.loc, meteorsound, 40, 1)
get_hit()
-/obj/effect/meteor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/effect/meteor/CanPass(atom/movable/mover, turf/target, height=0)
return istype(mover, /obj/effect/meteor) ? 1 : ..()
/obj/effect/meteor/proc/ram_turf(var/turf/T)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index dd0abda7e31..0d04c3ee615 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -116,6 +116,8 @@
H.mind.abductor.agent = 1
H.mind.abductor.team = team_number
H.real_name = team_name + " Agent"
+ H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
+ H.overeatduration = 0
equip_common(H,team_number)
equip_agent(H,team_number)
greet_agent(agent,team_number)
@@ -130,6 +132,8 @@
H.mind.abductor.scientist = 1
H.mind.abductor.team = team_number
H.real_name = team_name + " Scientist"
+ H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
+ H.overeatduration = 0
equip_common(H,team_number)
equip_scientist(H,team_number)
greet_scientist(scientist,team_number)
@@ -223,6 +227,7 @@
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(agent)
R.set_frequency(radio_freq)
+ R.name = "alien headset"
agent.equip_to_slot_or_del(R, slot_l_ear)
agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes)
agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit
@@ -247,9 +252,10 @@
V.flags |= NODROP
agent.equip_to_slot_or_del(V, slot_wear_suit)
agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_belt)
+ agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
+ agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt)
agent.update_icons()
@@ -286,7 +292,7 @@
var/datum/objective/objective = team_objectives[team_number]
var/team_name = team_names[team_number]
if(console.experiment.points >= objective.target_amount)
- to_chat(world, "[team_name] team fullfilled its mission! ")
+ to_chat(world, "[team_name] team fulfilled its mission! ")
else
to_chat(world, "[team_name] team failed its mission. ")
..()
@@ -346,7 +352,7 @@
if(abductor_mind in abductors)
ticker.mode.abductors -= abductor_mind
abductor_mind.special_role = null
- abductor_mind.current.attack_log += "\[[time_stamp()]\] No longer abductor "
+ abductor_mind.current.create_attack_log("No longer abductor ")
if(issilicon(abductor_mind.current))
to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor. ")
else
@@ -370,9 +376,23 @@
explanation_text = "Steal all"
/datum/objective/abductee/steal/New()
- var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap"))
+ var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
explanation_text+=" [target]."
+/datum/objective/abductee/paint
+ explanation_text = "The station is hideous. You must color it all"
+
+/datum/objective/abductee/paint/New()
+ var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
+ explanation_text+= " [color]!"
+
+/datum/objective/abductee/speech
+ explanation_text = "Your brain is broken... you can only communicate in"
+
+/datum/objective/abductee/speech/New()
+ var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
+ explanation_text+= " [style]."
+
/datum/objective/abductee/capture
explanation_text = "Capture"
@@ -412,16 +432,16 @@
explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
/datum/objective/abductee/floors
- explanation_text = "Replace all the floor tiles with carpeting, wooden boards, or grass."
+ explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
/datum/objective/abductee/POWERUNLIMITED
explanation_text = "Flood the station's powernet with as much electricity as you can."
/datum/objective/abductee/pristine
- explanation_text = "Ensure the station is in absolutely pristine condition."
+ explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
-/datum/objective/abductee/window
- explanation_text = "Replace all normal windows with reinforced windows."
+/datum/objective/abductee/nowalls
+ explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
/datum/objective/abductee/nations
explanation_text = "Ensure your department prospers over all else."
@@ -429,17 +449,11 @@
/datum/objective/abductee/abductception
explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
-/datum/objective/abductee/ghosts
- explanation_text = "Conduct a seance with the spirits of the afterlife."
-
/datum/objective/abductee/summon
- explanation_text = "Conduct a ritual to summon an elder god."
+ explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
/datum/objective/abductee/machine
- explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power."
-
-/datum/objective/abductee/prevent
- explanation_text = "You have been enlightened. This knowledge must not escape. Ensure nobody else can become enlightened."
+ explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
/datum/objective/abductee/calling
explanation_text = "Call forth a spirit from the other side."
@@ -447,7 +461,7 @@
/datum/objective/abductee/calling/New()
var/mob/dead/D = pick(dead_mob_list)
if(D)
- explanation_text = "You know that [D] has perished. Call them from the spirit realm."
+ explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
/datum/objective/abductee/social_experiment
explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
@@ -459,7 +473,7 @@
explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
/datum/objective/abductee/defect
- explanation_text = "Defect from your employer."
+ explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
/datum/objective/abductee/promote
explanation_text = "Climb the corporate ladder all the way to the top!"
@@ -472,3 +486,33 @@
/datum/objective/abductee/pragnant
explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
+
+/datum/objective/abductee/engine
+ explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
+
+/datum/objective/abductee/music
+ explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
+
+/datum/objective/abductee/clown
+ explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
+
+/datum/objective/abductee/party
+ explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
+
+/datum/objective/abductee/pets
+ explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
+
+/datum/objective/abductee/conspiracy
+ explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
+
+/datum/objective/abductee/stalker
+ explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
+
+/datum/objective/abductee/narrator
+ explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
+
+/datum/objective/abductee/lurve
+ explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
+
+/datum/objective/abductee/sixthsense
+ explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 29f217b44bc..1408e0a87fc 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -11,7 +11,7 @@
icon_state = "vest_stealth"
item_state = "armor"
blood_overlay_type = "armor"
- origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3"
+ origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
actions_types = list(/datum/action/item_action/hands_free/activate)
var/mode = VEST_STEALTH
@@ -34,7 +34,6 @@
mode = VEST_STEALTH
armor = stealth_armor
icon_state = "vest_stealth"
-
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_wear_suit()
@@ -64,7 +63,6 @@
M.overlays = disguise.overlays
M.update_inv_r_hand()
M.update_inv_l_hand()
- return
/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth()
if(!stealth_active)
@@ -77,7 +75,6 @@
M.name_override = null
M.overlays.Cut()
M.regenerate_icons()
- return
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction()
DeactivateStealth()
@@ -115,19 +112,11 @@
if(combat_cooldown==initial(combat_cooldown))
processing_objects.Remove(src)
-/obj/item/device/abductor/proc/IsAbductor(user)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.get_species() != "Abductor")
- return 0
- return 1
- return 0
-
/obj/item/device/abductor/proc/AbductorCheck(user)
- if(IsAbductor(user))
- return 1
+ if(isabductor(user))
+ return TRUE
to_chat(user, "You can't figure how this works! ")
- return 0
+ return FALSE
/obj/item/device/abductor/proc/ScientistCheck(user)
var/mob/living/carbon/human/H = user
@@ -140,7 +129,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "gizmo"
- origin_tech = "materials=5;magnets=5;bluespace=6;abductor=4"
+ origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
var/mode = GIZMO_SCAN
var/mob/living/marked = null
var/obj/machinery/abductor/console/console
@@ -187,7 +176,7 @@
mark(target, user)
/obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user)
- if(istype(target,/mob/living/carbon/human))
+ if(ishuman(target))
if(console!=null)
console.AddSnapshot(target)
to_chat(user, "You scan [target] and add them to the database. ")
@@ -196,8 +185,8 @@
if(marked == target)
to_chat(user, "This specimen is already marked! ")
return
- if(istype(target,/mob/living/carbon/human))
- if(IsAbductor(target))
+ if(ishuman(target))
+ if(isabductor(target))
marked = target
to_chat(user, "You mark [target] for future retrieval. ")
else
@@ -221,7 +210,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "silencer"
item_state = "silencer"
- origin_tech = "materials=5;magnets=5;abductor=3"
+ origin_tech = "materials=4;programming=7;abductor=3"
/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user)
if(!AbductorCheck(user))
@@ -258,61 +247,15 @@
if(!istype(I,/obj/item/device/radio/headset))
r.broadcasting = 0 //goddamned headset hacks
-
-/obj/item/weapon/implant/abductor
- name = "recall implant"
- desc = "Returns you to the mothership."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "implant"
- activated = 1
- origin_tech = "materials=2;biotech=3;magnets=4;bluespace=5;abductor=5"
- var/obj/machinery/abductor/pad/home
- var/cooldown = 30
-
-/obj/item/weapon/implant/abductor/activate()
- if(cooldown == initial(cooldown))
- home.Retrieve(imp_in,1)
- cooldown = 0
- processing_objects.Add(src)
- else
- to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again! ")
- return
-
-/obj/item/weapon/implant/abductor/process()
- if(cooldown < initial(cooldown))
- cooldown++
- if(cooldown == initial(cooldown))
- processing_objects.Remove(src)
-
-/obj/item/weapon/implant/abductor/implant(var/mob/source, var/mob/user)
- if(..())
- var/obj/machinery/abductor/console/console
- if(ishuman(source))
- var/mob/living/carbon/human/H = source
- if(H.get_species() == "Abductor")
- console = get_team_console(H.mind.abductor.team)
- home = console.pad
-
- if(!home)
- console = get_team_console(pick(1, 2, 3, 4))
- home = console.pad
- return 1
-
-/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
- var/obj/machinery/abductor/console/console
- for(var/obj/machinery/abductor/console/c in abductor_equipment)
- if(c.team == team)
- console = c
- break
- return console
-
-/obj/item/weapon/gun/energy/decloner/alien
+/obj/item/weapon/gun/energy/alien
name = "alien pistol"
desc = "A complicated gun that fires bursts of high-intensity radiation."
+ ammo_type = list(/obj/item/ammo_casing/energy/declone)
+ restricted_species = list("Abductor")
icon_state = "alienpistol"
item_state = "alienpistol"
- origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3"
- restricted_species = list("Abductor")
+ origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL
/obj/item/weapon/paper/abductor
name = "Dissection Guide"
@@ -321,25 +264,29 @@
1.Acquire fresh specimen.
- 2.Put the specimen on operating table
- 3.Apply scalpel to the chest, preparing for dissection
- 4.Apply scalpel to specimen torso
- 5.Clamp bleeders on the specimen's torso
- 6.Retract skin from specimen's torso
- 7.Saw through the specimen's torso
- 8.Retract skin from specimen's torso again
- 9.Search through the specimen's torso with your hands to remove their heart
- 10.Insert replacement gland (Retrieve one from gland storage)
- 11.Cauterize the patient's torso
- 12.Consider dressing the specimen back to not disturb the habitat
- 13.Put the specimen in the experiment machinery
- 14.Choose one of the machine options and follow displayed instructions
+ 2.Put the specimen on operating table.
+ 3.Apply scalpel to the chest, preparing for experimental dissection.
+ 4.Apply scalpel to specimen's torso.
+ 5.Clamp bleeders on specimen's torso with a hemostat.
+ 6.Retract skin of specimen's torso with a retractor.
+ 7.Saw through the specimen's torso with a saw.
+ 8.Apply retractor again to specimen's torso.
+ 9.Search through the specimen's torso with your hands to remove any superfluous organs.
+ 10.Insert replacement gland (Retrieve one from gland storage).
+ 11.Cauterize the patient's torso with a cautery.
+ 12.Consider dressing the specimen back to not disturb the habitat.
+ 13.Put the specimen in the experiment machinery.
+ 14.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
+ 15.You will receive one supply credit, and the subject will be counted towards your quota.
-Congratulations! You are now trained for xenobiology research!"}
+Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/weapon/paper/abductor/update_icon()
return
+/obj/item/weapon/paper/abductor/AltClick()
+ return
+
#define BATON_STUN 0
#define BATON_SLEEP 1
#define BATON_CUFF 2
@@ -354,9 +301,9 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprodStun"
item_state = "wonderprod"
slot_flags = SLOT_BELT
- origin_tech = "materials=6;combat=5;biotech=7;abductor=4"
+ origin_tech = "materials=4;combat=4;biotech=7;abductor=4"
force = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_mode)
/obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr)
@@ -393,16 +340,8 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprodProbe"
item_state = "wonderprodProbe"
-/obj/item/weapon/abductor_baton/proc/IsAbductor(mob/living/user)
- if(!ishuman(user))
- return 0
- var/mob/living/carbon/human/H = user
- if(H.get_species() != "Abductor")
- return 0
- return 1
-
/obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user)
- if(!IsAbductor(user))
+ if(!isabductor(user))
return
if(isrobot(target))
@@ -434,7 +373,7 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/weapon/abductor_baton/attack_self(mob/living/user)
toggle(user)
- if(istype(user,/mob/living/carbon/human))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
@@ -456,10 +395,9 @@ Congratulations! You are now trained for xenobiology research!"}
H.forcesay(hit_appends)
add_logs(user, L, "stunned")
- return
/obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
- if(L.stunned)
+ if(L.stunned || L.sleeping)
L.visible_message("[user] has induced sleep in [L] with [src]! ", \
"You suddenly feel very drowsy! ")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
@@ -470,7 +408,6 @@ Congratulations! You are now trained for xenobiology research!"}
to_chat(user, "Sleep inducement works fully only on stunned specimens! ")
L.visible_message("[user] tried to induce sleep in [L] with [src]! ", \
"You suddenly feel drowsy! ")
- return
/obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
if(!iscarbon(L))
@@ -488,7 +425,6 @@ Congratulations! You are now trained for xenobiology research!"}
add_logs(user, C, "handcuffed")
else
to_chat(user, "You fail to handcuff [C]. ")
- return
/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
L.visible_message("[user] probes [L] with [src]! ", \
@@ -502,7 +438,7 @@ Congratulations! You are now trained for xenobiology research!"}
species = "[H.species.name] "
if(L.mind && L.mind.changeling)
species = "Changeling lifeform "
- var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs
+ var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs
if(temp)
helptext = "Experimental gland detected! "
else
@@ -517,7 +453,7 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "cuff_white" // Needs sprite
breakouttime = 450
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
- origin_tech = "materials=2;magnets=5;abductor=2"
+ origin_tech = "materials=4;magnets=5;abductor=2"
/obj/item/weapon/restraints/handcuffs/energy/used
desc = "energy discharge"
@@ -545,33 +481,45 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/weapon/scalpel/alien
name = "alien scalpel"
+ desc = "It's a gleaming sharp knife made out of silvery-green metal."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/hemostat/alien
name = "alien hemostat"
+ desc = "You've never seen this before."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/retractor/alien
name = "alien retractor"
+ desc = "You're not sure if you want the veil pulled back."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/circular_saw/alien
name = "alien saw"
+ desc = "Do the aliens also lose this, and need to find an alien hatchet?"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/surgicaldrill/alien
name = "alien drill"
+ desc = "Maybe alien surgeons have finally found a use for the drill."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/cautery/alien
name = "alien cautery"
+ desc = "Why would bloodless aliens have a tool to stop bleeding? Unless..."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/clothing/head/helmet/abductor
name = "agent headgear"
@@ -579,17 +527,12 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "alienhelmet"
item_state = "alienhelmet"
blockTracking = 1
- origin_tech = "materials=6;magnets=5;abductor=3"
+ origin_tech = "materials=7;magnets=4;abductor=3"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
// Operating Table / Beds / Lockers
-/obj/machinery/optable/abductor
- icon = 'icons/obj/abductor.dmi'
- icon_state = "bed"
- no_icon_updates = 1 //no icon updates for this; it's static.
-
/obj/structure/stool/bed/abductor
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
@@ -605,9 +548,9 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/structure/abductor_tableframe/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "You start disassembling [src]... ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 30, target = src))
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
+ if(do_after(user, 30 * I.toolspeed, target = src))
+ playsound(src.loc, I.usesound, 50, 1)
new /obj/item/stack/sheet/mineral/abductor(get_turf(src))
qdel(src)
return
@@ -617,11 +560,21 @@ Congratulations! You are now trained for xenobiology research!"}
to_chat(user, "You need one alien alloy sheet to do this! ")
return
to_chat(user, "You start adding [P] to [src]... ")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * I.toolspeed, target = src))
P.use(1)
new /obj/structure/table/abductor(src.loc)
qdel(src)
return
+ if(istype(I, /obj/item/stack/sheet/mineral/silver))
+ var/obj/item/stack/sheet/P = I
+ if(P.get_amount() < 1)
+ to_chat(user, "You need one sheet of silver to do this! ")
+ return
+ to_chat(user, "You start adding [P] to [src]... ")
+ if(do_after(user, 50, target = src))
+ P.use(1)
+ new /obj/machinery/optable/abductor(loc)
+ qdel(src)
/obj/structure/table/abductor
name = "alien table"
@@ -631,6 +584,12 @@ Congratulations! You are now trained for xenobiology research!"}
canSmoothWith = null
parts = /obj/item/stack/sheet/mineral/abductor
+/obj/machinery/optable/abductor
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "bed"
+ no_icon_updates = 1 //no icon updates for this; it's static.
+ injected_reagents = list("corazone")
+
/obj/structure/closet/abductor
name = "alien locker"
desc = "Contains secrets of the universe."
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index 6021140b79f..18d073d6077 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -15,9 +15,9 @@
return 0
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if(!(H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H)))
- return 0
- return 1
+ if((H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H)))
+ return 1
+ return 0
/datum/surgery_step/internal/extract_organ
@@ -47,11 +47,11 @@
return 1
else
to_chat(user, "You don't find anything in [target]'s [target_zone]! ")
- return 0
+ return 1
/datum/surgery_step/internal/gland_insert
name = "insert gland"
- allowed_tools = list(/obj/item/organ/internal/gland = 100)
+ allowed_tools = list(/obj/item/organ/internal/heart/gland = 100)
time = 32
/datum/surgery_step/internal/gland_insert/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -61,6 +61,6 @@
/datum/surgery_step/internal/gland_insert/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target]. ")
user.drop_item()
- var/obj/item/organ/internal/gland/gland = tool
+ var/obj/item/organ/internal/heart/gland/gland = tool
gland.insert(target, 2)
return 1
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index b59f1fd8454..1c481e7c333 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -1,12 +1,11 @@
-/obj/item/organ/internal/gland
+/obj/item/organ/internal/heart/gland
name = "fleshy mass"
desc = "A nausea-inducing hunk of twisting flesh and metal."
icon = 'icons/obj/abductor.dmi'
- parent_organ = "chest"
- slot = "gland"
icon_state = "gland"
status = ORGAN_ROBOT
- origin_tech = "materials=4;biotech=5;abductor=3"
+ origin_tech = "materials=4;biotech=7;abductor=3"
+ beating = TRUE
var/cooldown_low = 300
var/cooldown_high = 300
var/next_activation = 0
@@ -16,30 +15,33 @@
tough = 1 //not easily broken by combat damage
sterile = 1 //not very germy
-/obj/item/organ/internal/gland/proc/ownerCheck()
+/obj/item/organ/internal/heart/gland/proc/ownerCheck()
if(ishuman(owner))
return 1
if(!human_only && iscarbon(owner))
return 1
return 0
-/obj/item/organ/internal/gland/proc/Start()
+/obj/item/organ/internal/heart/gland/proc/Start()
active = 1
next_activation = world.time + rand(cooldown_low,cooldown_high)
-/obj/item/organ/internal/gland/remove(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
- ..()
+ . = ..()
-/obj/item/organ/internal/gland/insert(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/insert(var/mob/living/carbon/M, special = 0)
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
-/obj/item/organ/internal/gland/on_life()
+/obj/item/organ/internal/heart/gland/on_life()
+ if(!beating)
+ // alien glands are immune to stopping.
+ beating = TRUE
if(!active)
return
if(!ownerCheck())
@@ -52,30 +54,28 @@
if(!uses)
active = 0
-/obj/item/organ/internal/gland/proc/activate()
+/obj/item/organ/internal/heart/gland/proc/activate()
return
-/obj/item/organ/internal/gland/heals
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/heals
cooldown_low = 200
cooldown_high = 400
uses = -1
icon_state = "health"
-/obj/item/organ/internal/gland/heals/activate()
+/obj/item/organ/internal/heart/gland/heals/activate()
to_chat(owner, "You feel curiously revitalized. ")
owner.adjustBruteLoss(-20)
owner.adjustOxyLoss(-20)
owner.adjustFireLoss(-20)
-/obj/item/organ/internal/gland/slime
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/slime
cooldown_low = 600
cooldown_high = 1200
uses = -1
icon_state = "slime"
-/obj/item/organ/internal/gland/slime/activate()
+/obj/item/organ/internal/heart/gland/slime/activate()
to_chat(owner, "You feel nauseous! ")
owner.vomit(20)
@@ -83,14 +83,14 @@
Slime.Friends = list(owner)
Slime.Leader = owner
-/obj/item/organ/internal/gland/mindshock
- origin_tech = "materials=4;biotech=5;magnets=3;abductor=3"
+/obj/item/organ/internal/heart/gland/mindshock
+ origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 300
cooldown_high = 300
uses = -1
icon_state = "mindshock"
-/obj/item/organ/internal/gland/mindshock/activate()
+/obj/item/organ/internal/heart/gland/mindshock/activate()
to_chat(owner, "You get a headache. ")
var/turf/T = get_turf(owner)
@@ -100,40 +100,37 @@
to_chat(H, "You hear a buzz in your head. ")
H.AdjustConfused(20)
-/obj/item/organ/internal/gland/pop
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/pop
cooldown_low = 900
cooldown_high = 1800
- uses = 6
+ uses = -1
human_only = 1
icon_state = "species"
-/obj/item/organ/internal/gland/pop/activate()
+/obj/item/organ/internal/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself. ")
var/species = pick("Unathi","Skrell","Diona","Tajaran","Vulpkanin","Kidan","Grey","Diona")
owner.set_species(species)
-/obj/item/organ/internal/gland/ventcrawling
+/obj/item/organ/internal/heart/gland/ventcrawling
origin_tech = "materials=4;biotech=5;bluespace=3;abductor=3"
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "vent"
-/obj/item/organ/internal/gland/ventcrawling/activate()
+/obj/item/organ/internal/heart/gland/ventcrawling/activate()
to_chat(owner, "You feel very stretchy. ")
owner.ventcrawler = 2
- return
-/obj/item/organ/internal/gland/viral
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/viral
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "viral"
-/obj/item/organ/internal/gland/viral/activate()
+/obj/item/organ/internal/heart/gland/viral/activate()
to_chat(owner, "You feel sick. ")
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
var/datum/disease/D = new virus_type()
@@ -144,51 +141,49 @@
owner.med_hud_set_status()
-/obj/item/organ/internal/gland/emp //TODO : Replace with something more interesting
- origin_tech = "materials=4;biotech=5;magnets=3;abductor=3"
+/obj/item/organ/internal/heart/gland/emp //TODO : Replace with something more interesting
+ origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 900
cooldown_high = 1600
uses = 10
icon_state = "emp"
-/obj/item/organ/internal/gland/emp/activate()
+/obj/item/organ/internal/heart/gland/emp/activate()
to_chat(owner, "You feel a spike of pain in your head. ")
empulse(get_turf(owner), 2, 5, 1)
-/obj/item/organ/internal/gland/spiderman
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/spiderman
cooldown_low = 450
cooldown_high = 900
uses = 10
icon_state = "spider"
-/obj/item/organ/internal/gland/spiderman/activate()
+/obj/item/organ/internal/heart/gland/spiderman/activate()
to_chat(owner, "You feel something crawling in your skin. ")
owner.faction |= "spiders"
- new /obj/effect/spider/spiderling(owner.loc)
+ new /obj/structure/spider/spiderling(owner.loc)
-/obj/item/organ/internal/gland/egg
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/egg
cooldown_low = 300
cooldown_high = 400
uses = -1
icon_state = "egg"
-/obj/item/organ/internal/gland/egg/activate()
+/obj/item/organ/internal/heart/gland/egg/activate()
to_chat(owner, "You lay an egg! ")
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc)
egg.reagents.add_reagent("sacid",20)
egg.desc += " It smells bad."
-/obj/item/organ/internal/gland/bloody
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/bloody
cooldown_low = 200
cooldown_high = 400
uses = -1
-/obj/item/organ/internal/gland/bloody/activate()
- owner.adjustBruteLoss(15)
-
+/obj/item/organ/internal/heart/gland/bloody/activate()
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ H.drip(200)
owner.visible_message("[owner]'s skin erupts with blood! ",\
"Blood pours from your skin! ")
@@ -202,22 +197,22 @@
H.w_uniform.add_blood(owner)
H.update_inv_w_uniform(0)
-/obj/item/organ/internal/gland/bodysnatch
- origin_tech = "materials=4;biotech=7;abductor=3"
+/obj/item/organ/internal/heart/gland/bodysnatch
cooldown_low = 600
cooldown_high = 600
human_only = 1
uses = 1
-/obj/item/organ/internal/gland/bodysnatch/activate()
+/obj/item/organ/internal/heart/gland/bodysnatch/activate()
to_chat(owner, "You feel something moving around inside you... ")
//spawn cocoon with clone greytide snpc inside
if(ishuman(owner))
var/obj/effect/cocoon/abductor/C = new (get_turf(owner))
C.Copy(owner)
C.Start()
- owner.gib()
- return
+ owner.adjustBruteLoss(40)
+ var/turf/T = get_turf(owner)
+ T.add_blood_floor(src)
/obj/effect/cocoon/abductor
name = "slimy cocoon"
@@ -232,11 +227,18 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
var/datum/dna/owner_dna = H.dna
clone.rename_character(clone.name, owner_dna.real_name)
- clone.body_accessory = H.body_accessory
clone.dna = owner_dna.Clone()
clone.set_species(H.species.name)
+ clone.body_accessory = H.body_accessory
domutcheck(clone)
+ for(var/obj/item/I in clone)
+ if(istype(I, /obj/item/weapon/implant))
+ continue
+ if(istype(I, /obj/item/organ))
+ continue
+ qdel(I)
+
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\
@@ -245,7 +247,7 @@
for(var/slot in slots)
var/obj/item/I = H.get_item_by_slot(slot)
if(I)
- clone.equip_to_slot_if_possible(I,slot)
+ clone.equip_to_slot_or_del(new I.type(clone), slot)
/obj/effect/cocoon/abductor/proc/Start()
hatch_time = world.time + 600
@@ -259,22 +261,25 @@
M.forceMove(get_turf(src))
qdel(src)
-/obj/item/organ/internal/gland/plasma
- cooldown_low = 2400
- cooldown_high = 3000
- origin_tech = "materials=4;biotech=5;plasmatech=3;abductor=3"
- uses = 1
-/obj/item/organ/internal/gland/plasma/activate()
- to_chat(owner, "You feel bloated. ")
- sleep(150)
- if(!owner) return
- to_chat(owner, "A massive stomachache overcomes you. ")
- sleep(50)
- if(!owner) return
- owner.visible_message("[owner] explodes in a cloud of plasma! ")
- var/turf/simulated/T = get_turf(owner)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,300)
- owner.gib()
- return
+/obj/item/organ/internal/heart/gland/plasma
+ cooldown_low = 1200
+ cooldown_high = 1800
+ origin_tech = "materials=4;biotech=4;plasmatech=6;abductor=3"
+ uses = -1
+
+/obj/item/organ/internal/heart/gland/plasma/activate()
+ spawn(0)
+ to_chat(owner, "You feel bloated. ")
+ sleep(150)
+ if(!owner)
+ return
+ to_chat(owner, "A massive stomachache overcomes you. ")
+ sleep(50)
+ if(!owner)
+ return
+ owner.visible_message("[owner] vomits a cloud of plasma! ")
+ var/turf/simulated/T = get_turf(owner)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,50)
+ owner.vomit()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 24b02aea489..219ae4b6e54 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -49,15 +49,12 @@
set_droppoint_action.target = console
set_droppoint_action.Grant(user)
-/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- return H.get_species() == "Abductor"
-
/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
if(H.mind && H.mind.abductor)
return H.mind.abductor.scientist
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
- if(!iscarbon(user) || !IsAbductor(user))
+ if(!isabductor(user))
return
return ..()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index ddac0731249..3a93f8abc75 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -11,21 +11,6 @@
abductor_equipment.Remove(src)
return ..()
-/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- return H.get_species() == "Abductor"
-
-/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
- if(H.get_species() == "Abductor")
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.agent
- return 0
-
-/obj/machinery/abductor/proc/IsScientist(mob/living/carbon/human/H)
- if(H.get_species() == "Abductor")
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
- return 0
-
//Console
/obj/machinery/abductor/console
@@ -33,8 +18,8 @@
desc = "Ship command center."
icon = 'icons/obj/abductor.dmi'
icon_state = "console"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
var/obj/item/device/abductor/gizmo/gizmo
var/obj/item/clothing/suit/armor/abductor/vest/vest
var/obj/machinery/abductor/experiment/experiment
@@ -49,9 +34,9 @@
/obj/machinery/abductor/console/attack_hand(mob/user)
if(..())
return
- if(!IsAbductor(user))
+ if(!isabductor(user))
to_chat(user, "You start mashing alien buttons at random! ")
- if(do_after(user,100, target = src))
+ if(do_after(user, 100, target = src))
TeleporterSend()
return
user.set_machine(src)
@@ -60,10 +45,13 @@
if(experiment != null)
var/points = experiment.points
+ var/credits = experiment.credits
dat += "Collected Samples : [points] "
+ dat += "Gear Credits: [credits] "
dat += "Transfer data in exchange for supplies: "
dat += "Advanced Baton "
dat += "Agent Helmet "
+ dat += "Agent Vest "
dat += "Radio Silencer "
dat += "Science Tool "
else
@@ -92,13 +80,13 @@
dat+=" "
dat += "Select Agent Vest Disguise "
+ dat += "[vest.flags & NODROP ? "Unlock" : "Lock"] Vest "
else
dat += "NO AGENT VEST DETECTED "
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
- return
/obj/machinery/abductor/console/Topic(href, href_list)
if(..())
@@ -111,6 +99,8 @@
TeleporterRetrieve()
else if(href_list["flip_vest"])
FlipVest()
+ else if(href_list["toggle_vest"])
+ toggle_vest()
else if(href_list["select_disguise"])
SelectDisguise()
else if(href_list["dispense"])
@@ -123,37 +113,28 @@
Dispense(/obj/item/device/abductor/silencer)
if("tool")
Dispense(/obj/item/device/abductor/gizmo)
- src.updateUsrDialog()
+ if("vest")
+ Dispense(/obj/item/clothing/suit/armor/abductor/vest)
+ updateUsrDialog()
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
if(gizmo!=null && pad!=null && gizmo.marked)
pad.Retrieve(gizmo.marked)
- return
/obj/machinery/abductor/console/proc/TeleporterSend()
if(pad!=null)
pad.Send()
- return
/obj/machinery/abductor/console/proc/FlipVest()
if(vest!=null)
vest.flip_mode()
- return
-/obj/machinery/abductor/console/proc/SelectDisguise(remote=0)
- var/list/entries = list()
- var/tempname
- var/datum/icon_snapshot/temp
- for(var/i = 1; i <= disguises.len; i++)
- temp = disguises[i]
- tempname = temp.name
- entries["[tempname]"] = disguises[i]
- var/entry_name = input( "Choose Disguise", "Disguise") in entries
- var/datum/icon_snapshot/chosen = entries[entry_name]
+/obj/machinery/abductor/console/proc/SelectDisguise(remote = 0)
+ var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises
+ var/datum/icon_snapshot/chosen = disguises[entry_name]
if(chosen && (remote || in_range(usr,src)))
vest.SetDisguise(chosen)
- return
/obj/machinery/abductor/console/proc/SetDroppoint(turf/location,user)
if(!istype(location))
@@ -188,13 +169,11 @@
entry.icon = target.icon
entry.icon_state = target.icon_state
entry.overlays = target.get_overlays_copy(list(L_HAND_LAYER,R_HAND_LAYER))
- for(var/i=1,i<=disguises.len,i++)
- var/datum/icon_snapshot/temp = disguises[i]
- if(temp.name == entry.name)
- disguises[i] = entry
- return
- disguises.Add(entry)
- return
+ //Update old disguise instead of adding new one
+ if(disguises[entry.name])
+ disguises[entry.name] = entry
+ return
+ disguises[entry.name] = entry
/obj/machinery/abductor/console/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/device/abductor/gizmo))
@@ -205,13 +184,16 @@
else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest))
var/obj/item/clothing/suit/armor/abductor/vest/V = O
to_chat(user, "You link the vest to the console. ")
+ if(istype(vest))
+ if(vest.flags & NODROP)
+ toggle_vest()
vest = V
else
..()
/obj/machinery/abductor/console/proc/Dispense(item,cost=1)
- if(experiment && experiment.points >= cost)
- experiment.points-=cost
+ if(experiment && experiment.credits >= cost)
+ experiment.credits -=cost
atom_say("Incoming supply!")
if(pad)
flick("alien-pad", pad)
@@ -220,4 +202,9 @@
new item(src.loc)
else
atom_say("Insufficent data!")
- return
+
+/obj/machinery/abductor/console/proc/toggle_vest()
+ vest.flags ^= NODROP
+ var/mob/M = vest.loc
+ if(istype(M))
+ to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"]. ")
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
index 4ead0232a2f..2b6103632f5 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
@@ -14,7 +14,8 @@
return rgb(rand(0,255),rand(0,255),rand(0,255))
/obj/machinery/abductor/gland_dispenser/New()
- gland_types = subtypesof(/obj/item/organ/internal/gland)
+ ..()
+ gland_types = subtypesof(/obj/item/organ/internal/heart/gland)
gland_types = shuffle(gland_types)
gland_colors = new/list(gland_types.len)
amounts = new/list(gland_types.len)
@@ -25,7 +26,7 @@
/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
if(..())
return
- if(!IsAbductor(user))
+ if(!isabductor(user))
return
user.set_machine(src)
var/box_css = {"
@@ -59,13 +60,15 @@
return
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W, /obj/item/organ/internal/gland))
+ if(istype(W, /obj/item/organ/internal/heart/gland))
if(!user.drop_item())
return
W.forceMove(src)
for(var/i=1,i<=gland_colors.len,i++)
if(gland_types[i] == W.type)
amounts[i]++
+ else
+ ..()
/obj/machinery/abductor/gland_dispenser/Topic(href, href_list)
if(..())
@@ -74,7 +77,7 @@
if(href_list["dispense"])
Dispense(text2num(href_list["dispense"]))
- src.updateUsrDialog()
+ updateUsrDialog()
/obj/machinery/abductor/gland_dispenser/proc/Dispense(count)
if(amounts[count]>0)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 755bd21e2e5..44b2a431c7b 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -6,6 +6,7 @@
anchored = 1
density = 1
var/points = 0
+ var/credits = 0
var/list/history = list()
var/list/abductee_minds = list()
var/flash = " - || - "
@@ -19,10 +20,10 @@
/obj/machinery/abductor/experiment/MouseDrop_T(mob/living/carbon/human/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target))
return
- if(IsAbductor(target))
+ if(isabductor(target))
return
if(occupant)
- to_chat(user, "\The [src] is already occupied. ")
+ to_chat(user, "[src] is already occupied. ")
return //occupied
if(target.buckled)
return
@@ -118,7 +119,7 @@
if(H.stat == DEAD)
atom_say("Specimen deceased - please provide fresh sample.")
return "Specimen deceased. "
- var/obj/item/organ/internal/gland/GlandTest = locate() in H.internal_organs
+ var/obj/item/organ/internal/heart/gland/GlandTest = locate() in H.internal_organs
if(!GlandTest)
atom_say("Experimental dissection not detected!")
return "No glands detected! "
@@ -147,7 +148,7 @@
obj_count++
ticker.mode.update_abductor_icons_added(H.mind)
- for(var/obj/item/organ/internal/gland/G in H.internal_organs)
+ for(var/obj/item/organ/internal/heart/gland/G in H.internal_organs)
G.Start()
point_reward++
if(point_reward > 0)
@@ -155,6 +156,7 @@
SendBack(H)
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
points += point_reward
+ credits += point_reward
return "Experiment successful! [point_reward] new data-points collected. "
else
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
@@ -183,7 +185,7 @@
var/obj/item/weapon/grab/grabbed = G
if(!ishuman(grabbed.affecting))
return
- if(IsAbductor(grabbed.affecting))
+ if(isabductor(grabbed.affecting))
return
if(occupant)
to_chat(user, "The [src] is already occupied! ")
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index 285b097d06a..f0ceac0d6ce 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -17,6 +17,8 @@
target.forceMove(teleport_target)
spawn(0)
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
+ to_chat(target, "The instability of the warp leaves you disoriented! ")
+ target.Stun(3)
/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
flick("alien-pad", src)
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index a074773932b..ea92b93f473 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -2,35 +2,35 @@
name = "host brain"
real_name = "host brain"
-/mob/living/captive_brain/say(var/message)
+/mob/living/captive_brain/say(message)
- if(src.client)
+ if(client)
if(client.prefs.muted & MUTE_IC)
- to_chat(src, "\red You cannot speak in IC (muted).")
+ to_chat(src, "You cannot speak in IC (muted). ")
return
- if(src.client.handle_spam_prevention(message,MUTE_IC))
+ if(client.handle_spam_prevention(message,MUTE_IC))
return
- if(istype(src.loc,/mob/living/simple_animal/borer))
+ if(istype(loc,/mob/living/simple_animal/borer))
message = trim(sanitize(copytext(message, 1, MAX_MESSAGE_LEN)))
if(!message)
return
log_say("[key_name(src)] : [message]")
if(stat == DEAD)
return say_dead(message)
- var/mob/living/simple_animal/borer/B = src.loc
+ var/mob/living/simple_animal/borer/B = loc
to_chat(src, "You whisper silently, \"[message]\"")
- to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"")
+ to_chat(B.host, "The captive mind of [src] whispers, \"[message]\" ")
for(var/mob/M in mob_list)
- if(M.mind && (istype(M, /mob/dead/observer)))
+ if(M.mind && isobserver(M))
to_chat(M, "Thought-speech, [src] -> [B.truename]: [message] ")
/mob/living/captive_brain/say_understands(var/mob/other, var/datum/language/speaking = null)
- var/mob/living/simple_animal/borer/B = src.loc
+ var/mob/living/simple_animal/borer/B = loc
if(!istype(B))
log_runtime(EXCEPTION("Trapped mind found without a borer!"), src)
- return 0
+ return FALSE
return B.host.say_understands(other, speaking)
/mob/living/captive_brain/emote(var/message)
@@ -42,20 +42,18 @@
to_chat(src, "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds). ")
to_chat(B.host, "You feel the captive mind of [src] begin to resist your control. ")
- spawn(rand(350,450) + B.host.brainloss)
+ var/delay = (rand(350,450) + B.host.brainloss)
+ addtimer(src, "return_control", delay, FALSE, B)
- if(!B || !B.controlling)
- return
+/mob/living/captive_brain/proc/return_control(mob/living/simple_animal/borer/B)
+ if(!B || !B.controlling)
+ return
- B.host.adjustBrainLoss(rand(5,10))
- to_chat(src, "With an immense exertion of will, you regain control of your body! ")
- to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you. ")
+ B.host.adjustBrainLoss(rand(5,10))
+ to_chat(src, "With an immense exertion of will, you regain control of your body! ")
+ to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you. ")
- B.detatch()
-
- verbs -= /mob/living/carbon/proc/release_control
- verbs -= /mob/living/carbon/proc/punish_host
- verbs -= /mob/living/carbon/proc/spawn_larvae
+ B.detach()
/mob/living/simple_animal/borer
name = "cortical borer"
@@ -78,20 +76,83 @@
wander = 0
mob_size = MOB_SIZE_TINY
density = 0
- pass_flags = PASSTABLE
+ pass_flags = PASSTABLE | PASSMOB
+ mob_size = MOB_SIZE_SMALL
+ faction = list("creature")
ventcrawler = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
-
- var/talk_inside_host = 0 // So that borers don't accidentally give themselves away on a botched message
+ minbodytemp = 0
+ maxbodytemp = 1500
+ var/generation = 1
+ var/static/list/borer_names = list(
+ "Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary",
+ "Septenary", "Octonary", "Novenary", "Decenary", "Undenary", "Duodenary",
+ )
+ var/talk_inside_host = FALSE // So that borers don't accidentally give themselves away on a botched message
var/used_dominate
- var/chemicals = 10 // Chemicals used for reproduction and chemical injection.
- var/max_chems = 250 // How many chemicals that can be stored in total
- var/mob/living/carbon/human/host // Human host for the brain worm.
- var/truename // Name used for brainworm-speak.
- var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
- var/controlling // Used in human death check.
- var/docile = 0 // Sugar can stop borers from acting.
- var/list/borer_injection_chems = list("mannitol","salglu_solution","methamphetamine", "hydrocodone", "spaceacillin", "mitocholide", "charcoal", "salbutamol", "capulettium_plus")
+ var/chemicals = 10 // Chemicals used for reproduction and chemical injection.
+ var/max_chems = 250
+ var/mob/living/carbon/human/host // Human host for the brain worm.
+ var/truename // Name used for brainworm-speak.
+ var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
+ var/controlling // Used in human death check.
+ var/docile = FALSE // Sugar can stop borers from acting.
+ var/bonding = FALSE
+ var/leaving = FALSE
+ var/hiding = FALSE
+ var/datum/action/innate/borer/talk_to_host/talk_to_host_action = new
+ var/datum/action/innate/borer/infest_host/infest_host_action = new
+ var/datum/action/innate/borer/toggle_hide/toggle_hide_action = new
+ var/datum/action/innate/borer/talk_to_borer/talk_to_borer_action = new
+ var/datum/action/innate/borer/talk_to_brain/talk_to_brain_action = new
+ var/datum/action/innate/borer/take_control/take_control_action = new
+ var/datum/action/innate/borer/give_back_control/give_back_control_action = new
+ var/datum/action/innate/borer/leave_body/leave_body_action = new
+ var/datum/action/innate/borer/make_chems/make_chems_action = new
+ var/datum/action/innate/borer/make_larvae/make_larvae_action = new
+ var/datum/action/innate/borer/freeze_victim/freeze_victim_action = new
+ var/datum/action/innate/borer/torment/torment_action = new
+
+/mob/living/simple_animal/borer/New(atom/newloc, var/gen=1)
+ ..(newloc)
+ generation = gen
+ add_language("Cortical Link")
+ notify_ghosts("A cortical borer has been created in [get_area(src)]!", enter_link = "(Click to enter) ", source = src, action = NOTIFY_ATTACK)
+ real_name = "Cortical Borer [rand(1000,9999)]"
+ truename = "[borer_names[min(generation, borer_names.len)]] [rand(1000,9999)]"
+ GrantBorerActions()
+
+/mob/living/simple_animal/borer/attack_ghost(mob/user)
+ if(jobban_isbanned(user, "Syndicate"))
+ return
+ if(key)
+ return
+ if(stat != CONSCIOUS)
+ return
+ var/be_borer = alert("Become a cortical borer? (Warning, You can no longer be cloned!)",,"Yes","No")
+ if(be_borer == "No" || !src || qdeleted(src))
+ return
+ if(key)
+ return
+ transfer_personality(user.client)
+
+/mob/living/simple_animal/borer/Stat()
+ ..()
+ statpanel("Status")
+
+ show_stat_emergency_shuttle_eta()
+
+ if(client.statpanel == "Status")
+ stat("Chemicals", chemicals)
+
+/mob/living/simple_animal/borer/say(var/message)
+ var/datum/language/dialect = parse_language(message)
+ if(!dialect)
+ dialect = get_default_language()
+ if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host)
+ to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications. ")
+ return
+ ..()
/mob/living/simple_animal/borer/verb/Communicate()
set category = "Borer"
@@ -107,18 +168,20 @@
return
var/input = stripped_input(src, "Please enter a message to tell your host.", "Borer", "")
- if(!input) return
+ if(!input)
+ return
-
- var/say_string = (docile) ? "slurs" :"states"
- if(host)
- to_chat(host, "[src.truename] [say_string]: [input] ")
- log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]")
- for(var/M in dead_mob_list)
- if(istype(M, /mob/dead/observer))
- to_chat(M, "Borer Communication from [src.truename] ([ghost_follow_link(src, ghost=M)]): [input] ")
- to_chat(src, "[src.truename] [say_string]: [input] ")
- host.verbs += /mob/living/proc/borer_comm
+ if(src && !qdeleted(src) && !qdeleted(host))
+ var/say_string = (docile) ? "slurs" :"states"
+ if(host)
+ to_chat(host, "[truename] [say_string]: [input] ")
+ log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]")
+ for(var/M in dead_mob_list)
+ if(isobserver(M))
+ to_chat(M, "Borer Communication from [truename] ([ghost_follow_link(src, ghost=M)]): [input] ")
+ to_chat(src, "[truename] [say_string]: [input] ")
+ host.verbs += /mob/living/proc/borer_comm
+ talk_to_borer_action.Grant(host)
/mob/living/simple_animal/borer/verb/toggle_silence_inside_host()
set name = "Toggle speech inside Host"
@@ -126,10 +189,10 @@
set desc = "Toggle whether you will be able to say audible messages while inside your host."
if(talk_inside_host)
- talk_inside_host = 0
+ talk_inside_host = FALSE
to_chat(src, "You will no longer talk audibly while inside a host. ")
else
- talk_inside_host = 1
+ talk_inside_host = TRUE
to_chat(src, "You will now be able to audibly speak from inside of a host. ")
/mob/living/proc/borer_comm()
@@ -138,18 +201,19 @@
set desc = "Communicate mentally with your borer."
- var/mob/living/simple_animal/borer/B = src.has_brain_worms()
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
var/input = stripped_input(src, "Please enter a message to tell the borer.", "Message", "")
- if(!input) return
+ if(!input)
+ return
to_chat(B, "[src] says: [input] ")
log_say("Borer Communication: [key_name(src)] -> [key_name(B)] : [input]")
for(var/M in dead_mob_list)
- if(istype(M, /mob/dead/observer))
+ if(isobserver(M))
to_chat(M, "Borer Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input] ")
to_chat(src, "[src] says: [input] ")
@@ -159,18 +223,19 @@
set desc = "Communicate mentally with the trapped mind of your host."
- var/mob/living/simple_animal/borer/B = src.has_brain_worms()
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B || !B.host_brain)
return
var/mob/living/captive_brain/CB = B.host_brain
var/input = stripped_input(src, "Please enter a message to tell the trapped mind.", "Message", "")
- if(!input) return
+ if(!input)
+ return
to_chat(CB, "[B.truename] says: [input] ")
log_say("Borer Communication: [key_name(B)] -> [key_name(CB)] : [input]")
for(var/M in dead_mob_list)
- if(istype(M, /mob/dead/observer))
+ if(isobserver(M))
to_chat(M, "Borer Communication from [B] ([ghost_follow_link(src, ghost=M)]): [input] ")
to_chat(src, "[B.truename] says: [input] ")
@@ -185,24 +250,24 @@
if(host.reagents.has_reagent("sugar"))
if(!docile)
if(controlling)
- to_chat(host, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.")
+ to_chat(host, "You feel the soporific flow of sugar in your host's blood, lulling you into docility. ")
else
- to_chat(src, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.")
- docile = 1
+ to_chat(src, "You feel the soporific flow of sugar in your host's blood, lulling you into docility. ")
+ docile = TRUE
else
if(docile)
if(controlling)
- to_chat(host, "\blue You shake off your lethargy as the sugar leaves your host's blood.")
+ to_chat(host, "You shake off your lethargy as the sugar leaves your host's blood. ")
else
- to_chat(src, "\blue You shake off your lethargy as the sugar leaves your host's blood.")
- docile = 0
+ to_chat(src, "You shake off your lethargy as the sugar leaves your host's blood. ")
+ docile = FALSE
if(chemicals < max_chems)
chemicals++
if(controlling)
if(docile)
- to_chat(host, "\blue You are feeling far too docile to continue controlling your host...")
+ to_chat(host, "You are feeling far too docile to continue controlling your host... ")
host.release_control()
return
@@ -218,36 +283,193 @@
else
return ..()
-/mob/living/simple_animal/borer/New(var/by_gamemode=0)
+/mob/living/simple_animal/borer/UnarmedAttack(mob/living/M)
+ chemscan(usr, M)
+ return
+
+/mob/living/simple_animal/borer/verb/infest()
+ set category = "Borer"
+ set name = "Infest"
+ set desc = "Infest a suitable humanoid host."
+
+ if(host)
+ to_chat(src, "You are already within a host.")
+ return
+
+ if(stat)
+ to_chat(src, "You cannot infest a target in your current state.")
+ return
+
+ var/list/choices = list()
+ for(var/mob/living/carbon/human/H in view(1,src))
+ var/obj/item/organ/external/head/head = H.get_organ("head")
+ if(head.status & ORGAN_ROBOT)
+ continue
+ if(H.stat != DEAD && Adjacent(H) && !H.has_brain_worms())
+ choices += H
+
+ var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices
+
+ if(!M || !src)
+ return
+
+ if(!Adjacent(M))
+ return
+
+ if(M.has_brain_worms())
+ to_chat(src, "You cannot infest someone who is already infested!")
+ return
+
+ to_chat(src, "You slither up [M] and begin probing at their ear canal...")
+
+ if(!do_after(src, 50, target = M))
+ to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
+ return
+
+ if(!M || !src)
+ return
+
+ if(stat)
+ to_chat(src, "You cannot infest a target in your current state.")
+ return
+
+ if(M.stat == DEAD)
+ to_chat(src, "That is not an appropriate target.")
+ return
+
+ if(M in view(1, src))
+ to_chat(src, "You wiggle into [M]'s ear.")
+ /*
+ if(!M.stat)
+ to_chat(M, "Something disgusting and slimy wiggles into your ear!")
+ */ // Let's see how stealthborers work out
+
+ perform_infestation(M)
+
+ return
+ else
+ to_chat(src, "They are no longer in range!")
+ return
+
+/mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M)
+ if(!M)
+ return
+
+ if(M.has_brain_worms())
+ to_chat(src, "[M] is already infested! ")
+ return
+ host = M
+ forceMove(M)
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/head = H.get_organ("head")
+ head.implants += src
+
+ host.status_flags |= PASSEMOTES
+
+ RemoveBorerActions()
+ GrantInfestActions()
+
+/mob/living/simple_animal/borer/verb/secrete_chemicals()
+ set category = "Borer"
+ set name = "Secrete Chemicals"
+ set desc = "Push some chemicals into your host's bloodstream."
+
+ if(!host)
+ to_chat(src, "You are not inside a host body.")
+ return
+
+ if(stat)
+ to_chat(src, "You cannot secrete chemicals in your current state.")
+
+ if(docile)
+ to_chat(src, " You are feeling far too docile to do that. ")
+ return
+
+ var content = ""
+
+ content += ""
+
+ for(var/datum in typesof(/datum/borer_chem))
+ var/datum/borer_chem/C = datum
+ var/cname = initial(C.chemname)
+ var/datum/reagent/R = chemical_reagents_list[cname]
+ if(cname)
+ content += "[R.name] ([initial(C.chemuse)]) [initial(C.chemdesc)]
"
+
+ content += "
"
+
+ var/html = get_html_template(content)
+
+ usr << browse(null, "window=ViewBorer[UID()]Chems;size=585x400")
+ usr << browse(html, "window=ViewBorer[UID()]Chems;size=585x400")
+
+ return
+
+/mob/living/simple_animal/borer/Topic(href, href_list, hsrc)
+ if(href_list["ghostjoin"])
+ var/mob/dead/observer/ghost = usr
+ if(istype(ghost))
+ attack_ghost(ghost)
+ if(href_list["borer_use_chem"])
+ locate(href_list["src"])
+ if(!istype(src, /mob/living/simple_animal/borer))
+ return
+
+ var/topic_chem = href_list["borer_use_chem"]
+ var/datum/borer_chem/C = null
+
+ for(var/datum in typesof(/datum/borer_chem))
+ var/datum/borer_chem/test = datum
+ if(initial(test.chemname) == topic_chem)
+ C = new test()
+ break
+
+ if(!C || !host || controlling || !src || stat)
+ return
+ var/datum/reagent/R = chemical_reagents_list[C.chemname]
+ if(chemicals < C.chemuse)
+ to_chat(src, "You need [C.chemuse] chemicals stored to secrete [R.name]! ")
+ return
+
+ to_chat(src, "You squirt a measure of [R.name] from your reservoirs into [host]'s bloodstream. ")
+ host.reagents.add_reagent(C.chemname, C.quantity)
+ chemicals -= C.chemuse
+ log_game("[src]/([src.ckey]) has injected [R.name] into their host [host]/([host.ckey])")
+
+ // This is used because we use a static set of datums to determine what chems are available,
+ // instead of a table or something. Thus, when we instance it, we can safely delete it
+ qdel(C)
..()
- add_language("Cortical Link")
- updatename()
- if(!by_gamemode)
- request_player()
+/mob/living/simple_animal/borer/verb/hide_borer()
+ set category = "Borer"
+ set name = "Hide"
+ set desc = "Become invisible to the common eye."
-/mob/living/simple_animal/borer/proc/updatename()
- var/index_num = rand(1000,9999)
- real_name = "Cortical Borer ([index_num])"
- truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [index_num]"
+ if(host)
+ to_chat(usr, "You cannot do this while you're inside a host. ")
+ return
-/mob/living/simple_animal/borer/Stat()
- ..()
- statpanel("Status")
+ if(stat != CONSCIOUS)
+ return
- show_stat_emergency_shuttle_eta()
-
- if(client.statpanel == "Status")
- stat("Chemicals", chemicals)
-
-// VERBS!
+ if(!hiding)
+ layer = TURF_LAYER+0.2
+ to_chat(src, "You are now hiding. ")
+ hiding = TRUE
+ else
+ layer = MOB_LAYER
+ to_chat(src, "You stop hiding. ")
+ hiding = FALSE
/mob/living/simple_animal/borer/verb/dominate_victim()
set category = "Borer"
set name = "Dominate Victim"
set desc = "Freeze the limbs of a potential host with supernatural fear."
- if(world.time - used_dominate < 300)
+ if(world.time - used_dominate < 150)
to_chat(src, "You cannot use that ability again so soon.")
return
@@ -255,7 +477,7 @@
to_chat(src, "You cannot do that from within a host body.")
return
- if(src.stat)
+ if(stat)
to_chat(src, "You cannot do that in your current state.")
return
@@ -270,137 +492,19 @@
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
- if(!M || !src) return
-
- if(M.has_brain_worms())
- to_chat(src, "You cannot infest someone who is already infested!")
+ if(!M || !src)
return
- to_chat(src, "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.")
- to_chat(M, "\red You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.")
+ if(M.has_brain_worms())
+ to_chat(src, "You cannot dominate someone who is already infested!")
+ return
+
+ to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread. ")
+ to_chat(M, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing. ")
M.Weaken(3)
used_dominate = world.time
-/mob/living/simple_animal/borer/verb/bond_brain()
- set category = "Borer"
- set name = "Assume Control"
- set desc = "Fully connect to the brain of your host."
-
- if(!host)
- to_chat(src, "You are not inside a host body.")
- return
-
- if(host.stat == DEAD)
- to_chat(src, "This host is in no condition to be controlled.")
- return
-
- if(src.stat)
- to_chat(src, "You cannot do that in your current state.")
- return
-
- if(docile)
- to_chat(src, "\blue You are feeling far too docile to do that.")
- return
-
- to_chat(src, "You begin delicately adjusting your connection to the host brain...")
-
- spawn(300+(host.getBrainLoss()*5))
-
- if(!host || !src || controlling)
- return
- else
- to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system. ")
- to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours. ")
- var/borer_key = src.key
- host.attack_log += text("\[[time_stamp()]\] [key_name(src)] has assumed control of [key_name(host)] ")
- msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]")
- // host -> brain
- var/h2b_id = host.computer_id
- var/h2b_ip= host.lastKnownIP
- host.computer_id = null
- host.lastKnownIP = null
-
- qdel(host_brain)
- host_brain = new(src)
-
- host_brain.ckey = host.ckey
-
- host_brain.name = host.name
-
- if(!host_brain.computer_id)
- host_brain.computer_id = h2b_id
-
- if(!host_brain.lastKnownIP)
- host_brain.lastKnownIP = h2b_ip
-
- // self -> host
- var/s2h_id = src.computer_id
- var/s2h_ip= src.lastKnownIP
- src.computer_id = null
- src.lastKnownIP = null
-
- host.ckey = src.ckey
-
- if(!host.computer_id)
- host.computer_id = s2h_id
-
- if(!host.lastKnownIP)
- host.lastKnownIP = s2h_ip
-
- controlling = 1
-
- host.verbs += /mob/living/carbon/proc/release_control
- host.verbs += /mob/living/carbon/proc/punish_host
- host.verbs += /mob/living/carbon/proc/spawn_larvae
- host.verbs -= /mob/living/proc/borer_comm
- host.verbs += /mob/living/proc/trapped_mind_comm
-
- if(src && !src.key)
- src.key = "@[borer_key]"
- return
-
-/mob/living/simple_animal/borer/verb/secrete_chemicals()
- set category = "Borer"
- set name = "Secrete Chemicals (30)"
- set desc = "Push some chemicals into your host's bloodstream."
-
- var/injection_amount = 9
- var/chem_cost = 30
- if(!host)
- to_chat(src, "You are not inside a host body.")
- return
-
- if(stat)
- to_chat(src, "You cannot secrete chemicals in your current state.")
-
- if(docile)
- to_chat(src, "\blue You are feeling far too docile to do that.")
- return
-
- if(chemicals < chem_cost)
- to_chat(src, "You don't have enough chemicals!")
-
- var/list/nice_name_chem_list = list()
- for(var/rgnt in borer_injection_chems)
- var/datum/reagent/R2 = chemical_reagents_list[rgnt]
- nice_name_chem_list[R2.name] = rgnt
- var/chem_name = input("Select a chemical to secrete.", "Chemicals") as null|anything in nice_name_chem_list
- var/chem = nice_name_chem_list[chem_name]
-
- if(!chem || chemicals < chem_cost || !host || controlling || !src || stat) //Sanity check.
- return
-
- var/chem_amount = host.reagents.get_reagent_amount(chem)
- var/datum/reagent/R = chemical_reagents_list[chem]
- if(R.overdose_threshold && chem_amount + injection_amount > R.overdose_threshold)
- to_chat(src, "Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting. ")
- return
-
- to_chat(src, "You squirt a measure of [chem_name] from your reservoirs into [host]'s bloodstream. ")
- host.reagents.add_reagent(chem, injection_amount)
- chemicals -= chem_cost
-
/mob/living/simple_animal/borer/verb/release_host()
set category = "Borer"
set name = "Release Host"
@@ -415,37 +519,238 @@
return
if(docile)
- to_chat(src, "\blue You are feeling far too docile to do that.")
+ to_chat(src, "You are feeling far too docile to do that. ")
return
- if(!host || !src) return
+ if(!host || !src)
+ return
+
+ if(leaving)
+ leaving = FALSE
+ to_chat(src, "You decide against leaving your host. ")
+ return
to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.")
- spawn(200)
+ leaving = TRUE
- if(!host || !src) return
+ addtimer(src, "let_go", 200)
- if(src.stat)
- to_chat(src, "You cannot release a target in your current state.")
- return
+/mob/living/simple_animal/borer/proc/let_go()
- to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.")
+ if(!host || !src || qdeleted(host) || qdeleted(src))
+ return
+ if(!leaving)
+ return
+ if(controlling)
+ return
+ if(stat)
+ to_chat(src, "You cannot release a target in your current state.")
+ return
- detatch()
- leave_host()
+ to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.")
-/mob/living/simple_animal/borer/proc/detatch()
+ leaving = FALSE
+ leave_host()
- if(!host) return
+/mob/living/simple_animal/borer/proc/leave_host()
- if(istype(host,/mob/living/carbon/human))
+ if(!host)
+ return
+ if(controlling)
+ detach()
+ GrantBorerActions()
+ RemoveInfestActions()
+ forceMove(get_turf(host))
+
+ reset_perspective(null)
+ machine = null
+
+ host.reset_perspective(null)
+ host.machine = null
+
+ var/mob/living/H = host
+ H.verbs -= /mob/living/proc/borer_comm
+ talk_to_borer_action.Remove(host)
+ H.status_flags &= ~PASSEMOTES
+ host = null
+ return
+
+/mob/living/simple_animal/borer/verb/bond_brain()
+ set category = "Borer"
+ set name = "Assume Control"
+ set desc = "Fully connect to the brain of your host."
+
+ if(!host)
+ to_chat(src, "You are not inside a host body.")
+ return
+
+ if(host.stat == DEAD)
+ to_chat(src, "This host is in no condition to be controlled.")
+ return
+
+ if(stat)
+ to_chat(src, "You cannot do that in your current state.")
+ return
+
+ if(docile)
+ to_chat(src, "You are feeling far too docile to do that. ")
+ return
+
+ if(bonding)
+ bonding = FALSE
+ to_chat(src, "You stop attempting to take control of your host. ")
+ return
+
+ to_chat(src, "You begin delicately adjusting your connection to the host brain...")
+
+ if(qdeleted(src) || qdeleted(host))
+ return
+
+ bonding = TRUE
+
+ var/delay = 300+(host.getBrainLoss()*5)
+ addtimer(src, "assume_control", delay)
+
+/mob/living/simple_animal/borer/proc/assume_control()
+ if(!host || !src || controlling)
+ return
+ if(!bonding)
+ return
+ if(docile)
+ to_chat(src,"You are feeling far too docile to do that. ")
+ return
+ else
+ to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system. ")
+ to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours. ")
+ var/borer_key = src.key
+ host.create_attack_log("[key_name(src)] has assumed control of [key_name(host)] ")
+ msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]")
+ // host -> brain
+ var/h2b_id = host.computer_id
+ var/h2b_ip= host.lastKnownIP
+ host.computer_id = null
+ host.lastKnownIP = null
+
+ qdel(host_brain)
+ host_brain = new(src)
+
+ host_brain.ckey = host.ckey
+
+ host_brain.name = host.name
+
+ if(!host_brain.computer_id)
+ host_brain.computer_id = h2b_id
+
+ if(!host_brain.lastKnownIP)
+ host_brain.lastKnownIP = h2b_ip
+
+ // self -> host
+ var/s2h_id = src.computer_id
+ var/s2h_ip= src.lastKnownIP
+ src.computer_id = null
+ src.lastKnownIP = null
+
+ host.ckey = src.ckey
+
+ if(!host.computer_id)
+ host.computer_id = s2h_id
+
+ if(!host.lastKnownIP)
+ host.lastKnownIP = s2h_ip
+
+ bonding = FALSE
+ controlling = TRUE
+
+ host.verbs += /mob/living/carbon/proc/release_control
+ host.verbs += /mob/living/carbon/proc/punish_host
+ host.verbs += /mob/living/carbon/proc/spawn_larvae
+ host.verbs -= /mob/living/proc/borer_comm
+ host.verbs += /mob/living/proc/trapped_mind_comm
+
+ GrantControlActions()
+ talk_to_borer_action.Remove(host)
+ host.med_hud_set_status()
+
+ if(src && !src.key)
+ src.key = "@[borer_key]"
+ return
+
+/mob/living/carbon/proc/punish_host()
+ set category = "Borer"
+ set name = "Torment Host"
+ set desc = "Punish your host with agony."
+
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
+
+ if(!B)
+ return
+
+ if(B.host_brain)
+ to_chat(src, "You send a punishing spike of psychic agony lancing into your host's brain. ")
+ to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind! ")
+
+//Brain slug proc for voluntary removal of control.
+/mob/living/carbon/proc/release_control()
+
+ set category = "Borer"
+ set name = "Release Control"
+ set desc = "Release control of your host's body."
+
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
+
+ if(B && B.host_brain)
+ to_chat(src, "You withdraw your probosci, releasing control of [B.host_brain] ")
+
+ B.detach()
+
+ else
+ log_runtime(EXCEPTION("Missing borer or missing host brain upon borer release."), src)
+
+//Check for brain worms in head.
+/mob/proc/has_brain_worms()
+
+ for(var/I in contents)
+ if(istype(I,/mob/living/simple_animal/borer))
+ return I
+
+ return FALSE
+
+/mob/living/carbon/proc/spawn_larvae()
+ set category = "Borer"
+ set name = "Reproduce"
+ set desc = "Spawn several young."
+
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
+
+ if(!B)
+ return
+
+ if(B.chemicals >= 100)
+ to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body. ")
+ visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature! ")
+ B.chemicals -= 100
+
+ new /obj/effect/decal/cleanable/vomit(get_turf(src))
+ playsound(loc, 'sound/effects/splat.ogg', 50, 1)
+ new /mob/living/simple_animal/borer(get_turf(src),B.generation + 1)
+
+ else
+ to_chat(src, "You need 100 chemicals to reproduce!")
+ return
+
+/mob/living/simple_animal/borer/proc/detach()
+
+ if(!host || !controlling)
+ return
+
+ controlling = FALSE
+
+ if(ishuman(host))
var/mob/living/carbon/human/H = host
var/obj/item/organ/external/head = H.get_organ("head")
head.implants -= src
- controlling = 0
-
reset_perspective(null)
machine = null
@@ -455,10 +760,13 @@
host.verbs += /mob/living/proc/borer_comm
host.verbs -= /mob/living/proc/trapped_mind_comm
+ RemoveControlActions()
+ talk_to_borer_action.Grant(host)
+ host.med_hud_set_status()
if(host_brain)
- host.attack_log += text("\[[time_stamp()]\] [host_brain.name] ([host_brain.ckey]) has taken control back from [src.name] ([host.ckey]) ")
- msg_admin_attack("[host_brain.name] ([host_brain.ckey]) has taken control back from [src.name] ([host.ckey]) (JMP )")
+ host.create_attack_log("[host_brain.name] ([host_brain.ckey]) has taken control back from [name] ([host.ckey]) ")
+ msg_admin_attack("[host_brain.name] ([host_brain.ckey]) has taken control back from [name] ([host.ckey]) (JMP )")
// host -> self
var/h2s_id = host.computer_id
var/h2s_ip= host.lastKnownIP
@@ -491,213 +799,179 @@
return
-
-//Brain slug proc for voluntary removal of control.
-/mob/living/carbon/proc/release_control()
-
- set category = "Borer"
- set name = "Release Control"
- set desc = "Release control of your host's body."
-
- var/mob/living/simple_animal/borer/B = has_brain_worms()
-
- if(B && B.host_brain)
- to_chat(src, "You withdraw your probosci, releasing control of [B.host_brain] ")
-
- B.detatch()
-
- else
- to_chat(src, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG ! ")
-
-//Brain slug proc for tormenting the host.
-/mob/living/carbon/proc/punish_host()
- set category = "Borer"
- set name = "Torment host"
- set desc = "Punish your host with agony."
-
- var/mob/living/simple_animal/borer/B = has_brain_worms()
-
- if(!B)
- return
-
- if(B.host_brain.ckey)
- to_chat(src, "You send a punishing spike of psychic agony lancing into your host's brain. ")
- to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind! ")
-
-//Check for brain worms in head.
-/mob/proc/has_brain_worms()
-
- for(var/I in contents)
- if(istype(I,/mob/living/simple_animal/borer))
- return I
-
- return 0
-
-/mob/living/carbon/proc/spawn_larvae()
- set category = "Borer"
- set name = "Reproduce (100)"
- set desc = "Spawn several young."
-
- var/mob/living/simple_animal/borer/B = has_brain_worms()
-
- if(!B)
- return
-
- if(B.chemicals >= 100)
- to_chat(src, "Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body. ")
- visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature! ")
- B.chemicals -= 100
-
- new /obj/effect/decal/cleanable/vomit(get_turf(src))
- playsound(loc, 'sound/effects/splat.ogg', 50, 1)
- new /mob/living/simple_animal/borer(get_turf(src))
-
- else
- to_chat(src, "You do not have enough chemicals stored to reproduce.")
- return
-
-/mob/living/simple_animal/borer/proc/leave_host()
-
- if(!host) return
-
- src.forceMove(get_turf(host))
-
- reset_perspective(null)
- machine = null
-
- host.reset_perspective(null)
- host.machine = null
-
- var/mob/living/H = host
- H.verbs -= /mob/living/proc/borer_comm
- H.status_flags &= ~PASSEMOTES
- host = null
- return
-
-/mob/living/simple_animal/borer/verb/infest()
- set category = "Borer"
- set name = "Infest"
- set desc = "Infest a suitable humanoid host."
-
- if(host)
- to_chat(src, "You are already within a host.")
- return
-
- if(stat)
- to_chat(src, "You cannot infest a target in your current state.")
- return
-
- var/list/choices = list()
- for(var/mob/living/carbon/human/H in view(1,src))
- var/obj/item/organ/external/head/head = H.get_organ("head")
- if(head.status & ORGAN_ROBOT)
- continue
- if(H.stat != DEAD && src.Adjacent(H) && !H.has_brain_worms())
- choices += H
-
- var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices
-
- if(!M || !src) return
-
- if(!(src.Adjacent(M))) return
-
- if(M.has_brain_worms())
- to_chat(src, "You cannot infest someone who is already infested!")
- return
-
- to_chat(src, "You slither up [M] and begin probing at their ear canal...")
-
- if(!do_after(src,50, target = M))
- to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
- return
-
- if(!M || !src) return
-
- if(src.stat)
- to_chat(src, "You cannot infest a target in your current state.")
- return
-
- if(M.stat == DEAD)
- to_chat(src, "That is not an appropriate target.")
- return
-
- if(M in view(1, src))
- to_chat(src, "You wiggle into [M]'s ear.")
- /*
- if(!M.stat)
- to_chat(M, "Something disgusting and slimy wiggles into your ear!")
- */ // Let's see how stealthborers work out
-
- perform_infestation(M)
-
- return
- else
- to_chat(src, "They are no longer in range!")
- return
-
-/mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M)
- src.host = M
- src.forceMove(M)
-
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/head = H.get_organ("head")
- head.implants += src
-
- host.status_flags |= PASSEMOTES
-
/mob/living/simple_animal/borer/can_use_vents()
return
-//Procs for grabbing players.
-/mob/living/simple_animal/borer/proc/request_player()
- for(var/mob/O in respawnable_list)
- if(jobban_isbanned(O, "Syndicate"))
- continue
- if(O.client)
- if((ROLE_BORER in O.client.prefs.be_special) && !jobban_isbanned(O, ROLE_BORER))
- question(O.client)
-
-/mob/living/simple_animal/borer/proc/question(var/client/C)
- spawn(0)
- if(!C) return
- var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round")
- if(!C || ckey)
- return
- if(response == "Yes")
- transfer_personality(C)
- else if(response == "Never for this round")
- C.prefs.be_special -= ROLE_BORER
-
/mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
- if(!candidate)
+ if(!candidate || !candidate.mob)
return
- src.key = candidate.key
- if(src.mind)
- src.mind.assigned_role = "Cortical Borer"
+ if(!qdeleted(candidate) || !qdeleted(candidate.mob))
+ var/datum/mind/M = create_borer_mind(candidate.ckey)
+ M.transfer_to(src)
+ candidate.mob = src
+ ckey = candidate.ckey
+ to_chat(src, "You are a cortical borer! ")
+ to_chat(src, "You are a brain slug that worms its way into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, your host and your eventual spawn safe and warm.")
+ to_chat(src, "Sugar nullifies your abilities, avoid it at all costs!")
+ to_chat(src, "You can speak to your fellow borers by prefixing your messages with ':bo'. Check out your Borer tab to see your abilities.")
-/mob/living/simple_animal/borer/verb/borerhide()
- set category = "Borer"
- set name = "Hide"
- set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
+/proc/create_borer_mind(key)
+ var/datum/mind/M = new /datum/mind(key)
+ M.assigned_role = "Cortical Borer"
+ M.special_role = "Cortical Borer"
+ return M
- if(stat != CONSCIOUS)
- return
+/mob/living/simple_animal/borer/proc/GrantBorerActions()
+ infest_host_action.Grant(src)
+ toggle_hide_action.Grant(src)
+ freeze_victim_action.Grant(src)
- if(layer != TURF_LAYER+0.2)
- layer = TURF_LAYER+0.2
- to_chat(src, "\green You are now hiding.")
- else
- layer = MOB_LAYER
- to_chat(src, "\green You have stopped hiding.")
+/mob/living/simple_animal/borer/proc/RemoveBorerActions()
+ infest_host_action.Remove(src)
+ toggle_hide_action.Remove(src)
+ freeze_victim_action.Remove(src)
-/mob/living/simple_animal/borer/say(var/message)
- var/datum/language/dialect = parse_language(message)
- if(!dialect)
- dialect = get_default_language()
- if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host)
- to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications. ")
- return
- ..()
+/mob/living/simple_animal/borer/proc/GrantInfestActions()
+ talk_to_host_action.Grant(src)
+ leave_body_action.Grant(src)
+ take_control_action.Grant(src)
+ make_chems_action.Grant(src)
+
+/mob/living/simple_animal/borer/proc/RemoveInfestActions()
+ talk_to_host_action.Remove(src)
+ take_control_action.Remove(src)
+ leave_body_action.Remove(src)
+ make_chems_action.Remove(src)
+
+/mob/living/simple_animal/borer/proc/GrantControlActions()
+ talk_to_brain_action.Grant(host)
+ give_back_control_action.Grant(host)
+ make_larvae_action.Grant(host)
+ torment_action.Grant(host)
+
+/mob/living/simple_animal/borer/proc/RemoveControlActions()
+ talk_to_brain_action.Remove(host)
+ make_larvae_action.Remove(host)
+ give_back_control_action.Remove(host)
+ torment_action.Remove(host)
+
+/datum/action/innate/borer
+ background_icon_state = "bg_alien"
+
+/datum/action/innate/borer/talk_to_host
+ name = "Converse with Host"
+ desc = "Send a silent message to your host."
+ button_icon_state = "alien_whisper"
+
+/datum/action/innate/borer/talk_to_host/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.Communicate()
+
+/datum/action/innate/borer/infest_host
+ name = "Infest"
+ desc = "Infest a suitable humanoid host."
+ button_icon_state = "infest"
+
+/datum/action/innate/borer/infest_host/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.infest()
+
+/datum/action/innate/borer/toggle_hide
+ name = "Toggle Hide"
+ desc = "Become invisible to the common eye. Toggled on or off."
+ button_icon_state = "borer_hiding_false"
+
+/datum/action/innate/borer/toggle_hide/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.hide_borer()
+ button_icon_state = "borer_hiding_[B.hiding ? "true" : "false"]"
+ UpdateButtonIcon()
+
+/datum/action/innate/borer/talk_to_borer
+ name = "Converse with Borer"
+ desc = "Communicate mentally with your borer."
+ button_icon_state = "alien_whisper"
+
+/datum/action/innate/borer/talk_to_borer/Activate()
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ B.host = owner
+ B.host.borer_comm()
+
+/datum/action/innate/borer/talk_to_brain
+ name = "Converse with Trapped Mind"
+ desc = "Communicate mentally with the trapped mind of your host."
+ button_icon_state = "alien_whisper"
+
+/datum/action/innate/borer/talk_to_brain/Activate()
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ B.host = owner
+ B.host.trapped_mind_comm()
+
+/datum/action/innate/borer/take_control
+ name = "Assume Control"
+ desc = "Fully connect to the brain of your host."
+ button_icon_state = "borer_brain"
+
+/datum/action/innate/borer/take_control/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.bond_brain()
+
+/datum/action/innate/borer/give_back_control
+ name = "Release Control"
+ desc = "Release control of your host's body."
+ button_icon_state = "borer_leave"
+
+/datum/action/innate/borer/give_back_control/Activate()
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ B.host = owner
+ B.host.release_control()
+
+/datum/action/innate/borer/leave_body
+ name = "Release Host"
+ desc = "Slither out of your host."
+ button_icon_state = "borer_leave"
+
+/datum/action/innate/borer/leave_body/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.release_host()
+
+/datum/action/innate/borer/make_chems
+ name = "Secrete Chemicals"
+ desc = "Push some chemicals into your host's bloodstream."
+ icon_icon = 'icons/obj/chemical.dmi'
+ button_icon_state = "minidispenser"
+
+/datum/action/innate/borer/make_chems/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.secrete_chemicals()
+
+/datum/action/innate/borer/make_larvae
+ name = "Reproduce"
+ desc = "Spawn several young."
+ button_icon_state = "borer_reproduce"
+
+/datum/action/innate/borer/make_larvae/Activate()
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ B.host = owner
+ B.host.spawn_larvae()
+
+/datum/action/innate/borer/freeze_victim
+ name = "Dominate Victim"
+ desc = "Freeze the limbs of a potential host with supernatural fear."
+ button_icon_state = "genetic_cryo"
+
+/datum/action/innate/borer/freeze_victim/Activate()
+ var/mob/living/simple_animal/borer/B = owner
+ B.dominate_victim()
+
+/datum/action/innate/borer/torment
+ name = "Torment Host"
+ desc = "Punish your host with agony."
+ button_icon_state = "blind"
+
+/datum/action/innate/borer/torment/Activate()
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ B.host = owner
+ B.host.punish_host()
diff --git a/code/game/gamemodes/miniantags/borer/borer_chemicals.dm b/code/game/gamemodes/miniantags/borer/borer_chemicals.dm
new file mode 100644
index 00000000000..4176ca15e73
--- /dev/null
+++ b/code/game/gamemodes/miniantags/borer/borer_chemicals.dm
@@ -0,0 +1,51 @@
+/datum/borer_chem
+ var/chemname
+ var/chemdesc = "This is a chemical"
+ var/chemuse = 30
+ var/quantity = 10
+
+/datum/borer_chem/capulettium_plus
+ chemname = "capulettium_plus"
+ chemdesc = "Silences and masks pulse."
+
+/datum/borer_chem/charcoal
+ chemname = "charcoal"
+ chemdesc = "Slowly heals toxin damage, also slowly removes other chemicals."
+
+/datum/borer_chem/epinephrine
+ chemname = "epinephrine"
+ chemdesc = "Stabilizes critical condition and slowly heals suffocation damage."
+
+/datum/borer_chem/fliptonium
+ chemname = "fliptonium"
+ chemdesc = "Causes uncontrollable flipping."
+ chemuse = 50
+
+/datum/borer_chem/hydrocodone
+ chemname = "hydrocodone"
+ chemdesc = "An extremely strong painkiller."
+
+/datum/borer_chem/mannitol
+ chemname = "mannitol"
+ chemdesc = "Heals brain damage."
+
+/datum/borer_chem/methamphetamine
+ chemname = "methamphetamine"
+ chemdesc = "Reduces stun times and increases stamina. Deals small amounts of brain damage."
+ chemuse = 50
+
+/datum/borer_chem/mitocholide
+ chemname = "mitocholide"
+ chemdesc = "Heals internal organ damage."
+
+/datum/borer_chem/salbutamol
+ chemname = "salbutamol"
+ chemdesc = "Heals suffocation damage."
+
+/datum/borer_chem/salglu_solution
+ chemname = "salglu_solution"
+ chemdesc = "Slowly heals brute and burn damage, also slowly restores blood."
+
+/datum/borer_chem/spaceacillin
+ chemname = "spaceacillin"
+ chemdesc = "Slows progression of diseases and fights infections."
diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm
index b0df1749403..f925a59d9fc 100644
--- a/code/game/gamemodes/miniantags/borer/borer_event.dm
+++ b/code/game/gamemodes/miniantags/borer/borer_event.dm
@@ -4,11 +4,11 @@
announceWhen = 400
var/spawncount = 5
- var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
+ var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned.
/datum/event/borer_infestation/setup()
announceWhen = rand(announceWhen, announceWhen + 50)
- spawncount = rand(1, 3)
+ spawncount = rand(2, 3)
/datum/event/borer_infestation/announce()
if(successSpawn)
@@ -22,14 +22,8 @@
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
- spawn(0)
- var/list/candidates = pollCandidates("Do you want to play as a cortical borer?", ROLE_BORER, 1)
- while(spawncount > 0 && vents.len && candidates.len)
- var/obj/vent = pick_n_take(vents)
- var/mob/C = pick_n_take(candidates)
-
- var/mob/living/simple_animal/borer/new_borer = new(vent.loc)
- new_borer.key = C.key
-
- spawncount--
- successSpawn = 1
+ while(spawncount >= 1 && vents.len)
+ var/obj/vent = pick_n_take(vents)
+ new /mob/living/simple_animal/borer(vent.loc)
+ successSpawn = TRUE
+ spawncount--
diff --git a/code/game/gamemodes/miniantags/borer/borer_html.dm b/code/game/gamemodes/miniantags/borer/borer_html.dm
new file mode 100644
index 00000000000..415438884e9
--- /dev/null
+++ b/code/game/gamemodes/miniantags/borer/borer_html.dm
@@ -0,0 +1,69 @@
+/mob/living/simple_animal/borer/proc/get_html_template(content)
+ var/html = {"
+
+
+ Borer Chemicals
+
+
+
+
+
+
+
+ [content]
+
"}
+ return html
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 56bb4dd14c5..c6ea23c4bbc 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -6,7 +6,7 @@
icon_state = "swarmer_unactivated"
/obj/item/unactivated_swarmer/New()
- notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter) ", source = src, attack_not_jump = 1)
+ notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter) ", source = src, action = NOTIFY_ATTACK)
..()
/obj/item/unactivated_swarmer/Topic(href, href_list)
@@ -63,7 +63,7 @@
mob_size = MOB_SIZE_TINY
ventcrawler = 2
ranged = 1
- ranged_cooldown_cap = 1
+ ranged_cooldown_time = 20
universal_speak = 0
universal_understand = 0
projectilesound = 'sound/weapons/taser2.ogg'
@@ -269,7 +269,7 @@
resources++
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
- var/obj/effect/swarmer/integrate/I = new /obj/effect/swarmer/integrate(get_turf(target))
+ var/obj/structure/swarmer/integrate/I = new /obj/structure/swarmer/integrate(get_turf(target))
I.pixel_x = target.pixel_x
I.pixel_y = target.pixel_y
if(istype(target, /obj/item/stack))
@@ -283,7 +283,7 @@
return
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target)
- new /obj/effect/swarmer/disintegration(get_turf(target))
+ new /obj/structure/swarmer/disintegration(get_turf(target))
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
target.ex_act(3)
@@ -317,12 +317,12 @@
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)
do_attack_animation(target)
to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted. ")
- var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target))
+ var/obj/structure/swarmer/dismantle/D = new /obj/structure/swarmer/dismantle(get_turf(target))
D.pixel_x = target.pixel_x
D.pixel_y = target.pixel_y
if(do_mob(src, target, 100))
if(!src.Adjacent(target))
- to_chat(src, "Error:Dismantleing aborted. ")
+ to_chat(src, "Error:Dismantling aborted. ")
else
to_chat(src, "Dismantling complete. ")
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)
@@ -330,7 +330,7 @@
if(target.component_parts && target.component_parts.len)
for(var/obj/item/I in target.component_parts)
I.forceMove(M.loc)
- var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target))
+ var/obj/structure/swarmer/disintegration/N = new /obj/structure/swarmer/disintegration(get_turf(target))
N.pixel_x = target.pixel_x
N.pixel_y = target.pixel_y
target.dropContents()
@@ -342,74 +342,72 @@
-/obj/effect/swarmer //Default swarmer effect object visual feedback
+/obj/structure/swarmer //Default swarmer effect object visual feedback
name = "swarmer ui"
desc = null
gender = NEUTER
icon = 'icons/mob/swarmer.dmi'
icon_state = "ui_light"
- mouse_opacity = 0
- layer = 4
+ layer = MOB_LAYER
+ anchored = 1
unacidable = 1
-
-/obj/effect/swarmer/disintegration
- icon_state = "disintegrate"
-
-/obj/effect/swarmer/disintegration/New()
- playsound(src.loc, "sparks", 100, 1)
- spawn(10)
- qdel(src)
-
-/obj/effect/swarmer/dismantle
- icon_state = "dismantle"
-
-/obj/effect/swarmer/dismantle/New()
- spawn(25)
- qdel(src)
-
-/obj/effect/swarmer/integrate
- icon_state = "integrate"
-
-/obj/effect/swarmer/integrate/New()
- spawn(5)
- qdel(src)
-
-/obj/effect/swarmer/destructible //Default destroyable object for swarmer constructions
light_range = 1
mouse_opacity = 1
var/health = 30
-/obj/effect/swarmer/destructible/proc/TakeDamage(damage)
+/obj/structure/swarmer/disintegration
+ icon_state = "disintegrate"
+
+/obj/structure/swarmer/disintegration/New()
+ playsound(src.loc, "sparks", 100, 1)
+ spawn(10)
+ qdel(src)
+
+/obj/structure/swarmer/dismantle
+ icon_state = "dismantle"
+
+/obj/structure/swarmer/dismantle/New()
+ spawn(25)
+ qdel(src)
+
+/obj/structure/swarmer/integrate
+ icon_state = "integrate"
+
+/obj/structure/swarmer/integrate/New()
+ spawn(5)
+ qdel(src)
+
+/obj/structure/swarmer/proc/TakeDamage(damage)
health -= damage
if(health <= 0)
qdel(src)
-/obj/effect/swarmer/destructible/bullet_act(obj/item/projectile/Proj)
+/obj/structure/swarmer/bullet_act(obj/item/projectile/Proj)
if(Proj.damage)
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
TakeDamage(Proj.damage)
..()
-/obj/effect/swarmer/destructible/attackby(obj/item/weapon/I, mob/living/user, params)
+/obj/structure/swarmer/attackby(obj/item/weapon/I, mob/living/user, params)
if(istype(I, /obj/item/weapon))
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
TakeDamage(I.force)
return
-/obj/effect/swarmer/destructible/ex_act()
+/obj/structure/swarmer/ex_act()
qdel(src)
return
-/obj/effect/swarmer/destructible/blob_act()
+/obj/structure/swarmer/blob_act()
qdel(src)
return
-/obj/effect/swarmer/destructible/emp_act()
+/obj/structure/swarmer/emp_act()
qdel(src)
return
-/obj/effect/swarmer/destructible/attack_animal(mob/living/user)
+/obj/structure/swarmer/attack_animal(mob/living/user)
if(isanimal(user))
var/mob/living/simple_animal/S = user
S.do_attack_animation(src)
@@ -418,24 +416,14 @@
TakeDamage(rand(S.melee_damage_lower, S.melee_damage_upper))
return
-/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
- set name = "Create trap"
- set category = "Swarmer"
- set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
- if(/obj/effect/swarmer/destructible/trap in loc)
- to_chat(src, "There is already a trap here. Aborting. ")
- return
- Fabricate(/obj/effect/swarmer/destructible/trap, 5)
- return
-
-/obj/effect/swarmer/destructible/trap
+/obj/structure/swarmer/trap
name = "swarmer trap"
desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough."
icon_state = "trap"
light_range = 1
health = 10
-/obj/effect/swarmer/destructible/trap/Crossed(var/atom/movable/AM)
+/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM)
if(isliving(AM))
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
@@ -446,21 +434,29 @@
qdel(src)
..()
+/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
+ set name = "Create trap"
+ set category = "Swarmer"
+ set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources."
+ if(locate(/obj/structure/swarmer/trap) in loc)
+ to_chat(src, "There is already a trap here. Aborting. ")
+ return
+ Fabricate(/obj/structure/swarmer/trap, 5)
+
/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()
set name = "Create barricade"
set category = "Swarmer"
set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through."
- if(/obj/effect/swarmer/destructible/blockade in loc)
+ if(locate(/obj/structure/swarmer/blockade) in loc)
to_chat(src, "There is already a blockade here. Aborting. ")
return
if(resources < 5)
to_chat(src, "We do not have the resources for this! ")
return
if(do_mob(src, src, 10))
- Fabricate(/obj/effect/swarmer/destructible/blockade, 5)
- return
+ Fabricate(/obj/structure/swarmer/blockade, 5)
-/obj/effect/swarmer/destructible/blockade
+/obj/structure/swarmer/blockade
name = "swarmer blockade"
desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
icon_state = "barricade"
@@ -469,7 +465,7 @@
density = 1
anchored = 1
-/obj/effect/swarmer/destructible/blockade/CanPass(atom/movable/O)
+/obj/structure/swarmer/blockade/CanPass(atom/movable/O)
if(isswarmer(O))
return 1
if(istype(O, /obj/item/projectile/beam/disabler))
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
index d93bc601f89..7a16ef17857 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
@@ -1,26 +1,14 @@
/datum/event/spawn_swarmer
- //name = "Sawrmer Spawn"
- //one_shot = 1
startWhen = 3 //30 minutes
announceWhen = 10
-
/datum/event/spawn_swarmer/announce()
if(prob(25)) //25% chance to announce it to the crew
var/swarmer_report = "[command_name()] High-Priority Update "
swarmer_report += " Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \
through."
- for(var/obj/machinery/computer/communications/C in machines)
- if(! (C.stat & (BROKEN|NOPOWER) ) )
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
- P.name = "'Classified [command_name()] Update'"
- P.info = swarmer_report
- P.update_icon()
- C.messagetitle.Add("Classified [command_name()] Update")
- C.messagetext.Add(P.info)
- command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
-
-
+ print_command_report(swarmer_report, "Classified [command_name()] Update")
+ event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
/datum/event/spawn_swarmer/start()
if(find_swarmer())
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index b3319c34ecb..39acdabacc5 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -496,7 +496,7 @@
melee_damage_upper = 10
damage_transfer = 0.9
projectiletype = /obj/item/projectile/guardian
- ranged_cooldown_cap = 1
+ ranged_cooldown_time = 10
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
rapid = 1
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index 9bf6be0bbdc..be21008d5f2 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -164,7 +164,7 @@
else if(istype(target,/obj/item)) // Eat items just to be annoying
var/obj/item/I = target
if(!I.anchored)
- if(do_after(src,20, target = I))
+ if(do_after(src, 20, target = I))
eat(I)
return
target.attack_animal(src)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 6a75c3e9d01..ca9e7b7ac28 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -17,8 +17,8 @@
invisibility = INVISIBILITY_REVENANT
health = INFINITY //Revenants don't use health, they use essence instead
maxHealth = INFINITY
- see_invisible = INVISIBILITY_REVENANT
see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
universal_understand = 1
response_help = "passes through"
response_disarm = "swings at"
@@ -29,13 +29,13 @@
harm_intent_damage = 0
friendly = "touches"
status_flags = 0
- see_in_dark = 8
wander = 0
density = 0
flying = 1
anchored = 1
mob_size = MOB_SIZE_TINY
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
var/essence = 75 //The resource of revenants. Max health is equal to three times this amount
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
@@ -317,7 +317,7 @@
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
icon = 'icons/effects/effects.dmi'
icon_state = "revenantEctoplasm"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/reforming = 1
var/essence = 75 //the maximum essence of the reforming revenant
var/inert = 0
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 0f9173c31ea..3504ada2a94 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -110,7 +110,8 @@
message = "You toggle your night vision. "
action_icon_state = "r_nightvision"
action_background_icon_state = "bg_revenant"
-
+ non_night_vision = INVISIBILITY_REVENANT
+ night_vision = SEE_INVISIBLE_OBSERVER_NOLIGHTING
//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob
/obj/effect/proc_holder/spell/targeted/revenant_transmit
@@ -127,12 +128,12 @@
/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
for(var/mob/living/M in targets)
spawn(0)
- var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
+ var/msg = stripped_input(user, "What do you wish to tell [M]?", null, "")
if(!msg)
charge_counter = charge_max
return
log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]")
- to_chat(usr, "You transmit to [M]: [msg] ")
+ to_chat(user, "You transmit to [M]: [msg] ")
to_chat(M, "An alien voice resonates from all around... [msg] ")
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 2750341e982..62c3a9a00b0 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -104,9 +104,7 @@
speed = 0
boost = world.time + 60
-
-
-
+// Cult slaughter demon
/mob/living/simple_animal/slaughter/cult //Summoned as part of the cult objective "Bring the Slaughter"
name = "harbringer of the slaughter"
real_name = "harbringer of the Slaughter"
@@ -154,17 +152,18 @@
/mob/living/simple_animal/slaughter/cult/New()
..()
spawn(5)
- var/list/demon_candidates = get_candidates(ROLE_CULTIST)
+ var/list/demon_candidates = pollCandidates("Do you want to play as a slaughter demon?", ROLE_DEMON, 1, 100)
if(!demon_candidates.len)
visible_message("[src] disappears in a flash of red light! ")
qdel(src)
return 0
- var/client/C = pick(demon_candidates)
+ var/mob/M = pick(demon_candidates)
var/mob/living/simple_animal/slaughter/cult/S = src
- if(!C)
+ if(!M || !M.client)
visible_message("[src] disappears in a flash of red light! ")
qdel(src)
return 0
+ var/client/C = M.client
S.key = C.key
S.mind.assigned_role = "Harbringer of the Slaughter"
@@ -181,7 +180,7 @@
////////////////////The Powers
-//Paradise Port:I added this cuase..SPOOPY DEMON IN YOUR BRAIN
+//Paradise Port: I added this because..SPOOPY DEMON IN YOUR BRAIN
/datum/action/innate/demon/whisper
@@ -193,10 +192,9 @@
return ..()
/datum/action/innate/demon/whisper/proc/choose_targets(mob/user = usr)//yes i am copying from telepathy..hush...
- var/list/targets = new /list()
- var/list/validtargets = new /list()
- for(var/mob/M in view(user.client.view, user))
- if(M && M.mind)
+ var/list/validtargets = list()
+ for(var/mob/living/M in view(user.client.view, get_turf(user)))
+ if(M && M.mind && M.stat != DEAD)
if(M == user)
continue
@@ -206,15 +204,12 @@
to_chat(usr, "There are no valid targets! ")
return
- targets += input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
-
- if(!targets.len || !targets[1])
- return
+ var/mob/living/target = input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
+ return target
/datum/action/innate/demon/whisper/Activate()
- var/list/choice = choose_targets()
-
- if(!choice.len)
+ var/mob/living/choice = choose_targets()
+ if(!choice)
return
var/msg = stripped_input(usr, "What do you wish to tell [choice]?", null, "")
diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm
index 74038879fd7..15f5493543e 100644
--- a/code/game/gamemodes/nations/nations.dm
+++ b/code/game/gamemodes/nations/nations.dm
@@ -23,7 +23,7 @@ datum/game_mode/nations
return ..()
/datum/game_mode/nations/proc/send_intercept()
- command_announcement.Announce("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \
+ event_announcement.Announce("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \
affecting trillions of investors, the Nanotrasen Corporation has decided to liquidate all \
assets of the Centcom Division in order to pay the massive legal fees that will be incurred \
during the following centuries long court process. Therefore, all current employment contracts \
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index e10bab49d78..6c28b9ade28 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -64,7 +64,7 @@ proc/issyndicate(mob/living/M as mob)
operative_mind.special_role = null
for(var/datum/objective/nuclear/O in operative_mind.objectives)
operative_mind.objectives -= O
- operative_mind.current.attack_log += "\[[time_stamp()]\] No longer nuclear operative "
+ operative_mind.current.create_attack_log("No longer nuclear operative ")
if(issilicon(operative_mind.current))
to_chat(operative_mind.current, "You have been turned into a robot! You are no longer a Syndicate operative. ")
else
@@ -145,11 +145,10 @@ proc/issyndicate(mob/living/M as mob)
var/mob/living/carbon/human/M = synd_mind.current
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
- M.mutations = list()
- M.disabilities = 0
- M.overeatduration = 0
M.set_species("Human",1)
M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics
+ M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ops.
+ M.overeatduration = 0
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
@@ -223,7 +222,7 @@ proc/issyndicate(mob/living/M as mob)
/datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1)
if(you_are)
- to_chat(syndicate.current, "\blue You are a [syndicate_name()] agent!")
+ to_chat(syndicate.current, "You are a [syndicate_name()] agent! ")
var/obj_count = 1
for(var/datum/objective/objective in syndicate.objectives)
to_chat(syndicate.current, "Objective #[obj_count] : [objective.explanation_text]")
@@ -246,9 +245,7 @@ proc/issyndicate(mob/living/M as mob)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(synd_mob), slot_shoes)
synd_mob.equip_or_collect(new /obj/item/clothing/gloves/combat(synd_mob), slot_gloves)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
- if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
- if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
- if(synd_mob.backbag == 4) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(synd_mob), slot_back)
+ synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/pill/initropidril(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(synd_mob), slot_belt)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(synd_mob.back), slot_in_backpack)
@@ -300,7 +297,7 @@ proc/issyndicate(mob/living/M as mob)
/datum/game_mode/nuclear/declare_completion()
var/disk_rescued = 1
- for(var/obj/item/weapon/disk/nuclear/D in world)
+ for(var/obj/item/weapon/disk/nuclear/D in poi_list)
if(!D.onCentcom())
disk_rescued = 0
break
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index 790c6a18e34..5ce318bf273 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -1,5 +1,5 @@
#define CHALLENGE_TIME_LIMIT 6000
-#define MIN_CHALLENGE_PLAYERS 50
+#define CHALLENGE_MIN_PLAYERS 50
#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
/obj/item/device/nuclear_challenge
@@ -9,33 +9,42 @@
desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
Must be used within five minutes, or your benefactors will lose interest."
- var/declaring_war = 0
-
-
+ var/declaring_war = FALSE
/obj/item/device/nuclear_challenge/attack_self(mob/living/user)
- if(declaring_war)
- return
- if(player_list.len < MIN_CHALLENGE_PLAYERS)
- to_chat(user, "The enemy crew is too small to be worth declaring war on.")
- return
- if(!is_admin_level(user.z))
- to_chat(user, "You have to be at your base to use this.")
+ if(!check_allowed(user))
return
- if(world.time > CHALLENGE_TIME_LIMIT)
- to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
+ declaring_war = TRUE
+ var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No")
+ declaring_war = FALSE
+
+ if(!check_allowed(user))
return
- declaring_war = 1
- var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No")
if(are_you_sure == "No")
to_chat(user, "On second thought, the element of surprise isn't so bad after all.")
- declaring_war = 0
return
var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
- command_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
+
+ declaring_war = TRUE
+ var/custom_threat = alert(user, "Do you want to customize your declaration?", "Customize?", "Yes", "No")
+ declaring_war = FALSE
+
+ if(!check_allowed(user))
+ return
+
+ if(custom_threat == "Yes")
+ declaring_war = TRUE
+ war_declaration = stripped_input(user, "Insert your custom declaration", "Declaration")
+ declaring_war = FALSE
+
+ if(!check_allowed(user) || !war_declaration)
+ return
+
+ event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
+
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
@@ -47,7 +56,25 @@
config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY
qdel(src)
+/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
+ if(declaring_war)
+ to_chat(user, "You are already in the process of declaring war! Make your mind up.")
+ return FALSE
+ if(player_list.len < CHALLENGE_MIN_PLAYERS)
+ to_chat(user, "The enemy crew is too small to be worth declaring war on.")
+ return FALSE
+ if(!is_admin_level(user.z))
+ to_chat(user, "You have to be at your base to use this.")
+ return FALSE
+ if(world.time > CHALLENGE_TIME_LIMIT)
+ to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
+ return FALSE
+ for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
+ if(S.moved)
+ to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.")
+ return FALSE
+ return TRUE
#undef CHALLENGE_TIME_LIMIT
-#undef MIN_CHALLENGE_PLAYERS
+#undef CHALLENGE_MIN_PLAYERS
#undef CHALLENGE_SHUTTLE_DELAY
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 060dd76cc66..7a85467667e 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -32,10 +32,11 @@ var/bomb_set
r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn.
wires = new/datum/wires/nuclearbomb(src)
previous_level = get_security_level()
+ poi_list |= src
/obj/machinery/nuclearbomb/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
+ poi_list.Remove(src)
return ..()
/obj/machinery/nuclearbomb/process()
@@ -56,12 +57,12 @@ var/bomb_set
panel_open = 1
overlays += image(icon, "npanel_open")
to_chat(user, "You unscrew the control panel of [src].")
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
else
panel_open = 0
overlays -= image(icon, "npanel_open")
to_chat(user, "You screw the control panel of [src] back on.")
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
else
if(panel_open == 0)
to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.")
@@ -69,7 +70,7 @@ var/bomb_set
panel_open = 0
overlays -= image(icon, "npanel_open")
to_chat(user, "You screw the control panel of [src] back on.")
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
flick("nuclearbombc", src)
return
@@ -91,7 +92,7 @@ var/bomb_set
var/obj/item/weapon/weldingtool/WT = O
if(!WT.isOn()) return
if(WT.get_fuel() < 5) // uses up 5 fuel.
- to_chat(user, "\red You need more fuel to complete this task.")
+ to_chat(user, "You need more fuel to complete this task. ")
return
user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...")
@@ -118,7 +119,7 @@ var/bomb_set
var/obj/item/weapon/weldingtool/WT = O
if(!WT.isOn()) return
if(WT.get_fuel() < 5) // uses up 5 fuel.
- to_chat(user, "\red You need more fuel to complete this task.")
+ to_chat(user, "You need more fuel to complete this task. ")
return
user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...")
@@ -165,9 +166,9 @@ var/bomb_set
else if(deployable)
if(removal_stage < 5)
anchored = 1
- visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring!")
+ visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring! ")
else
- visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.")
+ visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut. ")
if(!lighthack)
flick("nuclearbombc", src)
icon_state = "nuclearbomb1"
@@ -181,7 +182,7 @@ var/bomb_set
ui.open()
ui.set_auto_update(1)
-/obj/machinery/nuclearbomb/ui_data(mob/user, datum/topic_state/state)
+/obj/machinery/nuclearbomb/ui_data(mob/user, datum/topic_state/state)
var/data[0]
data["is_syndicate"] = is_syndicate
data["hacking"] = 0
@@ -219,10 +220,10 @@ var/bomb_set
return
if(deployable)
- to_chat(usr, "\red You close several panels to make [src] undeployable.")
+ to_chat(usr, "You close several panels to make [src] undeployable. ")
deployable = 0
else
- to_chat(usr, "\red You adjust some panels to make [src] deployable.")
+ to_chat(usr, "You adjust some panels to make [src] deployable. ")
deployable = 1
return
@@ -281,7 +282,7 @@ var/bomb_set
nanomanager.update_uis(src)
return
if(safety)
- to_chat(usr, "\red The safety is still on.")
+ to_chat(usr, "The safety is still on. ")
nanomanager.update_uis(src)
return
timing = !(timing)
@@ -311,16 +312,16 @@ var/bomb_set
if(href_list["anchor"])
if(removal_stage == 5)
anchored = 0
- visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.")
+ visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut. ")
nanomanager.update_uis(src)
return
if(!isinspace())
anchored = !(anchored)
if(anchored)
- visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring.")
+ visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring. ")
else
- visible_message("\red The anchoring bolts slide back into the depths of [src].")
+ visible_message("The anchoring bolts slide back into the depths of [src]. ")
else
to_chat(usr, "There is nothing to anchor to! ")
@@ -336,6 +337,11 @@ var/bomb_set
return ..()
return
+/obj/machinery/nuclearbomb/tesla_act(power, explosive)
+ ..()
+ if(explosive)
+ qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
+
#define NUKERANGE 80
/obj/machinery/nuclearbomb/proc/explode()
if(safety)
@@ -392,14 +398,12 @@ var/bomb_set
/obj/item/weapon/disk/nuclear
name = "nuclear authentication disk"
desc = "Better keep this safe."
- icon = 'icons/obj/items.dmi'
icon_state = "nucleardisk"
- item_state = "card-id"
- w_class = 1
/obj/item/weapon/disk/nuclear/New()
..()
processing_objects.Add(src)
+ poi_list |= src
/obj/item/weapon/disk/nuclear/process()
var/turf/disk_loc = get_turf(src)
@@ -415,10 +419,12 @@ var/bomb_set
if(force)
message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP ":"nonexistent location"]).")
log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).")
+ poi_list.Remove(src)
processing_objects.Remove(src)
return ..()
if(blobstart.len > 0)
+ poi_list.Remove(src)
var/obj/item/weapon/disk/nuclear/NEWDISK = new(pick(blobstart))
transfer_fingerprints_to(NEWDISK)
message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP ). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP ).")
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index f118bf548f0..4ed35c5b707 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -4,7 +4,7 @@
icon_state = "pinoff"
flags = CONDUCT
slot_flags = SLOT_PDA | SLOT_BELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
throw_speed = 4
throw_range = 20
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 1ec91da1130..e34174f2beb 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -177,8 +177,8 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
/datum/objective/hijack
martyr_compatible = 0 //Technically you won't get both anyway.
- explanation_text = "Hijack the shuttle by escaping on it with no loyalist NanoTrasen crew on board and alive. \
- Syndicate agents, other enemies of NanoTrasen, cyborgs, and pets may be allowed to escape alive."
+ explanation_text = "Hijack the shuttle by escaping on it with no loyalist Nanotrasen crew on board and alive. \
+ Syndicate agents, other enemies of Nanotrasen, cyborgs, and pets may be allowed to escape alive."
/datum/objective/hijack/check_completion()
if(!owner.current || owner.current.stat)
@@ -192,22 +192,10 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
if(shuttle_master.emergency.areaInstance != A)
return 0
- for(var/mob/living/player in player_list)
- if(player.mind && player.mind != owner)
- if(player.stat != DEAD)
- if(issilicon(player)) //Borgs are technically dead anyways
- continue
- if(isanimal(player)) //Poly does not own the shuttle
- continue
- if(player.mind.special_role && !(player.mind.special_role == SPECIAL_ROLE_ERT)) //Is antag, and not ERT
- continue
-
- if(get_area(player) == A)
- return 0
- return 1
+ return shuttle_master.emergency.is_hijacked()
/datum/objective/hijackclone
- explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape."
+ explanation_text = "Hijack the shuttle by ensuring only you (or your copies) escape."
martyr_compatible = 0
/datum/objective/hijackclone/check_completion()
@@ -396,8 +384,17 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
return steal_target
/datum/objective/steal/check_completion()
- if(!steal_target) return 1 // Free Objective
- return steal_target.check_completion(owner)
+ if(!steal_target)
+ return 1 // Free Objective
+
+ var/list/all_items = owner.current.GetAllContents()
+
+ for(var/obj/I in all_items)
+ if(istype(I, steal_target.typepath))
+ return steal_target.check_special_completion(I)
+ if(I.type in steal_target.altitems)
+ return steal_target.check_special_completion(I)
+
/datum/objective/steal/exchange
martyr_compatible = 0
@@ -501,7 +498,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
/datum/objective/blood/proc/gen_amount_goal(low = 150, high = 400)
target_amount = rand(low,high)
target_amount = round(round(target_amount/5)*5)
- explanation_text = "Accumulate atleast [target_amount] units of blood in total."
+ explanation_text = "Accumulate at least [target_amount] total units of blood."
return target_amount
/datum/objective/blood/check_completion()
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 461fe0e4ca7..556b7f50e5b 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -234,7 +234,7 @@
if(rev_mind.assigned_role in command_positions)
return 0
var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted
- if(isloyal(H))
+ if(ismindshielded(H))
return 0
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
return 0
@@ -245,11 +245,11 @@
carbon_mob.flash_eyes(1, 1)
rev_mind.current.Stun(5)
to_chat(rev_mind.current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution! ")
- rev_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the revolution! "
+ rev_mind.current.create_attack_log("Has been converted to the revolution! ")
rev_mind.special_role = SPECIAL_ROLE_REV
update_rev_icons_added(rev_mind)
- if(jobban_isbanned(rev_mind.current, ROLE_REV))
- replace_jobbaned_player(rev_mind.current, ROLE_REV)
+ if(jobban_isbanned(rev_mind.current, ROLE_REV) || jobban_isbanned(rev_mind.current, ROLE_SYNDICATE))
+ replace_jobbanned_player(rev_mind.current, ROLE_REV)
return 1
//////////////////////////////////////////////////////////////////////////////
//Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph.
@@ -263,7 +263,7 @@
if((rev_mind in revolutionaries) || remove_head)
revolutionaries -= rev_mind
rev_mind.special_role = null
- rev_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the revolution! "
+ rev_mind.current.create_attack_log("Has renounced the revolution! ")
if(beingborged)
to_chat(rev_mind.current, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing[remove_head ? "." : " but the name of the one who flashed you."] ")
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index bd391550b62..a39692e2ffa 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -29,13 +29,6 @@
if(I.stat == DEAD && is_station_level(I.z))
score_deadcrew++
- if(I && I.mind)
- if(I.mind.assigned_role == "Clown")
- for(var/thing in I.attack_log)
- if(findtext(thing, "")) //This has to be the hackiest fucking way _ever_ to see attacks.
- score_clownabuse++
-
-
if(shuttle_master.emergency.mode >= SHUTTLE_ENDGAME)
for(var/mob/living/player in mob_list)
if(player.client)
@@ -165,8 +158,8 @@
// has an account?
if(A)
. += A.money
- for(var/obj/item/weapon/spacecash/cash in C.contents)
- . += cash.get_total()
+ for(var/obj/item/stack/spacecash/cash in C.contents)
+ . += cash.amount
for(var/obj/item/weapon/storage/S in C.contents)
. += .(S, level + 1)
diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm
index c177e85f870..c785c511304 100644
--- a/code/game/gamemodes/setupgame.dm
+++ b/code/game/gamemodes/setupgame.dm
@@ -35,6 +35,7 @@
// Standard muts
BLINDBLOCK = getAssignedBlock("BLIND", numsToAssign)
+ COLOURBLINDBLOCK = getAssignedBlock("COLOURBLIND", numsToAssign)
DEAFBLOCK = getAssignedBlock("DEAF", numsToAssign)
HULKBLOCK = getAssignedBlock("HULK", numsToAssign, DNA_HARD_BOUNDS, good=1)
TELEBLOCK = getAssignedBlock("TELE", numsToAssign, DNA_HARD_BOUNDS, good=1)
diff --git a/code/game/gamemodes/shadowling/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm
index b57a75d9bf2..a957c16c50e 100644
--- a/code/game/gamemodes/shadowling/ascendant_shadowling.dm
+++ b/code/game/gamemodes/shadowling/ascendant_shadowling.dm
@@ -32,6 +32,12 @@
faction = list("faithless")
+/mob/living/simple_animal/ascendant_shadowling/New()
+ ..()
+ if(prob(35))
+ icon_state = "NurnKal"
+ icon_living = "NurnKal"
+
/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(var/movement_dir = 0)
return 1 //copypasta from carp code
@@ -39,4 +45,12 @@
return //You think an ascendant can be hurt by bombs? HA
/mob/living/simple_animal/ascendant_shadowling/singularity_act()
- return 0 //Well hi, fellow god! How are you today?
\ No newline at end of file
+ return 0 //Well hi, fellow god! How are you today?
+
+/mob/living/simple_animal/ascendant_shadowling/proc/announce(var/text, var/size = 4, var/new_sound = null)
+ var/message = "\"[text]\" "
+ for(var/mob/M in player_list)
+ if(!isnewplayer(M) && M.client)
+ to_chat(M, message)
+ if(new_sound)
+ M << new_sound
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 8e8957d55af..97f609ca9ff 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -97,6 +97,10 @@ Made by Xhuis
shadow.special_role = SPECIAL_ROLE_SHADOWLING
shadow.restricted_roles = restricted_jobs
shadowlings--
+
+ var/thrall_scaling = round(num_players() / 3)
+ required_thralls = Clamp(thrall_scaling, 15, 25)
+
..()
return 1
@@ -148,9 +152,8 @@ Made by Xhuis
shadowling_thralls += new_thrall_mind
new_thrall_mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL
update_shadow_icons_added(new_thrall_mind)
- new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall "
+ new_thrall_mind.current.create_attack_log("Became a thrall ")
new_thrall_mind.current.add_language("Shadowling Hivemind")
- new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare(null))
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk(null))
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall(null))
to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been. ")
@@ -159,8 +162,8 @@ Made by Xhuis
to_chat(new_thrall_mind.current, "Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask. ")
to_chat(new_thrall_mind.current, "Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab. ")
to_chat(new_thrall_mind.current, "You may communicate with your allies by speaking in the Shadowling Hivemind (:8). ")
- if(jobban_isbanned(new_thrall_mind.current, ROLE_SHADOWLING))
- replace_jobbaned_player(new_thrall_mind.current, ROLE_SHADOWLING)
+ if(jobban_isbanned(new_thrall_mind.current, ROLE_SHADOWLING) || jobban_isbanned(new_thrall_mind.current, ROLE_SYNDICATE))
+ replace_jobbanned_player(new_thrall_mind.current, ROLE_SHADOWLING)
return 1
@@ -168,7 +171,7 @@ Made by Xhuis
if(!istype(thrall_mind) || !(thrall_mind in shadowling_thralls) || !isliving(thrall_mind.current))
return 0 //If there is no mind, the mind isn't a thrall, or the mind's mob isn't alive, return
shadowling_thralls.Remove(thrall_mind)
- thrall_mind.current.attack_log += "\[[time_stamp()]\] Dethralled "
+ thrall_mind.current.create_attack_log("Dethralled ")
thrall_mind.special_role = null
update_shadow_icons_removed(thrall_mind)
for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list)
@@ -213,7 +216,7 @@ Made by Xhuis
if(!istype(ling_mind) || !(ling_mind in shadows)) return 0
update_shadow_icons_removed(ling_mind)
shadows.Remove(ling_mind)
- ling_mind.current.attack_log += "\[[time_stamp()]\] Deshadowlinged "
+ ling_mind.current.create_attack_log("Deshadowlinged ")
ling_mind.special_role = null
for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list)
ling_mind.RemoveSpell(S)
@@ -304,9 +307,11 @@ Made by Xhuis
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE | NOGUNS //Can't use guns due to muzzle flash
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
+ oxy_mod = 0
hot_env_multiplier = 1.5
silent_steps = 1
+ grant_vision_toggle = 0
/datum/species/shadow/ling/handle_life(var/mob/living/carbon/human/H)
if(!H.weakeyes)
@@ -317,11 +322,13 @@ Made by Xhuis
var/turf/T = H.loc
light_amount = T.get_lumcount() * 10
if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes
+ H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN)
if(H.stat != DEAD)
to_chat(H, "The light burns you! ")//Message spam to say "GET THE FUCK OUT"
H << 'sound/weapons/sear.ogg'
else if(light_amount < LIGHT_HEAL_THRESHOLD)
+ H.clear_alert("lightexposure")
H.heal_overall_damage(5, 5)
H.adjustToxLoss(-5)
H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!"
@@ -341,6 +348,7 @@ Made by Xhuis
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE
burn_mod = 1.1
+ oxy_mod = 0
hot_env_multiplier = 1.1
/datum/species/shadow/ling/lesser/handle_life(var/mob/living/carbon/human/H)
@@ -352,8 +360,10 @@ Made by Xhuis
var/turf/T = H.loc
light_amount = T.get_lumcount() * 10
if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move)
+ H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2)
else if(light_amount < LIGHT_HEAL_THRESHOLD)
+ H.clear_alert("lightexposure")
H.heal_overall_damage(2,2)
H.adjustToxLoss(-5)
H.adjustBrainLoss(-25)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index b9525ee282e..55d1a2f8db7 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -21,67 +21,33 @@
clothes_req = 0
action_icon_state = "glare"
-/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/human/target in targets)
if(!ishuman(target))
- to_chat(usr, "You may only glare at humans! ")
+ to_chat(user, "You may only glare at humans! ")
charge_counter = charge_max
return
- if(!shadowling_check(usr))
+ if(!shadowling_check(user))
charge_counter = charge_max
return
if(target.stat)
- to_chat(usr, "[target] must be conscious! ")
+ to_chat(user, "[target] must be conscious! ")
charge_counter = charge_max
return
if(is_shadow_or_thrall(target))
- to_chat(usr, "You don't see why you would want to paralyze an ally. ")
+ to_chat(user, "You don't see why you would want to paralyze an ally. ")
charge_counter = charge_max
return
var/mob/living/carbon/human/M = target
- usr.visible_message("[usr]'s eyes flash a blinding red! ")
+ user.visible_message("[user]'s eyes flash a blinding red! ")
target.visible_message("[target] freezes in place, their eyes glazing over... ")
- if(in_range(target, usr))
- to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty... ")
+ if(in_range(target, user))
+ to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by their heavenly beauty... ")
else //Only alludes to the shadowling if the target is close by
to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights... ")
target.Stun(10)
M.AdjustSilence(10)
-
-/obj/effect/proc_holder/spell/targeted/lesser_glare
- name = "Lesser Glare"
- desc = "Stuns and mutes a target for a short duration."
- panel = "Thrall Abilities"
- charge_max = 450
- clothes_req = 0
- action_icon_state = "glare"
-
-/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets)
- for(var/mob/living/carbon/human/target in targets)
- if(!ishuman(target) || !target)
- to_chat(usr, "You nay only glare at humans! ")
- charge_counter = charge_max
- return
- if(target.stat)
- to_chat(usr, "[target] must be conscious! ")
- charge_counter = charge_max
- return
- if(is_shadow_or_thrall(target))
- to_chat(usr, "You cannot glare at allies! ")
- charge_counter = charge_max
- return
- var/mob/living/carbon/human/M = target
- usr.visible_message("[usr]'s eyes flash a blinding red! ")
- target.visible_message("[target] freezes in place, their eyes glazing over... ")
- if(in_range(target, usr))
- to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights... ")
- else
- to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty... ")
- target.Stun(3) //Roughly 30% as long as the normal one
- M.AdjustSilence(3)
-
-
/obj/effect/proc_holder/spell/aoe_turf/veil
name = "Veil"
desc = "Extinguishes most nearby light sources."
@@ -106,8 +72,8 @@
var/datum/data/pda/utility/flashlight/FL = P.find_program(/datum/data/pda/utility/flashlight)
if(FL && FL.fon)
FL.start()
- else if(istype(I, /obj/item/clothing/head/helmet/space/rig))
- var/obj/item/clothing/head/helmet/space/rig/R = I
+ else if(istype(I, /obj/item/clothing/head/helmet/space/hardsuit))
+ var/obj/item/clothing/head/helmet/space/hardsuit/R = I
if(R.on)
R.toggle_light()
R.visible_message("[R]'s light fades and turns off. ")
@@ -118,8 +84,8 @@
P.visible_message("[P]'s light fades and turns off. ")
else if(istype(I, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = I
- if(G.F)
- var/obj/item/device/flashlight/F = G.F
+ if(G.gun_light)
+ var/obj/item/device/flashlight/F = G.gun_light
if(F.on)
G.toggle_gunlight()
G.visible_message("[G]'s light fades and turns off. ")
@@ -133,17 +99,23 @@
hhat.visible_message("[hhat]'s light fades and turns off. ")
return I.light_range
-/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(var/mob/living/H)
- for(var/obj/item/F in H)
+/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(mob/living/L)
+ for(var/obj/item/F in L)
if(F.light_range > 0)
extinguishItem(F)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/obj/item/organ/internal/lantern/O = H.get_int_organ(/obj/item/organ/internal/lantern)
+ if(O && O.glowing)
+ O.toggle_biolum(1)
+ H.visible_message("[H] is engulfed in shadows and fades into the darkness. ", "A sense of dread washes over you as you suddenly dim dark. ")
-/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
- to_chat(usr, "You silently disable all nearby lights. ")
- for(var/obj/effect/glowshroom/G in orange(2, usr)) //Why the fuck was this in the loop below?
+ to_chat(user, "You silently disable all nearby lights. ")
+ for(var/obj/structure/glowshroom/G in orange(2, user)) //Why the fuck was this in the loop below?
G.visible_message("\The [G] withers away! ")
qdel(G)
for(var/turf/T in targets)
@@ -175,30 +147,30 @@
include_user = 1
action_icon_state = "shadow_walk"
-/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
- for(var/mob/living/user in targets)
+ for(var/mob/living/target in targets)
playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1)
- user.visible_message("[user] vanishes in a puff of black mist! ", "You enter the space between worlds as a passageway. ")
- user.SetStunned(0)
- user.SetWeakened(0)
- user.incorporeal_move = 1
- user.alpha = 0
- user.ExtinguishMob()
- var/turf/T = get_turf(user)
- user.forceMove(T) //to properly move the mob out of a potential container
- if(user.buckled)
- user.buckled.unbuckle_mob()
- if(user.pulledby)
- user.pulledby.stop_pulling()
- user.stop_pulling()
+ target.visible_message("[target] vanishes in a puff of black mist! ", "You enter the space between worlds as a passageway. ")
+ target.SetStunned(0)
+ target.SetWeakened(0)
+ target.incorporeal_move = 1
+ target.alpha = 0
+ target.ExtinguishMob()
+ var/turf/T = get_turf(target)
+ target.forceMove(T) //to properly move the mob out of a potential container
+ if(target.buckled)
+ target.buckled.unbuckle_mob()
+ if(target.pulledby)
+ target.pulledby.stop_pulling()
+ target.stop_pulling()
sleep(40) //4 seconds
- user.visible_message("[user] suddenly manifests! ", "The pressure becomes too much and you vacate the interdimensional darkness. ")
- user.incorporeal_move = 0
- user.alpha = 255
- user.forceMove(user.loc)
+ target.visible_message("[target] suddenly manifests! ", "The pressure becomes too much and you vacate the interdimensional darkness. ")
+ target.incorporeal_move = 0
+ target.alpha = 255
+ target.forceMove(user.loc)
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk
name = "Guise"
@@ -210,13 +182,13 @@
include_user = 1
action_icon_state = "shadow_walk"
-/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets)
- for(var/mob/living/user in targets)
- user.visible_message("[user] suddenly fades away! ", "You veil yourself in darkness, making you harder to see. ")
- user.alpha = 10
+/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets, mob/user = usr)
+ for(var/mob/living/target in targets)
+ target.visible_message("[target] suddenly fades away! ", "You veil yourself in darkness, making you harder to see. ")
+ target.alpha = 10
sleep(40)
- user.visible_message("[user] appears from nowhere! ", "Your shadowy guise slips away. ")
- user.alpha = initial(user.alpha)
+ target.visible_message("[target] appears from nowhere! ", "Your shadowy guise slips away. ")
+ target.alpha = initial(target.alpha)
/obj/effect/proc_holder/spell/targeted/shadow_vision
@@ -230,11 +202,11 @@
var/datum/vision_override/vision_path = /datum/vision_override/nightvision
action_icon_state = "darksight"
-/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets)
- for(var/mob/living/user in targets)
- if(!istype(user) || !ishuman(user))
+/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets, mob/user = usr)
+ for(var/mob/living/target in targets)
+ if(!istype(target) || !ishuman(target))
return
- var/mob/living/carbon/human/H = user
+ var/mob/living/carbon/human/H = target
if(!H.vision_type)
to_chat(H, "You shift the nerves in your eyes, allowing you to see in the dark. ")
H.vision_type = new vision_path
@@ -256,17 +228,17 @@
clothes_req = 0
action_icon_state = "icy_veins"
-/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
- to_chat(usr, "You freeze the nearby air. ")
- playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1)
+ to_chat(user, "You freeze the nearby air. ")
+ playsound(user.loc, 'sound/effects/ghost2.ogg', 50, 1)
for(var/turf/T in targets)
for(var/mob/living/carbon/M in T.contents)
if(is_shadow_or_thrall(M))
- if(M == usr) //No message for the user, of course
+ if(M == user) //No message for the user, of course
continue
else
to_chat(M, "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected! ")
@@ -290,80 +262,80 @@
var/enthralling = 0
action_icon_state = "enthrall"
-/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets)
- var/mob/living/carbon/human/user = usr
+/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr)
+ var/mob/living/carbon/human/ling = user
listclearnulls(ticker.mode.shadowling_thralls)
- if(!(user.mind in ticker.mode.shadows))
+ if(!(ling.mind in ticker.mode.shadows))
return
- if(user.get_species() != "Shadowling")
+ if(ling.get_species() != "Shadowling")
if(ticker.mode.shadowling_thralls.len >= 5)
charge_counter = charge_max
return
for(var/mob/living/carbon/human/target in targets)
- if(!in_range(usr, target))
- to_chat(usr, "You need to be closer to enthrall [target]. ")
+ if(!in_range(user, target))
+ to_chat(user, "You need to be closer to enthrall [target]. ")
charge_counter = charge_max
return
if(!target.key || !target.mind)
- to_chat(usr, "The target has no mind. ")
+ to_chat(user, "The target has no mind. ")
charge_counter = charge_max
return
if(target.stat)
- to_chat(usr, "The target must be conscious. ")
+ to_chat(user, "The target must be conscious. ")
charge_counter = charge_max
return
if(is_shadow_or_thrall(target))
- to_chat(usr, "You can not enthrall allies. ")
+ to_chat(user, "You can not enthrall allies. ")
charge_counter = charge_max
return
if(!ishuman(target))
- to_chat(usr, "You can only enthrall humans. ")
+ to_chat(user, "You can only enthrall humans. ")
charge_counter = charge_max
return
if(enthralling)
- to_chat(usr, "You are already enthralling! ")
+ to_chat(user, "You are already enthralling! ")
charge_counter = charge_max
return
if(!target.client)
- to_chat(usr, "[target]'s mind is vacant of activity. ")
+ to_chat(user, "[target]'s mind is vacant of activity. ")
enthralling = 1
- to_chat(usr, "This target is valid. You begin the enthralling. ")
- to_chat(target, "[usr] stares at you. You feel your head begin to pulse. ")
+ to_chat(user, "This target is valid. You begin the enthralling. ")
+ to_chat(target, "[user] stares at you. You feel your head begin to pulse. ")
for(var/progress = 0, progress <= 3, progress++)
switch(progress)
if(1)
- to_chat(usr, "You place your hands to [target]'s head... ")
- usr.visible_message("[usr] places their hands onto the sides of [target]'s head! ")
+ to_chat(user, "You place your hands to [target]'s head... ")
+ user.visible_message("[user] places their hands onto the sides of [target]'s head! ")
if(2)
- to_chat(usr, "You begin preparing [target]'s mind as a blank slate... ")
- usr.visible_message("[usr]'s palms flare a bright red against [target]'s temples! ")
+ to_chat(user, "You begin preparing [target]'s mind as a blank slate... ")
+ user.visible_message("[user]'s palms flare a bright red against [target]'s temples! ")
to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away. ")
target.Weaken(12)
sleep(20)
- if(isloyal(target))
- to_chat(usr, "They have a mindshield implant. You begin to deactivate it - this will take some time. ")
- usr.visible_message("[usr] pauses, then dips their head in concentration! ")
+ if(ismindshielded(target))
+ to_chat(user, "They have a mindshield implant. You begin to deactivate it - this will take some time. ")
+ user.visible_message("[user] pauses, then dips their head in concentration! ")
to_chat(target, "Your mindshield implant becomes hot as it comes under attack! ")
sleep(100) //10 seconds - not spawn() so the enthralling takes longer
- to_chat(usr, "The nanobots composing the mindshield implant have been rendered inert. Now to continue. ")
- usr.visible_message("[usr] relaxes again. ")
- for(var/obj/item/weapon/implant/loyalty/L in target)
+ to_chat(user, "The nanobots composing the mindshield implant have been rendered inert. Now to continue. ")
+ user.visible_message("[user] relaxes again. ")
+ for(var/obj/item/weapon/implant/mindshield/L in target)
if(L && L.implanted)
qdel(L)
to_chat(target, "Your mental protection implant unexpectedly falters, dims, dies. ")
if(3)
- to_chat(usr, "You begin planting the tumor that will control the new thrall... ")
- usr.visible_message("A strange energy passes from [usr]'s hands into [target]'s head! ")
+ to_chat(user, "You begin planting the tumor that will control the new thrall... ")
+ user.visible_message("A strange energy passes from [user]'s hands into [target]'s head! ")
to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind. ")
- if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant
- to_chat(usr, "The enthralling has been interrupted - your target's mind returns to its previous state. ")
- to_chat(target, "You wrest yourself away from [usr]'s hands and compose yourself ")
+ if(!do_mob(user, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant
+ to_chat(user, "The enthralling has been interrupted - your target's mind returns to its previous state. ")
+ to_chat(target, "You wrest yourself away from [user]'s hands and compose yourself ")
enthralling = 0
return
enthralling = 0
- to_chat(usr, "You have enthralled [target] ! ")
+ to_chat(user, "You have enthralled [target] ! ")
target.visible_message("[target] looks to have experienced a revelation! ", \
"False faces all dark not real not real not-- ")
target.setOxyLoss(0) //In case the shadowling was choking them out
@@ -380,18 +352,18 @@
clothes_req = 0
action_icon_state = "regen_armor"
-/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets)
- if(!is_shadow(usr))
- to_chat(usr, "You must be a shadowling to do this! ")
+/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets, mob/user = usr)
+ if(!is_shadow(user))
+ to_chat(user, "You must be a shadowling to do this! ")
charge_counter = charge_max
return
- for(var/mob/living/user in targets)
- if(!istype(user) || !ishuman(user))
+ for(var/mob/living/target in targets)
+ if(!istype(target) || !ishuman(target))
return
- var/mob/living/carbon/human/H = user
+ var/mob/living/carbon/human/H = target
H.visible_message("[H]'s skin suddenly bubbles and shifts around their body! ", \
"You regenerate your protective armor and cleanse your form of defects. ")
- H.adjustCloneLoss(user.getCloneLoss())
+ H.adjustCloneLoss(target.getCloneLoss())
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), slot_wear_suit)
@@ -415,54 +387,54 @@
var/reviveThrallAcquired
action_icon_state = "collective_mind"
-/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
- for(var/mob/living/user in targets)
+ for(var/mob/living/target in targets)
var/thralls = 0
- var/victory_threshold = 15
+ var/victory_threshold = ticker.mode.required_thralls
var/mob/M
- to_chat(user, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls. ")
+ to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls. ")
for(M in living_mob_list)
if(is_thrall(M))
thralls++
to_chat(M, "You feel hooks sink into your mind and pull. ")
- if(!do_after(user, 30, target = user))
- to_chat(user, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind. ")
+ if(!do_after(target, 30, target = target))
+ to_chat(target, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind. ")
return
if(thralls >= 3 && !screech_acquired)
screech_acquired = 1
- to_chat(user, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms. ")
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null))
+ to_chat(target, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms. ")
+ target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null))
if(thralls >= 5 && !blind_smoke_acquired)
blind_smoke_acquired = 1
- to_chat(user, "The power of your thralls has granted you the Blinding Smoke ability. \
+ to_chat(target, "The power of your thralls has granted you the Blinding Smoke ability. \
It will create a choking cloud that will blind any non-thralls who enter. ")
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null))
+ target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null))
if(thralls >= 7 && !drainLifeAcquired)
drainLifeAcquired = 1
- to_chat(user, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself. ")
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null))
+ to_chat(target, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself. ")
+ target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null))
if(thralls >= 9 && !reviveThrallAcquired)
reviveThrallAcquired = 1
- to_chat(user, "The power of your thralls has granted you the Black Recuperation ability. \
+ to_chat(target, "The power of your thralls has granted you the Black Recuperation ability. \
This will, after a short time, bring a dead thrall completely back to life with no bodily defects. ")
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null))
+ target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null))
if(thralls < victory_threshold)
- to_chat(user, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present. ")
+ to_chat(target, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present. ")
else if(thralls >= victory_threshold)
- to_chat(usr, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls. ")
- to_chat(usr, "You may find Ascendance in the Shadowling Evolution tab. ")
+ to_chat(target, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls. ")
+ to_chat(target, "You may find Ascendance in the Shadowling Evolution tab. ")
for(M in living_mob_list)
if(is_shadow(M))
var/obj/effect/proc_holder/spell/targeted/collective_mind/CM
@@ -471,10 +443,10 @@
qdel(CM)
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend(null))
- if(M == usr)
+ if(M == user)
to_chat(M, "You project this power to the rest of the shadowlings. ")
else
- to_chat(M, "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab) ")//Tells all the other shadowlings
+ to_chat(M, "[target.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab) ")//Tells all the other shadowlings
@@ -489,15 +461,15 @@
include_user = 1
action_icon_state = "black_smoke"
-/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets, mob/user = usr) //Extremely hacky
+ if(!shadowling_check(user))
charge_counter = charge_max
return
- for(var/mob/living/user in targets)
- user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly! ")
- to_chat(user, "You regurgitate a vast cloud of blinding smoke. ")
- playsound(user, 'sound/effects/bamf.ogg', 50, 1)
- var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc)
+ for(var/mob/living/target in targets)
+ target.visible_message("[target] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly! ")
+ to_chat(target, "You regurgitate a vast cloud of blinding smoke. ")
+ playsound(target, 'sound/effects/bamf.ogg', 50, 1)
+ var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(target.loc)
B.reagents.clear_reagents() //Just in case!
B.icon_state = null //Invisible
B.reagents.add_reagent("blindness_smoke", 10)
@@ -539,17 +511,17 @@
clothes_req = 0
action_icon_state = "screech"
-/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
- usr.audible_message("[usr] lets out a horrible scream! ")
- playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1)
+ user.audible_message("[user] lets out a horrible scream! ")
+ playsound(user.loc, 'sound/effects/screech.ogg', 100, 1)
for(var/turf/T in targets)
for(var/mob/target in T.contents)
if(is_shadow_or_thrall(target))
- if(target == usr) //No message for the user, of course
+ if(target == user) //No message for the user, of course
continue
else
continue
@@ -583,10 +555,11 @@
var/list/nearbyTargets
action_icon_state = "drain_life"
-/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, var/mob/living/carbon/human/U = usr)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
+ var/mob/living/carbon/human/U = usr
targetsDrained = 0
nearbyTargets = list()
for(var/turf/T in targets)
@@ -597,7 +570,7 @@
nearbyTargets.Add(M)
if(!targetsDrained)
charge_counter = charge_max
- to_chat(usr, "There were no nearby humans for you to drain. ")
+ to_chat(U, "There were no nearby humans for you to drain. ")
return
for(var/mob/living/carbon/M in nearbyTargets)
U.heal_organ_damage(10, 10)
@@ -608,8 +581,8 @@
U.AdjustStunned(-1)
M.adjustOxyLoss(20)
M.adjustStaminaLoss(20)
- to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]! ")
- to_chat(usr, "You draw life from those around you to heal your wounds. ")
+ to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [U]! ")
+ to_chat(U, "You draw life from those around you to heal your wounds. ")
@@ -623,24 +596,24 @@
include_user = 0
action_icon_state = "revive_thrall"
-/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
for(var/mob/living/carbon/human/thrallToRevive in targets)
- var/choice = alert(usr,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel")
+ var/choice = alert(user,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel")
switch(choice)
if("Empower")
if(!is_thrall(thrallToRevive))
- to_chat(usr, "[thrallToRevive] is not a thrall. ")
+ to_chat(user, "[thrallToRevive] is not a thrall. ")
charge_counter = charge_max
return
if(thrallToRevive.stat != CONSCIOUS)
- to_chat(usr, "[thrallToRevive] must be conscious to become empowered. ")
+ to_chat(user, "[thrallToRevive] must be conscious to become empowered. ")
charge_counter = charge_max
return
if(thrallToRevive.get_species() == "Lesser Shadowling")
- to_chat(usr, "[thrallToRevive] is already empowered. ")
+ to_chat(user, "[thrallToRevive] is already empowered. ")
charge_counter = charge_max
return
var/empowered_thralls = 0
@@ -651,54 +624,53 @@
if(H.get_species() == "Lesser Shadowling")
empowered_thralls++
if(empowered_thralls >= EMPOWERED_THRALL_LIMIT)
- to_chat(usr, "You cannot spare this much energy. There are too many empowered thralls. ")
+ to_chat(user, "You cannot spare this much energy. There are too many empowered thralls. ")
charge_counter = charge_max
return
- usr.visible_message("[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath. ", \
+ user.visible_message("[user] places their hands over [thrallToRevive]'s face, red light shining from beneath. ", \
"You place your hands on [thrallToRevive]'s face and begin gathering energy... ")
- to_chat(thrallToRevive, "[usr] places their hands over your face. You feel energy gathering. Stand still... ")
- if(!do_mob(usr, thrallToRevive, 80))
- to_chat(usr, "Your concentration snaps. The flow of energy ebbs. ")
+ to_chat(thrallToRevive, "[user] places their hands over your face. You feel energy gathering. Stand still... ")
+ if(!do_mob(user, thrallToRevive, 80))
+ to_chat(user, "Your concentration snaps. The flow of energy ebbs. ")
charge_counter = charge_max
return
- to_chat(usr, "You release a massive surge of power into [thrallToRevive]! ")
- usr.visible_message("Red lightning surges into [thrallToRevive]'s face! ")
+ to_chat(user, "You release a massive surge of power into [thrallToRevive]! ")
+ user.visible_message("Red lightning surges into [thrallToRevive]'s face! ")
playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
- usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
+ user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
thrallToRevive.Weaken(5)
thrallToRevive.visible_message("[thrallToRevive] collapses, their skin and face distorting! ", \
"AAAAAAAAAAAAAAAAAAAGH- ")
sleep(20)
thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human. ", \
"You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \
- darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms. ")
+ darkness but wither slowly in light. In addition, you now have glare and true shadow walk. ")
thrallToRevive.set_species("Lesser Shadowling")
- thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null))
if("Revive")
if(!is_thrall(thrallToRevive))
- to_chat(usr, "[thrallToRevive] is not a thrall. ")
+ to_chat(user, "[thrallToRevive] is not a thrall. ")
charge_counter = charge_max
return
if(thrallToRevive.stat != DEAD)
- to_chat(usr, "[thrallToRevive] is not dead. ")
+ to_chat(user, "[thrallToRevive] is not dead. ")
charge_counter = charge_max
return
- usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest. ", \
+ user.visible_message("[user] kneels over [thrallToRevive], placing their hands on \his chest. ", \
"You crouch over the body of your thrall and begin gathering energy... ")
thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive)
- if(!do_mob(usr, thrallToRevive, 30))
- to_chat(usr, "Your concentration snaps. The flow of energy ebbs. ")
+ if(!do_mob(user, thrallToRevive, 30))
+ to_chat(user, "Your concentration snaps. The flow of energy ebbs. ")
charge_counter = charge_max
return
- to_chat(usr, "You release a massive surge of power into [thrallToRevive]! ")
- usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest! ")
+ to_chat(user, "You release a massive surge of power into [thrallToRevive]! ")
+ user.visible_message("Red lightning surges from [user]'s hands into [thrallToRevive]'s chest! ")
playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
- usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
+ user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
sleep(10)
if(thrallToRevive.revive())
thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes. ", \
@@ -719,8 +691,8 @@
charge_max = 600
action_icon_state = "extend_shuttle"
-/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets)
- if(!shadowling_check(usr))
+/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/user = usr)
+ if(!shadowling_check(user))
charge_counter = charge_max
return
for(var/mob/living/carbon/human/target in targets)
@@ -728,23 +700,23 @@
charge_counter = charge_max
return
if(!is_thrall(target))
- to_chat(usr, "[target] must be a thrall. ")
+ to_chat(user, "[target] must be a thrall. ")
charge_counter = charge_max
return
if(shuttle_master.emergency.mode != SHUTTLE_CALL)
- to_chat(usr, "The shuttle must be inbound only to the station. ")
+ to_chat(user, "The shuttle must be inbound only to the station. ")
charge_counter = charge_max
return
var/mob/living/carbon/human/M = target
- usr.visible_message("[usr]'s eyes flash a bright red! ", \
+ user.visible_message("[user]'s eyes flash a bright red! ", \
"You begin to draw [M]'s life force. ")
M.visible_message("[M]'s face falls slack, their jaw slightly distending. ", \
"You are suddenly transported... far, far away... ")
- if(!do_after(usr, 50, target = M))
+ if(!do_after(user, 50, target = M))
to_chat(M, "You are snapped back to reality, your haze dissipating! ")
- to_chat(usr, "You have been interrupted. The draw has failed. ")
+ to_chat(user, "You have been interrupted. The draw has failed. ")
return
- to_chat(usr, "You project [M]'s life force toward the approaching shuttle, extending its arrival duration! ")
+ to_chat(user, "You project [M]'s life force toward the approaching shuttle, extending its arrival duration! ")
M.visible_message("[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing. ", \
"...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all... ")
M.death()
@@ -752,9 +724,10 @@
var/more_minutes = 9000
var/timer = shuttle_master.emergency.timeLeft()
timer += more_minutes
- command_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes..", "System Failure", 'sound/misc/notice1.ogg')
+ event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg')
shuttle_master.emergency.setTimer(timer)
- usr.mind.spell_list.Remove(src) //Can only be used once!
+ shuttle_master.emergency.canRecall = FALSE
+ user.mind.spell_list.Remove(src) //Can only be used once!
qdel(src)
// ASCENDANT ABILITIES BEYOND THIS POINT //
@@ -768,20 +741,20 @@
clothes_req = 0
action_icon_state = "annihilate"
-/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
+/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets, mob/user = usr)
+ var/mob/living/simple_animal/ascendant_shadowling/SHA = user
if(SHA.phasing)
- to_chat(usr, "You are not in the same plane of existence. Unphase first. ")
+ to_chat(user, "You are not in the same plane of existence. Unphase first. ")
charge_counter = charge_max
return
- playsound(usr.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1)
+ playsound(user.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1)
for(var/mob/living/boom in targets)
if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE.
- to_chat(usr, "Making an ally explode seems unwise.")
+ to_chat(user, "Making an ally explode seems unwise.")
charge_counter = charge_max
return
- usr.visible_message("[usr]'s markings flare as they gesture at [boom]! ", \
+ user.visible_message("[user]'s markings flare as they gesture at [boom]! ", \
"You direct a lance of telekinetic energy at [boom]. ")
sleep(4)
if(iscarbon(boom))
@@ -800,32 +773,32 @@
clothes_req = 0
action_icon_state = "enthrall"
-/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
+/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets, mob/user = usr)
+ var/mob/living/simple_animal/ascendant_shadowling/SHA = user
if(SHA.phasing)
charge_counter = charge_max
- to_chat(usr, "You are not in the same plane of existence. Unphase first. ")
+ to_chat(user, "You are not in the same plane of existence. Unphase first. ")
return
for(var/mob/living/carbon/human/target in targets)
if(is_shadow_or_thrall(target))
- to_chat(usr, "You cannot enthrall an ally.")
+ to_chat(user, "You cannot enthrall an ally.")
charge_counter = charge_max
return
if(!target.ckey || !target.mind)
- to_chat(usr, "The target has no mind. ")
+ to_chat(user, "The target has no mind. ")
charge_counter = charge_max
return
if(target.stat)
- to_chat(usr, "The target must be conscious. ")
+ to_chat(user, "The target must be conscious. ")
charge_counter = charge_max
return
if(!ishuman(target))
- to_chat(usr, "You can only enthrall humans. ")
+ to_chat(user, "You can only enthrall humans. ")
charge_counter = charge_max
return
- to_chat(usr, "You instantly rearrange [target] 's memories, hyptonitizing them into a thrall. ")
+ to_chat(user, "You instantly rearrange [target] 's memories, hyptonitizing them into a thrall. ")
to_chat(target, "An agonizing spike of pain drives into your mind, and-- ")
ticker.mode.add_thrall(target.mind)
target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL
@@ -843,8 +816,8 @@
clothes_req = 0
action_icon_state = "shadow_walk"
-/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
+/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets, mob/user = usr)
+ var/mob/living/simple_animal/ascendant_shadowling/SHA = user
for(SHA in targets)
SHA.phasing = !SHA.phasing
if(SHA.phasing)
@@ -869,16 +842,16 @@
clothes_req = 0
action_icon_state = "lightning_storm"
-/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
+/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets, mob/user = usr)
+ var/mob/living/simple_animal/ascendant_shadowling/SHA = user
if(SHA.phasing)
- to_chat(usr, "You are not in the same plane of existence. Unphase first. ")
+ to_chat(user, "You are not in the same plane of existence. Unphase first. ")
charge_counter = charge_max
return
- usr.visible_message("A massive ball of lightning appears in [usr]'s hands and flares out! ", \
+ user.visible_message("A massive ball of lightning appears in [user]'s hands and flares out! ", \
"You conjure a ball of lightning and release it. ")
- playsound(usr.loc, 'sound/magic/lightningbolt.ogg', 100, 1)
+ playsound(user.loc, 'sound/magic/lightningbolt.ogg', 100, 1)
for(var/turf/T in targets)
for(var/mob/living/carbon/human/target in T.contents)
if(is_shadow_or_thrall(target))
@@ -887,7 +860,7 @@
playsound(target, 'sound/magic/LightningShock.ogg', 50, 1)
target.Weaken(8)
target.take_organ_damage(0,50)
- usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
+ user.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit
name = "Ascendant Broadcast"
@@ -899,9 +872,9 @@
include_user = 1
action_icon_state = "transmit"
-/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets)
- for(var/mob/living/user in targets)
- var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
+/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets, mob/user = usr)
+ for(var/mob/living/simple_animal/ascendant_shadowling/target in targets)
+ var/text = stripped_input(target, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
if(!text)
return
- to_chat(world, "\"[text]\" ")
+ target.announce(text)
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 2fac272afd5..cfe4de51e4f 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -10,11 +10,11 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
include_user = 1
action_icon_state = "hatch"
-/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets)
- if(usr.stat || !ishuman(usr) || !usr || !is_shadow(usr || isinspace(usr)))
+/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets, mob/user = usr)
+ if(user.stat || !ishuman(user) || !user || !is_shadow(user || isinspace(user)))
return
- if(!isturf(usr.loc))
- to_chat(usr, "You can't hatch here! ")
+ if(!isturf(user.loc))
+ to_chat(user, "You can't hatch here! ")
return
for(var/mob/living/carbon/human/H in targets)
var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No")
@@ -28,13 +28,13 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.visible_message("[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them! ", \
"You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you. ")
- for(var/obj/item/I in H.contents - (H.organs | H.internal_organs)) //drops all items except organs
+ for(var/obj/item/I in H.contents - (H.bodyparts | H.internal_organs)) //drops all items except organs
H.unEquip(I)
sleep(50)
var/turf/simulated/floor/F
- var/turf/shadowturf = get_turf(usr)
- for(F in orange(1, usr))
+ var/turf/shadowturf = get_turf(user)
+ for(F in orange(1, user))
new /obj/structure/alien/resin/wall/shadowling(F)
for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky
qdel(R)
@@ -68,7 +68,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
var/newNameId = pick(possibleShadowlingNames)
possibleShadowlingNames.Remove(newNameId)
H.real_name = newNameId
- H.name = usr.real_name
+ H.name = user.real_name
H.SetStunned(0)
to_chat(H, "YOU LIVE!!! ")
@@ -83,13 +83,13 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.socks = "None"
H.faction |= "faithless"
- H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(usr), slot_glasses)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(user), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(user), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses)
H.set_species("Shadowling") //can't be a shadowling without being a shadowling
H.mind.RemoveSpell(src)
@@ -116,8 +116,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
include_user = 1
action_icon_state = "ascend"
-/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets)
- var/mob/living/carbon/human/H = usr
+/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets, mob/user = usr)
+ var/mob/living/carbon/human/H = user
if(!shadowling_check(H))
return
for(H in targets)
@@ -155,11 +155,10 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
for(var/mob/living/M in orange(7, H))
M.Weaken(10)
to_chat(M, "An immense pressure slams you onto the ground! ")
- to_chat(world, "\"VYSHA NERADA YEKHEZET U'RUU!!\" ")
- world << 'sound/hallucinations/veryfar_noise.ogg'
for(var/obj/machinery/power/apc/A in apcs)
A.overload_lighting()
- var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
+ var/mob/living/simple_animal/ascendant_shadowling/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
+ A.announce("VYSHA NERADA YEKHEZET U'RUU!!", 5, 'sound/hallucinations/veryfar_noise.ogg')
for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list)
if(S == src) continue
H.mind.RemoveSpell(S)
diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm
index fd3ad379fe0..92573fcc17e 100644
--- a/code/game/gamemodes/steal_items.dm
+++ b/code/game/gamemodes/steal_items.dm
@@ -6,10 +6,11 @@
#define THEFT_FLAG_UNIQUE 2
/datum/theft_objective
- var/name=""
+ var/name = ""
var/typepath=/atom
- var/list/protected_jobs=list()
- var/flags=0
+ var/list/protected_jobs = list()
+ var/list/altitems = list()
+ var/flags = 0
/datum/theft_objective/proc/check_completion(var/datum/mind/owner)
if(!owner.current)
@@ -70,6 +71,16 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
name = "the station blueprints"
typepath = /obj/item/areaeditor/blueprints
protected_jobs = list("Chief Engineer")
+ altitems = list(/obj/item/weapon/photo)
+
+/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
+ if(istype(I, /obj/item/areaeditor/blueprints))
+ return 1
+ if(istype(I, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = I
+ if(P.blueprints)
+ return 1
+ return 0
/datum/theft_objective/voidsuit
name = "a nasa voidsuit"
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 60a90b70638..e60b564f5d0 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -70,6 +70,9 @@
modePlayer += traitors
..()
+/datum/game_mode/traitor/setup_chumps()
+ //since we actually have potential collaborators, we don't prepare any chumps to avoid extra people knowing our codewords.
+ return
/datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor)
if(istype(traitor.current, /mob/living/silicon))
@@ -345,18 +348,26 @@
if(M && M != traitor_mob)
to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.")
traitor_mob.mind.store_memory("Potential Collaborator : [M.real_name]")
+ //let's also inform their contact that they might be called upon, but leave it vague.
+ inform_collab(M)
+
+/datum/game_mode/traitor/inform_collab(mob/living/carbon/human/M)
+ if(M.mind in traitors) //if you are already a traitor, you already know the codewords and your role, so skip this message.
+ return
+ ..(M)
+
/datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind)
if(traitor_mind in traitors)
ticker.mode.traitors -= traitor_mind
traitor_mind.special_role = null
- traitor_mind.current.attack_log += "\[[time_stamp()]\] De-traitored "
+ traitor_mind.current.create_attack_log("De-traitored ")
if(issilicon(traitor_mind.current))
to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a traitor. ")
else
to_chat(traitor_mind.current, "You have been brainwashed! You are no longer a traitor. ")
- ticker.mode.update_traitor_icons_removed(traitor_mind)
-
+ ticker.mode.update_traitor_icons_removed(traitor_mind)
+
/datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind)
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
tatorhud.join_hud(traitor_mind.current)
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index b9e07827474..f3dc8e4e41a 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -275,8 +275,8 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
var/blood = 0
var/old_bloodtotal = 0 //used to see if we increased our blood total
var/old_bloodusable = 0 //used to see if we increased our blood usable
- owner.attack_log += text("\[[time_stamp()]\] Bit [H] ([H.ckey]) in the neck and draining their blood ")
- H.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [owner] ([owner.ckey]) ")
+ owner.create_attack_log("Bit [H] ([H.ckey]) in the neck and draining their blood ")
+ H.create_attack_log("Has been bit in the neck by [owner] ([owner.ckey]) ")
log_attack("[owner] ([owner.ckey]) bit [H] ([H.ckey]) in the neck")
owner.visible_message("[owner] grabs [H]'s neck harshly and sinks in their fangs! ", "You sink your fangs into [H] and begin to drain their blood. ", "You hear a soft puncture and a wet sucking noise. ")
if(!iscarbon(owner))
@@ -335,7 +335,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(vampire_mind in vampires)
ticker.mode.vampires -= vampire_mind
vampire_mind.special_role = null
- vampire_mind.current.attack_log += "\[[time_stamp()]\] De-vampired "
+ vampire_mind.current.create_attack_log("De-vampired ")
if(vampire_mind.vampire)
vampire_mind.vampire.remove_vampire_powers()
qdel(vampire_mind.vampire)
@@ -416,12 +416,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
owner.alpha = 255
return
var/turf/simulated/T = get_turf(owner)
- var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
- var/light_available
- if(L)
- light_available = L.get_clamped_lum(0.5) * 10
- else
- light_available = 10
+ var/light_available = T.get_lumcount(0.5) * 10
if(!istype(T))
return 0
@@ -429,6 +424,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(!iscloaking)
owner.alpha = 255
return 0
+
if(light_available <= 2)
owner.alpha = round((255 * 0.15))
return 1
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 92a1a3dfa19..13f05048393 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -117,7 +117,7 @@
revert_cast(user)
return
- perform(list(T))
+ perform(list(T), user = user)
/obj/effect/proc_holder/spell/vampire/self/choose_targets(mob/user = usr)
perform(list(user))
@@ -131,7 +131,7 @@
revert_cast(user)
return
- perform(targets)
+ perform(targets, user = user)
/datum/vampire_passive
var/gain_desc
@@ -150,14 +150,14 @@
charge_max = 200
stat_allowed = 1
-/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast()
- var/mob/living/U = usr
+/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr)
+ var/mob/living/U = user
- usr.SetWeakened(0)
- usr.SetStunned(0)
- usr.SetParalysis(0)
+ user.SetWeakened(0)
+ user.SetStunned(0)
+ user.SetParalysis(0)
U.adjustStaminaLoss(-75)
- to_chat(usr, "You flush your system with clean blood and remove any incapacitating effects. ")
+ to_chat(user, "You flush your system with clean blood and remove any incapacitating effects. ")
spawn(1)
if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen))
for(var/i = 1 to 5)
@@ -173,15 +173,15 @@
action_icon_state = "vampire_hypnotise"
required_blood = 20
-/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets)
+/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
- usr.visible_message("[usr]'s eyes flash briefly as he stares into [target]'s eyes ")
- if(do_mob(usr, target, 50))
+ user.visible_message("[user]'s eyes flash briefly as he stares into [target]'s eyes ")
+ if(do_mob(user, target, 50))
if(!affects(target))
- to_chat(usr, "Your piercing gaze fails to knock out [target]. ")
- to_chat(target, "\blue [usr]'s feeble gaze is ineffective.")
+ to_chat(user, "Your piercing gaze fails to knock out [target]. ")
+ to_chat(target, "[user]'s feeble gaze is ineffective. ")
else
- to_chat(usr, "Your piercing gaze knocks out [target]. ")
+ to_chat(user, "Your piercing gaze knocks out [target]. ")
to_chat(target, "You find yourself unable to move and barely able to speak. ")
target.Weaken(10)
target.Stun(10)
@@ -197,12 +197,12 @@
action_icon_state = "vampire_disease"
required_blood = 100
-/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets)
+/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/target in targets)
- to_chat(usr, "You stealthily infect [target] with your diseased touch. ")
- target.help_shake_act(usr)
+ to_chat(user, "You stealthily infect [target] with your diseased touch. ")
+ target.help_shake_act(user)
if(!affects(target))
- to_chat(usr, "They seem to be unaffected. ")
+ to_chat(user, "They seem to be unaffected. ")
continue
var/datum/disease/D = new /datum/disease/vampire
target.ForceContractDisease(D)
@@ -214,10 +214,10 @@
charge_max = 300
stat_allowed = 1
-/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets)
- usr.visible_message("[usr]'s eyes emit a blinding flash! ")
- if(istype(usr:glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
- to_chat(usr, "You're blindfolded! ")
+/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets, mob/user = usr)
+ user.visible_message("[user]'s eyes emit a blinding flash! ")
+ if(istype(user:glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
+ to_chat(user, "You're blindfolded! ")
return
for(var/mob/living/target in targets)
if(!affects(target))
@@ -225,7 +225,7 @@
target.Stun(5)
target.Weaken(5)
target.stuttering = 20
- to_chat(target, "You are blinded by [usr]'s glare. ")
+ to_chat(target, "You are blinded by [user]'s glare. ")
/obj/effect/proc_holder/spell/vampire/self/shapeshift
name = "Shapeshift (50)"
@@ -234,12 +234,12 @@
action_icon_state = "genetic_poly"
required_blood = 50
-/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast()
- usr.visible_message("[usr] transforms! ")
- usr.client.prefs.real_name = usr.generate_name()
- usr.client.prefs.random_character()
- usr.client.prefs.copy_to(usr)
- usr.regenerate_icons()
+/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast(list/targets, mob/user = usr)
+ user.visible_message("[user] transforms! ")
+ user.client.prefs.real_name = user.generate_name()
+ user.client.prefs.random_character()
+ user.client.prefs.copy_to(user)
+ user.regenerate_icons()
/obj/effect/proc_holder/spell/vampire/self/screech
name = "Chiroptean Screech (30)"
@@ -248,10 +248,10 @@
action_icon_state = "vampire_screech"
required_blood = 30
-/obj/effect/proc_holder/spell/vampire/self/screech/cast()
- usr.visible_message("[usr] lets out an ear piercing shriek! ", "You let out a loud shriek. ", "You hear a loud painful shriek! ")
+/obj/effect/proc_holder/spell/vampire/self/screech/cast(list/targets, mob/user = usr)
+ user.visible_message("[user] lets out an ear piercing shriek! ", "You let out a loud shriek. ", "You hear a loud painful shriek! ")
for(var/mob/living/carbon/C in hearers(4))
- if(C == usr)
+ if(C == user)
continue
if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs))
continue
@@ -265,7 +265,7 @@
C.Jitter(150)
for(var/obj/structure/window/W in view(4))
W.destroy()
- playsound(usr.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
+ playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
/proc/isvampirethrall(mob/living/M as mob)
@@ -278,23 +278,23 @@
action_icon_state = "vampire_enthrall"
required_blood = 300
-/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets)
+/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
- usr.visible_message("[usr] bites [target]'s neck! ", "You bite [target]'s neck and begin the flow of power. ")
+ user.visible_message("[user] bites [target]'s neck! ", "You bite [target]'s neck and begin the flow of power. ")
to_chat(target, "You feel the tendrils of evil invade your mind. ")
if(!ishuman(target))
- to_chat(usr, "You can only enthrall humans. ")
+ to_chat(user, "You can only enthrall humans. ")
break
- if(do_mob(usr, target, 50))
- if(can_enthrall(usr, target))
- handle_enthrall(usr, target)
+ if(do_mob(user, target, 50))
+ if(can_enthrall(user, target))
+ handle_enthrall(user, target)
else
- revert_cast(usr)
- to_chat(usr, "You or your target either moved or you dont have enough usable blood. ")
+ revert_cast(user)
+ to_chat(user, "You or your target either moved or you dont have enough usable blood. ")
/obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C)
var/enthrall_safe = 0
- for(var/obj/item/weapon/implant/loyalty/L in C)
+ for(var/obj/item/weapon/implant/mindshield/L in C)
if(L && L.implanted)
enthrall_safe = 1
break
@@ -340,7 +340,7 @@
H.mind.special_role = SPECIAL_ROLE_VAMPIRE_THRALL
to_chat(H, "You have been Enthralled by [user]. Follow their every command. ")
to_chat(user, "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp. ")
- log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].")
+ add_logs(user, H, "vampire-thralled")
/obj/effect/proc_holder/spell/vampire/self/cloak
name = "Cloak of Darkness"
@@ -359,11 +359,11 @@
return
name = "[initial(name)] ([user.mind.vampire.iscloaking ? "Deactivate" : "Activate"])"
-/obj/effect/proc_holder/spell/vampire/self/cloak/cast()
- var/datum/vampire/V = usr.mind.vampire
+/obj/effect/proc_holder/spell/vampire/self/cloak/cast(list/targets, mob/user = usr)
+ var/datum/vampire/V = user.mind.vampire
V.iscloaking = !V.iscloaking
update_name()
- to_chat(usr, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness. ")
+ to_chat(user, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness. ")
/obj/effect/proc_holder/spell/vampire/bats
name = "Summon Bats (75)"
@@ -387,11 +387,11 @@
for(var/i = locs.len + 1 to num_bats)
locs += user.loc
- perform(locs)
+ perform(locs, user = user)
-/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets)
+/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets, mob/user = usr)
for(var/T in targets)
- new /mob/living/simple_animal/hostile/scarybat(T, usr)
+ new /mob/living/simple_animal/hostile/scarybat(T, user)
/obj/effect/proc_holder/spell/vampire/self/jaunt
name = "Mist Form (30)"
@@ -402,12 +402,12 @@
required_blood = 30
var/jaunt_duration = 50 //in deciseconds
-/obj/effect/proc_holder/spell/vampire/self/jaunt/cast()
- if(usr.buckled)
- usr.buckled.unbuckle_mob()
+/obj/effect/proc_holder/spell/vampire/self/jaunt/cast(list/targets, mob/user = usr)
+ if(user.buckled)
+ user.buckled.unbuckle_mob()
spawn(0)
- var/mob/living/U = usr
- var/originalloc = get_turf(usr.loc)
+ var/mob/living/U = user
+ var/originalloc = get_turf(user.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc)
var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc)
animation.name = "water"
@@ -418,34 +418,34 @@
animation.layer = 5
animation.master = holder
U.ExtinguishMob()
- if(usr.buckled)
- usr.buckled.unbuckle_mob()
+ if(user.buckled)
+ user.buckled.unbuckle_mob()
flick("liquify", animation)
- usr.forceMove(holder)
- usr.client.eye = holder
+ user.forceMove(holder)
+ user.client.eye = holder
var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread()
steam.set_up(10, 0, originalloc)
steam.start()
sleep(jaunt_duration)
- var/mobloc = get_turf(usr.loc)
+ var/mobloc = get_turf(user.loc)
if(get_area(mobloc) == /area/security/armoury/gamma)
- to_chat(usr, "A strange energy repels you!")
+ to_chat(user, "A strange energy repels you!")
mobloc = originalloc
animation.loc = mobloc
steam.location = mobloc
steam.start()
- usr.canmove = 0
+ user.canmove = 0
sleep(20)
flick("reappear",animation)
sleep(5)
- if(!usr.Move(mobloc))
+ if(!user.Move(mobloc))
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/T = get_step(mobloc, direction)
if(T)
- if(usr.Move(T))
+ if(user.Move(T))
break
- usr.canmove = 1
- usr.client.eye = usr
+ user.canmove = 1
+ user.client.eye = user
qdel(animation)
qdel(holder)
@@ -479,8 +479,7 @@
if(T.y > world.maxy-outer_tele_radius || T.y < outer_tele_radius)
continue
- var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
- var/lightingcount = L.get_clamped_lum(0.5) * 10
+ var/lightingcount = T.get_lumcount(0.5) * 10
// LIGHTING CHECK
if(lightingcount > max_lum)
@@ -489,32 +488,32 @@
if(!turfs.len)
revert_cast(user)
- to_chat(user, "\red You cannot find darkness to step to.")
+ to_chat(user, "You cannot find darkness to step to. ")
return
- perform(turfs)
+ perform(turfs, user = user)
-/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets)
+/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets, mob/user = usr)
if(usr.buckled)
- usr.buckled.unbuckle_mob()
+ user.buckled.unbuckle_mob()
spawn(0)
var/turf/picked = pick(targets)
if(!picked || !isturf(picked))
return
- var/mob/living/U = usr
+ var/mob/living/U = user
U.ExtinguishMob()
- if(usr.buckled)
- usr.buckled.unbuckle_mob()
- var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(usr))
- animation.name = usr.name
+ if(user.buckled)
+ user.buckled.unbuckle_mob()
+ var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(user))
+ animation.name = user.name
animation.density = 0
animation.anchored = 1
- animation.icon = usr.icon
+ animation.icon = user.icon
animation.alpha = 127
animation.layer = 5
//animation.master = src
- usr.forceMove(picked)
+ user.forceMove(picked)
spawn(10)
qdel(animation)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 44565a6d157..1dd20906704 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -7,7 +7,7 @@
icon_state ="scroll2"
throw_speed = 1
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/used = 0
@@ -60,7 +60,7 @@
switch(href_list["school"])
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
+ M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if("bluespace")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
@@ -119,7 +119,7 @@
item_state = "render"
force = 15
throwforce = 10
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
hitsound = 'sound/weapons/bladeslice.ogg'
var/charged = 1
var/spawn_type = /obj/singularity/narsie/wizard
@@ -232,7 +232,7 @@ var/global/list/multiverse = list()
throwforce = 10
sharp = 1
edge = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/faction = list("unassigned")
var/cooldown = 0
@@ -464,7 +464,7 @@ var/global/list/multiverse = list()
if("cyborg")
if(M.get_species() != "Machine")
- for(var/obj/item/organ/O in M.organs)
+ for(var/obj/item/organ/O in M.bodyparts)
O.robotize()
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(sword, slot_r_hand)
@@ -586,6 +586,11 @@ var/global/list/multiverse = list()
W.SetOwnerInfo(M)
M.equip_to_slot_or_del(W, slot_wear_id)
+ if(M.get_species() == "Vox")
+ M.species.after_equip_job(null, M) //Voxygen(tm)
+ if(M.get_species() == "Plasmaman")
+ M.species.after_equip_job(null, M) //No fireballs from other dimensions.
+
M.update_icons()
/obj/item/weapon/multisword/pure_evil
@@ -611,7 +616,7 @@ var/global/list/multiverse = list()
icon_state = "necrostone"
item_state = "electronic"
origin_tech = "bluespace=4;materials=4"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/list/spooky_scaries = list()
var/unlimited = 0
var/heresy = 0
@@ -748,7 +753,7 @@ var/global/list/multiverse = list()
icon_state = "nyacrostone"
item_state = "electronic"
origin_tech = "bluespace=4;materials=4"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
heresy = 1
unlimited = 1
@@ -786,21 +791,26 @@ var/global/list/multiverse = list()
GiveHint(target)
cooldown = world.time +cooldown_time
return
+
if(!link)
- if(I.loc == user && istype(I) && I.w_class <= 2)
+ if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
user.drop_item()
I.loc = src
link = I
to_chat(user, "You attach [I] to the doll.")
update_targets()
..()
+
/obj/item/voodoo/check_eye(mob/user as mob)
- return src.loc == user
+ if(loc != user)
+ user.reset_perspective(null)
+ user.unset_machine()
/obj/item/voodoo/attack_self(mob/user as mob)
if(!target && possible.len)
target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
return
+
if(user.zone_sel.selecting == "chest")
if(link)
target = null
@@ -809,6 +819,7 @@ var/global/list/multiverse = list()
link = null
update_targets()
return
+
if(target && cooldown < world.time)
switch(user.zone_sel.selecting)
if("mouth")
diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm
index 97770b47944..95d804179cd 100644
--- a/code/game/gamemodes/wizard/godhand.dm
+++ b/code/game/gamemodes/wizard/godhand.dm
@@ -8,7 +8,7 @@
icon_state = "syndballoon"
item_state = null
flags = ABSTRACT | NODROP
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
force = 0
throwforce = 0
throw_range = 0
@@ -32,11 +32,16 @@
attached_spell.attached_hand = null
qdel(src)
+/obj/item/weapon/melee/touch_attack/dropped()
+ if(attached_spell)
+ attached_spell.attached_hand = null
+ qdel(src)
+
/obj/item/weapon/melee/touch_attack/disintegrate
name = "disintegrating touch"
desc = "This hand of mine glows with an awesome power!"
catchphrase = "EI NATH!!"
- on_use_sound = "sound/magic/Disintegrate.ogg"
+ on_use_sound = 'sound/magic/Disintegrate.ogg'
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -54,7 +59,7 @@
name = "petrifying touch"
desc = "That's the bottom line, because flesh to stone said so!"
catchphrase = "STAUN EI!!"
- on_use_sound = "sound/magic/FleshToStone.ogg"
+ on_use_sound = 'sound/magic/FleshToStone.ogg'
icon_state = "fleshtostone"
item_state = "fleshtostone"
@@ -73,7 +78,7 @@
name = "toy plastic hand"
desc = "This hand of mine glows with an awesome power! Ok, maybe just batteries."
catchphrase = "EI NATH!!"
- on_use_sound = "sound/magic/Disintegrate.ogg"
+ on_use_sound = 'sound/magic/Disintegrate.ogg'
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -90,7 +95,7 @@
name = "cluwne touch"
desc = "It's time to start clowning around."
catchphrase = "NWOLC EGNEVER"
- on_use_sound = "sound/misc/sadtrombone.ogg"
+ on_use_sound = 'sound/misc/sadtrombone.ogg'
icon_state = "cluwnecurse"
item_state = "cluwnecurse"
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index 489e68acec7..c57b7d531c7 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -61,11 +61,11 @@
message_admins("[wizard.current] went into crit in the wizard lair, another wizard is likely camping")
end_squabble(get_area(wizard.current))
else
- to_chat(wizard.current, "\red The Space Wizard Federation is upset with your performance and have terminated your employment. ")
+ to_chat(wizard.current, "The Space Wizard Federation is upset with your performance and have terminated your employment. ")
wizard.current.gib() // *REAL* ACTION!! *REAL* DRAMA!! *REAL* BLOODSHED!!
continue
if(wizard.current.client && wizard.current.client.is_afk() > 10 * 60 * 10) // 10 minutes
- to_chat(wizard.current, "\red The Space Wizard Federation is upset with your performance and have terminated your employment. ")
+ to_chat(wizard.current, "The Space Wizard Federation is upset with your performance and have terminated your employment. ")
wizard.current.gib() // Let's keep the round moving
continue
if(!wizard.current.client)
@@ -181,5 +181,5 @@
/datum/game_mode/wizard/raginmages/declare_completion()
if(finished)
feedback_set_details("round_end_result","loss - wizard killed")
- to_chat(world, "\red The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget! ")
+ to_chat(world, " The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget! ")
..(1)
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 3899d10d23c..b33caa4ef73 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -1,7 +1,7 @@
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
- var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
+ var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic")
@@ -76,8 +76,8 @@
new /obj/item/weapon/gun/energy/decloner(get_turf(H))
if("mindflayer")
new /obj/item/weapon/gun/energy/mindflayer(get_turf(H))
- if("hyperkinetic")
- new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H))
+ if("kinetic")
+ new /obj/item/weapon/gun/energy/kinetic_accelerator(get_turf(H))
if("advplasmacutter")
new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H))
if("wormhole")
@@ -88,6 +88,8 @@
new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H))
if("medibeam")
new /obj/item/weapon/gun/medbeam(get_turf(H))
+
+ playsound(get_turf(H), 'sound/magic/Summon_guns.ogg', 50, 1)
else
switch(randomizemagic)
if("fireball")
@@ -127,8 +129,8 @@
if("staffdoor")
new /obj/item/weapon/gun/magic/staff/door(get_turf(H))
if("armor")
- new /obj/item/clothing/suit/space/rig/wizard(get_turf(H))
- new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(H))
+ new /obj/item/clothing/suit/space/hardsuit/wizard(get_turf(H))
+ new /obj/item/clothing/head/helmet/space/hardsuit/wizard(get_turf(H))
if("scrying")
new /obj/item/weapon/scrying(get_turf(H))
if(!(XRAY in H.mutations))
@@ -155,3 +157,5 @@
if("necromantic")
new /obj/item/device/necromantic_stone(get_turf(H))
to_chat(H, "You suddenly feel lucky. ")
+
+ playsound(get_turf(H), 'sound/magic/Summon_Magic.ogg', 50, 1)
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 29eae864fb8..cc3c1a131e9 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -4,88 +4,129 @@
icon_state = "soulstone"
item_state = "electronic"
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artifact's power."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
+ var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards?
+ var/reusable = TRUE // Can this soul stone be used more than once?
+ var/spent = FALSE // If the soul stone can only be used once, has it been used?
+
+/obj/item/device/soulstone/proc/can_use(mob/living/user)
+ if(iscultist(user) || iswizard(user) || usability)
+ return TRUE
+
+ return FALSE
+
+/obj/item/device/soulstone/proc/was_used()
+ if(!reusable)
+ spent = TRUE
+ name = "dull [name]"
+ desc = "A fragment of the legendary treasure known simply as \
+ the 'Soul Stone'. The shard lies still, dull and lifeless; \
+ whatever spark it once held long extinguished."
+
+/obj/item/device/soulstone/anybody
+ usability = TRUE
+
+/obj/item/device/soulstone/anybody/chaplain
+ name = "mysterious old shard"
+ reusable = FALSE
+
+/obj/item/device/soulstone/pickup(mob/living/user)
+ ..()
+ if(!can_use(user))
+ to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly. ")
+ user.Dizzy(120)
//////////////////////////////Capturing////////////////////////////////////////////////////////
-
- attack(mob/living/carbon/human/M as mob, mob/user as mob)
- if(!istype(M, /mob/living/carbon/human))//If target is not a human.
- return ..()
- if(istype(M, /mob/living/carbon/human/dummy))
- return ..()
-
- if(M.has_brain_worms()) //Borer stuff - RR
- to_chat(user, "This being is corrupted by an alien intelligence and cannot be soul trapped. ")
- return ..()
-
- if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
- to_chat(user, "A mysterious force prevents you from trapping this being's soul. ")
- return ..()
-
- M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [key_name(user)] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [key_name(M)] ")
-
- log_attack("[key_name(user)] used the [src.name] to capture the soul of [key_name(M)] ")
-
-
- transfer_soul("VICTIM", M, user)
+/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ if(!can_use(user))
+ user.Paralyse(5)
+ to_chat(user, "Your body is wracked with debilitating pain! ")
return
- /*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES
- if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade
- return ..()
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey]) ")
+ if(spent)
+ to_chat(user, "There is no power left in the shard. ")
+ return
+
+ if(!ishuman(M)) //If target is not a human
+ return ..()
+
+ if(M.has_brain_worms()) //Borer stuff - RR
+ to_chat(user, "This being is corrupted by an alien intelligence and cannot be soul trapped. ")
+ return ..()
+
+ if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
+ to_chat(user, "A mysterious force prevents you from trapping this being's soul. ")
+ return ..()
+
+ if(iscultist(user) && iscultist(M))
+ to_chat(user, "\"Come now, do not capture your fellow's soul.\ ")
+ return ..()
+
+ M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)] ")
+ user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)] ")
+
+ M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)] ")
+ user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)] ")
+ log_attack("[key_name(user)] used the [src.name] to capture the soul of [key_name(M)] ")
+
+ transfer_soul("VICTIM", M, user)
+ return
- transfer_soul("SHADE", M, user)
- return*/
///////////////////Options for using captured souls///////////////////////////////////////
-
- attack_self(mob/user)
- if(!in_range(src, user))
- return
- user.set_machine(src)
- var/dat = "Soul Stone "
- for(var/mob/living/simple_animal/shade/A in src)
- dat += "Captured Soul: [A.name] "
- dat += {"Summon Shade "}
- dat += " "
- dat += {" Close "}
- user << browse(dat, "window=aicard")
- onclose(user, "aicard")
+/obj/item/device/soulstone/attack_self(mob/user)
+ if(!in_range(src, user))
return
+ if(!can_use(user))
+ user.Paralyse(5)
+ to_chat(user, "Your body is wracked with debilitating pain! ")
+ return
+ user.set_machine(src)
+ var/dat = "Soul Stone "
+ for(var/mob/living/simple_animal/shade/A in src)
+ dat += "Captured Soul: [A.name] "
+ dat += {"Summon Shade "}
+ dat += " "
+ dat += {" Close "}
+ user << browse(dat, "window=aicard")
+ onclose(user, "aicard")
+ return
+/obj/item/device/soulstone/Topic(href, href_list)
+ var/mob/U = usr
+ if(!in_range(src, U) || U.machine != src || !can_use(usr))
+ U << browse(null, "window=aicard")
+ U.unset_machine()
+ return
- Topic(href, href_list)
- var/mob/U = usr
- if(!in_range(src, U)||U.machine!=src)
+ add_fingerprint(U)
+ U.set_machine(src)
+
+ switch(href_list["choice"])//Now we switch based on choice.
+ if("Close")
U << browse(null, "window=aicard")
U.unset_machine()
return
- add_fingerprint(U)
- U.set_machine(src)
-
- switch(href_list["choice"])//Now we switch based on choice.
- if("Close")
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
-
- if("Summon")
- for(var/mob/living/simple_animal/shade/A in src)
- A.status_flags &= ~GODMODE
- A.canmove = 1
- to_chat(A, "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs. ")
- A.loc = U.loc
- A.cancel_camera()
- src.icon_state = "soulstone"
- attack_self(U)
+ if("Summon")
+ for(var/mob/living/simple_animal/shade/A in src)
+ A.status_flags &= ~GODMODE
+ A.canmove = 1
+ A.forceMove(get_turf(usr))
+ A.cancel_camera()
+ icon_state = "soulstone"
+ name = initial(name)
+ if(iswizard(usr) || usability)
+ to_chat(A, "You have been released from your prison, but you are still bound to [usr.real_name]'s will. Help them succeed in their goals at all costs. ")
+ else if(iscultist(usr))
+ to_chat(A, "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs. ")
+ was_used()
+ attack_self(U)
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
/obj/structure/constructshell
@@ -94,14 +135,29 @@
icon_state = "construct"
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
+/obj/structure/constructshell/examine(mob/user)
+ if(..(user, 0))
+ if(iscultist(user) || iswizard(user) || user.stat == DEAD)
+ to_chat(user, "A construct shell, used to house bound souls from a soulstone. ")
+ to_chat(user, "Placing a soulstone with a soul into this shell allows you to produce your choice of the following: ")
+ to_chat(user, "An Artificer , which can produce more shells and soulstones , as well as fortifications. ")
+ to_chat(user, "A Wraith , which does high damage and can jaunt through walls, though it is quite fragile. ")
+ to_chat(user, "A Juggernaut , which is very hard to kill and can produce temporary walls, but is slow. ")
+
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/device/soulstone))
- O.transfer_soul("CONSTRUCT",src,user)
-
+ var/obj/item/device/soulstone/SS = O
+ if(!SS.can_use(user))
+ to_chat(user, "An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly. ")
+ user.Dizzy(120)
+ return
+ SS.transfer_soul("CONSTRUCT",src,user)
+ SS.was_used()
+ else
+ return ..()
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
-
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
switch(choice)
if("FORCE")
@@ -238,7 +294,6 @@
to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs. ")
newstruct.cancel_camera()
-
/obj/item/device/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = 101
@@ -268,7 +323,6 @@
if(vic && U)
to_chat(U, "Capture successful! : [T.real_name]'s soul has been ripped from their body and stored within the soul stone.")
-
/obj/item/device/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
var/mob/dead/observer/chosen_ghost
@@ -293,4 +347,4 @@
T.unEquip(W)
init_shade(T, U)
qdel(T)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 4c06f84d7cd..4f3e7fe9001 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -103,9 +103,14 @@
/datum/spellbook_entry/fireball
name = "Fireball"
- spell_type = /obj/effect/proc_holder/spell/dumbfire/fireball
+ spell_type = /obj/effect/proc_holder/spell/fireball
log_name = "FB"
+/datum/spellbook_entry/rod_form
+ name = "Rod Form"
+ spell_type = /obj/effect/proc_holder/spell/targeted/rod_form
+ log_name = "RF"
+
/datum/spellbook_entry/magicm
name = "Magic Missile"
spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
@@ -314,7 +319,7 @@
user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
user.see_in_dark = 8
user.see_invisible = SEE_INVISIBLE_LEVEL_TWO
- to_chat(user, "\blue The walls suddenly disappear.")
+ to_chat(user, "The walls suddenly disappear. ")
return 1
@@ -348,7 +353,7 @@
/datum/spellbook_entry/item/armor
name = "Mastercrafted Armor Set"
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
- item_path = /obj/item/clothing/suit/space/rig/wizard
+ item_path = /obj/item/clothing/suit/space/hardsuit/wizard
log_name = "HS"
category = "Defensive"
@@ -357,7 +362,7 @@
if(.)
new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them.
new /obj/item/clothing/gloves/color/purple(get_turf(user))//To complete the outfit
- new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(user))
+ new /obj/item/clothing/head/helmet/space/hardsuit/wizard(get_turf(user))
/datum/spellbook_entry/item/contract
name = "Contract of Apprenticeship"
@@ -492,7 +497,7 @@
icon_state ="book"
throw_speed = 2
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/uses = 10
var/temp = null
var/op = 1
@@ -699,7 +704,7 @@
else
user.mind.AddSpell(S)
to_chat(user, "you rapidly read through the arcane book. Suddenly you realize you understand [spellname]! ")
- user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]). ")
+ user.create_attack_log("[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]). ")
onlearned(user)
@@ -714,7 +719,7 @@
return
/obj/item/weapon/spellbook/oneuse/fireball
- spell = /obj/effect/proc_holder/spell/dumbfire/fireball
+ spell = /obj/effect/proc_holder/spell/fireball
spellname = "fireball"
icon_state ="bookfireball"
desc = "This book feels warm to the touch."
@@ -848,9 +853,14 @@
to_chat(user, "[src] suddenly vanishes! ")
qdel(src)
-
/obj/item/weapon/spellbook/oneuse/fake_gib
spell = /obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate
spellname = "disintegrate"
icon_state ="bookfireball"
desc = "This book feels like it will rip stuff apart."
+
+/obj/item/weapon/spellbook/oneuse/sacredflame
+ spell = /obj/effect/proc_holder/spell/targeted/sacred_flame
+ spellname = "sacred flame"
+ icon_state ="booksacredflame"
+ desc = "Become one with the flames that burn within... and invite others to do so as well."
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 141a19a6d90..ac8fc9550cf 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -59,7 +59,7 @@
if(wizard_mind in wizards)
ticker.mode.wizards -= wizard_mind
wizard_mind.special_role = null
- wizard_mind.current.attack_log += "\[[time_stamp()]\] De-wizarded "
+ wizard_mind.current.create_attack_log("De-wizarded ")
wizard_mind.current.spellremove(wizard_mind.current)
wizard_mind.current.faction = list("Station")
if(issilicon(wizard_mind.current))
@@ -157,7 +157,7 @@
wizard_mob.faction = list("wizard")
- wizard_mob.species.equip(wizard_mob)
+ wizard_mob.species.after_equip_job(null, wizard_mob)
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
@@ -197,7 +197,7 @@
/datum/game_mode/wizard/declare_completion(var/ragin = 0)
if(finished && !ragin)
feedback_set_details("round_end_result","loss - wizard killed")
- to_chat(world, "\red The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget! ")
+ to_chat(world, " The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget! ")
..()
return 1
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 58d041b9442..2f0e9ab849a 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -74,6 +74,7 @@
/var/const/access_magistrate = 74
/var/const/access_minisat = 75
/var/const/access_mineral_storeroom = 76
+/var/const/access_network = 77
/var/const/access_weapons = 99 //Weapon authorization for secbots
@@ -93,18 +94,21 @@
/var/const/access_cent_bridge = 113//Bridge.
/var/const/access_cent_commander = 114//Commander's Office/ID computer.
- //The Syndicate
+//The Syndicate
/var/const/access_syndicate = 150//General Syndicate Access
/var/const/access_syndicate_leader = 151//Nuke Op Leader Access
/var/const/access_vox = 152//Vox Access
//Trade Stations
-
var/const/access_trade_sol = 160
- //MONEY
+//MONEY
/var/const/access_crate_cash = 200
+//Awaymissions
+/var/const/access_away01 = 271
+
+
/obj/var/list/req_access = null
/obj/var/req_access_txt = "0"
/obj/var/list/req_one_access = null
@@ -241,7 +245,7 @@ var/const/access_trade_sol = 160
access_theatre, access_research, access_mining, access_mailsorting,
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_paramedic, access_blueshield, access_mechanic,access_weapons,
- access_pilot, access_ntrep, access_magistrate, access_mineral_storeroom, access_minisat)
+ access_pilot, access_ntrep, access_magistrate, access_mineral_storeroom, access_minisat, access_network)
/proc/get_all_centcom_access()
return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_security, access_cent_storage, access_cent_shuttles, access_cent_telecomms, access_cent_teleporter, access_cent_specops, access_cent_specops_commander, access_cent_blackops, access_cent_thunder, access_cent_bridge, access_cent_commander)
@@ -266,7 +270,7 @@ var/const/access_trade_sol = 160
if(REGION_MEDBAY) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo, access_paramedic)
if(REGION_RESEARCH) //research
- return list(access_research, access_tox, access_tox_storage, access_genetics, access_robotics, access_xenobiology, access_xenoarch, access_minisat, access_rd)
+ return list(access_research, access_tox, access_tox_storage, access_genetics, access_robotics, access_xenobiology, access_xenoarch, access_minisat, access_rd, access_network)
if(REGION_ENGINEERING) //engineering and maintenance
return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_minisat, access_ce, access_mechanic)
if(REGION_SUPPLY) //supply
@@ -426,6 +430,8 @@ var/const/access_trade_sol = 160
return "Keycode Auth. Device"
if(access_tcomsat)
return "Telecommunications"
+ if(access_network)
+ return "Network Access"
if(access_gateway)
return "Gateway"
if(access_sec_doors)
diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm
index d5cba5be3d0..64298b70fbe 100644
--- a/code/game/jobs/job/central.dm
+++ b/code/game/jobs/job/central.dm
@@ -8,36 +8,37 @@
spawn_positions = 5
supervisors = "the admins"
selection_color = "#ffdddd"
- idtype = /obj/item/weapon/card/id/centcom
access = list()
minimal_access = list()
admin_only = 1
-
-/datum/job/ntnavyofficer/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/clothing/under/rank/centcom/officer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves)
- H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(H), slot_in_backpack)
-
- H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack)
-
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/ntnavyofficer
/datum/job/ntnavyofficer/get_access()
return get_centcom_access(title)
+/datum/outfit/job/ntnavyofficer
+ name = "Nanotrasen Navy Officer"
+ jobtype = /datum/job/ntnavyofficer
+
+ uniform = /obj/item/clothing/under/rank/centcom/officer
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/beret/centcom/officer
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/gun/energy/pulse/pistol = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/satchel
+
+
// CC Officials who lead ERTs, Death Squads, etc.
/datum/job/ntspecops
@@ -48,33 +49,34 @@
spawn_positions = 5
supervisors = "the admins"
selection_color = "#ffdddd"
- idtype = /obj/item/weapon/card/id/centcom
access = list()
minimal_access = list()
admin_only = 1
spawn_ert = 1
-
-/datum/job/ntspecops/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/clothing/under/syndicate/combat(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/combat(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves)
- H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer/navy(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/suit/space/deathsquad/officer(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(H), slot_belt)
- H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack)
-
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/ntspecops
/datum/job/ntspecops/get_access()
return get_centcom_access(title)
+
+/datum/outfit/job/ntspecops
+ name = "Special Operations Officer"
+ jobtype = /datum/job/ntspecops
+
+ uniform = /obj/item/clothing/under/syndicate/combat
+ suit = /obj/item/clothing/suit/space/deathsquad/officer
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/beret/centcom/officer/navy
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/gun/energy/pulse/pistol/m1911 = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/satchel
\ No newline at end of file
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index a6f1ef11749..4535e1c6c41 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -5,24 +5,24 @@
total_positions = -1
spawn_positions = -1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
access = list() //See /datum/job/assistant/get_access()
minimal_access = list() //See /datum/job/assistant/get_access()
alt_titles = list("Tourist","Businessman","Trader","Assistant")
-
-/datum/job/civilian/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/color/random(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ outfit = /datum/outfit/job/assistant
/datum/job/civilian/get_access()
if(config.assistant_maint)
return list(access_maint_tunnels)
else
return list()
+
+/datum/outfit/job/assistant
+ name = "Civilian"
+ jobtype = /datum/job/civilian
+
+ uniform = /obj/item/clothing/under/color/random
+ shoes = /obj/item/clothing/shoes/black
+
+
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 7e6f664252f..50c8a06777b 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -6,8 +6,8 @@
spawn_positions = 1
is_engineering = 1
supervisors = "the captain"
+ department_head = list("Captain")
selection_color = "#ffeeaa"
- idtype = /obj/item/weapon/card/id/ce
req_admin_notify = 1
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
@@ -20,24 +20,29 @@
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/chief_engineer
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/ce(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/heads/ce(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/hardhat/white(H), slot_head)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black/ce(H), slot_gloves)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- return 1
+/datum/outfit/job/chief_engineer
+ name = "Chief Engineer"
+ jobtype = /datum/job/chief_engineer
+ uniform = /obj/item/clothing/under/rank/chief_engineer
+ belt = /obj/item/weapon/storage/belt/utility/chief/full
+ gloves = /obj/item/clothing/gloves/color/black/ce
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/hardhat/white
+ l_ear = /obj/item/device/radio/headset/heads/ce
+ id = /obj/item/weapon/card/id/ce
+ l_pocket = /obj/item/device/t_scanner
+ pda = /obj/item/device/pda/heads/ce
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering
+ box = /obj/item/weapon/storage/box/engineer
/datum/job/engineer
@@ -48,27 +53,33 @@
spawn_positions = 5
is_engineering = 1
supervisors = "the chief engineer"
+ department_head = list("Chief Engineer")
selection_color = "#fff5cc"
- idtype = /obj/item/weapon/card/id/engineering
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_mineral_storeroom)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_mineral_storeroom)
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head)
- H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store)
- H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- return 1
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/engineer
+
+/datum/outfit/job/engineer
+ name = "Station Engineer"
+ jobtype = /datum/job/engineer
+
+ uniform = /obj/item/clothing/under/rank/engineer
+ belt = /obj/item/weapon/storage/belt/utility/full
+ shoes = /obj/item/clothing/shoes/workboots
+ head = /obj/item/clothing/head/hardhat
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ id = /obj/item/weapon/card/id/engineering
+ l_pocket = /obj/item/device/t_scanner
+ pda = /obj/item/device/pda/engineering
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering
+ box = /obj/item/weapon/storage/box/engineer
@@ -80,25 +91,28 @@
spawn_positions = 2
is_engineering = 1
supervisors = "the chief engineer"
+ department_head = list("Chief Engineer")
selection_color = "#fff5cc"
- idtype = /obj/item/weapon/card/id/engineering
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_mineral_storeroom)
minimal_access = list(access_eva, access_atmospherics, access_maint_tunnels, access_external_airlocks, access_emergency_storage, access_construction, access_mineral_storeroom)
alt_titles = list("Atmospheric Technician")
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
- H.equip_or_collect(new /obj/item/device/pda/atmos(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- return 1
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/atmos
+
+/datum/outfit/job/atmos
+ name = "Life Support Specialist"
+ jobtype = /datum/job/atmos
+
+ uniform = /obj/item/clothing/under/rank/atmospheric_technician
+ belt = /obj/item/weapon/storage/belt/utility/atmostech
+ shoes = /obj/item/clothing/shoes/workboots
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ id = /obj/item/weapon/card/id/engineering
+ pda = /obj/item/device/pda/atmos
+
+ box = /obj/item/weapon/storage/box/engineer
/datum/job/mechanic
title = "Mechanic"
@@ -108,25 +122,29 @@
spawn_positions = 1
is_engineering = 1
supervisors = "the chief engineer"
+ department_head = list("Chief Engineer")
selection_color = "#fff5cc"
- idtype = /obj/item/weapon/card/id/engineering
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom)
+ outfit = /datum/outfit/job/mechanic
+/datum/outfit/job/mechanic
+ name = "Mechanic"
+ jobtype = /datum/job/mechanic
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/mechanic(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head)
- H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store)
- H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/pod_paint_bucket(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/mechanic
+ belt = /obj/item/weapon/storage/belt/utility/full
+ shoes = /obj/item/clothing/shoes/workboots
+ head = /obj/item/clothing/head/hardhat
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ id = /obj/item/weapon/card/id/engineering
+ r_pocket = /obj/item/device/t_scanner
+ pda = /obj/item/device/pda/engineering
+ backpack_contents = list(
+ /obj/item/weapon/pod_paint_bucket = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering
+ box = /obj/item/weapon/storage/box/engineer
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index b4dc5610ce6..bac7efd0b8a 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -10,6 +10,7 @@
//Bitflags for the job
var/flag = 0
var/department_flag = 0
+ var/department_head = list()
//Players will be allowed to spawn in as jobs that are set to "Station"
var/list/faction = list("Station")
@@ -29,9 +30,6 @@
//Sellection screen color
var/selection_color = "#ffffff"
- //the type of the ID the player will have
- var/idtype = /obj/item/weapon/card/id
-
//List of alternate titles, if any
var/list/alt_titles
@@ -57,14 +55,32 @@
var/admin_only = 0
var/spawn_ert = 0
+ var/outfit = null
+
/////////////////////////////////
// /vg/ feature: Job Objectives!
/////////////////////////////////
var/required_objectives=list() // Objectives that are ALWAYS added.
var/optional_objectives=list() // Objectives that are SOMETIMES added.
-/datum/job/proc/equip(var/mob/living/carbon/human/H)
- return 1
+//Only override this proc
+/datum/job/proc/after_spawn(mob/living/carbon/human/H)
+
+/datum/job/proc/announce(mob/living/carbon/human/H)
+
+/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE)
+ if(!H)
+ return 0
+
+ H.species.before_equip_job(src, H, visualsOnly)
+
+ if(outfit)
+ H.equipOutfit(outfit, visualsOnly)
+
+ H.species.after_equip_job(src, H, visualsOnly)
+
+ if(!visualsOnly && announce)
+ announce(H)
/datum/job/proc/get_access()
if(!config) //Needed for robots.
@@ -94,44 +110,147 @@
return max(0, minimal_player_age - C.player_age)
-/datum/job/proc/apply_fingerprints(var/mob/living/carbon/human/H)
- if(!istype(H))
- return
- if(H.back)
- H.back.add_fingerprint(H,1) //The 1 sets a flag to ignore gloves
- for(var/obj/item/I in H.back.contents)
- I.add_fingerprint(H,1)
- if(H.wear_id)
- H.wear_id.add_fingerprint(H,1)
- if(H.w_uniform)
- H.w_uniform.add_fingerprint(H,1)
- if(H.wear_suit)
- H.wear_suit.add_fingerprint(H,1)
- if(H.wear_mask)
- H.wear_mask.add_fingerprint(H,1)
- if(H.head)
- H.head.add_fingerprint(H,1)
- if(H.shoes)
- H.shoes.add_fingerprint(H,1)
- if(H.gloves)
- H.gloves.add_fingerprint(H,1)
- if(H.l_ear)
- H.l_ear.add_fingerprint(H,1)
- if(H.r_ear)
- H.r_ear.add_fingerprint(H,1)
- if(H.glasses)
- H.glasses.add_fingerprint(H,1)
- if(H.belt)
- H.belt.add_fingerprint(H,1)
- for(var/obj/item/I in H.belt.contents)
- I.add_fingerprint(H,1)
- if(H.s_store)
- H.s_store.add_fingerprint(H,1)
- if(H.l_store)
- H.l_store.add_fingerprint(H,1)
- if(H.r_store)
- H.r_store.add_fingerprint(H,1)
- return 1
-
/datum/job/proc/is_position_available()
return (current_positions < total_positions) || (total_positions == -1)
+
+/datum/outfit/job
+ name = "Standard Gear"
+ collect_not_del = TRUE // we don't want anyone to lose their job shit
+
+ var/allow_loadout = TRUE
+ var/allow_backbag_choice = TRUE
+ var/jobtype = null
+
+ uniform = /obj/item/clothing/under/color/grey
+ id = /obj/item/weapon/card/id
+ l_ear = /obj/item/device/radio/headset
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/black
+ pda = /obj/item/device/pda
+
+ var/list/implants = null
+
+ var/backpack = /obj/item/weapon/storage/backpack
+ var/satchel = /obj/item/weapon/storage/backpack/satchel_norm
+ var/dufflebag = /obj/item/weapon/storage/backpack/duffel
+ var/box = /obj/item/weapon/storage/box/survival
+
+ var/tmp/list/gear_leftovers = list()
+
+/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(allow_backbag_choice)
+ switch(H.backbag)
+ if(GBACKPACK)
+ back = /obj/item/weapon/storage/backpack //Grey backpack
+ if(GSATCHEL)
+ back = /obj/item/weapon/storage/backpack/satchel_norm //Grey satchel
+ if(GDUFFLEBAG)
+ back = /obj/item/weapon/storage/backpack/duffel //Grey Dufflebag
+ if(LSATCHEL)
+ back = /obj/item/weapon/storage/backpack/satchel //Leather Satchel
+ if(DSATCHEL)
+ back = satchel //Department satchel
+ if(DDUFFLEBAG)
+ back = dufflebag //Department dufflebag
+ else
+ back = backpack //Department backpack
+
+ if(box)
+ backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
+ backpack_contents[box] = 1
+
+ if(allow_loadout && H.client && (H.client.prefs.gear && H.client.prefs.gear.len))
+ for(var/gear in H.client.prefs.gear)
+ var/datum/gear/G = gear_datums[gear]
+ if(G)
+ var/permitted = FALSE
+
+ if(G.allowed_roles)
+ if(name in G.allowed_roles)
+ permitted = TRUE
+ else
+ permitted = TRUE
+
+ if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
+ permitted = FALSE
+
+ if(!permitted)
+ to_chat(H, "Your current job or whitelist status does not permit you to spawn with [gear]! ")
+ continue
+
+ if(G.slot)
+ if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot))
+ to_chat(H, "Equipping you with [gear]! ")
+ else
+ gear_leftovers += G
+ else
+ gear_leftovers += G
+
+/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+
+ imprint_idcard(H)
+
+ H.sec_hud_set_ID()
+
+ imprint_pda(H)
+
+ if(implants)
+ for(var/implant_type in implants)
+ var/obj/item/weapon/implant/I = new implant_type(H)
+ I.implant(H)
+
+ if(gear_leftovers.len)
+ for(var/datum/gear/G in gear_leftovers)
+ var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name]))
+ if(istype(placed_in))
+ if(isturf(placed_in))
+ to_chat(H, "Placing \the [G] on [placed_in]! ")
+ else
+ to_chat(H, "Placing \the [G] in [placed_in.name]")
+ continue
+ if(H.equip_to_appropriate_slot(G))
+ to_chat(H, "Placing \the [G] in your inventory! ")
+ continue
+ if(H.put_in_hands(G))
+ to_chat(H, "Placing \the [G] in your hands! ")
+ continue
+ to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug. ")
+ qdel(G)
+
+ qdel(gear_leftovers)
+
+ return 1
+
+/datum/outfit/job/proc/imprint_idcard(mob/living/carbon/human/H)
+ var/datum/job/J = job_master.GetJobType(jobtype)
+ if(!J)
+ J = job_master.GetJob(H.job)
+
+ var/alt_title
+ if(H.mind)
+ alt_title = H.mind.role_alt_title
+
+ var/obj/item/weapon/card/id/C = H.wear_id
+ if(istype(C))
+ C.access = J.get_access()
+ C.registered_name = H.real_name
+ C.rank = J.title
+ C.assignment = alt_title ? alt_title : J.title
+ C.sex = capitalize(H.gender)
+ C.age = H.age
+ C.name = "[C.registered_name]'s ID Card ([C.assignment])"
+ C.photo = get_id_photo(H)
+
+ if(H.mind && H.mind.initial_account)
+ C.associated_account_number = H.mind.initial_account.account_number
+
+/datum/outfit/job/proc/imprint_pda(mob/living/carbon/human/H)
+ var/obj/item/device/pda/PDA = H.wear_pda
+ var/obj/item/weapon/card/id/C = H.wear_id
+ if(istype(PDA) && istype(C))
+ PDA.owner = H.real_name
+ PDA.ownjob = C.assignment
+ PDA.ownrank = C.rank
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 9e4e5f5acee..e92a95e70b6 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -6,8 +6,8 @@
spawn_positions = 1
is_medical = 1
supervisors = "the captain"
+ department_head = list("Captain")
selection_color = "#ffddf0"
- idtype = /obj/item/weapon/card/id/cmo
req_admin_notify = 1
access = list(access_medical, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
@@ -18,25 +18,27 @@
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/cmo
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/cmo(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/heads/cmo(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/cmo(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- return 1
+/datum/outfit/job/cmo
+ name = "Chief Medical Officer"
+ jobtype = /datum/job/cmo
+ uniform = /obj/item/clothing/under/rank/chief_medical_officer
+ suit = /obj/item/clothing/suit/storage/labcoat/cmo
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/heads/cmo
+ id = /obj/item/weapon/card/id/cmo
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ pda = /obj/item/device/pda/heads/cmo
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
/datum/job/doctor
title = "Medical Doctor"
@@ -46,55 +48,90 @@
spawn_positions = 3
is_medical = 1
supervisors = "the chief medical officer"
+ department_head = list("Chief Medical Officer")
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_morgue, access_surgery, access_maint_tunnels)
- alt_titles = list("Surgeon","Nurse","Coroner")
+ alt_titles = list("Surgeon","Nurse")
minimal_player_age = 3
+ exp_requirements = 180
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/doctor
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(H.mind.role_alt_title)
- switch(H.mind.role_alt_title)
- if("Coroner")
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/mortician(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/mortician(H), slot_wear_suit)
- if(H.backbag != 1)
- H.equip_or_collect(new /obj/item/clothing/head/surgery/black(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/autopsy_scanner(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/mass_spectrometer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/bodybags(H), slot_in_backpack)
- if("Surgeon")
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/head/surgery/blue(H), slot_head)
- if("Medical Doctor")
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- if("Nurse")
- if(H.gender == FEMALE)
- if(prob(50))
- H.equip_or_collect(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform)
- else
- H.equip_or_collect(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/head/nursehat(H), slot_head)
+/datum/outfit/job/doctor
+ name = "Medical Doctor"
+ jobtype = /datum/job/doctor
+
+ uniform = /obj/item/clothing/under/rank/medical
+ suit = /obj/item/clothing/suit/storage/labcoat
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ pda = /obj/item/device/pda/medical
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+
+/datum/job/coroner
+ title = "Coroner"
+ flag = CORONER
+ department_flag = MEDSCI
+ total_positions = 1
+ spawn_positions = 1
+ is_medical = 1
+ supervisors = "the chief medical officer"
+ selection_color = "#ffeef0"
+ access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
+ minimal_access = list(access_medical, access_morgue, access_maint_tunnels)
+ minimal_player_age = 3
+ exp_requirements = 180
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/coroner
+
+/datum/outfit/job/coroner
+ name = "Coroner"
+ jobtype = /datum/job/coroner
+
+ uniform = /obj/item/clothing/under/rank/medical/mortician
+ suit = /obj/item/clothing/suit/storage/labcoat/mortician
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/clipboard
+ pda = /obj/item/device/pda/medical
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+
+ backpack_contents = list(
+ /obj/item/clothing/head/surgery/black = 1,
+ /obj/item/weapon/autopsy_scanner = 1,
+ /obj/item/device/mass_spectrometer = 1,
+ /obj/item/weapon/storage/box/bodybags = 1)
+
+/datum/outfit/job/doctor/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind.role_alt_title)
+ switch(H.mind.role_alt_title)
+ if("Surgeon")
+ uniform = /obj/item/clothing/under/rank/medical/blue
+ head = /obj/item/clothing/head/surgery/blue
+ if("Medical Doctor")
+ uniform = /obj/item/clothing/under/rank/medical
+ if("Nurse")
+ if(H.gender == FEMALE)
+ if(prob(50))
+ uniform = /obj/item/clothing/under/rank/nursesuit
else
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/purple(H), slot_w_uniform)
- else
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/nurse
+ head = /obj/item/clothing/head/nursehat
+ else
+ uniform = /obj/item/clothing/under/rank/medical/purple
@@ -107,29 +144,31 @@
spawn_positions = 2
is_medical = 1
supervisors = "the chief medical officer"
+ department_head = list("Chief Medical Officer")
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_chemistry, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Pharmacist","Pharmacologist")
minimal_player_age = 7
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/chemist
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/glasses/science(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/chemist(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/chemist
+ name = "Chemist"
+ jobtype = /datum/job/chemist
+ uniform = /obj/item/clothing/under/rank/chemist
+ suit = /obj/item/clothing/suit/storage/labcoat/chemist
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_med
+ glasses = /obj/item/clothing/glasses/science
+ id = /obj/item/weapon/card/id/medical
+ pda = /obj/item/device/pda/chemist
+ backpack = /obj/item/weapon/storage/backpack/chemistry
+ satchel = /obj/item/weapon/storage/backpack/satchel_chem
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/chemistry
/datum/job/geneticist
title = "Geneticist"
@@ -139,26 +178,31 @@
spawn_positions = 2
is_medical = 1
supervisors = "the chief medical officer and the research director"
+ department_head = list("Chief Medical Officer", "Research Director")
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research, access_mineral_storeroom)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research, access_maint_tunnels)
minimal_player_age = 3
+ exp_requirements = 180
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/geneticist
+
+/datum/outfit/job/geneticist
+ name = "Geneticist"
+ jobtype = /datum/job/geneticist
+
+ uniform = /obj/item/clothing/under/rank/geneticist
+ suit = /obj/item/clothing/suit/storage/labcoat/genetics
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_medsci
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/geneticist
+
+ backpack = /obj/item/weapon/storage/backpack/genetics
+ satchel = /obj/item/weapon/storage/backpack/satchel_gen
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/genetics
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/genetics(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
/datum/job/virologist
title = "Virologist"
@@ -168,28 +212,32 @@
spawn_positions = 1
is_medical = 1
supervisors = "the chief medical officer"
+ department_head = list("Chief Medical Officer")
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_virology, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Pathologist","Microbiologist")
minimal_player_age = 7
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/virologist
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_vir(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/virologist(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/virologist
+ name = "Virologist"
+ jobtype = /datum/job/virologist
+
+ uniform = /obj/item/clothing/under/rank/virologist
+ suit = /obj/item/clothing/suit/storage/labcoat/virologist
+ shoes = /obj/item/clothing/shoes/white
+ mask = /obj/item/clothing/mask/surgical
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/viro
+
+ backpack = /obj/item/weapon/storage/backpack/virology
+ satchel = /obj/item/weapon/storage/backpack/satchel_vir
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/virology
/datum/job/psychiatrist
title = "Psychiatrist"
@@ -199,35 +247,35 @@
spawn_positions = 1
is_medical = 1
supervisors = "the chief medical officer"
+ department_head = list("Chief Medical Officer")
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist)
minimal_access = list(access_medical, access_psychiatrist, access_maint_tunnels)
alt_titles = list("Psychologist","Therapist")
+ outfit = /datum/outfit/job/psychiatrist
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(H.mind.role_alt_title)
- switch(H.mind.role_alt_title)
- if("Psychiatrist")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
- if("Psychologist")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
- if("Therapist")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/psychiatrist
+ name = "Psychiatrist"
+ jobtype = /datum/job/psychiatrist
+
+ uniform = /obj/item/clothing/under/rank/medical
+ suit = /obj/item/clothing/suit/storage/labcoat
+ shoes = /obj/item/clothing/shoes/laceup
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/medical
+
+/datum/outfit/job/psychiatrist/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind.role_alt_title)
+ switch(H.mind.role_alt_title)
+ if("Psychiatrist")
+ uniform = /obj/item/clothing/under/rank/psych
+ if("Psychologist")
+ uniform = /obj/item/clothing/under/rank/psych/turtleneck
+ if("Therapist")
+ uniform = /obj/item/clothing/under/rank/medical
/datum/job/paramedic
title = "Paramedic"
@@ -237,24 +285,33 @@
spawn_positions = 1
is_medical = 1
supervisors = "the chief medical officer"
+ department_head = list("Chief Medical Officer")
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
- access = list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
- minimal_access=list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
+ access = list(access_paramedic, access_medical, access_maint_tunnels, access_external_airlocks, access_morgue)
+ minimal_access=list(access_paramedic, access_medical, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_player_age = 3
+ exp_requirements = 180
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/paramedic
+/datum/outfit/job/paramedic
+ name = "Paramedic"
+ jobtype = /datum/job/paramedic
+
+ uniform = /obj/item/clothing/under/rank/medical/paramedic
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/soft/blue
+ mask = /obj/item/clothing/mask/cigarette
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ l_pocket = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/medical
+ backpack_contents = list(
+ /obj/item/device/healthanalyzer = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+ box = /obj/item/weapon/storage/box/engineer
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- if(H.backbag == 2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
- if(H.backbag == 3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/mask/cigarette(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/clothing/head/soft/blue(H), slot_head)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/healthanalyzer(H), slot_in_backpack)
- return 1
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 2e07a08b2bc..cfccd0be21f 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -1,116 +1,124 @@
-/datum/job/rd
- title = "Research Director"
- flag = RD
- department_flag = MEDSCI
- total_positions = 1
- spawn_positions = 1
- is_science = 1
- supervisors = "the captain"
- selection_color = "#ffddff"
- req_admin_notify = 1
- idtype = /obj/item/weapon/card/id/rd
- access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
- access_research, access_robotics, access_xenobiology, access_ai_upload,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_mineral_storeroom)
- minimal_access = list(access_eva, access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
- access_research, access_robotics, access_xenobiology, access_ai_upload,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom)
- minimal_player_age = 21
- exp_requirements = 600
- exp_type = EXP_TYPE_CREW
-
- // All science-y guys get bonuses for maxing out their tech.
- required_objectives=list(
- /datum/job_objective/further_research
- )
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/science(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- return 1
-
-
-
-/datum/job/scientist
- title = "Scientist"
- flag = SCIENTIST
- department_flag = MEDSCI
- total_positions = 6
- spawn_positions = 6
- is_science = 1
- supervisors = "the research director"
- selection_color = "#ffeeff"
- idtype = /obj/item/weapon/card/id/research
- access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_mineral_storeroom)
- minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_maint_tunnels, access_mineral_storeroom)
- alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist", "Chemical Researcher")
- minimal_player_age = 3
-
- // All science-y guys get bonuses for maxing out their tech.
- required_objectives=list(
- /datum/job_objective/further_research
- )
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/science(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
-
-
-
-/datum/job/roboticist
- title = "Roboticist"
- flag = ROBOTICIST
- department_flag = MEDSCI
- total_positions = 2
- spawn_positions = 2
- is_science = 1
- supervisors = "the research director"
- selection_color = "#ffeeff"
- idtype = /obj/item/weapon/card/id/research
- access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
- minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_maint_tunnels, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
- alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
- minimal_player_age = 3
-
- required_objectives=list(
- /datum/job_objective/make_cyborg,
- /datum/job_objective/make_ripley
- )
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/job/rd
+ title = "Research Director"
+ flag = RD
+ department_flag = MEDSCI
+ total_positions = 1
+ spawn_positions = 1
+ is_science = 1
+ supervisors = "the captain"
+ department_head = list("Captain")
+ selection_color = "#ffddff"
+ req_admin_notify = 1
+ access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
+ access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
+ access_research, access_robotics, access_xenobiology, access_ai_upload,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_mineral_storeroom, access_network)
+ minimal_access = list(access_eva, access_rd, access_heads, access_tox, access_genetics, access_morgue,
+ access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
+ access_research, access_robotics, access_xenobiology, access_ai_upload,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom, access_network)
+ minimal_player_age = 21
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
+
+ // All science-y guys get bonuses for maxing out their tech.
+ required_objectives = list(
+ /datum/job_objective/further_research
+ )
+
+ outfit = /datum/outfit/job/rd
+
+/datum/outfit/job/rd
+ name = "Research Director"
+ jobtype = /datum/job/rd
+
+ uniform = /obj/item/clothing/under/rank/research_director
+ suit = /obj/item/clothing/suit/storage/labcoat
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/heads/rd
+ id = /obj/item/weapon/card/id/rd
+ l_hand = /obj/item/weapon/clipboard
+ pda = /obj/item/device/pda/heads/rd
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/science
+ satchel = /obj/item/weapon/storage/backpack/satchel_tox
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/science
+
+
+/datum/job/scientist
+ title = "Scientist"
+ flag = SCIENTIST
+ department_flag = MEDSCI
+ total_positions = 6
+ spawn_positions = 6
+ is_science = 1
+ supervisors = "the research director"
+ department_head = list("Research Director")
+ selection_color = "#ffeeff"
+ access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_mineral_storeroom)
+ minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_maint_tunnels, access_mineral_storeroom)
+ alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist", "Chemical Researcher")
+ minimal_player_age = 3
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
+ // All science-y guys get bonuses for maxing out their tech.
+ required_objectives = list(
+ /datum/job_objective/further_research
+ )
+
+ outfit = /datum/outfit/job/scientist
+
+/datum/outfit/job/scientist
+ name = "Scientist"
+ jobtype = /datum/job/scientist
+
+ uniform = /obj/item/clothing/under/rank/scientist
+ suit = /obj/item/clothing/suit/storage/labcoat/science
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_sci
+ id = /obj/item/weapon/card/id/research
+ pda = /obj/item/device/pda/toxins
+
+ backpack = /obj/item/weapon/storage/backpack/science
+ satchel = /obj/item/weapon/storage/backpack/satchel_tox
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/science
+
+
+/datum/job/roboticist
+ title = "Roboticist"
+ flag = ROBOTICIST
+ department_flag = MEDSCI
+ total_positions = 2
+ spawn_positions = 2
+ is_science = 1
+ supervisors = "the research director"
+ department_head = list("Research Director")
+ selection_color = "#ffeeff"
+ access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
+ minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_maint_tunnels, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
+ alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
+ minimal_player_age = 3
+ exp_requirements = 180
+ exp_type = EXP_TYPE_CREW
+
+ required_objectives = list(
+ /datum/job_objective/make_cyborg,
+ /datum/job_objective/make_ripley
+ )
+
+ outfit = /datum/outfit/job/roboticist
+
+/datum/outfit/job/roboticist
+ name = "Roboticist"
+ jobtype = /datum/job/roboticist
+
+ uniform = /obj/item/clothing/under/rank/roboticist
+ suit = /obj/item/clothing/suit/storage/labcoat
+ belt = /obj/item/weapon/storage/belt/utility/full
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_sci
+ id = /obj/item/weapon/card/id/research
+ pda = /obj/item/device/pda/roboticist
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index cd1e3fb370d..326f4ee85b6 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -6,8 +6,8 @@
spawn_positions = 1
is_security = 1
supervisors = "the captain"
+ department_head = list("Captain")
selection_color = "#ffdddd"
- idtype = /obj/item/weapon/card/id/hos
req_admin_notify = 1
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court,
access_forensics_lockers, access_pilot, access_morgue, access_maint_tunnels, access_all_personal_lockers,
@@ -20,30 +20,32 @@
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/hos
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/hos/alt(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black/hos(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/head/HoS(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+/datum/outfit/job/hos
+ name = "Head of Security"
+ jobtype = /datum/job/hos
+
+ uniform = /obj/item/clothing/under/rank/head_of_security
+ suit = /obj/item/clothing/suit/armor/hos
+ gloves = /obj/item/clothing/gloves/color/black/hos
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/HoS
+ l_ear = /obj/item/device/radio/headset/heads/hos/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/hos
+ suit_store = /obj/item/weapon/gun/energy/gun
+ pda = /obj/item/device/pda/heads/hos
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
@@ -55,38 +57,39 @@
spawn_positions = 1
is_security = 1
supervisors = "the head of security"
+ department_head = list("Head of Security")
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_weapons)
minimal_player_age = 21
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/warden
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/warden(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
-// H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
- H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+/datum/outfit/job/warden
+ name = "Warden"
+ jobtype = /datum/job/warden
+
+ uniform = /obj/item/clothing/under/rank/warden
+ suit = /obj/item/clothing/suit/armor/vest/warden
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/warden
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/flash
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ pda = /obj/item/device/pda/warden
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
@@ -98,90 +101,99 @@
spawn_positions = 1
is_security = 1
supervisors = "the head of security"
+ department_head = list("Head of Security")
selection_color = "#ffeeee"
alt_titles = list("Forensic Technician")
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
alt_titles = list("Forensic Technician")
minimal_player_age = 14
exp_requirements = 300
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/det(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/toy/crayon/white(H), slot_l_store)
-/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
- CIG.light("")
- H.equip_or_collect(CIG, slot_wear_mask) */
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/noir(H),slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
- H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit/forensics/blue(H), slot_wear_suit)
- else
- H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/head/det_hat(H), slot_head)
- H.equip_or_collect(new /obj/item/weapon/lighter/zippo(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/detective_scanner(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
+ outfit = /datum/outfit/job/detective
- H.dna.SetSEState(SOBERBLOCK,1)
- H.mutations += SOBER
- H.check_mutations = 1
- return 1
+/datum/outfit/job/detective
+ name = "Detective"
+ jobtype = /datum/job/detective
+ uniform = /obj/item/clothing/under/det
+ suit = /obj/item/clothing/suit/storage/det_suit
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/det_hat
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/sunglasses/noir
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/toy/crayon/white
+ r_pocket = /obj/item/weapon/lighter/zippo
+ pda = /obj/item/device/pda/detective
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/evidence = 1,
+ /obj/item/device/detective_scanner = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+/datum/outfit/job/detective/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind.role_alt_title)
+ switch(H.mind.role_alt_title)
+ if("Forensic Technician")
+ suit = /obj/item/clothing/suit/storage/det_suit/forensics/blue
+ head = null
+
+/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ H.dna.SetSEState(SOBERBLOCK,1)
+ H.mutations += SOBER
+ H.check_mutations = 1
/datum/job/officer
title = "Security Officer"
flag = OFFICER
department_flag = ENGSEC
- total_positions = 5
- spawn_positions = 5
+ total_positions = 7
+ spawn_positions = 7
is_security = 1
supervisors = "the head of security"
+ department_head = list("Head of Security")
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons)
minimal_player_age = 14
exp_requirements = 300
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/security(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/officer
+
+/datum/outfit/job/officer
+ name = "Security Officer"
+ jobtype = /datum/job/officer
+
+ uniform = /obj/item/clothing/under/rank/security
+ suit = /obj/item/clothing/suit/armor/vest/security
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/helmet
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/flash
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ pda = /obj/item/device/pda/security
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+
+
/datum/job/brigdoc
title = "Brig Physician"
@@ -191,31 +203,33 @@
spawn_positions = 1
is_security = 1
supervisors = "the head of security"
+ department_head = list("Head of Security")
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_morgue, access_surgery, access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels)
+ outfit = /datum/outfit/job/brigdoc
+
+/datum/outfit/job/brigdoc
+ name = "Brig Physician"
+ jobtype = /datum/job/brigdoc
+
+ uniform = /obj/item/clothing/under/rank/security/brigphys
+ suit = /obj/item/clothing/suit/storage/fr_jacket
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/hud/health/health_advanced
+ id = /obj/item/weapon/card/id/security
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ pda = /obj/item/device/pda/medical
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/security/brigphys(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
/datum/job/pilot
title = "Security Pod Pilot"
@@ -225,29 +239,33 @@
spawn_positions = 1
is_security = 1
supervisors = "the head of security"
+ department_head = list("Head of Security")
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons, access_pilot, access_external_airlocks)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons, access_pilot, access_external_airlocks)
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/security/pod_pilot(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/jacket/pilot(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/pilot
+
+/datum/outfit/job/pilot
+ name = "Security Pod Pilot"
+ jobtype = /datum/job/pilot
+
+ uniform = /obj/item/clothing/under/rank/security/pod_pilot
+ suit = /obj/item/clothing/suit/jacket/pilot
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/flash
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ pda = /obj/item/device/pda/security
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+ box = /obj/item/weapon/storage/box/engineer
\ No newline at end of file
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index eedb50a8412..0def40bc7b1 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -6,14 +6,15 @@
spawn_positions = 1
selection_color = "#ccffcc"
supervisors = "your laws"
+ department_head = list("Captain")
req_admin_notify = 1
minimal_player_age = 30
- exp_requirements = 600
+ exp_requirements = 1200
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
+/datum/job/ai/equip(mob/living/carbon/human/H)
+ if(!H)
+ return 0
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
@@ -26,12 +27,14 @@
total_positions = 1
spawn_positions = 1
supervisors = "your laws and the AI" //Nodrak
+ department_head = list("AI")
selection_color = "#ddffdd"
minimal_player_age = 21
exp_requirements = 300
exp_type = EXP_TYPE_CREW
alt_titles = list("Android", "Robot")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
\ No newline at end of file
+/datum/job/cyborg/equip(mob/living/carbon/human/H)
+ if(!H)
+ return 0
+ return H.Robotize()
\ No newline at end of file
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index c3499a35fa7..f82b4cd00d4 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -1,4 +1,4 @@
-var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
+var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
/datum/job/captain
title = "Captain"
flag = CAPTAIN
@@ -6,45 +6,55 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
total_positions = 1
spawn_positions = 1
supervisors = "Nanotrasen officials"
+ department_head = list("Nanotrasen Navy Officer")
selection_color = "#ccccff"
- idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
is_command = 1
access = list() //See get_access()
minimal_access = list() //See get_access()
minimal_player_age = 30
- exp_requirements = 600
+ exp_requirements = 1200
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H)
+ outfit = /datum/outfit/job/captain
+
+/datum/job/captain/get_access()
+ return get_all_accesses()
+
+/datum/job/captain/announce(mob/living/carbon/human/H)
+ . = ..()
+ captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
+ callHook("captain_spawned", list("captain" = H))
+
+/datum/outfit/job/captain
+ name = "Captain"
+ jobtype = /datum/job/captain
+
+ uniform = /obj/item/clothing/under/rank/captain
+ suit = /obj/item/clothing/suit/armor/vest/capcarapace
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/caphat
+ l_ear = /obj/item/device/radio/headset/heads/captain/alt
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/gold
+ pda = /obj/item/device/pda/captain
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/ids = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/captain
+ satchel = /obj/item/weapon/storage/backpack/satchel_cap
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/captain
+
+/datum/outfit/job/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H && H.w_uniform)
+ var/obj/item/clothing/under/U = H.w_uniform
var/obj/item/clothing/accessory/medal/gold/captain/M = new /obj/item/clothing/accessory/medal/gold/captain(U)
U.accessories += M
M.on_attached(U)
- H.equip_or_collect(U, slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/caphat(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/storage/box/ids(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
- callHook("captain_spawned", list("captain" = H))
- return 1
-
- get_access()
- return get_all_accesses()
@@ -55,8 +65,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
+ department_head = list("Captain")
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
is_command = 1
minimal_player_age = 21
@@ -75,22 +85,25 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons, access_mineral_storeroom)
+ outfit = /datum/outfit/job/hop
+
+/datum/outfit/job/hop
+ name = "Head of Personnel"
+ jobtype = /datum/job/hop
+
+ uniform = /obj/item/clothing/under/rank/head_of_personnel
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/hopcap
+ l_ear = /obj/item/device/radio/headset/heads/hop
+ id = /obj/item/weapon/card/id/silver
+ pda = /obj/item/device/pda/heads/hop
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/ids = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list()
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/hop(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/head/hopcap(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/heads/hop(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/ids(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
/datum/job/nanotrasenrep
@@ -100,8 +113,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
total_positions = 1
spawn_positions = 1
supervisors = "the command staff"
+ department_head = list("Captain")
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/nanotrasen
req_admin_notify = 1
is_command = 1
minimal_player_age = 21
@@ -118,25 +131,26 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons, access_ntrep)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/ntrep(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/ntcane(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/lighter/zippo/nt_rep(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/nanotrasenrep
+
+/datum/outfit/job/nanotrasenrep
+ name = "Nanotrasen Representative"
+ jobtype = /datum/job/nanotrasenrep
+
+ uniform = /obj/item/clothing/under/rank/ntrep
+ suit = /obj/item/clothing/suit/storage/ntrep
+ shoes = /obj/item/clothing/shoes/centcom
+ l_ear = /obj/item/device/radio/headset/heads/ntrep
+ id = /obj/item/weapon/card/id/nanotrasen
+ l_pocket = /obj/item/weapon/lighter/zippo/nt_rep
+ pda = /obj/item/device/pda/heads/ntrep
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/ntcane = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+
/datum/job/blueshield
title = "Blueshield"
@@ -145,8 +159,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
total_positions = 1
spawn_positions = 1
supervisors = "the Nanotrasen representative"
+ department_head = list("Captain")
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/nanotrasen
req_admin_notify = 1
is_command = 1
minimal_player_age = 21
@@ -159,27 +173,31 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimal_access = list(access_forensics_lockers, access_sec_doors, access_medical, access_construction, access_engine, access_maint_tunnels, access_research,
access_RC_announce, access_keycard_auth, access_heads, access_blueshield, access_weapons)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/blueshield/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/blueshield(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/blueshield(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/blueshield
+
+/datum/outfit/job/blueshield
+ name = "Blueshield"
+ jobtype = /datum/job/blueshield
+
+ uniform = /obj/item/clothing/under/rank/blueshield
+ suit = /obj/item/clothing/suit/armor/vest/blueshield
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/jackboots
+ l_ear = /obj/item/device/radio/headset/heads/blueshield/alt
+ glasses = /obj/item/clothing/glasses/hud/health/health_advanced
+ id = /obj/item/weapon/card/id/nanotrasen
+ pda = /obj/item/device/pda/heads/blueshield
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/deathimp = 1,
+ /obj/item/weapon/gun/energy/gun/blueshield = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+
/datum/job/judge
title = "Magistrate"
@@ -188,8 +206,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
total_positions = 1
spawn_positions = 1
supervisors = "the Nanotrasen Supreme Court"
+ department_head = list("Captain")
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/nanotrasen
req_admin_notify = 1
is_legal = 1
minimal_player_age = 30
@@ -199,29 +217,34 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_magistrate)
- minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate, access_heads)
+
+ outfit = /datum/outfit/job/judge
+
+/datum/outfit/job/judge
+ name = "Magistrate"
+ jobtype = /datum/job/judge
+
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ suit = /obj/item/clothing/suit/judgerobe
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/powdered_wig
+ l_ear = /obj/item/device/radio/headset/heads/magistrate/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/nanotrasen
+ l_pocket = /obj/item/device/flash
+ pda = /obj/item/device/pda/heads/magistrate
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/magistrate/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/judgerobe(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/powdered_wig(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
//var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds.
/datum/job/lawyer
@@ -232,31 +255,32 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 2
is_legal = 1
supervisors = "the magistrate"
+ department_head = list("Captain")
selection_color = "#ddddff"
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
alt_titles = list("Lawyer","Public Defender")
minimal_player_age = 30
- idtype = /obj/item/weapon/card/id/security
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/lawyer
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/internalaffairs(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/device/pda/lawyer(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+/datum/outfit/job/lawyer
+ name = "Internal Affairs Agent"
+ jobtype = /datum/job/lawyer
+
+ uniform = /obj/item/clothing/under/rank/internalaffairs
+ suit = /obj/item/clothing/suit/storage/internalaffairs
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/laser_pointer
+ r_pocket = /obj/item/device/flash
+ l_hand = /obj/item/weapon/storage/briefcase
+ pda = /obj/item/device/pda/lawyer
+
+ implants = list(/obj/item/weapon/implant/mindshield)
+
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index f4c1118ce59..60f1bd541a8 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -7,32 +7,35 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_weapons, access_mineral_storeroom)
minimal_access = list(access_bar, access_maint_tunnels, access_weapons, access_mineral_storeroom)
+ outfit = /datum/outfit/job/bartender
+/datum/outfit/job/bartender
+ name = "Bartender"
+ jobtype = /datum/job/bartender
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/reagent(H), slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/bar(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/bandolier/full(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/toy/russian_revolver(H), slot_in_backpack)
+ uniform = /obj/item/clothing/under/rank/bartender
+ suit = /obj/item/clothing/suit/armor/vest
+ belt = /obj/item/weapon/storage/belt/bandolier/full
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ glasses = /obj/item/clothing/glasses/sunglasses/reagent
+ pda = /obj/item/device/pda/bar
+ backpack_contents = list(
+ /obj/item/toy/russian_revolver = 1
+ )
- H.dna.SetSEState(SOBERBLOCK,1)
- H.mutations += SOBER
- H.check_mutations = 1
+/datum/outfit/job/bartender/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
- return 1
+ H.dna.SetSEState(SOBERBLOCK,1)
+ H.mutations += SOBER
+ H.check_mutations = 1
@@ -44,26 +47,23 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
minimal_access = list(access_kitchen, access_maint_tunnels)
alt_titles = list("Cook","Culinary Artist","Butcher")
+ outfit = /datum/outfit/job/chef
+/datum/outfit/job/chef
+ name = "Chef"
+ jobtype = /datum/job/chef
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/chefhat(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/chef(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/chef
+ suit = /obj/item/clothing/suit/chef
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/chefhat
+ l_ear = /obj/item/device/radio/headset/headset_service
+ pda = /obj/item/device/pda/chef
@@ -75,27 +75,28 @@
spawn_positions = 2
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
- access = list(access_hydroponics, access_bar, access_kitchen)
- minimal_access = list(access_hydroponics, access_maint_tunnels)
+ access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
+ minimal_access = list(access_hydroponics, access_morgue, access_maint_tunnels)
alt_titles = list("Hydroponicist", "Botanical Researcher")
+ outfit = /datum/outfit/job/hydro
+/datum/outfit/job/hydro
+ name = "Botanist"
+ jobtype = /datum/job/hydro
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/botany(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
- H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/hydroponics
+ suit = /obj/item/clothing/suit/apron
+ gloves = /obj/item/clothing/gloves/botanic_leather
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ suit_store = /obj/item/device/plant_analyzer
+ pda = /obj/item/device/pda/botanist
+
+ backpack = /obj/item/weapon/storage/backpack/botany
+ satchel = /obj/item/weapon/storage/backpack/satchel_hyd
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/hydro
@@ -108,26 +109,23 @@
spawn_positions = 1
is_supply = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/supply
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
+ outfit = /datum/outfit/job/qm
+/datum/outfit/job/qm
+ name = "Quartermaster"
+ jobtype = /datum/job/qm
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/clipboard(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/cargo
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/headset_cargo
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/supply
+ l_hand = /obj/item/weapon/clipboard
+ pda = /obj/item/device/pda/quartermaster
@@ -139,24 +137,21 @@
spawn_positions = 2
is_supply = 1
supervisors = "the quartermaster"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/supply
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting, access_mineral_storeroom)
+ outfit = /datum/outfit/job/cargo_tech
+/datum/outfit/job/cargo_tech
+ name = "Cargo Technician"
+ jobtype = /datum/job/cargo_tech
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/cargo(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/cargotech
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_cargo
+ id = /obj/item/weapon/card/id/supply
+ pda = /obj/item/device/pda/cargo
@@ -168,33 +163,32 @@
spawn_positions = 3
is_supply = 1
supervisors = "the quartermaster"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/supply
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Spelunker")
+ outfit = /datum/outfit/job/mining
- equip(var/mob/living/carbon/human/H)
- if(!H)
- return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo/mining(H), slot_l_ear)
- switch(H.backbag)
- if(2)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/gloves/fingerless(H), slot_gloves)
- H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/patch/styptic(H), slot_l_store)
- H.equip_or_collect(new /obj/item/device/flashlight/seclite(H), slot_r_store)
- H.equip_or_collect(new /obj/item/weapon/mining_voucher(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/mining
+ name = "Shaft Miner"
+ jobtype = /datum/job/mining
+
+ uniform = /obj/item/clothing/under/rank/miner
+ gloves = /obj/item/clothing/gloves/fingerless
+ shoes = /obj/item/clothing/shoes/workboots
+ l_ear = /obj/item/device/radio/headset/headset_cargo/mining
+ id = /obj/item/weapon/card/id/supply
+ l_pocket = /obj/item/weapon/reagent_containers/food/pill/patch/styptic
+ r_pocket = /obj/item/device/flashlight/seclite
+ pda = /obj/item/device/pda/shaftminer
+ backpack_contents = list(
+ /obj/item/weapon/mining_voucher = 1,
+ /obj/item/weapon/storage/bag/ore = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
@@ -208,41 +202,53 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/clown
access = list(access_clown, access_theatre, access_maint_tunnels)
minimal_access = list(access_clown, access_theatre, access_maint_tunnels)
+ outfit = /datum/outfit/job/clown
+/datum/outfit/job/clown
+ name = "Clown"
+ jobtype = /datum/job/clown
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/clown(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- if(H.gender == FEMALE)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/sexyclown(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/clothing/under/sexyclown(H), slot_w_uniform)
- else
- H.equip_or_collect(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/clown(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/bikehorn(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/stamp/clown(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/spray/waterflower(H), slot_in_backpack)
- if(H.get_species() == "Machine")
- var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant
- implant = new
- implant.insert(H)
- H.mutations.Add(CLUMSY)
- H.dna.SetSEState(COMICBLOCK,1,1)
- genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED)
- return 1
+ uniform = /obj/item/clothing/under/rank/clown
+ shoes = /obj/item/clothing/shoes/clown_shoes
+ mask = /obj/item/clothing/mask/gas/clown_hat
+ l_ear = /obj/item/device/radio/headset/headset_service
+ id = /obj/item/weapon/card/id/clown
+ pda = /obj/item/device/pda/clown
+ backpack_contents = list(
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1,
+ /obj/item/weapon/bikehorn = 1,
+ /obj/item/weapon/stamp/clown = 1,
+ /obj/item/toy/crayon/rainbow = 1,
+ /obj/item/weapon/storage/fancy/crayons = 1,
+ /obj/item/weapon/reagent_containers/spray/waterflower = 1
+ )
+ backpack = /obj/item/weapon/storage/backpack/clown
+ satchel = /obj/item/weapon/storage/backpack/clown
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/clown
+
+/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.gender == FEMALE)
+ mask = /obj/item/clothing/mask/gas/sexyclown
+ uniform = /obj/item/clothing/under/sexyclown
+
+/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(H.get_species() == "Machine")
+ var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant = new
+ implant.insert(H)
+
+ H.mutations.Add(CLUMSY)
+ H.dna.SetSEState(COMICBLOCK, 1, 1)
+ genemutcheck(H, COMICBLOCK, null, MUTCHK_FORCED)
/datum/job/mime
@@ -253,36 +259,47 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/mime
access = list(access_mime, access_theatre, access_maint_tunnels)
minimal_access = list(access_mime, access_theatre, access_maint_tunnels)
+ outfit = /datum/outfit/job/mime
+/datum/outfit/job/mime
+ name = "Mime"
+ jobtype = /datum/job/mime
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/mime(H), slot_back)
- if(H.gender == FEMALE)
- H.equip_or_collect(new /obj/item/clothing/under/sexymime(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(H), slot_wear_mask)
- else
- H.equip_or_collect(new /obj/item/clothing/under/mime(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/mime(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/head/beret(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/toy/crayon/mime(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/cane(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- if(H.mind)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null))
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
- H.mind.miming = 1
- return 1
+ uniform = /obj/item/clothing/under/mime
+ suit = /obj/item/clothing/suit/suspenders
+ back = /obj/item/weapon/storage/backpack/mime
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/beret
+ mask = /obj/item/clothing/mask/gas/mime
+ l_ear = /obj/item/device/radio/headset/headset_service
+ id = /obj/item/weapon/card/id/mime
+ pda = /obj/item/device/pda/mime
+ backpack_contents = list(
+ /obj/item/toy/crayon/mime = 1,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 1,
+ /obj/item/weapon/cane = 1
+ )
+
+/datum/outfit/job/mime/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.gender == FEMALE)
+ uniform = /obj/item/clothing/under/sexymime
+ suit = /obj/item/clothing/mask/gas/sexymime
+
+/datum/outfit/job/mime/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null))
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
+ H.mind.miming = 1
@@ -294,25 +311,21 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
alt_titles = list("Custodial Technician")
+ outfit = /datum/outfit/job/janitor
+/datum/outfit/job/janitor
+ name = "Janitor"
+ jobtype = /datum/job/janitor
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/janitor(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
-
+ uniform = /obj/item/clothing/under/rank/janitor
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ pda = /obj/item/device/pda/janitor
//More or less assistants
@@ -324,28 +337,24 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library, access_maint_tunnels)
alt_titles = list("Journalist")
+ outfit = /datum/outfit/job/librarian
+/datum/outfit/job/librarian
+ name = "Librarian"
+ jobtype = /datum/job/librarian
- equip(var/mob/living/carbon/human/H)
- if(!H)
- return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_r_store)
- H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/suit_jacket/red
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ l_pocket = /obj/item/device/laser_pointer
+ r_pocket = /obj/item/weapon/barcodescanner
+ l_hand = /obj/item/weapon/storage/bag/books
+ pda = /obj/item/device/pda/librarian
/datum/job/barber
title = "Barber"
@@ -355,22 +364,22 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
alt_titles = list("Hair Stylist","Beautician")
access = list(access_maint_tunnels)
minimal_access = list(access_maint_tunnels)
+ outfit = /datum/outfit/job/barber
+/datum/outfit/job/barber
+ name = "Barber"
+ jobtype = /datum/job/barber
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/barber(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/barber(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/lip_stick(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/barber
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ backpack_contents = list(
+ /obj/item/clothing/shoes/black = 1,
+ /obj/item/weapon/storage/box/lip_stick = 1,
+ /obj/item/weapon/storage/box/barber = 1
+ )
diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm
index da9bd5c8ec1..17cc36bb059 100644
--- a/code/game/jobs/job/support_chaplain.dm
+++ b/code/game/jobs/job/support_chaplain.dm
@@ -7,153 +7,161 @@
spawn_positions = 1
is_service = 1
supervisors = "the head of personnel"
+ department_head = list("Head of Personnel")
selection_color = "#dddddd"
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
+ outfit = /datum/outfit/job/chaplain
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H) //BS12 EDIT
- H.equip_or_collect(B, slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/camera/spooky(H), slot_in_backpack)
- spawn(0)
- var/religion_name = "Christianity"
- var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN))
+/datum/outfit/job/chaplain
+ name = "Chaplain"
+ jobtype = /datum/job/chaplain
- if(!new_religion)
- new_religion = religion_name
+ uniform = /obj/item/clothing/under/rank/chaplain
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ pda = /obj/item/device/pda/chaplain
+ backpack_contents = list(
+ /obj/item/device/camera/spooky = 1
+ )
- switch(lowertext(new_religion))
- if("christianity")
- B.name = pick("The Holy Bible")
- if("satanism")
- B.name = "The Unholy Bible"
- if("cthulu")
- B.name = "The Necronomicon"
- if("islam")
- B.name = "Quran"
- if("scientology")
- B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
- if("chaos")
- B.name = "The Book of Lorgar"
- if("imperium")
- B.name = "Uplifting Primer"
- if("toolboxia")
- B.name = "Toolbox Manifesto Robusto"
- if("homosexuality")
- B.name = "Guys Gone Wild"
- if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
- B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
- H.setBrainLoss(99) // starts off retarded as fuck
- if("science")
- B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
+/datum/outfit/job/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H)
+
+ spawn()
+ H.equip_to_slot_or_del(B, slot_l_hand)
+
+ var/religion_name = "Christianity"
+ var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN))
+
+ if(!new_religion)
+ new_religion = religion_name
+
+ switch(lowertext(new_religion))
+ if("christianity")
+ B.name = pick("The Holy Bible")
+ if("satanism")
+ B.name = "The Unholy Bible"
+ if("cthulu")
+ B.name = "The Necronomicon"
+ if("islam")
+ B.name = "Quran"
+ if("scientology")
+ B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
+ if("chaos")
+ B.name = "The Book of Lorgar"
+ if("imperium")
+ B.name = "Uplifting Primer"
+ if("toolboxia")
+ B.name = "Toolbox Manifesto Robusto"
+ if("homosexuality")
+ B.name = "Guys Gone Wild"
+ if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
+ B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
+ H.setBrainLoss(99) // starts off retarded as fuck
+ if("science")
+ B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
+ else
+ B.name = "The Holy Book of [new_religion]"
+ feedback_set_details("religion_name","[new_religion]")
+
+ var/deity_name = "Space Jesus"
+ var/new_deity = sanitize(copytext(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN))
+
+ if((length(new_deity) == 0) || (new_deity == "Space Jesus") )
+ new_deity = deity_name
+ B.deity_name = new_deity
+
+ var/accepted = 0
+ var/outoftime = 0
+ spawn(200) // 20 seconds to choose
+ outoftime = 1
+ var/new_book_style = "Bible"
+
+ while(!accepted)
+ if(!B) break // prevents possible runtime errors
+ new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon", "Greentext")
+ switch(new_book_style)
+ if("Koran")
+ B.icon_state = "koran"
+ B.item_state = "koran"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 4
+ if("Scrapbook")
+ B.icon_state = "scrapbook"
+ B.item_state = "scrapbook"
+ if("Creeper")
+ B.icon_state = "creeper"
+ B.item_state = "syringe_kit"
+ if("White Bible")
+ B.icon_state = "white"
+ B.item_state = "syringe_kit"
+ if("Holy Light")
+ B.icon_state = "holylight"
+ B.item_state = "syringe_kit"
+ if("Athiest")
+ B.icon_state = "athiest"
+ B.item_state = "syringe_kit"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 10
+ if("Tome")
+ B.icon_state = "tome"
+ B.item_state = "syringe_kit"
+ if("The King in Yellow")
+ B.icon_state = "kingyellow"
+ B.item_state = "kingyellow"
+ if("Ithaqua")
+ B.icon_state = "ithaqua"
+ B.item_state = "ithaqua"
+ if("Scientology")
+ B.icon_state = "scientology"
+ B.item_state = "scientology"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 8
+ if("the bible melts")
+ B.icon_state = "melted"
+ B.item_state = "melted"
+ if("Necronomicon")
+ B.icon_state = "necronomicon"
+ B.item_state = "necronomicon"
+ if("Greentext")
+ B.icon_state = "greentext"
+ B.item_state = "greentext"
else
- B.name = "The Holy Book of [new_religion]"
- feedback_set_details("religion_name","[new_religion]")
+ // if christian bible, revert to default
+ B.icon_state = "bible"
+ B.item_state = "bible"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 2
- spawn(1)
- var/deity_name = "Space Jesus"
- var/new_deity = sanitize(copytext(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN))
+ H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
- if((length(new_deity) == 0) || (new_deity == "Space Jesus") )
- new_deity = deity_name
- B.deity_name = new_deity
-
- var/accepted = 0
- var/outoftime = 0
- spawn(200) // 20 seconds to choose
- outoftime = 1
- var/new_book_style = "Bible"
-
- while(!accepted)
- if(!B) break // prevents possible runtime errors
- new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon", "Greentext")
- switch(new_book_style)
- if("Koran")
- B.icon_state = "koran"
- B.item_state = "koran"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 4
- if("Scrapbook")
- B.icon_state = "scrapbook"
- B.item_state = "scrapbook"
- if("Creeper")
- B.icon_state = "creeper"
- B.item_state = "syringe_kit"
- if("White Bible")
- B.icon_state = "white"
- B.item_state = "syringe_kit"
- if("Holy Light")
- B.icon_state = "holylight"
- B.item_state = "syringe_kit"
- if("Athiest")
- B.icon_state = "athiest"
- B.item_state = "syringe_kit"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 10
- if("Tome")
- B.icon_state = "tome"
- B.item_state = "syringe_kit"
- if("The King in Yellow")
- B.icon_state = "kingyellow"
- B.item_state = "kingyellow"
- if("Ithaqua")
- B.icon_state = "ithaqua"
- B.item_state = "ithaqua"
- if("Scientology")
- B.icon_state = "scientology"
- B.item_state = "scientology"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 8
- if("the bible melts")
- B.icon_state = "melted"
- B.item_state = "melted"
- if("Necronomicon")
- B.icon_state = "necronomicon"
- B.item_state = "necronomicon"
- if("Greentext")
- B.icon_state = "greentext"
- B.item_state = "greentext"
- else
- // if christian bible, revert to default
- B.icon_state = "bible"
- B.item_state = "bible"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 2
-
- H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
-
- switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
- if("Yes")
+ switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ accepted = 1
+ if("No")
+ if(outoftime)
+ to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.")
accepted = 1
- if("No")
- if(outoftime)
- to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.")
- accepted = 1
- if(ticker)
- ticker.Bible_icon_state = B.icon_state
- ticker.Bible_item_state = B.item_state
- ticker.Bible_name = B.name
- ticker.Bible_deity_name = B.deity_name
- feedback_set_details("religion_deity","[new_deity]")
- feedback_set_details("religion_book","[new_book_style]")
- return 1
+ if(ticker)
+ ticker.Bible_icon_state = B.icon_state
+ ticker.Bible_item_state = B.item_state
+ ticker.Bible_name = B.name
+ ticker.Bible_deity_name = B.deity_name
+ feedback_set_details("religion_deity","[new_deity]")
+ feedback_set_details("religion_book","[new_book_style]")
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 3f5713f295f..433b2adfb27 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -1,3 +1,4 @@
+
var/global/datum/controller/occupations/job_master
#define GET_RANDOM_JOB 0
@@ -5,560 +6,482 @@ var/global/datum/controller/occupations/job_master
#define RETURN_TO_LOBBY 2
/datum/controller/occupations
- //List of all jobs
+ //List of all jobs
var/list/occupations = list()
- //Players who need jobs
+ var/list/name_occupations = list() //Dict of all jobs, keys are titles
+ var/list/type_occupations = list() //Dict of all jobs, keys are types
+ //Players who need jobs
var/list/unassigned = list()
- //Debug info
+ //Debug info
var/list/job_debug = list()
+/datum/controller/occupations/proc/SetupOccupations(var/list/faction = list("Station"))
+ occupations = list()
- proc/SetupOccupations(var/list/faction = list("Station"))
- occupations = list()
- var/list/all_jobs = subtypesof(/datum/job)
- if(!all_jobs.len)
- to_chat(world, "\red \b Error setting up jobs, no job datums found")
- return 0
- for(var/J in all_jobs)
- var/datum/job/job = new J()
- if(!job) continue
- if(!job.faction in faction) continue
- occupations += job
-
- return 1
-
-
- proc/Debug(var/text)
- if(!Debug2) return 0
- job_debug.Add(text)
- return 1
-
-
- proc/GetJob(var/rank)
- if(!rank) return null
- for(var/datum/job/J in occupations)
- if(!J) continue
- if(J.title == rank) return J
- return null
-
- proc/GetPlayerAltTitle(mob/new_player/player, rank)
- return player.client.prefs.GetPlayerAltTitle(GetJob(rank))
-
- proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
- Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
- if(player && player.mind && rank)
- var/datum/job/job = GetJob(rank)
- if(!job) return 0
- if(jobban_isbanned(player, rank)) return 0
- if(!job.player_old_enough(player.client)) return 0
- if(!is_job_whitelisted(player, rank)) return 0
- var/position_limit = job.total_positions
- if(!latejoin)
- position_limit = job.spawn_positions
- if((job.current_positions < position_limit) || position_limit == -1)
- Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
- player.mind.assigned_role = rank
- player.mind.role_alt_title = GetPlayerAltTitle(player, rank)
-
- // JOB OBJECTIVES OH SHIT
- player.mind.job_objectives.Cut()
- for(var/objectiveType in job.required_objectives)
- new objectiveType(player.mind)
-
- // 50/50 chance of getting optional objectives.
- for(var/objectiveType in job.optional_objectives)
- if(prob(50))
- new objectiveType(player.mind)
-
- unassigned -= player
- job.current_positions++
- return 1
- Debug("AR has failed, Player: [player], Rank: [rank]")
+ var/list/all_jobs = subtypesof(/datum/job)
+ if(!all_jobs.len)
+ to_chat(world, "Error setting up jobs, no job datums found ")
return 0
- proc/FreeRole(var/rank) //making additional slot on the fly
- var/datum/job/job = GetJob(rank)
- if(job && job.current_positions >= job.total_positions && job.total_positions != -1)
- job.total_positions++
- return 1
+ for(var/J in all_jobs)
+ var/datum/job/job = new J()
+ if(!job)
+ continue
+ if(!job.faction in faction)
+ continue
+ occupations += job
+ name_occupations[job.title] = job
+ type_occupations[J] = job
+
+ return 1
+
+
+/datum/controller/occupations/proc/Debug(var/text)
+ if(!Debug2)
return 0
+ job_debug.Add(text)
+ return 1
- proc/FindOccupationCandidates(datum/job/job, level, flag)
- Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
- var/list/candidates = list()
- for(var/mob/new_player/player in unassigned)
- Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]")
- if(jobban_isbanned(player, job.title))
- Debug("FOC isbanned failed, Player: [player]")
- continue
- if(!job.player_old_enough(player.client))
- Debug("FOC player not old enough, Player: [player]")
- continue
- if(flag && !(flag in player.client.prefs.be_special))
- Debug("FOC flag failed, Player: [player], Flag: [flag], ")
- continue
- if(player.mind && job.title in player.mind.restricted_roles)
- Debug("FOC incompatbile with antagonist role, Player: [player]")
- continue
- if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
- Debug("FOC pass, Player: [player], Level:[level]")
- candidates += player
- return candidates
- proc/GiveRandomJob(var/mob/new_player/player)
- Debug("GRJ Giving random job, Player: [player]")
- for(var/datum/job/job in shuffle(occupations))
- if(!job)
- continue
-
- if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring!
- continue
-
- if(job.title in command_positions) //If you want a command position, select it!
- continue
-
- if(job.title in whitelisted_positions) // No random whitelisted job, sorry!
- continue
-
- if(job.admin_only) // No admin positions either.
- continue
-
- if(job.available_in_playtime(player.client))
- continue
-
- if(jobban_isbanned(player, job.title))
- Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
- continue
-
- if(!job.player_old_enough(player.client))
- Debug("GRJ player not old enough, Player: [player]")
- continue
-
- if(player.mind && job.title in player.mind.restricted_roles)
- Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
- continue
-
- if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
- Debug("GRJ Random job given, Player: [player], Job: [job]")
- AssignRole(player, job.title)
- unassigned -= player
- break
-
- proc/ResetOccupations()
- for(var/mob/new_player/player in player_list)
- if((player) && (player.mind))
- player.mind.assigned_role = null
- player.mind.special_role = null
+/datum/controller/occupations/proc/GetJob(rank)
+ if(!occupations.len)
SetupOccupations()
- unassigned = list()
- return
+ return name_occupations[rank]
+/datum/controller/occupations/proc/GetJobType(jobtype)
+ if(!occupations.len)
+ SetupOccupations()
+ return type_occupations[jobtype]
- ///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
- proc/FillHeadPosition()
- for(var/level = 1 to 3)
- for(var/command_position in command_positions)
- var/datum/job/job = GetJob(command_position)
- if(!job) continue
- var/list/candidates = FindOccupationCandidates(job, level)
- if(!candidates.len) continue
+/datum/controller/occupations/proc/GetPlayerAltTitle(mob/new_player/player, rank)
+ return player.client.prefs.GetPlayerAltTitle(GetJob(rank))
- // Build a weighted list, weight by age.
- var/list/weightedCandidates = list()
-
- // Different head positions have different good ages.
- var/good_age_minimal = 25
- var/good_age_maximal = 60
- if(command_position == "Captain")
- good_age_minimal = 30
- good_age_maximal = 70 // Old geezer captains ftw
-
- for(var/mob/V in candidates)
- // Log-out during round-start? What a bad boy, no head position for you!
- if(!V.client) continue
- var/age = V.client.prefs.age
- switch(age)
- if(good_age_minimal - 10 to good_age_minimal)
- weightedCandidates[V] = 3 // Still a bit young.
- if(good_age_minimal to good_age_minimal + 10)
- weightedCandidates[V] = 6 // Better.
- if(good_age_minimal + 10 to good_age_maximal - 10)
- weightedCandidates[V] = 10 // Great.
- if(good_age_maximal - 10 to good_age_maximal)
- weightedCandidates[V] = 6 // Still good.
- if(good_age_maximal to good_age_maximal + 10)
- weightedCandidates[V] = 6 // Bit old, don't you think?
- if(good_age_maximal to good_age_maximal + 50)
- weightedCandidates[V] = 3 // Geezer.
- else
- // If there's ABSOLUTELY NOBODY ELSE
- if(candidates.len == 1) weightedCandidates[V] = 1
-
-
- var/mob/new_player/candidate = pickweight(weightedCandidates)
- if(AssignRole(candidate, command_position))
- return 1
- return 0
-
-
- ///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
- proc/CheckHeadPositions(var/level)
- for(var/command_position in command_positions)
- var/datum/job/job = GetJob(command_position)
- if(!job) continue
- var/list/candidates = FindOccupationCandidates(job, level)
- if(!candidates.len) continue
- var/mob/new_player/candidate = pick(candidates)
- AssignRole(candidate, command_position)
- return
-
-
- proc/FillAIPosition()
- var/ai_selected = 0
- var/datum/job/job = GetJob("AI")
+/datum/controller/occupations/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
+ Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
+ if(player && player.mind && rank)
+ var/datum/job/job = GetJob(rank)
if(!job)
return 0
- if((job.title == "AI") && (config) && (!config.allow_ai))
+ if(jobban_isbanned(player, rank))
return 0
- for(var/i = job.total_positions, i > 0, i--)
- for(var/level = 1 to 3)
- var/list/candidates = list()
- candidates = FindOccupationCandidates(job, level)
- if(candidates.len)
- var/mob/new_player/candidate = pick(candidates)
- if(AssignRole(candidate, "AI"))
- ai_selected++
- break
- if(ai_selected) return 1
+ if(!job.player_old_enough(player.client))
return 0
+ if(job.available_in_playtime(player.client))
+ return 0
+ if(!is_job_whitelisted(player, rank))
+ return 0
+
+ var/position_limit = job.total_positions
+ if(!latejoin)
+ position_limit = job.spawn_positions
+
+ if((job.current_positions < position_limit) || position_limit == -1)
+ Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
+ player.mind.assigned_role = rank
+ player.mind.role_alt_title = GetPlayerAltTitle(player, rank)
+
+ // JOB OBJECTIVES OH SHIT
+ player.mind.job_objectives.Cut()
+ for(var/objectiveType in job.required_objectives)
+ new objectiveType(player.mind)
+
+ // 50/50 chance of getting optional objectives.
+ for(var/objectiveType in job.optional_objectives)
+ if(prob(50))
+ new objectiveType(player.mind)
+
+ unassigned -= player
+ job.current_positions++
+ return 1
+
+ Debug("AR has failed, Player: [player], Rank: [rank]")
+ return 0
+
+/datum/controller/occupations/proc/FreeRole(var/rank) //making additional slot on the fly
+ var/datum/job/job = GetJob(rank)
+ if(job && job.current_positions >= job.total_positions && job.total_positions != -1)
+ job.total_positions++
+ return 1
+ return 0
+
+/datum/controller/occupations/proc/FindOccupationCandidates(datum/job/job, level, flag)
+ Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
+ var/list/candidates = list()
+ for(var/mob/new_player/player in unassigned)
+ Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] AvInPlaytime: [job.available_in_playtime(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]")
+ if(jobban_isbanned(player, job.title))
+ Debug("FOC isbanned failed, Player: [player]")
+ continue
+ if(!job.player_old_enough(player.client))
+ Debug("FOC player not old enough, Player: [player]")
+ continue
+ if(job.available_in_playtime(player.client))
+ Debug("FOC player not enough playtime, Player: [player]")
+ continue
+ if(flag && !(flag in player.client.prefs.be_special))
+ Debug("FOC flag failed, Player: [player], Flag: [flag], ")
+ continue
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("FOC incompatbile with antagonist role, Player: [player]")
+ continue
+ if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
+ Debug("FOC pass, Player: [player], Level:[level]")
+ candidates += player
+ return candidates
+
+/datum/controller/occupations/proc/GiveRandomJob(var/mob/new_player/player)
+ Debug("GRJ Giving random job, Player: [player]")
+ for(var/datum/job/job in shuffle(occupations))
+ if(!job)
+ continue
+
+ if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring!
+ continue
+
+ if(job.title in command_positions) //If you want a command position, select it!
+ continue
+
+ if(job.title in whitelisted_positions) // No random whitelisted job, sorry!
+ continue
+
+ if(job.admin_only) // No admin positions either.
+ continue
+
+ if(jobban_isbanned(player, job.title))
+ Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
+ continue
+
+ if(!job.player_old_enough(player.client))
+ Debug("GRJ player not old enough, Player: [player]")
+ continue
+
+ if(job.available_in_playtime(player.client))
+ Debug("GRJ player not enough playtime, Player: [player]")
+ continue
+
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
+ continue
+
+ if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
+ Debug("GRJ Random job given, Player: [player], Job: [job]")
+ AssignRole(player, job.title)
+ unassigned -= player
+ break
+
+/datum/controller/occupations/proc/ResetOccupations()
+ for(var/mob/new_player/player in player_list)
+ if((player) && (player.mind))
+ player.mind.assigned_role = null
+ player.mind.special_role = null
+ SetupOccupations()
+ unassigned = list()
+ return
+
+
+///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
+/datum/controller/occupations/proc/FillHeadPosition()
+ for(var/level = 1 to 3)
+ for(var/command_position in command_positions)
+ var/datum/job/job = GetJob(command_position)
+ if(!job)
+ continue
+ var/list/candidates = FindOccupationCandidates(job, level)
+ if(!candidates.len)
+ continue
+
+ // Build a weighted list, weight by age.
+ var/list/weightedCandidates = list()
+
+ // Different head positions have different good ages.
+ var/good_age_minimal = 25
+ var/good_age_maximal = 60
+ if(command_position == "Captain")
+ good_age_minimal = 30
+ good_age_maximal = 70 // Old geezer captains ftw
+
+ for(var/mob/V in candidates)
+ // Log-out during round-start? What a bad boy, no head position for you!
+ if(!V.client)
+ continue
+ var/age = V.client.prefs.age
+ switch(age)
+ if(good_age_minimal - 10 to good_age_minimal)
+ weightedCandidates[V] = 3 // Still a bit young.
+ if(good_age_minimal to good_age_minimal + 10)
+ weightedCandidates[V] = 6 // Better.
+ if(good_age_minimal + 10 to good_age_maximal - 10)
+ weightedCandidates[V] = 10 // Great.
+ if(good_age_maximal - 10 to good_age_maximal)
+ weightedCandidates[V] = 6 // Still good.
+ if(good_age_maximal to good_age_maximal + 10)
+ weightedCandidates[V] = 6 // Bit old, don't you think?
+ if(good_age_maximal to good_age_maximal + 50)
+ weightedCandidates[V] = 3 // Geezer.
+ else
+ // If there's ABSOLUTELY NOBODY ELSE
+ if(candidates.len == 1)
+ weightedCandidates[V] = 1
+
+ var/mob/new_player/candidate = pickweight(weightedCandidates)
+ if(AssignRole(candidate, command_position))
+ return 1
+
+ return 0
+
+
+///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
+/datum/controller/occupations/proc/CheckHeadPositions(var/level)
+ for(var/command_position in command_positions)
+ var/datum/job/job = GetJob(command_position)
+ if(!job)
+ continue
+ var/list/candidates = FindOccupationCandidates(job, level)
+ if(!candidates.len)
+ continue
+ var/mob/new_player/candidate = pick(candidates)
+ AssignRole(candidate, command_position)
+
+
+/datum/controller/occupations/proc/FillAIPosition()
+ if(config && !config.allow_ai)
+ return 0
+
+ var/ai_selected = 0
+ var/datum/job/job = GetJob("AI")
+ if(!job)
+ return 0
+
+ for(var/i = job.total_positions, i > 0, i--)
+ for(var/level = 1 to 3)
+ var/list/candidates = list()
+ candidates = FindOccupationCandidates(job, level)
+ if(candidates.len)
+ var/mob/new_player/candidate = pick(candidates)
+ if(AssignRole(candidate, "AI"))
+ ai_selected++
+ break
+
+ if(ai_selected)
+ return 1
+
+ return 0
/** Proc DivideOccupations
- * fills var "assigned_role" for all ready players.
- * This proc must not have any side effect besides of modifying "assigned_role".
- **/
- proc/DivideOccupations()
- //Setup new player list and get the jobs list
- Debug("Running DO")
- SetupOccupations()
+* fills var "assigned_role" for all ready players.
+* This proc must not have any side effect besides of modifying "assigned_role".
+**/
+/datum/controller/occupations/proc/DivideOccupations()
+ //Setup new player list and get the jobs list
+ Debug("Running DO")
+ SetupOccupations()
- //Holder for Triumvirate is stored in the ticker, this just processes it
- if(ticker)
- for(var/datum/job/ai/A in occupations)
- if(ticker.triai)
- A.spawn_positions = 3
+ //Holder for Triumvirate is stored in the ticker, this just processes it
+ if(ticker)
+ for(var/datum/job/ai/A in occupations)
+ if(ticker.triai)
+ A.spawn_positions = 3
- //Get the players who are ready
- for(var/mob/new_player/player in player_list)
- if(player.ready && player.mind && !player.mind.assigned_role)
- unassigned += player
- if(player.client.prefs.randomslot) player.client.prefs.random_character(player.client)
- Debug("DO, Len: [unassigned.len]")
- if(unassigned.len == 0) return 0
+ //Get the players who are ready
+ for(var/mob/new_player/player in player_list)
+ if(player.ready && player.mind && !player.mind.assigned_role)
+ unassigned += player
+ if(player.client.prefs.randomslot)
+ player.client.prefs.load_random_character_slot(player.client)
- //Shuffle players and jobs
- unassigned = shuffle(unassigned)
+ Debug("DO, Len: [unassigned.len]")
+ if(unassigned.len == 0)
+ return 0
- HandleFeedbackGathering()
+ //Shuffle players and jobs
+ unassigned = shuffle(unassigned)
- //People who wants to be assistants, sure, go on.
- Debug("DO, Running Civilian Check 1")
- var/datum/job/civ = new /datum/job/civilian()
- var/list/civilian_candidates = FindOccupationCandidates(civ, 3)
- Debug("AC1, Candidates: [civilian_candidates.len]")
- for(var/mob/new_player/player in civilian_candidates)
- Debug("AC1 pass, Player: [player]")
- AssignRole(player, "Civilian")
- civilian_candidates -= player
- Debug("DO, AC1 end")
+ HandleFeedbackGathering()
- //Select one head
- Debug("DO, Running Head Check")
- FillHeadPosition()
- Debug("DO, Head Check end")
+ //People who wants to be assistants, sure, go on.
+ Debug("DO, Running Civilian Check 1")
+ var/datum/job/civ = new /datum/job/civilian()
+ var/list/civilian_candidates = FindOccupationCandidates(civ, 3)
+ Debug("AC1, Candidates: [civilian_candidates.len]")
+ for(var/mob/new_player/player in civilian_candidates)
+ Debug("AC1 pass, Player: [player]")
+ AssignRole(player, "Civilian")
+ civilian_candidates -= player
+ Debug("DO, AC1 end")
- //Check for an AI
- Debug("DO, Running AI Check")
- FillAIPosition()
- Debug("DO, AI Check end")
+ //Select one head
+ Debug("DO, Running Head Check")
+ FillHeadPosition()
+ Debug("DO, Head Check end")
- //Other jobs are now checked
- Debug("DO, Running Standard Check")
+ //Check for an AI
+ Debug("DO, Running AI Check")
+ FillAIPosition()
+ Debug("DO, AI Check end")
+
+ //Other jobs are now checked
+ Debug("DO, Running Standard Check")
- // New job giving system by Donkie
- // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all.
- // Hopefully this will add more randomness and fairness to job giving.
+ // New job giving system by Donkie
+ // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all.
+ // Hopefully this will add more randomness and fairness to job giving.
- // Loop through all levels from high to low
- var/list/shuffledoccupations = shuffle(occupations)
- for(var/level = 1 to 3)
- //Check the head jobs first each level
- CheckHeadPositions(level)
+ // Loop through all levels from high to low
+ var/list/shuffledoccupations = shuffle(occupations)
+ for(var/level = 1 to 3)
+ //Check the head jobs first each level
+ CheckHeadPositions(level)
- // Loop through all unassigned players
- for(var/mob/new_player/player in unassigned)
-
- // Loop through all jobs
- for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
- if(!job)
- continue
-
- if(jobban_isbanned(player, job.title))
- Debug("DO isbanned failed, Player: [player], Job:[job.title]")
- continue
-
- if(!job.player_old_enough(player.client))
- Debug("DO player not old enough, Player: [player], Job:[job.title]")
- continue
-
- if(player.mind && job.title in player.mind.restricted_roles)
- Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
- continue
-
- if(!is_job_whitelisted(player, job.title))
- Debug("DO player not whitelisted, Player: [player], Job:[job.title]")
- continue
-
- // If the player wants that job on this level, then try give it to him.
- if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
-
- // If the job isn't filled
- if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
- Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
- Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]")
- AssignRole(player, job.title)
- unassigned -= player
- break
-
- // Hand out random jobs to the people who didn't get any in the last check
- // Also makes sure that they got their preference correct
+ // Loop through all unassigned players
for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == GET_RANDOM_JOB)
- GiveRandomJob(player)
- /*
- Old job system
- for(var/level = 1 to 3)
- for(var/datum/job/job in occupations)
- Debug("Checking job: [job]")
+
+ // Loop through all jobs
+ for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
if(!job)
continue
- if(!unassigned.len)
- break
- if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1)
+
+ if(jobban_isbanned(player, job.title))
+ Debug("DO isbanned failed, Player: [player], Job:[job.title]")
continue
- var/list/candidates = FindOccupationCandidates(job, level)
- while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1))
- var/mob/new_player/candidate = pick(candidates)
- Debug("Selcted: [candidate], for: [job.title]")
- AssignRole(candidate, job.title)
- candidates -= candidate*/
- Debug("DO, Standard Check end")
+ if(!job.player_old_enough(player.client))
+ Debug("DO player not old enough, Player: [player], Job:[job.title]")
+ continue
- Debug("DO, Running AC2")
+ if(job.available_in_playtime(player.client))
+ Debug("DO player not enough playtime, Player: [player], Job:[job.title]")
+ continue
- // Antags, who have to get in, come first
- for(var/mob/new_player/player in unassigned)
- if(player.mind.special_role)
- GiveRandomJob(player)
- if(player in unassigned)
- AssignRole(player, "Civilian")
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
+ continue
- // Then we assign what we can to everyone else.
- for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == BE_ASSISTANT)
- Debug("AC2 Assistant located, Player: [player]")
+ if(!is_job_whitelisted(player, job.title))
+ Debug("DO player not whitelisted, Player: [player], Job:[job.title]")
+ continue
+
+ // If the player wants that job on this level, then try give it to him.
+ if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
+
+ // If the job isn't filled
+ if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
+ Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
+ Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]")
+ AssignRole(player, job.title)
+ unassigned -= player
+ break
+
+ // Hand out random jobs to the people who didn't get any in the last check
+ // Also makes sure that they got their preference correct
+ for(var/mob/new_player/player in unassigned)
+ if(player.client.prefs.alternate_option == GET_RANDOM_JOB)
+ GiveRandomJob(player)
+
+ Debug("DO, Standard Check end")
+
+ Debug("DO, Running AC2")
+
+ // Antags, who have to get in, come first
+ for(var/mob/new_player/player in unassigned)
+ if(player.mind.special_role)
+ GiveRandomJob(player)
+ if(player in unassigned)
AssignRole(player, "Civilian")
- else if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
- player.ready = 0
- unassigned -= player
- return 1
+
+ // Then we assign what we can to everyone else.
+ for(var/mob/new_player/player in unassigned)
+ if(player.client.prefs.alternate_option == BE_ASSISTANT)
+ Debug("AC2 Assistant located, Player: [player]")
+ AssignRole(player, "Civilian")
+ else if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
+ player.ready = 0
+ unassigned -= player
+
+ return 1
- proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
- if(!H) return null
- var/datum/job/job = GetJob(rank)
- var/list/spawn_in_storage = list()
+/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
+ if(!H)
+ return null
- if(job)
+ var/datum/job/job = GetJob(rank)
- //Equip custom gear loadout.
- var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage.
- var/list/custom_equip_leftovers = list()
- if(H.client.prefs.gear && H.client.prefs.gear.len && job.title != "Cyborg" && job.title != "AI")
- for(var/thing in H.client.prefs.gear)
- var/datum/gear/G = gear_datums[thing]
- if(G)
- var/permitted
- if(G.allowed_roles)
- for(var/job_name in G.allowed_roles)
- if(job.title == job_name)
- permitted = 1
- else
- permitted = 1
+ H.job = rank
- if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
- permitted = 0
+ if(!joined_late)
+ var/turf/T = null
+ var/obj/S = null
+ for(var/obj/effect/landmark/start/sloc in landmarks_list)
+ if(sloc.name != rank)
+ continue
+ if(locate(/mob/living) in sloc.loc)
+ continue
+ S = sloc
+ break
+ if(!S)
+ S = locate("start*[rank]") // use old stype
+ if(!S) // still no spawn, fall back to the arrivals shuttle
+ for(var/turf/TS in get_area_turfs(/area/shuttle/arrival))
+ if(!TS.density)
+ var/clear = 1
+ for(var/obj/O in TS)
+ if(O.density)
+ clear = 0
+ break
+ if(clear)
+ T = TS
+ continue
- if(!permitted)
- to_chat(H, "Your current job or whitelist status does not permit you to spawn with [thing]! ")
- continue
+ if(isturf(S))
+ T = S
+ else if(istype(S, /obj/effect/landmark/start) && isturf(S.loc))
+ T = S.loc
- if(G.slot && !(G.slot in custom_equip_slots))
- // This is a miserable way to fix the loadout overwrite bug, but the alternative requires
- // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
- if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
- custom_equip_leftovers += thing
- else if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot))
- to_chat(H, "Equipping you with \the [thing]! ")
- custom_equip_slots.Add(G.slot)
- else
- custom_equip_leftovers.Add(thing)
- else
- spawn_in_storage += thing
-
- job.equip(H)
- job.apply_fingerprints(H)
-
- //If some custom items could not be equipped before, try again now.
- for(var/thing in custom_equip_leftovers)
- var/datum/gear/G = gear_datums[thing]
- if(G.slot in custom_equip_slots)
- spawn_in_storage += thing
- else
- var/metadata = H.client.prefs.gear[G.display_name]
- if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
- to_chat(H, "Equipping you with \the [thing]! ")
- custom_equip_slots.Add(G.slot)
- else
- spawn_in_storage += thing
- else
- to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.")
-
- H.job = rank
-
- if(!joined_late)
- var/obj/S = null
- for(var/obj/effect/landmark/start/sloc in landmarks_list)
- if(sloc.name != rank) continue
- if(locate(/mob/living) in sloc.loc) continue
- S = sloc
- break
- if(!S)
- S = locate("start*[rank]") // use old stype
- if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf))
- H.loc = S.loc
+ if(T)
+ H.loc = T
// Moving wheelchair if they have one
if(H.buckled && istype(H.buckled, /obj/structure/stool/bed/chair/wheelchair))
H.buckled.loc = H.loc
H.buckled.dir = H.dir
- var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
- if(H.mind)
- var/remembered_info = ""
+ var/alt_title = null
+ if(H.mind)
+ H.mind.assigned_role = rank
+ alt_title = H.mind.role_alt_title
- remembered_info += "Your account number is: #[M.account_number] "
- remembered_info += "Your account pin is: [M.remote_access_pin] "
- remembered_info += "Your account funds are: $[M.money] "
+ CreateMoneyAccount(H, rank, job)
- if(M.transaction_log.len)
- var/datum/transaction/T = M.transaction_log[1]
- remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal] "
- H.mind.store_memory(remembered_info)
+ if(job)
+ var/new_mob = job.equip(H)
+ if(ismob(new_mob))
+ H = new_mob
- H.mind.initial_account = M
+ to_chat(H, "You are the [alt_title ? alt_title : rank]. ")
+ to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this. ")
+ to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP) ")
+ if(job.is_service)
+ to_chat(H, "As a member of Service, make sure to read up on your Department SOP ")
+ if(job.is_supply)
+ to_chat(H, "As a member of Supply, make sure to read up on your Department SOP ")
+ if(job.is_command)
+ to_chat(H, "As an important member of Command, read up on your Department SOP ")
+ if(job.is_legal)
+ to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure ")
+ if(job.is_engineering)
+ to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP ")
+ if(job.is_medical)
+ to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP ")
+ if(job.is_science)
+ to_chat(H, "As a member of Science, make sure to read up on your Department SOP ")
+ if(job.is_security)
+ to_chat(H, "As a member of Security, you are to know Space Law , Legal Standard Operating Procedure , as well as your Department SOP ")
+ if(job.req_admin_notify)
+ to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp. ")
- // If they're head, give them the account info for their department
- if(H.mind && job.head_position)
- var/remembered_info = ""
- var/datum/money_account/department_account = department_accounts[job.department]
-
- if(department_account)
- remembered_info += "Your department's account number is: #[department_account.account_number] "
- remembered_info += "Your department's account pin is: [department_account.remote_access_pin] "
- remembered_info += "Your department's account funds are: $[department_account.money] "
-
- H.mind.store_memory(remembered_info)
-
- spawn(0)
- to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin] ")
-
- var/alt_title = null
- if(H.mind)
- H.mind.assigned_role = rank
- alt_title = H.mind.role_alt_title
-
- switch(rank)
- if("Cyborg")
- return H.Robotize()
- if("AI")
- return H
- if("Clown") //don't need bag preference stuff!
- if(rank=="Clown") // Clowns DO need to breathe, though - N3X
- H.species.equip(H)
- else
- switch(H.backbag) //BS12 EDIT
- if(1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- if(3)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel_norm(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- if(4)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- H.species.equip(H)
-
- //Deferred item spawning.
- for(var/thing in spawn_in_storage)
- var/datum/gear/G = gear_datums[thing]
- var/metadata = H.client.prefs.gear[G.display_name]
- var/item = G.spawn_item(null, metadata)
-
- var/atom/placed_in = H.equip_or_collect(item)
- if(placed_in)
- to_chat(H, "Placing \the [item] in your [placed_in.name]! ")
- continue
- if(H.equip_to_appropriate_slot(item))
- to_chat(H, "Placing \the [item] in your inventory! ")
- continue
- if(H.put_in_hands(item))
- to_chat(H, "Placing \the [item] in your hands! ")
- continue
- to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug. ")
- qdel(item)
-
-
- to_chat(H, "You are the [alt_title ? alt_title : rank]. ")
- to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this. ")
- to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP) ")
- if(job.is_service)
- to_chat(H, "As a member of Service, make sure to read up on your Department SOP ")
- if(job.is_supply)
- to_chat(H, "As a member of Supply, make sure to read up on your Department SOP ")
- if(job.is_command)
- to_chat(H, "As an important member of Command, read up on your Department SOP ")
- if(job.is_legal)
- to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure ")
- if(job.is_engineering)
- to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP ")
- if(job.is_medical)
- to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP ")
- if(job.is_science)
- to_chat(H, "As a member of Science, make sure to read up on your Department SOP ")
- if(job.is_security)
- to_chat(H, "As a member of Security, you are to know Space Law , Legal Standard Operating Procedure , as well as your Department SOP ")
- if(job.req_admin_notify)
- to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp. ")
-
- spawnId(H, rank, alt_title)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
+ if(job && H)
+ job.after_spawn(H)
//Gives glasses to the vision impaired
if(H.disabilities & DISABILITY_FLAG_NEARSIGHTED)
@@ -568,118 +491,107 @@ var/global/datum/controller/occupations/job_master
if(istype(G) && !G.prescription)
G.prescription = 1
G.name = "prescription [G.name]"
- H.regenerate_icons()
-
- H.sec_hud_set_ID()
- H.sec_hud_set_implants()
- return H
+ return H
- proc/spawnId(var/mob/living/carbon/human/H, rank, title)
- if(!H) return 0
- var/obj/item/weapon/card/id/C = null
- var/datum/job/job = null
- for(var/datum/job/J in occupations)
- if(J.title == rank)
- job = J
- break
- if(job)
- if(job.title == "Cyborg")
- return
- else
- C = new job.idtype(H)
- C.access = job.get_access()
+
+/datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
+ if(!config.load_jobs_from_txt)
+ return 0
+
+ var/list/jobEntries = file2list(jobsfile)
+
+ for(var/job in jobEntries)
+ if(!job)
+ continue
+
+ job = trim(job)
+ if(!length(job))
+ continue
+
+ var/pos = findtext(job, "=")
+ var/name = null
+ var/value = null
+
+ if(pos)
+ name = copytext(job, 1, pos)
+ value = copytext(job, pos + 1)
else
- C = new /obj/item/weapon/card/id(H)
- if(C)
- C.registered_name = H.real_name
- C.rank = rank
- C.assignment = title ? title : rank
- C.sex = capitalize(H.gender)
- C.age = H.age
- C.name = "[C.registered_name]'s ID Card ([C.assignment])"
- C.photo = get_id_photo(H)
+ continue
- //put the player's account number onto the ID
- if(H.mind && H.mind.initial_account)
- C.associated_account_number = H.mind.initial_account.account_number
+ if(name && value)
+ var/datum/job/J = GetJob(name)
+ if(!J) continue
+ J.total_positions = text2num(value)
+ J.spawn_positions = text2num(value)
+ if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
+ J.total_positions = 0
- H.equip_to_slot_or_del(C, slot_wear_id)
-
- H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_wear_pda)
- if(locate(/obj/item/device/pda,H))
- var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
- pda.owner = H.real_name
- pda.ownjob = C.assignment
- pda.ownrank = C.rank
- pda.name = "PDA-[H.real_name] ([pda.ownjob])"
-
- return 1
+ return 1
- proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
- if(!config.load_jobs_from_txt)
- return 0
+/datum/controller/occupations/proc/HandleFeedbackGathering()
+ for(var/datum/job/job in occupations)
+ var/tmp_str = "|[job.title]|"
- var/list/jobEntries = file2list(jobsfile)
-
- for(var/job in jobEntries)
- if(!job)
+ var/level1 = 0 //high
+ var/level2 = 0 //medium
+ var/level3 = 0 //low
+ var/level4 = 0 //never
+ var/level5 = 0 //banned
+ var/level6 = 0 //account too young
+ for(var/mob/new_player/player in player_list)
+ if(!(player.ready && player.mind && !player.mind.assigned_role))
+ continue //This player is not ready
+ if(jobban_isbanned(player, job.title))
+ level5++
continue
-
- job = trim(job)
- if(!length(job))
+ if(!job.player_old_enough(player.client))
+ level6++
continue
-
- var/pos = findtext(job, "=")
- var/name = null
- var/value = null
-
- if(pos)
- name = copytext(job, 1, pos)
- value = copytext(job, pos + 1)
- else
+ if(job.available_in_playtime(player.client))
+ level6++
continue
+ if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
+ level1++
+ else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
+ level2++
+ else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
+ level3++
+ else level4++ //not selected
- if(name && value)
- var/datum/job/J = GetJob(name)
- if(!J) continue
- J.total_positions = text2num(value)
- J.spawn_positions = text2num(value)
- if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
- J.total_positions = 0
-
- return 1
+ tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
+ feedback_add_details("job_preferences",tmp_str)
- proc/HandleFeedbackGathering()
- for(var/datum/job/job in occupations)
- var/tmp_str = "|[job.title]|"
+/datum/controller/occupations/proc/CreateMoneyAccount(mob/living/H, rank, datum/job/job)
+ var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
+ var/remembered_info = ""
- var/level1 = 0 //high
- var/level2 = 0 //medium
- var/level3 = 0 //low
- var/level4 = 0 //never
- var/level5 = 0 //banned
- var/level6 = 0 //account too young
- for(var/mob/new_player/player in player_list)
- if(!(player.ready && player.mind && !player.mind.assigned_role))
- continue //This player is not ready
- if(jobban_isbanned(player, job.title))
- level5++
- continue
- if(!job.player_old_enough(player.client))
- level6++
- continue
- if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
- level1++
- else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
- level2++
- else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
- level3++
- else level4++ //not selected
+ remembered_info += "Your account number is: #[M.account_number] "
+ remembered_info += "Your account pin is: [M.remote_access_pin] "
+ remembered_info += "Your account funds are: $[M.money] "
- tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
- feedback_add_details("job_preferences",tmp_str)
+ if(M.transaction_log.len)
+ var/datum/transaction/T = M.transaction_log[1]
+ remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal] "
+ H.mind.store_memory(remembered_info)
+
+ // If they're head, give them the account info for their department
+ if(job.head_position)
+ remembered_info = ""
+ var/datum/money_account/department_account = department_accounts[job.department]
+
+ if(department_account)
+ remembered_info += "Your department's account number is: #[department_account.account_number] "
+ remembered_info += "Your department's account pin is: [department_account.remote_access_pin] "
+ remembered_info += "Your department's account funds are: $[department_account.money] "
+
+ H.mind.store_memory(remembered_info)
+
+ H.mind.initial_account = M
+
+ spawn(0)
+ to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin] ")
diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm
index 746dfcacf44..4a1624426b7 100644
--- a/code/game/jobs/job_exp.dm
+++ b/code/game/jobs/job_exp.dm
@@ -1,22 +1,86 @@
+// Playtime requirements for special roles (hours)
+
+var/global/list/role_playtime_requirements = list(
+ // CREW-FRIENDLY ROLES
+ ROLE_PAI = 0,
+ ROLE_POSIBRAIN = 5, // Same as cyborg job.
+ ROLE_SENTIENT = 5,
+ ROLE_ERT = 10, // High, because they're team-based, and we want ERT to be robust
+ ROLE_TRADER = 5,
+
+ // SOLO ANTAGS
+ ROLE_TRAITOR = 3,
+ ROLE_CHANGELING = 3,
+ ROLE_WIZARD = 3,
+ ROLE_VAMPIRE = 3,
+ ROLE_BLOB = 3,
+ ROLE_REVENANT = 3,
+ ROLE_BORER = 3,
+ ROLE_NINJA = 3,
+ ROLE_MORPH = 3,
+ ROLE_DEMON = 3,
+
+ // DUO ANTAGS
+ ROLE_GUARDIAN = 5,
+ ROLE_GSPIDER = 5,
+
+ // TEAM ANTAGS
+ // Higher numbers here, because they require more experience to be played correctly
+ ROLE_SHADOWLING = 10,
+ ROLE_REV = 10,
+ ROLE_OPERATIVE = 10,
+ ROLE_CULTIST = 10,
+ ROLE_RAIDER = 10,
+ ROLE_ALIEN = 10,
+ ROLE_ABDUCTOR = 10,
+)
+
// Admin Verbs
-/client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are.
+/client/proc/cmd_mentor_check_player_exp() //Allows admins to determine who the newer players are.
set category = "Admin"
set name = "Check Player Playtime"
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN|R_MOD|R_MENTOR))
return
- var/msg = "Playtime Report Playtime:"
+ var/msg = "Playtime Report "
+ var/list/players_new = list()
+ var/list/players_old = list()
+ var/pline
+ var/datum/job/theirjob
+ var/jtext
for(var/client/C in clients)
- msg += " [key_name_admin(C.mob)]: " + C.get_exp_living() + " "
- msg += " "
+ jtext = "No Job"
+ if(C.mob.mind && C.mob.mind.assigned_role)
+ theirjob = job_master.GetJob(C.mob.mind.assigned_role)
+ if(theirjob)
+ jtext = theirjob.title
+ if(config.use_exp_restrictions && theirjob.exp_requirements && theirjob.exp_type)
+ jtext += "* "
+ if(check_rights(R_ADMIN, 0))
+ pline = " [key_name_admin(C.mob)]: [jtext]: " + C.get_exp_living() + " "
+ else
+ pline = " [key_name_mentor(C.mob)]: [jtext]: " + C.get_exp_living() + " "
+ if(C.get_exp_living_num() > 1200)
+ players_old += pline
+ else
+ players_new += pline
+ if(players_new.len)
+ msg += " Players under 20h:"
+ msg += players_new.Join()
+ msg += " "
+ if(players_old.len)
+ msg += " Players over 20h:"
+ msg += players_old.Join()
+ msg += " "
+ msg += ""
src << browse(msg, "window=Player_playtime_check")
-/datum/admins/proc/cmd_show_exp_panel(var/client/C)
+/datum/admins/proc/cmd_mentor_show_exp_panel(var/client/C)
if(!C)
to_chat(usr, "ERROR: Client not found.")
return
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN|R_MOD|R_MENTOR))
return
var/body = "Playtime for [C.key] Playtime:"
body += C.get_exp_report()
@@ -26,6 +90,27 @@
// Procs
+/proc/role_available_in_playtime(client/C, role)
+ if(!C)
+ return 0
+ if(!role)
+ return 0
+ if(!config.use_exp_restrictions)
+ return 0
+ if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, C.mob))
+ return 0
+ var/list/play_records = params2list(C.prefs.exp)
+ var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT])
+ if(isexempt)
+ return 0
+ var/minimal_player_hrs = role_playtime_requirements[role]
+ if(!minimal_player_hrs)
+ return 0
+ var/req_mins = minimal_player_hrs * 60
+ var/my_exp = text2num(play_records[EXP_TYPE_CREW])
+ if(!isnum(my_exp))
+ return req_mins
+ return max(0, req_mins - my_exp)
/datum/job/proc/available_in_playtime(client/C)
if(!C)
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index 73f5cc2e5b0..a9aa142ac1d 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -25,6 +25,7 @@ var/const/VIROLOGIST =(1<<6)
var/const/PSYCHIATRIST =(1<<7)
var/const/ROBOTICIST =(1<<8)
var/const/PARAMEDIC =(1<<9)
+var/const/CORONER =(1<<10)
var/const/SUPPORT =(1<<2)
@@ -84,7 +85,8 @@ var/list/medical_positions = list(
"Psychiatrist",
"Chemist",
"Virologist",
- "Paramedic"
+ "Paramedic",
+ "Coroner"
)
diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm
index 2a99414cb0b..049903b475e 100644
--- a/code/game/jobs/whitelist.dm
+++ b/code/game/jobs/whitelist.dm
@@ -21,13 +21,15 @@ var/list/whitelist = list()
if(guest_jobbans(rank))
if(!config.usewhitelist)
return 1
+ if(config.disable_karma)
+ return 1
if(check_rights(R_ADMIN, 0, M))
return 1
if(!dbcon.IsConnected())
- to_chat(usr, "\red Unable to connect to whitelist database. Please try again later. ")
+ to_chat(usr, "Unable to connect to whitelist database. Please try again later. ")
return 0
else
- var/DBQuery/query = dbcon.NewQuery("SELECT job FROM [format_table_name("whitelist")] WHERE ckey='[M.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT job FROM [format_table_name("whitelist")] WHERE ckey='[M.ckey]'")
query.Execute()
@@ -62,6 +64,8 @@ var/list/whitelist = list()
/proc/is_alien_whitelisted(mob/M, var/species)
if(!config.usealienwhitelist)
return 1
+ if(config.disable_karma)
+ return 1
if(species == "human" || species == "Human")
return 1
if(check_rights(R_ADMIN, 0))
@@ -69,10 +73,10 @@ var/list/whitelist = list()
if(!alien_whitelist)
return 0
if(!dbcon.IsConnected())
- to_chat(usr, "\red Unable to connect to whitelist database. Please try again later. ")
+ to_chat(usr, "Unable to connect to whitelist database. Please try again later. ")
return 0
else
- var/DBQuery/query = dbcon.NewQuery("SELECT species FROM [format_table_name("whitelist")] WHERE ckey='[M.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT species FROM [format_table_name("whitelist")] WHERE ckey='[M.ckey]'")
query.Execute()
while(query.NextRow())
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index a8b3b4f218e..161a1718d63 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -22,9 +22,7 @@
hide(T.intact)
/obj/machinery/bluespace_beacon/Destroy()
- if(Beacon)
- qdel(Beacon)
- Beacon = null
+ QDEL_NULL(Beacon)
return ..()
// update the invisibility and icon
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index 542ed8b47b4..244b3b04977 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -44,7 +44,7 @@
min_temperature = max(0,T0C - (170 + (T*15)))
current_heat_capacity = 1000 * ((H - 1) ** 2)
-/obj/machinery/atmospherics/unary/cold_sink/freezer/construction()
+/obj/machinery/atmospherics/unary/cold_sink/freezer/on_construction()
..(dir,dir)
/obj/machinery/atmospherics/unary/cold_sink/freezer/attackby(obj/item/I, mob/user, params)
@@ -65,7 +65,7 @@
var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
dir = choices[selected]
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
var/node_connect = dir
initialize_directions = dir
for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
@@ -193,7 +193,7 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
-/obj/machinery/atmospherics/unary/heat_reservoir/heater/construction()
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/on_construction()
..(dir,dir)
/obj/machinery/atmospherics/unary/heat_reservoir/heater/RefreshParts()
@@ -224,7 +224,7 @@
var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
dir = choices[selected]
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
var/node_connect = dir
initialize_directions = dir
for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index eb610c771a7..4b332b94543 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -14,6 +14,7 @@
var/obj/machinery/computer/operating/computer = null
buckle_lying = 90
var/no_icon_updates = 0 //set this to 1 if you don't want the icons ever changing
+ var/list/injected_reagents = list()
/obj/machinery/optable/New()
..()
@@ -55,14 +56,14 @@
/obj/machinery/optable/attack_hand(mob/user as mob)
if(HULK in usr.mutations)
- to_chat(usr, text("\blue You destroy the table."))
- visible_message("\red [usr] destroys the operating table!")
+ to_chat(usr, text("You destroy the table. "))
+ visible_message("[usr] destroys the operating table! ")
src.density = 0
qdel(src)
return
-/obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
@@ -97,8 +98,18 @@
icon_state = "table2-idle"
return 0
+/obj/machinery/optable/Crossed(atom/movable/AM)
+ . = ..()
+ if(iscarbon(AM) && LAZYLEN(injected_reagents))
+ to_chat(AM, "You feel a series of tiny pricks! ")
+
/obj/machinery/optable/process()
check_victim()
+ if(LAZYLEN(injected_reagents))
+ for(var/mob/living/carbon/C in get_turf(src))
+ for(var/chemical in injected_reagents)
+ if(C.reagents.get_reagent_amount(chemical) < 1)
+ C.reagents.add_reagent(chemical, 1)
/obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob)
if(C == user)
@@ -139,8 +150,8 @@
qdel(W)
return
if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
to_chat(user, "You deconstruct the table. ")
new /obj/item/stack/sheet/plasteel(loc, 5)
qdel(src)
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 24b233a4b41..4178c9248c0 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -40,9 +40,7 @@
src.colorlist += D
/obj/machinery/pdapainter/Destroy()
- if(storedpda)
- qdel(storedpda)
- storedpda = null
+ QDEL_NULL(storedpda)
return ..()
/obj/machinery/pdapainter/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
@@ -61,7 +59,8 @@
/obj/machinery/pdapainter/attack_hand(mob/user as mob)
- ..()
+ if(..())
+ return 1
src.add_fingerprint(user)
@@ -85,6 +84,9 @@
set category = "Object"
set src in oview(1)
+ if(usr.incapacitated())
+ return
+
if(storedpda)
storedpda.loc = get_turf(src.loc)
storedpda = null
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 2a29e23db73..f74380432d2 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -78,6 +78,11 @@
max_chem = E * 20
min_health = -E * 25
+/obj/machinery/sleeper/Destroy()
+ for(var/mob/M in contents)
+ M.forceMove(get_turf(src))
+ return ..()
+
/obj/machinery/sleeper/relaymove(mob/user as mob)
if(user.incapacitated())
return 0 //maybe they should be able to get out with cuffs, but whatever
@@ -312,7 +317,7 @@
else
orient = "RIGHT"
dir = 4
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, G.usesound, 50, 1)
return
if(exchange_parts(user, G))
@@ -519,7 +524,7 @@
if(do_after(user, 20, target = L))
if(src.occupant)
- to_chat(user, ">The sleeper is already occupied! ")
+ to_chat(user, "The sleeper is already occupied! ")
return
if(!L) return
L.forceMove(src)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index f7b793b6033..41dc37ab43f 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -65,7 +65,7 @@
dir = 8
else
dir = 4
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, G.usesound, 50, 1)
return
if(exchange_parts(user, G))
@@ -220,7 +220,7 @@
active_power_usage = 500
var/printing = null
var/printing_text = null
- var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking)
+ var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/mindshield, /obj/item/weapon/implant/tracking)
/obj/machinery/body_scanconsole/power_change()
if(stat & BROKEN)
@@ -293,7 +293,7 @@
dir = 8
else
dir = 4
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, G.usesound, 50, 1)
if(exchange_parts(user, G))
return
@@ -385,7 +385,7 @@
occupantData["implant_len"] = implantData.len
var/extOrganData[0]
- for(var/obj/item/organ/external/E in H.organs)
+ for(var/obj/item/organ/external/E in H.bodyparts)
var/organData[0]
organData["name"] = E.name
organData["open"] = E.open
@@ -453,6 +453,7 @@
occupantData["intOrgan"] = intOrganData
occupantData["blind"] = (H.disabilities & BLIND)
+ occupantData["colourblind"] = (H.disabilities & COLOURBLIND)
occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED)
data["occupant"] = occupantData
@@ -472,7 +473,7 @@
printing = 1
visible_message("\The [src] rattles and prints out a sheet of paper. ")
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
P.info = "Body Scan - [href_list["name"]] "
P.info += "Time of scan: [worldtime2text(world.time)] "
P.info += "[printing_text]"
@@ -561,7 +562,7 @@
dat += " Other Wounds "
dat += " "
- for(var/obj/item/organ/external/e in occupant.organs)
+ for(var/obj/item/organ/external/e in occupant.bodyparts)
dat += ""
var/AN = ""
var/open = ""
@@ -639,6 +640,8 @@
dat += ""
if(occupant.disabilities & BLIND)
dat += "Cataracts detected. "
+ if(occupant.disabilities & COLOURBLIND)
+ dat += "Photoreceptor abnormalities detected. "
if(occupant.disabilities & NEARSIGHTED)
dat += "Retinal misalignment detected. "
else
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index a88abfc61b9..4d059043329 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -24,87 +24,83 @@
stat |= NOPOWER
/obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses)
- src.disabled = disabled
- src.uses = uses
- src.power_change()
+ disabled = disabled
+ uses = uses
+ power_change()
/obj/machinery/ai_slipper/attackby(obj/item/weapon/W, mob/user, params)
if(stat & (NOPOWER|BROKEN))
return
if(istype(user, /mob/living/silicon))
- return src.attack_hand(user)
+ return attack_hand(user)
else // trying to unlock the interface
- if(src.allowed(usr))
+ if(allowed(usr))
locked = !locked
- to_chat(user, "You [ locked ? "lock" : "unlock"] the device.")
+ to_chat(user, "You [locked ? "lock" : "unlock"] the device.")
if(locked)
- if(user.machine==src)
+ if(user.machine == src)
user.unset_machine()
user << browse(null, "window=ai_slipper")
else
- if(user.machine==src)
- src.attack_hand(usr)
+ if(user.machine == src)
+ attack_hand(usr)
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
return
return
-/obj/machinery/ai_slipper/attack_ai(mob/user as mob)
+/obj/machinery/ai_slipper/attack_ai(mob/user)
return attack_hand(user)
-/obj/machinery/ai_slipper/attack_hand(mob/user as mob)
+/obj/machinery/ai_slipper/attack_ghost(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/ai_slipper/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
- if( (get_dist(src, user) > 1 ))
- if(!istype(user, /mob/living/silicon))
- to_chat(user, text("Too far away."))
- user.unset_machine()
- user << browse(null, "window=ai_slipper")
- return
+
+ if(get_dist(src, user) > 1 && (!issilicon(user) && !user.can_admin_interact()))
+ to_chat(user, "Too far away. ")
+ user.unset_machine()
+ user << browse(null, "window=ai_slipper")
+ return
user.set_machine(src)
- var/loc = src.loc
- if(istype(loc, /turf))
- loc = loc:loc
- if(!istype(loc, /area))
- to_chat(user, text("Turret badly positioned - loc.loc is [].", loc))
- return
- var/area/area = loc
- var/t = "AI Liquid Dispenser ([area.name]) "
+ var/area/myarea = get_area(src)
+ var/t = "AI Liquid Dispenser ([myarea.name]) "
- if(src.locked && (!istype(user, /mob/living/silicon)))
+ if(locked && (!issilicon(user) && !user.can_admin_interact()))
t += "(Swipe ID card to unlock control panel.) "
else
- t += text("Dispenser [] - []? \n", src.disabled?"deactivated":"activated", src.disabled?"Enable":"Disable")
+ t += text("Dispenser [] - []? \n", disabled ? "deactivated" : "activated", disabled ? "Enable" : "Disable")
t += text("Uses Left: [uses]. Activate the dispenser? \n")
user << browse(t, "window=computer;size=575x450")
onclose(user, "computer")
- return
/obj/machinery/ai_slipper/Topic(href, href_list)
if(..())
return 1
- if(src.locked)
- if(!istype(usr, /mob/living/silicon))
- to_chat(usr, "Control panel is locked!")
- return
+
+ if(locked && (!issilicon(usr) && !usr.can_admin_interact()))
+ to_chat(usr, "Control panel is locked!")
+ return 1
+
if(href_list["toggleOn"])
- src.disabled = !src.disabled
- icon_state = src.disabled? "motion0":"motion3"
+ disabled = !disabled
+ icon_state = disabled? "motion0":"motion3"
if(href_list["toggleUse"])
if(cooldown_on || disabled)
return
else
- new /obj/effect/effect/foam(src.loc)
- src.uses--
+ new /obj/structure/foam(loc)
+ uses--
cooldown_on = 1
cooldown_time = world.timeofday + 100
slip_process()
return
- src.attack_hand(usr)
- return
+ attack_hand(usr)
/obj/machinery/ai_slipper/proc/slip_process()
while(cooldown_time - world.timeofday > 0)
@@ -120,5 +116,4 @@
return
if(uses >= 0)
cooldown_on = 0
- src.power_change()
- return
\ No newline at end of file
+ power_change()
\ No newline at end of file
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index a5db47222e6..02a815c096f 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -14,14 +14,14 @@
/datum/tlv/proc/get_danger_level(curval as num)
if(max2 >=0 && curval>max2)
- return 2
+ return ATMOS_ALARM_DANGER
if(min2 >=0 && curval=0 && curval>max1)
- return 1
+ return ATMOS_ALARM_WARNING
if(min1 >=0 && curvalYou [ locked ? "lock" : "unlock"] the Air Alarm interface.")
updateUsrDialog()
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
return
@@ -1042,6 +1007,7 @@
return
to_chat(user, "You wire \the [src]!")
+ playsound(get_turf(src), coil.usesound, 50, 1)
coil.amount -= 5
if(!coil.amount)
qdel(coil)
@@ -1053,8 +1019,8 @@
else if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You start prying out the circuit.")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user,20, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(buildstage != 1)
return
to_chat(user, "You pry out the circuit!")
@@ -1066,6 +1032,7 @@
if(0)
if(istype(W, /obj/item/weapon/airalarm_electronics))
to_chat(user, "You insert the circuit!")
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(W)
buildstage = 1
update_icon()
@@ -1074,7 +1041,7 @@
else if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You remove the fire alarm assembly from the wall!")
new /obj/item/mounted/frame/alarm_frame(get_turf(user))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(src)
return 0
@@ -1103,5 +1070,7 @@ Just an object used in constructing air alarms
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "Looks like a circuit. Probably is."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index f534a86f31c..91687844329 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -75,10 +75,10 @@ obj/machinery/air_sensor
if(bolts)
to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.")
return 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You begin to unfasten \the [src]...")
- if(do_after(user, 40, target = src))
- user.visible_message("[user] unfastens \the [src].", "\blue You have unfastened \the [src].", "You hear ratchet.")
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src]... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ user.visible_message("[user] unfastens \the [src].", "You have unfastened \the [src]. ", "You hear ratchet.")
new /obj/item/pipe_gsensor(src.loc)
qdel(src)
return 1
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 65f6fb7b09d..b785297bd06 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -339,14 +339,14 @@ update_flag
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
if(iswelder(W) && src.destroyed)
if(weld(W, user))
- to_chat(user, "\blue You salvage whats left of \the [src]")
+ to_chat(user, "You salvage whats left of \the [src] ")
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src.loc)
M.amount = 3
qdel(src)
return
if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
- visible_message("\red [user] hits the [src] with a [W]!")
+ visible_message("[user] hits the [src] with a [W]! ")
src.health -= W.force
src.add_fingerprint(user)
healthcheck()
@@ -445,12 +445,12 @@ update_flag
else
logmsg = "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the air "
if(air_contents.toxins > 0)
- message_admins("[key_name_admin(usr)] opened a canister that contains plasma! (JMP )")
- log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
+ message_admins("[key_name_admin(usr)] opened a canister that contains plasma in [get_area(src)]! (JMP )")
+ log_admin("[key_name(usr)] opened a canister that contains plasma at [get_area(src)]: [x], [y], [z]")
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
- message_admins("[key_name_admin(usr)] opened a canister that contains N2O! (JMP )")
- log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
+ message_admins("[key_name_admin(usr)] opened a canister that contains N2O in [get_area(src)]! (JMP )")
+ log_admin("[key_name(usr)] opened a canister that contains N2O at [get_area(src)]: [x], [y], [z]")
investigate_log(logmsg, "atmos")
release_log += logmsg
valve_open = !valve_open
@@ -479,7 +479,7 @@ update_flag
else
name = "canister"
else
- to_chat(usr, "\red As you attempted to rename it the pressure rose!")
+ to_chat(usr, "As you attempted to rename it the pressure rose! ")
if(href_list["choice"] == "Primary color")
if(is_a_color(href_list["icon"],"prim"))
@@ -631,9 +631,9 @@ update_flag
// Do after stuff here
to_chat(user, "You start to slice away at \the [src]... ")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
busy = 1
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * WT.toolspeed, target = src))
busy = 0
if(!WT.isOn())
return 0
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 51d4ebc595c..231a50bf802 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -123,12 +123,12 @@
if(!istype(W, /obj/item/weapon/wrench))
return ..()
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You begin to unfasten \the [src]...")
- if(do_after(user, 40, target = src))
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src]... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
- "\blue You have unfastened \the [src].", \
+ "You have unfastened \the [src]. ", \
"You hear ratchet.")
new /obj/item/pipe_meter(src.loc)
qdel(src)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 01f9d022c57..44ac6caf479 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -36,10 +36,8 @@
/obj/machinery/portable_atmospherics/Destroy()
disconnect()
- qdel(air_contents)
- air_contents = null
- qdel(holding)
- holding = null
+ QDEL_NULL(air_contents)
+ QDEL_NULL(holding)
return ..()
/obj/machinery/portable_atmospherics/update_icon()
@@ -95,21 +93,21 @@
else if(istype(W, /obj/item/weapon/wrench))
if(connected_port)
disconnect()
- to_chat(user, "\blue You disconnect [name] from the port.")
+ to_chat(user, "You disconnect [name] from the port. ")
update_icon()
return
else
var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc
if(possible_port)
if(connect(possible_port))
- to_chat(user, "\blue You connect [name] to the port.")
+ to_chat(user, "You connect [name] to the port. ")
update_icon()
return
else
- to_chat(user, "\blue [name] failed to connect to the port.")
+ to_chat(user, "[name] failed to connect to the port. ")
return
else
- to_chat(user, "\blue Nothing happens.")
+ to_chat(user, "Nothing happens. ")
return
else if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 044023c394a..2d714606610 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -202,7 +202,7 @@
return
anchored = !anchored
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src]. ")
return
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index e52cf428fd3..346949414fa 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -1,6 +1,6 @@
-#define AUTOLATHE_MAIN_MENU 1
-#define AUTOLATHE_CATEGORY_MENU 2
-#define AUTOLATHE_SEARCH_MENU 3
+#define AUTOLATHE_MAIN_MENU 1
+#define AUTOLATHE_CATEGORY_MENU 2
+#define AUTOLATHE_SEARCH_MENU 3
/obj/machinery/autolathe
name = "autolathe"
@@ -31,21 +31,13 @@
var/list/being_built = list()
var/datum/research/files
var/list/datum/design/matching_designs
+ var/temp_search
var/selected_category
var/screen = 1
var/datum/material_container/materials
- var/list/categories = list(
- "Communication",
- "Construction",
- "Electronics",
- "Medical",
- "Miscellaneous",
- "Security",
- "Tools",
- "Imported"
- )
+ var/list/categories = list("Tools", "Electronics", "Construction", "Communication", "Security", "Machinery", "Medical", "Miscellaneous", "Dinnerware", "Imported")
/obj/machinery/autolathe/New()
..()
@@ -56,7 +48,7 @@
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1))
+ materials = new /datum/material_container(src, list(MAT_METAL = 1, MAT_GLASS = 1))
RefreshParts()
wires = new(src)
@@ -75,44 +67,115 @@
RefreshParts()
/obj/machinery/autolathe/Destroy()
- qdel(wires)
- wires = null
- qdel(materials)
- materials = null
+ QDEL_NULL(wires)
+ QDEL_NULL(materials)
return ..()
/obj/machinery/autolathe/interact(mob/user)
if(shocked && !(stat & NOPOWER))
- shock(user,50)
-
- user.set_machine(src)
- var/dat
+ if(shock(user, 50))
+ return
if(panel_open)
- dat = wires.GetInteractWindow()
-
+ wires.Interact(user)
else
- switch(screen)
- if(AUTOLATHE_MAIN_MENU)
- dat = main_win(user)
- if(AUTOLATHE_CATEGORY_MENU)
- dat = category_win(user,selected_category)
- if(AUTOLATHE_SEARCH_MENU)
- dat = search_win(user)
+ ui_interact(user)
- var/datum/browser/popup = new(user, "autolathe", name, 800, 500)
- popup.set_content(dat)
- popup.open()
+/obj/machinery/autolathe/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "autolathe.tmpl", name, 800, 550)
+ ui.open()
- return
+/obj/machinery/autolathe/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["screen"] = screen
+ data["total_amount"] = materials.total_amount
+ data["max_amount"] = materials.max_amount
+ data["metal_amount"] = materials.amount(MAT_METAL)
+ data["glass_amount"] = materials.amount(MAT_GLASS)
+ switch(screen)
+ if(AUTOLATHE_MAIN_MENU)
+ data["uid"] = UID()
+ data["categories"] = categories
+ if(AUTOLATHE_CATEGORY_MENU)
+ data["selected_category"] = selected_category
+ var/list/designs = list()
+ data["designs"] = designs
+ for(var/v in files.known_designs)
+ var/datum/design/D = files.known_designs[v]
+ if(!(selected_category in D.category))
+ continue
+ var/list/design = list()
+ designs[++designs.len] = design
+ design["name"] = D.name
+ design["id"] = D.id
+ design["disabled"] = disabled || !can_build(D) ? "disabled" : null
+ if(ispath(D.build_path, /obj/item/stack))
+ design["max_multiplier"] = min(D.maxstack, D.materials[MAT_METAL] ? round(materials.amount(MAT_METAL) / D.materials[MAT_METAL]) : INFINITY, D.materials[MAT_GLASS] ? round(materials.amount(MAT_GLASS) / D.materials[MAT_GLASS]) : INFINITY)
+ else
+ design["max_multiplier"] = null
+ design["materials"] = design_cost_data(D)
+ if(AUTOLATHE_SEARCH_MENU)
+ data["search"] = temp_search
+ var/list/designs = list()
+ data["designs"] = designs
+ for(var/datum/design/D in matching_designs)
+ var/list/design = list()
+ designs[++designs.len] = design
+ design["name"] = D.name
+ design["id"] = D.id
+ design["disabled"] = disabled || !can_build(D) ? "disabled" : null
+ if(ispath(D.build_path, /obj/item/stack))
+ design["max_multiplier"] = min(D.maxstack, D.materials[MAT_METAL] ? round(materials.amount(MAT_METAL) / D.materials[MAT_METAL]) : INFINITY, D.materials[MAT_GLASS] ? round(materials.amount(MAT_GLASS) / D.materials[MAT_GLASS]) : INFINITY)
+ else
+ design["max_multiplier"] = null
+ design["materials"] = design_cost_data(D)
+
+ data = queue_data(data)
+ return data
+
+/obj/machinery/autolathe/proc/design_cost_data(datum/design/D)
+ var/list/data = list()
+ var/coeff = get_coeff(D)
+
+ var/has_metal = 1
+ if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] / coeff)))
+ has_metal = 0
+ var/has_glass = 1
+ if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] / coeff)))
+ has_glass = 0
+
+ data[++data.len] = list("name" = "metal", "amount" = D.materials[MAT_METAL] / coeff, "is_red" = !has_metal)
+ data[++data.len] = list("name" = "glass", "amount" = D.materials[MAT_GLASS] / coeff, "is_red" = !has_glass)
+
+ return data
+
+/obj/machinery/autolathe/proc/queue_data(list/data)
+ var/temp_metal = materials.amount(MAT_METAL)
+ var/temp_glass = materials.amount(MAT_GLASS)
+ data["processing"] = being_built.len ? get_processing_line() : null
+ if(istype(queue) && queue.len)
+ var/list/data_queue = list()
+ for(var/list/L in queue)
+ var/datum/design/D = L[1]
+ var/list/LL = get_design_cost_as_list(D, L[2])
+ data_queue[++data_queue.len] = list("name" = initial(D.name), "can_build" = can_build(D, L[2], temp_metal, temp_glass), "multiplier" = L[2])
+ temp_metal = max(temp_metal - LL[1], 1)
+ temp_glass = max(temp_glass - LL[2], 1)
+ data["queue"] = data_queue
+ data["queue_len"] = data_queue.len
+ else
+ data["queue"] = null
+ return data
/obj/machinery/autolathe/attackby(obj/item/O, mob/user, params)
if(busy)
- to_chat(user, "The autolathe is busy. Please wait for completion of previous operation. ")
+ to_chat(user, "The autolathe is busy. Please wait for completion of previous operation. ")
return 1
if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O))
- updateUsrDialog()
+ nanomanager.update_uis(src)
return
if(exchange_parts(user, O))
@@ -137,12 +200,12 @@
user.visible_message("[user] begins to load \the [O] in \the [src]...",
"You begin to load a design from \the [O]...",
"You hear the chatter of a floppy drive.")
- playsound(get_turf(src), "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(get_turf(src), 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
busy = 1
if(do_after(user, 14.4, target = src))
files.AddDesign2Known(D.blueprint)
busy = 0
- else
+ else
to_chat(user, "That disk does not have a design on it! ")
return 1
else
@@ -168,15 +231,15 @@
if(O.materials[MAT_METAL])
flick("autolathe_o",src)//plays metal insertion animation
if(O.materials[MAT_GLASS])
- flick("autolathe_r",src)//plays glass insertion animation
+ flick("autolathe_r", src)//plays glass insertion animation
to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe. ")
- use_power(inserted*100)
+ use_power(inserted * 100)
else
to_chat(user, "You insert a material total of [inserted] to the autolathe. ")
- use_power(max(500,inserted/10))
+ use_power(max(500, inserted / 10))
qdel(O)
busy = 0
- src.updateUsrDialog()
+ nanomanager.update_uis(src)
/obj/machinery/autolathe/attack_ghost(mob/user)
interact(user)
@@ -195,6 +258,7 @@
if(href_list["category"])
selected_category = href_list["category"]
+ screen = AUTOLATHE_CATEGORY_MENU
if(href_list["make"])
BuildTurf = loc
@@ -215,14 +279,14 @@
if(!is_stack && (multiplier > 1))
return
- if(!(multiplier in list(1,10,25,max_multiplier))) //"enough materials ?" is checked in the build proc
+ if(!(multiplier in list(1, 10, 25, max_multiplier))) //"enough materials ?" is checked in the build proc
return
/////////////////
- if((queue.len+1)The autolathe queue is full!")
if(!busy)
busy = 1
process_queue()
@@ -230,28 +294,32 @@
if(href_list["remove_from_queue"])
var/index = text2num(href_list["remove_from_queue"])
- if(isnum(index) && IsInRange(index,1,queue.len))
+ if(isnum(index) && IsInRange(index, 1, queue.len))
remove_from_queue(index)
if(href_list["queue_move"] && href_list["index"])
var/index = text2num(href_list["index"])
var/new_index = index + text2num(href_list["queue_move"])
if(isnum(index) && isnum(new_index))
- if(IsInRange(new_index,1,queue.len))
+ if(IsInRange(new_index, 1, queue.len))
queue.Swap(index,new_index)
if(href_list["clear_queue"])
queue = list()
if(href_list["search"])
+ if(href_list["to_search"])
+ temp_search = href_list["to_search"]
+ if(!temp_search)
+ return
matching_designs.Cut()
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
- if(findtext(D.name,href_list["to_search"]))
+ if(findtext(D.name, temp_search))
matching_designs.Add(D)
+ screen = AUTOLATHE_SEARCH_MENU
- src.updateUsrDialog()
-
- return
+ nanomanager.update_uis(src)
+ return 1
/obj/machinery/autolathe/RefreshParts()
var/tot_rating = 0
@@ -263,19 +331,19 @@
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
prod_coeff += M.rating - 1
-/obj/machinery/autolathe/proc/get_coeff(var/datum/design/D)
+/obj/machinery/autolathe/proc/get_coeff(datum/design/D)
var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : 2 ** prod_coeff)//stacks are unaffected by production coefficient
return coeff
-/obj/machinery/autolathe/proc/build_item(var/datum/design/D, var/multiplier)
+/obj/machinery/autolathe/proc/build_item(datum/design/D, multiplier)
desc = initial(desc)+"\nIt's building \a [initial(D.name)]."
var/is_stack = ispath(D.build_path, /obj/item/stack)
var/coeff = get_coeff(D)
var/metal_cost = D.materials[MAT_METAL]
var/glass_cost = D.materials[MAT_GLASS]
var/power = max(2000, (metal_cost+glass_cost)*multiplier/5)
- if(can_build(D,multiplier))
- being_built = list(D,multiplier)
+ if(can_build(D, multiplier))
+ being_built = list(D, multiplier)
use_power(power)
icon_state = "autolathe"
flick("autolathe_n",src)
@@ -285,7 +353,7 @@
else
var/list/materials_used = list(MAT_METAL=metal_cost/coeff, MAT_GLASS=glass_cost/coeff)
materials.use_amount(materials_used)
- updateUsrDialog()
+ nanomanager.update_uis(src)
sleep(32/coeff)
if(is_stack)
var/obj/item/stack/S = new D.build_path(BuildTurf)
@@ -294,10 +362,13 @@
var/obj/item/new_item = new D.build_path(BuildTurf)
new_item.materials[MAT_METAL] /= coeff
new_item.materials[MAT_GLASS] /= coeff
- updateUsrDialog()
+ nanomanager.update_uis(src)
desc = initial(desc)
-/obj/machinery/autolathe/proc/can_build(var/datum/design/D,var/multiplier=1,var/custom_metal,var/custom_glass)
+/obj/machinery/autolathe/proc/can_build(datum/design/D, multiplier = 1, custom_metal, custom_glass)
+ if(D.make_reagents.len)
+ return 0
+
var/coeff = get_coeff(D)
var/metal_amount = materials.amount(MAT_METAL)
@@ -313,7 +384,7 @@
return 0
return 1
-/obj/machinery/autolathe/proc/get_design_cost_as_list(var/datum/design/D,var/multiplier=1)
+/obj/machinery/autolathe/proc/get_design_cost_as_list(datum/design/D, multiplier = 1)
var/list/OutputList = list(0,0)
var/coeff = get_coeff(D)
if(D.materials[MAT_METAL])
@@ -329,43 +400,7 @@
var/output = "PROCESSING: [initial(D.name)][is_stack?" (x[multiplier])":null]"
return output
-/obj/machinery/autolathe/proc/get_queue()
- var/temp_metal = materials.amount(MAT_METAL)
- var/temp_glass = materials.amount(MAT_GLASS)
- var/output = ""
- output += ""
- output += "
Queue contains: "
- if(!istype(queue) || !queue.len)
- if(being_built.len)
- output += "
"
- output += get_processing_line()
- output += " "
- else
- output += "
Nothing"
- else
- output += "
"
- if(being_built.len)
- output += ""
- output += get_processing_line()
- output += " "
- var/i = 0
- var/datum/design/D
- for(var/list/L in queue)
- i++
- D = L[1]
- var/multiplier = L[2]
- var/list/LL = get_design_cost_as_list(D,multiplier)
- var/is_stack = (multiplier>1)
- output += "[initial(D.name)][is_stack?" (x[multiplier])":null] - [i>1?"↑ ":null] [i↓":null] Remove "
- temp_metal = max(temp_metal-LL[1],1)
- temp_glass = max(temp_glass-LL[2],1)
-
- output += " "
- output += "
Clear queue "
- output += "
"
- return output
-
-/obj/machinery/autolathe/proc/add_to_queue(D,var/multiplier)
+/obj/machinery/autolathe/proc/add_to_queue(D, multiplier)
if(!istype(queue))
queue = list()
if(D)
@@ -388,10 +423,10 @@
else
return
while(D)
- if(stat&(NOPOWER|BROKEN))
+ if(stat & (NOPOWER|BROKEN))
being_built = new /list()
return 0
- if(!can_build(D,multiplier))
+ if(!can_build(D, multiplier))
visible_message("[bicon(src)] \The [src] beeps, \"Not enough resources. Queue processing terminated.\"")
queue = list()
being_built = new /list()
@@ -404,117 +439,7 @@
being_built = new /list()
//visible_message("[bicon(src)] \The [src] beeps, \"Queue processing finished successfully.\"")
-/obj/machinery/autolathe/proc/main_win(mob/user)
- var/dat = ""
- dat += ""
- dat += "Autolathe Menu: "
- dat += "
Total amount: [materials.total_amount] / [materials.max_amount] cm
3 "
- dat += "
Metal amount: [materials.amount(MAT_METAL)] cm
3 "
- dat += "
Glass amount: [materials.amount(MAT_GLASS)] cm
3 "
-
- dat += "
"
-
- var/line_length = 1
- dat += "
"
-
- for(var/C in categories)
- if(line_length > 2)
- dat += " "
- line_length = 1
-
- dat += "[C] "
- line_length++
-
- dat += "
"
- dat += " "
- dat += get_queue()
- dat += "
"
- return dat
-
-/obj/machinery/autolathe/proc/category_win(mob/user,var/selected_category)
- var/dat = ""
- dat += ""
- dat += "
Return to main menu "
- dat += "
Browsing [selected_category]: "
- dat += "
Total amount: [materials.total_amount] / [materials.max_amount] cm
3 "
- dat += "
Metal amount: [materials.amount(MAT_METAL)] cm
3 "
- dat += "
Glass amount: [materials.amount(MAT_GLASS)] cm
3 "
-
- for(var/v in files.known_designs)
- var/datum/design/D = files.known_designs[v]
- if(!(selected_category in D.category))
- continue
-
- if(disabled || !can_build(D))
- dat += "
[D.name] "
- else
- dat += "
[D.name] "
-
- if(ispath(D.build_path, /obj/item/stack))
- var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY)
- if(max_multiplier>10 && !disabled)
- dat += "
x10 "
- if(max_multiplier>25 && !disabled)
- dat += "
x25 "
- if(max_multiplier > 0 && !disabled)
- dat += "
x[max_multiplier] "
-
- dat += "[get_design_cost(D)]
"
-
- dat += "
"
- dat += " "
- dat += get_queue()
- dat += "
"
- return dat
-
-/obj/machinery/autolathe/proc/search_win(mob/user)
- var/dat = ""
- dat += ""
- dat += "
Return to main menu "
- dat += "
Search results: "
- dat += "
Total amount: [materials.total_amount] / [materials.max_amount] cm
3 "
- dat += "
Metal amount: [materials.amount(MAT_METAL)] cm
3 "
- dat += "
Glass amount: [materials.amount(MAT_GLASS)] cm
3 "
-
- for(var/datum/design/D in matching_designs)
- if(disabled || !can_build(D))
- dat += "
[D.name] "
- else
- dat += "
[D.name] "
-
- if(ispath(D.build_path, /obj/item/stack))
- var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY)
- if(max_multiplier>10 && !disabled)
- dat += "
x10 "
- if(max_multiplier>25 && !disabled)
- dat += "
x25 "
- if(max_multiplier > 0 && !disabled)
- dat += "
x[max_multiplier] "
-
- dat += "[get_design_cost(D)]
"
-
- dat += "
"
- dat += " "
- dat += get_queue()
- dat += "
"
- return dat
-
-/obj/machinery/autolathe/proc/get_design_cost(var/datum/design/D)
- var/coeff = get_coeff(D)
- var/dat
- if(D.materials[MAT_METAL])
- dat += "[D.materials[MAT_METAL] / coeff] metal "
- if(D.materials[MAT_GLASS])
- dat += "[D.materials[MAT_GLASS] / coeff] glass"
- return dat
-
-/obj/machinery/autolathe/proc/adjust_hacked(var/hack)
+/obj/machinery/autolathe/proc/adjust_hacked(hack)
hacked = hack
if(hack)
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
deleted file mode 100644
index 6344dec7bbf..00000000000
--- a/code/game/machinery/biogenerator.dm
+++ /dev/null
@@ -1,389 +0,0 @@
-/obj/machinery/biogenerator
- name = "biogenerator"
- desc = "Converts plants into biomass, which can be used to construct useful items."
- icon = 'icons/obj/biogenerator.dmi'
- icon_state = "biogen-empty"
- density = 1
- anchored = 1
- use_power = 1
- idle_power_usage = 40
- var/processing = 0
- var/obj/item/weapon/reagent_containers/glass/beaker = null
- var/points = 0
- var/in_beaker = 1
- var/menustat = "menu"
- var/efficiency = 0
- var/productivity = 0
- var/max_items = 40
-
-/obj/machinery/biogenerator/New()
- ..()
- create_reagents(1000)
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/biogenerator(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
-
-/obj/machinery/biogenerator/upgraded/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/biogenerator(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
-
-/obj/machinery/biogenerator/RefreshParts()
- var/E = 0
- var/P = 0
- var/max_storage = 40
- for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
- P += B.rating
- max_storage = 40 * B.rating
- for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
- E += M.rating
- efficiency = E
- productivity = P
- max_items = max_storage
-
-/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
- update_icon()
-
-/obj/machinery/biogenerator/update_icon()
- if(panel_open)
- icon_state = "biogen-empty-o"
- else if(!src.beaker)
- icon_state = "biogen-empty"
- else if(!src.processing)
- icon_state = "biogen-stand"
- else
- icon_state = "biogen-work"
- return
-
-/obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open)
- if(beaker)
- to_chat(user, "A container is already loaded into the machine. ")
- return
- else
- if(!user.drop_item())
- to_chat(user, "\The [O] is stuck to you! ")
- return
- O.forceMove(src)
- beaker = O
- to_chat(user, "You add the container to the machine. ")
- updateUsrDialog()
- update_icon()
- return
-
- if(!processing)
- if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O))
- if(beaker)
- var/obj/item/weapon/reagent_containers/glass/B = beaker
- B.forceMove(loc)
- beaker = null
- return
-
- if(exchange_parts(user, O))
- return
-
- else if(istype(O, /obj/item/weapon/crowbar))
- else if(panel_open)
- to_chat(user, "Close the maintenance panel first. ")
- else if(processing)
- to_chat(user, "The biogenerator is currently processing. ")
- else if(istype(O, /obj/item/weapon/storage/bag/plants))
- var/obj/item/weapon/storage/bag/plants/PB = O
- var/i = 0
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
- i++
- if(i >= max_items)
- to_chat(user, "The biogenerator is already full! Activate it. ")
- else
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
- if(i >= max_items)
- break
- PB.remove_from_storage(G, src)
- i++
- if(i < max_items)
- to_chat(user, "You empty the plant bag into the biogenerator. ")
- else if(O.contents.len == 0)
- to_chat(user, "You empty the plant bag into the biogenerator, filling it to its capacity. ")
- else
- to_chat(user, "You fill the biogenerator to its capacity. ")
-
- else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) && !istype(O, /obj/item/weapon/crowbar))
- to_chat(user, "You can not put this in [src.name] ")
- else
- var/i = 0
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
- i++
- if(i >= max_items)
- to_chat(user, "The biogenerator is full! Activate it. ")
- else
- user.unEquip(O)
- O.forceMove(src)
- to_chat(user, "You put [O.name] in [src.name] ")
-
-
- default_deconstruction_crowbar(O)
-
- update_icon()
- return
-
-/obj/machinery/biogenerator/interact(mob/user as mob)
- if(stat & BROKEN || panel_open)
- return
- user.set_machine(src)
- var/dat
- if(processing)
- dat += "Biogenerator is processing! Please wait...
"
- else
- switch(menustat)
- if("nopoints")
- dat += "You do not have sufficient biomass to create products. Please put growns into the reactor and activate it.
"
- menustat = "menu"
- if("complete")
- dat += "Operation complete.
"
- menustat = "menu"
- if("void")
- dat += "Error: No growns inside. Please put growns into reactor.
"
- menustat = "menu"
- if("nobeakerspace")
- dat += "Not enough space left in container. Unable to create product.
"
- menustat = "menu"
- if(beaker)
- dat += "Biomass: [points] units.
"
- dat += "Activate Detach Container "
- dat += "Put fertilizer in: [in_beaker ? "Beaker" : "Bottle"] "
- dat += "Food: "
- dat += ""
- dat += "10 milk:
Make ([20/efficiency])
"
- dat += "10 cream:
Make ([30/efficiency])
"
- dat += "Monkey cube:
Make ([250/efficiency])"
- dat += "
"
- dat += "Nutrients: "
- dat += ""
- dat += "E-Z-Nutrient:
Make x5 ([10/efficiency])
"
- dat += "Left 4 Zed:
Make x5 ([20/efficiency])
"
- dat += "Robust Harvest:
Make x5 ([25/efficiency])
"
- dat += "
"
- dat += "Leather: "
- dat += ""
- dat += "Wallet:
Make ([100/efficiency])
"
- dat += "Book bag:
Make ([200/efficiency])
"
- dat += "Plant bag:
Make ([200/efficiency])
"
- dat += "Rag:
Make ([200/efficiency])
"
- dat += "Mining satchel:
Make ([200/efficiency])
"
- dat += "Chemistry bag:
Make ([200/efficiency])
"
- dat += "Botanical gloves:
Make ([250/efficiency])
"
- dat += "Leather Satchel:
Make ([400/efficiency])
"
- dat += "Cash Bag:
Make ([400/efficiency])
"
- dat += "Leather Jacket:
Make ([500/efficiency])
"
- dat += "
"
- dat += "Belts "
- dat += ""
- dat += "Utility belt:
Make ([300/efficiency])
"
- dat += "Botanist belt:
Make ([300/efficiency])
"
- dat += "Security belt:
Make ([300/efficiency])
"
- dat += "Medical belt:
Make ([300/efficiency])
"
- dat += "Janitor belt:
Make ([300/efficiency])
"
- dat += "Bandolier:
Make ([300/efficiency])
"
- dat += "
"
- //dat += "Other: "
- //dat += "Monkey: Make ([400/efficiency]) "
- else
- dat += "No container inside. Please insert a container.
"
-
- var/datum/browser/popup = new(user, "biogen", name, 350, 520)
- popup.set_content(dat)
- popup.open()
- return
-
-/obj/machinery/biogenerator/attack_hand(mob/user as mob)
- interact(user)
-
-/obj/machinery/biogenerator/proc/activate()
- if(usr.stat != 0)
- return
- if(src.stat != 0) //NOPOWER etc
- return
- if(src.processing)
- to_chat(usr, "The biogenerator is in the process of working. ")
- return
- var/S = 0
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
- S += 5
- var/reagent_amount = I.reagents.get_reagent_amount("nutriment") + I.reagents.get_reagent_amount("plantmatter")
- if(reagent_amount < 0.1)
- points += 1*productivity
- else points += reagent_amount*10*productivity
- qdel(I)
- if(S)
- processing = 1
- update_icon()
- updateUsrDialog()
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
- use_power(S*30)
- sleep(S+15/productivity)
- processing = 0
- update_icon()
- else
- menustat = "void"
- return
-
-/obj/machinery/biogenerator/proc/check_cost(var/cost, var/checkonly)
- if(cost > points)
- menustat = "nopoints"
- return 1
- else if(checkonly)
- return 0
- else
- points -= cost
- processing = 1
- update_icon()
- updateUsrDialog()
- return 0
-
-/obj/machinery/biogenerator/proc/check_container_volume(var/reagent_amount)
- if(beaker.reagents.total_volume + reagent_amount > beaker.reagents.maximum_volume)
- menustat = "nobeakerspace"
- return 1
-
-/obj/machinery/biogenerator/proc/create_product(var/create)
- switch(create)
- //Food
- if("milk")
- if(check_container_volume(10)) return 0
- else if(check_cost(20/efficiency)) return 0
- else beaker.reagents.add_reagent("milk",10)
- if("cream")
- if(check_container_volume(10)) return 0
- else if(check_cost(30/efficiency)) return 0
- else beaker.reagents.add_reagent("cream",10)
- if("meat")
- if(check_cost(250/efficiency)) return 0
- else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc)
- //Nutrients
- if("ez")
- if(check_cost(10/efficiency, 1)) return 0
- if(in_beaker)
- if(check_container_volume(10)) return 0
- else beaker.reagents.add_reagent("eznutrient",10)
- else
- new/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez(src.loc)
- if(check_cost(10/efficiency)) return 0
- if("l4z")
- if(check_cost(20/efficiency, 1)) return 0
- if(in_beaker)
- if(check_container_volume(10)) return 0
- else beaker.reagents.add_reagent("left4zed",10)
- else
- new/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/l4z(src.loc)
- if(check_cost(20/efficiency)) return 0
- if("rh")
- if(check_cost(25/efficiency, 1)) return 0
- if(in_beaker)
- if(check_container_volume(10)) return 0
- else beaker.reagents.add_reagent("robustharvest",10)
- else
- new/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/rh(src.loc)
- if(check_cost(25/efficiency)) return 0
- //Leather
- if("wallet")
- if(check_cost(100/efficiency)) return 0
- else new/obj/item/weapon/storage/wallet(src.loc)
- if("bkbag")
- if(check_cost(200/efficiency)) return 0
- else new/obj/item/weapon/storage/bag/books(src.loc)
- if("ptbag")
- if(check_cost(200/efficiency)) return 0
- else new/obj/item/weapon/storage/bag/plants(src.loc)
- if("mnbag")
- if(check_cost(200/efficiency)) return 0
- else new/obj/item/weapon/storage/bag/ore(src.loc)
- if("chbag")
- if(check_cost(200/efficiency)) return 0
- else new/obj/item/weapon/storage/bag/chemistry(src.loc)
- if("rag")
- if(check_cost(200/efficiency)) return 0
- else new/obj/item/weapon/reagent_containers/glass/rag(src.loc)
- if("gloves")
- if(check_cost(250/efficiency)) return 0
- else new/obj/item/clothing/gloves/botanic_leather(src.loc)
- if("satchel")
- if(check_cost(400/efficiency)) return 0
- else new/obj/item/weapon/storage/backpack/satchel(src.loc)
- if("cashbag")
- if(check_cost(400/efficiency)) return 0
- else new/obj/item/weapon/storage/bag/cash(src.loc)
- if("jacket")
- if(check_cost(500/efficiency)) return 0
- else new/obj/item/clothing/suit/jacket/leather(src.loc)
- //Belts
- if("tbelt")
- if(check_cost(300/efficiency)) return 0
- else new/obj/item/weapon/storage/belt/utility(src.loc)
- if("bbelt")
- if(check_cost(300/efficiency)) return 0
- else new/obj/item/weapon/storage/belt/botany(src.loc)
- if("sbelt")
- if(check_cost(300/efficiency)) return 0
- else new/obj/item/weapon/storage/belt/security(src.loc)
- if("mbelt")
- if(check_cost(300/efficiency)) return 0
- else new/obj/item/weapon/storage/belt/medical(src.loc)
- if("jbelt")
- if(check_cost(300/efficiency)) return 0
- else new/obj/item/weapon/storage/belt/janitor(src.loc)
- if("band")
- if(check_cost(300/efficiency)) return 0
- else new/obj/item/weapon/storage/belt/bandolier(src.loc)
- processing = 0
- menustat = "complete"
- update_icon()
- return 1
-
-/obj/machinery/biogenerator/proc/detach()
- if(beaker)
- beaker.forceMove(src.loc)
- beaker = null
- update_icon()
-
-/obj/machinery/biogenerator/Topic(href, href_list)
- if(..() || panel_open)
- return 1
-
- usr.set_machine(src)
-
- if(href_list["activate"])
- activate()
- updateUsrDialog()
-
- else if(href_list["detach"])
- detach()
- updateUsrDialog()
-
- else if(href_list["create"])
- var/amount = (text2num(href_list["amount"]))
- var/i = amount
- var/C = href_list["create"]
- if(i <= 0)
- return
- while(i >= 1)
- create_product(C)
- i--
- processing = 0
- updateUsrDialog()
-
- else if(href_list["menu"])
- menustat = "menu"
- updateUsrDialog()
-
- else if(href_list["inbeaker"])
- in_beaker = !in_beaker
- updateUsrDialog()
\ No newline at end of file
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index a5c65f7cae7..80cfef47d88 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -53,7 +53,11 @@
/obj/machinery/driver_button/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+ return attack_hand(user)
+
+/obj/machinery/driver_button/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
/obj/machinery/driver_button/attackby(obj/item/weapon/W, mob/user as mob, params)
@@ -65,14 +69,14 @@
return 1
if(istype(W, /obj/item/weapon/wrench))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You detach \the [src] from the wall. ")
new/obj/item/mounted/frame/driver_button(get_turf(src))
qdel(src)
return 1
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/driver_button/multitool_menu(var/mob/user, var/obj/item/device/multitool/P)
return {"
@@ -84,7 +88,7 @@
/obj/machinery/driver_button/attack_hand(mob/user as mob)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
if(stat & (NOPOWER|BROKEN))
return
if(active)
@@ -95,8 +99,6 @@
launch_sequence()
- return
-
/obj/machinery/driver_button/proc/launch_sequence()
active = 1
icon_state = "launcheract"
@@ -121,20 +123,20 @@
radio_connection.post_signal(src, signal, filter = RADIO_LOGIC)
for(var/obj/machinery/door/poddoor/M in range(src,range))
- if(M.id_tag == src.id_tag && !M.protected)
+ if(M.id_tag == id_tag && !M.protected)
spawn()
M.open()
sleep(20)
for(var/obj/machinery/mass_driver/M in range(src,range))
- if(M.id_tag == src.id_tag)
+ if(M.id_tag == id_tag)
M.drive()
sleep(50)
for(var/obj/machinery/door/poddoor/M in range(src,range))
- if(M.id_tag == src.id_tag && !M.protected)
+ if(M.id_tag == id_tag && !M.protected)
spawn()
M.close()
return
@@ -163,14 +165,17 @@
idle_power_usage = 2
active_power_usage = 4
-/obj/machinery/ignition_switch/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/ignition_switch/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/ignition_switch/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
-/obj/machinery/ignition_switch/attackby(obj/item/weapon/W, mob/user as mob, params)
- return src.attack_hand(user)
-
-/obj/machinery/ignition_switch/attack_hand(mob/user as mob)
+/obj/machinery/ignition_switch/attackby(obj/item/weapon/W, mob/user, params)
+ return attack_hand(user)
+/obj/machinery/ignition_switch/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
if(active)
@@ -182,12 +187,12 @@
icon_state = "launcheract"
for(var/obj/machinery/sparker/M in world)
- if(M.id == src.id)
+ if(M.id == id)
spawn( 0 )
M.spark()
for(var/obj/machinery/igniter/M in world)
- if(M.id == src.id)
+ if(M.id == id)
use_power(50)
M.on = !( M.on )
M.icon_state = text("igniter[]", M.on)
@@ -195,38 +200,4 @@
sleep(50)
icon_state = "launcherbtt"
- active = 0
-
- return
-
-//////////////////////////////////////
-// Flasher Button //
-//////////////////////////////////////
-
-/obj/machinery/flasher_button
- name = "flasher button"
- desc = "A remote control switch for a mounted flasher."
- icon = 'icons/obj/objects.dmi'
- icon_state = "launcherbtt"
- var/id = null
- var/active = 0
- anchored = 1.0
- use_power = 1
- idle_power_usage = 2
- active_power_usage = 4
-
-//////////////////////////////////////
-// Crematorium Switch //
-//////////////////////////////////////
-
-/obj/machinery/crema_switch
- desc = "Burn baby burn!"
- name = "crematorium igniter"
- icon = 'icons/obj/power.dmi'
- icon_state = "crema_switch"
- anchored = 1.0
- req_access = list(access_crematorium)
- var/on = 0
- var/area/area = null
- var/otherarea = null
- var/id = 1
\ No newline at end of file
+ active = 0
\ No newline at end of file
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index db616620244..5391e633b26 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -29,6 +29,8 @@
var/busy = 0
var/emped = 0 //Number of consecutive EMP's on this camera
+ var/toggle_message = 'sound/items/Wirecutter.ogg'
+
/obj/machinery/camera/New()
..()
wires = new(src)
@@ -45,21 +47,23 @@
..()
if(is_station_level(z) && prob(3) && !start_active)
toggle_cam()
+ wires.CutAll()
/obj/machinery/camera/Destroy()
toggle_cam(null, 0) //kick anyone viewing out
- if(assembly)
- qdel(assembly)
- assembly = null
+ QDEL_NULL(assembly)
if(istype(bug))
bug.bugged_cameras -= src.c_tag
if(bug.current == src)
bug.current = null
bug = null
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
cameranet.cameras -= src
+ var/area/ai_monitored/A = get_area(src)
+ if(istype(A))
+ A.motioncamera = null
+ area_motion = null
return ..()
/obj/machinery/camera/emp_act(severity)
@@ -96,6 +100,11 @@
to_chat(O, "The screen bursts into static.")
..()
+/obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune
+ if(isEmpProof())
+ return
+ ..()
+ qdel(src)//to prevent bomb testing camera from exploding over and over forever
/obj/machinery/camera/ex_act(severity, target)
if(src.invuln)
@@ -108,7 +117,11 @@
qdel(src)
return
-/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user as mob)
+/obj/machinery/camera/attack_ghost(mob/user)
+ if(panel_open)
+ wires.Interact(user)
+
+/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user)
if(!istype(user))
return
user.do_attack_animation(src)
@@ -123,7 +136,7 @@
src.view_range = num
cameranet.updateVisibility(src, 0)
-/obj/machinery/camera/attackby(W as obj, mob/living/user as mob, params)
+/obj/machinery/camera/attackby(obj/item/W, mob/living/user as mob, params)
var/msg = "You attach [W] into the assembly inner circuits. "
var/msg2 = "The camera already has that upgrade! "
@@ -134,7 +147,7 @@
panel_open = !panel_open
user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]! ",
"You screw the camera's panel [panel_open ? "open" : "closed"]. ")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
else if((istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) && panel_open)
wires.Interact(user)
@@ -234,7 +247,7 @@
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
spark_system.set_up(5, 0, loc)
spark_system.start()
- playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
playsound(loc, "sparks", 50, 1)
visible_message("[user] has sliced the camera apart with an energy blade! ")
qdel(src)
@@ -271,7 +284,7 @@
else
visible_message("\The [src] [change_msg]! ")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, toggle_message, 100, 1)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -351,9 +364,9 @@
return 0
to_chat(user, "You start to weld [src]... ")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
busy = 1
- if(do_after(user, 100, target = src))
+ if(do_after(user, 100 * WT.toolspeed, target = src))
busy = 0
if(!WT.isOn())
return 0
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 5b7d035d461..a8d16939944 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -3,7 +3,7 @@
desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface."
icon = 'icons/obj/monitors.dmi'
icon_state = "cameracase"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
anchored = 0
materials = list(MAT_METAL=400, MAT_GLASS=250)
@@ -20,13 +20,17 @@
4 = Screwdriver panel closed and is fully built (you cannot attach upgrades)
*/
+/obj/item/weapon/camera_assembly/Destroy()
+ QDEL_LIST(upgrades)
+ return ..()
+
/obj/item/weapon/camera_assembly/attackby(obj/item/W, mob/living/user, params)
switch(state)
if(0)
// State 0
if(iswrench(W) && isturf(src.loc))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You wrench the assembly into place.")
anchored = 1
state = 1
@@ -44,7 +48,7 @@
return
else if(iswrench(W))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You unattach the assembly from it's place.")
anchored = 0
update_icon()
@@ -57,6 +61,7 @@
var/obj/item/stack/cable_coil/C = W
if(C.use(2))
to_chat(user, "You add wires to the assembly. ")
+ playsound(loc, W.usesound, 50, 1)
state = 3
else
to_chat(user, "You need 2 coils of wire to wire the assembly. ")
@@ -74,7 +79,7 @@
if(3)
// State 3
if(isscrewdriver(W))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
if(!input)
@@ -116,7 +121,7 @@
else if(iswirecutter(W))
new/obj/item/stack/cable_coil(get_turf(src), 2)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You cut the wires from the circuits.")
state = 2
return
@@ -137,7 +142,7 @@
var/obj/U = locate(/obj) in upgrades
if(U)
to_chat(user, "You unattach an upgrade from the assembly.")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
U.loc = get_turf(src)
upgrades -= U
return
@@ -162,9 +167,9 @@
return 0
to_chat(user, "You start to weld the [src].. ")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
busy = 1
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
busy = 0
if(!WT.isOn())
return 0
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 909d53be265..76a9518c98b 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -56,20 +56,20 @@
loc = sanitize(copytext(loc, 1, MAX_MESSAGE_LEN))
if(!loc)
- to_chat(src, "\red Must supply a location name")
+ to_chat(src, "Must supply a location name ")
return
if(stored_locations.len >= max_locations)
- to_chat(src, "\red Cannot store additional locations. Remove one first")
+ to_chat(src, "Cannot store additional locations. Remove one first ")
return
if(loc in stored_locations)
- to_chat(src, "\red There is already a stored location by this name")
+ to_chat(src, "There is already a stored location by this name ")
return
var/L = get_turf(eyeobj)
if(InvalidTurf(get_turf(L)))
- to_chat(src, "\red Unable to store this location")
+ to_chat(src, "Unable to store this location ")
return
stored_locations[loc] = L
@@ -84,7 +84,7 @@
set desc = "Returns to the selected camera location"
if(!(loc in stored_locations))
- to_chat(src, "\red Location [loc] not found")
+ to_chat(src, "Location [loc] not found ")
return
var/L = stored_locations[loc]
@@ -96,7 +96,7 @@
set desc = "Deletes the selected camera location"
if(!(loc in stored_locations))
- to_chat(src, "\red Location [loc] not found")
+ to_chat(src, "Location [loc] not found ")
return
stored_locations.Remove(loc)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index bca8a6d8aa2..063eb8baa1b 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -10,88 +10,117 @@
power_channel = EQUIP
var/obj/item/weapon/stock_parts/cell/charging = null
var/chargelevel = -1
- proc
- updateicon()
- icon_state = "ccharger[charging ? 1 : 0]"
- if(charging && !(stat & (BROKEN|NOPOWER)) )
+/obj/machinery/cell_charger/Destroy()
+ QDEL_NULL(charging)
+ return ..()
- var/newlevel = round(charging.percent() * 4.0 / 99)
-// to_chat(world, "nl: [newlevel]")
+/obj/machinery/cell_charger/proc/updateicon()
+ icon_state = "ccharger[charging ? 1 : 0]"
- if(chargelevel != newlevel)
+ if(charging && !(stat & (BROKEN|NOPOWER)))
+ var/newlevel = round(charging.percent() * 4 / 100)
- overlays.Cut()
- overlays += "ccharger-o[newlevel]"
+ if(chargelevel != newlevel)
+ chargelevel = newlevel
- chargelevel = newlevel
- else
- overlays.Cut()
- examine(mob/user)
- if(..(user, 5))
- to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
- if(charging)
- to_chat(user, "Current charge: [charging.charge]")
+ overlays.Cut()
+ overlays += "ccharger-o[newlevel]"
- attackby(obj/item/weapon/W, mob/user, params)
+ else
+ overlays.Cut()
+
+/obj/machinery/cell_charger/examine(mob/user)
+ ..()
+ to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
+ if(charging)
+ to_chat(user, "Current charge: [round(charging.percent(), 1)]%")
+
+/obj/machinery/cell_charger/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
if(stat & BROKEN)
+ to_chat(user, "[src] is broken! ")
+ return
+ if(!anchored)
+ to_chat(user, "[src] isn't attached to the ground! ")
return
-
- if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored)
- if(charging)
- to_chat(user, "\red There is already a cell in the charger.")
- return
- else
- var/area/a = loc.loc // Gets our locations location, like a dream within a dream
- if(!isarea(a))
- return
- if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
- to_chat(user, "\red The [name] blinks red as you try to insert the cell!")
- return
-
- user.drop_item()
- W.loc = src
- charging = W
- user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.")
- chargelevel = -1
- updateicon()
- else if(istype(W, /obj/item/weapon/wrench))
- if(charging)
- to_chat(user, "\red Remove the cell first!")
- return
-
- anchored = !anchored
- to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1)
-
- attack_hand(mob/user)
if(charging)
- usr.put_in_hands(charging)
- charging.add_fingerprint(user)
- charging.updateicon()
+ to_chat(user, "There is already a cell in the charger! ")
+ return
+ else
+ var/area/a = loc.loc // Gets our locations location, like a dream within a dream
+ if(!isarea(a))
+ return
+ if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
+ to_chat(user, "[src] blinks red as you try to insert the cell! ")
+ return
+ if(!user.drop_item())
+ return
- src.charging = null
- user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.")
+ W.forceMove(src)
+ charging = W
+ user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger. ")
chargelevel = -1
updateicon()
+ else if(iswrench(W))
+ if(charging)
+ to_chat(user, "Remove the cell first! ")
+ return
- attack_ai(mob/user)
+ anchored = !anchored
+ to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground ")
+ playsound(src.loc, W.usesound, 75, 1)
+ else
+ return ..()
+
+
+/obj/machinery/cell_charger/proc/removecell()
+ charging.updateicon()
+ charging = null
+ chargelevel = -1
+ updateicon()
+
+/obj/machinery/cell_charger/attack_hand(mob/user)
+ if(!charging)
return
- emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- return
- if(charging)
- charging.emp_act(severity)
- ..(severity)
+ user.put_in_hands(charging)
+ charging.add_fingerprint(user)
+
+ user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src]. ")
+
+ removecell()
+
+/obj/machinery/cell_charger/attack_tk(mob/user)
+ if(!charging)
+ return
+
+ charging.forceMove(loc)
+ to_chat(user, "You telekinetically remove [charging] from [src]. ")
+
+ removecell()
+
+/obj/machinery/cell_charger/attack_ai(mob/user)
+ return
+
+/obj/machinery/cell_charger/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ if(charging)
+ charging.emp_act(severity)
+
+ ..(severity)
- process()
-// to_chat(world, "ccpt [charging] [stat]")
- if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored)
- return
+/obj/machinery/cell_charger/process()
+ if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
+ return
- use_power(2000) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
- charging.give(1750) //inefficiency.
+ if(charging.percent() >= 100)
+ return
- updateicon()
+ use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
+ charging.give(175) //inefficiency.
+
+ updateicon()
\ No newline at end of file
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index c131652a69a..e5c9d1a0804 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -5,6 +5,9 @@
#define CLONE_BIOMASS 150
#define BIOMASS_MEAT_AMOUNT 50
+#define MINIMUM_HEAL_LEVEL 40
+#define CLONE_INITIAL_DAMAGE 190
+#define BRAIN_INITIAL_DAMAGE 90 // our minds are too feeble for 190
/obj/machinery/clonepod
anchored = 1
@@ -15,12 +18,10 @@
icon_state = "pod_0"
req_access = list(access_genetics) //For premature unlocking.
var/mob/living/carbon/human/occupant
- var/heal_level = 90 //The clone is released once its health reaches this level.
- var/locked = 0
+ var/heal_level //The clone is released once its health reaches this level.
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
var/mess = 0 //Need to clean out it if it's full of exploded clone.
var/attempting = 0 //One clone attempt at a time thanks
- var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
var/biomass = 0
var/speed_coeff
var/efficiency
@@ -33,6 +34,10 @@
var/obj/effect/countdown/clonepod/countdown
+ var/list/brine_types = list("corazone", "salbutamol", "hydrocodone")
+ var/list/missing_organs
+ var/organs_number = 0
+
light_color = LIGHT_COLOR_PURE_GREEN
/obj/machinery/clonepod/power_change()
@@ -82,12 +87,9 @@
/obj/machinery/clonepod/Destroy()
if(connected)
connected.pods -= src
- if(Radio)
- qdel(Radio)
- Radio = null
- if(countdown)
- qdel(countdown)
- countdown = null
+ QDEL_NULL(Radio)
+ QDEL_NULL(countdown)
+ QDEL_LIST(missing_organs)
return ..()
/obj/machinery/clonepod/RefreshParts()
@@ -97,23 +99,24 @@
efficiency += S.rating
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
speed_coeff += P.rating
- heal_level = min((efficiency * 15) + 10, 100)
+ heal_level = max(min((efficiency * 15) + 10, 100), MINIMUM_HEAL_LEVEL)
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
/obj/item/weapon/disk/data
name = "Cloning Data Disk"
- icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
- item_state = "card-id"
- w_class = 1
- var/datum/dna2/record/buf=null
+ var/datum/dna2/record/buf = null
var/read_only = 0 //Well,it's still a floppy disk
/obj/item/weapon/disk/data/proc/Initialize()
buf = new
buf.dna=new
+/obj/item/weapon/disk/data/Destroy()
+ QDEL_NULL(buf)
+ return ..()
+
/obj/item/weapon/disk/data/demo
name = "data disk - 'God Emperor of Mankind'"
read_only = 1
@@ -125,8 +128,12 @@
//data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff
buf.dna.real_name="God Emperor of Mankind"
buf.dna.unique_enzymes = md5(buf.dna.real_name)
- buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000)
+ buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000,0x000,0x328,0x045,0x5FC,0x053,0x035,0x035,0x035)
//buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff
+ if(buf.dna.UI.len != DNA_UI_LENGTH) //If there's a disparity b/w the dna UI string lengths, 0-fill the extra blocks in this UI.
+ for(var/i in buf.dna.UI.len to DNA_UI_LENGTH)
+ buf.dna.UI += 0x000
+ buf.dna.ResetSE()
buf.dna.UpdateUI()
/obj/item/weapon/disk/data/monkey
@@ -216,19 +223,21 @@
if(!G)
return 0
+/*
+ if(clonemind.damnation_type) //Can't clone the damned.
+ playsound('sound/hallucinations/veryfar_noise.ogg', 50, 0)
+ malfunction()
+ return -1 // so that the record gets flushed out
+ */
+
if(biomass >= CLONE_BIOMASS)
biomass -= CLONE_BIOMASS
else
return 0
attempting = 1 //One at a time!!
- locked = 1
countdown.start()
- eject_wait = 1
- spawn(30)
- eject_wait = 0
-
if(!R.dna)
R.dna = new /datum/dna()
@@ -245,9 +254,24 @@
for(var/datum/language/L in R.languages)
H.add_language(L.name)
+ domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
+
+ if(efficiency > 2 && efficiency < 5 && prob(25))
+ randmutb(H)
+ if(efficiency > 5 && prob(20))
+ randmutg(H)
+ if(efficiency < 3 && prob(50))
+ randmutb(H)
+
+ H.dna.UpdateSE()
+ H.dna.UpdateUI()
+
+ H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it
+ H.UpdateAppearance()
+
+ check_brine()
//Get the clone body ready
- H.adjustCloneLoss(190) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
- H.adjustBrainLoss(90) // The rand(10, 30) will come out as extra brain damage
+ maim_clone(H)
H.Paralyse(4)
//Here let's calculate their health so the pod doesn't immediately eject them!!!
@@ -265,21 +289,6 @@
beginning to regenerate in a cloning pod. You will
become conscious when it is complete."})
- domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
-
- if(efficiency > 2 && efficiency < 5 && prob(25))
- randmutb(H)
- if(efficiency > 5 && prob(20))
- randmutg(H)
- if(efficiency < 3 && prob(50))
- randmutb(H)
-
- H.dna.UpdateSE()
- H.dna.UpdateUI()
-
- H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it
- H.UpdateAppearance()
-
update_icon()
H.suiciding = 0
@@ -298,13 +307,11 @@
if(stat & NOPOWER) //Autoeject if power is lost
if(occupant)
- locked = 0
go_out()
connected_message("Clone Ejected: Loss of power.")
else if((occupant) && (occupant.loc == src))
if((occupant.stat == DEAD) || (occupant.suiciding)) //Autoeject corpses and suiciding dudes.
- locked = 0
announce_radio_message("The cloning of [occupant] has been aborted due to unrecoverable tissue failure.")
go_out()
connected_message("Clone Rejected: Deceased.")
@@ -315,34 +322,43 @@
//Slowly get that clone healed and finished.
occupant.adjustCloneLoss(-((speed_coeff/2)))
+ // For human species that lack non-vital parts for some weird reason
+ if(organs_number)
+ var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
+ progress += (100 - MINIMUM_HEAL_LEVEL)
+ var/milestone = CLONE_INITIAL_DAMAGE / organs_number
+// Doing this as a #define so that the value can change when evaluated multiple times
+#define INSTALLED (organs_number - LAZYLEN(missing_organs))
+
+ while((progress / milestone) > INSTALLED && LAZYLEN(missing_organs))
+ var/obj/item/organ/I = pick_n_take(missing_organs)
+ I.replaced(occupant)
+
+#undef INSTALLED
+
//Premature clones may have brain damage.
occupant.adjustBrainLoss(-((speed_coeff/20)*efficiency))
- //So clones don't die of oxyloss in a running pod.
- if(occupant.reagents.get_reagent_amount("salbutamol") < 5)
- occupant.reagents.add_reagent("salbutamol", 5)
+ check_brine()
//Also heal some oxyloss ourselves just in case!!
occupant.adjustOxyLoss(-4)
use_power(7500) //This might need tweaking.
- else if((occupant.cloneloss <= (100 - heal_level)) && (!eject_wait))
+ else if((occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
announce_radio_message("The cloning cycle of [occupant] is complete.")
- locked = 0
go_out()
else if((!occupant) || (occupant.loc != src))
occupant = null
- if(locked)
- locked = 0
update_icon()
use_power(200)
//Let's unlock this early I guess. Might be too early, needs tweaking.
/obj/machinery/clonepod/attackby(obj/item/weapon/W, mob/user, params)
- if(!(occupant || mess || locked))
+ if(!(occupant || mess))
if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W))
return
@@ -356,25 +372,25 @@
if(!check_access(W))
to_chat(user, "Access Denied. ")
return
- if (!locked || !occupant)
- return
- if(occupant.health < -20 && occupant.stat != DEAD)
- to_chat(user, "Access Refused. Patient status still unstable. ")
+ if(!(occupant || mess))
+ to_chat(user, "Error: Pod has no occupant. ")
return
else
- locked = 0
- to_chat(user, "System unlocked.")
+ connected_message("Authorized Ejection")
+ announce_radio_message("An authorized ejection of [occupant.real_name] has occured")
+ to_chat(user, "You force an emergency ejection. ")
+ go_out()
//Removing cloning pod biomass
else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
- to_chat(user, "\blue \The [src] processes \the [W].")
+ to_chat(user, "\The [src] processes \the [W]. ")
biomass += BIOMASS_MEAT_AMOUNT
user.drop_item()
qdel(W)
return
else if(istype(W, /obj/item/weapon/wrench))
- if(locked && (anchored || occupant))
- to_chat(user, "\red Can not do that while [src] is in use.")
+ if(occupant)
+ to_chat(user, "Can not do that while [src] is in use. ")
else
if(anchored)
anchored = 0
@@ -382,7 +398,7 @@
connected = null
else
anchored = 1
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
else
@@ -398,8 +414,6 @@
/obj/machinery/clonepod/emag_act(user)
if(isnull(occupant))
return
- to_chat(user, "You force an emergency ejection.")
- locked = 0
go_out()
/obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H)
@@ -434,21 +448,7 @@
connected.updateUsrDialog()
return 1
-/obj/machinery/clonepod/verb/eject()
- set name = "Eject Cloner"
- set category = "Object"
- set src in oview(1)
-
- if(!usr)
- return
- if(usr.incapacitated())
- return
- go_out()
- add_fingerprint(usr)
-
/obj/machinery/clonepod/proc/go_out()
- if(locked)
- return
countdown.stop()
if(mess) //Clean that mess and dump those gibs!
@@ -469,8 +469,11 @@
You feel like a new being. ")
occupant.flash_eyes(visual = 1)
+ for(var/i in missing_organs)
+ qdel(i)
+ missing_organs.Cut()
occupant.forceMove(get_turf(src))
- eject_wait = 0 //If it's still set somehow.
+ occupant.update_body()
domutcheck(occupant) //Waiting until they're out before possible notransform.
occupant.shock_stage = 0 //Reset Shock
occupant = null
@@ -480,19 +483,24 @@
if(occupant)
connected_message("Critical Error!")
announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.")
- mess = 1
- update_icon()
if(occupant.mind != clonemind)
clonemind.transfer_to(occupant)
occupant.grab_ghost() // We really just want to make you suffer.
to_chat(occupant, {"Agony blazes across your
consciousness as your body is torn apart.
Is this what dying is like? Yes it is. "})
- playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
+ for(var/i in missing_organs)
+ qdel(i)
+ missing_organs.Cut()
spawn(40)
qdel(occupant)
+
+ playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
+ mess = TRUE
+ update_icon()
+
/obj/machinery/clonepod/update_icon()
..()
icon_state = "pod_0"
@@ -534,6 +542,43 @@
else
return
+/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H)
+ LAZYINITLIST(missing_organs)
+ for(var/i in missing_organs)
+ qdel(i)
+ missing_organs.Cut()
+
+ H.setCloneLoss(CLONE_INITIAL_DAMAGE)
+ H.setBrainLoss(BRAIN_INITIAL_DAMAGE)
+
+ for(var/o in H.internal_organs)
+ var/obj/item/organ/O = o
+ if(!istype(O) || O.vital)
+ continue
+
+ // Let's non-specially remove all non-vital organs
+ // What could possibly go wrong
+ var/obj/item/I = O.remove(H)
+ // Make this support stuff that turns into items when removed
+ I.forceMove(src)
+ missing_organs += I
+
+ var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg")
+ for(var/zone in zones)
+ var/obj/item/organ/external/E = H.get_organ(zone)
+ var/obj/item/I = E.remove(H)
+ I.forceMove(src)
+ missing_organs += I
+
+ organs_number = LAZYLEN(missing_organs)
+
+/obj/machinery/clonepod/proc/check_brine()
+ // Clones are in a pickled bath of mild chemicals, keeping
+ // them alive, despite their lack of internal organs
+ for(var/bt in brine_types)
+ if(occupant.reagents.get_reagent_amount(bt) < 1)
+ occupant.reagents.add_reagent(bt, 1)
+
/*
* Diskette Box
*/
@@ -585,3 +630,5 @@
if(istype(A, /obj/machinery/clonepod))
A:malfunction()
*/
+
+#undef MINIMUM_HEAL_LEVEL
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index aa834941d78..ba7aadc3054 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -166,7 +166,7 @@
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- to_chat(user, "\blue You vastly increase projector power and override the safety and security protocols.")
+ to_chat(user, "You vastly increase projector power and override the safety and security protocols. ")
to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.")
log_game("[key_name(usr)] emagged the Holodeck Control Computer")
src.updateUsrDialog()
@@ -279,7 +279,7 @@
if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
return
for(var/mob/M in range(3,src))
- M.show_message("\b ERROR. Recalibrating projetion apparatus.")
+ M.show_message("ERROR. Recalibrating projection apparatus. ")
last_change = world.time
return
@@ -423,7 +423,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
force = 40
throwforce = 10
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
@@ -442,7 +442,7 @@
throw_speed = 1
throw_range = 5
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
armour_penetration = 50
block_chance = 50
var/active = 0
@@ -466,13 +466,13 @@
if(active)
force = 30
icon_state = "sword[item_color]"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
to_chat(user, "[src] is now active. ")
else
force = 3
icon_state = "sword0"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
to_chat(user, "[src] can now be concealed. ")
if(istype(user,/mob/living/carbon/human))
@@ -489,7 +489,7 @@
name = "basketball"
item_state = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
- w_class = 4 //Stops people from hiding it in their bags/pockets
+ w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets
/obj/structure/holohoop
name = "basketball hoop"
@@ -498,7 +498,7 @@
icon_state = "hoop"
anchored = 1
density = 1
- throwpass = 1
+ pass_flags = LETPASSTHROW
/obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
@@ -516,7 +516,7 @@
visible_message("[user] dunks [W] into the [src]! ")
return
-/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover,/obj/item) && mover.throwing)
var/obj/item/I = mover
if(istype(I, /obj/item/projectile))
@@ -528,7 +528,7 @@
visible_message("\The [I] bounces off of \the [src]'s rim! ")
return 0
else
- return ..(mover, target, height, air_group)
+ return ..(mover, target, height)
/obj/machinery/readybutton
name = "Ready Declaration Device"
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 29e315ec001..7fc95ebfa53 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -10,21 +10,18 @@
var/obj/item/device/mmi/brain = null
/obj/structure/AIcore/Destroy()
- qdel(laws)
- qdel(circuit)
- qdel(brain)
- laws = null
- circuit = null
- brain = null
+ QDEL_NULL(laws)
+ QDEL_NULL(circuit)
+ QDEL_NULL(brain)
return ..()
/obj/structure/AIcore/attackby(obj/item/P as obj, mob/user as mob, params)
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- to_chat(user, "\blue You wrench the frame into place.")
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
+ to_chat(user, "You wrench the frame into place. ")
anchored = 1
state = 1
if(istype(P, /obj/item/weapon/weldingtool))
@@ -32,51 +29,51 @@
if(!WT.isOn())
to_chat(user, "The welder must be on for this task.")
return
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(0, user)) return
- to_chat(user, "\blue You deconstruct the frame.")
+ to_chat(user, "You deconstruct the frame. ")
new /obj/item/stack/sheet/plasteel(loc, 4)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- to_chat(user, "\blue You unfasten the frame.")
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
+ to_chat(user, "You unfasten the frame. ")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- to_chat(user, "\blue You place the circuit board inside the frame.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You place the circuit board inside the frame. ")
icon_state = "1"
circuit = P
user.drop_item()
P.loc = src
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "\blue You screw the circuit board into place.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You screw the circuit board into place. ")
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- to_chat(user, "\blue You remove the circuit board.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You remove the circuit board. ")
state = 1
icon_state = "0"
circuit.loc = loc
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "\blue You unfasten the circuit board.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You unfasten the circuit board. ")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
if(P:amount >= 5)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
P:amount -= 5
if(!P:amount) qdel(P)
- to_chat(user, "\blue You add cables to the frame.")
+ to_chat(user, "You add cables to the frame. ")
state = 3
icon_state = "3"
if(3)
@@ -84,8 +81,8 @@
if(brain)
to_chat(user, "Get that brain out of there first")
else
- playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
- to_chat(user, "\blue You remove the cables.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You remove the cables. ")
state = 2
icon_state = "2"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
@@ -93,12 +90,12 @@
if(istype(P, /obj/item/stack/sheet/rglass))
if(P:amount >= 2)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
if(P)
P:amount -= 2
if(!P:amount) qdel(P)
- to_chat(user, "\blue You put in the glass panel.")
+ to_chat(user, "You put in the glass panel. ")
state = 4
icon_state = "4"
@@ -122,14 +119,14 @@
if(istype(P, /obj/item/device/mmi) || istype(P, /obj/item/device/mmi/posibrain))
if(!P:brainmob)
- to_chat(user, "\red Sticking an empty [P] into the frame would sort of defeat the purpose.")
+ to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose. ")
return
if(P:brainmob.stat == 2)
- to_chat(user, "\red Sticking a dead [P] into the frame would sort of defeat the purpose.")
+ to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose. ")
return
if(jobban_isbanned(P:brainmob, "AI") || jobban_isbanned(P:brainmob,"nonhumandept"))
- to_chat(user, "\red This [P] does not seem to fit.")
+ to_chat(user, "This [P] does not seem to fit. ")
return
if(istype(P, /obj/item/device/mmi/syndie))
@@ -147,16 +144,16 @@
icon_state = "3b"
if(istype(P, /obj/item/weapon/crowbar) && brain)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- to_chat(user, "\blue You remove the brain.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You remove the brain. ")
brain.loc = loc
brain = null
icon_state = "3"
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- to_chat(user, "\blue You remove the glass panel.")
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You remove the glass panel. ")
state = 3
if(brain)
icon_state = "3b"
@@ -166,7 +163,7 @@
return
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor. ")
if(!brain)
var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
@@ -198,19 +195,19 @@
card.transfer_ai("INACTIVE","AICARD",src,user)
else if(istype(W, /obj/item/weapon/wrench))
if(anchored)
- user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...")
- if(!do_after(user,40, target = src))
- user.visible_message("\blue \The [user] decides not to unbolt \the [src].")
+ user.visible_message("\The [user] starts to unbolt \the [src] from the plating... ")
+ if(!do_after(user, 40 * W.toolspeed, target = src))
+ user.visible_message("\The [user] decides not to unbolt \the [src]. ")
return
- user.visible_message("\blue \The [user] finishes unfastening \the [src]!")
+ user.visible_message("\The [user] finishes unfastening \the [src]! ")
anchored = 0
return
else
- user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...")
- if(!do_after(user,40, target = src))
- user.visible_message("\blue \The [user] decides not to bolt \the [src].")
+ user.visible_message("\The [user] starts to bolt \the [src] to the plating... ")
+ if(!do_after(user, 40 * W.toolspeed, target = src))
+ user.visible_message("\The [user] decides not to bolt \the [src]. ")
return
- user.visible_message("\blue \The [user] finishes fastening down \the [src]!")
+ user.visible_message("\The [user] finishes fastening down \the [src]! ")
anchored = 1
return
else
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 539edb24d65..bcdd075bea6 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -142,14 +142,12 @@
/obj/machinery/computer/aifixer/Destroy()
if(occupant)
occupant.ghostize()
- qdel(occupant)
- occupant = null
+ QDEL_NULL(occupant)
return ..()
/obj/machinery/computer/aifixer/emp_act()
if(occupant)
occupant.ghostize()
- qdel(occupant)
- occupant = null
+ QDEL_NULL(occupant)
else
..()
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 603c0483129..b0dde9e20cd 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -991,7 +991,7 @@
desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
icon = 'icons/obj/toy.dmi'
icon_state = "ship"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/active = 0 //if the ship is on
/obj/item/weapon/orion_ship/examine(mob/user)
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 197008c40f7..0f555a1169b 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -25,7 +25,7 @@
return 1
ui_interact(user)
-/obj/machinery/computer/atmoscontrol/emag_act(var/remaining_carges, var/mob/user)
+/obj/machinery/computer/atmoscontrol/emag_act(mob/user)
if(!emagged)
user.visible_message("\The [user] does something \the [src], causing the screen to flash! ",\
"You cause the screen to flash as you gain full control. ",\
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 0c09bc5f2c5..22355ed4fbc 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -13,7 +13,7 @@
/obj/item/weapon/circuitboard
density = 0
anchored = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
name = "circuit board"
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"
@@ -29,7 +29,14 @@
var/list/records = null
var/frame_desc = null
var/contain_parts = 1
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
+/obj/item/weapon/circuitboard/computer
+ board_type = "computer"
+
+/obj/item/weapon/circuitboard/machine
+ board_type = "machine"
/obj/item/weapon/circuitboard/message_monitor
name = "Circuit board (Message Monitor)"
@@ -39,6 +46,10 @@
name = "Circuit board (Camera Monitor)"
build_path = /obj/machinery/computer/security
origin_tech = "programming=2"
+/obj/item/weapon/circuitboard/xenobiology
+ name = "Circuit board (Xenobiology Console)"
+ build_path = /obj/machinery/computer/camera_advanced/xenobio
+ origin_tech = "programming=3;biotech=3"
/obj/item/weapon/circuitboard/aicore
name = "Circuit board (AI Core)"
origin_tech = "programming=4;biotech=2"
@@ -69,6 +80,26 @@
/obj/item/weapon/circuitboard/card
name = "Circuit board (ID Computer)"
build_path = /obj/machinery/computer/card
+/obj/item/weapon/circuitboard/card/minor
+ name = "Circuit board (Dept ID Computer)"
+ build_path = /obj/machinery/computer/card/minor
+ var/target_dept = TARGET_DEPT_GENERIC
+/obj/item/weapon/circuitboard/card/minor/hos
+ name = "Circuit board (Sec ID Computer)"
+ build_path = /obj/machinery/computer/card/minor/hos
+ target_dept = TARGET_DEPT_SEC
+/obj/item/weapon/circuitboard/card/minor/cmo
+ name = "Circuit board (Medical ID Computer)"
+ build_path = /obj/machinery/computer/card/minor/cmo
+ target_dept = TARGET_DEPT_MED
+/obj/item/weapon/circuitboard/card/minor/rd
+ name = "Circuit board (Science ID Computer)"
+ build_path = /obj/machinery/computer/card/minor/rd
+ target_dept = TARGET_DEPT_SCI
+/obj/item/weapon/circuitboard/card/minor/ce
+ name = "Circuit board (Engineering ID Computer)"
+ build_path = /obj/machinery/computer/card/minor/ce
+ target_dept = TARGET_DEPT_ENG
/obj/item/weapon/circuitboard/card/centcom
name = "Circuit board (CentComm ID Computer)"
build_path = /obj/machinery/computer/card/centcom
@@ -345,8 +376,8 @@
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "You wrench the frame into place. ")
anchored = 1
state = 1
@@ -355,23 +386,23 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task. ")
return
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "You deconstruct the frame. ")
new /obj/item/stack/sheet/metal(loc, 5)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "You unfasten the frame. ")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, B.usesound, 50, 1)
to_chat(user, "You place the circuit board inside the frame. ")
icon_state = "1"
circuit = P
@@ -380,12 +411,12 @@
else
to_chat(user, "This frame does not accept circuit boards of this type! ")
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You screw the circuit board into place. ")
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the circuit board. ")
state = 1
icon_state = "0"
@@ -393,16 +424,16 @@
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You unfasten the circuit board. ")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, C.usesound, 50, 1)
to_chat(user, "You start to add cables to the frame. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(state == 2 && C.amount >= 5 && C.use(5))
to_chat(user, "You add cables to the frame. ")
state = 3
@@ -415,7 +446,7 @@
return
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables. ")
state = 2
icon_state = "2"
@@ -425,9 +456,9 @@
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = P
if(G.amount >= 2)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, G.usesound, 50, 1)
to_chat(user, "You start to add the glass panel to the frame. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * G.toolspeed, target = src))
if(state == 3 && G.amount >= 2 && G.use(2))
to_chat(user, "You put in the glass panel. ")
state = 4
@@ -440,13 +471,13 @@
return
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the glass panel. ")
state = 3
icon_state = "3"
new /obj/item/stack/sheet/glass(loc, 2)
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor. ")
var/B = new circuit.build_path (loc)
if(circuit.powernet) B:powernet = circuit.powernet
@@ -469,7 +500,7 @@
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
if(do_after(user, 20, target = src))
to_chat(user, "You wrench the frame into place. ")
anchored = 1
@@ -479,23 +510,23 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task. ")
return
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "You deconstruct the frame. ")
new /obj/item/stack/sheet/mineral/bananium(loc, 5)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "You unfasten the frame. ")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "honkcomputer")
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You place the circuit board inside the frame. ")
icon_state = "1"
circuit = P
@@ -504,12 +535,12 @@
else
to_chat(user, "This frame does not accept circuit boards of this type! ")
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You screw the circuit board into place. ")
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the circuit board. ")
state = 1
icon_state = "0"
@@ -517,16 +548,16 @@
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You unfasten the circuit board. ")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, C.usesound, 50, 1)
to_chat(user, "You start to add cables to the frame. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(state == 2 && C.amount >= 5 && C.use(5))
to_chat(user, "You add cables to the frame. ")
state = 3
@@ -539,7 +570,7 @@
return
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables. ")
state = 2
icon_state = "2"
@@ -549,9 +580,9 @@
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = P
if(G.amount >= 2)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, G.usesound, 50, 1)
to_chat(user, "You start to add the glass panel to the frame. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * G.toolspeed, target = src))
if(state == 3 && G.amount >= 2 && G.use(2))
to_chat(user, "You put in the glass panel. ")
state = 4
@@ -564,13 +595,13 @@
return
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the glass panel. ")
state = 3
icon_state = "3"
new /obj/item/stack/sheet/glass(loc, 2)
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor. ")
var/B = new circuit.build_path (loc)
if(circuit.powernet) B:powernet = circuit.powernet
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 3d1df935cf8..2195ee25522 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -28,8 +28,7 @@
/obj/machinery/computer/camera_advanced/Destroy()
if(current_user)
current_user.unset_machine()
- if(eyeobj)
- qdel(eyeobj)
+ QDEL_NULL(eyeobj)
return ..()
/obj/machinery/computer/camera_advanced/on_unset_machine(mob/M)
@@ -37,18 +36,19 @@
off_action.Activate()
/obj/machinery/computer/camera_advanced/attack_hand(mob/user)
- if(..())
- return
- if(!iscarbon(user))
- return
if(current_user)
to_chat(user, "The console is already in use!")
return
-
+ if(!iscarbon(user))
+ return
+ if(..())
+ return
user.set_machine(src)
+
if(!eyeobj)
CreateEye()
- if(!eyeobj.initialized)
+
+ if(!eyeobj.eye_initialized)
var/camera_location
for(var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use())
@@ -57,7 +57,7 @@
camera_location = get_turf(C)
break
if(camera_location)
- eyeobj.initialized = 1
+ eyeobj.eye_initialized = 1
give_eye_control(user)
eyeobj.setLoc(camera_location)
else
@@ -66,6 +66,7 @@
user.unset_machine()
else
give_eye_control(user)
+ eyeobj.setLoc(eyeobj.loc)
/obj/machinery/computer/camera_advanced/proc/give_eye_control(mob/user)
@@ -77,7 +78,6 @@
user.remote_view = 1
user.remote_control = eyeobj
user.reset_perspective(eyeobj)
- eyeobj.setLoc(eyeobj.loc)
/mob/camera/aiEye/remote
name = "Inactive Camera Eye"
@@ -86,10 +86,15 @@
var/acceleration = 1
var/mob/living/carbon/human/eye_user = null
var/obj/machinery/computer/camera_advanced/origin
- var/initialized = 0
+ var/eye_initialized = 0
var/visible_icon = 0
var/image/user_image = null
+/mob/camera/aiEye/remote/Destroy()
+ eye_user = null
+ origin = null
+ return ..()
+
/mob/camera/aiEye/remote/GetViewerClient()
if(eye_user)
return eye_user.client
@@ -102,12 +107,11 @@
T = get_turf(T)
loc = T
cameranet.visibility(src)
- if(eye_user.client)
- if(visible_icon)
+ if(visible_icon)
+ if(eye_user.client)
eye_user.client.images -= user_image
user_image = image(icon,loc,icon_state,FLY_LAYER)
eye_user.client.images += user_image
- eye_user.client.eye = src
/mob/camera/aiEye/remote/relaymove(mob/user,direct)
var/initial = initial(sprint)
@@ -140,14 +144,16 @@
remote_eye.origin.current_user = null
remote_eye.origin.jump_action.Remove(C)
remote_eye.eye_user = null
- C.reset_perspective(null)
if(C.client)
- C.client.images -= remote_eye.user_image
+ C.reset_perspective(null)
+ if(remote_eye.visible_icon)
+ C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
C.client.images -= chunk.obscured
C.remote_control = null
C.unset_machine()
src.Remove(C)
+ playsound(remote_eye.origin, 'sound/machines/terminal_off.ogg', 25, 0)
/datum/action/innate/camera_jump
name = "Jump To Camera"
@@ -175,7 +181,14 @@
T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam
+ playsound(origin, 'sound/machines/terminal_prompt.ogg', 25, 0)
var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T
var/obj/machinery/camera/final = T[camera]
+ playsound(origin, "terminal_type", 25, 0)
if(final)
+ playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
remote_eye.setLoc(get_turf(final))
+ C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/noise)
+ C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console!
+ else
+ playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index ebba68ec570..a6c072fec60 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -14,6 +14,7 @@ var/time_last_changed_position = 0
var/obj/item/weapon/card/id/modify = null
var/mode = 0.0
var/printing = null
+ var/target_dept = 0 //Which department this computer has access to. 0=all departments
//Cooldown for closing positions in seconds
//if set to -1: No cooldown... probably a bad idea
@@ -65,10 +66,11 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card/proc/format_jobs(list/jobs)
var/list/formatted = list()
for(var/job in jobs)
- formatted.Add(list(list(
- "display_name" = replacetext(job, " ", " "),
- "target_rank" = get_target_rank(),
- "job" = job)))
+ if(job_in_department(job_master.GetJob(job)))
+ formatted.Add(list(list(
+ "display_name" = replacetext(job, " ", " "),
+ "target_rank" = get_target_rank(),
+ "job" = job)))
return formatted
@@ -77,6 +79,8 @@ var/time_last_changed_position = 0
for(var/datum/job/job in job_master.occupations)
if(job_blacklisted(job))
continue
+ if(!job_in_department(job))
+ continue
formatted.Add(list(list(
"title" = job.title,
"current_positions" = job.current_positions,
@@ -92,7 +96,6 @@ var/time_last_changed_position = 0
formatted.Add(list(list(
"display_name" = get_skin_desc(skin),
"skin" = skin)))
-
return formatted
/obj/machinery/computer/card/verb/eject_id()
@@ -100,23 +103,23 @@ var/time_last_changed_position = 0
set name = "Eject ID Card"
set src in oview(1)
- if(!usr || usr.stat || usr.lying) return
+ if(usr.restrained())
+ return
if(scan)
to_chat(usr, "You remove \the [scan] from \the [src].")
- scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ scan.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(scan)
scan = null
else if(modify)
to_chat(usr, "You remove \the [modify] from \the [src].")
- modify.loc = get_turf(src)
- if(!usr.get_active_hand())
+ modify.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(modify)
modify = null
else
to_chat(usr, "There is nothing to remove from the console.")
- return
/obj/machinery/computer/card/attackby(obj/item/weapon/card/id/id_card, mob/user, params)
if(!istype(id_card))
@@ -141,7 +144,7 @@ var/time_last_changed_position = 0
//Logic check for Topic() if you can open the job
/obj/machinery/computer/card/proc/can_open_job(datum/job/job)
if(job)
- if(!job_blacklisted(job))
+ if(!job_blacklisted(job) && job_in_department(job, FALSE))
if((job.total_positions <= player_list.len * (max_relative_positions / 100)))
var/delta = (world.time / 10) - time_last_changed_position
if((change_position_cooldown < delta) || (opened_positions[job.title] < 0))
@@ -153,7 +156,7 @@ var/time_last_changed_position = 0
//Logic check for Topic() if you can close the job
/obj/machinery/computer/card/proc/can_close_job(datum/job/job)
if(job)
- if(!job_blacklisted(job))
+ if(!job_blacklisted(job) && job_in_department(job, FALSE))
if(job.total_positions > job.current_positions)
var/delta = (world.time / 10) - time_last_changed_position
if((change_position_cooldown < delta) || (opened_positions[job.title] > 0))
@@ -162,6 +165,28 @@ var/time_last_changed_position = 0
return -1
return 0
+/obj/machinery/computer/card/proc/job_in_department(datum/job/targetjob, includecivs = 1)
+ if(!scan || !scan.access)
+ return 0
+ if(!target_dept)
+ return 1
+ if(!scan.assignment)
+ return 0
+ if(!targetjob || !targetjob.title)
+ return 0
+ if(targetjob.title in get_subordinates(scan.assignment, includecivs))
+ return 1
+ return 0
+
+/obj/machinery/computer/card/proc/get_subordinates(rank, addcivs)
+ var/list/jobs_returned = list()
+ for(var/datum/job/thisjob in job_master.occupations)
+ if(rank in thisjob.department_head)
+ jobs_returned += thisjob.title
+ if(addcivs)
+ jobs_returned += "Civilian"
+ return jobs_returned
+
/obj/machinery/computer/card/attack_ai(var/mob/user as mob)
return attack_hand(user)
@@ -198,6 +223,7 @@ var/time_last_changed_position = 0
data["centcom_access"] = is_centcom()
data["all_centcom_access"] = null
data["regions"] = null
+ data["target_dept"] = target_dept
data["engineering_jobs"] = format_jobs(engineering_positions)
data["medical_jobs"] = format_jobs(medical_positions)
@@ -260,39 +286,39 @@ var/time_last_changed_position = 0
data_core.manifest_modify(modify.registered_name, modify.assignment)
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
if(ishuman(usr))
- modify.loc = usr.loc
- if(!usr.get_active_hand())
+ modify.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(modify)
modify = null
else
- modify.loc = loc
+ modify.forceMove(get_turf(src))
modify = null
- else
+ else if(Adjacent(usr))
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
- I.loc = src
+ I.forceMove(src)
modify = I
if("scan")
if(scan)
if(ishuman(usr))
- scan.loc = usr.loc
- if(!usr.get_active_hand())
+ scan.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(scan)
scan = null
else
- scan.loc = src.loc
+ scan.forceMove(get_turf(src))
scan = null
- else
+ else if(Adjacent(usr))
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
- I.loc = src
+ I.forceMove(src)
scan = I
if("access")
- if(href_list["allowed"])
+ if(href_list["allowed"] && !target_dept)
if(is_authenticated(usr))
var/access_type = text2num(href_list["access_target"])
var/access_allowed = text2num(href_list["allowed"])
@@ -302,13 +328,22 @@ var/time_last_changed_position = 0
modify.access += access_type
if("skin")
- var/skin = href_list["skin_target"]
- if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom())))
- modify.icon_state = href_list["skin_target"]
+ if(!target_dept)
+ var/skin = href_list["skin_target"]
+ if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom())))
+ modify.icon_state = href_list["skin_target"]
if("assign")
if(is_authenticated(usr) && modify)
var/t1 = href_list["assign_target"]
+ if(target_dept && modify.assignment == "Unassigned")
+ visible_message("[src]: Demoted individuals must see the HoP for a new job. ")
+ return 0
+ if(!job_in_department(job_master.GetJob(modify.rank), FALSE))
+ visible_message("[src]: Cross-department job transfers must be done by the HoP. ")
+ return 0
+ if(!job_in_department(job_master.GetJob(t1)))
+ return 0
if(t1 == "Custom")
var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
//let custom jobs function as an impromptu alt title, mainly for sechuds
@@ -326,30 +361,31 @@ var/time_last_changed_position = 0
jobdatum = J
break
if(!jobdatum)
- to_chat(usr, "\red No log exists for this job: [t1]")
+ to_chat(usr, "No log exists for this job: [t1] ")
return
access = jobdatum.get_access()
modify.access = access
- modify.assignment = t1
modify.rank = t1
+ modify.assignment = t1
+
callHook("reassign_employee", list(modify))
if("reg")
- if(is_authenticated(usr))
+ if(is_authenticated(usr) && !target_dept)
var/t2 = modify
if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
var/temp_name = reject_bad_name(href_list["reg"])
if(temp_name)
modify.registered_name = temp_name
else
- src.visible_message("[src] buzzes rudely. ")
+ visible_message("[src] buzzes rudely. ")
nanomanager.update_uis(src)
if("account")
- if(is_authenticated(usr))
+ if(is_authenticated(usr) && !target_dept)
var/t2 = modify
if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
var/account_num = text2num(href_list["account"])
@@ -360,9 +396,9 @@ var/time_last_changed_position = 0
mode = text2num(href_list["mode_target"])
if("print")
- if(!printing)
+ if(!printing && !target_dept)
printing = 1
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
spawn(50)
printing = null
nanomanager.update_uis(src)
@@ -393,17 +429,36 @@ var/time_last_changed_position = 0
P.info += ""
if("terminate")
- if(is_authenticated(usr))
+ if(is_authenticated(usr) && !target_dept)
modify.assignment = "Terminated"
modify.access = list()
-
callHook("terminate_employee", list(modify))
+ if("demote")
+ if(is_authenticated(usr))
+ if(modify.assignment == "Unassigned")
+ visible_message("[src]: Unassigned crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination. ")
+ return 0
+ if(!job_in_department(job_master.GetJob(modify.rank), FALSE))
+ visible_message("[src]: Heads may only demote members of their own department. ")
+ return 0
+
+ var/list/access = list()
+ var/datum/job/jobdatum = new /datum/job/civilian
+ access = jobdatum.get_access()
+
+ modify.access = access
+ modify.rank = "Civilian"
+ modify.assignment = "Unassigned"
+ modify.icon_state = "id"
+
if("make_job_available")
// MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
if(is_authenticated(usr))
var/edit_job_target = href_list["job"]
var/datum/job/j = job_master.GetJob(edit_job_target)
+ if(!job_in_department(j, FALSE))
+ return 0
if(!j)
return 0
if(can_open_job(j) != 1)
@@ -412,6 +467,7 @@ var/time_last_changed_position = 0
time_last_changed_position = world.time / 10
j.total_positions++
opened_positions[edit_job_target]++
+ log_game("[key_name(usr)] has opened a job slot for job \"[j]\".")
nanomanager.update_uis(src)
if("make_job_unavailable")
@@ -419,6 +475,8 @@ var/time_last_changed_position = 0
if(is_authenticated(usr))
var/edit_job_target = href_list["job"]
var/datum/job/j = job_master.GetJob(edit_job_target)
+ if(!job_in_department(j, FALSE))
+ return 0
if(!j)
return 0
if(can_close_job(j) != 1)
@@ -428,6 +486,7 @@ var/time_last_changed_position = 0
time_last_changed_position = world.time / 10
j.total_positions--
opened_positions[edit_job_target]--
+ log_game("[key_name(usr)] has closed a job slot for job \"[j]\".")
nanomanager.update_uis(src)
if(modify)
@@ -439,3 +498,43 @@ var/time_last_changed_position = 0
name = "\improper CentComm identification computer"
circuit = /obj/item/weapon/circuitboard/card/centcom
req_access = list(access_cent_commander)
+ change_position_cooldown = -1
+ blacklisted = list()
+
+/obj/machinery/computer/card/minor
+ name = "department management console"
+ target_dept = TARGET_DEPT_GENERIC
+ desc = "You can use this to change ID's for specific departments."
+ icon_screen = "idminor"
+ circuit = /obj/item/weapon/circuitboard/card/minor
+
+/obj/machinery/computer/card/minor/hos
+ name = "security management console"
+ target_dept = TARGET_DEPT_SEC
+ icon_screen = "idhos"
+ light_color = LIGHT_COLOR_RED
+ req_access = list(access_hos)
+ circuit = /obj/item/weapon/circuitboard/card/minor/hos
+
+/obj/machinery/computer/card/minor/cmo
+ name = "medical management console"
+ target_dept = TARGET_DEPT_MED
+ icon_screen = "idcmo"
+ req_access = list(access_cmo)
+ circuit = /obj/item/weapon/circuitboard/card/minor/cmo
+
+/obj/machinery/computer/card/minor/rd
+ name = "science management console"
+ target_dept = TARGET_DEPT_SCI
+ icon_screen = "idrd"
+ light_color = LIGHT_COLOR_PINK
+ req_access = list(access_rd)
+ circuit = /obj/item/weapon/circuitboard/card/minor/rd
+
+/obj/machinery/computer/card/minor/ce
+ name = "engineering management console"
+ target_dept = TARGET_DEPT_ENG
+ icon_screen = "idce"
+ light_color = COLOR_YELLOW
+ req_access = list(access_ce)
+ circuit = /obj/item/weapon/circuitboard/card/minor/ce
\ No newline at end of file
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 0d47420edc9..5f72dab528c 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -310,6 +310,7 @@
temp = "Error: No cloning pod detected. "
else
var/obj/machinery/clonepod/pod = selected_pod
+ var/cloneresult
if(!selected_pod)
temp = "Error: No cloning pod selected. "
else if(pod.occupant)
@@ -320,13 +321,16 @@
temp = "Error: The cloning pod is malfunctioning. "
else if(!config.revival_cloning)
temp = "Error: Unable to initiate cloning cycle. "
- else if(pod.growclone(C))
- temp = "Initiating cloning cycle..."
- records.Remove(C)
- qdel(C)
- menu = 1
else
- temp = "[C.name] => Initialisation failure. "
+ cloneresult = pod.growclone(C)
+ if(cloneresult)
+ if(cloneresult > 0)
+ temp = "Initiating cloning cycle..."
+ records.Remove(C)
+ qdel(C)
+ menu = 1
+ else
+ temp = "[C.name] => Initialisation failure. "
else
temp = "Error: Data corruption. "
@@ -413,13 +417,10 @@
R.languages=subject.languages
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
- if(isnull(imp))
+ if(!imp)
imp = new /obj/item/weapon/implant/health(subject)
- imp.implanted = subject
- R.implant = "\ref[imp]"
- //Update it if needed
- else
- R.implant = "\ref[imp]"
+ imp.implant(subject)
+ R.implant = "\ref[imp]"
if(!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.mind = "\ref[subject.mind]"
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 86a8b2d2bcf..2b3d461da4c 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -39,7 +39,7 @@
/obj/machinery/computer/communications/New()
shuttle_caller_list += src
..()
- crew_announcement.newscast = 1
+ crew_announcement.newscast = 0
/obj/machinery/computer/communications/proc/is_authenticated(var/mob/user, var/message = 1)
if(authenticated == COMM_AUTHENTICATION_MAX)
@@ -53,6 +53,24 @@
to_chat(user, "Access denied. ")
return COMM_AUTHENTICATION_NONE
+/obj/machinery/computer/communications/proc/change_security_level(var/new_level)
+ tmp_alertlevel = new_level
+ var/old_level = security_level
+ if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
+ set_security_level(tmp_alertlevel)
+ if(security_level != old_level)
+ //Only notify the admins if an actual change happened
+ log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
+ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
+ switch(security_level)
+ if(SEC_LEVEL_GREEN)
+ feedback_inc("alert_comms_green",1)
+ if(SEC_LEVEL_BLUE)
+ feedback_inc("alert_comms_blue",1)
+ tmp_alertlevel = 0
+
/obj/machinery/computer/communications/Topic(href, href_list)
if(..(href, href_list))
return 1
@@ -100,35 +118,25 @@
if("newalertlevel")
if(isAI(usr) || isrobot(usr))
to_chat(usr, "Firewalls prevent you from changing the alert level. ")
- nanomanager.update_uis(src)
return 1
- tmp_alertlevel = text2num(href_list["level"])
+ else if(usr.can_admin_interact())
+ change_security_level(text2num(href_list["level"]))
+ return 1
+ else if(!ishuman(usr))
+ to_chat(usr, "Security measures prevent you from changing the alert level. ")
+ return 1
+
var/mob/living/carbon/human/L = usr
var/obj/item/card = L.get_active_hand()
- var/obj/item/weapon/card/id/I = (card && card.GetID())||L.wear_id||L.wear_pda
+ var/obj/item/weapon/card/id/I = (card && card.GetID()) || L.wear_id || L.wear_pda
if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
if(I && istype(I))
if(access_captain in I.access)
- var/old_level = security_level
- if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
- if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN
- if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
- set_security_level(tmp_alertlevel)
- if(security_level != old_level)
- //Only notify the admins if an actual change happened
- log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
- message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
- switch(security_level)
- if(SEC_LEVEL_GREEN)
- feedback_inc("alert_comms_green",1)
- if(SEC_LEVEL_BLUE)
- feedback_inc("alert_comms_blue",1)
- tmp_alertlevel = 0
+ change_security_level(text2num(href_list["level"]))
else
to_chat(usr, "You are not authorized to do this. ")
- tmp_alertlevel = 0
setMenuState(usr,COMM_SCREEN_MAIN)
else
to_chat(usr, "You need to swipe your ID. ")
@@ -172,24 +180,26 @@
setMenuState(usr,COMM_SCREEN_MAIN)
if("messagelist")
- src.currmsg = 0
+ currmsg = 0
if(href_list["msgid"])
setCurrentMessage(usr, text2num(href_list["msgid"]))
setMenuState(usr,COMM_SCREEN_MESSAGES)
if("delmessage")
if(href_list["msgid"])
- src.currmsg = text2num(href_list["msgid"])
+ currmsg = text2num(href_list["msgid"])
var/response = alert("Are you sure you wish to delete this message?", "Confirm", "Yes", "No")
if(response == "Yes")
- if(src.currmsg)
+ if(currmsg)
var/id = getCurrentMessage()
- var/title = src.messagetitle[id]
- var/text = src.messagetext[id]
- src.messagetitle.Remove(title)
- src.messagetext.Remove(text)
- if(currmsg==id) currmsg=0
- if(aicurrmsg==id) aicurrmsg=0
+ var/title = messagetitle[id]
+ var/text = messagetext[id]
+ messagetitle.Remove(title)
+ messagetext.Remove(text)
+ if(currmsg == id)
+ currmsg = 0
+ if(aicurrmsg == id)
+ aicurrmsg = 0
setMenuState(usr,COMM_SCREEN_MESSAGES)
if("status")
@@ -200,11 +210,11 @@
display_type=href_list["statdisp"]
switch(display_type)
if("message")
- post_status("message", stat_msg1, stat_msg2)
+ post_status("message", stat_msg1, stat_msg2, usr)
if("alert")
- post_status("alert", href_list["alert"])
+ post_status("alert", href_list["alert"], user = usr)
else
- post_status(href_list["statdisp"])
+ post_status(href_list["statdisp"], user = usr)
setMenuState(usr,COMM_SCREEN_STAT)
if("setmsg1")
@@ -292,12 +302,12 @@
to_chat(usr, "Docking request accepted!")
trade_dock_timelimit = world.time + 1200
trade_dockrequest_timelimit = 0
- command_announcement.Announce("Docking request for trading ship approved, please dock at port bay 4.", "Docking Request")
+ event_announcement.Announce("Docking request for trading ship approved, please dock at port bay 4.", "Docking Request")
if("DenyDocking")
to_chat(usr, "Docking requeset denied!")
trade_dock_timelimit = 0
trade_dockrequest_timelimit = 0
- command_announcement.Announce("Docking request for trading ship denied.", "Docking request")
+ event_announcement.Announce("Docking request for trading ship denied.", "Docking request")
nanomanager.update_uis(src)
return 1
@@ -336,7 +346,7 @@
/obj/machinery/computer/communications/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
- data["is_ai"] = isAI(user)||isrobot(user)
+ data["is_ai"] = isAI(user) || isrobot(user)
data["menu_state"] = data["is_ai"] ? ai_menu_state : menu_state
data["emagged"] = emagged
data["authenticated"] = is_authenticated(user, 0)
@@ -369,15 +379,14 @@
//SEC_LEVEL_RED = list("name"="Red"),
)
- var/msg_data[0]
- for(var/i = 1; i <= src.messagetext.len; i++)
- var/cur_msg[0]
- cur_msg["title"] = messagetitle[i]
- cur_msg["body"] = messagetext[i]
- msg_data += list(cur_msg)
+ var/list/msg_data = list()
+ for(var/i = 1; i <= messagetext.len; i++)
+ msg_data.Add(list(list("title" = messagetitle[i], "body" = messagetext[i], "id" = i)))
data["messages"] = msg_data
- data["current_message"] = data["is_ai"] ? aicurrmsg : currmsg
+ if((data["is_ai"] && aicurrmsg) || (!data["is_ai"] && currmsg))
+ data["current_message"] = data["is_ai"] ? messagetext[aicurrmsg] : messagetext[currmsg]
+ data["current_message_title"] = data["is_ai"] ? messagetitle[aicurrmsg] : messagetitle[currmsg]
data["lastCallLoc"] = shuttle_master.emergencyLastCallLoc ? format_text(shuttle_master.emergencyLastCallLoc.name) : null
@@ -403,9 +412,9 @@
/obj/machinery/computer/communications/proc/setCurrentMessage(var/mob/user,var/value)
if(isAI(user) || isrobot(user))
- aicurrmsg=value
+ aicurrmsg = value
else
- currmsg=value
+ currmsg = value
/obj/machinery/computer/communications/proc/getCurrentMessage(var/mob/user)
if(isAI(user) || isrobot(user))
@@ -490,7 +499,7 @@
message_admins("[key_name_admin(user)] has recalled the shuttle - [formatJumpTo(user)].", 1)
return
-/obj/machinery/computer/communications/proc/post_status(var/command, var/data1, var/data2)
+/proc/post_status(command, data1, data2, mob/user = null)
var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
@@ -505,7 +514,7 @@
if("message")
status_signal.data["msg1"] = data1
status_signal.data["msg2"] = data2
- log_admin("STATUS: [src.fingerprintslast] set status screen message with [src]: [data1] [data2]")
+ log_admin("STATUS: [user] set status screen message with [src]: [data1] [data2]")
//message_admins("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
if("alert")
status_signal.data["picture_state"] = data1
@@ -518,25 +527,30 @@
shuttle_master.autoEvac()
return ..()
+/obj/item/weapon/circuitboard/communications/New()
+ shuttle_caller_list += src
+ ..()
+
/obj/item/weapon/circuitboard/communications/Destroy()
-
- for(var/obj/machinery/computer/communications/commconsole in world)
- if(istype(commconsole.loc,/turf))
- return ..()
-
- for(var/obj/item/weapon/circuitboard/communications/commboard in world)
- if((istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage)) && commboard != src)
- return ..()
-
- for(var/mob/living/silicon/ai/shuttlecaller in player_list)
- if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
- return ..()
-
- if(GAMEMODE_IS_REVOLUTION || sent_strike_team)
- return ..()
-
- shuttle_master.emergency.request(null, 0.3, null, "All communication consoles, boards, and AI's have been destroyed.")
- log_game("All the AI's, communication consoles and boards are destroyed. Shuttle called.")
- message_admins("All the AI's, communication consoles and boards are destroyed. Shuttle called.", 1)
-
+ shuttle_caller_list -= src
+ shuttle_master.autoEvac()
return ..()
+
+/proc/print_command_report(text = "", title = "Central Command Update")
+ for(var/obj/machinery/computer/communications/C in shuttle_caller_list)
+ if(!(C.stat & (BROKEN|NOPOWER)) && is_station_contact(C.z))
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
+ P.name = "paper- '[title]'"
+ P.info = text
+ P.update_icon()
+ C.messagetitle.Add("[title]")
+ C.messagetext.Add(text)
+ for(var/datum/computer_file/program/comm/P in shuttle_caller_list)
+ var/turf/T = get_turf(P.computer)
+ if(T && P.program_state != PROGRAM_STATE_KILLED && is_station_contact(T.z))
+ if(P.computer)
+ var/obj/item/weapon/computer_hardware/printer/printer = P.computer.all_components[MC_PRINT]
+ if(printer)
+ printer.print_text(text, "paper- '[title]'")
+ P.messagetitle.Add("[title]")
+ P.messagetext.Add(text)
\ No newline at end of file
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 71f9760c0a6..e343135b246 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -101,18 +101,19 @@
text = replacetext(text, "\n", " ")
return text
-/obj/machinery/computer/attack_ghost(user as mob)
+/obj/machinery/computer/attack_ghost(mob/user)
return attack_hand(user)
-/obj/machinery/computer/attack_hand(user as mob)
+/obj/machinery/computer/attack_hand(mob/user)
/* Observers can view computers, but not actually use them via Topic*/
if(istype(user, /mob/dead/observer)) return 0
return ..()
-/obj/machinery/computer/attackby(I as obj, user as mob, params)
+/obj/machinery/computer/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ var/obj/item/weapon/screwdriver/S = I
+ playsound(src.loc, S.usesound, 50, 1)
+ if(do_after(user, 20 * S.toolspeed, target = src))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
@@ -120,12 +121,12 @@
for(var/obj/C in src)
C.loc = src.loc
if(src.stat & BROKEN)
- to_chat(user, "\blue The broken glass falls out.")
+ to_chat(user, "The broken glass falls out. ")
new /obj/item/weapon/shard(loc)
A.state = 3
A.icon_state = "3"
else
- to_chat(user, "\blue You disconnect the monitor.")
+ to_chat(user, "You disconnect the monitor. ")
A.state = 4
A.icon_state = "4"
qdel(src)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 6d1643fd988..d074091838a 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -15,8 +15,7 @@
..()
/obj/machinery/computer/crew/Destroy()
- qdel(crew_monitor)
- crew_monitor = null
+ QDEL_NULL(crew_monitor)
return ..()
/obj/machinery/computer/crew/attack_ai(mob/user)
diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm
index 13f07773404..90d574cb61e 100644
--- a/code/game/machinery/computer/honkputer.dm
+++ b/code/game/machinery/computer/honkputer.dm
@@ -93,10 +93,11 @@
onclose(user, "honkputer")
-/obj/machinery/computer/HONKputer/attackby(I as obj, user as mob, params)
+/obj/machinery/computer/HONKputer/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ var/obj/item/weapon/screwdriver/S = I
+ playsound(src.loc, S.usesound, 50, 1)
+ if(do_after(user, 20 * S.toolspeed, target = src))
var/obj/structure/computerframe/HONKputer/A = new /obj/structure/computerframe/HONKputer( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
@@ -104,12 +105,12 @@
for(var/obj/C in src)
C.loc = src.loc
if(src.stat & BROKEN)
- to_chat(user, "\blue The broken glass falls out.")
+ to_chat(user, "The broken glass falls out. ")
new /obj/item/weapon/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
- to_chat(user, "\blue You disconnect the monitor.")
+ to_chat(user, "You disconnect the monitor. ")
A.state = 4
A.icon_state = "4"
qdel(src)
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index 125a5fc06ad..3e2c0dd975c 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -22,17 +22,18 @@
opened = !opened
if(opened)
- to_chat(usr, "\blue The access panel is now open.")
+ to_chat(usr, "The access panel is now open. ")
else
- to_chat(usr, "\blue The access panel is now closed.")
+ to_chat(usr, "The access panel is now closed. ")
return
attackby(obj/item/weapon/O as obj, mob/user as mob, params)
- if(is_away_level(user.z))
- to_chat(user, "Unable to establish a connection : You're too far away from the station!")
- return
if(istype(O, /obj/item/weapon/aiModule))
+ var/turf/T = get_turf(current)
+ if(!atoms_share_level(T, src))
+ to_chat(user, "Unable to establish a connection : You're too far away from the target silicon!")
+ return
var/datum/game_mode/nations/mode = get_nations_mode()
if(!mode)
var/obj/item/weapon/aiModule/M = O
@@ -74,6 +75,10 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
if(istype(module, /obj/item/weapon/aiModule))
+ var/turf/T = get_turf(current)
+ if(!atoms_share_level(T, src))
+ to_chat(user, "Unable to establish a connection : You're too far away from the target silicon!")
+ return
var/datum/game_mode/nations/mode = get_nations_mode()
if(!mode)
module.install(src)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 1162735db96..7c2df327285 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -1,4 +1,9 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define MED_DATA_MAIN 1 // Main menu
+#define MED_DATA_R_LIST 2 // Record list
+#define MED_DATA_MAINT 3 // Records maintenance
+#define MED_DATA_RECORD 4 // Record
+#define MED_DATA_V_DATA 5 // Virus database
+#define MED_DATA_MEDBOT 6 // Medbot monitor
/obj/machinery/computer/med_data//TODO:SANITY
name = "medical records console"
@@ -13,486 +18,515 @@
var/screen = null
var/datum/data/record/active1 = null
var/datum/data/record/active2 = null
- var/a_id = null
var/temp = null
var/printing = null
light_color = LIGHT_COLOR_DARKBLUE
-/obj/machinery/computer/med_data/attack_ai(user as mob)
- return src.attack_hand(user)
+/obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/weapon/card/id) && !scan)
+ usr.drop_item()
+ O.forceMove(src)
+ scan = O
+ ui_interact(user)
+ ..()
-
-/obj/machinery/computer/med_data/attack_hand(mob/user as mob)
+/obj/machinery/computer/med_data/attack_hand(mob/user)
if(..())
return
- var/dat
- if(src.temp)
- dat = text("[src.temp] Clear Screen ")
- else
- dat = text("Confirm Identity: [] ", (src.scan ? text("[]", src.scan.name) : "----------"))
- if(src.authenticated)
- switch(src.screen)
- if(1.0)
- dat += {"
-Search Records
-List Records
-
-Virus Database
-Medbot Tracking
-
-Record Maintenance
-{Log Out}
-"}
- if(2.0)
- dat += "Record List : "
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general))
- dat += text("[]: [] ", R, R.fields["id"], R.fields["name"])
- //Foreach goto(132)
- dat += "Back "
- if(3.0)
- dat += "Records Maintenance \nBackup To Disk \nUpload From disk \nDelete All Records \n \nBack "
- if(4.0)
- dat += "Medical Record "
- if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- dat += ""
- else
- dat += "General Record Lost! "
- if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src.active2.fields["b_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"])
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- dat += text("[]Delete Entry ", src.active2.fields[text("com_[]", counter)], counter)
- counter++
- dat += "Add Entry "
- dat += "Delete Record (Medical Only) "
- else
- dat += "Medical Record Lost! "
- dat += text("New Record ")
- dat += "\nPrint Record \nBack "
- if(5.0)
- dat += "Virus Database "
- for(var/Dt in typesof(/datum/disease/))
- var/datum/disease/Dis = new Dt(0)
- if(istype(Dis, /datum/disease/advance))
- continue // TODO (tm): Add advance diseases to the virus database which no one uses.
- if(!Dis.desc)
- continue
- dat += "[Dis.name] "
- dat += "Back "
- if(6.0)
- dat += "Medical Robot Monitor "
- dat += "Back "
- dat += "Medical Robots: "
- var/bdat = null
- for(var/mob/living/simple_animal/bot/medbot/M in world)
+ if(is_away_level(z))
+ to_chat(user, "Unable to establish a connection : You're too far away from the station!")
+ return
+ add_fingerprint(user)
+ ui_interact(user)
- if(M.z != src.z) continue //only find medibots on the same z-level as the computer
- var/turf/bl = get_turf(M)
- if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up
- bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"] "
- if((!isnull(M.reagent_glass)) && M.use_beaker)
- bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\] "
- else
- bdat += "Using Internal Synthesizer. "
- if(!bdat)
- dat += "None detected "
- else
- dat += " [bdat]"
+/obj/machinery/computer/med_data/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "med_data.tmpl", name, 800, 380)
+ ui.open()
+/obj/machinery/computer/med_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["temp"] = temp
+ data["scan"] = scan ? scan.name : null
+ data["authenticated"] = authenticated
+ data["screen"] = screen
+ if(authenticated)
+ switch(screen)
+ if(MED_DATA_R_LIST)
+ if(!isnull(data_core.general))
+ var/list/records = list()
+ data["records"] = records
+ for(var/datum/data/record/R in sortRecord(data_core.general))
+ records[++records.len] = list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"])
+ if(MED_DATA_RECORD)
+ var/list/general = list()
+ data["general"] = general
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/list/fields = list()
+ general["fields"] = fields
+ fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "edit" = null)
+ fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "edit" = null)
+ fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "edit" = "sex")
+ fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "edit" = "age")
+ fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "edit" = "fingerprint")
+ fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"], "edit" = "p_stat")
+ fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"], "edit" = "m_stat")
+ var/list/photos = list()
+ general["photos"] = photos
+ photos[++photos.len] = list("photo" = active1.fields["photo-south"])
+ photos[++photos.len] = list("photo" = active1.fields["photo-west"])
+ general["has_photos"] = (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0)
+ general["empty"] = 0
else
- else
- dat += "{Log In} "
- var/datum/browser/popup = new(user, "med_rec", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "med_rec")
- return
+ general["empty"] = 1
+
+ var/list/medical = list()
+ data["medical"] = medical
+ if(istype(active2, /datum/data/record) && data_core.medical.Find(active2))
+ var/list/fields = list()
+ medical["fields"] = fields
+ fields[++fields.len] = list("field" = "Blood Type:", "value" = active2.fields["b_type"], "edit" = "b_type", "line_break" = 0)
+ fields[++fields.len] = list("field" = "DNA:", "value" = active2.fields["b_dna"], "edit" = "b_dna", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Minor Disabilities:", "value" = active2.fields["mi_dis"], "edit" = "mi_dis", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["mi_dis_d"], "edit" = "mi_dis_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Major Disabilities:", "value" = active2.fields["ma_dis"], "edit" = "ma_dis", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["ma_dis_d"], "edit" = "ma_dis_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Allergies:", "value" = active2.fields["alg"], "edit" = "alg", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["alg_d"], "edit" = "alg_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Current Diseases:", "value" = active2.fields["cdi"], "edit" = "cdi", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["cdi_d"], "edit" = "cdi_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Important Notes:", "value" = active2.fields["notes"], "edit" = "notes", "line_break" = 0)
+ if(!active2.fields["comments"] || !islist(active2.fields["comments"]))
+ active2.fields["comments"] = list()
+ medical["comments"] = active2.fields["comments"]
+ medical["empty"] = 0
+ else
+ medical["empty"] = 1
+ if(MED_DATA_V_DATA)
+ data["virus"] = list()
+ for(var/D in typesof(/datum/disease))
+ var/datum/disease/DS = new D(0)
+ if(istype(DS, /datum/disease/advance))
+ continue
+ if(!DS.desc)
+ continue
+ data["virus"] += list(list("name" = DS.name, "D" = D))
+ if(MED_DATA_MEDBOT)
+ data["medbots"] = list()
+ for(var/mob/living/simple_animal/bot/medbot/M in world)
+ if(M.z != z)
+ continue
+ var/turf/T = get_turf(M)
+ if(T)
+ var/medbot = list()
+ medbot["name"] = M.name
+ medbot["x"] = T.x
+ medbot["y"] = T.y
+ medbot["on"] = M.on
+ if(!isnull(M.reagent_glass) && M.use_beaker)
+ medbot["use_beaker"] = 1
+ medbot["total_volume"] = M.reagent_glass.reagents.total_volume
+ medbot["maximum_volume"] = M.reagent_glass.reagents.maximum_volume
+ else
+ medbot["use_beaker"] = 0
+ data["medbots"] += list(medbot)
+ return data
/obj/machinery/computer/med_data/Topic(href, href_list)
if(..())
return 1
- if(!( data_core.general.Find(src.active1) ))
- src.active1 = null
+ if(!data_core.general.Find(active1))
+ active1 = null
+ if(!data_core.medical.Find(active2))
+ active2 = null
- if(!( data_core.medical.Find(src.active2) ))
- src.active2 = null
+ if(href_list["temp"])
+ temp = null
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
+ if(href_list["temp_action"])
+ if(href_list["temp_action"])
+ var/temp_href = splittext(href_list["temp_action"], "=")
+ switch(temp_href[1])
+ if("del_all2")
+ for(var/datum/data/record/R in data_core.medical)
+ qdel(R)
+ setTemp("All records deleted. ")
+ if("p_stat")
+ if(active1)
+ switch(temp_href[2])
+ if("deceased")
+ active1.fields["p_stat"] = "*Deceased*"
+ if("ssd")
+ active1.fields["p_stat"] = "*SSD*"
+ if("active")
+ active1.fields["p_stat"] = "Active"
+ if("unfit")
+ active1.fields["p_stat"] = "Physically Unfit"
+ if("disabled")
+ active1.fields["p_stat"] = "Disabled"
+ if("m_stat")
+ if(active1)
+ switch(temp_href[2])
+ if("insane")
+ active1.fields["m_stat"] = "*Insane*"
+ if("unstable")
+ active1.fields["m_stat"] = "*Unstable*"
+ if("watch")
+ active1.fields["m_stat"] = "*Watch*"
+ if("stable")
+ active1.fields["m_stat"] = "Stable"
+ if("b_type")
+ if(active2)
+ switch(temp_href[2])
+ if("an")
+ active2.fields["b_type"] = "A-"
+ if("bn")
+ active2.fields["b_type"] = "B-"
+ if("abn")
+ active2.fields["b_type"] = "AB-"
+ if("on")
+ active2.fields["b_type"] = "O-"
+ if("ap")
+ active2.fields["b_type"] = "A+"
+ if("bp")
+ active2.fields["b_type"] = "B+"
+ if("abp")
+ active2.fields["b_type"] = "AB+"
+ if("op")
+ active2.fields["b_type"] = "O+"
+ if("del_r2")
+ if(active2)
+ qdel(active2)
+ active2 = null
- if(href_list["temp"])
- src.temp = null
+ if(href_list["scan"])
+ if(scan)
+ scan.forceMove(loc)
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ scan = I
- if(href_list["scan"])
- if(src.scan)
+ if(href_list["login"])
+ if(isAI(usr))
+ authenticated = usr.name
+ rank = "AI"
+ else if(isrobot(usr))
+ authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ rank = "[R.modtype] [R.braintype]"
+ else if(istype(scan, /obj/item/weapon/card/id))
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
- if(ishuman(usr))
- scan.loc = usr.loc
+ if(authenticated)
+ active1 = null
+ active2 = null
+ screen = MED_DATA_MAIN
- if(!usr.get_active_hand())
- usr.put_in_hands(scan)
+ if(authenticated)
+ if(href_list["logout"])
+ authenticated = null
+ screen = null
+ active1 = null
+ active2 = null
- scan = null
+ if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+ if(screen < 1)
+ screen = MED_DATA_MAIN
- else
- src.scan.loc = src.loc
- src.scan = null
+ active1 = null
+ active2 = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- src.scan = I
+ if(href_list["vir"])
+ var/type = href_list["vir"]
+ var/datum/disease/D = new type(0)
+ var/afs = ""
+ for(var/mob/M in D.viable_mobtypes)
+ afs += "[initial(M.name)];"
+ var/severity = D.severity
+ switch(severity)
+ if("Harmful", "Minor")
+ severity = "[severity] "
+ if("Medium")
+ severity = "[severity] "
+ if("Dangerous!")
+ severity = "[severity] "
+ if("BIOHAZARD THREAT!")
+ severity = "[severity] "
+ setTemp({"Name: [D.name]
+ Number of stages: [D.max_stages]
+ Spread: [D.spread_text] Transmission
+ Possible Cure: [(D.cure_text||"none")]
+ Affected Lifeforms: [afs]
+ Notes: [D.desc]
+ Severity: [severity]"})
+ qdel(D)
- else if(href_list["logout"])
- src.authenticated = null
- src.screen = null
- src.active1 = null
- src.active2 = null
+ if(href_list["del_all"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_all2=1")
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null)
+ setTemp("Are you sure you wish to delete all records? ", buttons)
- else if(href_list["login"])
-
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
-
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = "[R.modtype] [R.braintype]"
- src.screen = 1
-
- else if(istype(src.scan, /obj/item/weapon/card/id))
- src.active1 = null
- src.active2 = null
-
- if(src.check_access(src.scan))
- src.authenticated = src.scan.registered_name
- src.rank = src.scan.assignment
- src.screen = 1
-
- if(src.authenticated)
-
- if(href_list["screen"])
- src.screen = text2num(href_list["screen"])
- if(src.screen < 1)
- src.screen = 1
-
- src.active1 = null
- src.active2 = null
-
- if(href_list["vir"])
- var/type = href_list["vir"]
- var/datum/disease/Dis = new type(0)
- var/AfS = ""
- for(var/mob/M in Dis.viable_mobtypes)
- AfS += " [initial(M.name)];"
- src.temp = {"Name: [Dis.name]
-Number of stages: [Dis.max_stages]
-Spread: [Dis.spread_text] Transmission
-Possible Cure: [(Dis.cure_text||"none")]
-Affected Lifeforms: [AfS]
-
-Notes: [Dis.desc]
-
-Severity: [Dis.severity]"}
-
- if(href_list["del_all"])
- src.temp = "Are you sure you wish to delete all records? \n\tYes \n\tNo "
-
- if(href_list["del_all2"])
- for(var/datum/data/record/R in data_core.medical)
- //R = null
- qdel(R)
- //Foreach goto(494)
- src.temp = "All records deleted."
-
- if(href_list["field"])
- var/a1 = src.active1
- var/a2 = src.active2
- switch(href_list["field"])
- if("fingerprint")
- if(istype(src.active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(src.active1, /datum/data/record))
- if(src.active1.fields["sex"] == "Male")
- src.active1.fields["sex"] = "Female"
- else
- src.active1.fields["sex"] = "Male"
- if("age")
- if(istype(src.active1, /datum/data/record))
- var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["age"] = t1
- if("mi_dis")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis"] = t1
- if("mi_dis_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis_d"] = t1
- if("ma_dis")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis"] = t1
- if("ma_dis_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis_d"] = t1
- if("alg")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg"] = t1
- if("alg_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg_d"] = t1
- if("cdi")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi"] = t1
- if("cdi_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi_d"] = t1
- if("notes")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["notes"] = t1
- if("p_stat")
- if(istype(src.active1, /datum/data/record))
- src.temp = "Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled "
- if("m_stat")
- if(istype(src.active1, /datum/data/record))
- src.temp = "Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable "
- if("b_type")
- if(istype(src.active2, /datum/data/record))
- src.temp = "Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ "
- if("b_dna")
- if(istype(src.active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["dna"] = t1
- if("vir_name")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if(v)
- var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["name"] = t1
- if("vir_desc")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if(v)
- var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["description"] = t1
- else
-
- if(href_list["p_stat"])
- if(src.active1)
- switch(href_list["p_stat"])
- if("deceased")
- src.active1.fields["p_stat"] = "*Deceased*"
- if("ssd")
- src.active1.fields["p_stat"] = "*SSD*"
- if("active")
- src.active1.fields["p_stat"] = "Active"
- if("unfit")
- src.active1.fields["p_stat"] = "Physically Unfit"
- if("disabled")
- src.active1.fields["p_stat"] = "Disabled"
-
- if(href_list["m_stat"])
- if(src.active1)
- switch(href_list["m_stat"])
- if("insane")
- src.active1.fields["m_stat"] = "*Insane*"
- if("unstable")
- src.active1.fields["m_stat"] = "*Unstable*"
- if("watch")
- src.active1.fields["m_stat"] = "*Watch*"
- if("stable")
- src.active1.fields["m_stat"] = "Stable"
-
-
- if(href_list["b_type"])
- if(src.active2)
- switch(href_list["b_type"])
- if("an")
- src.active2.fields["b_type"] = "A-"
- if("bn")
- src.active2.fields["b_type"] = "B-"
- if("abn")
- src.active2.fields["b_type"] = "AB-"
- if("on")
- src.active2.fields["b_type"] = "O-"
- if("ap")
- src.active2.fields["b_type"] = "A+"
- if("bp")
- src.active2.fields["b_type"] = "B+"
- if("abp")
- src.active2.fields["b_type"] = "AB+"
- if("op")
- src.active2.fields["b_type"] = "O+"
-
-
- if(href_list["del_r"])
- if(src.active2)
- src.temp = "Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo "
-
- if(href_list["del_r2"])
- if(src.active2)
- //src.active2 = null
- qdel(src.active2)
-
- if(href_list["d_rec"])
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/datum/data/record/M = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- src.temp = "Record Not Found!"
- return
- for(var/datum/data/record/E in data_core.medical)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- else
- //Foreach continue //goto(2540)
- src.active1 = R
- src.active2 = M
- src.screen = 4
-
- if(href_list["new"])
- if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record( )
- R.fields["name"] = src.active1.fields["name"]
- R.fields["id"] = src.active1.fields["id"]
- R.name = text("Medical Record #[]", R.fields["id"])
- R.fields["b_type"] = "Unknown"
- R.fields["b_dna"] = "Unknown"
- R.fields["mi_dis"] = "None"
- R.fields["mi_dis_d"] = "No minor disabilities have been declared."
- R.fields["ma_dis"] = "None"
- R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
- R.fields["alg"] = "None"
- R.fields["alg_d"] = "No allergies have been detected in this patient."
- R.fields["cdi"] = "None"
- R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- R.fields["notes"] = "No notes."
- data_core.medical += R
- src.active2 = R
- src.screen = 4
-
- if(href_list["add_c"])
- if(!( istype(src.active2, /datum/data/record) ))
- return
- var/a2 = src.active2
- var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- counter++
- src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")] [t1]")
-
- if(href_list["del_c"])
- if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
- src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
-
- if(href_list["search"])
- var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
- if((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))))
- return
- src.active1 = null
- src.active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.medical)
- if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
- src.active2 = R
- else
- //Foreach continue //goto(3229)
- if(!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
- else
- for(var/datum/data/record/E in data_core.general)
- if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
- src.active1 = E
+ if(href_list["field"])
+ if(..())
+ return 1
+ var/a1 = active1
+ var/a2 = active2
+ switch(href_list["field"])
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", active1.fields["fingerprint"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- //Foreach continue //goto(3334)
- src.screen = 4
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Med. records", active1.fields["age"], null) as num
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ active1.fields["age"] = t1
+ if("mi_dis")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", active2.fields["mi_dis"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["mi_dis"] = t1
+ if("mi_dis_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", active2.fields["mi_dis_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["mi_dis_d"] = t1
+ if("ma_dis")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", active2.fields["ma_dis"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["ma_dis"] = t1
+ if("ma_dis_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", active2.fields["ma_dis_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["ma_dis_d"] = t1
+ if("alg")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", active2.fields["alg"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["alg"] = t1
+ if("alg_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", active2.fields["alg_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["alg_d"] = t1
+ if("cdi")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", active2.fields["cdi"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["cdi"] = t1
+ if("cdi_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", active2.fields["cdi_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["cdi_d"] = t1
+ if("notes")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(active2.fields["notes"]), null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["notes"] = t1
+ if("p_stat")
+ if(istype(active1, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "*Deceased*", "icon" = "stethoscope", "href" = "p_stat=deceased", "status" = (active1.fields["p_stat"] == "*Deceased*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*SSD*", "icon" = "stethoscope", "href" = "p_stat=ssd", "status" = (active1.fields["p_stat"] == "*SSD*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Active", "icon" = "stethoscope", "href" = "p_stat=active", "status" = (active1.fields["p_stat"] == "Active" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Physically Unfit", "icon" = "stethoscope", "href" = "p_stat=unfit", "status" = (active1.fields["p_stat"] == "Physically Unfit" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Disabled", "icon" = "stethoscope", "href" = "p_stat=disabled", "status" = (active1.fields["p_stat"] == "Disabled" ? "selected" : null))
+ setTemp("Physical Condition ", buttons)
+ if("m_stat")
+ if(istype(active1, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "*Insane*", "icon" = "stethoscope", "href" = "m_stat=insane", "status" = (active1.fields["m_stat"] == "*Insane*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*Unstable*", "icon" = "stethoscope", "href" = "m_stat=unstable", "status" = (active1.fields["m_stat"] == "*Unstable*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*Watch*", "icon" = "stethoscope", "href" = "m_stat=watch", "status" = (active1.fields["m_stat"] == "*Watch*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Stable", "icon" = "stethoscope", "href" = "m_stat=stable", "status" = (active1.fields["m_stat"] == "Stable" ? "selected" : null))
+ setTemp("Mental Condition ", buttons)
+ if("b_type")
+ if(istype(active2, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "A-", "icon" = "tint", "href" = "b_type=an", "status" = (active2.fields["b_type"] == "A-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "A+", "icon" = "tint", "href" = "b_type=ap", "status" = (active2.fields["b_type"] == "A+" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "B-", "icon" = "tint", "href" = "b_type=bn", "status" = (active2.fields["b_type"] == "B-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "B+", "icon" = "tint", "href" = "b_type=bp", "status" = (active2.fields["b_type"] == "B+" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "AB-", "icon" = "tint", "href" = "b_type=abn", "status" = (active2.fields["b_type"] == "AB-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "AB+", "icon" = "tint", "href" = "b_type=abp", "status" = (active2.fields["b_type"] == "AB+" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "O-", "icon" = "tint", "href" = "b_type=on", "status" = (active2.fields["b_type"] == "O-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "O+", "icon" = "tint", "href" = "b_type=op", "status" = (active2.fields["b_type"] == "O+" ? "selected" : null))
+ setTemp("Blood Type ", buttons)
+ if("b_dna")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", active2.fields["b_dna"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["b_dna"] = t1
+ if("vir_name")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if(v)
+ var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ v.fields["name"] = t1
+ if("vir_desc")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if(v)
+ var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ v.fields["description"] = t1
- if(href_list["print_p"])
- if(!( src.printing ))
- src.printing = 1
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
- P.info = "Medical Record "
- if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"], src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"])
- else
- P.info += "General Record Lost! "
- if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src.active2.fields["b_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"])
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- P.info += text("[] ", src.active2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Medical Record Lost! "
- P.info += " "
- P.name = "paper- 'Medical Record'"
- src.printing = null
+ if(href_list["del_r"])
+ if(active2)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_r2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (Medical Portion Only)? ", buttons)
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
+ if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ var/datum/data/record/M = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ setTemp("Record not found! ")
+ return 1
+ for(var/datum/data/record/E in data_core.medical)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ M = E
+ active1 = R
+ active2 = M
+ screen = MED_DATA_RECORD
+
+ if(href_list["new"])
+ if(istype(active1, /datum/data/record) && !istype(active2, /datum/data/record))
+ var/datum/data/record/R = new /datum/data/record()
+ R.fields["name"] = active1.fields["name"]
+ R.fields["id"] = active1.fields["id"]
+ R.name = "Medical Record #[R.fields["id"]]"
+ R.fields["b_type"] = "Unknown"
+ R.fields["b_dna"] = "Unknown"
+ R.fields["mi_dis"] = "None"
+ R.fields["mi_dis_d"] = "No minor disabilities have been declared."
+ R.fields["ma_dis"] = "None"
+ R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
+ R.fields["alg"] = "None"
+ R.fields["alg_d"] = "No allergies have been detected in this patient."
+ R.fields["cdi"] = "None"
+ R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
+ R.fields["notes"] = "No notes."
+ data_core.medical += R
+ active2 = R
+ screen = MED_DATA_RECORD
+
+ if(href_list["add_c"])
+ if(!istype(active2, /datum/data/record))
+ return 1
+ var/a2 = active2
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["comments"] += "Made by [authenticated] ([rank]) on [current_date_string] [worldtime2text()] [t1]"
+
+ if(href_list["del_c"])
+ var/index = min(max(text2num(href_list["del_c"]) + 1, 1), length(active2.fields["comments"]))
+ if(istype(active2, /datum/data/record) && active2.fields["comments"][index])
+ active2.fields["comments"] -= active2.fields["comments"][index]
+
+ if(href_list["search"])
+ var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
+ if(!t1 || ..())
+ return 1
+ active1 = null
+ active2 = null
+ t1 = lowertext(t1)
+ for(var/datum/data/record/R in data_core.medical)
+ if(t1 == lowertext(R.fields["name"]) || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))
+ active2 = R
+ if(!active2)
+ setTemp("Could not locate record [t1]. ")
+ else
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == active2.fields["name"] && E.fields["id"] == active2.fields["id"])
+ active1 = E
+ screen = MED_DATA_RECORD
+
+ if(href_list["print_p"])
+ if(!printing)
+ printing = 1
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Medical Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
+ \nSex: [active1.fields["sex"]]
+ \nAge: [active1.fields["age"]]
+ \nFingerprint: [active1.fields["fingerprint"]]
+ \nPhysical Status: [active1.fields["p_stat"]]
+ \nMental Status: [active1.fields["m_stat"]] "}
+ else
+ P.info += "General Record Lost! "
+ if(istype(active2, /datum/data/record) && data_core.medical.Find(active2))
+ P.info += {" \nMedical Data
+ \nBlood Type: [active2.fields["b_type"]]
+ \nDNA: [active2.fields["b_dna"]] \n
+ \nMinor Disabilities: [active2.fields["mi_dis"]]
+ \nDetails: [active2.fields["mi_dis_d"]] \n
+ \nMajor Disabilities: [active2.fields["ma_dis"]]
+ \nDetails: [active2.fields["ma_dis_d"]] \n
+ \nAllergies: [active2.fields["alg"]]
+ \nDetails: [active2.fields["alg_d"]] \n
+ \nCurrent Diseases: [active2.fields["cdi"]] (per disease info placed in log/comment section)
+ \nDetails: [active2.fields["cdi_d"]] \n
+ \nImportant Notes:
+ \n\t[active2.fields["notes"]] \n
+ \n
+ Comments/Log "}
+ for(var/c in active2.fields["comments"])
+ P.info += "[c] "
+ else
+ P.info += "Medical Record Lost! "
+ P.info += " "
+ P.name = "paper- 'Medical Record'"
+ printing = 0
+ return 1
+
+/obj/machinery/computer/med_data/proc/setTemp(text, list/buttons = list())
+ temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
/obj/machinery/computer/med_data/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
+ return ..(severity)
for(var/datum/data/record/R in data_core.medical)
if(prob(10/severity))
@@ -500,7 +534,7 @@
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -525,3 +559,10 @@
icon_keyboard = "laptop_key"
icon_screen = "medlaptop"
density = 0
+
+#undef MED_DATA_MAIN
+#undef MED_DATA_R_LIST
+#undef MED_DATA_MAINT
+#undef MED_DATA_RECORD
+#undef MED_DATA_V_DATA
+#undef MED_DATA_MEDBOT
\ No newline at end of file
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index b8b2629b22b..644f9cddec8 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -63,7 +63,7 @@
src.spark_system.start()
var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey
MK.loc = src.loc
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
// Will help make emagging the console not so easy to get away with.
MK.info += "£%@%(*$%&(£&?*(%&£/{} "
update_icon()
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index ca3c1f84410..1c62c24c854 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -16,7 +16,7 @@
power_monitors += src
power_monitors = sortAtom(power_monitors)
power_monitor = new(src)
-
+
/obj/machinery/computer/monitor/initialize()
..()
powermonitor_repository.update_cache()
@@ -25,8 +25,7 @@
/obj/machinery/computer/monitor/Destroy()
power_monitors -= src
powermonitor_repository.update_cache()
- qdel(power_monitor)
- power_monitor = null
+ QDEL_NULL(power_monitor)
return ..()
/obj/machinery/computer/monitor/power_change()
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index be35a85b7a4..fed409d9507 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -20,6 +20,14 @@
/obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
+/obj/machinery/computer/prisoner/New()
+ prisoncomputer_list += src
+ return ..()
+
+/obj/machinery/computer/prisoner/Destroy()
+ prisoncomputer_list -= src
+ return ..()
+
/obj/machinery/computer/prisoner/attack_hand(var/mob/user as mob)
if(..())
return 1
@@ -96,7 +104,7 @@
I.loc = src
inserted_id = I
else
- to_chat(usr, "\red No valid ID.")
+ to_chat(usr, "No valid ID. ")
if("1")
inserted_id.loc = get_step(src,get_turf(usr))
inserted_id = null
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 5235fffd9ba..ec41de193b8 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -146,7 +146,7 @@
if(!target || !istype(target))
return
- message_admins("\blue [key_name_admin(usr)] emagged [key_name_admin(target)] using robotic console!")
+ message_admins("[key_name_admin(usr)] emagged [key_name_admin(target)] using robotic console! ")
log_game("[key_name(usr)] emagged [key_name(target)] using robotic console!")
target.emagged = 1
to_chat(target, "Failsafe protocols overriden. New tools available. ")
diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm
index 6ee8f750b41..444db205e80 100644
--- a/code/game/machinery/computer/salvage_ship.dm
+++ b/code/game/machinery/computer/salvage_ship.dm
@@ -46,7 +46,7 @@
/obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob)
if(!allowed(user))
- to_chat(user, "\red Access Denied")
+ to_chat(user, "Access Denied ")
return
user.set_machine(src)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 1634ebdc4a0..16efcb7de76 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -1,4 +1,6 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define SEC_DATA_R_LIST 1 // Record list
+#define SEC_DATA_MAINT 2 // Records maintenance
+#define SEC_DATA_RECORD 3 // Record
/obj/machinery/computer/secure_data//TODO:SANITY
name = "security records"
@@ -13,12 +15,8 @@
var/screen = null
var/datum/data/record/active1 = null
var/datum/data/record/active2 = null
- var/a_id = null
var/temp = null
var/printing = null
- var/can_change_id = 0
- var/list/Perp
- var/tempname = null
//Sorting Variables
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
@@ -26,538 +24,470 @@
light_color = LIGHT_COLOR_RED
-/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
- O.loc = src
+ user.drop_item()
+ O.forceMove(src)
scan = O
- to_chat(user, "You insert [O].")
+ ui_interact(user)
..()
-/obj/machinery/computer/secure_data/attack_ai(mob/user as mob)
- return attack_hand(user)
-
//Someone needs to break down the dat += into chunks instead of long ass lines.
-/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
+/obj/machinery/computer/secure_data/attack_hand(mob/user)
if(..())
return
- if(is_away_level(src.z))
+ if(is_away_level(z))
to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
- var/dat
+ add_fingerprint(user)
+ ui_interact(user)
- // search javascript
- var/head_content = {"
-
-
-"}
-
- if(temp)
- dat = text("[] Clear Screen ", temp)
- else
- dat = text("Confirm Identity: [] ", (scan ? text("[]", scan.name) : "----------"))
- if(authenticated)
- switch(screen)
- if(1.0)
-
- //body tag start + onload and onkeypress (onkeyup) javascript event calls
- dat += ""
-
- dat += {"
-"}
- dat += "New Record "
- //search bar
- dat += {"
-
- "}
- dat += {"
-
-
-
-
-
-
-Name
-ID
-Rank
-Fingerprints
-Criminal Status
- "}
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
- var/crimstat = ""
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- crimstat = E.fields["criminal"]
- var/background
- switch(crimstat)
- if("*Arrest*")
- background = "'background-color:#890E26'"
- if("Incarcerated")
- background = "'background-color:#743B03'"
- if("Parolled")
- background = "'background-color:#743B03'"
- if("Released")
- background = "'background-color:#216489'"
- if("None")
- background = "'background-color:#007f47'"
- if("")
- background = "''"
- crimstat = "No Record."
- dat += ""
- dat += text("[] ", R.fields["name"], R.fields["id"], R.fields["rank"], R.fields["fingerprint"], R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += text("[] ", crimstat)
- dat += {"
-
-
- "}
- dat += "Record Maintenance "
- dat += "{Log Out} "
- if(2.0)
- dat += "Records Maintenance "
- dat += "Delete All Records Back "
- if(3.0)
- dat += "Security Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += {"
- "}
- else
- dat += "General Record Lost! "
- if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", active2.fields["criminal"], active2.fields["mi_crim"], active2.fields["mi_crim_d"], active2.fields["ma_crim"], active2.fields["ma_crim_d"], active2.fields["notes"])
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- dat += text("[]Delete Entry ", active2.fields[text("com_[]", counter)], counter)
- counter++
- dat += "Add Entry "
- dat += "Delete Record (Security Only) "
- else
- dat += "Security Record Lost! "
- dat += "New Security Record "
- dat += "\nDelete Record (ALL) \nPrint Record \nBack "
+/obj/machinery/computer/secure_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["temp"] = temp
+ data["scan"] = scan ? scan.name : null
+ data["authenticated"] = authenticated
+ data["screen"] = screen
+ if(authenticated)
+ switch(screen)
+ if(SEC_DATA_R_LIST)
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
+ var/crimstat = "null"
+ for(var/datum/data/record/E in data_core.security)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ crimstat = E.fields["criminal"]
+ break
+ var/background = "''"
+ switch(crimstat)
+ if("*Arrest*")
+ background = "'background-color:#890E26'"
+ if("Incarcerated")
+ background = "'background-color:#743B03'"
+ if("Parolled")
+ background = "'background-color:#743B03'"
+ if("Released")
+ background = "'background-color:#216489'"
+ if("None")
+ background = "'background-color:#007f47'"
+ if("null")
+ crimstat = "No record."
+ data["records"] += list(list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"], "rank" = R.fields["rank"], "fingerprint" = R.fields["fingerprint"], "background" = background, "crimstat" = crimstat))
+ if(SEC_DATA_RECORD)
+ var/list/general = list()
+ data["general"] = general
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/list/fields = list()
+ general["fields"] = fields
+ fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "edit" = "name")
+ fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "edit" = "id")
+ fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "edit" = "sex")
+ fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "edit" = "age")
+ fields[++fields.len] = list("field" = "Rank:", "value" = active1.fields["rank"], "edit" = "rank")
+ fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "edit" = "fingerprint")
+ fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"], "edit" = null)
+ fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"], "edit" = null)
+ var/list/photos = list()
+ general["photos"] = photos
+ photos[++photos.len] = list("photo" = active1.fields["photo-south"])
+ photos[++photos.len] = list("photo" = active1.fields["photo-west"])
+ general["has_photos"] += (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0)
+ general["empty"] = 0
else
- else
- dat += "{Log In} "
- var/datum/browser/popup = new(user, "secure_rec", name, 600, 400)
- popup.set_content(dat)
- popup.add_head_content(head_content)
- popup.open(0)
- onclose(user, "secure_rec")
- return
+ general["empty"] = 1
+
+ var/list/security = list()
+ data["security"] = security
+ if(istype(active2, /datum/data/record) && data_core.security.Find(active2))
+ var/list/fields = list()
+ security["fields"] = fields
+ fields[++fields.len] = list("field" = "Criminal Status:", "value" = active2.fields["criminal"], "edit" = "criminal", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Minor Crimes:", "value" = active2.fields["mi_crim"], "edit" = "mi_crim", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["mi_crim_d"], "edit" = "mi_crim_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Major Crimes:", "value" = active2.fields["ma_crim"], "edit" = "ma_crim", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["ma_crim_d"], "edit" = "ma_crim_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Important Notes:", "value" = active2.fields["notes"], "edit" = "notes", "line_break" = 0)
+ if(!active2.fields["comments"] || !islist(active2.fields["comments"]))
+ active2.fields["comments"] = list()
+ security["comments"] = active2.fields["comments"]
+ security["empty"] = 0
+ else
+ security["empty"] = 1
+ return data
-/*Revised /N
-I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
-What a mess.*/
/obj/machinery/computer/secure_data/Topic(href, href_list)
if(..())
return 1
- if(!( data_core.general.Find(active1) ))
+
+ if(!data_core.general.Find(active1))
active1 = null
- if(!( data_core.security.Find(active2) ))
+ if(!data_core.security.Find(active2))
active2 = null
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- switch(href_list["choice"])
-// SORTING!
- if("Sorting")
- // Reverse the order if clicked twice
- if(sortBy == href_list["sort"])
- if(order == 1)
- order = -1
- else
- order = 1
- else
- // New sorting order!
- sortBy = href_list["sort"]
- order = initial(order)
-//BASIC FUNCTIONS
- if("Clear Screen")
- temp = null
- if("Return")
- screen = 1
- active1 = null
- active2 = null
+ if(href_list["temp"])
+ temp = null
- if("Confirm Identity")
- if(scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- usr.put_in_hands(scan)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- scan = I
-
- if("Log Out")
- authenticated = null
- screen = null
- active1 = null
- active2 = null
-
- if("Log In")
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = R.braintype
- src.screen = 1
- else if(istype(scan, /obj/item/weapon/card/id))
- active1 = null
- active2 = null
- if(check_access(scan))
- authenticated = scan.registered_name
- rank = scan.assignment
- screen = 1
-//RECORD FUNCTIONS
- if("Record Maintenance")
- screen = 2
- active1 = null
- active2 = null
-
- if("Browse Record")
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/S = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- temp = "Record Not Found!"
- else
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
- active1 = R
- active2 = S
- screen = 3
-
-/* if("Search Fingerprints")
- var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
- return
- active1 = null
- active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.general)
- if(lowertext(R.fields["fingerprint"]) == t1)
- active1 = R
- if(!( active1 ))
- temp = text("Could not locate record [].", t1)
- else
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
- active2 = E
- screen = 3 */
-
- if("Print Record")
- if(!( printing ))
- printing = 1
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
- P.info = "Security Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
- else
- P.info += "General Record Lost! "
- if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", active2.fields["criminal"], active2.fields["mi_crim"], active2.fields["mi_crim_d"], active2.fields["ma_crim"], active2.fields["ma_crim_d"], active2.fields["notes"])
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- P.info += text("[] ", active2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Security Record Lost! "
- P.info += ""
- P.name = "paper - 'Security Record'"
- printing = null
-
- if("Print Photo")
- if(!printing)
- printing = 1
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- sleep(50)
- if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
- create_record_photo(active1)
- printing = null
-
-//RECORD DELETE
- if("Delete All Records")
- temp = ""
- temp += "Are you sure you wish to delete all Security records? "
- temp += "Yes "
- temp += "No "
-
- if("Purge All Records")
+ if(href_list["temp_action"])
+ var/temp_href = splittext(href_list["temp_action"], "=")
+ switch(temp_href[1])
+ if("del_all2")
for(var/datum/data/record/R in data_core.security)
qdel(R)
- temp = "All Security records deleted."
-
- if("Add Entry")
- if(!( istype(active2, /datum/data/record) ))
- return
- var/a2 = active2
- var/t1 = copytext(trim(sanitize(input("Add Comment:", "Secure. records", null, null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- counter++
- active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557 [t1]")
-
- if("Delete Record (ALL)")
- if(active1)
- temp = "Are you sure you wish to delete the record (ALL)? "
- temp += "Yes "
- temp += "No "
-
- if("Delete Record (Security)")
+ update_all_mob_security_hud()
+ setTemp("All records deleted. ")
+ if("del_alllogs2")
+ if(cell_logs.len)
+ setTemp("All cell logs deleted. ")
+ cell_logs.Cut()
+ else
+ to_chat(usr, "Error; No cell logs to delete. ")
+ if("del_r2")
if(active2)
- temp = "Are you sure you wish to delete the record (Security Portion Only)? "
- temp += "Yes "
- temp += "No "
+ qdel(active2)
+ update_all_mob_security_hud()
+ if("del_rg2")
+ if(active1)
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"])
+ qdel(R)
+ qdel(active1)
+ active1 = null
+ if(active2)
+ qdel(active2)
+ active2 = null
+ update_all_mob_security_hud()
+ screen = SEC_DATA_R_LIST
+ if("criminal")
+ if(active2)
+ switch(temp_href[2])
+ if("none")
+ active2.fields["criminal"] = "None"
+ if("arrest")
+ active2.fields["criminal"] = "*Arrest*"
+ if("incarcerated")
+ active2.fields["criminal"] = "Incarcerated"
+ if("parolled")
+ active2.fields["criminal"] = "Parolled"
+ if("released")
+ active2.fields["criminal"] = "Released"
- if("Delete Entry")
- if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
- active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
-//RECORD CREATE
- if("New Record (Security)")
- if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record()
- R.fields["name"] = active1.fields["name"]
- R.fields["id"] = active1.fields["id"]
- R.name = text("Security Record #[]", R.fields["id"])
- R.fields["criminal"] = "None"
- R.fields["mi_crim"] = "None"
- R.fields["mi_crim_d"] = "No minor crime convictions."
- R.fields["ma_crim"] = "None"
- R.fields["ma_crim_d"] = "No major crime convictions."
- R.fields["notes"] = "No notes."
- data_core.security += R
- active2 = R
- screen = 3
+ update_all_mob_security_hud()
+ if("rank")
+ if(active1)
+ active1.fields["rank"] = temp_href[2]
+ if(temp_href[2] in joblist)
+ active1.fields["real_rank"] = temp_href[2]
- if("New Record (General)")
- var/datum/data/record/G = new /datum/data/record()
- G.fields["name"] = "New Record"
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
- G.fields["rank"] = "Unassigned"
- G.fields["real_rank"] = "Unassigned"
- G.fields["sex"] = "Male"
- G.fields["age"] = "Unknown"
- G.fields["fingerprint"] = "Unknown"
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["species"] = "Human"
- data_core.general += G
- active1 = G
- active2 = null
+ if(href_list["scan"])
+ if(scan)
+ scan.forceMove(loc)
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ scan = I
-//FIELD FUNCTIONS
- if("Edit Field")
- var/a1 = active1
+ if(href_list["login"])
+ if(isAI(usr))
+ authenticated = usr.name
+ rank = "AI"
+ else if(isrobot(usr))
+ authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ rank = "[R.modtype] [R.braintype]"
+ else if(istype(scan, /obj/item/weapon/card/id))
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
+
+ if(authenticated)
+ active1 = null
+ active2 = null
+ screen = SEC_DATA_R_LIST
+
+ if(authenticated)
+ if(href_list["logout"])
+ authenticated = null
+ screen = null
+ active1 = null
+ active2 = null
+
+ else if(href_list["sort"])
+ // Reverse the order if clicked twice
+ if(sortBy == href_list["sort"])
+ if(order == 1)
+ order = -1
+ else
+ order = 1
+ else
+ sortBy = href_list["sort"]
+ order = initial(order)
+
+ else if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+ if(screen < 1)
+ screen = SEC_DATA_R_LIST
+
+ active1 = null
+ active2 = null
+
+ else if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ var/datum/data/record/M = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ setTemp("Record not found! ")
+ return 1
+ for(var/datum/data/record/E in data_core.security)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ M = E
+ active1 = R
+ active2 = M
+ screen = SEC_DATA_RECORD
+
+ else if(href_list["del_all"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_all2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete all records? ", buttons)
+
+ else if(href_list["del_alllogs"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_alllogs2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete all cell logs? ", buttons)
+
+ else if(href_list["del_rg"])
+ if(active1)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_rg2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (ALL)? ", buttons)
+
+ else if(href_list["del_r"])
+ if(active1)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_r2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (Security Portion Only)? ", buttons)
+
+ else if(href_list["new_s"])
+ if(istype(active1, /datum/data/record) && !istype(active2, /datum/data/record))
+ var/datum/data/record/R = new /datum/data/record()
+ R.fields["name"] = active1.fields["name"]
+ R.fields["id"] = active1.fields["id"]
+ R.name = "Security Record #[R.fields["id"]]"
+ R.fields["criminal"] = "None"
+ R.fields["mi_crim"] = "None"
+ R.fields["mi_crim_d"] = "No minor crime convictions."
+ R.fields["ma_crim"] = "None"
+ R.fields["ma_crim_d"] = "No major crime convictions."
+ R.fields["notes"] = "No notes."
+ data_core.security += R
+ active2 = R
+ screen = SEC_DATA_RECORD
+
+ else if(href_list["new_g"])
+ var/datum/data/record/G = new /datum/data/record()
+ G.fields["name"] = "New Record"
+ G.fields["id"] = "[add_zero(num2hex(rand(1, 1.6777215E7)), 6)]"
+ G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = "Unassigned"
+ G.fields["sex"] = "Male"
+ G.fields["age"] = "Unknown"
+ G.fields["fingerprint"] = "Unknown"
+ G.fields["p_stat"] = "Active"
+ G.fields["m_stat"] = "Stable"
+ G.fields["species"] = "Human"
+ data_core.general += G
+ active1 = G
+ active2 = null
+
+ else if(href_list["print_r"])
+ if(!printing)
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Security Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
+ \nSex: [active1.fields["sex"]]
+ \nAge: [active1.fields["age"]]
+ \nFingerprint: [active1.fields["fingerprint"]]
+ \nPhysical Status: [active1.fields["p_stat"]]
+ \nMental Status: [active1.fields["m_stat"]] "}
+ else
+ P.info += "General Record Lost! "
+ if(istype(active2, /datum/data/record) && data_core.security.Find(active2))
+ P.info += {" \nSecurity Data
+ \nCriminal Status: [active2.fields["criminal"]] \n
+ \nMinor Crimes: [active2.fields["mi_crim"]]
+ \nDetails: [active2.fields["mi_crim_d"]] \n
+ \nMajor Crimes: [active2.fields["ma_crim"]]
+ \nDetails: [active2.fields["ma_crim_d"]] \n
+ \nImportant Notes:
+ \n\t[active2.fields["notes"]] \n \nComments/Log "}
+ for(var/c in active2.fields["comments"])
+ P.info += "[c] "
+ else
+ P.info += "Security Record Lost! "
+ P.info += ""
+ P.name = "paper - 'Security Record'"
+ printing = 0
+
+ else if(href_list["print_p"])
+ if(!printing)
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ sleep(50)
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ create_record_photo(active1)
+ printing = 0
+
+ else if(href_list["printlogs"])
+ if(cell_logs.len && !printing)
+ var/obj/item/weapon/paper/P = input(usr, "Select log to print", "Available Cell Logs") as null|anything in cell_logs
+ if(!P)
+ return 0
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ to_chat(usr, "Printing file [P.name]. ")
+ sleep(50)
+ var/obj/item/weapon/paper/log = new /obj/item/weapon/paper(loc)
+ log.name = P.name
+ log.info = P.info
+ printing = 0
+ return 1
+ else
+ to_chat(usr, "[src] has no logs stored or is already printing. ")
+
+
+ else if(href_list["add_c"])
+ if(istype(active2, /datum/data/record))
var/a2 = active2
- switch(href_list["field"])
- if("name")
- if(istype(active1, /datum/data/record))
- var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
- return
- active1.fields["name"] = t1
- if("id")
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Secure. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["comments"] += "Made by [authenticated] ([rank]) on [current_date_string] [worldtime2text()] [t1]"
+
+ else if(href_list["del_c"])
+ var/index = min(max(text2num(href_list["del_c"]) + 1, 1), length(active2.fields["comments"]))
+ if(istype(active2, /datum/data/record) && active2.fields["comments"][index])
+ active2.fields["comments"] -= active2.fields["comments"][index]
+
+ if(href_list["field"])
+ if(..())
+ return 1
+ var/a1 = active1
+ var/a2 = active2
+ switch(href_list["field"])
+ if("name")
+ if(istype(active1, /datum/data/record))
+ var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
+ if(!t1 || !length(trim(t1)) || ..() || active1 != a1)
+ return 1
+ active1.fields["name"] = t1
if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["id"] = t1
- if("fingerprint")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(active1, /datum/data/record))
- if(active1.fields["sex"] == "Male")
- active1.fields["sex"] = "Female"
- else
- active1.fields["sex"] = "Male"
- if("age")
- if(istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["age"] = t1
- if("mi_crim")
+ active2.fields["name"] = t1
+ if("id")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ active1.fields["id"] = t1
if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim"] = t1
- if("mi_crim_d")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim_d"] = t1
- if("ma_crim")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim"] = t1
- if("ma_crim_d")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim_d"] = t1
- if("notes")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["notes"] = t1
- if("criminal")
- if(istype(active2, /datum/data/record))
- temp = "Criminal Status: "
- temp += ""
- if("rank")
- var/list/L = list( "Head of Personnel", "Captain", "AI" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if((istype(active1, /datum/data/record) && L.Find(rank)))
- temp = "Rank: "
- temp += ""
- for(var/rank in joblist)
- temp += "[rank] "
- temp += " "
+ active2.fields["id"] = t1
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- alert(usr, "You do not have the required rank to do this!")
- if("species")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["species"] = t1
-
-//TEMPORARY MENU FUNCTIONS
- else//To properly clear as per clear screen.
- temp=null
- switch(href_list["choice"])
- if("Change Rank")
- if(active1)
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in joblist)
- active1.fields["real_rank"] = href_list["real_rank"]
-
- if("Change Criminal Status")
- if(active2)
- switch(href_list["criminal2"])
- if("none")
- active2.fields["criminal"] = "None"
- if("arrest")
- active2.fields["criminal"] = "*Arrest*"
- if("incarcerated")
- active2.fields["criminal"] = "Incarcerated"
- if("parolled")
- active2.fields["criminal"] = "Parolled"
- if("released")
- active2.fields["criminal"] = "Released"
-
- for(var/mob/living/carbon/human/H in mob_list)
- H.sec_hud_set_security_status()
-
- if("Delete Record (Security) Execute")
- if(active2)
- qdel(active2)
-
- if("Delete Record (ALL) Execute")
- if(active1)
- for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
- qdel(R)
- else
- qdel(active1)
- if(active2)
- qdel(active2)
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ active1.fields["age"] = t1
+ if("mi_crim")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["mi_crim"] = t1
+ if("mi_crim_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["mi_crim_d"] = t1
+ if("ma_crim")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["ma_crim"] = t1
+ if("ma_crim_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["ma_crim_d"] = t1
+ if("notes")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active2 != a2)
+ return 1
+ active2.fields["notes"] = t1
+ if("criminal")
+ if(istype(active2, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == "None" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == "*Arrest*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == "Incarcerated" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == "Parolled" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == "Released" ? "selected" : null))
+ setTemp("Criminal Status ", buttons)
+ if("rank")
+ var/list/L = list("Head of Personnel", "Captain", "AI")
+ //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
+ if(istype(active1, /datum/data/record) && L.Find(rank))
+ var/list/buttons = list()
+ for(var/rank in joblist)
+ buttons[++buttons.len] = list("name" = rank, "icon" = null, "href" = "rank=[rank]", "status" = (active1.fields["rank"] == rank ? "selected" : null))
+ setTemp("Rank ", buttons)
else
- temp = "This function does not appear to be working at the moment. Our apologies."
+ setTemp("You do not have the required rank to do this! ")
+ if("species")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || ..() || active1 != a1)
+ return 1
+ active1.fields["species"] = t1
+ return 1
- add_fingerprint(usr)
- updateUsrDialog()
- return
+/obj/machinery/computer/secure_data/proc/setTemp(text, list/buttons = list())
+ temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
+
+/obj/machinery/computer/secure_data/proc/update_all_mob_security_hud()
+ for(var/mob/living/carbon/human/H in mob_list)
+ H.sec_hud_set_security_status()
/obj/machinery/computer/secure_data/proc/create_record_photo(datum/data/record/R)
// basically copy-pasted from the camera code but different enough that it has to be redone
@@ -568,8 +498,8 @@ What a mess.*/
var/icon/pc = icon('icons/obj/bureaucracy.dmi', "photo")
small_img.Scale(8, 8)
tiny_img.Scale(4, 4)
- ic.Blend(small_img,ICON_OVERLAY, 10, 13)
- pc.Blend(tiny_img,ICON_OVERLAY, 12, 19)
+ ic.Blend(small_img, ICON_OVERLAY, 10, 13)
+ pc.Blend(tiny_img, ICON_OVERLAY, 12, 19)
var/datum/picture/P = new()
P.fields["name"] = "File Photo - [R.fields["name"]]"
@@ -582,8 +512,8 @@ What a mess.*/
P.fields["pixel_y"] = rand(-10, 10)
P.fields["size"] = 2
- var/obj/item/weapon/photo/Photo = new/obj/item/weapon/photo(loc)
- Photo.construct(P)
+ var/obj/item/weapon/photo/PH = new/obj/item/weapon/photo(loc)
+ PH.construct(P)
/obj/machinery/computer/secure_data/proc/get_record_photo(datum/data/record/R)
// similar to the code to make a photo, but of course the actual rendering is completely different
@@ -607,7 +537,7 @@ What a mess.*/
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -627,3 +557,7 @@ What a mess.*/
/obj/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
icon_state = "messyfiles"
+
+#undef SEC_DATA_R_LIST
+#undef SEC_DATA_MAINT
+#undef SEC_DATA_RECORD
\ No newline at end of file
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index ee90fcc3b21..e98028e3807 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -1,4 +1,6 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define SKILL_DATA_R_LIST 1 // Record list
+#define SKILL_DATA_MAINT 2 // Records maintenance
+#define SKILL_DATA_RECORD 3 // Record
/obj/machinery/computer/skills//TODO:SANITY
name = "employment records console"
@@ -15,372 +17,280 @@
var/rank = null
var/screen = null
var/datum/data/record/active1 = null
- var/a_id = null
var/temp = null
var/printing = null
- var/can_change_id = 0
- var/list/Perp
- var/tempname = null
//Sorting Variables
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/skills/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
- O.loc = src
+ user.drop_item()
+ O.forceMove(src)
scan = O
- to_chat(user, "You insert [O].")
+ ui_interact(user)
..()
-/obj/machinery/computer/skills/attack_ai(mob/user as mob)
- return attack_hand(user)
-
//Someone needs to break down the dat += into chunks instead of long ass lines.
-/obj/machinery/computer/skills/attack_hand(mob/user as mob)
+/obj/machinery/computer/skills/attack_hand(mob/user)
if(..())
return
-
- if(is_away_level(src.z))
+ if(is_away_level(z))
to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
- var/dat
+ add_fingerprint(user)
+ ui_interact(user)
- if(temp)
- dat = "[temp] Clear Screen "
- else
- dat = text("Confirm Identity: [] ", (scan ? text("[]", scan.name) : "----------"))
- if(authenticated)
- switch(screen)
- if(1.0)
- dat += {"
-"}
- dat += "Search Records "
- dat += "New Record "
- dat += {"
-
-
-
-
-Name
-ID
-Rank
-Fingerprints
- "}
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
- for(var/datum/data/record/E in data_core.security)
- var/background
- dat += text("[] ", background, R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += "
"
- dat += "Record Maintenance "
- dat += "{Log Out} "
- if(2.0)
- dat += "Records Maintenance "
- dat += "Delete All Records Back "
- if(3.0)
- dat += "Employment Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += text("")
- else
- dat += "General Record Lost! "
- dat += "\nDelete Record (ALL) \nPrint Record \nBack "
- if(4.0)
- if(!Perp.len)
- dat += "ERROR. String could not be located.Back "
- else
- dat += {"
-
- "}
- dat += text("Search Results for '[]': ", tempname)
- dat += {"
-
-
-
-
-Name
-ID
-Rank
-Fingerprints
- "}
- for(var/i=1, i<=Perp.len, i += 2)
- var/crimstat = ""
- var/datum/data/record/R = Perp[i]
- if(istype(Perp[i+1],/datum/data/record/))
- var/datum/data/record/E = Perp[i+1]
- crimstat = E.fields["criminal"]
- var/background
- background = "'background-color:#00FF7F;'"
- dat += text("[] ", background, R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += text("[] ", crimstat)
- dat += "
"
- dat += "Return to index. "
+/obj/machinery/computer/skills/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "skills_data.tmpl", name, 800, 380)
+ ui.open()
+
+/obj/machinery/computer/skills/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["temp"] = temp
+ data["scan"] = scan ? scan.name : null
+ data["authenticated"] = authenticated
+ data["screen"] = screen
+ if(authenticated)
+ switch(screen)
+ if(SKILL_DATA_R_LIST)
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
+ data["records"] += list(list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"], "rank" = R.fields["rank"], "fingerprint" = R.fields["fingerprint"]))
+ if(SKILL_DATA_RECORD)
+ var/list/general = list()
+ data["general"] = general
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/list/fields = list()
+ general["fields"] = fields
+ fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "name" = "name")
+ fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "name" = "id")
+ fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "name" = "sex")
+ fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "name" = "age")
+ fields[++fields.len] = list("field" = "Rank:", "value" = active1.fields["rank"], "name" = "rank")
+ fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "name" = "fingerprint")
+ fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"])
+ fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"])
+ general["notes"] = active1.fields["notes"]
+ var/list/photos = list()
+ general["photos"] = photos
+ photos[++photos.len] = list("photo" = active1.fields["photo-south"])
+ photos[++photos.len] = list("photo" = active1.fields["photo-west"])
+ general["has_photos"] += (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0)
+ general["empty"] = 0
else
- else
- dat += "{Log In} "
- user << browse(text("Employment Records [] ", dat), "window=secure_rec;size=600x400")
- onclose(user, "secure_rec")
- return
+ general["empty"] = 1
+ return data
-/*Revised /N
-I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
-What a mess.*/
/obj/machinery/computer/skills/Topic(href, href_list)
if(..())
return 1
- if(!( data_core.general.Find(active1) ))
+
+ if(!data_core.general.Find(active1))
active1 = null
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- switch(href_list["choice"])
-// SORTING!
- if("Sorting")
- // Reverse the order if clicked twice
- if(sortBy == href_list["sort"])
- if(order == 1)
- order = -1
- else
- order = 1
- else
- // New sorting order!
- sortBy = href_list["sort"]
- order = initial(order)
-//BASIC FUNCTIONS
- if("Clear Screen")
- temp = null
- if("Return")
- screen = 1
- active1 = null
+ if(href_list["temp"])
+ temp = null
- if("Confirm Identity")
- if(scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- usr.put_in_hands(scan)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- scan = I
-
- if("Log Out")
- authenticated = null
- screen = null
- active1 = null
-
- if("Log In")
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = R.braintype
- src.screen = 1
- else if(istype(scan, /obj/item/weapon/card/id))
- active1 = null
- if(check_access(scan))
- authenticated = scan.registered_name
- rank = scan.assignment
- screen = 1
-//RECORD FUNCTIONS
- if("Search Records")
- var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
- if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !in_range(src, usr)))
- return
- Perp = new/list()
- t1 = lowertext(t1)
- var/list/components = splittext(t1, " ")
- if(components.len > 5)
- return //Lets not let them search too greedily.
- for(var/datum/data/record/R in data_core.general)
- var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
- for(var/i = 1, i<=components.len, i++)
- if(findtext(temptext,components[i]))
- var/prelist = new/list(2)
- prelist[1] = R
- Perp += prelist
- for(var/i = 1, i<=Perp.len, i+=2)
- for(var/datum/data/record/E in data_core.security)
- var/datum/data/record/R = Perp[i]
- if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- Perp[i+1] = E
- tempname = t1
- screen = 4
-
- if("Record Maintenance")
- screen = 2
- active1 = null
-
- if("Browse Record")
- var/datum/data/record/R = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- temp = "Record Not Found!"
- else
- for(var/datum/data/record/E in data_core.security)
- active1 = R
- screen = 3
-
- if("Print Record")
- if(!( printing ))
- printing = 1
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
- P.info = "Employment Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] \nEmployment/Skills Summary:[] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], active1.fields["notes"])
- else
- P.info += "General Record Lost! "
- P.info += ""
- P.name = "paper - 'Employment Record'"
- printing = null
-//RECORD DELETE
- if("Delete All Records")
- temp = ""
- temp += "Are you sure you wish to delete all Employment records? "
- temp += "Yes "
- temp += "No "
-
- if("Purge All Records")
- if(PDA_Manifest.len)
+ if(href_list["temp_action"])
+ var/temp_list = splittext(href_list["temp_action"], "=")
+ switch(temp_list[1])
+ if("del_all2")
+ if(PDA_Manifest && PDA_Manifest.len)
PDA_Manifest.Cut()
for(var/datum/data/record/R in data_core.security)
qdel(R)
- temp = "All Employment records deleted."
-
- if("Delete Record (ALL)")
+ setTemp("All employment records deleted. ")
+ if("del_rg2")
if(active1)
- temp = "Are you sure you wish to delete the record (ALL)? "
- temp += "Yes "
- temp += "No "
-//RECORD CREATE
- if("New Record (General)")
+ if(PDA_Manifest && PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"])
+ qdel(R)
+ qdel(active1)
+ active1 = null
+ screen = SKILL_DATA_R_LIST
+ if("rank")
+ if(active1)
+ if(PDA_Manifest && PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ active1.fields["rank"] = temp_list[2]
+ if(temp_list[2] in joblist)
+ active1.fields["real_rank"] = temp_list[2]
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- var/datum/data/record/G = new /datum/data/record()
- G.fields["name"] = "New Record"
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
- G.fields["rank"] = "Unassigned"
- G.fields["real_rank"] = "Unassigned"
- G.fields["sex"] = "Male"
- G.fields["age"] = "Unknown"
- G.fields["fingerprint"] = "Unknown"
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["species"] = "Human"
- data_core.general += G
- active1 = G
+ if(href_list["scan"])
+ if(scan)
+ scan.forceMove(loc)
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ scan = I
-//FIELD FUNCTIONS
- if("Edit Field")
- var/a1 = active1
- switch(href_list["field"])
- if("name")
- if(istype(active1, /datum/data/record))
- var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
- return
- active1.fields["name"] = t1
- if("id")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["id"] = t1
- if("fingerprint")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(active1, /datum/data/record))
- if(active1.fields["sex"] == "Male")
- active1.fields["sex"] = "Female"
- else
- active1.fields["sex"] = "Male"
- if("age")
- if(istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["age"] = t1
- if("rank")
- var/list/L = list( "Head of Personnel", "Captain", "AI" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if((istype(active1, /datum/data/record) && L.Find(rank)))
- temp = "Rank: "
- temp += ""
- for(var/rank in joblist)
- temp += "[rank] "
- temp += " "
+ if(href_list["login"])
+ if(isAI(usr))
+ authenticated = usr.name
+ rank = "AI"
+ else if(isrobot(usr))
+ authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ rank = "[R.modtype] [R.braintype]"
+ else if(istype(scan, /obj/item/weapon/card/id))
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
+
+ if(authenticated)
+ active1 = null
+ screen = SKILL_DATA_R_LIST
+
+ if(authenticated)
+ var/incapable = (usr.stat || usr.restrained() || (!in_range(src, usr) && !issilicon(usr)))
+ if(href_list["logout"])
+ authenticated = null
+ screen = null
+ active1 = null
+
+ else if(href_list["sort"])
+ // Reverse the order if clicked twice
+ if(sortBy == href_list["sort"])
+ if(order == 1)
+ order = -1
+ else
+ order = 1
+ else
+ sortBy = href_list["sort"]
+ order = initial(order)
+
+ else if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+ if(screen < 1)
+ screen = SKILL_DATA_R_LIST
+
+ active1 = null
+
+ else if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ setTemp("Record not found! ")
+ return 1
+ active1 = R
+ screen = SKILL_DATA_RECORD
+
+ else if(href_list["del_all"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "val" = "del_all2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "val" = null, "status" = null)
+ setTemp("Are you sure you wish to delete all employment records? ", buttons)
+
+ else if(href_list["del_rg"])
+ if(active1)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "val" = "del_rg2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "val" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (ALL)? ", buttons)
+
+ else if(href_list["new_g"])
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ var/datum/data/record/G = new /datum/data/record()
+ G.fields["name"] = "New Record"
+ G.fields["id"] = "[add_zero(num2hex(rand(1, 1.6777215E7)), 6)]"
+ G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = "Unassigned"
+ G.fields["sex"] = "Male"
+ G.fields["age"] = "Unknown"
+ G.fields["fingerprint"] = "Unknown"
+ G.fields["p_stat"] = "Active"
+ G.fields["m_stat"] = "Stable"
+ G.fields["species"] = "Human"
+ data_core.general += G
+ active1 = G
+
+ else if(href_list["print_r"])
+ if(!printing)
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Employment Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
+ \nSex: [active1.fields["sex"]]
+ \nAge: [active1.fields["age"]]
+ \nFingerprint: [active1.fields["fingerprint"]]
+ \nPhysical Status: [active1.fields["p_stat"]]
+ \nMental Status: [active1.fields["m_stat"]]
+ \nEmployment/Skills Summary:[active1.fields["notes"]] "}
+ else
+ P.info += "General Record Lost! "
+ P.info += ""
+ P.name = "paper - 'Employment Record'"
+ printing = 0
+
+ if(href_list["field"])
+ if(incapable)
+ return 1
+ var/a1 = active1
+ switch(href_list["field"])
+ if("name")
+ if(istype(active1, /datum/data/record))
+ var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
+ if(!t1 || !length(trim(t1)) || incapable || active1 != a1)
+ return 1
+ active1.fields["name"] = t1
+ if("id")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["id"] = t1
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- alert(usr, "You do not have the required rank to do this!")
- if("species")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["species"] = t1
-
-//TEMPORARY MENU FUNCTIONS
- else//To properly clear as per clear screen.
- temp=null
- switch(href_list["choice"])
- if("Change Rank")
- if(active1)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in joblist)
- active1.fields["real_rank"] = href_list["real_rank"]
-
- if("Delete Record (ALL) Execute")
- if(active1)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
- qdel(R)
- else
- qdel(active1)
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["age"] = t1
+ if("rank")
+ var/list/L = list("Head of Personnel", "Captain", "AI")
+ //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
+ if(istype(active1, /datum/data/record) && L.Find(rank))
+ var/list/buttons = list()
+ for(var/rank in joblist)
+ buttons[++buttons.len] = list("name" = rank, "icon" = null, "val" = "rank=[rank]", "status" = (active1.fields["rank"] == rank ? "selected" : null))
+ setTemp("Rank ", buttons)
else
- temp = "This function does not appear to be working at the moment. Our apologies."
+ setTemp("You do not have the required rank to do this! ")
+ if("species")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["species"] = t1
+ return 1
- add_fingerprint(usr)
- updateUsrDialog()
- return
+/obj/machinery/computer/skills/proc/setTemp(text, list/buttons = list())
+ temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
/obj/machinery/computer/skills/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
@@ -393,7 +303,7 @@ What a mess.*/
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -409,3 +319,7 @@ What a mess.*/
continue
..(severity)
+
+#undef SKILL_DATA_R_LIST
+#undef SKILL_DATA_MAINT
+#undef SKILL_DATA_RECORD
\ No newline at end of file
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index b586fd4194a..d50d0355d5c 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -89,7 +89,7 @@ var/specops_shuttle_timeleft = 0
for(var/turf/T in get_area_turfs(end_location) )
var/mob/M = locate(/mob) in T
- to_chat(M, "\red You have arrived at Central Command. Operation has ended!")
+ to_chat(M, "You have arrived at Central Command. Operation has ended! ")
specops_shuttle_at_station = 0
@@ -137,7 +137,7 @@ var/specops_shuttle_timeleft = 0
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
if(!specops_can_move())
- to_chat(usr, "\red The Special Operations shuttle is unable to leave.")
+ to_chat(usr, "The Special Operations shuttle is unable to leave. ")
return
//Begin Marauder launchpad.
@@ -231,7 +231,7 @@ var/specops_shuttle_timeleft = 0
for(var/turf/T in get_area_turfs(end_location) )
var/mob/M = locate(/mob) in T
- to_chat(M, "\red You have arrived to [station_name]. Commence operation!")
+ to_chat(M, "You have arrived to [station_name]. Commence operation! ")
for(var/obj/machinery/computer/specops_shuttle/S in world)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
@@ -247,23 +247,23 @@ var/specops_shuttle_timeleft = 0
return 1
/obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob)
- to_chat(user, "\red Access Denied.")
+ to_chat(user, "Access Denied. ")
return 1
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob, params)
if(istype(I,/obj/item/weapon/card/emag))
- to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.")
+ to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals. ")
else
return attack_hand(user)
/obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob)
if(!allowed(user))
- to_chat(user, "\red Access Denied.")
+ to_chat(user, "Access Denied. ")
return
//Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle.
// if(sent_strike_team == 0 && send_emergency_team == 0)
-// to_chat(usr, "\red The strike team has not yet deployed.")
+// to_chat(usr, "The strike team has not yet deployed. ")
// return
if(..())
@@ -294,14 +294,14 @@ var/specops_shuttle_timeleft = 0
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
if(!specops_can_move())
- to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return yet.")
+ to_chat(usr, "Central Command will not allow the Special Operations shuttle to return yet. ")
if(world.timeofday <= specops_shuttle_timereset)
if(((world.timeofday - specops_shuttle_timereset)/10) > 60)
- to_chat(usr, "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!")
- to_chat(usr, "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!")
+ to_chat(usr, "[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain! ")
+ to_chat(usr, "[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain! ")
return
- to_chat(usr, "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds.")
+ to_chat(usr, "The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds. ")
temp += "Shuttle departing.OK "
updateUsrDialog()
@@ -315,10 +315,10 @@ var/specops_shuttle_timeleft = 0
if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
if(!specops_can_move())
- to_chat(usr, "\red The Special Operations shuttle is unable to leave.")
+ to_chat(usr, "The Special Operations shuttle is unable to leave. ")
return
- to_chat(usr, "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds.")
+ to_chat(usr, "The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds. ")
temp += "Shuttle departing.OK "
updateUsrDialog()
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index c40e7968145..9c2dde8d3b7 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -24,8 +24,7 @@
/obj/machinery/computer/station_alert/Destroy()
alarm_monitor.unregister(src)
- qdel(alarm_monitor)
- alarm_monitor = null
+ QDEL_NULL(alarm_monitor)
return ..()
/obj/machinery/computer/station_alert/attack_ai(mob/user)
diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm
index 31cfb8bfa8c..895bdd6de4a 100644
--- a/code/game/machinery/computer/store.dm
+++ b/code/game/machinery/computer/store.dm
@@ -140,8 +140,8 @@ td.cost.toomuch {
updateUsrDialog()
return
if(!centcomm_store.PlaceOrder(usr,itemID))
- to_chat(usr, "\red Unable to charge your account.")
+ to_chat(usr, "Unable to charge your account. ")
else
- to_chat(usr, "\blue You've successfully purchased the item. It should be in your hands or on the floor.")
+ to_chat(usr, "You've successfully purchased the item. It should be in your hands or on the floor. ")
src.updateUsrDialog()
return
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index bba953b64e1..14a3fdb72ca 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -60,7 +60,7 @@ var/syndicate_elite_shuttle_timeleft = 0
if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
if(!syndicate_elite_can_move())
- to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.")
+ to_chat(usr, "The Syndicate Elite shuttle is unable to leave. ")
return
sleep(600)
@@ -172,7 +172,7 @@ var/syndicate_elite_shuttle_timeleft = 0
for(var/turf/T in get_area_turfs(end_location) )
var/mob/M = locate(/mob) in T
- to_chat(M, "\red You have arrived to [station_name]. Commence operation!")
+ to_chat(M, "You have arrived to [station_name]. Commence operation! ")
/proc/syndicate_elite_can_move()
if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0
@@ -182,22 +182,22 @@ var/syndicate_elite_shuttle_timeleft = 0
return attack_hand(user)
/obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob)
- to_chat(user, "\red Access Denied.")
+ to_chat(user, "Access Denied. ")
return 1
/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob, params)
if(istype(I,/obj/item/weapon/card/emag))
- to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.")
+ to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals. ")
else
return attack_hand(user)
/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(var/mob/user as mob)
if(!allowed(user))
- to_chat(user, "\red Access Denied.")
+ to_chat(user, "Access Denied. ")
return
// if(sent_syndicate_strike_team == 0)
-// to_chat(usr, "\red The strike team has not yet deployed.")
+// to_chat(usr, "The strike team has not yet deployed. ")
// return
if(..())
@@ -227,17 +227,17 @@ var/syndicate_elite_shuttle_timeleft = 0
if(href_list["sendtodock"])
if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
- to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.")
+ to_chat(usr, "The Syndicate will not allow the Elite Squad shuttle to return. ")
return
else if(href_list["sendtostation"])
if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
if(!specops_can_move())
- to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.")
+ to_chat(usr, "The Syndicate Elite shuttle is unable to leave. ")
return
- to_chat(usr, "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds.")
+ to_chat(usr, "The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds. ")
temp = "Shuttle departing.OK "
updateUsrDialog()
diff --git a/code/game/machinery/computer/vr_control.dm b/code/game/machinery/computer/vr_control.dm
new file mode 100644
index 00000000000..baf2eda1914
--- /dev/null
+++ b/code/game/machinery/computer/vr_control.dm
@@ -0,0 +1,30 @@
+/obj/machinery/computer/vr_control
+ name = "VR console"
+ desc = "A list and control panel for all virtual servers."
+ icon_screen = "comm_logs"
+
+ light_color = LIGHT_COLOR_DARKGREEN
+
+/obj/machinery/computer/vr_control/attack_ai(mob/user)
+ attack_hand(user)
+ ui_interact(user)
+
+
+/obj/machinery/computer/vr_control/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ ui_interact(user)
+
+/obj/machinery/computer/vr_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ switch(alert("What would you like to do?", "VR Control", "Join Room", "Make Room", "Cancel"))
+ if("Join Room")
+ spawn_vr_avatar(user, input(user, "Choose a room to join.","Select Level") as null|anything in vr_rooms)
+ qdel(user)
+ if("Make Room")
+ make_vr_room(input(user, "Name your new Room","Name here.") as null|text, input(user, "Choose a Level to load into your new Room.","Select Level") as null|anything in vr_templates)
+ if("Cancel")
+ return
+
+/obj/machinery/computer/vr_control/interact(mob/user)
+
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index d7384290164..a714e24febc 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -66,9 +66,9 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, C.usesound, 50, 1)
to_chat(user, "You start to add cables to the frame. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(state == 1 && C.amount >= 5 && C.use(5))
to_chat(user, "You add cables to the frame. ")
state = 2
@@ -86,13 +86,13 @@
return
G.use(5)
to_chat(user, "You add the glass to the frame. ")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), G.usesound, 50, 1)
new /obj/structure/displaycase_frame(src.loc)
qdel(src)
return
if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, P.usesound, 75, 1)
to_chat(user, "You dismantle the frame. ")
new /obj/item/stack/sheet/metal(src.loc, 5)
qdel(src)
@@ -100,7 +100,7 @@
if(istype(P, /obj/item/weapon/circuitboard))
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "machine")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, B.usesound, 50, 1)
to_chat(user, "You add the circuit board to the frame. ")
circuit = P
user.drop_item()
@@ -114,7 +114,7 @@
else
to_chat(user, "This frame does not accept circuit boards of this type! ")
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables. ")
state = 1
icon_state = "box_0"
@@ -123,7 +123,7 @@
if(3)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
state = 2
circuit.loc = src.loc
circuit = null
@@ -145,9 +145,9 @@
component_check = 0
break
if(component_check)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc)
- new_machine.construction()
+ new_machine.on_construction()
for(var/obj/O in new_machine.component_parts)
qdel(O)
new_machine.component_parts = list()
@@ -190,20 +190,20 @@
for(var/I in req_components)
if(istype(P, I) && (req_components[I] > 0) && (!(P.flags & NODROP) || istype(P, /obj/item/stack)))
success=1
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CP = P
- var/camt = min(CP.amount, req_components[I])
- var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src)
- CC.amount = camt
- CC.update_icon()
- CP.use(camt)
- components += CC
+ playsound(src.loc, P.usesound, 50, 1)
+ if(istype(P, /obj/item/stack))
+ var/obj/item/stack/S = P
+ var/camt = min(S.amount, req_components[I])
+ var/obj/item/stack/NS = new P.type(src)
+ NS.amount = camt
+ NS.update_icon()
+ S.use(camt)
+ components += NS
req_components[I] -= camt
update_req_desc()
break
user.drop_item()
- P.loc = src
+ P.forceMove(src)
components += P
req_components[I]--
update_req_desc()
@@ -230,6 +230,7 @@ to destroy them and players will be able to make replacements.
var/list/names_paths = list("Booze-O-Mat" = /obj/machinery/vending/boozeomat,
"Solar's Best Hot Drinks" = /obj/machinery/vending/coffee,
"Getmore Chocolate Corp" = /obj/machinery/vending/snack,
+ "Mr. Chang" = /obj/machinery/vending/chinese,
"Robust Softdrinks" = /obj/machinery/vending/cola,
"ShadyCigs Deluxe" = /obj/machinery/vending/cigarette,
"AutoDrobe" = /obj/machinery/vending/autodrobe,
@@ -334,14 +335,37 @@ to destroy them and players will be able to make replacements.
/obj/item/stack/cable_coil = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
+/obj/item/weapon/circuitboard/plantgenes
+ name = "Plant DNA Manipulator (Machine Board)"
+ build_path = /obj/machinery/plantgenes
+ board_type = "machine"
+ origin_tech = "programming=3;biotech=3"
+ frame_desc = "Requires 1 Manipulator, 1 Micro Laser, 1 Console Screen, and 1 Scanning Module."
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/scanning_module = 1)
+
+/obj/item/weapon/circuitboard/seed_extractor
+ name = "circuit board (Seed Extractor)"
+ build_path = /obj/machinery/seed_extractor
+ board_type = "machine"
+ origin_tech = "programming=1"
+ frame_desc = "Requires 1 Matter Bin and 1 Manipulator."
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/item/weapon/circuitboard/hydroponics
name = "circuit board (Hydroponics Tray)"
- build_path = /obj/machinery/portable_atmospherics/hydroponics
+ build_path = /obj/machinery/hydroponics/constructable
board_type = "machine"
origin_tech = "programming=1;biotech=1"
- frame_desc = "Requires 2 Matter Bins and 1 Console Screen."
+ frame_desc = "Requires 2 Matter Bins, 1 Manipulator, and 1 Console Screen."
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/microwave
@@ -733,6 +757,17 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/stack/cable_coil = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
+/obj/item/weapon/circuitboard/quantumpad
+ name = "circuit board (Quantum Pad)"
+ build_path = /obj/machinery/quantumpad
+ board_type = "machine"
+ origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4"
+ frame_desc = "Requires 1 Bluespace Crystal, 1 Capacitor, 1 piece of cable and 1 Manipulator."
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 1,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 1)
/obj/item/weapon/circuitboard/sleeper
name = "circuit board (Sleeper)"
@@ -925,26 +960,6 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/stack/cable_coil = 1)
-/obj/item/weapon/circuitboard/botany_extractor
- name = "circuit board (Lysis-Isolation Centrifuge)"
- build_path = /obj/machinery/botany/extractor
- board_type = "machine"
- origin_tech = "biotech=3;programming=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/botany_editor
- name = "circuit board (Bioballistic Delivery System)"
- build_path = /obj/machinery/botany/editor
- board_type = "machine"
- origin_tech = "biotech=3;programming=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
/obj/item/weapon/circuitboard/gameboard
name = "circuit board (Virtual Gameboard)"
build_path = /obj/machinery/gameboard
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index de5d69c2bbc..8e026cfd80a 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -52,7 +52,7 @@
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
-/obj/machinery/atmospherics/unary/cryo_cell/construction()
+/obj/machinery/atmospherics/unary/cryo_cell/on_construction()
..(dir,dir)
/obj/machinery/atmospherics/unary/cryo_cell/RefreshParts()
@@ -265,7 +265,7 @@
/obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params)
if(istype(G, /obj/item/weapon/reagent_containers/glass))
if(beaker)
- to_chat(user, "\red A beaker is already loaded into the machine.")
+ to_chat(user, "A beaker is already loaded into the machine. ")
return
if(!user.drop_item())
to_chat(user, "The [G] is stuck to you!")
@@ -415,10 +415,10 @@
to_chat(usr, "The cryo cell is already occupied! ")
return
if(M.abiotic())
- to_chat(usr, "\red Subject may not have abiotic items on.")
+ to_chat(usr, "Subject may not have abiotic items on. ")
return
if(!node)
- to_chat(usr, "\red The cell is not correctly connected to its pipe network!")
+ to_chat(usr, "The cell is not correctly connected to its pipe network! ")
return
M.stop_pulling()
M.forceMove(src)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 1d9e02f52a1..789d4f81b1c 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -29,14 +29,14 @@
var/allow_items = 1
/obj/machinery/computer/cryopod/attack_ai()
- src.attack_hand()
+ attack_hand()
/obj/machinery/computer/cryopod/attack_hand(mob/user = usr)
if(stat & (NOPOWER|BROKEN))
return
user.set_machine(src)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
var/dat
@@ -60,7 +60,7 @@
var/mob/user = usr
- src.add_fingerprint(user)
+ add_fingerprint(user)
if(href_list["log"])
@@ -120,7 +120,7 @@
I.loc = get_turf(src)
frozen_items -= I
- src.updateUsrDialog()
+ updateUsrDialog()
return
/obj/item/weapon/circuitboard/cryopodcontrol
@@ -178,7 +178,7 @@
var/time_till_despawn = 9000 // This is reduced by 90% if a player manually enters cryo
var/willing_time_divisor = 10
var/time_entered = 0 // Used to keep track of the safe period.
- var/obj/item/device/radio/intercom/announce //
+ var/obj/item/device/radio/intercom/announce
var/obj/machinery/computer/cryopod/control_computer
var/last_no_computer_message = 0
@@ -192,12 +192,18 @@
/obj/item/device/paicard,
/obj/item/weapon/gun,
/obj/item/weapon/pinpointer,
- /obj/item/clothing/suit,
/obj/item/clothing/shoes/magboots,
/obj/item/areaeditor/blueprints,
/obj/item/clothing/head/helmet/space,
+ /obj/item/clothing/suit/space,
+ /obj/item/clothing/suit/armor,
+ /obj/item/weapon/defibrillator/compact,
+ /obj/item/weapon/reagent_containers/hypospray/CMO,
+ /obj/item/clothing/accessory/medal/gold/captain,
+ /obj/item/clothing/gloves/color/black/krav_maga/sec,
/obj/item/weapon/storage/internal,
- /obj/item/device/spacepod_key
+ /obj/item/device/spacepod_key,
+ /obj/item/weapon/nullrod
)
// These items will NOT be preserved
var/list/do_not_preserve_items = list (
@@ -230,8 +236,8 @@
// Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged
if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time)
- log_admin("Cryopod in [src.loc.loc] could not find control computer!")
- message_admins("Cryopod in [src.loc.loc] could not find control computer!")
+ log_admin("Cryopod in [loc.loc] could not find control computer!")
+ message_admins("Cryopod in [loc.loc] could not find control computer!")
last_no_computer_message = world.time
return control_computer != null
@@ -290,8 +296,13 @@
continue
O.loc = src
+ for(var/obj/machinery/computer/cloning/cloner in machines)
+ for(var/datum/dna2/record/R in cloner.records)
+ if(occupant.mind == locate(R.mind))
+ cloner.records.Remove(R)
+
//Delete all items not on the preservation list.
- var/list/items = src.contents
+ var/list/items = contents
items -= occupant // Don't delete the occupant
items -= announce // or the autosay radio.
@@ -317,7 +328,19 @@
control_computer.frozen_items += W
W.loc = null
else
- W.loc = src.loc
+ W.loc = loc
+
+ // Skip past any cult sacrifice objective using this person
+ if(GAMEMODE_IS_CULT && is_sacrifice_target(occupant.mind))
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ var/list/p_s_t = cult_mode.get_possible_sac_targets()
+ if(p_s_t.len)
+ cult_mode.sacrifice_target = pick(p_s_t)
+ for(var/datum/mind/H in ticker.mode.cult)
+ if(H.current)
+ to_chat(H.current, "[ticker.mode.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead... ")
+ else
+ cult_mode.bypass_phase()
//Update any existing objectives involving this mob.
for(var/datum/objective/O in all_objectives)
@@ -328,7 +351,8 @@
else if(O.target && istype(O.target,/datum/mind))
if(O.target == occupant.mind)
if(O.owner && O.owner.current)
- to_chat(O.owner.current, "You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated! ")
+ to_chat(O.owner.current, "You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated! ")
+ O.owner.current << 'sound/ambience/alarm4.ogg'
O.target = null
spawn(1) //This should ideally fire after the occupant is deleted.
if(!O) return
@@ -438,7 +462,7 @@
if(do_after(user, 20, target = G:affecting))
if(!M || !G || !G:affecting) return
- if(src.occupant)
+ if(occupant)
to_chat(user, "\The [src] is in use. ")
return
@@ -474,7 +498,7 @@
message_admins("[key_name_admin(M)] has entered a stasis pod. (JMP )")
//Despawning occurs when process() is called with an occupant without a client.
- src.add_fingerprint(M)
+ add_fingerprint(M)
/obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
@@ -525,6 +549,9 @@
willing = 1
if(willing)
+ if(!Adjacent(L))
+ to_chat(user, "You're not close enough to \the [src]. ")
+ return
if(L == user)
visible_message("[user] starts climbing into the cryo pod.")
else
@@ -533,7 +560,7 @@
if(do_after(user, 20, target = L))
if(!L) return
- if(src.occupant)
+ if(occupant)
to_chat(user, "\The [src] is in use. ")
return
L.forceMove(src)
@@ -565,7 +592,7 @@
message_admins("[key_name_admin(L)] has entered a stasis pod. ")
//Despawning occurs when process() is called with an occupant without a client.
- src.add_fingerprint(L)
+ add_fingerprint(L)
return
@@ -587,14 +614,14 @@
icon_state = base_icon_state
//Eject any items that aren't meant to be in the pod.
- var/list/items = src.contents
+ var/list/items = contents
if(occupant) items -= occupant
if(announce) items -= announce
for(var/obj/item/W in items)
W.loc = get_turf(src)
- src.go_out()
+ go_out()
add_fingerprint(usr)
name = initial(name)
@@ -608,7 +635,7 @@
if(usr.stat != 0 || !check_occupant_allowed(usr))
return
- if(src.occupant)
+ if(occupant)
to_chat(usr, "\The [src] is in use. ")
return
@@ -624,13 +651,13 @@
if(!usr || !usr.client)
return
- if(src.occupant)
+ if(occupant)
to_chat(usr, "\The [src] is in use. ")
return
usr.stop_pulling()
usr.forceMove(src)
- src.occupant = usr
+ occupant = usr
time_till_despawn = initial(time_till_despawn) / willing_time_divisor
if(orient_right)
@@ -643,7 +670,7 @@
occupant = usr
time_entered = world.time
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
name = "[name] ([usr.name])"
return
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index b54a2e88a34..05dbcb4e12a 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -65,11 +65,11 @@ for reference:
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, stacktype))
if(src.health < src.maxhealth)
- visible_message("\red [user] begins to repair the [src]!")
- if(do_after(user,20, target = src))
+ visible_message("[user] begins to repair the [src]! ")
+ if(do_after(user, 20 * W.toolspeed, target = src))
src.health = src.maxhealth
W:use(1)
- visible_message("\red [user] repairs the [src]!")
+ visible_message("[user] repairs the [src]! ")
return
else
return
@@ -77,9 +77,9 @@ for reference:
else if(istype(W, /obj/item/weapon/crowbar))
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] is prying apart \the [src]. ", "You begin to pry apart \the [src]. ")
- playsound(src, 'sound/items/Crowbar.ogg', 200, 1)
+ playsound(src, W.usesound, 200, 1)
- if(do_after(user, 300, target = src) && src && !src.gcDestroyed)
+ if(do_after(user, 300 * W.toolspeed, target = src) && src && !src.gcDestroyed)
user.visible_message("[user] pries apart \the [src]. ", "You pry apart \the [src]. ")
dismantle()
return
@@ -115,8 +115,8 @@ for reference:
qdel(src)
return
-/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
- if(air_group || (height==0))
+/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
+ if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
@@ -136,6 +136,8 @@ for reference:
icon = 'icons/obj/structures.dmi'
icon_state = "woodenbarricade"
stacktype = /obj/item/stack/sheet/wood
+ burn_state = FLAMMABLE
+ burntime = 25
/obj/structure/barricade/mime
name = "floor"
@@ -189,7 +191,7 @@ for reference:
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
- visible_message("\red BZZzZZzZZzZT")
+ visible_message("BZZzZZzZZzZT ")
return
return
else if(istype(W, /obj/item/weapon/wrench))
@@ -197,12 +199,12 @@ for reference:
src.health = src.maxhealth
src.emagged = 0
src.req_access = list(access_security)
- visible_message("\red [user] repairs the [src]!")
+ visible_message("[user] repairs the [src]! ")
return
else if(src.emagged > 0)
src.emagged = 0
src.req_access = list(access_security)
- visible_message("\red [user] repairs the [src]!")
+ visible_message("[user] repairs the [src]! ")
return
return
else
@@ -224,14 +226,14 @@ for reference:
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
- visible_message("\red BZZzZZzZZzZT")
+ visible_message("BZZzZZzZZzZT ")
else if(src.emagged == 1)
src.emagged = 2
to_chat(user, "You short out the anchoring mechanism on the [src].")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
- visible_message("\red BZZzZZzZZzZT")
+ visible_message("BZZzZZzZZzZT ")
ex_act(severity)
switch(severity)
@@ -257,8 +259,8 @@ for reference:
src.explode()
return
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
- if(air_group || (height==0))
+ CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
+ if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index f952f8f2bc3..a3eeccb94a8 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -33,7 +33,7 @@
/obj/machinery/door_control/attack_ai(mob/user as mob)
if(wires & 2)
- return src.attack_hand(user)
+ return attack_hand(user)
else
to_chat(user, "Error, no route to host.")
@@ -54,22 +54,26 @@
*/
if(istype(W, /obj/item/device/detective_scanner))
return
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/door_control/emag_act(user as mob)
if(!emagged)
emagged = 1
req_access = list()
req_one_access = list()
- playsound(src.loc, "sparks", 100, 1)
+ playsound(loc, "sparks", 100, 1)
+
+/obj/machinery/door_control/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
/obj/machinery/door_control/attack_hand(mob/user as mob)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
if(stat & (NOPOWER|BROKEN))
return
- if(!allowed(user) && (wires & 1))
- to_chat(user, "\red Access Denied")
+ if(!allowed(user) && (wires & 1) && !user.can_advanced_admin_interact())
+ to_chat(user, "Access Denied. ")
flick("doorctrl-denied",src)
return
@@ -79,7 +83,7 @@
if(normaldoorcontrol)
for(var/obj/machinery/door/airlock/D in range(range))
- if(D.id_tag == src.id)
+ if(D.id_tag == id)
if(specialfunctions & OPEN)
if(D.density)
spawn(0)
@@ -110,7 +114,7 @@
else
for(var/obj/machinery/door/poddoor/M in airlocks)
- if(M.id_tag == src.id)
+ if(M.id_tag == id)
if(M.density)
spawn( 0 )
M.open()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 5f751556d0d..a0b72ed5074 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -34,7 +34,7 @@
var/main_power_timer = null
var/backup_power_timer = null
var/spawnPowerRestoreRunning = 0
- var/welded = null
+ var/welded = FALSE
var/locked = 0
var/lights = 1 // bolt lights show by default
var/datum/wires/airlock/wires = null
@@ -53,8 +53,8 @@
var/frozen = 0 //special condition for airlocks that are frozen shut, this will look weird on not normal airlocks because of a lack of special overlays.
autoclose = 1
explosion_block = 1
- var/doorOpen = 'sound/machines/airlock.ogg'
- var/doorClose = 'sound/machines/airlock.ogg'
+ var/doorOpen = 'sound/machines/airlock_open.ogg'
+ var/doorClose = 'sound/machines/airlock_close.ogg'
var/doorDeni = 'sound/machines/DeniedBeep.ogg' // i'm thinkin' Deni's
var/boltUp = 'sound/machines/BoltsUp.ogg'
var/boltDown = 'sound/machines/BoltsDown.ogg'
@@ -89,6 +89,11 @@
name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext
+ doorOpen = 'sound/machines/airlock_ext_open.ogg'
+ doorClose = 'sound/machines/airlock_ext_close.ogg'
+
+/obj/machinery/door/airlock/welded
+ welded = 1
/obj/machinery/door/airlock/glass
name = "Glass Airlock"
@@ -184,7 +189,6 @@
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_research
glass = 1
- heat_proof = 1
/obj/machinery/door/airlock/glass_mining
name = "Maintenance Hatch"
@@ -265,8 +269,11 @@
name = "Tranquillite Airlock"
icon = 'icons/obj/doors/Doorfreezer.dmi'
mineral = "tranquillite"
- doorOpen = null
+ doorOpen = null // it's silent!
doorClose = null
+ doorDeni = null
+ boltUp = null
+ boltDown = null
/obj/machinery/door/airlock/sandstone
name = "Sandstone Airlock"
@@ -327,7 +334,7 @@
About the new airlock wires panel:
* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires.
* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though)
-* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be \red open, but bolts-raising will not work. Cutting these wires may electrocute the user.
+* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user.
* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work.
* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user.
* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required.
@@ -340,8 +347,8 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(electronics)
+ QDEL_NULL(wires)
if(main_power_timer)
deltimer(main_power_timer)
main_power_timer = null
@@ -364,7 +371,7 @@ About the new airlock wires panel:
return
else /*if(src.justzap)*/
return
- else if(user.hallucination > 50 && prob(10) && src.operating == 0)
+ else if(user.hallucination > 50 && prob(10) && !operating)
to_chat(user, "You feel a powerful shock course through your body! ")
user.adjustStaminaLoss(50)
user.AdjustStunned(5)
@@ -412,10 +419,10 @@ About the new airlock wires panel:
return 0
/obj/machinery/door/airlock/proc/mainPowerCablesCut()
- return src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1) || src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2)
+ return src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1)
/obj/machinery/door/airlock/proc/backupPowerCablesCut()
- return src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1) || src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2)
+ return src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)
/obj/machinery/door/airlock/proc/loseMainPower()
main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
@@ -476,7 +483,7 @@ About the new airlock wires panel:
else if(duration) //electrify door for the given duration seconds
if(usr)
shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])")
- usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z] ")
+ usr.create_attack_log("Electrified the [name] at [x] [y] [z] ")
else
shockedby += text("\[[time_stamp()]\] - EMP)")
message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]."
@@ -556,17 +563,12 @@ About the new airlock wires panel:
flick("door_deny", src)
return
-/obj/machinery/door/airlock/attack_ai(mob/user as mob)
+/obj/machinery/door/airlock/attack_ghost(mob/user)
+ if(p_open)
+ wires.Interact(user)
ui_interact(user)
-/obj/machinery/door/airlock/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls - [src]", 600, 375)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/door/airlock/attack_ai(mob/user as mob)
+/obj/machinery/door/airlock/attack_ai(mob/user)
ui_interact(user)
/obj/machinery/door/airlock/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
@@ -644,7 +646,7 @@ About the new airlock wires panel:
if(user)
src.attack_ai(user)
-/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0)
if(src.isElectrified())
if(istype(mover, /obj/item))
var/obj/item/i = mover
@@ -665,14 +667,14 @@ About the new airlock wires panel:
if(H.getBrainLoss() >= 60)
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
if(!istype(H.head, /obj/item/clothing/head/helmet))
- visible_message("\red [user] headbutts the airlock.")
+ visible_message("[user] headbutts the airlock. ")
var/obj/item/organ/external/affecting = H.get_organ("head")
H.Stun(5)
H.Weaken(5)
if(affecting.take_damage(10, 0))
H.UpdateDamageIcon()
else
- visible_message("\red [user] headbutts the airlock. Good thing they're wearing a helmet.")
+ visible_message("[user] headbutts the airlock. Good thing they're wearing a helmet. ")
return
if(src.p_open)
@@ -682,17 +684,17 @@ About the new airlock wires panel:
return
/obj/machinery/door/airlock/CanUseTopic(var/mob/user)
- if(!issilicon(user))
+ if(!issilicon(user) && !isobserver(user))
return STATUS_CLOSE
- if(operating < 0) //emagged
+ if(emagged)
to_chat(user, "Unable to interface: Internal error. ")
return STATUS_CLOSE
- if(!src.canAIControl())
- if(src.canAIHack(user))
- src.hack(user)
+ if(!canAIControl() && !isobserver(user))
+ if(canAIHack(user))
+ hack(user)
else
- if(src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it.
+ if(isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it.
to_chat(user, "Unable to interface: Connection timed out. ")
else
to_chat(user, "Unable to interface: Connection refused. ")
@@ -709,51 +711,51 @@ About the new airlock wires panel:
if("idscan")
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
to_chat(usr, "The IdScan wire has been cut - IdScan feature permanently disabled.")
- else if(activate && src.aiDisabledIdScanner)
- src.aiDisabledIdScanner = 0
+ else if(activate && aiDisabledIdScanner)
+ aiDisabledIdScanner = 0
to_chat(usr, "IdScan feature has been enabled.")
- else if(!activate && !src.aiDisabledIdScanner)
- src.aiDisabledIdScanner = 1
+ else if(!activate && !aiDisabledIdScanner)
+ aiDisabledIdScanner = 1
to_chat(usr, "IdScan feature has been disabled.")
if("main_power")
if(!main_power_lost_until)
- src.loseMainPower()
+ loseMainPower()
if("backup_power")
if(!backup_power_lost_until)
- src.loseBackupPower()
+ loseBackupPower()
if("bolts")
- if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
+ if(isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
to_chat(usr, "The door bolt control wire has been cut - Door bolts permanently dropped.")
- else if(activate && src.lock())
+ else if(activate && lock())
to_chat(usr, "The door bolts have been dropped.")
- else if(!activate && src.unlock())
+ else if(!activate && unlock())
to_chat(usr, "The door bolts have been raised.")
if("electrify_temporary")
- if(activate && src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
+ if(activate && isWireCut(AIRLOCK_WIRE_ELECTRIFY))
to_chat(usr, text("The electrification wire is cut - Door permanently electrified."))
else if(!activate && electrified_until != 0)
to_chat(usr, "The door is now un-electrified.")
electrify(0)
else if(activate) //electrify door for 30 seconds
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
- usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z] ")
+ usr.create_attack_log("Electrified the [name] at [x] [y] [z] ")
to_chat(usr, "The door is now electrified for thirty seconds.")
electrify(30)
if("electrify_permanently")
- if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
+ if(isWireCut(AIRLOCK_WIRE_ELECTRIFY))
to_chat(usr, text("The electrification wire is cut - Cannot electrify the door."))
else if(!activate && electrified_until != 0)
to_chat(usr, "The door is now un-electrified.")
electrify(0)
else if(activate)
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
- usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z] ")
+ usr.create_attack_log("Electrified the [name] at [x] [y] [z] ")
to_chat(usr, "The door is now electrified.")
electrify(-1)
if("open")
- if(src.welded)
+ if(welded)
to_chat(usr, text("The airlock has been welded shut!"))
- else if(src.locked)
+ else if(locked)
to_chat(usr, text("The door bolts are down!"))
else if(activate && density)
open()
@@ -761,33 +763,33 @@ About the new airlock wires panel:
close()
if("safeties")
// Safeties! We don't need no stinking safeties!
- if(src.isWireCut(AIRLOCK_WIRE_SAFETY))
+ if(isWireCut(AIRLOCK_WIRE_SAFETY))
to_chat(usr, text("The safety wire is cut - Cannot secure the door."))
- else if(activate && src.safe)
+ else if(activate && safe)
safe = 0
- else if(!activate && !src.safe)
+ else if(!activate && !safe)
safe = 1
if("timing")
// Door speed control
- if(src.isWireCut(AIRLOCK_WIRE_SPEED))
+ if(isWireCut(AIRLOCK_WIRE_SPEED))
to_chat(usr, text("The timing wire is cut - Cannot alter timing."))
- else if(activate && src.normalspeed)
+ else if(activate && normalspeed)
normalspeed = 0
- else if(!activate && !src.normalspeed)
+ else if(!activate && !normalspeed)
normalspeed = 1
if("lights")
// Bolt lights
- if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
+ if(isWireCut(AIRLOCK_WIRE_LIGHT))
to_chat(usr, "The bolt lights wire has been cut - The door bolt lights are permanently disabled.")
- else if(!activate && src.lights)
+ else if(!activate && lights)
lights = 0
to_chat(usr, "The door bolt lights have been disabled.")
- else if(activate && !src.lights)
+ else if(activate && !lights)
lights = 1
to_chat(usr, "The door bolt lights have been enabled.")
if("emergency")
// Emergency access
- if(src.emergency)
+ if(emergency)
emergency = 0
to_chat(usr, "Emergency access has been disabled.")
else
@@ -797,54 +799,55 @@ About the new airlock wires panel:
update_icon()
return 1
-/obj/machinery/door/airlock/attackby(C as obj, mob/user as mob, params)
+/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob, params)
// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user))
if(!istype(usr, /mob/living/silicon))
- if(src.isElectrified())
- if(src.shock(user, 75))
+ if(isElectrified())
+ if(shock(user, 75))
return
if(istype(C, /obj/item/device/detective_scanner) || istype(C, /obj/item/taperoll))
return
- src.add_fingerprint(user)
- if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density))
+ add_fingerprint(user)
+ if((istype(C, /obj/item/weapon/weldingtool) && !operating && density))
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0,user))
if(frozen)
frozen = 0
- if(!src.welded)
- src.welded = 1
+ if(!welded)
+ welded = 1
else
- src.welded = null
- src.update_icon()
+ welded = null
+ update_icon()
return
else
return
else if(istype(C, /obj/item/weapon/screwdriver))
- src.p_open = !( src.p_open )
- src.update_icon()
+ p_open = !( p_open )
+ update_icon()
else if(istype(C, /obj/item/weapon/wirecutters))
- return src.attack_hand(user)
+ return attack_hand(user)
else if(istype(C, /obj/item/device/multitool))
- return src.attack_hand(user)
+ return attack_hand(user)
else if(istype(C, /obj/item/device/assembly/signaler))
- return src.attack_hand(user)
+ return attack_hand(user)
else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE
var/obj/item/weapon/pai_cable/cable = C
cable.plugin(src, user)
- else if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe) )
+ else if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe))
var/beingcrowbarred = null
if(istype(C, /obj/item/weapon/crowbar) )
beingcrowbarred = 1 //derp, Agouri
else
beingcrowbarred = 0
- if( beingcrowbarred && src.p_open && (operating == -1 || (density && welded && operating != 1 && !src.arePowerSystemsOn() && !src.locked)) )
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ if( beingcrowbarred && p_open && (emagged || (density && welded && (!operating || emagged) && !arePowerSystemsOn() && !locked)) )
+ playsound(loc, C.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
- if(do_after(user,40, target = src))
- to_chat(user, "\blue You removed the airlock electronics!")
+ if(do_after(user, 40 * C.toolspeed, target = src))
+ to_chat(user, "You removed the airlock electronics! ")
- var/obj/structure/door_assembly/da = new assembly_type(src.loc)
+ var/obj/structure/door_assembly/da = new assembly_type(loc)
+ da.heat_proof_finished = heat_proof //tracks whether there's rglass in
da.anchored = 1
if(mineral)
da.glass = mineral
@@ -852,33 +855,58 @@ About the new airlock wires panel:
else if(glass && !da.glass)
da.glass = 1
da.state = 1
- da.created_name = src.name
+ da.created_name = name
da.update_state()
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
- ae = new/obj/item/weapon/airlock_electronics( src.loc )
- if(!src.req_access)
- src.check_access()
- if(src.req_access.len)
- ae.conf_access = src.req_access
- else if(src.req_one_access.len)
- ae.conf_access = src.req_one_access
+ ae = new/obj/item/weapon/airlock_electronics( loc )
+ if(!req_access)
+ check_access()
+ if(req_access.len)
+ ae.conf_access = req_access
+ else if(req_one_access.len)
+ ae.conf_access = req_one_access
ae.one_access = 1
else
ae = electronics
electronics = null
- ae.loc = src.loc
- if(operating == -1)
+ ae.loc = loc
+ if(emagged)
ae.icon_state = "door_electronics_smoked"
operating = 0
qdel(src)
return
- else if(arePowerSystemsOn())
- to_chat(user, "\blue The airlock's motors resist your efforts to force it.")
+ if(istype(C, /obj/item/weapon/crowbar/power) && density)
+ if(isElectrified())
+ shock(user, 100)//it's like sticking a fork in a power socket
+ return
+
+ if(locked)
+ to_chat(user, "The bolts are down, it won't budge! ")
+ return
+
+ if(welded)
+ to_chat(user, "It's welded, it won't budge! ")
+ return
+
+ if(arePowerSystemsOn())
+ var/obj/item/weapon/crowbar/power/P = C
+ playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, 1) //is it aliens or just the CE being a dick?
+ user.visible_message("[user] starts forcing [src] with \the [P]... ", \
+ "You begin forcing [src] with \the [P]... ")
+ if(do_after(user, P.airlock_open_time, target = src))
+ user.visible_message("[user] forces [src] with \the [P]. ", \
+ "You force [src] with \the [P]. ")
+ open(2)
+ if(density && !open(2))
+ to_chat(user, "Despite your attempts, the [src] refuses to open. ")
+ return
+ if(arePowerSystemsOn())
+ to_chat(user, "The airlock's motors resist your efforts to force it. ")
else if(locked)
- to_chat(user, "\blue The airlock's bolts prevent it from being forced.")
+ to_chat(user, "The airlock's bolts prevent it from being forced. ")
else if( !welded && !operating )
if(density)
if(beingcrowbarred == 0) //being fireaxe'd
@@ -886,7 +914,7 @@ About the new airlock wires panel:
if(F.wielded)
spawn(0) open(1)
else
- to_chat(user, "\red You need to be wielding \the [C] to do that.")
+ to_chat(user, "You need to be wielding \the [C] to do that. ")
else
spawn(0) open(1)
else
@@ -895,7 +923,7 @@ About the new airlock wires panel:
if(F.wielded)
spawn(0) close(1)
else
- to_chat(user, "\red You need to be wielding \the [C] to do that.")
+ to_chat(user, "You need to be wielding \the [C] to do that. ")
else
spawn(0) close(1)
else
@@ -910,22 +938,22 @@ About the new airlock wires panel:
..()
/obj/machinery/door/airlock/open(var/forced=0)
- if( operating || welded || locked )
+ if(operating || welded || locked || emagged)
return 0
if(!forced)
if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
return 0
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
if(forced)
- playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1)
+ playsound(loc, 'sound/machines/airlockforced.ogg', 30, 1)
else
- playsound(src.loc, doorOpen, 30, 1)
- if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density)
- src.closeOther.close()
+ playsound(loc, doorOpen, 30, 1)
+ if(closeOther != null && istype(closeOther, /obj/machinery/door/airlock/) && !closeOther.density)
+ closeOther.close()
return ..()
/obj/machinery/door/airlock/close(var/forced=0, var/override = 0)
- if((operating & !override) || welded || locked)
+ if((operating & !override) || welded || locked || emagged)
return
if(!forced)
//despite the name, this wire is for general door control.
@@ -935,16 +963,16 @@ About the new airlock wires panel:
if(safe)
for(var/turf/turf in locs)
if(locate(/mob/living) in turf)
- // playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) //THE BUZZING IT NEVER STOPS -Pete
+ // playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) //THE BUZZING IT NEVER STOPS -Pete
spawn (60)
autoclose()
return
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
if(forced)
- playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1)
+ playsound(loc, 'sound/machines/airlockforced.ogg', 30, 1)
else
- playsound(src.loc, doorClose, 30, 1)
+ playsound(loc, doorClose, 30, 1)
var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src))
if(killthis)
killthis.ex_act(2)//Smashin windows
@@ -953,9 +981,9 @@ About the new airlock wires panel:
return 1
operating = 1
do_animate("closing")
- src.layer = 3.1
+ layer = 3.1
if(!override) sleep(5)
- src.density = 1
+ density = 1
if(!safe)
crush()
if(!override) sleep(5)
@@ -977,19 +1005,19 @@ About the new airlock wires panel:
if(operating && !forced) return 0
- src.locked = 1
+ locked = 1
playsound(src, boltDown, 30, 0, 3)
update_icon()
return 1
/obj/machinery/door/airlock/proc/unlock(var/forced=0)
- if(!src.locked)
+ if(!locked)
return
if(!forced)
- if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return
+ if(operating || !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return
- src.locked = 0
+ locked = 0
playsound(src,boltUp, 30, 0, 3)
update_icon()
return 1
@@ -997,21 +1025,24 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/New()
..()
wires = new(src)
- if(src.closeOtherId != null)
- spawn (5)
- for(var/obj/machinery/door/airlock/A in airlocks)
- if(A.closeOtherId == src.closeOtherId && A != src)
- src.closeOther = A
- break
+
+/obj/machinery/door/airlock/initialize()
+ . = ..()
+ if(closeOtherId != null)
+ for(var/obj/machinery/door/airlock/A in airlocks)
+ if(A.closeOtherId == closeOtherId && A != src)
+ closeOther = A
+ break
if(frozen)
- welded = 1
+ welded = TRUE
+ if(welded)
update_icon()
/obj/machinery/door/airlock/hatch/gamma/attackby(C as obj, mob/user as mob, params)
// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user))
if(!istype(usr, /mob/living/silicon))
- if(src.isElectrified())
- if(src.shock(user, 75))
+ if(isElectrified())
+ if(shock(user, 75))
return
if(istype(C, /obj/item/device/detective_scanner) || istype(C, /obj/item/taperoll))
return
@@ -1024,17 +1055,17 @@ About the new airlock wires panel:
to_chat(user, "The hatch is made of an advanced compound that cannot be deconstructed using an RCD.")
return
- src.add_fingerprint(user)
- if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density))
+ add_fingerprint(user)
+ if((istype(C, /obj/item/weapon/weldingtool) && !operating && density))
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0,user))
if(frozen)
frozen = 0
- if(!src.welded)
- src.welded = 1
+ if(!welded)
+ welded = 1
else
- src.welded = null
- src.update_icon()
+ welded = null
+ update_icon()
return
else
return
@@ -1043,23 +1074,23 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/highsecurity/red/attackby(C as obj, mob/user as mob, params)
// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user))
if(!istype(usr, /mob/living/silicon))
- if(src.isElectrified())
- if(src.shock(user, 75))
+ if(isElectrified())
+ if(shock(user, 75))
return
if(istype(C, /obj/item/device/detective_scanner) || istype(C, /obj/item/taperoll))
return
- src.add_fingerprint(user)
- if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density))
+ add_fingerprint(user)
+ if((istype(C, /obj/item/weapon/weldingtool) && !operating && density))
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0,user))
if(frozen)
frozen = 0
- if(!src.welded)
- src.welded = 1
+ if(!welded)
+ welded = 1
else
- src.welded = null
- src.update_icon()
+ welded = null
+ update_icon()
return
else
return
@@ -1084,10 +1115,12 @@ About the new airlock wires panel:
update_icon()
/obj/machinery/door/airlock/proc/prison_open()
+ if(emagged)
+ return
if(arePowerSystemsOn())
- src.unlock()
- src.open()
- src.lock()
+ unlock()
+ open()
+ lock()
/obj/machinery/door/airlock/hostile_lockdown(mob/origin)
// Must be powered and have working AI wire.
@@ -1109,6 +1142,14 @@ About the new airlock wires panel:
open()
safe = TRUE
+/obj/machinery/door/airlock/narsie_act()
+ var/turf/T = get_turf(src)
+ if(prob(20))
+ new/obj/machinery/door/airlock/cult(T)
+ qdel(src)
+
+
+
//////////////////////////////////
/*
Cult Airlocks
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index 4904c8795fa..17ebdf96ce2 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -26,7 +26,7 @@ obj/machinery/door/airlock/receive_signal(datum/signal/signal)
execute_current_command()
obj/machinery/door/airlock/proc/execute_current_command()
- if(operating)
+ if(operating || emagged)
return //emagged or busy doing something else
if(!cur_command)
@@ -261,7 +261,7 @@ obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob, params)
obj/machinery/access_button/attack_hand(mob/user)
add_fingerprint(usr)
if(!allowed(user))
- to_chat(user, "\red Access Denied")
+ to_chat(user, "Access Denied ")
else if(radio_connection)
var/datum/signal/signal = new
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index acad5a5a563..186d4c9705a 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -4,7 +4,7 @@
name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
req_access = list(access_engine)
@@ -14,6 +14,8 @@
var/last_configurator = null
var/locked = TRUE
var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/weapon/airlock_electronics/attack_self(mob/user)
if(!ishuman(user) && !isrobot(user))
@@ -62,10 +64,10 @@
/obj/item/weapon/airlock_electronics/Topic(href, href_list)
..()
-
+
if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr)))
return 1
-
+
if(href_list["close"])
usr << browse(null, "window=airlock")
return
@@ -104,4 +106,3 @@
conf_access -= req
if(!conf_access.len)
conf_access = null
-
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 0be61cde4b6..a24af37dc72 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -28,15 +28,41 @@
var/list/obj/machinery/targets = list()
var/timetoset = 0 // Used to set releasetime upon starting the timer
var/obj/item/device/radio/Radio
+ var/printed = 0
maptext_height = 26
maptext_width = 32
+/obj/machinery/door_timer/proc/print_report()
+ var/logname = input(usr, "Name of the guilty?","[id] log name")
+ var/logcharges = stripped_multiline_input(usr, "What have they been charged with?","[id] log charges")
+
+ if(!logname || !logcharges)
+ return 0
+
+ for(var/obj/machinery/computer/prisoner/C in prisoncomputer_list)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
+ P.name = "[id] log - [logname] [worldtime2text()]"
+ P.info = "[id] - Brig record "
+ P.info += {"[station_name()] - Security Department
+ Admission data:
+ Log generated at: [worldtime2text()]
+ Detainee: [logname]
+ Duration: [timetoset/10] seconds
+ Charge(s): [logcharges]
+ Arresting Officer: [usr.name]
+ This log file was generated automatically upon activation of a cell timer. "}
+
+ playsound(C.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ cell_logs += P
+ return 1
+
/obj/machinery/door_timer/initialize()
..()
Radio = new /obj/item/device/radio(src)
Radio.listening = 0
Radio.config(list("Security" = 0))
+ Radio.follow_target = src
pixel_x = ((dir & 3)? (0) : (dir == 4 ? 32 : -32))
pixel_y = ((dir & 3)? (dir ==1 ? 24 : -32) : (0))
@@ -62,6 +88,10 @@
stat |= BROKEN
update_icon()
+/obj/machinery/door_timer/Destroy()
+ QDEL_NULL(Radio)
+ targets.Cut()
+ return ..()
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
@@ -93,9 +123,15 @@
// Closes and locks doors, power check
/obj/machinery/door_timer/proc/timer_start()
+
if(stat & (NOPOWER|BROKEN))
return 0
+ if(!printed)
+ if(!print_report())
+ timing = 0
+ return 0
+
// Set releasetime
releasetime = world.timeofday + timetoset
if(!(src in machine_processing))
@@ -129,6 +165,7 @@
// Reset releasetime
releasetime = 0
+ printed = 0
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(!door.density)
@@ -172,8 +209,10 @@
//Allows AIs to use door_timer, see human attack_hand function below
/obj/machinery/door_timer/attack_ai(mob/user)
- return attack_hand(user)
+ interact(user)
+/obj/machinery/door_timer/attack_ghost(mob/user)
+ interact(user)
//Allows humans to use door_timer
//Opens dialog window when someone clicks on door timer
@@ -182,7 +221,9 @@
/obj/machinery/door_timer/attack_hand(mob/user)
if(..())
return
+ interact(user)
+/obj/machinery/door_timer/interact(mob/user)
// Used for the 'time left' display
var/second = round(timeleft() % 60)
var/minute = round((timeleft() - second) / 60)
@@ -239,9 +280,10 @@
// Also updates dialog window and timer icon
/obj/machinery/door_timer/Topic(href, href_list)
if(..())
- return
- if(!allowed(usr))
- return
+ return 1
+
+ if(!allowed(usr) && !usr.can_admin_interact())
+ return 1
usr.set_machine(src)
@@ -267,6 +309,7 @@
F.flash()
if(href_list["change"])
+ printed = 1
timer_start()
add_fingerprint(usr)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 7ef5406f1dc..d6b295e1811 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -21,7 +21,9 @@
var/autoclose_timer
var/glass = 0
var/normalspeed = 1
- var/heat_proof = 0 // For glass airlocks/opacity firedoors
+ var/auto_close_time = 150
+ var/auto_close_time_dangerous = 5
+ var/heat_proof = 0 // For rglass-windowed airlocks and firedoors
var/emergency = 0
var/air_properties_vary_with_direction = 0
var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened.
@@ -37,7 +39,15 @@
else
layer = open_layer
+ update_dir()
+ update_freelook_sight()
+ airlocks += src
+/obj/machinery/door/setDir(newdir)
+ ..()
+ update_dir()
+
+/obj/machinery/door/proc/update_dir()
if(width > 1)
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
@@ -46,10 +56,6 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
- update_freelook_sight()
- airlocks += src
- return
-
/obj/machinery/door/initialize()
air_update_turf(1)
..()
@@ -65,7 +71,8 @@
return ..()
/obj/machinery/door/Bumped(atom/AM)
- if(p_open || operating) return
+ if(p_open || operating || emagged)
+ return
if(isliving(AM))
var/mob/living/M = AM
if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam.
@@ -77,7 +84,7 @@
if(istype(AM, /obj/mecha))
var/obj/mecha/mecha = AM
if(density)
- if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access) || emergency == 1))
+ if(mecha.occupant && (allowed(mecha.occupant) || check_access_list(mecha.operation_req_access) || emergency == 1))
open()
else
do_animate("deny")
@@ -85,8 +92,7 @@
return
-/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
+/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return !opacity
return !density
@@ -94,14 +100,14 @@
/obj/machinery/door/CanAtmosPass()
return !density
-/obj/machinery/door/proc/bumpopen(mob/user as mob)
+/obj/machinery/door/proc/bumpopen(mob/user)
if(operating)
return
add_fingerprint(user)
if(!requiresID())
user = null
- if(density)
+ if(density && !emagged)
if(allowed(user) || emergency == 1)
open()
if(istype(user, /mob/living/simple_animal/bot))
@@ -111,45 +117,51 @@
do_animate("deny")
return
-/obj/machinery/door/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/door/attack_ai(mob/user)
+ return attack_hand(user)
-/obj/machinery/door/attack_hand(mob/user as mob)
- return src.attackby(user, user)
+/obj/machinery/door/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
-/obj/machinery/door/attack_tk(mob/user as mob)
+/obj/machinery/door/attack_hand(mob/user)
+ return attackby(user, user)
+
+/obj/machinery/door/attack_tk(mob/user)
if(requiresID() && !allowed(null))
return
..()
-/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/machinery/door/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/detective_scanner))
return
- if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
- src.add_fingerprint(user)
- if(!Adjacent(user))
- user = null
- if(!src.requiresID())
- user = null
- if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
+
+ if(isrobot(user))
+ return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
+
+ add_fingerprint(user)
+ if(operating || emagged)
+ return
+ if(density && (istype(I, /obj/item/weapon/card/emag) || istype(I, /obj/item/weapon/melee/energy/blade)))
emag_act(user)
return 1
- if(src.allowed(user) || src.emergency == 1)
- if(src.density)
+
+ if(allowed(user) || emergency == 1 || user.can_advanced_admin_interact())
+ if(density)
open()
else
close()
return
- if(src.density)
- do_animate("deny")
- return
-/obj/machinery/door/emag_act(user as mob)
+ if(density)
+ do_animate("deny")
+
+/obj/machinery/door/emag_act(mob/user)
if(density)
flick("door_spark", src)
sleep(6)
open()
- operating = -1
+ emagged = 1
return 1
/obj/machinery/door/blob_act()
@@ -206,18 +218,18 @@
/obj/machinery/door/proc/open()
if(!density)
return 1
- if(operating > 0)
+ if(operating)
return
if(!ticker)
return 0
- if(!operating) operating = 1
+ operating = 1
do_animate("opening")
- src.set_opacity(0)
+ set_opacity(0)
sleep(5)
- src.density = 0
+ density = 0
sleep(5)
- src.layer = open_layer
+ layer = open_layer
update_icon()
set_opacity(0)
operating = 0
@@ -226,14 +238,14 @@
// The `addtimer` system has the advantage of being cancelable
if(autoclose)
- autoclose_timer = addtimer(src, "autoclose", normalspeed ? 150 : 5, unique = 1)
+ autoclose_timer = addtimer(src, "autoclose", normalspeed ? auto_close_time : auto_close_time_dangerous, unique = 1)
return 1
/obj/machinery/door/proc/close()
if(density)
return 1
- if(operating > 0)
+ if(operating)
return
operating = 1
@@ -242,9 +254,9 @@
autoclose_timer = 0
do_animate("closing")
- src.layer = closed_layer
+ layer = closed_layer
sleep(5)
- src.density = 1
+ density = 1
sleep(5)
update_icon()
if(visible && !glass)
@@ -266,7 +278,7 @@
L.Weaken(5)
else //for simple_animals & borgs
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- var/turf/simulated/location = src.loc
+ var/turf/simulated/location = loc
if(istype(location, /turf/simulated)) //add_blood doesn't work for borgs/xenos, but add_blood_floor does.
location.add_blood_floor(L)
@@ -298,7 +310,7 @@
if(!glass && cameranet)
cameranet.updateVisibility(src, 0)
-/obj/machinery/door/BlockSuperconductivity()
+/obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended.
if(opacity || heat_proof)
return 1
return 0
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 09f4885dc07..477bc4b1e98 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -1,56 +1,49 @@
+#define CONSTRUCTION_COMPLETE 0 //No construction done - functioning as normal
+#define CONSTRUCTION_PANEL_OPEN 1 //Maintenance panel is open, still functioning
+#define CONSTRUCTION_WIRES_EXPOSED 2 //Cover plate is removed, wires are available
+#define CONSTRUCTION_GUTTED 3 //Wires are removed, circuit ready to remove
+#define CONSTRUCTION_NOCIRCUIT 4 //Circuit board removed, can safely weld apart
+
/var/const/OPEN = 1
/var/const/CLOSED = 2
/obj/machinery/door/firedoor
- name = "Firelock"
- desc = "Apply crowbar"
+ name = "firelock"
+ desc = "Apply crowbar."
icon = 'icons/obj/doors/Doorfireglass.dmi'
icon_state = "door_open"
opacity = 0
- density = 0
- heat_proof = 1
- glass = 1
+ density = FALSE
+ heat_proof = TRUE
+ glass = TRUE
power_channel = ENVIRON
-
- var/list/areas_added
-
- var/blocked = 0
- var/nextstate = null
-
- var/logged_users
closed_layer = 3.11
+ auto_close_time = 50
-/obj/machinery/door/firedoor/New()
- . = ..()
- for(var/obj/machinery/door/firedoor/F in loc)
- if(F != src)
- spawn(1)
- qdel(src)
- return .
-
- var/area/A = get_area(src)
- ASSERT(istype(A))
-
- A.all_doors.Add(src)
- areas_added = list(A)
-
- for(var/direction in cardinal)
- A = get_area(get_step(src,direction))
- if(istype(A) && !(A in areas_added))
- A.all_doors.Add(src)
- areas_added += A
-
-
-/obj/machinery/door/firedoor/Destroy()
- for(var/area/A in areas_added)
- A.all_doors.Remove(src)
- . = ..()
+ var/can_force = TRUE
+ var/force_open_time = 300
+ var/can_crush = TRUE
+ var/assembly_type = /obj/structure/firelock_frame
+ var/nextstate = null
+ var/welded = FALSE
+ var/boltslocked = TRUE
+ var/can_deconstruct = TRUE
+ var/active_alarm = FALSE
/obj/machinery/door/firedoor/Bumped(atom/AM)
- if(p_open || operating) return
- if(!density) return ..()
+ if(p_open || operating)
+ return
+ if(!density)
+ return ..()
return 0
+/obj/machinery/door/firedoor/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
+ if(2.0)
+ if(prob(50))
+ qdel(src)
/obj/machinery/door/firedoor/power_change()
if(powered(power_channel))
@@ -58,217 +51,183 @@
latetoggle()
else
stat |= NOPOWER
- return
-
-/obj/machinery/door/firedoor/attack_hand(mob/user as mob)
- return attackby(null, user)
+ update_icon()
/obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob, params)
add_fingerprint(user)
+
if(operating)
- return//Already doing something.
+ return
if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0, user))
- blocked = !blocked
- user.visible_message("\red \The [user] [blocked ? "welds" : "unwelds"] \the [src] with \a [W].",\
- "You [blocked ? "weld" : "unweld"] \the [src] with \the [W].",\
- "You hear something being welded.")
+ welded = !welded
+ to_chat(user, "You [welded ? "welded" : "unwelded"] \the [src] ")
update_icon()
return
- if(blocked)
- to_chat(user, "\red \The [src] is welded solid!")
- return
-
- var/area/A = get_area_master(src)
- ASSERT(istype(A)) // This worries me.
- var/alarmed = A.air_doors_activated || A.fire
-
- if( istype(C, /obj/item/weapon/crowbar) || ( istype(C,/obj/item/weapon/twohanded/fireaxe) && C:wielded == 1 ) )
- if(operating)
+ if(welded)
+ if(istype(C, /obj/item/weapon/wrench))
+ if(boltslocked)
+ to_chat(user, "There are screws locking the bolts in place! ")
+ return
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] starts undoing [src]'s bolts... ", \
+ "You start unfastening [src]'s floor bolts... ")
+ if(!do_after(user, 50 * C.toolspeed, target = src))
+ return
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] unfastens [src]'s bolts. ", \
+ "You undo [src]'s floor bolts. ")
+ deconstruct(TRUE)
+ return
+ else if(istype(C, /obj/item/weapon/screwdriver))
+ user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts... ", \
+ "You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts... ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ boltslocked = !boltslocked
+ return
+ else
+ to_chat(user, "\The [src] is welded solid! ")
return
- if(blocked)
- user.visible_message("\red \The [user] pries at \the [src] with \a [C], but \the [src] is welded in place!",\
- "You try to pry \the [src] [density ? "open" : "closed"], but it is welded in place!",\
- "You hear someone struggle and metal straining.")
- if(stat & (BROKEN|NOPOWER) || !density || !alarmed)
- user.visible_message("\red \The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!",\
- "You force \the [src] [density ? "open" : "closed"] with \the [C]!",\
- "You hear metal strain, and a door [density ? "open" : "close"].")
-
- else if(allowed(user))
- user.visible_message("\blue \The [user] lifts \the [src] with \a [C].",\
- "\The [src] scans your ID, and obediently opens as you apply your [C].",\
- "You hear metal move, and a door [density ? "open" : "close"].")
+ if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe))
+ if(istype(C, /obj/item/weapon/twohanded/fireaxe))
+ var/obj/item/weapon/twohanded/fireaxe/F = C
+ if(!F.wielded)
+ return
+ user.visible_message("[user] forces \the [src] with [C].",
+ "You force \the [src] with [C].")
if(density)
- spawn(0)
- open()
- else
- spawn(0)
- close()
- return
-
- var/access_granted = 0
- var/users_name
- if(!istype(C, /obj)) //If someone hit it with their hand. We need to see if they are allowed.
- if(allowed(user))
- access_granted = 1
- if(ishuman(user))
- users_name = FindNameFromID(user)
- else
- users_name = "Unknown"
-
- if(ishuman(user) && !stat && (istype(C, /obj/item/weapon/card/id) || istype(C, /obj/item/device/pda)))
- var/obj/item/weapon/card/id/ID = C
-
- if( istype(C, /obj/item/device/pda) )
- var/obj/item/device/pda/pda = C
- ID = pda.id
- if(!istype(ID))
- ID = null
-
- if(ID)
- users_name = ID.registered_name
-
- if(check_access(ID))
- access_granted = 1
-
- var/answer = alert(user, "Are you sure you want to [density ? "open" : "close"] \the [src]?","\The [src] confirmation","Yes","No")
- if(answer == "No")
- return
-
- if(user.stat || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1)
- to_chat(user, "Sorry, you must remain able bodied and close to \the [src] in order to use it.")
- return
-
- if(alarmed && density && !access_granted)
- to_chat(user, "Access denied. Please wait for authorities to arrive, or for the alert to clear. ")
- return
-
- else
- user.visible_message("\blue \The [src] [density ? "open" : "close"]s for \the [user].",\
- "\The [src] [density ? "open" : "close"]s.",\
- "You hear a beep, and a door opening.")
- // Accountability!
- if(!logged_users)
- logged_users = list()
- logged_users += users_name
-
- var/needs_to_close = 0
- if(density)
- if(alarmed)
- needs_to_close = 1
- spawn()
open()
- else
- spawn()
+ else
close()
- if(needs_to_close)
- spawn(50)
- if(alarmed)
- nextstate = CLOSED
-
-/obj/machinery/door/firedoor/attack_ai(mob/user as mob)
- if(operating || stat & NOPOWER)
- return //Already doing something or depowered.
-
- if(blocked)
- to_chat(user, "\red \The [src] is welded solid!")
+/obj/machinery/door/firedoor/attack_hand(mob/user)
+ if(operating || !density)
return
- var/area/A = get_area_master(src)
- ASSERT(istype(A)) // This worries me.
- var/alarmed = A.air_doors_activated || A.fire
+ add_fingerprint(user)
+ user.changeNext_move(CLICK_CD_MELEE)
- var/access_granted = 0
- if(isAI(user) || isrobot(user))
- access_granted = 1
-
- if(access_granted == 1)
- user.visible_message("\blue \The [src] [density ? "open" : "close"]s for \the [user].",\
- "\The [src] [density ? "open" : "close"]s.",\
- "You hear a beep, and a door opening.")
-
- var/needs_to_close = 0
- if(density)
- if(alarmed)
- needs_to_close = 1
- spawn()
+ if(can_force && (!glass || user.a_intent != I_HELP))
+ user.visible_message("[user] begins forcing \the [src]. ", \
+ "You begin forcing \the [src]. ")
+ if(do_after(user, force_open_time, target = src))
+ user.visible_message("[user] forces \the [src]. ", \
+ "You force \the [src]. ")
open()
- else
- spawn()
- close()
+ else if(glass)
+ user.visible_message("[user] bangs on \the [src]. ",
+ "You bang on \the [src]. ")
+ playsound(get_turf(src), 'sound/effects/Glassknock.ogg', 10, 1)
- if(needs_to_close)
- spawn(50)
- if(alarmed)
- nextstate = CLOSED
+/obj/machinery/door/firedoor/attack_ai(mob/user)
+ forcetoggle()
+
+/obj/machinery/door/firedoor/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ forcetoggle(TRUE)
+
+/obj/machinery/door/firedoor/attack_alien(mob/user)
+ add_fingerprint(user)
+ if(welded)
+ to_chat(user, "[src] refuses to budge! ")
+ return
+ open()
/obj/machinery/door/firedoor/do_animate(animation)
switch(animation)
if("opening")
flick("door_opening", src)
+ playsound(src, 'sound/machines/airlock_ext_open.ogg', 30, 1)
if("closing")
flick("door_closing", src)
- return
+ playsound(src, 'sound/machines/airlock_ext_close.ogg', 30, 1)
/obj/machinery/door/firedoor/update_icon()
overlays.Cut()
+ if(active_alarm && !(stat & NOPOWER))
+ overlays += image('icons/obj/doors/Doorfire.dmi', "alarmlights")
if(density)
icon_state = "door_closed"
- if(blocked)
+ if(welded)
overlays += "welded"
else
icon_state = "door_open"
- if(blocked)
+ if(welded)
overlays += "welded_open"
- return
-/obj/machinery/door/firedoor/open()
- ..()
- latetoggle()
- return
+/obj/machinery/door/firedoor/proc/activate_alarm()
+ active_alarm = TRUE
+ update_icon()
+
+/obj/machinery/door/firedoor/proc/deactivate_alarm()
+ active_alarm = FALSE
+ update_icon()
+
+/obj/machinery/door/firedoor/open(auto_close = TRUE)
+ . = ..()
+ latetoggle(auto_close)
+
+ if(auto_close)
+ autoclose = TRUE
/obj/machinery/door/firedoor/close()
- ..()
- if(locate(/mob/living) in get_turf(src))
- open()
- return
+ . = ..()
+ if(can_crush)
+ crush()
latetoggle()
- return
-/obj/machinery/door/firedoor/proc/latetoggle()
+/obj/machinery/door/firedoor/autoclose()
+ if(active_alarm)
+ . = ..()
+
+/obj/machinery/door/firedoor/proc/latetoggle(auto_close = TRUE)
if(operating || stat & NOPOWER || !nextstate)
return
switch(nextstate)
if(OPEN)
nextstate = null
- open()
+ open(auto_close)
if(CLOSED)
nextstate = null
close()
- return
+/obj/machinery/door/firedoor/proc/forcetoggle(magic = FALSE, auto_close = TRUE)
+ if(!magic && (operating || stat & NOPOWER))
+ return
+ if(density)
+ open(auto_close)
+ else
+ close()
+
+/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE)
+ if(can_deconstruct)
+ var/obj/structure/firelock_frame/F = new assembly_type(get_turf(src))
+ if(disassembled)
+ F.constructionStep = CONSTRUCTION_PANEL_OPEN
+ else
+ F.constructionStep = CONSTRUCTION_WIRES_EXPOSED
+ F.update_icon()
+ qdel(src)
/obj/machinery/door/firedoor/border_only
icon = 'icons/obj/doors/edge_Doorfire.dmi'
flags = ON_BORDER
+ can_crush = FALSE
-/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
- if(air_group) return 0
return !density
else
return 1
-/obj/machinery/door/firedoor/border_only/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
+/obj/machinery/door/firedoor/border_only/CheckExit(atom/movable/mover as mob|obj, turf/target)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
if(get_dir(loc, target) == dir)
@@ -276,8 +235,225 @@
else
return 1
-/obj/machinery/door/firedoor/border_only/CanAtmosPass(var/turf/T)
+/obj/machinery/door/firedoor/border_only/CanAtmosPass(turf/T)
if(get_dir(loc, T) == dir)
return !density
else
- return 1
\ No newline at end of file
+ return 1
+
+/obj/machinery/door/firedoor/heavy
+ name = "heavy firelock"
+ icon = 'icons/obj/doors/Doorfire.dmi'
+ glass = FALSE
+ opacity = 1
+ assembly_type = /obj/structure/firelock_frame/heavy
+ can_force = FALSE
+
+/obj/machinery/door/firedoor/heavy/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
+
+/obj/item/weapon/firelock_electronics
+ name = "firelock electronics"
+ icon = 'icons/obj/doors/door_assembly.dmi'
+ icon_state = "door_electronics"
+ desc = "A circuit board used in construction of firelocks."
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
+
+/obj/structure/firelock_frame
+ name = "firelock frame"
+ desc = "A partially completed firelock."
+ icon = 'icons/obj/doors/Doorfire.dmi'
+ icon_state = "frame1"
+ anchored = 0
+ density = 1
+ var/constructionStep = CONSTRUCTION_NOCIRCUIT
+ var/reinforced = 0
+
+/obj/structure/firelock_frame/heavy
+ name = "heavy firelock frame"
+ reinforced = 1
+
+/obj/structure/firelock_frame/examine(mob/user)
+ ..()
+ switch(constructionStep)
+ if(CONSTRUCTION_PANEL_OPEN)
+ to_chat(user, "There is a small metal plate covering the wires.")
+ if(CONSTRUCTION_WIRES_EXPOSED)
+ to_chat(user, "Wires are trailing from the maintenance panel.")
+ if(CONSTRUCTION_GUTTED)
+ to_chat(user, "The circuit board is visible.")
+ if(CONSTRUCTION_NOCIRCUIT)
+ to_chat(user, "There are no electronics in the frame.")
+ if(reinforced)
+ to_chat(user, "The frame is reinforced.")
+
+/obj/structure/firelock_frame/update_icon()
+ ..()
+ icon_state = "frame[constructionStep]"
+
+/obj/structure/firelock_frame/attackby(obj/item/weapon/C, mob/user)
+ switch(constructionStep)
+ if(CONSTRUCTION_PANEL_OPEN)
+ if(istype(C, /obj/item/weapon/crowbar))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] starts prying something out from [src]... ", \
+ "You begin prying out the wire cover... ")
+ if(!do_after(user, 50 * C.toolspeed, target = src))
+ return
+ if(constructionStep != CONSTRUCTION_PANEL_OPEN)
+ return
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] pries out a metal plate from [src], exposing the wires. ", \
+ "You remove the cover plate from [src], exposing the wires. ")
+ constructionStep = CONSTRUCTION_WIRES_EXPOSED
+ update_icon()
+ return
+ if(istype(C, /obj/item/weapon/wrench))
+ if(locate(/obj/machinery/door/firedoor) in get_turf(src))
+ to_chat(user, "There's already a firelock there. ")
+ return
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] starts bolting down [src]... ", \
+ "You begin bolting [src]... ")
+ if(!do_after(user, 30 * C.toolspeed, target = src))
+ return
+ if(locate(/obj/machinery/door/firedoor) in get_turf(src))
+ return
+ user.visible_message("[user] finishes the firelock. ", \
+ "You finish the firelock. ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(reinforced)
+ new /obj/machinery/door/firedoor/heavy(get_turf(src))
+ else
+ new /obj/machinery/door/firedoor(get_turf(src))
+ qdel(src)
+ return
+ if(istype(C, /obj/item/stack/sheet/plasteel))
+ var/obj/item/stack/sheet/plasteel/P = C
+ if(reinforced)
+ to_chat(user, "[src] is already reinforced. ")
+ return
+ if(P.get_amount() < 2)
+ to_chat(user, "You need more plasteel to reinforce [src]. ")
+ return
+ user.visible_message("[user] begins reinforcing [src]... ", \
+ "You begin reinforcing [src]... ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(do_after(user, 60 * C.toolspeed, target = src))
+ if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || P.get_amount() < 2 || !P)
+ return
+ user.visible_message("[user] reinforces [src]. ", \
+ "You reinforce [src]. ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ P.use(2)
+ reinforced = 1
+ return
+
+ if(CONSTRUCTION_WIRES_EXPOSED)
+ if(istype(C, /obj/item/weapon/wirecutters))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] starts cutting the wires from [src]... ", \
+ "You begin removing [src]'s wires... ")
+ if(!do_after(user, 60 * C.toolspeed, target = src))
+ return
+ if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
+ return
+ user.visible_message("[user] removes the wires from [src]. ", \
+ "You remove the wiring from [src], exposing the circuit board. ")
+ var/obj/item/stack/cable_coil/B = new(get_turf(src))
+ B.amount = 5
+ constructionStep = CONSTRUCTION_GUTTED
+ update_icon()
+ return
+ if(istype(C, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = C
+ if(W.remove_fuel(1, user))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] starts welding a metal plate into [src]... ", \
+ "You begin welding the cover plate back onto [src]... ")
+ if(!do_after(user, 80 * C.toolspeed, target = src))
+ return
+ if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
+ return
+ playsound(get_turf(src), C.usesound, 50, 1)
+ user.visible_message("[user] welds the metal plate into [src]. ", \
+ "You weld [src]'s cover plate into place, hiding the wires. ")
+ constructionStep = CONSTRUCTION_PANEL_OPEN
+ update_icon()
+ return
+ if(CONSTRUCTION_GUTTED)
+ if(istype(C, /obj/item/weapon/crowbar))
+ user.visible_message("[user] begins removing the circuit board from [src]... ", \
+ "You begin prying out the circuit board from [src]... ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(!do_after(user, 50 * C.toolspeed, target = src))
+ return
+ if(constructionStep != CONSTRUCTION_GUTTED)
+ return
+ user.visible_message("[user] removes [src]'s circuit board. ", \
+ "You remove the circuit board from [src]. ")
+ new /obj/item/weapon/firelock_electronics(get_turf(src))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ constructionStep = CONSTRUCTION_NOCIRCUIT
+ update_icon()
+ return
+ if(istype(C, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/B = C
+ if(B.get_amount() < 5)
+ to_chat(user, "You need more wires to add wiring to [src]. ")
+ return
+ user.visible_message("[user] begins wiring [src]... ", \
+ "You begin adding wires to [src]... ")
+ playsound(get_turf(src), B.usesound, 50, 1)
+ if(do_after(user, 60 * B.toolspeed, target = src))
+ if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B)
+ return
+ user.visible_message("[user] adds wires to [src]. ", \
+ "You wire [src]. ")
+ playsound(get_turf(src), B.usesound, 50, 1)
+ B.use(5)
+ constructionStep = CONSTRUCTION_WIRES_EXPOSED
+ update_icon()
+ return
+ if(CONSTRUCTION_NOCIRCUIT)
+ if(istype(C, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = C
+ if(W.remove_fuel(1,user))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ user.visible_message("[user] begins cutting apart [src]'s frame... ", \
+ "You begin slicing [src] apart... ")
+ if(!do_after(user, 80 * W.toolspeed, target = src))
+ return
+ if(constructionStep != CONSTRUCTION_NOCIRCUIT)
+ return
+ user.visible_message("[user] cuts apart [src]! ", \
+ "You cut [src] into metal. ")
+ playsound(get_turf(src), W.usesound, 50, 1)
+ var/turf/T = get_turf(src)
+ new /obj/item/stack/sheet/metal(T, 3)
+ if(reinforced)
+ new /obj/item/stack/sheet/plasteel(T, 2)
+ qdel(src)
+ return
+ if(istype(C, /obj/item/weapon/firelock_electronics))
+ user.visible_message("[user] starts adding [C] to [src]... ", \
+ "You begin adding a circuit board to [src]... ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(!do_after(user, 40 * C.toolspeed, target = src))
+ return
+ if(constructionStep != CONSTRUCTION_NOCIRCUIT)
+ return
+ user.drop_item()
+ qdel(C)
+ user.visible_message("[user] adds a circuit to [src]. ", \
+ "You insert and secure [C]. ")
+ playsound(get_turf(src), C.usesound, 50, 1)
+ constructionStep = CONSTRUCTION_GUTTED
+ update_icon()
+ return
+ return ..()
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index de3c4514bb5..1f83484ae70 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -3,8 +3,9 @@
desc = "That looks like it doesn't open easily."
icon = 'icons/obj/doors/rapid_pdoor.dmi'
icon_state = "pdoor1"
- var/id_tag = 1.0
explosion_block = 3
+ heat_proof = 1
+ var/id_tag = 1.0
var/protected = 1
/obj/machinery/door/poddoor/preopen
@@ -46,25 +47,25 @@
src.add_fingerprint(user)
if(!( istype(C, /obj/item/weapon/crowbar) || (istype(C, /obj/item/weapon/twohanded/fireaxe) && C:wielded == 1) ))
return
- if((src.density && (stat & NOPOWER) && !( src.operating )))
+ if((src.density && (stat & NOPOWER) && !operating))
spawn( 0 )
- src.operating = 1
+ operating = 1
flick("pdoorc0", src)
src.icon_state = "pdoor0"
src.set_opacity(0)
sleep(15)
src.density = 0
- src.operating = 0
+ operating = 0
return
return
/obj/machinery/door/poddoor/open()
- if(src.operating == 1) //doors can still open when emag-disabled
+ if(operating || emagged) //doors can still open when emag-disabled
return
if(!ticker)
return 0
- if(!src.operating) //in case of emag
- src.operating = 1
+ if(!operating) //in case of emag
+ operating = 1
flick("pdoorc0", src)
src.icon_state = "pdoor0"
src.set_opacity(0)
@@ -74,17 +75,17 @@
air_update_turf(1)
update_freelook_sight()
- if(operating == 1) //emag again
- src.operating = 0
+ if(operating) //emag again
+ operating = 0
if(autoclose)
spawn(150)
autoclose()
return 1
/obj/machinery/door/poddoor/close()
- if(src.operating)
+ if(operating)
return
- src.operating = 1
+ operating = 1
flick("pdoorc1", src)
src.icon_state = "pdoor1"
src.set_opacity(initial(opacity))
@@ -95,7 +96,7 @@
src.density = 1
sleep(5)
- src.operating = 0
+ operating = 0
return
/obj/machinery/door/poddoor/multi_tile // Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell.
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index 5375e9fe084..08f67863760 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -30,7 +30,7 @@
return
/obj/machinery/door/poddoor/shutters/open()
- if(operating == 1) //doors can still open when emag-disabled
+ if(operating || emagged) //doors can still open when emag-disabled
return
if(!ticker)
return 0
@@ -44,7 +44,7 @@
air_update_turf(1)
update_freelook_sight()
- if(operating == 1) //emag again
+ if(operating) //emag again
operating = 0
if(autoclose)
spawn(150)
diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm
index 90e71dc7b83..a8236f0817c 100644
--- a/code/game/machinery/doors/unpowered.dm
+++ b/code/game/machinery/doors/unpowered.dm
@@ -3,20 +3,18 @@
var/locked = 0
explosion_block = 1
- Bumped(atom/AM)
- if(src.locked)
- return
- ..()
+/obj/machinery/door/unpowered/Bumped(atom/AM)
+ if(locked)
return
+ ..()
- attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)) return
- if(src.locked) return
- ..()
+/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/card/emag) || istype(I, /obj/item/weapon/melee/energy/blade))
return
-
-
+ if(locked)
+ return
+ return ..()
/obj/machinery/door/unpowered/shuttle
icon = 'icons/turf/shuttle.dmi'
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 76f6c7e94d3..baaf936e189 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -13,9 +13,9 @@
/obj/machinery/door/window/New()
..()
- if(src.req_access && src.req_access.len)
- src.icon_state = "[src.icon_state]"
- src.base_state = src.icon_state
+ if(req_access && req_access.len)
+ icon_state = "[icon_state]"
+ base_state = icon_state
if(!color)
color = color_windows(src)
@@ -25,15 +25,13 @@
density = 0
if(health == 0)
playsound(src, "shatter", 70, 1)
- if(electronics)
- qdel(electronics)
- electronics = null
+ QDEL_NULL(electronics)
return ..()
/obj/machinery/door/window/proc/open_and_close()
open()
- if(src.check_access(null))
+ if(check_access(null))
sleep(50)
else //secure doors close faster
sleep(20)
@@ -45,10 +43,10 @@
if(!ismob(AM))
if(istype(AM, /obj/mecha))
var/obj/mecha/mecha = AM
- if(mecha.occupant && src.allowed(mecha.occupant))
+ if(mecha.occupant && allowed(mecha.occupant))
open_and_close()
else
- flick(text("[]deny", src.base_state), src)
+ flick(text("[]deny", base_state), src)
return
if(!ticker)
return
@@ -58,16 +56,16 @@
return
/obj/machinery/door/window/bumpopen(mob/user as mob)
- if( operating || !src.density )
+ if( operating || !density )
return
- src.add_fingerprint(user)
- if(!src.requiresID())
+ add_fingerprint(user)
+ if(!requiresID())
user = null
if(allowed(user))
open_and_close()
else
- flick(text("[]deny", src.base_state), src)
+ flick(text("[]deny", base_state), src)
return
/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target, height=0)
@@ -97,7 +95,7 @@
return 1
/obj/machinery/door/window/open(var/forced=0)
- if(src.operating == 1) //doors can still open when emag-disabled
+ if(operating) //doors can still open when emag-disabled
return 0
if(!ticker)
return 0
@@ -107,24 +105,24 @@
if(forced < 2)
if(emagged)
return 0
- if(!src.operating) //in case of emag
- src.operating = 1
- flick(text("[]opening", src.base_state), src)
- playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
- src.icon_state = text("[]open", src.base_state)
+ if(!operating) //in case of emag
+ operating = 1
+ flick(text("[]opening", base_state), src)
+ playsound(loc, 'sound/machines/windowdoor.ogg', 100, 1)
+ icon_state = text("[]open", base_state)
sleep(10)
- src.density = 0
-// src.sd_set_opacity(0) //TODO: why is this here? Opaque windoors? ~Carn
+ density = 0
+// sd_set_opacity(0) //TODO: why is this here? Opaque windoors? ~Carn
air_update_turf(1)
update_freelook_sight()
- if(operating == 1) //emag again
- src.operating = 0
+ if(operating) //emag again
+ operating = 0
return 1
/obj/machinery/door/window/close(var/forced=0)
- if(src.operating)
+ if(operating)
return 0
if(!forced)
if(stat & NOPOWER)
@@ -132,33 +130,33 @@
if(forced < 2)
if(emagged)
return 0
- src.operating = 1
- flick(text("[]closing", src.base_state), src)
- playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
- src.icon_state = src.base_state
+ operating = 1
+ flick(text("[]closing", base_state), src)
+ playsound(loc, 'sound/machines/windowdoor.ogg', 100, 1)
+ icon_state = base_state
- src.density = 1
-// if(src.visible)
+ density = 1
+// if(visible)
// set_opacity(1) //TODO: why is this here? Opaque windoors? ~Carn
air_update_turf(1)
update_freelook_sight()
sleep(10)
- src.operating = 0
+ operating = 0
return 1
/obj/machinery/door/window/proc/take_damage(var/damage)
- src.health = max(0, src.health - damage)
- if(src.health <= 0)
+ health = max(0, health - damage)
+ if(health <= 0)
var/debris = list(
- new /obj/item/weapon/shard(src.loc),
- new /obj/item/weapon/shard(src.loc),
- new /obj/item/stack/rods(src.loc, 2),
- new /obj/item/stack/cable_coil(src.loc, 2)
+ new /obj/item/weapon/shard(loc),
+ new /obj/item/weapon/shard(loc),
+ new /obj/item/stack/rods(loc, 2),
+ new /obj/item/stack/cable_coil(loc, 2)
)
for(var/obj/fragment in debris)
transfer_fingerprints_to(fragment)
- src.density = 0
+ density = 0
qdel(src)
return
@@ -169,42 +167,43 @@
..()
//When an object is thrown at the window
-/obj/machinery/door/window/hitby(AM as mob|obj)
-
+/obj/machinery/door/window/hitby(atom/movable/AM)
..()
var/tforce = 0
if(ismob(AM))
tforce = 40
- else
- tforce = AM:throwforce
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
+ else if(isobj(AM))
+ var/obj/O = AM
+ tforce = O.throwforce
+ playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
take_damage(tforce)
- //..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak
- return
/obj/machinery/door/window/mech_melee_attack(obj/mecha/M)
if(M.damtype == "brute")
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
M.occupant_message("You hit [src]. ")
visible_message("[src] has been hit by [M.name]. ")
take_damage(M.force)
return
-/obj/machinery/door/window/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/door/window/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/door/window/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
/obj/machinery/door/window/proc/attack_generic(mob/user as mob, damage = 0)
- if(src.operating)
+ if(operating)
return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
- user.visible_message("[user] smashes against the [src.name]. ", \
- "[user] smashes against the [src.name]. ")
+ playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ user.visible_message("[user] smashes against the [name]. ", \
+ "[user] smashes against the [name]. ")
take_damage(damage)
/obj/machinery/door/window/attack_alien(mob/living/user as mob)
-
if(islarva(user))
return
attack_generic(user, 25)
@@ -221,22 +220,23 @@
return
attack_generic(user, 25)
-
/obj/machinery/door/window/attack_hand(mob/user as mob)
- return src.attackby(user, user)
+ return attackby(user, user)
-/obj/machinery/door/window/emag_act(user as mob, weapon as obj)
- if(density)
- src.operating = -1
- flick("[src.base_state]spark", src)
+/obj/machinery/door/window/emag_act(mob/user, obj/weapon)
+ if(!operating && density && !emagged)
+ operating = 1
+ flick("[base_state]spark", src)
sleep(6)
+ operating = 0
desc += "Its access panel is smoking slightly. "
if(istype(weapon, /obj/item/weapon/melee/energy/blade))
+ var/obj/item/weapon/melee/energy/blade/B
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
- spark_system.set_up(5, 0, src.loc)
+ spark_system.set_up(5, 0, loc)
spark_system.start()
- playsound(src.loc, "sparks", 50, 1)
- playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(loc, "sparks", 50, 1)
+ playsound(loc, B.usesound, 50, 1)
visible_message(" The glass door was sliced open by [user]! ")
open(2)
emagged = 1
@@ -248,33 +248,33 @@
/obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/living/user as mob, params)
//If it's in the process of opening/closing, ignore the click
- if(src.operating)
+ if(operating)
return
add_fingerprint(user)
//Ninja swords? You may pass.
- if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
+ if(density && (istype(I, /obj/item/weapon/card/emag) || istype(I, /obj/item/weapon/melee/energy/blade)))
emag_act(user,I)
return 1
if(istype(I, /obj/item/weapon/screwdriver))
- if(src.density || src.operating)
+ if(density || operating)
to_chat(user, "You need to open the door to access the maintenance panel. ")
return
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- src.p_open = !( src.p_open )
- to_chat(user, "You [p_open ? "open":"close"] the maintenance panel of the [src.name]. ")
+ playsound(loc, I.usesound, 50, 1)
+ p_open = !( p_open )
+ to_chat(user, "You [p_open ? "open":"close"] the maintenance panel of the [name]. ")
return
if(istype(I, /obj/item/weapon/crowbar))
- if(p_open && !src.density && !src.operating)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
- user.visible_message("[user] removes the electronics from the [src.name]. ", \
- "You start to remove electronics from the [src.name].")
- if(do_after(user,40, target = src))
- if(src.p_open && !src.density && !src.operating && src.loc)
- var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc)
+ if(p_open && !density && !operating)
+ playsound(loc, I.usesound, 100, 1)
+ user.visible_message("[user] removes the electronics from the [name]. ", \
+ "You start to remove electronics from the [name].")
+ if(do_after(user, 40 * I.toolspeed, target = src))
+ if(p_open && !density && !operating && loc)
+ var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(loc)
switch(base_state)
if("left")
WA.facing = "l"
@@ -288,10 +288,10 @@
WA.secure = 1
WA.anchored = 1
WA.state= "02"
- WA.dir = src.dir
- WA.ini_dir = src.dir
+ WA.dir = dir
+ WA.ini_dir = dir
WA.update_icon()
- WA.created_name = src.name
+ WA.created_name = name
if(emagged)
to_chat(user, "You discard the damaged electronics. ")
@@ -302,18 +302,18 @@
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
- ae = new/obj/item/weapon/airlock_electronics( src.loc )
- if(!src.req_access)
- src.check_access()
- if(src.req_access.len)
- ae.conf_access = src.req_access
- else if(src.req_one_access.len)
- ae.conf_access = src.req_one_access
+ ae = new/obj/item/weapon/airlock_electronics( loc )
+ if(!req_access)
+ check_access()
+ if(req_access.len)
+ ae.conf_access = req_access
+ else if(req_one_access.len)
+ ae.conf_access = req_one_access
ae.one_access = 1
else
ae = electronics
electronics = null
- ae.loc = src.loc
+ ae.loc = loc
qdel(src)
return
@@ -322,37 +322,37 @@
//If windoor is unpowered, crowbar, fireaxe and armblade can force it.
if(istype(I, /obj/item/weapon/crowbar) || istype(I, /obj/item/weapon/twohanded/fireaxe))
if(stat & NOPOWER)
- if(src.density)
+ if(density)
open(2)
else
close(2)
return
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
- if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card) )
+ if(density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card) )
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if( (I.flags&NOBLUDGEON) || !I.force )
return
var/aforce = I.force
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("\The [src] has been hit by [user] with [I]. ")
if(I.damtype == BURN || I.damtype == BRUTE)
take_damage(aforce)
return
- if(!src.requiresID())
+ if(!requiresID())
//don't care who they are or what they have, act as if they're NOTHING
user = null
- if(src.allowed(user))
- if(src.density)
+ if(allowed(user) || user.can_advanced_admin_interact())
+ if(density)
open()
else
close()
- else if(src.density)
- flick(text("[]deny", src.base_state), src)
+ else if(density)
+ flick(text("[]deny", base_state), src)
return
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 777c2c1bfd5..a54cf0d7e74 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -20,7 +20,7 @@ var/list/doppler_arrays = list()
/obj/machinery/doppler_array/process()
return PROCESS_KILL
-/obj/machinery/doppler_array/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/doppler_array/attackby(var/obj/item/O, var/mob/user, params)
if(istype(O, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
anchored = 1
@@ -30,7 +30,7 @@ var/list/doppler_arrays = list()
anchored = 0
power_change()
to_chat(user, "You unfasten [src]. ")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, O.usesound, 50, 1)
/obj/machinery/doppler_array/verb/rotate()
set name = "Rotate Tachyon-doppler Dish"
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index 73e590361a7..a4d70d78023 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -74,7 +74,7 @@
throw_speed = 4
throw_range = 7
force = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/dye_color = "#FFFFFF"
/obj/item/hair_dye_bottle/New()
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 3e77a7548b3..710dde7ebda 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -19,13 +19,6 @@ FIRE ALARM
var/last_process = 0
var/wiresexposed = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
- var/area/master_area
-
-/obj/machinery/firealarm/New()
- var/area/A = get_area_master(src)
- if(!istype(A, /area))
- return
- master_area = A
/obj/machinery/firealarm/update_icon()
@@ -44,7 +37,7 @@ FIRE ALARM
icon_state = "firex"
else if(stat & NOPOWER)
icon_state = "firep"
- else if(!src.detecting)
+ else if(!detecting)
icon_state = "fire1"
else
icon_state = "fire0"
@@ -61,15 +54,15 @@ FIRE ALARM
if(!emagged && detecting && temperature > T0C + 200)
alarm() // added check of detector status here
-/obj/machinery/firealarm/attack_ai(mob/user as mob)
- src.add_hiddenprint(user)
- return src.attack_hand(user)
+/obj/machinery/firealarm/attack_ai(mob/user)
+ add_hiddenprint(user)
+ return attack_hand(user)
-/obj/machinery/firealarm/attack_ghost(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/firealarm/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/firealarm/bullet_act(BLAH)
- return src.alarm()
+ return alarm()
/obj/machinery/firealarm/emp_act(severity)
@@ -77,8 +70,8 @@ FIRE ALARM
alarm(rand(30/severity, 60/severity))
..()
-/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob, params)
- src.add_fingerprint(user)
+/obj/machinery/firealarm/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
if(istype(W, /obj/item/weapon/screwdriver) && buildstage == 2)
wiresexposed = !wiresexposed
@@ -91,13 +84,13 @@ FIRE ALARM
if(istype(W, /obj/item/device/multitool))
detecting = !detecting
if(detecting)
- user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
+ user.visible_message("[user] has reconnected [src]'s detecting unit! ", "You have reconnected [src]'s detecting unit.")
else
- user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
+ user.visible_message("[user] has disconnected [src]'s detecting unit! ", "You have disconnected [src]'s detecting unit.")
else if(istype(W, /obj/item/weapon/wirecutters)) // cutting the wires out
to_chat(user, "You cut the wires! ")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil()
new_coil.amount = 5
new_coil.loc = user.loc
@@ -111,17 +104,18 @@ FIRE ALARM
return
buildstage = 2
+ playsound(get_turf(src), W.usesound, 50, 1)
to_chat(user, "You wire \the [src]! ")
update_icon()
else if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You pry out the circuit! ")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(buildstage != 1)
return
var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
- circuit.loc = user.loc
+ circuit.forceMove(get_turf(src))
buildstage = 0
update_icon()
if(0)
@@ -134,7 +128,7 @@ FIRE ALARM
else if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You remove the fire alarm assembly from the wall! ")
new /obj/item/mounted/frame/firealarm(get_turf(user))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(src)
return
@@ -164,7 +158,7 @@ FIRE ALARM
stat |= NOPOWER
update_icon()
-/obj/machinery/firealarm/attack_hand(mob/user as mob)
+/obj/machinery/firealarm/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN) || buildstage != 2)
return 1
@@ -220,10 +214,10 @@ FIRE ALARM
else if(href_list["tp"])
var/tp = text2num(href_list["tp"])
time += tp
- time = min(max(round(src.time), 0), 120)
+ time = min(max(round(time), 0), 120)
/obj/machinery/firealarm/proc/reset()
- if(!( src.working ))
+ if(!( working ))
return
var/area/A = get_area(src)
A.fire_reset()
@@ -232,23 +226,23 @@ FIRE ALARM
return
/obj/machinery/firealarm/proc/alarm(var/duration = 0)
- if(!( src.working))
+ if(!( working))
return
var/area/A = get_area(src)
for(var/obj/machinery/firealarm/FA in A)
fire_alarm.triggerAlarm(loc, FA, duration)
update_icon()
- //playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
+ //playsound(loc, 'sound/ambience/signal.ogg', 75, 0)
return
-/obj/machinery/firealarm/New(loc, dir, building)
+/obj/machinery/firealarm/New(location, direction, building)
..()
- if(loc)
- src.loc = loc
+ if(location)
+ loc = location
- if(dir)
- src.dir = dir
+ if(direction)
+ dir = direction
if(building)
buildstage = 0
@@ -256,11 +250,11 @@ FIRE ALARM
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- if(is_station_contact(src.z))
+ if(is_station_contact(z))
if(security_level)
- src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
+ overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
else
- src.overlays += image('icons/obj/monitors.dmi', "overlay_green")
+ overlays += image('icons/obj/monitors.dmi', "overlay_green")
update_icon()
@@ -273,8 +267,10 @@ Just a object used in constructing fire alarms
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/machinery/partyalarm
name = "\improper PARTY BUTTON"
@@ -291,15 +287,7 @@ Just a object used in constructing fire alarms
idle_power_usage = 2
active_power_usage = 6
- var/area/master_area
-
-/obj/machinery/partyalarm/New()
- var/area/A = get_area_master(src)
- if(!( istype(A, /area) ))
- return
- master_area=A
-
-/obj/machinery/partyalarm/attack_hand(mob/user as mob)
+/obj/machinery/partyalarm/attack_hand(mob/user)
if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN))
return
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 655ffd11634..1b685f50197 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -25,49 +25,51 @@
/*
/obj/machinery/flasher/New()
sleep(4) //<--- What the fuck are you doing? D=
- src.sd_set_light(2)
+ sd_set_light(2)
*/
/obj/machinery/flasher/power_change()
if( powered() )
stat &= ~NOPOWER
icon_state = "[base_state]1"
-// src.sd_set_light(2)
+// sd_set_light(2)
else
stat |= ~NOPOWER
icon_state = "[base_state]1-p"
-// src.sd_set_light(0)
+// sd_set_light(0)
//Don't want to render prison breaks impossible
/obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wirecutters))
add_fingerprint(user)
- src.disable = !src.disable
- if(src.disable)
- user.visible_message("\red [user] has disconnected the [src]'s flashbulb!", "\red You disconnect the [src]'s flashbulb!")
- if(!src.disable)
- user.visible_message("\red [user] has connected the [src]'s flashbulb!", "\red You connect the [src]'s flashbulb!")
+ disable = !disable
+ if(disable)
+ user.visible_message("[user] has disconnected the [src]'s flashbulb! ", "You disconnect the [src]'s flashbulb! ")
+ if(!disable)
+ user.visible_message("[user] has connected the [src]'s flashbulb! ", "You connect the [src]'s flashbulb! ")
//Let the AI trigger them directly.
-/obj/machinery/flasher/attack_ai()
- if(src.anchored)
- return src.flash()
- else
- return
+/obj/machinery/flasher/attack_ai(mob/user)
+ if(anchored)
+ return flash()
+
+/obj/machinery/flasher/attack_ghost(mob/user)
+ if(anchored && user.can_advanced_admin_interact())
+ return flash()
/obj/machinery/flasher/proc/flash()
if(!(powered()))
return
- if((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
+ if((disable) || (last_flash && world.time < last_flash + 150))
return
- playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ playsound(loc, 'sound/weapons/flash.ogg', 100, 1)
flick("[base_state]_flash", src)
- src.last_flash = world.time
+ last_flash = world.time
use_power(1000)
for(var/mob/living/L in viewers(src, null))
- if(get_dist(src, L) > src.range)
+ if(get_dist(src, L) > range)
continue
if(L.flash_eyes(affect_silicon = 1))
@@ -85,35 +87,51 @@
..(severity)
/obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj)
- if((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
+ if((disable) || (last_flash && world.time < last_flash + 150))
return
if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
- if((M.m_intent != "walk") && (src.anchored))
- src.flash()
+ if((M.m_intent != "walk") && (anchored))
+ flash()
/obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
add_fingerprint(user)
- src.anchored = !src.anchored
+ anchored = !anchored
- if(!src.anchored)
- user.show_message(text("\red [src] can now be moved."))
- src.overlays.Cut()
+ if(!anchored)
+ user.show_message(text("[src] can now be moved. "))
+ overlays.Cut()
- else if(src.anchored)
- user.show_message(text("\red [src] is now secured."))
- src.overlays += "[base_state]-s"
+ else if(anchored)
+ user.show_message(text("[src] is now secured. "))
+ overlays += "[base_state]-s"
+// Flasher button
+/obj/machinery/flasher_button
+ name = "flasher button"
+ desc = "A remote control switch for a mounted flasher."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "launcherbtt"
+ var/id = null
+ var/active = 0
+ anchored = 1.0
+ use_power = 1
+ idle_power_usage = 2
+ active_power_usage = 4
+
/obj/machinery/flasher_button/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+ return attack_hand(user)
+
+/obj/machinery/flasher_button/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
/obj/machinery/flasher_button/attackby(obj/item/weapon/W, mob/user as mob, params)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/flasher_button/attack_hand(mob/user as mob)
-
if(stat & (NOPOWER|BROKEN))
return
if(active)
@@ -125,13 +143,11 @@
icon_state = "launcheract"
for(var/obj/machinery/flasher/M in world)
- if(M.id == src.id)
+ if(M.id == id)
spawn()
M.flash()
sleep(50)
icon_state = "launcherbtt"
- active = 0
-
- return
\ No newline at end of file
+ active = 0
\ No newline at end of file
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index cee7706d256..f872fbcef2d 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -20,9 +20,7 @@
..()
/obj/machinery/floodlight/Destroy()
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(cell)
return ..()
/obj/machinery/floodlight/proc/updateicon()
@@ -59,7 +57,7 @@
if(on)
on = 0
- to_chat(user, "\blue You turn off the light")
+ to_chat(user, "You turn off the light ")
set_light(0)
else
if(!cell)
@@ -67,7 +65,7 @@
if(cell.charge <= 0)
return
on = 1
- to_chat(user, "\blue You turn on the light")
+ to_chat(user, "You turn on the light ")
set_light(brightness_on)
updateicon()
@@ -76,14 +74,14 @@
/obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. ", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters. ", \
diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm
index a9e7fb72741..bc70868cf8f 100644
--- a/code/game/machinery/guestpass.dm
+++ b/code/game/machinery/guestpass.dm
@@ -159,7 +159,7 @@
// to_chat(usr, "Printing the log, standby...")
//sleep(50)
var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc )
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
P.name = "activity log"
P.info = dat
@@ -182,7 +182,7 @@
pass.reason = reason
pass.name = "guest pass #[number]"
else
- to_chat(usr, "\red Cannot issue pass without issuing ID.")
+ to_chat(usr, "Cannot issue pass without issuing ID. ")
updateUsrDialog()
return
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 41952adf355..aa345e29643 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -28,6 +28,7 @@ Possible to do for anyone motivated enough:
// 0 = RANGE BASED
// 1 = AREA BASED
var/const/HOLOPAD_MODE = 0
+var/list/holopads = list()
/obj/machinery/hologram/holopad
name = "\improper AI holopad"
@@ -42,6 +43,7 @@ var/const/HOLOPAD_MODE = 0
/obj/machinery/hologram/holopad/New()
..()
+ holopads += src
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/holopad(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
@@ -89,13 +91,15 @@ var/const/HOLOPAD_MODE = 0
if(user.eyeobj.loc != src.loc)//Set client eye on the object if it's not already.
user.eyeobj.setLoc(get_turf(src))
else if(!hologram)//If there is no hologram, possibly make one.
- activate_holo(user)
+ activate_holo(user, 0)
else if(master == user)//If there is a hologram, remove it. But only if the user is the master. Otherwise do nothing.
clear_holo()
return
-/obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user)
- if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it.
+/obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user, var/force = 0)
+ if(!force && user.eyeobj.loc != src.loc) // allows holopads to pass off holograms to the next holopad in the chain
+ to_chat(user, "ERROR: Unable to project hologram.")
+ else if(!(stat & NOPOWER))//If the projector has power
if(user.holo)
var/obj/machinery/hologram/holopad/current = user.holo
current.clear_holo()
@@ -163,7 +167,17 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(eye_area != holo_area)
return 1
+ var/mob/living/silicon/ai/theai = master
+ var/turf/target_turf = get_turf(master.eyeobj)
+ var/newdir = hologram.dir
clear_holo()//If not, we want to get rid of the hologram.
+ var/obj/machinery/hologram/holopad/pad_close = get_closest_atom(/obj/machinery/hologram/holopad, holopads, theai.eyeobj)
+ if(get_dist(pad_close, theai.eyeobj) <= pad_close.holo_range)
+ if(!(pad_close.stat & NOPOWER) && !pad_close.hologram)
+ pad_close.activate_holo(theai, 1)
+ if(pad_close.hologram)
+ pad_close.hologram.forceMove(target_turf)
+ pad_close.hologram.dir = newdir
return 1
/obj/machinery/hologram/holopad/proc/move_hologram()
@@ -221,6 +235,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
return
/obj/machinery/hologram/holopad/Destroy()
+ holopads -= src
if(hologram)
clear_holo()
return ..()
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 7cb51574a60..219f1613d99 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -74,10 +74,10 @@
add_fingerprint(user)
src.disable = !src.disable
if(src.disable)
- user.visible_message("\red [user] has disabled the [src]!", "\red You disable the connection to the [src].")
+ user.visible_message("[user] has disabled the [src]! ", "You disable the connection to the [src]. ")
icon_state = "[base_state]-d"
if(!src.disable)
- user.visible_message("\red [user] has reconnected the [src]!", "\red You fix the connection to the [src].")
+ user.visible_message("[user] has reconnected the [src]! ", "You fix the connection to the [src]. ")
if(src.powered())
icon_state = "[base_state]"
else
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 9e4e8d5745c..26785e248b1 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -3,7 +3,6 @@
icon = 'icons/obj/iv_drip.dmi'
icon_state = "iv_drip"
anchored = 0
- density = 1
var/mob/living/carbon/human/attached = null
var/mode = 1 // 1 is injecting, 0 is taking blood.
var/obj/item/weapon/reagent_containers/beaker = null
@@ -16,9 +15,7 @@
/obj/machinery/iv_drip/Destroy()
attached = null
- if(beaker)
- qdel(beaker)
- beaker = null
+ QDEL_NULL(beaker)
return ..()
/obj/machinery/iv_drip/update_icon()
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index c73cac81669..644b5a73ab9 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -72,8 +72,11 @@
if(..(user, 1))
to_chat(user, "A light switch. It is [on? "on" : "off"].")
+/obj/machinery/light_switch/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
+
/obj/machinery/light_switch/attack_hand(mob/user)
-
on = !on
updateicon()
@@ -149,8 +152,8 @@
return 1
if(istype(W, /obj/item/weapon/wrench))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You detach \the [src] from the wall. ")
new/obj/item/mounted/frame/light_switch(get_turf(src))
qdel(src)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 4d41a591b9c..514b5459973 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -260,13 +260,13 @@ Class Procs:
if(!O)
return 1
if(!canLink(O))
- to_chat(usr, "\red You can't link with that device.")
+ to_chat(usr, "You can't link with that device. ")
return 1
if(unlinkFrom(usr, O))
- to_chat(usr, "\blue A green light flashes on \the [P], confirming the link was removed.")
+ to_chat(usr, "A green light flashes on \the [P], confirming the link was removed. ")
else
- to_chat(usr, "\red A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices.")
+ to_chat(usr, "A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices. ")
update_mt_menu=1
if("link" in href_list)
@@ -274,25 +274,25 @@ Class Procs:
if(!O)
return 1
if(!canLink(O,href_list))
- to_chat(usr, "\red You can't link with that device.")
+ to_chat(usr, "You can't link with that device. ")
return 1
if(isLinkedWith(O))
- to_chat(usr, "\red A red light flashes on \the [P]. The two devices are already linked.")
+ to_chat(usr, "A red light flashes on \the [P]. The two devices are already linked. ")
return 1
if(linkWith(usr, O, href_list))
- to_chat(usr, "\blue A green light flashes on \the [P], confirming the link was added.")
+ to_chat(usr, "A green light flashes on \the [P], confirming the link was added. ")
else
- to_chat(usr, "\red A red light flashes on \the [P]. It appears something went wrong when linking the two devices.")
+ to_chat(usr, "A red light flashes on \the [P]. It appears something went wrong when linking the two devices. ")
update_mt_menu=1
if("buffer" in href_list)
P.buffer = src
- to_chat(usr, "\blue A green light flashes, and the device appears in the multitool buffer.")
+ to_chat(usr, "A green light flashes, and the device appears in the multitool buffer. ")
update_mt_menu=1
if("flush" in href_list)
- to_chat(usr, "\blue A green light flashes, and the device disappears from the multitool buffer.")
+ to_chat(usr, "A green light flashes, and the device disappears from the multitool buffer. ")
P.buffer = null
update_mt_menu=1
@@ -395,21 +395,28 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/weapon/crowbar/C, var/ignore_panel = 0)
if(istype(C) && (panel_open || ignore_panel))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/item/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
- I.forceMove(loc)
- qdel(src)
+ playsound(loc, C.usesound, 50, 1)
+ deconstruct()
return 1
return 0
+/obj/machinery/proc/deconstruct(disassembled = TRUE)
+ on_deconstruction()
+ spawn_frame()
+ for(var/obj/item/I in component_parts)
+ if(I.reliability != 100 && crit_fail)
+ I.crit_fail = 1
+ I.forceMove(loc)
+ qdel(src)
+
+/obj/machinery/proc/spawn_frame()
+ var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
+ M.state = 2
+ M.icon_state = "box_1"
+
/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S)
if(istype(S))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, S.usesound, 50, 1)
if(!panel_open)
panel_open = 1
icon_state = icon_state_open
@@ -423,7 +430,7 @@ Class Procs:
/obj/machinery/proc/default_change_direction_wrench(var/mob/user, var/obj/item/weapon/wrench/W)
if(panel_open && istype(W))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
dir = turn(dir,-90)
to_chat(user, "You rotate [src]. ")
return 1
@@ -432,14 +439,14 @@ Class Procs:
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
if(istype(W))
to_chat(user, "Now [anchored ? "un" : ""]securing [name]. ")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, time, target = src))
+ playsound(loc, W.usesound, 50, 1)
+ if(do_after(user, time * W.toolspeed, target = src))
to_chat(user, "You've [anchored ? "un" : ""]secured [name]. ")
anchored = !anchored
if(istype(src, /obj/machinery))
var/obj/machinery/M = src
M.power_change() //Turn on or off the machine depending on the status of power in the new area.
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
return 1
return 0
@@ -486,18 +493,6 @@ Class Procs:
if(user.research_scanner && component_parts)
display_parts(user)
-/obj/machinery/proc/dismantle()
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
- I.loc = loc
- qdel(src)
- return 1
-
/obj/machinery/proc/on_assess_perp(mob/living/carbon/human/perp)
return 0
@@ -569,19 +564,20 @@ Class Procs:
return 0
//called on machinery construction (i.e from frame to machinery) but not on initialization
-/obj/machinery/proc/construction()
+/obj/machinery/proc/on_construction()
+ return
+
+/obj/machinery/proc/on_deconstruction()
return
/obj/machinery/proc/can_be_overridden()
. = 1
-/obj/machinery/tesla_act(var/power)
+/obj/machinery/tesla_act(power, explosive = FALSE)
..()
- if(prob(85))
- emp_act(2)
+ if(prob(85) && explosive)
+ explosion(loc, 1, 2, 4, flame_range = 2, adminlog = 0, smoke = 0)
else if(prob(50))
- ex_act(3)
- else if(prob(90))
- ex_act(2)
+ emp_act(2)
else
- ex_act(1)
+ ex_act(2)
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 7953f738a40..1d5f4e8cba8 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -22,8 +22,8 @@
if(istype(W, /obj/item/weapon/screwdriver))
to_chat(user, "You begin to unscrew the bolts off the [src]...")
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
var/obj/machinery/mass_driver_frame/F = new(get_turf(src))
F.dir = src.dir
F.anchored = 1
@@ -106,17 +106,17 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return 1
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
to_chat(user, "You begin to cut the frame apart...")
- if(do_after(user, 30, target = src) && (build == 0))
+ if(do_after(user, 30 * WT.toolspeed, target = src) && (build == 0))
to_chat(user, "You detach the plasteel sheets from each others. ")
new /obj/item/stack/sheet/plasteel(get_turf(src),3)
qdel(src)
return 1
if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You begin to anchor \the [src] on the floor.")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 10, target = src) && (build == 0))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src) && (build == 0))
to_chat(user, "You anchor \the [src]! ")
anchored = 1
build++
@@ -125,8 +125,8 @@
if(1) // Fixed to the floor
if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You begin to de-anchor \the [src] from the floor.")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 10, target = src) && (build == 1))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src) && (build == 1))
build--
update_icon()
anchored = 0
@@ -137,9 +137,9 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return 1
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
to_chat(user, "You begin to weld \the [src] to the floor...")
- if(do_after(user, 40, target = src) && (build == 1))
+ if(do_after(user, 40 * WT.toolspeed, target = src) && (build == 1))
to_chat(user, "You welded \the [src] to the floor. ")
build++
update_icon()
@@ -150,17 +150,17 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return 1
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
to_chat(user, "You begin to unweld \the [src] to the floor...")
- if(do_after(user, 40, target = src) && (build == 2))
+ if(do_after(user, 40 * WT.toolspeed, target = src) && (build == 2))
to_chat(user, "You unwelded \the [src] to the floor. ")
build--
update_icon()
if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C=W
+ var/obj/item/stack/cable_coil/C = W
to_chat(user, "You start adding cables to \the [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src) && (C.amount >= 3) && (build == 2))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(do_after(user, 20 * C.toolspeed, target = src) && (C.amount >= 3) && (build == 2))
C.use(3)
to_chat(user, "You've added cables to \the [src]. ")
build++
@@ -168,18 +168,18 @@
if(3) // Wired
if(istype(W, /obj/item/weapon/wirecutters))
to_chat(user, "You begin to remove the wiring from \the [src].")
- if(do_after(user, 10, target = src) && (build == 3))
+ if(do_after(user, 10 * W.toolspeed, target = src) && (build == 3))
new /obj/item/stack/cable_coil(loc,3)
- playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
to_chat(user, "You've removed the cables from \the [src]. ")
build--
update_icon()
return 1
if(istype(W, /obj/item/stack/rods))
- var/obj/item/stack/rods/R=W
+ var/obj/item/stack/rods/R = W
to_chat(user, "You begin to complete \the [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src) && (R.amount >= 3) && (build == 3))
+ playsound(get_turf(src), R.usesound, 50, 1)
+ if(do_after(user, 20 * R.toolspeed, target = src) && (R.amount >= 3) && (build == 3))
R.use(3)
to_chat(user, "You've added the grille to \the [src]. ")
build++
@@ -188,15 +188,15 @@
if(4) // Grille in place
if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You begin to pry off the grille from \the [src]...")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user, 30, target = src) && (build == 4))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src) && (build == 4))
new /obj/item/stack/rods(loc,2)
build--
update_icon()
return 1
if(istype(W, /obj/item/weapon/screwdriver))
to_chat(user, "You finalize the Mass Driver...")
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
var/obj/machinery/mass_driver/M = new(get_turf(src))
M.dir = src.dir
qdel(src)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 1d8d9a1e22e..65cd281340c 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -3,46 +3,43 @@
//###-Agouri###################################
/datum/feed_message
- var/author =""
- var/body =""
- var/message_type ="Story"
- //var/parent_channel
- var/backup_body =""
- var/backup_author =""
+ var/author = ""
+ var/body = ""
+ var/message_type = "Story"
+ var/backup_body = ""
+ var/backup_author = ""
var/is_admin_message = 0
var/icon/img = null
var/icon/backup_img
var/view_count = 0
/datum/feed_channel
- var/channel_name=""
+ var/channel_name = ""
var/list/datum/feed_message/messages = list()
- //var/message_count = 0
- var/locked=0
- var/author=""
- var/backup_author=""
- var/censored=0
- var/is_admin_channel=0
+ var/locked = 0
+ var/author = ""
+ var/backup_author = ""
+ var/censored = 0
+ var/is_admin_channel = 0
var/total_view_count = 0
- //var/page = null //For newspapers
/datum/feed_message/proc/clear()
- src.author = ""
- src.body = ""
- src.backup_body = ""
- src.backup_author = ""
- src.img = null
- src.backup_img = null
+ author = ""
+ body = ""
+ backup_body = ""
+ backup_author = ""
+ img = null
+ backup_img = null
view_count = 0
/datum/feed_channel/proc/clear()
- src.channel_name = ""
- src.messages = list()
- src.locked = 0
- src.author = ""
- src.backup_author = ""
- src.censored = 0
- src.is_admin_channel = 0
+ channel_name = ""
+ messages = list()
+ locked = 0
+ author = ""
+ backup_author = ""
+ censored = 0
+ is_admin_channel = 0
total_view_count = 0
/datum/feed_channel/proc/announce_news()
@@ -59,523 +56,322 @@ var/datum/feed_network/news_network = new /datum/feed_network //The global n
var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence.
+#define NEWSCASTER_MAIN 0 // Main menu
+#define NEWSCASTER_FC_LIST 1 // Feed channel list
+#define NEWSCASTER_CREATE_FC 2 // Create feed channel
+#define NEWSCASTER_CREATE_FM 3 // Create feed message
+#define NEWSCASTER_PRINT 4 // Print newspaper
+#define NEWSCASTER_VIEW_FC 5 // Read feed channel
+#define NEWSCASTER_NT_CENSOR 6 // Nanotrasen Feed Censorship Tool
+#define NEWSCASTER_D_NOTICE 7 // Nanotrasen D-Notice Handler
+#define NEWSCASTER_CENSOR_FC 8 // Censor feed channel
+#define NEWSCASTER_D_NOTICE_FC 9 // D-Notice feed channel
+#define NEWSCASTER_W_ISSUE_H 10 // Wanted Issue handler
+#define NEWSCASTER_W_ISSUE 11 // STATIONWIDE WANTED ISSUE
+
/obj/machinery/newscaster
name = "newscaster"
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
- var/isbroken = 0 //1 if someone banged it with something heavy
- var/ispowered = 1 //starts powered, changes with power_change()
- //var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
- //OBSOLETE: We're now using a global news network
- var/screen = 0 //Or maybe I'll make it into a list within a list afterwards... whichever I prefer, go fuck yourselves :3
- // 0 = welcome screen - main menu
- // 1 = view feed channels
- // 2 = create feed channel
- // 3 = create feed story
- // 4 = feed story submited sucessfully
- // 5 = feed channel created successfully
- // 6 = ERROR: Cannot create feed story
- // 7 = ERROR: Cannot create feed channel
- // 8 = print newspaper
- // 9 = viewing channel feeds
- // 10 = censor feed story
- // 11 = censor feed channel
- //Holy shit this is outdated, made this when I was still starting newscasters :3
- var/paper_remaining = 0
+ var/screen = NEWSCASTER_MAIN
+ var/paper_remaining = 15
var/securityCaster = 0
// 0 = Caster cannot be used to issue wanted posters
// 1 = the opposite
var/unit_no = 0 //Each newscaster has a unit number
- //var/datum/feed_message/wanted //We're gonna use a feed_message to store data of the wanted person because fields are similar
- //var/wanted_issue = 0 //OBSOLETE
- // 0 = there's no WANTED issued, we don't need a special icon_state
- // 1 = Guess what.
var/alert_delay = 500
var/alert = 0
// 0 = there hasn't been a news/wanted update in the last alert_delay
// 1 = there has
var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster
- var/msg = ""; //Feed message
+ var/msg = "" //Feed message
var/obj/item/weapon/photo/photo = null
- var/channel_name = ""; //the feed channel which will be receiving the feed, or being created
- var/c_locked=0; //Will our new channel be locked to public submissions?
- var/hitstaken = 0 //Death at 3 hits from an item with force>=15
+ var/channel_name = "" //the feed channel which will be receiving the feed, or being created
+ var/c_locked = 0 //Will our new channel be locked to public submissions?
+ var/hitstaken = 0 //Death at 3 hits from an item with force>=15
var/datum/feed_channel/viewing_channel = null
var/silence = 0
+ var/temp = null
+ var/temp_back_screen = NEWSCASTER_MAIN
+
+ var/static/REDACTED = "\[REDACTED\] "
light_range = 0
anchored = 1
-/obj/machinery/newscaster/security_unit //Security unit
+/obj/machinery/newscaster/security_unit
name = "Security Newscaster"
securityCaster = 1
-/obj/machinery/newscaster/New() //Constructor, ho~
+/obj/machinery/newscaster/New()
allCasters += src
- src.paper_remaining = 15 // Will probably change this to something better
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number
- src.unit_no++
- src.update_icon() //for any custom ones on the map...
- ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that
+ unit_no = allCasters.len
+ update_icon() //for any custom ones on the map...
+ ..()
/obj/machinery/newscaster/Destroy()
allCasters -= src
viewing_channel = null
- photo = null
+ QDEL_NULL(photo)
return ..()
/obj/machinery/newscaster/update_icon()
- if(!ispowered || isbroken)
+ overlays.Cut()
+ if(inoperable())
icon_state = "newscaster_off"
- if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
- src.overlays.Cut()
- src.overlays += image(src.icon, "crack3")
- return
+ if(stat & BROKEN) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
+ overlays += image(icon, "crack3")
+ else
+ if(!news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
+ icon_state = "newscaster_normal"
+ if(alert) //new message alert overlay
+ overlays += "newscaster_alert"
+ else
+ icon_state = "newscaster_wanted"
- src.overlays.Cut() //reset overlays
-
- if(news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
- icon_state = "newscaster_wanted"
- return
-
- if(alert) //new message alert overlay
- src.overlays += "newscaster_alert"
-
- if(hitstaken > 0) //Cosmetic damage overlay
- src.overlays += image(src.icon, "crack[hitstaken]")
-
- icon_state = "newscaster_normal"
- return
+ if(hitstaken > 0) //Cosmetic damage overlay
+ overlays += image(icon, "crack[hitstaken]")
/obj/machinery/newscaster/power_change()
- if(isbroken) //Broken shit can't be powered.
- return
- if( src.powered() )
- src.ispowered = 1
- stat &= ~NOPOWER
- src.update_icon()
- else
- spawn(rand(0, 15))
- src.ispowered = 0
- stat |= NOPOWER
- src.update_icon()
-
+ ..()
+ update_icon()
/obj/machinery/newscaster/ex_act(severity)
switch(severity)
- if(1.0)
+ if(1)
qdel(src)
return
- if(2.0)
- src.isbroken=1
+ if(2)
+ stat |= BROKEN
if(prob(50))
qdel(src)
else
- src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in.
- return
+ update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in.
else
if(prob(50))
- src.isbroken=1
- src.update_icon()
- return
- return
+ stat |= BROKEN
+ update_icon()
-/obj/machinery/newscaster/attack_ai(mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/newscaster/attack_ghost(mob/user)
+ ui_interact(user)
-/obj/machinery/newscaster/attack_hand(mob/user as mob) //########### THE MAIN BEEF IS HERE! And in the proc below this...############
- if(!src.ispowered || src.isbroken)
+/obj/machinery/newscaster/attack_hand(mob/user)
+ if(..())
return
+ ui_interact(user)
- if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) )
- var/mob/living/human_or_robot_user = user
- var/dat
- dat = text("Newscaster Newscaster Unit #[src.unit_no] ")
+/obj/machinery/newscaster/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+ if(can_scan(user))
+ scan_user(user)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "newscaster.tmpl", name, 400, 600)
+ ui.open()
- src.scan_user(human_or_robot_user) //Newscaster scans you
+/obj/machinery/newscaster/ui_data(user)
+ var/list/data = list()
- switch(screen)
- if(0)
- dat += {"Welcome to Newscasting Unit #[src.unit_no]. Interface & News networks Operational.
- Property of Nanotrasen "}
- if(news_network.wanted_issue)
- dat+= "Read Wanted Issue "
- dat+= {"Create Feed Channel
- View Feed Channels
- Submit new Feed story
- Print newspaper "}
- if(!silence)
- dat+= "Silence unit "
+ data["unit_no"] = unit_no
+ data["temp"] = temp
+ data["temp_back_screen"] = temp_back_screen
+ data["screen"] = screen
+
+ switch(screen)
+ if(0)
+ data["wanted_issue"] = news_network.wanted_issue ? 1 : 0
+ data["silence"] = silence
+ data["securityCaster"] = securityCaster
+ if(securityCaster)
+ data["scanned_user"] = scanned_user
+ if(1, 6, 7)
+ var/list/channels = list()
+ data["channels"] = channels
+ for(var/datum/feed_channel/C in news_network.network_channels)
+ channels[++channels.len] = list("name" = C.channel_name, "ref" = "\ref[C]", "censored" = C.censored, "admin" = C.is_admin_channel)
+ if(2)
+ data["scanned_user"] = scanned_user
+ data["channel_name"] = channel_name
+ data["c_locked"] = c_locked
+ if(3)
+ data["scanned_user"] = scanned_user
+ data["channel_name"] = channel_name
+ data["msg"] = msg
+ data["photo"] = photo ? 1 : 0
+ if(4)
+ var/total_num = length(news_network.network_channels)
+ var/active_num = total_num
+ var/message_num=0
+ for(var/datum/feed_channel/FC in news_network.network_channels)
+ if(!FC.censored)
+ message_num += length(FC.messages)
else
- dat+= "Unsilence unit "
- dat+= {"Re-scan User
- Exit "}
- if(src.securityCaster)
- var/wanted_already = 0
- if(news_network.wanted_issue)
- wanted_already = 1
-
- dat += {"Feed Security functions:
- [(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue
- Censor Feed Stories
- Mark Feed Channel with Nanotrasen D-Notice
- The newscaster recognises you as: [src.scanned_user] "}
- if(1)
- dat+= "Station Feed Channels "
- if( isemptylist(news_network.network_channels) )
- dat+="No active channels found... "
- else
- for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
- if(CHANNEL.is_admin_channel)
- dat+="[CHANNEL.channel_name] "
- else
- dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("*** ") : ()] "
- /*for(var/datum/feed_channel/CHANNEL in src.channel_list)
- dat+="[CHANNEL.channel_name]: \[created by: [CHANNEL.author] \] "
- if( isemptylist(CHANNEL.messages) )
- dat+="No feed messages found in channel... "
- else
- for(var/datum/feed_message/MESSAGE in CHANNEL.messages)
- dat+="-[MESSAGE.body] \[[MESSAGE.message_type] by [MESSAGE.author] \] "*/
-
- dat+="Refresh "
- dat+="Back "
- if(2)
- dat+={"Creating new Feed Channel...
- Channel Name : [src.channel_name]
- Channel Author: [src.scanned_user]
- Will Accept Public Feeds : [(src.c_locked) ? ("NO") : ("YES")]
- Submit Cancel "}
- if(3)
- dat+={"Creating new Feed Message...
- Receiving Channel : [src.channel_name]
- Message Author: [src.scanned_user]
- Message Body : [src.msg]
- Attach Photo : [(src.photo ? "Photo Attached" : "No Photo")]
- Submit Cancel "}
- if(4)
- dat+="Feed story successfully submitted to [src.channel_name]. "
- dat+="Return "
- if(5)
- dat+="Feed Channel [src.channel_name] created successfully. "
- dat+="Return "
- if(6)
- dat+="ERROR: Could not submit Feed story to Network. "
- if(src.channel_name=="")
- dat+="Invalid receiving channel name. "
- if(src.scanned_user=="Unknown")
- dat+="Channel author unverified. "
- if(src.msg == "" || src.msg == "\[REDACTED\]")
- dat+="Invalid message body. "
-
- dat+="Return "
- if(7)
- dat+="ERROR: Could not submit Feed Channel to Network. "
- //var/list/existing_channels = list() //Let's get dem existing channels - OBSOLETE
- var/list/existing_authors = list()
- for(var/datum/feed_channel/FC in news_network.network_channels)
- //existing_channels += FC.channel_name //OBSOLETE
- if(FC.author == "\[REDACTED\]")
- existing_authors += FC.backup_author
- else
- existing_authors += FC.author
- if(src.scanned_user in existing_authors)
- dat+="There already exists a Feed channel under your name. "
- if(src.channel_name=="" || src.channel_name == "\[REDACTED\]")
- dat+="Invalid channel name. "
- var/check = 0
- for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
- check = 1
- break
- if(check)
- dat+="Channel name already in use. "
- if(src.scanned_user=="Unknown")
- dat+="Channel author unverified. "
- dat+="Return "
- if(8)
- var/total_num=length(news_network.network_channels)
- var/active_num=total_num
- var/message_num=0
- for(var/datum/feed_channel/FC in news_network.network_channels)
- if(!FC.censored)
- message_num += length(FC.messages) //Dont forget, datum/feed_channel's var messages is a list of datum/feed_message
- else
- active_num--
- dat+="Network currently serves a total of [total_num] Feed channels, [active_num] of which are active, and a total of [message_num] Feed Stories." //TODO: CONTINUE
- dat+="Liquid Paper remaining: [(src.paper_remaining) *100 ] cm^3"
- dat+="Print Paper "
- dat+="Cancel "
- if(9)
- dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author] \] "
- dat+="Feed view count: [viewing_channel.total_view_count] "
- viewing_channel.total_view_count++
- if(src.viewing_channel.censored)
- dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice. "
- dat+="No further feed story additions are allowed while the D-Notice is in effect. "
- else
- if( isemptylist(src.viewing_channel.messages) )
- dat+="No feed messages found in channel... "
- else
- var/i = 0
- for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
- i++
- dat+="-[MESSAGE.body] "
- if(MESSAGE.img)
- usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
- dat+=" "
- dat+="\[[MESSAGE.message_type] by [MESSAGE.author] \] "
- dat+="Message view count: [MESSAGE.view_count] "
- MESSAGE.view_count++
- dat+="Refresh "
- dat+="Back "
- if(10)
- dat+="Nanotrasen Feed Censorship Tool "
- dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible. "
- dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it. "
- dat+=" Select Feed channel to get Stories from: "
- if(isemptylist(news_network.network_channels))
- dat+="No feed channels found active... "
- else
- for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
- dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("*** ") : ()] "
- dat+="Cancel "
- if(11)
- dat+="Nanotrasen D-Notice Handler "
- dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
- dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
- dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time. "
- if(isemptylist(news_network.network_channels))
- dat+="No feed channels found active... "
- else
- for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
- dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("*** ") : ()] "
-
- dat+="Back "
- if(12)
- dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \] "
- dat+="[(src.viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")] "
-
-
- if( isemptylist(src.viewing_channel.messages) )
- dat+="No feed messages found in channel... "
- else
- for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
- dat+="-[MESSAGE.body] \[[MESSAGE.message_type] by [MESSAGE.author] \] "
- dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")] "
- dat+="Back "
- if(13)
- dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \] "
- dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel . "
- if(src.viewing_channel.censored)
- dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice. "
- dat+="No further feed story additions are allowed while the D-Notice is in effect. "
- else
- if( isemptylist(src.viewing_channel.messages) )
- dat+="No feed messages found in channel... "
- else
- for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
- dat+="-[MESSAGE.body] \[[MESSAGE.message_type] by [MESSAGE.author] \] "
-
- dat+="Back "
- if(14)
- dat+="Wanted Issue Handler: "
- var/wanted_already = 0
- var/end_param = 1
- if(news_network.wanted_issue)
- wanted_already = 1
- end_param = 2
-
- if(wanted_already)
- dat+="A wanted issue is already in Feed Circulation. You can edit or cancel it below. "
- dat+=" "
- dat+="Criminal Name : [src.channel_name] "
- dat+="Description : [src.msg] "
- dat+="Attach Photo : [(src.photo ? "Photo Attached" : "No Photo")]"
- if(wanted_already)
- dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author] "
- else
- dat+="Wanted Issue will be created under prosecutor: [src.scanned_user] "
- dat+="[(wanted_already) ? ("Edit Issue") : ("Submit")] "
- if(wanted_already)
- dat+="Take down Issue "
- dat+="Cancel "
- if(15)
- dat+="Wanted issue for [src.channel_name] is now in Network Circulation. "
- dat+="Return "
- if(16)
- dat+="ERROR: Wanted Issue rejected by Network. "
- if(src.channel_name=="" || src.channel_name == "\[REDACTED\]")
- dat+="Invalid name for person wanted. "
- if(src.scanned_user=="Unknown")
- dat+="Issue author unverified. "
- if(src.msg == "" || src.msg == "\[REDACTED\]")
- dat+="Invalid description. "
- dat+="Return "
- if(17)
- dat+="Wanted Issue successfully deleted from Circulation "
- dat+="Return "
- if(18)
- dat+="-- STATIONWIDE WANTED ISSUE -- \[Submitted by: [news_network.wanted_issue.backup_author] \] "
- dat+="Criminal : [news_network.wanted_issue.author] "
- dat+="Description : [news_network.wanted_issue.body] "
- dat+="Photo: : "
- if(news_network.wanted_issue.img)
- usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
- dat+=" "
- else
- dat+="None"
- dat+="Back "
- if(19)
- dat+="Wanted issue for [src.channel_name] successfully edited. "
- dat+="Return "
- if(20)
- dat+="Printing successfull. Please receive your newspaper from the bottom of the machine. "
- dat+="Return "
- if(21)
- dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage. "
- dat+="Return "
+ active_num--
+ data["total_num"] = total_num
+ data["active_num"] = active_num
+ data["message_num"] = message_num
+ data["paper_remaining"] = paper_remaining * 100
+ if(5)
+ data["channel_name"] = viewing_channel.channel_name
+ data["author"] = viewing_channel.author
+ data["total_view_count"] = viewing_channel.total_view_count
+ data["censored"] = viewing_channel.censored
+ var/list/messages = list()
+ data["messages"] = messages
+ for(var/datum/feed_message/M in viewing_channel.messages)
+ messages[++messages.len] = list("body" = M.body, "img" = M.img ? icon2base64(M.img) : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count)
+ if(8, 9)
+ data["channel_name"] = viewing_channel.channel_name
+ data["ref"] = "\ref[viewing_channel]"
+ data["author"] = viewing_channel.author
+ data["author_redacted"] = viewing_channel.author == REDACTED ? 1 : 0
+ data["total_view_count"] = viewing_channel.total_view_count
+ data["censored"] = viewing_channel.censored
+ var/list/messages = list()
+ data["messages"] = messages
+ for(var/datum/feed_message/M in viewing_channel.messages)
+ messages[++messages.len] = list("body" = M.body, "body_redacted" = (M.body == REDACTED ? 1 : 0) , "message_type" = M.message_type, "author" = M.author, "author_redacted" = (M.author == REDACTED ? 1 : 0), "ref" = "\ref[M]", "view_count" = M.view_count)
+ if(10)
+ var/wanted_already = 0
+ var/end_param = 1
+ if(news_network.wanted_issue)
+ wanted_already = 1
+ end_param = 2
+ data["wanted_already"] = wanted_already
+ data["end_param"] = end_param
+ data["channel_name"] = channel_name
+ data["msg"] = msg
+ data["photo"] = photo ? 1 : 0
+ if(wanted_already)
+ data["author"] = news_network.wanted_issue.backup_author
else
- dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
-
-
- var/datum/browser/popup = new(user, "newscaster_main", name, 400, 600)
- popup.set_content(dat)
- popup.open(0)
- onclose(human_or_robot_user, "newscaster_main")
-
- /*if(src.isbroken) //debugging shit
- return
- src.hitstaken++
- if(src.hitstaken==3)
- src.isbroken = 1
- src.update_icon()*/
-
+ data["scanned_user"] = scanned_user
+ if(11)
+ data["author"] = news_network.wanted_issue.backup_author
+ data["criminal"] = news_network.wanted_issue.author
+ data["description"] = news_network.wanted_issue.body
+ data["photo"] = news_network.wanted_issue.img ? icon2base64(news_network.wanted_issue.img) : 0
+ return data
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return 1
- usr.set_machine(src)
if(href_list["set_channel_name"])
- src.channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))
- while(findtext(src.channel_name," ") == 1)
- src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
- src.updateUsrDialog()
- //src.update_icon()
+ channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))
+ while(findtext(channel_name," ") == 1)
+ channel_name = copytext(channel_name, 2, lentext(channel_name) + 1)
else if(href_list["set_channel_lock"])
- src.c_locked = !src.c_locked
- src.updateUsrDialog()
- //src.update_icon()
+ c_locked = !c_locked
else if(href_list["submit_new_channel"])
- //var/list/existing_channels = list() //OBSOLETE
var/list/existing_authors = list()
for(var/datum/feed_channel/FC in news_network.network_channels)
- //existing_channels += FC.channel_name
- if(FC.author == "\[REDACTED\]")
+ if(FC.author == REDACTED)
existing_authors += FC.backup_author
else
- existing_authors +=FC.author
+ existing_authors += FC.author
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
+ if(FC.channel_name == channel_name)
check = 1
break
- if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) )
- src.screen=7
+ if(channel_name == "" || channel_name == REDACTED || scanned_user == "Unknown" || check || (scanned_user in existing_authors))
+ temp = "ERROR: Could not submit feed channel to Network. "
+ if(scanned_user in existing_authors)
+ temp += "There already exists a feed channel under your name. "
+ if(channel_name == "" || channel_name == REDACTED)
+ temp += "Invalid channel name. "
+ if(check)
+ temp += "Channel name already in use. "
+ if(scanned_user == "Unknown")
+ temp += "Channel author unverified. "
+ temp += " "
+ temp_back_screen = NEWSCASTER_CREATE_FC
else
- var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
- if(choice=="Confirm")
+ var/choice = alert("Please confirm feed channel creation", "Network Channel Handler", "Confirm", "Cancel")
+ if(choice == "Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
- newChannel.channel_name = src.channel_name
- newChannel.author = src.scanned_user
+ newChannel.channel_name = channel_name
+ newChannel.author = scanned_user
newChannel.locked = c_locked
- feedback_inc("newscaster_channels",1)
- /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
- NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
- news_network.network_channels += newChannel //Adding channel to the global network
- src.screen=5
- src.updateUsrDialog()
- //src.update_icon()
+ feedback_inc("newscaster_channels", 1)
+ news_network.network_channels += newChannel //Adding channel to the global network
+ temp = "Feed channel '[channel_name]' created successfully. "
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["set_channel_receiving"])
- //var/list/datum/feed_channel/available_channels = list()
var/list/available_channels = list()
for(var/datum/feed_channel/F in news_network.network_channels)
- if( (!F.locked || F.author == scanned_user) && !F.censored)
+ if((!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
- src.channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
- src.updateUsrDialog()
+ channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels)
else if(href_list["set_new_message"])
- src.msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))
- while(findtext(src.msg," ") == 1)
- src.msg = copytext(src.msg,2,lentext(src.msg)+1)
- src.updateUsrDialog()
+ msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))
+ while(findtext(msg, " ") == 1)
+ msg = copytext(msg, 2, lentext(msg) + 1)
else if(href_list["set_attachment"])
AttachPhoto(usr)
- src.updateUsrDialog()
else if(href_list["submit_new_message"])
- if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
- src.screen=6
+ if(msg == "" || msg == REDACTED || scanned_user == "Unknown" || channel_name == "" )
+ temp = "ERROR: Could not submit feed story to Network. "
+ if(channel_name == "")
+ temp += "Invalid receiving channel name. "
+ if(scanned_user == "Unknown")
+ temp += "Channel author unverified. "
+ if(msg == "" || msg == REDACTED)
+ temp += "Invalid message body. "
+ temp += " "
+ temp_back_screen = NEWSCASTER_CREATE_FM
else
var/datum/feed_message/newMsg = new /datum/feed_message
- newMsg.author = src.scanned_user
- newMsg.body = src.msg
+ newMsg.author = scanned_user
+ newMsg.body = msg
if(photo)
newMsg.img = photo.img
feedback_inc("newscaster_stories",1)
var/announcement = ""
for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
+ if(FC.channel_name == channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
announcement = FC.announce_news()
break
- src.screen=4
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert(announcement)
-
- src.updateUsrDialog()
+ temp = "Feed story successfully submitted to [channel_name]. "
+ temp_back_screen = NEWSCASTER_MAIN
+ for(var/obj/machinery/newscaster/NC in allCasters)
+ NC.newsAlert(announcement)
else if(href_list["create_channel"])
- src.screen=2
- src.updateUsrDialog()
+ screen = NEWSCASTER_CREATE_FC
else if(href_list["create_feed_story"])
- src.screen=3
- src.updateUsrDialog()
+ screen = NEWSCASTER_CREATE_FM
else if(href_list["menu_paper"])
- src.screen=8
- src.updateUsrDialog()
+ screen = NEWSCASTER_PRINT
+
else if(href_list["print_paper"])
- if(!src.paper_remaining)
- src.screen=21
+ if(!paper_remaining)
+ temp = "Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage. "
+ temp_back_screen = NEWSCASTER_MAIN
else
- src.print_paper()
- src.screen = 20
- src.updateUsrDialog()
+ print_paper()
+ temp = "Printing successful. Please receive your newspaper from the bottom of the machine. "
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["silence_unit"])
- silence=1
- updateUsrDialog()
-
- else if(href_list["unsilence_unit"])
- silence=0
- updateUsrDialog()
+ silence = !silence
else if(href_list["menu_censor_story"])
- src.screen=10
- src.updateUsrDialog()
+ screen = NEWSCASTER_NT_CENSOR
else if(href_list["menu_censor_channel"])
- src.screen=11
- src.updateUsrDialog()
+ screen = NEWSCASTER_D_NOTICE
else if(href_list["menu_wanted"])
var/already_wanted = 0
@@ -583,199 +379,211 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
already_wanted = 1
if(already_wanted)
- src.channel_name = news_network.wanted_issue.author
- src.msg = news_network.wanted_issue.body
- src.screen = 14
- src.updateUsrDialog()
+ channel_name = news_network.wanted_issue.author
+ msg = news_network.wanted_issue.body
+ screen = NEWSCASTER_W_ISSUE_H
else if(href_list["set_wanted_name"])
- src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
- while(findtext(src.channel_name," ") == 1)
- src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
- src.updateUsrDialog()
+ channel_name = strip_html(input(usr, "Provide the name of the wanted person", "Network Security Handler", ""))
+ while(findtext(channel_name, " ") == 1)
+ channel_name = copytext(channel_name, 2, lentext(channel_name) + 1)
else if(href_list["set_wanted_desc"])
- src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
- while(findtext(src.msg," ") == 1)
- src.msg = copytext(src.msg,2,lentext(src.msg)+1)
- src.updateUsrDialog()
+ msg = strip_html(input(usr, "Provide the a description of the wanted person and any other details you deem important", "Network Security Handler", ""))
+ while(findtext(msg, " ") == 1)
+ msg = copytext(msg, 2, lentext(msg) + 1)
else if(href_list["submit_wanted"])
var/input_param = text2num(href_list["submit_wanted"])
- if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown")
- src.screen = 16
+ if(msg == "" || channel_name == "" || scanned_user == "Unknown")
+ temp = "ERROR: Wanted issue rejected by Network. "
+ if(channel_name == "" || channel_name == REDACTED)
+ temp += "Invalid name for person wanted. "
+ if(scanned_user == "Unknown")
+ temp += "Channel author unverified. "
+ if(msg == "" || msg == REDACTED)
+ temp += "Invalid description. "
+ temp += " "
+ temp_back_screen = NEWSCASTER_MAIN
else
- var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel")
- if(choice=="Confirm")
- if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below
- var/datum/feed_message/WANTED = new /datum/feed_message
- WANTED.author = src.channel_name
- WANTED.body = src.msg
- WANTED.backup_author = src.scanned_user //I know, a bit wacky
+ var/choice = alert("Please confirm wanted issue [input_param == 1 ? "creation." : "edit."]", "Network Security Handler", "Confirm", "Cancel")
+ if(choice == "Confirm")
+ if(input_param == 1) //input_param == 1: new wanted issue, input_param == 2: editing an existing one
+ var/datum/feed_message/W = new /datum/feed_message
+ W.author = channel_name
+ W.body = msg
+ W.backup_author = scanned_user //I know, a bit wacky
if(photo)
- WANTED.img = photo.img
- news_network.wanted_issue = WANTED
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert()
- NEWSCASTER.update_icon()
- src.screen = 15
+ W.img = photo.img
+ news_network.wanted_issue = W
+ for(var/obj/machinery/newscaster/NS in allCasters)
+ NS.newsAlert()
+ NS.update_icon()
+ temp = "Wanted issue for [channel_name] is now in Network Circulation. "
+ temp_back_screen = NEWSCASTER_MAIN
else
if(news_network.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
return
- news_network.wanted_issue.author = src.channel_name
- news_network.wanted_issue.body = src.msg
- news_network.wanted_issue.backup_author = src.scanned_user
+ news_network.wanted_issue.author = channel_name
+ news_network.wanted_issue.body = msg
+ news_network.wanted_issue.backup_author = scanned_user
if(photo)
news_network.wanted_issue.img = photo.img
- src.screen = 19
-
- src.updateUsrDialog()
+ temp = "Wanted issue for [channel_name] successfully edited. "
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["cancel_wanted"])
if(news_network.wanted_issue.is_admin_message)
- alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok")
+ alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.", "Ok")
return
- var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
- if(choice=="Confirm")
+ var/choice = alert("Please confirm wanted issue removal", "Network Security Handler", "Confirm", "Cancel")
+ if(choice == "Confirm")
news_network.wanted_issue = null
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.update_icon()
- src.screen=17
- src.updateUsrDialog()
+ for(var/obj/machinery/newscaster/NC in allCasters)
+ NC.update_icon()
+ temp = "Wanted Issue successfully deleted from Circulation "
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["view_wanted"])
- src.screen=18
- src.updateUsrDialog()
+ screen = NEWSCASTER_W_ISSUE
else if(href_list["censor_channel_author"])
var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
- if(FC.is_admin_channel)
- alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
- return
- if(FC.author != "\[REDACTED\] ")
- FC.backup_author = FC.author
- FC.author = "\[REDACTED\] "
- else
- FC.author = FC.backup_author
- src.updateUsrDialog()
+ if(FC)
+ if(FC.is_admin_channel)
+ alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
+ return
+ if(FC.author != REDACTED)
+ FC.backup_author = FC.author
+ FC.author = REDACTED
+ else
+ FC.author = FC.backup_author
else if(href_list["censor_channel_story_author"])
- var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"])
- if(MSG.is_admin_message)
- alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
- return
- if(MSG.author != "\[REDACTED\] ")
- MSG.backup_author = MSG.author
- MSG.author = "\[REDACTED\] "
- else
- MSG.author = MSG.backup_author
- src.updateUsrDialog()
+ var/datum/feed_message/M = locate(href_list["censor_channel_story_author"])
+ if(M)
+ if(M.is_admin_message)
+ alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
+ return
+ if(M.author != REDACTED)
+ M.backup_author = M.author
+ M.author = REDACTED
+ else
+ M.author = M.backup_author
else if(href_list["censor_channel_story_body"])
- var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"])
- if(MSG.is_admin_message)
- alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
- return
- if(MSG.img != null)
- MSG.backup_img = MSG.img
- MSG.img = null
- else
- MSG.img = MSG.backup_img
- if(MSG.body != "\[REDACTED\] ")
- MSG.backup_body = MSG.body
- MSG.body = "\[REDACTED\] "
- else
- MSG.body = MSG.backup_body
- src.updateUsrDialog()
+ var/datum/feed_message/M = locate(href_list["censor_channel_story_body"])
+ if(M)
+ if(M.is_admin_message)
+ alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
+ return
+ if(M.img != null)
+ M.backup_img = M.img
+ M.img = null
+ else
+ M.img = M.backup_img
+ if(M.body != REDACTED)
+ M.backup_body = M.body
+ M.body = REDACTED
+ else
+ M.body = M.backup_body
else if(href_list["pick_d_notice"])
var/datum/feed_channel/FC = locate(href_list["pick_d_notice"])
- src.viewing_channel = FC
- src.screen=13
- src.updateUsrDialog()
+ if(FC)
+ viewing_channel = FC
+ screen = NEWSCASTER_D_NOTICE_FC
else if(href_list["toggle_d_notice"])
var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
- if(FC.is_admin_channel)
- alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
- return
- FC.censored = !FC.censored
- src.updateUsrDialog()
+ if(FC)
+ if(FC.is_admin_channel)
+ alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.", "Ok")
+ return
+ FC.censored = !FC.censored
else if(href_list["view"])
- src.screen=1
- src.updateUsrDialog()
+ screen = NEWSCASTER_FC_LIST
else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~
- src.screen = text2num(href_list["setScreen"])
- if(src.screen == 0)
- src.scanned_user = "Unknown";
- msg = "";
- src.c_locked=0;
- channel_name="";
- src.viewing_channel = null
- src.updateUsrDialog()
+ screen = text2num(href_list["setScreen"])
+ if(screen == NEWSCASTER_MAIN)
+ scanned_user = "Unknown"
+ msg = ""
+ c_locked = 0
+ channel_name = ""
+ viewing_channel = null
+ temp = null
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["show_channel"])
var/datum/feed_channel/FC = locate(href_list["show_channel"])
- src.viewing_channel = FC
- src.screen = 9
- src.updateUsrDialog()
+ if(FC)
+ viewing_channel = FC
+ viewing_channel.total_view_count++
+ for(var/datum/feed_message/M in viewing_channel.messages)
+ M.view_count++
+ screen = NEWSCASTER_VIEW_FC
else if(href_list["pick_censor_channel"])
var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"])
- src.viewing_channel = FC
- src.screen = 12
- src.updateUsrDialog()
+ if(FC)
+ viewing_channel = FC
+ screen = NEWSCASTER_CENSOR_FC
else if(href_list["refresh"])
- src.updateUsrDialog()
+ if(can_scan(usr))
+ scan_user(usr) //Newscaster scans you
-/obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params)
+ nanomanager.update_uis(src)
+ return 1
+
+/obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "Now [anchored ? "un" : ""]securing [name] ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 60, target = src))
+ playsound(loc, I.usesound, 50, 1)
+ if(do_after(user, 60 * I.toolspeed, target = src))
new /obj/item/mounted/frame/newscaster_frame(loc)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
qdel(src)
return
- if(isbroken)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
- visible_message("[user.name] further abuses the shattered [src.name]. ", null, 5 )
+ if(stat & BROKEN)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
+ visible_message("[user.name] further abuses the shattered [name]. ", null, 5)
else
if(istype(I, /obj/item/weapon) )
var/obj/item/weapon/W = I
if(W.damtype == STAMINA)
return
- if(W.force <15)
- visible_message("[user.name] hits the [src.name] with the [W.name] with no visible effect. ", null , 5 )
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
+ if(W.force < 15)
+ visible_message("[user.name] hits the [name] with the [W.name] with no visible effect. ", null , 5)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
else
hitstaken++
- if(hitstaken==3)
- visible_message("[user.name] smashes the [src.name]! ", null, 5 )
- isbroken=1
- playsound(src.loc, 'sound/effects/Glassbr3.ogg', 100, 1)
+ if(hitstaken == 3)
+ visible_message("[user.name] smashes the [name]! ", null, 5)
+ stat |= BROKEN
+ playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
else
- visible_message("[user.name] forcefully slams the [src.name] with the [I.name]! ", null, 5 )
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
+ visible_message("[user.name] forcefully slams the [name] with the [I.name]! ", null, 5)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
else
- to_chat(user, "This does nothing. ")
- src.update_icon()
+ to_chat(user, "This does nothing. ")
+ update_icon()
+ ..()
-/obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob)
+/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
if(photo)
if(!issilicon(user))
- photo.loc = src.loc
+ photo.forceMove(get_turf(src))
user.put_in_inactive_hand(photo)
photo = null
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
photo = user.get_active_hand()
user.drop_item()
- photo.loc = src
- else if(istype(user,/mob/living/silicon))
+ photo.forceMove(src)
+ else if(issilicon(user))
var/mob/living/silicon/tempAI = user
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
@@ -799,7 +607,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "newspaper"
- w_class = 2 //Let's make it fit in trashbags!
+ w_class = WEIGHT_CLASS_SMALL //Let's make it fit in trashbags!
attack_verb = list("bapped")
var/screen = 0
var/pages = 0
@@ -813,34 +621,34 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/dat
- src.pages = 0
+ pages = 0
switch(screen)
if(0) //Cover
dat+="The Griffon
"
dat+="Nanotrasen-standard newspaper, for use on Nanotrasen Space Facilities
"
- if(isemptylist(src.news_content))
- if(src.important_message)
- dat+="Contents:** Important Security Announcement** \[page [src.pages+2]\] "
+ if(isemptylist(news_content))
+ if(important_message)
+ dat+="Contents:** Important Security Announcement** \[page [pages+2]\] "
else
dat+="Other than the title, the rest of the newspaper is unprinted... "
else
dat+="Contents:"
- for(var/datum/feed_channel/NP in src.news_content)
- src.pages++
- if(src.important_message)
- dat+="** Important Security Announcement** \[page [src.pages+2]\] "
+ for(var/datum/feed_channel/NP in news_content)
+ pages++
+ if(important_message)
+ dat+="** Important Security Announcement** \[page [pages+2]\] "
var/temp_page=0
- for(var/datum/feed_channel/NP in src.news_content)
+ for(var/datum/feed_channel/NP in news_content)
temp_page++
dat+="[NP.channel_name] \[page [temp_page+1]\] "
dat+=" "
if(scribble_page==curr_page)
- dat+="There is a small scribble near the end of this page... It reads: \"[src.scribble]\" "
+ dat+="There is a small scribble near the end of this page... It reads: \"[scribble]\" "
dat+= " "
if(1) // X channel pages inbetween.
- for(var/datum/feed_channel/NP in src.news_content)
- src.pages++ //Let's get it right again.
- var/datum/feed_channel/C = src.news_content[src.curr_page]
+ for(var/datum/feed_channel/NP in news_content)
+ pages++ //Let's get it right again.
+ var/datum/feed_channel/C = news_content[curr_page]
dat+="[C.channel_name] \[created by: [C.author] \] "
if(C.censored)
dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice . Its contents were not transferred to the newspaper at the time of printing."
@@ -859,12 +667,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="\[Story by [MESSAGE.author] \] "
dat+=""
if(scribble_page==curr_page)
- dat+="There is a small scribble near the end of this page... It reads: \"[src.scribble]\" "
+ dat+="There is a small scribble near the end of this page... It reads: \"[scribble]\" "
dat+= " "
if(2) //Last page
- for(var/datum/feed_channel/NP in src.news_content)
- src.pages++
- if(src.important_message!=null)
+ for(var/datum/feed_channel/NP in news_content)
+ pages++
+ if(important_message!=null)
dat+="Wanted Issue:
"
dat+="Criminal name : [important_message.author] "
dat+="Description : [important_message.body] "
@@ -877,91 +685,96 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else
dat+="Apart from some uninteresting Classified ads, there's nothing on this page... "
if(scribble_page==curr_page)
- dat+="There is a small scribble near the end of this page... It reads: \"[src.scribble]\" "
+ dat+="There is a small scribble near the end of this page... It reads: \"[scribble]\" "
dat+= " "
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
- dat+="[src.curr_page+1]
"
+ dat+="[curr_page+1]
"
human_user << browse(dat, "window=newspaper_main;size=300x400")
onclose(human_user, "newspaper_main")
else
to_chat(user, "The paper is full of intelligible symbols!")
-obj/item/weapon/newspaper/Topic(href, href_list)
+/obj/item/weapon/newspaper/Topic(href, href_list)
var/mob/living/U = usr
..()
if((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ))
U.set_machine(src)
if(href_list["next_page"])
- if(curr_page==src.pages+1)
+ if(curr_page==pages+1)
return //Don't need that at all, but anyway.
- if(src.curr_page == src.pages) //We're at the middle, get to the end
- src.screen = 2
+ if(curr_page == pages) //We're at the middle, get to the end
+ screen = 2
else
if(curr_page == 0) //We're at the start, get to the middle
- src.screen=1
- src.curr_page++
- playsound(src.loc, "pageturn", 50, 1)
+ screen=1
+ curr_page++
+ playsound(loc, "pageturn", 50, 1)
else if(href_list["prev_page"])
if(curr_page == 0)
return
if(curr_page == 1)
- src.screen = 0
+ screen = 0
else
- if(curr_page == src.pages+1) //we're at the end, let's go back to the middle.
- src.screen = 1
- src.curr_page--
- playsound(src.loc, "pageturn", 50, 1)
+ if(curr_page == pages+1) //we're at the end, let's go back to the middle.
+ screen = 1
+ curr_page--
+ playsound(loc, "pageturn", 50, 1)
- if(istype(src.loc, /mob))
- src.attack_self(src.loc)
+ if(istype(loc, /mob))
+ attack_self(loc)
-obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/pen))
- if(src.scribble_page == src.curr_page)
+ if(scribble_page == curr_page)
to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you? ")
else
var/s = strip_html( input(user, "Write something", "Newspaper", "") )
s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN))
if(!s)
return
- if(!in_range(src, usr) && src.loc != usr)
+ if(!in_range(src, usr) && loc != usr)
return
- src.scribble_page = src.curr_page
- src.scribble = s
- src.attack_self(user)
+ scribble_page = curr_page
+ scribble = s
+ attack_self(user)
return
////////////////////////////////////helper procs
-
-/obj/machinery/newscaster/proc/scan_user(mob/living/user as mob)
- if(istype(user,/mob/living/carbon/human)) //User is a human
+/obj/machinery/newscaster/proc/scan_user(mob/user)
+ if(ishuman(user)) //User is a human
var/mob/living/carbon/human/human_user = user
if(human_user.wear_id) //Newscaster scans you
- if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo!
+ if(istype(human_user.wear_id, /obj/item/device/pda)) //autorecognition, woo!
var/obj/item/device/pda/P = human_user.wear_id
if(P.id)
- src.scanned_user = "[P.id.registered_name] ([P.id.assignment])"
+ scanned_user = "[P.id.registered_name] ([P.id.assignment])"
else
- src.scanned_user = "Unknown"
- else if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
+ scanned_user = "Unknown"
+ else if(istype(human_user.wear_id, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/ID = human_user.wear_id
- src.scanned_user ="[ID.registered_name] ([ID.assignment])"
+ scanned_user = "[ID.registered_name] ([ID.assignment])"
else
- src.scanned_user ="Unknown"
+ scanned_user = "Unknown"
else
- src.scanned_user ="Unknown"
- else
+ scanned_user = "Unknown"
+ else if(issilicon(user))
var/mob/living/silicon/ai_user = user
- src.scanned_user = "[ai_user.name] ([ai_user.job])"
+ scanned_user = "[ai_user.name] ([ai_user.job])"
+ else
+ scanned_user = "Unknown"
+/obj/machinery/newscaster/proc/can_scan(mob/user)
+ if(ishuman(user) || issilicon(user))
+ return TRUE
+ return FALSE
/obj/machinery/newscaster/proc/print_paper()
feedback_inc("newscaster_newspapers_printed",1)
@@ -971,7 +784,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa
if(news_network.wanted_issue)
NEWSPAPER.important_message = news_network.wanted_issue
NEWSPAPER.loc = get_turf(src)
- src.paper_remaining--
+ paper_remaining--
return
//Removed for now so these aren't even checked every tick. Left this here in-case Agouri needs it later.
@@ -982,14 +795,14 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa
if(news_call)
atom_say("[news_call]!")
- src.alert = 1
- src.update_icon()
+ alert = 1
+ update_icon()
spawn(300)
- src.alert = 0
- src.update_icon()
+ alert = 0
+ update_icon()
if(!silence)
- playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1)
+ playsound(loc, 'sound/machines/twobeep.ogg', 75, 1)
else
atom_say("Attention! Wanted issue distributed!")
- playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
+ playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
return
diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm
index 734bb09f60b..e98c4e90c30 100644
--- a/code/game/machinery/overview.dm
+++ b/code/game/machinery/overview.dm
@@ -258,7 +258,7 @@
else
colour = rgb(255,128,128)
- //if(istype(AM, /obj/effect/blob))
+ //if(istype(AM, /obj/structure/blob))
// colour = rgb(255,0,255)
var/area/A = T.loc
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index bf2eedeaf23..c83d32e7ac7 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -49,7 +49,7 @@
icon = 'icons/obj/pipe-item.dmi'
icon_state = "simple"
item_state = "buildpipe"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
level = 2
var/flipped = 0
@@ -153,11 +153,11 @@
src.pipe_type = PIPE_OMNI_FILTER
else if(istype(make_from, /obj/machinery/atmospherics/binary/circulator))
src.pipe_type = PIPE_CIRCULATOR
-
+
var/obj/machinery/atmospherics/trinary/triP = make_from
if(istype(triP) && triP.flipped)
src.flipped = 1
-
+
var/obj/machinery/atmospherics/binary/circulator/circP = make_from
if(istype(circP) && circP.side == circP.CIRC_RIGHT)
src.flipped = 1
@@ -282,7 +282,7 @@
PIPE_INSULATED_BENT, \
PIPE_SUPPLY_BENT, \
PIPE_SCRUBBERS_BENT)
-
+
// rotate the pipe item clockwise
/obj/item/pipe/verb/rotate()
@@ -292,7 +292,7 @@
if( usr.stat || usr.restrained() )
return
-
+
if(pipe_type == PIPE_CIRCULATOR)
flip()
return
@@ -302,7 +302,7 @@
fixdir()
return
-
+
/obj/item/pipe/verb/flip()
set category = "Object"
set name = "Flip Pipe"
@@ -342,11 +342,11 @@
/obj/item/pipe/proc/get_pipe_dir()
if(!dir)
return 0
-
+
var/direct = dir
if(flipped)
- direct = turn(dir, 45)
-
+ direct = turn(dir, 45)
+
var/flip = turn(direct, 180)
var/cw = turn(direct, -90)
var/acw = turn(direct, 90)
@@ -415,7 +415,7 @@
return dir
else
return 0
-
+
/obj/item/pipe/proc/unflip(var/direction)
if(!(direction in cardinal))
return turn(direction, 45)
@@ -440,12 +440,12 @@
if(!istype(W, /obj/item/weapon/wrench))
return ..()
-
+
if(!isturf(src.loc))
return 1
fixdir()
-
+
var/pipe_dir = get_pipe_dir()
for(var/obj/machinery/atmospherics/M in src.loc)
@@ -456,79 +456,79 @@
switch(pipe_type) //What kind of heartless person thought of doing this?
if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT)
var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc )
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_SUPPLY_STRAIGHT, PIPE_SUPPLY_BENT)
var/obj/machinery/atmospherics/pipe/simple/hidden/supply/P = new( src.loc )
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_SCRUBBERS_STRAIGHT, PIPE_SCRUBBERS_BENT)
var/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers/P = new( src.loc )
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_UNIVERSAL)
var/obj/machinery/atmospherics/pipe/simple/hidden/universal/P = new( src.loc )
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_HE_STRAIGHT, PIPE_HE_BENT)
var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc )
P.initialize_directions_he = pipe_dir
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_CONNECTOR) // connector
var/obj/machinery/atmospherics/unary/portables_connector/C = new( src.loc )
if(pipename)
C.name = pipename
- C.construction(dir, pipe_dir, color)
+ C.on_construction(dir, pipe_dir, color)
if(PIPE_MANIFOLD) //manifold
var/obj/machinery/atmospherics/pipe/manifold/M = new( src.loc )
- M.construction(dir, pipe_dir, color)
+ M.on_construction(dir, pipe_dir, color)
if(PIPE_SUPPLY_MANIFOLD) //manifold
var/obj/machinery/atmospherics/pipe/manifold/hidden/supply/M = new( src.loc )
- M.construction(dir, pipe_dir, color)
+ M.on_construction(dir, pipe_dir, color)
if(PIPE_SCRUBBERS_MANIFOLD) //manifold
var/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers/M = new( src.loc )
- M.construction(dir, pipe_dir, color)
+ M.on_construction(dir, pipe_dir, color)
if(PIPE_MANIFOLD4W) //4-way manifold
var/obj/machinery/atmospherics/pipe/manifold4w/M = new( src.loc )
- M.construction(dir, pipe_dir, color)
-
+ M.on_construction(dir, pipe_dir, color)
+
if(PIPE_SUPPLY_MANIFOLD4W) //4-way manifold
var/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply/M = new( src.loc )
- M.construction(dir, pipe_dir, color)
+ M.on_construction(dir, pipe_dir, color)
if(PIPE_SCRUBBERS_MANIFOLD4W) //4-way manifold
var/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers/M = new( src.loc )
- M.construction(dir, pipe_dir, color)
+ M.on_construction(dir, pipe_dir, color)
if(PIPE_JUNCTION)
var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc )
P.initialize_directions_he = src.get_hdir()
- P.construction(dir, get_pdir(), color)
+ P.on_construction(dir, get_pdir(), color)
if(PIPE_UVENT) //unary vent
var/obj/machinery/atmospherics/unary/vent_pump/V = new( src.loc )
- V.construction(dir, pipe_dir, color)
+ V.on_construction(dir, pipe_dir, color)
if(PIPE_MVALVE) //manual valve
var/obj/machinery/atmospherics/binary/valve/V = new( src.loc)
if(pipename)
V.name = pipename
- V.construction(dir, get_pdir(), color)
-
+ V.on_construction(dir, get_pdir(), color)
+
if(PIPE_DVALVE)
var/obj/machinery/atmospherics/binary/valve/digital/V = new( src.loc )
if(pipename)
V.name = pipename
- V.construction(dir, get_pdir(), color)
-
+ V.on_construction(dir, get_pdir(), color)
+
if(PIPE_PUMP) //gas pump
var/obj/machinery/atmospherics/binary/pump/P = new(src.loc)
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_TVALVE, PIPE_DTVALVE)
var/obj/machinery/atmospherics/trinary/P
@@ -544,86 +544,86 @@
P.flipped = flipped
if(pipename)
P.name = pipename
- P.construction(unflip(dir), pipe_dir, color)
-
+ P.on_construction(unflip(dir), pipe_dir, color)
+
if(PIPE_CIRCULATOR) //circulator
var/obj/machinery/atmospherics/binary/circulator/C = new(src.loc)
if(flipped)
C.side = C.CIRC_RIGHT
if(pipename)
C.name = pipename
- C.construction(C.dir, C.initialize_directions, color)
+ C.on_construction(C.dir, C.initialize_directions, color)
if(PIPE_SCRUBBER) //scrubber
var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc)
if(pipename)
S.name = pipename
- S.construction(dir, pipe_dir, color)
+ S.on_construction(dir, pipe_dir, color)
if(PIPE_INSULATED_STRAIGHT, PIPE_INSULATED_BENT)
var/obj/machinery/atmospherics/pipe/simple/insulated/P = new( src.loc )
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_CAP)
var/obj/machinery/atmospherics/pipe/cap/C = new(src.loc)
- C.construction(dir, pipe_dir, color)
+ C.on_construction(dir, pipe_dir, color)
if(PIPE_SUPPLY_CAP)
var/obj/machinery/atmospherics/pipe/cap/hidden/supply/C = new(src.loc)
- C.construction(dir, pipe_dir, color)
+ C.on_construction(dir, pipe_dir, color)
if(PIPE_SCRUBBERS_CAP)
var/obj/machinery/atmospherics/pipe/cap/hidden/scrubbers/C = new(src.loc)
- C.construction(dir, pipe_dir, color)
+ C.on_construction(dir, pipe_dir, color)
if(PIPE_PASSIVE_GATE) //passive gate
var/obj/machinery/atmospherics/binary/passive_gate/P = new(src.loc)
if(pipename)
P.name = pipename
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_VOLUME_PUMP) //volume pump
var/obj/machinery/atmospherics/binary/volume_pump/P = new(src.loc)
if(pipename)
P.name = pipename
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_HEAT_EXCHANGE) // heat exchanger
var/obj/machinery/atmospherics/unary/heat_exchanger/C = new( src.loc )
if(pipename)
C.name = pipename
- C.construction(dir, pipe_dir, color)
+ C.on_construction(dir, pipe_dir, color)
if(PIPE_INJECTOR) // air injector
var/obj/machinery/atmospherics/unary/outlet_injector/P = new( src.loc )
if(pipename)
P.name = pipename
- P.construction(dir, pipe_dir, color)
-
+ P.on_construction(dir, pipe_dir, color)
+
if(PIPE_DP_VENT)
var/obj/machinery/atmospherics/binary/dp_vent_pump/P = new(src.loc)
if(pipename)
P.name = pipename
- P.construction(dir, pipe_dir, color)
-
+ P.on_construction(dir, pipe_dir, color)
+
if(PIPE_PASV_VENT)
var/obj/machinery/atmospherics/unary/passive_vent/P = new(src.loc)
if(pipename)
P.name = pipename
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
if(PIPE_OMNI_MIXER)
var/obj/machinery/atmospherics/omni/mixer/P = new(loc)
- P.construction(dir, pipe_dir, color)
-
+ P.on_construction(dir, pipe_dir, color)
+
if(PIPE_OMNI_FILTER)
var/obj/machinery/atmospherics/omni/filter/P = new(loc)
- P.construction(dir, pipe_dir, color)
+ P.on_construction(dir, pipe_dir, color)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] fastens the [src].", \
- "\blue You have fastened the [src].", \
+ "You have fastened the [src]. ", \
"You hear ratchet.")
qdel(src) // remove the pipe item
@@ -635,7 +635,7 @@
icon = 'icons/obj/pipe-item.dmi'
icon_state = "meter"
item_state = "buildpipe"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
..()
@@ -643,11 +643,11 @@
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(!locate(/obj/machinery/atmospherics/pipe, src.loc))
- to_chat(user, "\red You need to fasten it to a pipe")
+ to_chat(user, "You need to fasten it to a pipe ")
return 1
- new/obj/machinery/meter( src.loc )
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You have fastened the meter to the pipe")
+ new /obj/machinery/meter(loc)
+ playsound(src.loc, W.usesound, 50, 1)
+ to_chat(user, "You have fastened the meter to the pipe. ")
qdel(src)
/obj/item/pipe_gsensor
@@ -656,15 +656,15 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "gsensor0"
item_state = "buildpipe"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/pipe_gsensor/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
..()
if(!istype(W, /obj/item/weapon/wrench))
return ..()
new/obj/machinery/air_sensor( src.loc )
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You have fastened the gas sensor")
+ playsound(get_turf(src), W.usesound, 50, 1)
+ to_chat(user, "You have fastened the gas sensor. ")
qdel(src)
#undef PIPE_SIMPLE_STRAIGHT
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 34f41e2a1b5..37836e8f798 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -7,9 +7,16 @@
var/unwrenched = 0
var/wait = 0
-/obj/machinery/pipedispenser/attack_hand(user as mob)
+/obj/machinery/pipedispenser/attack_hand(mob/user)
if(..())
- return
+ return 1
+
+ interact(user)
+
+/obj/machinery/pipedispenser/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/pipedispenser/interact(mob/user)
var/dat = {"
Regular pipes:
Pipe
@@ -65,21 +72,19 @@
popup.set_content(dat)
popup.open(0)
onclose(user, "pipedispenser")
- return
/obj/machinery/pipedispenser/Topic(href, href_list)
- if(..())
- return
- if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr << browse(null, "window=pipedispenser")
- return
+ if(..() || unwrenched)
+ return 1
+
usr.set_machine(src)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
+
if(href_list["make"])
if(!wait)
var/p_type = text2num(href_list["make"])
var/p_dir = text2num(href_list["dir"])
- var/obj/item/pipe/P = new (/*usr.loc*/ src.loc, pipe_type=p_type, dir=p_dir)
+ var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir)
P.update()
P.add_fingerprint(usr)
wait = 1
@@ -87,50 +92,49 @@
wait = 0
if(href_list["makemeter"])
if(!wait)
- new /obj/item/pipe_meter(/*usr.loc*/ src.loc)
+ new /obj/item/pipe_meter(loc)
wait = 1
spawn(15)
wait = 0
if(href_list["makegsensor"])
if(!wait)
- new /obj/item/pipe_gsensor(/*usr.loc*/ src.loc)
+ new /obj/item/pipe_gsensor(loc)
wait = 1
spawn(15)
wait = 0
- return
/obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor))
- to_chat(usr, "\blue You put [W] back to [src].")
+ to_chat(usr, "You put [W] back to [src]. ")
user.drop_item()
qdel(W)
return
else if(istype(W, /obj/item/weapon/wrench))
if(unwrenched==0)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You begin to unfasten \the [src] from the floor...")
- if(do_after(user, 40, target = src))
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src] from the floor... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
- "\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \
+ "You have unfastened \the [src]. Now it can be pulled somewhere else. ", \
"You hear ratchet.")
- src.anchored = 0
- src.stat |= MAINT
- src.unwrenched = 1
+ anchored = 0
+ stat |= MAINT
+ unwrenched = 1
if(usr.machine==src)
usr << browse(null, "window=pipedispenser")
else /*if(unwrenched==1)*/
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You begin to fasten \the [src] to the floor...")
- if(do_after(user, 20, target = src))
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "You begin to fasten \the [src] to the floor... ")
+ if(do_after(user, 20 * W.toolspeed, target = src))
user.visible_message( \
"[user] fastens \the [src].", \
- "\blue You have fastened \the [src]. Now it can dispense pipes.", \
+ "You have fastened \the [src]. Now it can dispense pipes. ", \
"You hear ratchet.")
- src.anchored = 1
- src.stat &= ~MAINT
- src.unwrenched = 0
+ anchored = 1
+ stat &= ~MAINT
+ unwrenched = 0
power_change()
else
return ..()
@@ -143,21 +147,12 @@
density = 1
anchored = 1.0
-/*
-//Allow you to push disposal pipes into it (for those with density 1)
-/obj/machinery/pipedispenser/disposal/Crossed(var/obj/structure/disposalconstruct/pipe as obj)
- if(istype(pipe) && !pipe.anchored)
- qdel(pipe)
-
-Nah
-*/
-
//Allow you to drag-drop disposal pipes into it
-/obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe as obj, mob/usr as mob)
- if(!usr.canmove || usr.stat || usr.restrained())
+/obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe, mob/usr)
+ if(usr.incapacitated())
return
- if(!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 )
+ if(!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src, pipe) > 1 )
return
if(pipe.anchored)
@@ -165,10 +160,16 @@ Nah
qdel(pipe)
-/obj/machinery/pipedispenser/disposal/attack_hand(user as mob)
+/obj/machinery/pipedispenser/disposal/attack_hand(mob/user)
if(..())
return
-
+
+ interact(user)
+
+/obj/machinery/pipedispenser/disposal/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/pipedispenser/disposal/interact(mob/user)
var/dat = {"Disposal Pipes
Pipe
Bent Pipe
@@ -183,47 +184,39 @@ Nah
var/datum/browser/popup = new(user, "pipedispenser", name, 400, 400)
popup.set_content(dat)
popup.open()
- return
-
-// 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk
-
/obj/machinery/pipedispenser/disposal/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
- src.add_fingerprint(usr)
- if(href_list["dmake"])
- if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr << browse(null, "window=pipedispenser")
- return
- if(!wait)
- var/p_type = text2num(href_list["dmake"])
- var/obj/structure/disposalconstruct/C = new (src.loc)
- switch(p_type)
- if(0)
- C.ptype = 0
- if(1)
- C.ptype = 1
- if(2)
- C.ptype = 2
- if(3)
- C.ptype = 4
- if(4)
- C.ptype = 5
- if(5)
- C.ptype = 6
- C.density = 1
- if(6)
- C.ptype = 7
- C.density = 1
- if(7)
- C.ptype = 8
- C.density = 1
- C.add_fingerprint(usr)
- C.update()
- wait = 1
- spawn(15)
- wait = 0
- return
+ if(..() || unwrenched)
+ return 1
+ usr.set_machine(src)
+ add_fingerprint(usr)
+
+ if(!wait)
+ var/p_type = text2num(href_list["dmake"])
+ var/obj/structure/disposalconstruct/C = new (loc)
+ switch(p_type)
+ if(0)
+ C.ptype = 0
+ if(1)
+ C.ptype = 1
+ if(2)
+ C.ptype = 2
+ if(3)
+ C.ptype = 4
+ if(4)
+ C.ptype = 5
+ if(5)
+ C.ptype = 6
+ C.density = 1
+ if(6)
+ C.ptype = 7
+ C.density = 1
+ if(7)
+ C.ptype = 8
+ C.density = 1
+ C.add_fingerprint(usr)
+ C.update()
+ wait = 1
+ spawn(15)
+ wait = 0
\ No newline at end of file
diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm
index c0ca39c3e12..af24a856115 100644
--- a/code/game/machinery/podmen.dm
+++ b/code/game/machinery/podmen.dm
@@ -76,9 +76,9 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
if(beingharvested)
- to_chat(user, ("\red You can only harvest the pod once!"))
+ to_chat(user, ("You can only harvest the pod once! "))
else
- user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...")
+ user.visible_message("[user] carefully begins to open the pod... ","You carefully begin to open the pod... ")
beingharvested = 1
//If a sample is injected (and revival is allowed) the plant will be controlled by the original donor.
@@ -123,7 +123,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
ticker.mode:update_all_cult_icons() //So the icon actually appears
// -- End mode specific stuff
- to_chat(podman, "\green You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark. ")
+ to_chat(podman, "You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark. ")
if(source && ckey && podman.ckey == ckey)
to_chat(podman, "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake. ")
to_chat(podman, "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders. ")
@@ -132,5 +132,5 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
else
new /mob/living/carbon/monkey/diona(parent.loc)
- parent.visible_message("\blue The pod disgorges a fully-formed plant creature!")
+ parent.visible_message("The pod disgorges a fully-formed plant creature! ")
parent.update_tray()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 17fe32f39ec..0f19d5c42ff 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -57,7 +57,15 @@
var/screen = 0 // Screen 0: main control, screen 1: access levels
var/one_access = 0 // Determines if access control is set to req_one_access or req_access
+ var/syndicate = 0 //is the turret a syndicate turret?
+ var/faction = ""
+ var/emp_vulnerable = 1 // Can be empd
+ var/scan_range = 7
+ var/always_up = 0 //Will stay active
+ var/has_cover = 1 //Hides the cover
+
/obj/machinery/porta_turret/centcom
+ name = "Centcom Turret"
enabled = 0
ailock = 1
check_synth = 0
@@ -67,6 +75,14 @@
check_weapons = 1
check_anomalies = 1
+/obj/machinery/porta_turret/centcom/pulse
+ name = "Pulse Turret"
+ health = 200
+ enabled = 1
+ lethal = 1
+ req_access = list(access_cent_commander)
+ installation = /obj/item/weapon/gun/energy/pulse/turret
+
/obj/machinery/porta_turret/stationary
ailock = 1
lethal = 1
@@ -87,8 +103,7 @@
setup()
/obj/machinery/porta_turret/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
return ..()
/obj/machinery/porta_turret/centcom/New()
@@ -99,7 +114,7 @@
one_access = 0
/obj/machinery/porta_turret/proc/setup()
- var/obj/item/weapon/gun/energy/E= new installation //All energy-based weapons are applicable
+ var/obj/item/weapon/gun/energy/E = new installation //All energy-based weapons are applicable
var/obj/item/ammo_casing/shottype = E.ammo_type[1]
projectile = shottype.projectile_type
@@ -143,6 +158,10 @@
eshot_sound = 'sound/weapons/Laser.ogg'
egun = 1
+ if(/obj/item/weapon/gun/energy/pulse/turret)
+ eprojectile = /obj/item/projectile/beam/pulse
+ eshot_sound = 'sound/weapons/pulse.ogg'
+
var/list/turret_icons
/obj/machinery/porta_turret/update_icon()
if(!turret_icons)
@@ -206,10 +225,10 @@ var/list/turret_icons
data["screen"] = screen
data["locked"] = locked
data["enabled"] = enabled
- data["is_lethal"] = 1
+ data["lethal_control"] = !syndicate ? 1 : 0
data["lethal"] = lethal
- if(data["access"])
+ if(data["access"] && !syndicate)
var/settings[0]
settings[++settings.len] = list("category" = "Neutralize All Non-Synthetics", "setting" = "check_synth", "value" = check_synth)
settings[++settings.len] = list("category" = "Check Weapon Authorization", "setting" = "check_weapons", "value" = check_weapons)
@@ -219,18 +238,19 @@ var/list/turret_icons
settings[++settings.len] = list("category" = "Check Misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
data["settings"] = settings
- data["one_access"] = one_access
- var/accesses[0]
- var/list/access_list = get_all_accesses()
- for(var/access in access_list)
- var/name = get_access_desc(access)
- var/active
- if(one_access)
- active = (access in req_one_access)
- else
- active = (access in req_access)
- accesses[++accesses.len] = list("name" = name, "active" = active, "number" = access)
- data["accesses"] = accesses
+ if(!syndicate)
+ data["one_access"] = one_access
+ var/accesses[0]
+ var/list/access_list = get_all_accesses()
+ for(var/access in access_list)
+ var/name = get_access_desc(access)
+ var/active
+ if(one_access)
+ active = (access in req_one_access)
+ else
+ active = (access in req_access)
+ accesses[++accesses.len] = list("name" = name, "active" = active, "number" = access)
+ data["accesses"] = accesses
return data
/obj/machinery/porta_turret/proc/HasController()
@@ -259,6 +279,8 @@ var/list/turret_icons
var/value = text2num(href_list["value"])
if(href_list["command"] == "enable")
enabled = value
+ else if(syndicate)
+ return 1
else if(href_list["command"] == "screen")
screen = value
else if(href_list["command"] == "lethal")
@@ -276,11 +298,12 @@ var/list/turret_icons
else if(href_list["command"] == "check_anomalies")
check_anomalies = value
- if(href_list["one_access"])
- toggle_one_access(href_list["one_access"])
+ if(!syndicate)
+ if(href_list["one_access"])
+ toggle_one_access(href_list["one_access"])
- if(href_list["access"])
- toggle_access(href_list["access"])
+ if(href_list["access"])
+ toggle_access(href_list["access"])
return 1
@@ -311,7 +334,7 @@ var/list/turret_icons
req_access += required
/obj/machinery/porta_turret/power_change()
- if(powered())
+ if(powered() || !use_power)
stat &= ~NOPOWER
update_icon()
else
@@ -321,12 +344,12 @@ var/list/turret_icons
/obj/machinery/porta_turret/attackby(obj/item/I, mob/user)
- if(stat & BROKEN)
+ if((stat & BROKEN) && !syndicate)
if(istype(I, /obj/item/weapon/crowbar))
//If the turret is destroyed, you can remove it with a crowbar to
//try and salvage its components
to_chat(user, "You begin prying the metal coverings off. ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * I.toolspeed, target = src))
if(prob(70))
to_chat(user, "You remove the turret and salvage some components. ")
if(installation)
@@ -358,15 +381,15 @@ var/list/turret_icons
)
wrenching = 1
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * I.toolspeed, target = src))
//This code handles moving the turret around. After all, it's a portable turret!
if(!anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
anchored = 1
update_icon()
to_chat(user, "You secure the exterior bolts on the turret. ")
else if(anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
anchored = 0
to_chat(user, "You unsecure the exterior bolts on the turret. ")
update_icon()
@@ -438,13 +461,12 @@ var/list/turret_icons
return
health -= force
- if(force > 5 && prob(45))
+ if(force > 5 && prob(45) && spark_system)
spark_system.start()
if(health <= 0)
die() //the death process :(
/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj)
-
if(Proj.damage_type == STAMINA)
return
@@ -461,7 +483,7 @@ var/list/turret_icons
take_damage(Proj.damage)
/obj/machinery/porta_turret/emp_act(severity)
- if(enabled)
+ if(enabled && emp_vulnerable)
//if the turret is on, the EMP no matter how severe disables the turret for a while
//and scrambles its settings, with a slight chance of having an emag effect
check_arrest = prob(50)
@@ -494,7 +516,8 @@ var/list/turret_icons
/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
health = 0
stat |= BROKEN //enables the BROKEN bit
- spark_system.start() //creates some sparks because they look cool
+ if(spark_system)
+ spark_system.start() //creates some sparks because they look cool
update_icon()
/obj/machinery/porta_turret/process()
@@ -503,34 +526,42 @@ var/list/turret_icons
set background = BACKGROUND_ENABLED
if(stat & (NOPOWER|BROKEN))
- //if the turret has no power or is broken, make the turret pop down if it hasn't already
- popDown()
+ if(!always_up)
+ //if the turret has no power or is broken, make the turret pop down if it hasn't already
+ popDown()
return
if(!enabled)
- //if the turret is off, make it pop down
- popDown()
+ if(!always_up)
+ //if the turret is off, make it pop down
+ popDown()
return
var/list/targets = list() //list of primary targets
var/list/secondarytargets = list() //targets that are least important
- for(var/obj/mecha/ME in view(7,src))
+ for(var/obj/mecha/ME in view(scan_range,src))
assess_and_assign(ME.occupant, targets, secondarytargets)
- for(var/obj/spacepod/SP in view(7,src))
+ for(var/obj/spacepod/SP in view(scan_range,src))
assess_and_assign(SP.pilot, targets, secondarytargets)
- for(var/obj/vehicle/T in view(7,src))
+ for(var/obj/vehicle/T in view(scan_range,src))
assess_and_assign(T.buckled_mob, targets, secondarytargets)
- for(var/mob/living/C in view(7,src)) //loops through all living lifeforms in view
+ for(var/mob/living/C in view(scan_range,src)) //loops through all living lifeforms in view
assess_and_assign(C, targets, secondarytargets)
if(!tryToShootAt(targets))
if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets
- spawn()
- popDown() // no valid targets, close the cover
+ if(!always_up)
+ spawn()
+ popDown() // no valid targets, close the cover
+
+/obj/machinery/porta_turret/proc/in_faction(mob/living/target)
+ if(!(faction in target.faction))
+ return 0
+ return 1
/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets)
switch(assess_living(L))
@@ -552,18 +583,21 @@ var/list/turret_icons
if(!L)
return TURRET_NOT_TARGET
- if(!emagged && (issilicon(L) || isbot(L))) // Don't target silica
+ if(!emagged && !syndicate && (issilicon(L) || isbot(L))) // Don't target silica
return TURRET_NOT_TARGET
if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really
return TURRET_NOT_TARGET //move onto next potential victim!
- if(get_dist(src, L) > 7) //if it's too far away, why bother?
+ if(get_dist(src, L) > scan_range) //if it's too far away, why bother?
return TURRET_NOT_TARGET
if(emagged) // If emagged not even the dead get a rest
return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET
+ if(in_faction(L))
+ return TURRET_NOT_TARGET
+
if(lethal && locate(/mob/living/silicon/ai) in get_turf(L)) //don't accidentally kill the AI!
return TURRET_NOT_TARGET
@@ -648,18 +682,19 @@ var/list/turret_icons
return ..()
-/obj/machinery/porta_turret/proc/set_raised_raising(var/raised, var/raising)
- src.raised = raised
- src.raising = raising
- density = raised || raising
+/obj/machinery/porta_turret/proc/set_raised_raising(var/is_raised, var/is_raising)
+ raised = is_raised
+ raising = is_raising
+ density = is_raised || is_raising
/obj/machinery/porta_turret/proc/target(var/mob/living/target)
if(disabled)
return
if(target)
last_target = target
- spawn()
- popUp() //pop the turret up if it's not already up.
+ if(has_cover)
+ spawn()
+ popUp() //pop the turret up if it's not already up.
dir = get_dir(src, target) //even if you can't shoot, follow the target
spawn()
shootAt(target)
@@ -667,7 +702,7 @@ var/list/turret_icons
return
/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
- if(!raised) //the turret has to be raised in order to fire - makes sense, right?
+ if(!raised && has_cover) //the turret has to be raised in order to fire - makes sense, right?
return
//any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate
@@ -719,9 +754,9 @@ var/list/turret_icons
/obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC)
if(controllock)
return
- src.enabled = TC.enabled
- src.lethal = TC.lethal
- src.iconholder = TC.lethal
+ enabled = TC.enabled
+ lethal = TC.lethal
+ iconholder = TC.lethal
check_synth = TC.check_synth
check_access = TC.check_access
@@ -731,7 +766,7 @@ var/list/turret_icons
check_anomalies = TC.check_anomalies
ailock = TC.ailock
- src.power_change()
+ power_change()
/*
Portable turret constructions
@@ -755,14 +790,14 @@ var/list/turret_icons
switch(build_step)
if(0) //first step
if(istype(I, /obj/item/weapon/wrench) && !anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
to_chat(user, "You secure the external bolts. ")
anchored = 1
build_step = 1
return
else if(istype(I, /obj/item/weapon/crowbar) && !anchored)
- playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ playsound(loc, I.usesound, 75, 1)
to_chat(user, "You dismantle the turret construction. ")
new /obj/item/stack/sheet/metal( loc, 5)
qdel(src) // qdel
@@ -780,7 +815,7 @@ var/list/turret_icons
return
else if(istype(I, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, I.usesound, 75, 1)
to_chat(user, "You unfasten the external bolts. ")
anchored = 0
build_step = 0
@@ -789,7 +824,7 @@ var/list/turret_icons
if(2)
if(istype(I, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
to_chat(user, "You bolt the metal armor into place. ")
build_step = 3
return
@@ -802,8 +837,8 @@ var/list/turret_icons
to_chat(user, "You need more fuel to complete this task. ")
return
- playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(5, user)) return
build_step = 1
to_chat(user, "You remove the turret's interior metal armor.")
@@ -834,7 +869,7 @@ var/list/turret_icons
return
else if(istype(I, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
to_chat(user, "You remove the turret's metal armor bolts. ")
build_step = 2
return
@@ -853,7 +888,7 @@ var/list/turret_icons
if(5)
if(istype(I, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
build_step = 6
to_chat(user, "You close the internal access hatch. ")
return
@@ -871,7 +906,7 @@ var/list/turret_icons
return
else if(istype(I, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
build_step = 5
to_chat(user, "You open the internal access hatch. ")
return
@@ -883,8 +918,8 @@ var/list/turret_icons
if(WT.get_fuel() < 5)
to_chat(user, "You need more fuel to complete this task. ")
- playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 30 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(5, user))
return
build_step = 8
@@ -901,7 +936,7 @@ var/list/turret_icons
qdel(src) // qdel
else if(istype(I, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ playsound(loc, I.usesound, 75, 1)
to_chat(user, "You pry off the turret's exterior armor. ")
new /obj/item/stack/sheet/metal(loc, 2)
build_step = 6
@@ -944,3 +979,87 @@ var/list/turret_icons
/atom/movable/porta_turret_cover
icon = 'icons/obj/turrets.dmi'
+
+// Syndicate turrets
+/obj/machinery/porta_turret/syndicate
+ projectile = /obj/item/projectile/bullet
+ eprojectile = /obj/item/projectile/bullet
+ shot_sound = 'sound/weapons/Gunshot.ogg'
+ eshot_sound = 'sound/weapons/Gunshot.ogg'
+
+ icon_state = "syndieturret0"
+ var/icon_state_initial = "syndieturret0"
+ var/icon_state_active = "syndieturret1"
+ var/icon_state_destroyed = "syndieturret2"
+
+ syndicate = 1
+ installation = null
+ always_up = 1
+ use_power = 0
+ has_cover = 0
+ raised = 1
+ scan_range = 9
+
+ faction = "syndicate"
+ emp_vulnerable = 0
+
+ lethal = 1
+ check_arrest = 0
+ check_records = 0
+ check_weapons = 0
+ check_access = 0
+ check_anomalies = 1
+ check_synth = 1
+ ailock = 1
+
+/obj/machinery/porta_turret/syndicate/New()
+ ..()
+ if(req_one_access && req_one_access.len)
+ req_one_access.Cut()
+ req_access = list(access_syndicate)
+ one_access = 0
+
+/obj/machinery/porta_turret/syndicate/update_icon()
+ if(stat & BROKEN)
+ icon_state = icon_state_destroyed
+ else if(enabled)
+ icon_state = icon_state_active
+ else
+ icon_state = icon_state_initial
+
+/obj/machinery/porta_turret/syndicate/setup()
+ return
+
+/obj/machinery/porta_turret/syndicate/assess_perp(mob/living/carbon/human/perp)
+ return 10 //Syndicate turrets shoot everything not in their faction
+
+/obj/machinery/porta_turret/syndicate/pod
+ health = 40
+ projectile = /obj/item/projectile/bullet/weakbullet3
+ eprojectile = /obj/item/projectile/bullet/weakbullet3
+
+/obj/machinery/porta_turret/syndicate/interior
+ name = "machine gun turret (.45)"
+ desc = "Syndicate interior defense turret chambered for .45 rounds. Designed to down intruders without damaging the hull."
+ projectile = /obj/item/projectile/bullet/midbullet
+ eprojectile = /obj/item/projectile/bullet/midbullet
+
+/obj/machinery/porta_turret/syndicate/exterior
+ name = "machine gun turret (7.62)"
+ desc = "Syndicate exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."
+ projectile = /obj/item/projectile/bullet
+ eprojectile = /obj/item/projectile/bullet/midbullet
+
+/obj/machinery/porta_turret/syndicate/grenade
+ name = "mounted grenade launcher (40mm)"
+ desc = "Syndicate 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."
+ projectile = /obj/item/projectile/bullet/a40mm
+ eprojectile = /obj/item/projectile/bullet/midbullet
+
+/obj/machinery/porta_turret/syndicate/assault_pod
+ name = "machine gun turret (4.6x30mm)"
+ desc = "Syndicate exterior defense turret chambered for 4.6x30mm rounds. Designed to be fitted to assault pods, it uses low calliber bullets to save space."
+ health = 100
+ projectile = /obj/item/projectile/bullet/weakbullet3
+ eprojectile = /obj/item/projectile/bullet/midbullet
+
diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm
index e41dfd2f79f..c86d745c05a 100644
--- a/code/game/machinery/programmable_unloader.dm
+++ b/code/game/machinery/programmable_unloader.dm
@@ -198,12 +198,12 @@
/obj/machinery/programmable/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/weapon/wrench)) // code borrowed from pipe dispenser
if(unwrenched==0)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You begin to unfasten \the [src] from the floor...")
- if(do_after(user, 40, target = src))
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src] from the floor... ")
+ if(do_after(user, 40 * I.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
- "\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \
+ "You have unfastened \the [src]. Now it can be pulled somewhere else. ", \
"You hear ratchet.")
src.anchored = 0
src.stat |= MAINT
@@ -211,12 +211,12 @@
if(usr.machine==src)
usr << browse(null, "window=pipedispenser")
else /* unwrenched */
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "\blue You begin to fasten \the [src] to the floor...")
- if(do_after(user, 20, target = src))
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, "You begin to fasten \the [src] to the floor... ")
+ if(do_after(user, 20 * I.toolspeed, target = src))
user.visible_message( \
"[user] fastens \the [src].", \
- "\blue You fastened \the [src] into place.", \
+ "You fastened \the [src] into place. ", \
"You hear ratchet.")
src.anchored = 1
src.input = get_step(src.loc,src.indir)
@@ -237,9 +237,10 @@
to_chat(user, "You open \the [src]'s maintenance panel.")
if(istype(I,/obj/item/weapon/crowbar))
if(open)
- to_chat(user, "\blue You begin to pry out the [src]'s circuits.")
- if(do_after(user,40, target = src))
- to_chat(user, "\blue You remove the circuitboard.")
+ to_chat(user, "You begin to pry out the [src]'s circuits. ")
+ if(do_after(user, 40 * I.toolspeed, target = src))
+ to_chat(user, "You remove the circuitboard. ")
+ playsound(loc, I.usesound, 50, 1)
circuit_removed = 1
use_power = 0
on = 0
@@ -515,7 +516,7 @@
if(damage < 5)
visible_message("[H] gives \the [src] a weak punch.")
if(prob(10))
- visible_message("\blue \The [src] feints at [H], as though mocking \him.")
+ visible_message("\The [src] feints at [H], as though mocking \him. ")
else if(damage < 10)
visible_message("[H] hits \the [src] with a solid [pick("punch","jab","smack")].")
else if(damage < 15)
@@ -532,11 +533,11 @@
damage -= 5
if(newsleep)
if(emagged)
- visible_message("\red \The [src]'s lights glow a bloodthirsty red. It refuses to stop!")
+ visible_message("\The [src]'s lights glow a bloodthirsty red. It refuses to stop! ")
sleep = 0
else
sleep += newsleep
- visible_message("\blue \The [src]'s lights dim for a moment and it beeps, signifying a valid hit.")
+ visible_message("\The [src]'s lights dim for a moment and it beeps, signifying a valid hit. ")
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
return
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
new file mode 100644
index 00000000000..809d0a9b09a
--- /dev/null
+++ b/code/game/machinery/quantum_pad.dm
@@ -0,0 +1,148 @@
+/obj/machinery/quantumpad
+ name = "quantum pad"
+ desc = "A bluespace quantum-linked telepad used for teleporting objects to other quantum pads."
+ icon = 'icons/obj/telescience.dmi'
+ icon_state = "qpad-idle"
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 200
+ active_power_usage = 5000
+ var/teleport_cooldown = 400 //30 seconds base due to base parts
+ var/teleport_speed = 50
+ var/last_teleport //to handle the cooldown
+ var/teleporting = 0 //if it's in the process of teleporting
+ var/power_efficiency = 1
+ var/obj/machinery/quantumpad/linked_pad = null
+
+/obj/machinery/quantumpad/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/quantumpad(null)
+ component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ RefreshParts()
+
+/obj/machinery/quantumpad/Destroy()
+ linked_pad = null
+ return ..()
+
+/obj/machinery/quantumpad/RefreshParts()
+ var/E = 0
+ for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
+ E += C.rating
+ power_efficiency = E
+ E = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ E += M.rating
+ teleport_speed = initial(teleport_speed)
+ teleport_speed -= (E*10)
+ teleport_cooldown = initial(teleport_cooldown)
+ teleport_cooldown -= (E * 100)
+
+/obj/machinery/quantumpad/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "pad-idle-o", "qpad-idle", I))
+ return
+
+ if(panel_open)
+ if(ismultitool(I))
+ var/obj/item/device/multitool/M = I
+ M.buffer = src
+ to_chat(user, "You save the data in the [I.name]'s buffer. ")
+ return 1
+ else if(ismultitool(I))
+ var/obj/item/device/multitool/M = I
+ if(istype(M.buffer, /obj/machinery/quantumpad))
+ linked_pad = M.buffer
+ to_chat(user, "You link the [src] to the one in the [I.name]'s buffer. ")
+ return 1
+
+ if(exchange_parts(user, I))
+ return
+
+ if(default_deconstruction_crowbar(I))
+ return
+
+ return ..()
+
+/obj/machinery/quantumpad/attack_hand(mob/user)
+ if(panel_open)
+ to_chat(user, "The panel must be closed before operating this machine! ")
+ return
+
+ if(!linked_pad || qdeleted(linked_pad))
+ to_chat(user, "There is no linked pad! ")
+ return
+
+ if(world.time < last_teleport + teleport_cooldown)
+ to_chat(user, "[src] is recharging power. Please wait [round((last_teleport + teleport_cooldown - world.time) / 10)] seconds. ")
+ return
+
+ if(teleporting)
+ to_chat(user, "[src] is charging up. Please wait. ")
+ return
+
+ if(linked_pad.teleporting)
+ to_chat(user, "Linked pad is busy. Please wait. ")
+ return
+
+ if(linked_pad.stat & NOPOWER)
+ to_chat(user, "Linked pad is not responding to ping. ")
+ return
+ add_fingerprint(user)
+ doteleport(user)
+
+/obj/machinery/quantumpad/proc/sparks()
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(5, 1, get_turf(src))
+ s.start()
+
+/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
+ if(linked_pad)
+ ghost.forceMove(get_turf(linked_pad))
+
+/obj/machinery/quantumpad/proc/doteleport(mob/user)
+ if(linked_pad)
+ playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
+ teleporting = 1
+
+ spawn(teleport_speed)
+ if(!src || qdeleted(src))
+ teleporting = 0
+ return
+ if(stat & NOPOWER)
+ to_chat(user, "[src] is unpowered! ")
+ teleporting = 0
+ return
+ if(!linked_pad || qdeleted(linked_pad) || linked_pad.stat & NOPOWER)
+ to_chat(user, "Linked pad is not responding to ping. Teleport aborted. ")
+ teleporting = 0
+ return
+
+ teleporting = 0
+ last_teleport = world.time
+
+ // use a lot of power
+ use_power(10000 / power_efficiency)
+ sparks()
+ linked_pad.sparks()
+
+ flick("qpad-beam", src)
+ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
+ flick("qpad-beam", linked_pad)
+ playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
+ for(var/atom/movable/ROI in get_turf(src))
+ // if is anchored, don't let through
+ if(ROI.anchored)
+ if(isliving(ROI))
+ var/mob/living/L = ROI
+ if(L.buckled)
+ // TP people on office chairs
+ if(L.buckled.anchored)
+ continue
+ else
+ continue
+ else if(!isobserver(ROI))
+ continue
+ do_teleport(ROI, get_turf(linked_pad))
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 6db7199a7f0..94513623cfb 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -1,70 +1,78 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
/obj/machinery/recharger
name = "recharger"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "recharger0"
+ desc = "A charging dock for energy based weaponry."
anchored = 1
use_power = 1
- idle_power_usage = 40
- active_power_usage = 2500
+ idle_power_usage = 4
+ active_power_usage = 250
var/obj/item/charging = null
+ var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/modular_computer, /obj/item/weapon/rcs)
+ var/icon_state_off = "rechargeroff"
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0"
-/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob, params)
- if(istype(user,/mob/living/silicon))
- return
-
- if(!user.canUnEquip(G, 0))
- to_chat(user, "[G] is stuck to your hand, you can't put it in [src]! ")
- return
-
- if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G,/obj/item/device/laptop) || istype(G, /obj/item/weapon/rcs))
+/obj/machinery/recharger/attackby(obj/item/weapon/G, mob/user, params)
+ if(iswrench(G))
if(charging)
- return
-
- // Checks to make sure he's not in space doing it, and that the area got proper power.
- var/area/a = get_area(src)
- if(!isarea(a))
- to_chat(user, "\red The [name] blinks red as you try to insert the item!")
- return
- if(a.power_equip == 0 && a.requires_power)
- to_chat(user, "\red The [name] blinks red as you try to insert the item!")
- return
-
- if(istype(G, /obj/item/weapon/gun/energy))
- var/obj/item/weapon/gun/energy/E = G
- if(!E.can_charge)
- to_chat(user, "Your gun has no external power connector. ")
- return
-
- if(istype(G, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = G
- if(!L.stored_computer.battery)
- to_chat(user, "There's no battery in it!")
- return
-
- user.drop_item()
- G.loc = src
- charging = G
- use_power = 2
- update_icon()
- else if(istype(G, /obj/item/weapon/wrench))
- if(charging)
- to_chat(user, "\red Remove the weapon first!")
+ to_chat(user, "Remove the charging item first! ")
return
anchored = !anchored
- to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.")
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ power_change()
+ to_chat(user, "You [anchored ? "attached" : "detached"] [src]. ")
+ playsound(loc, G.usesound, 75, 1)
+ return
+
+ var/allowed = is_type_in_list(G, allowed_devices)
+
+ if(allowed)
+ if(anchored)
+ if(charging)
+ return 1
+
+ //Checks to make sure he's not in space doing it, and that the area got proper power.
+ var/area/a = get_area(src)
+ if(!isarea(a) || a.power_equip == 0)
+ to_chat(user, "[src] blinks red as you try to insert [G]. ")
+ return 1
+
+ if(istype(G, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/E = G
+ if(!E.can_charge)
+ to_chat(user, "Your gun has no external power connector. ")
+ return 1
+
+ if(!user.drop_item())
+ return 1
+ G.forceMove(src)
+ charging = G
+ use_power = 2
+ update_icon()
+ else
+ to_chat(user, "[src] isn't connected to anything! ")
+ return 1
+ else
+ ..()
+
+/obj/machinery/recharger/attack_hand(mob/user)
+ if(issilicon(user))
+ return
-/obj/machinery/recharger/attack_hand(mob/user as mob)
add_fingerprint(user)
-
if(charging)
charging.update_icon()
- charging.loc = loc
+ charging.forceMove(loc)
+ user.put_in_hands(charging)
+ charging = null
+ use_power = 1
+ update_icon()
+
+/obj/machinery/recharger/attack_tk(mob/user)
+ if(charging)
+ charging.update_icon()
+ charging.forceMove(loc)
charging = null
use_power = 1
update_icon()
@@ -73,43 +81,42 @@
if(stat & (NOPOWER|BROKEN) || !anchored)
return
+ var/using_power = 0
if(charging)
if(istype(charging, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
- E.power_supply.give(1000)
- icon_state = icon_state_charging
- use_power(2500)
- else
- icon_state = icon_state_charged
- return
+ E.power_supply.give(E.power_supply.chargerate)
+ use_power(250)
+ using_power = 1
+
+
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
- if(B.bcell && B.bcell.charge < B.bcell.maxcharge)
- B.bcell.charge += 1750
- icon_state = icon_state_charging
- use_power(2000)
- else
- icon_state = icon_state_charged
- return
- if(istype(charging, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = charging
- if(L.stored_computer.battery.charge < L.stored_computer.battery.maxcharge)
- L.stored_computer.battery.give(1000)
- icon_state = icon_state_charging
- use_power(2500)
- else
- icon_state = icon_state_charged
+ if(B.bcell)
+ if(B.bcell.give(B.bcell.chargerate))
+ use_power(200)
+ using_power = 1
+
+ if(istype(charging, /obj/item/device/modular_computer))
+ var/obj/item/device/modular_computer/C = charging
+ var/obj/item/weapon/computer_hardware/battery/battery_module = C.all_components[MC_CELL]
+ if(battery_module)
+ var/obj/item/weapon/computer_hardware/battery/B = battery_module
+ if(B.battery)
+ if(B.battery.charge < B.battery.maxcharge)
+ B.battery.give(B.battery.chargerate)
+ use_power(200)
+ using_power = 1
+
if(istype(charging, /obj/item/weapon/rcs))
var/obj/item/weapon/rcs/R = charging
- if(R.rcell && R.rcell.charge < R.rcell.maxcharge)
- R.rcell.charge += 1750
- icon_state = icon_state_charging
- use_power(2000)
- else
- icon_state = icon_state_charged
- return
+ if(R.rcell)
+ if(R.rcell.give(R.rcell.chargerate))
+ use_power(200)
+ using_power = 1
+ update_icon(using_power)
/obj/machinery/recharger/emp_act(severity)
if(stat & (NOPOWER|BROKEN) || !anchored)
@@ -127,17 +134,23 @@
B.bcell.charge = 0
..(severity)
-/obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+/obj/machinery/recharger/update_icon(using_power = 0) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+ if(stat & (NOPOWER|BROKEN) || !anchored)
+ icon_state = icon_state_off
+ return
if(charging)
- icon_state = icon_state_charging
- else
- icon_state = icon_state_idle
+ if(using_power)
+ icon_state = icon_state_charging
+ else
+ icon_state = icon_state_charged
+ return
+ icon_state = icon_state_idle
// Atlantis: No need for that copy-pasta code, just use var to store icon_states instead.
obj/machinery/recharger/wallcharger
name = "wall recharger"
- icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0"
+ icon_state_off = "wrechargeroff"
icon_state_idle = "wrecharger0"
icon_state_charging = "wrecharger1"
icon_state_charged = "wrecharger2"
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 343841b639c..f0a635c73a8 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -159,10 +159,7 @@
R.adjustFireLoss(-(repairs))
R.updatehealth()
if(R.cell)
- if(R.cell.charge >= R.cell.maxcharge)
- R.cell.charge = R.cell.maxcharge
- else
- R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge)
+ R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge)
else if(istype(occupant, /mob/living/carbon/human))
var/mob/living/carbon/human/H = occupant
if(H.get_int_organ(/obj/item/organ/internal/cell) && H.nutrition < 450)
@@ -192,8 +189,8 @@
// Engineering
if(istype(O,/obj/item/stack/sheet))
var/obj/item/stack/sheet/S = O
- if(S.amount < 50)
- S.amount += 1 * coeff
+ if(S.amount < S.max_amount)
+ S.amount += round(min(1 * coeff, S.max_amount - S.amount))
// Security
if(istype(O,/obj/item/device/flash))
var/obj/item/device/flash/F = O
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 4a9d8c439ae..698c1c5fe91 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -29,8 +29,7 @@ var/const/SAFETY_COOLDOWN = 100
update_icon()
/obj/machinery/recycler/Destroy()
- qdel(materials)
- materials = null
+ QDEL_NULL(materials)
return ..()
/obj/machinery/recycler/RefreshParts()
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 704da886685..21e91f3759b 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -8,14 +8,24 @@
//Request Console Screens
#define RCS_MAINMENU 0 // Main menu
-#define RCS_RQASSIST 1 // Request supplies
-#define RCS_RQSUPPLY 2 // Request assistance
+#define RCS_RQSUPPLY 1 // Request supplies
+#define RCS_RQASSIST 2 // Request assistance
#define RCS_SENDINFO 3 // Relay information
#define RCS_SENTPASS 4 // Message sent successfully
#define RCS_SENTFAIL 5 // Message sent unsuccessfully
#define RCS_VIEWMSGS 6 // View messages
#define RCS_MESSAUTH 7 // Authentication before sending
#define RCS_ANNOUNCE 8 // Send announcement
+#define RCS_SHIPPING 9 // Print Shipping Labels/Packages
+#define RCS_SHIP_LOG 10 // View Shipping Label Log
+
+//Radio list
+#define ENGI_ROLES list("Atmospherics","Mechanic","Engineering","Chief Engineer's Desk","Telecoms Admin")
+#define SEC_ROLES list("Warden","Security","Brig Medbay","Head of Security's Desk")
+#define MISC_ROLES list("Bar","Chapel","Kitchen","Hydroponics","Janitorial")
+#define MED_ROLES list("Virology","Chief Medical Officer's Desk","Medbay")
+#define COM_ROLES list("Blueshield","NT Representative","Head of Personnel's Desk","Captain's Desk","Bridge")
+#define SCI_ROLES list("Robotics","Science","Research Director's Desk")
var/req_console_assistance = list()
var/req_console_supplies = list()
@@ -52,6 +62,12 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/priority = -1 ; //Priority of the message being sent
light_range = 0
var/datum/announcement/announcement = new
+ var/list/shipping_log = list()
+ var/ship_tag_name = ""
+ var/ship_tag_index = 0
+ var/print_cooldown = 0 //cooldown on shipping label printer, stores the in-game time of when the printer will next be ready
+ var/obj/item/device/radio/Radio
+ var/radiochannel = ""
/obj/machinery/requests_console/power_change()
..()
@@ -65,10 +81,14 @@ var/list/obj/machinery/requests_console/allConsoles = list()
icon_state = "req_comp[newmessagepriority]"
/obj/machinery/requests_console/New()
+ Radio = new /obj/item/device/radio(src)
+ Radio.listening = 1
+ Radio.config(list("Engineering","Medical","Supply","Command","Science","Service","Security", "AI Private" = 0))
+ Radio.follow_target = src
..()
announcement.title = "[department] announcement"
- announcement.newscast = 1
+ announcement.newscast = 0
name = "[department] Requests Console"
allConsoles += src
@@ -95,6 +115,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
req_console_supplies -= department
if(departmentType & RC_INFO)
req_console_information -= department
+ QDEL_NULL(Radio)
return ..()
/obj/machinery/requests_console/attack_ghost(user as mob)
@@ -128,6 +149,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["assist_dept"] = req_console_assistance
data["supply_dept"] = req_console_supplies
data["info_dept"] = req_console_information
+ data["ship_dept"] = TAGGERLOCATIONS
data["message"] = message
data["recipient"] = recipient
@@ -135,6 +157,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["msgStamped"] = msgStamped
data["msgVerified"] = msgVerified
data["announceAuth"] = announceAuth
+ data["shipDest"] = ship_tag_name
+ data["shipping_log"] = shipping_log
return data
@@ -180,9 +204,26 @@ var/list/obj/machinery/requests_console/allConsoles = list()
pass = 1
if(pass)
screen = RCS_SENTPASS
- message_log += "Message sent to [recipient] [message]"
+ if(recipient in ENGI_ROLES)
+ radiochannel = "Engineering"
+ if(recipient in SEC_ROLES)
+ radiochannel = "Security"
+ if(recipient in MISC_ROLES)
+ radiochannel = "Service"
+ if(recipient in MED_ROLES)
+ radiochannel = "Medical"
+ if(recipient in COM_ROLES)
+ radiochannel = "Command"
+ if(recipient in SCI_ROLES)
+ radiochannel = "Science"
+ if(recipient == "AI")
+ radiochannel = "AI Private"
+ if(recipient == "Cargo Bay")
+ radiochannel = "Supply"
+ message_log += "Message sent to [recipient] at [worldtime2text()] [message]"
+ Radio.autosay("Alert; a new requests console message received for [recipient] from [department]", null, "[radiochannel]")
else
- audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
+ audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
//Handle screen switching
if(href_list["setScreen"])
@@ -199,6 +240,26 @@ var/list/obj/machinery/requests_console/allConsoles = list()
reset_message()
screen = tempScreen
+ if(href_list["shipSelect"])
+ ship_tag_name = href_list["shipSelect"]
+ ship_tag_index = TAGGERLOCATIONS.Find(ship_tag_name)
+
+ //Handle Shipping Label Printing
+ if(href_list["printLabel"])
+ var/error_message = ""
+ if(!ship_tag_index)
+ error_message = "Please select a destination."
+ else if(!msgVerified)
+ error_message = "Please verify shipper ID."
+ else if(world.time < print_cooldown)
+ error_message = "Please allow the printer time to prepare the next shipping label."
+ if(error_message)
+ audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: [error_message]'"),,4)
+ return
+ print_label(ship_tag_name, ship_tag_index)
+ shipping_log += "Shipping Label printed for [ship_tag_name] [msgVerified]"
+ reset_message(1)
+
//Handle silencing the console
if(href_list["toggleSilent"])
silent = !silent
@@ -245,6 +306,10 @@ var/list/obj/machinery/requests_console/allConsoles = list()
reset_message()
to_chat(user, "You are not authorized to send announcements. ")
updateUsrDialog()
+ if(screen == RCS_SHIPPING)
+ var/obj/item/weapon/card/id/T = O
+ msgVerified = text("Sender verified as [T.registered_name] ([T.assignment]) ")
+ updateUsrDialog()
if(istype(O, /obj/item/weapon/stamp))
if(inoperable(MAINT)) return
if(screen == RCS_MESSAUTH)
@@ -261,6 +326,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
msgStamped = ""
announceAuth = 0
announcement.announcer = ""
+ ship_tag_name = ""
+ ship_tag_index = 0
if(mainmenu)
screen = RCS_MAINMENU
@@ -286,3 +353,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
else // Normal
src.message_log += "From: [linkedSender] [message]"
set_light(2)
+
+/obj/machinery/requests_console/proc/print_label(tag_name, tag_index)
+ var/obj/item/shippingPackage/sp = new /obj/item/shippingPackage(get_turf(src))
+ sp.sortTag = tag_index
+ sp.update_desc()
+ print_cooldown = world.time + 600 //1 minute cooldown before you can print another label, but you can still configure the next one during this time
diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm
deleted file mode 100644
index dbff4722cad..00000000000
--- a/code/game/machinery/seed_extractor.dm
+++ /dev/null
@@ -1,65 +0,0 @@
-/obj/machinery/seed_extractor
- name = "seed extractor"
- desc = "Extracts and bags seeds from produce."
- icon = 'icons/obj/hydroponics_machines.dmi'
- icon_state = "sextractor"
- density = 1
- anchored = 1
-
-/obj/machinery/seed_extractor/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/seed_extractor(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- RefreshParts()
-
-/obj/machinery/seed_extractor/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts.
- return
-
-obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
-
- if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O))
- return
-
- if(exchange_parts(user, O))
- return
-
- if(default_unfasten_wrench(user, O))
- return
-
- default_deconstruction_crowbar(O)
-
- // Fruits and vegetables.
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown))
-
- user.drop_item(O)
-
- var/datum/seed/new_seed_type
- if(istype(O, /obj/item/weapon/grown))
- var/obj/item/weapon/grown/F = O
- new_seed_type = plant_controller.seeds[F.plantname]
- else
- var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
- new_seed_type = plant_controller.seeds[F.plantname]
-
- if(new_seed_type)
- to_chat(user, "You extract some seeds from [O]. ")
- var/produce = rand(1,4)
- for(var/i = 0;i<=produce;i++)
- var/obj/item/seeds/seeds = new(get_turf(src))
- seeds.seed_type = new_seed_type.name
- seeds.update_seed()
- else
- to_chat(user, "[O] doesn't seem to have any usable seeds inside it.")
-
- qdel(O)
-
- //Grass.
- else if(istype(O, /obj/item/stack/tile/grass))
- var/obj/item/stack/tile/grass/S = O
- to_chat(user, "You extract some seeds from the [S.name]. ")
- S.use(1)
- new /obj/item/seeds/grassseed(loc)
-
- return
\ No newline at end of file
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index a3f7ee5189a..071ae52c942 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -29,8 +29,8 @@
..()
move_update_air(T)
-/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height, air_group)
- if(!height || air_group) return 0
+/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height)
+ if(!height) return 0
else return ..()
/obj/machinery/shield/CanAtmosPass(var/turf/T)
@@ -49,7 +49,7 @@
if(src.health <= 0)
- visible_message("\blue The [src] dissipates")
+ visible_message("The [src] dissipates ")
qdel(src)
return
@@ -62,7 +62,7 @@
health -= Proj.damage
..()
if(health <=0)
- visible_message("\blue The [src] dissipates")
+ visible_message("The [src] dissipates ")
qdel(src)
return
opacity = 1
@@ -94,55 +94,52 @@
/obj/machinery/shield/hitby(AM as mob|obj)
-
- //Super realistic, resource-intensive, real-time damage calculations.
+ ..()
var/tforce = 0
if(ismob(AM))
tforce = 40
- else
- tforce = AM:throwforce
+ else if(isobj(AM))
+ var/obj/O = AM
+ tforce = O.throwforce
- src.health -= tforce
+ health -= tforce
//This seemed to be the best sound for hitting a force field.
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
+ playsound(loc, 'sound/effects/EMPulse.ogg', 100, 1)
//Handle the destruction of the shield
- if(src.health <= 0)
- visible_message("\blue The [src] dissipates")
+ if(health <= 0)
+ visible_message("The [src] dissipates ")
qdel(src)
return
//The shield becomes dense to absorb the blow.. purely asthetic.
opacity = 1
- spawn(20) if(src) opacity = 0
-
- ..()
- return
-
+ spawn(20)
+ if(src)
+ opacity = 0
/obj/machinery/shieldgen
- name = "Emergency shield projector"
- desc = "Used to seal minor hull breaches."
- icon = 'icons/obj/objects.dmi'
- icon_state = "shieldoff"
- density = 1
- opacity = 0
- anchored = 0
- pressure_resistance = 2*ONE_ATMOSPHERE
- req_access = list(access_engine)
- var/const/max_health = 100
- var/health = max_health
- var/active = 0
- var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate
- var/list/deployed_shields = list()
- var/is_open = 0 //Whether or not the wires are exposed
- var/locked = 0
+ name = "Emergency shield projector"
+ desc = "Used to seal minor hull breaches."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "shieldoff"
+ density = 1
+ opacity = 0
+ anchored = 0
+ pressure_resistance = 2*ONE_ATMOSPHERE
+ req_access = list(access_engine)
+ var/const/max_health = 100
+ var/health = max_health
+ var/active = 0
+ var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate
+ var/list/deployed_shields = list()
+ var/is_open = 0 //Whether or not the wires are exposed
+ var/locked = 0
/obj/machinery/shieldgen/Destroy()
- for(var/obj/machinery/shield/shield_tile in deployed_shields)
- qdel(shield_tile)
+ QDEL_LIST(deployed_shields)
deployed_shields = null
return ..()
@@ -218,14 +215,14 @@
return
if(src.active)
- user.visible_message("\blue [bicon(src)] [user] deactivated the shield generator.", \
- "\blue [bicon(src)] You deactivate the shield generator.", \
+ user.visible_message("[bicon(src)] [user] deactivated the shield generator. ", \
+ "[bicon(src)] You deactivate the shield generator. ", \
"You hear heavy droning fade out.")
src.shields_down()
else
if(anchored)
- user.visible_message("\blue [bicon(src)] [user] activated the shield generator.", \
- "\blue [bicon(src)] You activate the shield generator.", \
+ user.visible_message("[bicon(src)] [user] activated the shield generator. ", \
+ "[bicon(src)] You activate the shield generator. ", \
"You hear heavy droning.")
src.shields_up()
else
@@ -238,24 +235,25 @@
update_icon()
else if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
if(is_open)
- to_chat(user, "\blue You close the panel.")
+ to_chat(user, "You close the panel. ")
is_open = 0
else
- to_chat(user, "\blue You open the panel and expose the wiring.")
+ to_chat(user, "You open the panel and expose the wiring. ")
is_open = 1
else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open)
var/obj/item/stack/cable_coil/coil = W
- to_chat(user, "\blue You begin to replace the wires.")
+ to_chat(user, "You begin to replace the wires. ")
//if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ), target = src)) //Take longer to repair heavier damage
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * coil.toolspeed, target = src))
if(!src || !coil) return
coil.use(1)
health = max_health
malfunction = 0
- to_chat(user, "\blue You repair the [src]!")
+ playsound(loc, coil.usesound, 50, 1)
+ to_chat(user, "You repair the [src]! ")
update_icon()
else if(istype(W, /obj/item/weapon/wrench))
@@ -263,16 +261,16 @@
to_chat(user, "The bolts are covered, unlocking this would retract the covers.")
return
if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- to_chat(user, "\blue You unsecure the [src] from the floor!")
+ playsound(src.loc, W.usesound, 100, 1)
+ to_chat(user, "You unsecure the [src] from the floor! ")
if(active)
- to_chat(user, "\blue The [src] shuts off!")
+ to_chat(user, "The [src] shuts off! ")
src.shields_down()
anchored = 0
else
if(istype(get_turf(src), /turf/space)) return //No wrenching these in space!
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- to_chat(user, "\blue You secure the [src] to the floor!")
+ playsound(src.loc, W.usesound, 100, 1)
+ to_chat(user, "You secure the [src] to the floor! ")
anchored = 1
@@ -281,7 +279,7 @@
src.locked = !src.locked
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
else
..()
@@ -349,13 +347,13 @@
/obj/machinery/shieldwallgen/attack_hand(mob/user as mob)
if(state != 1)
- to_chat(user, "\red The shield generator needs to be firmly secured to the floor first.")
+ to_chat(user, "The shield generator needs to be firmly secured to the floor first. ")
return 1
if(src.locked && !istype(user, /mob/living/silicon))
- to_chat(user, "\red The controls are locked!")
+ to_chat(user, "The controls are locked! ")
return 1
if(power != 1)
- to_chat(user, "\red The shield generator needs to be powered by wire underneath.")
+ to_chat(user, "The shield generator needs to be powered by wire underneath. ")
return 1
if(src.active >= 1)
@@ -401,7 +399,7 @@
src.active = 2
if(src.active >= 1)
if(src.power == 0)
- src.visible_message("\red The [src.name] shuts down due to lack of power!", \
+ src.visible_message("The [src.name] shuts down due to lack of power! ", \
"You hear heavy droning fade out")
icon_state = "Shield_Gen"
src.active = 0
@@ -460,14 +458,14 @@
else if(state == 0)
state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
to_chat(user, "You secure the external reinforcing bolts to the floor.")
src.anchored = 1
return
else if(state == 1)
state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
to_chat(user, "You undo the external reinforcing bolts.")
src.anchored = 0
return
@@ -477,7 +475,7 @@
src.locked = !src.locked
to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]")
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
else
add_fingerprint(user)
@@ -599,8 +597,8 @@
return
-/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
if(istype(mover) && mover.checkpass(PASSGLASS))
return prob(20)
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 1c6dcf6322e..7775744ba45 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -59,13 +59,13 @@
spawn(25)
if(roll == 1)
visible_message("[src] says, 'JACKPOT! [usr.name] has won a MILLION CREDITS!'")
- command_announcement.Announce("Congratulations to [usr.name] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner")
+ event_announcement.Announce("Congratulations to [usr.name] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner")
result = "JACKPOT! You win one million credits!"
resultlvl = "highlight"
win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg')
else if(roll > 1 && roll <= 5)
visible_message("[src] says, 'Big Winner! [usr.name] has won a hundred thousand credits!'")
- command_announcement.Announce("Congratulations to [usr.name] on winning a hundred thousand credits!", "Big Winner")
+ event_announcement.Announce("Congratulations to [usr.name] on winning a hundred thousand credits!", "Big Winner")
result = "Big Winner! You win a hundred thousand credits!"
resultlvl = "good"
win_money(100000, 'sound/goonstation/misc/klaxon.ogg')
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 91e60dfaec5..600dc3704fa 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -20,9 +20,7 @@
return
/obj/machinery/space_heater/Destroy()
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(cell)
return ..()
/obj/machinery/space_heater/update_icon()
@@ -64,13 +62,13 @@
C.loc = src
C.add_fingerprint(usr)
- user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].")
+ user.visible_message("[user] inserts a power cell into [src]. ", "You insert the power cell into [src]. ")
else
to_chat(user, "The hatch must be open to insert a power cell.")
return
else if(istype(I, /obj/item/weapon/screwdriver))
open = !open
- user.visible_message("\blue [user] [open ? "opens" : "closes"] the hatch on the [src].", "\blue You [open ? "open" : "close"] the hatch on the [src].")
+ user.visible_message("[user] [open ? "opens" : "closes"] the hatch on the [src]. ", "You [open ? "open" : "close"] the hatch on the [src]. ")
update_icon()
if(!open && user.machine == src)
user << browse(null, "window=spaceheater")
@@ -107,7 +105,7 @@
else
on = !on
- user.visible_message("\blue [user] switches [on ? "on" : "off"] the [src].","\blue You switch [on ? "on" : "off"] the [src].")
+ user.visible_message("[user] switches [on ? "on" : "off"] the [src]. ","You switch [on ? "on" : "off"] the [src]. ")
update_icon()
return
@@ -132,7 +130,7 @@
usr.put_in_hands(cell)
cell.add_fingerprint(usr)
cell = null
- usr.visible_message("\blue [usr] removes the power cell from \the [src].", "\blue You remove the power cell from \the [src].")
+ usr.visible_message("[usr] removes the power cell from \the [src]. ", "You remove the power cell from \the [src]. ")
if("cellinstall")
@@ -144,7 +142,7 @@
C.loc = src
C.add_fingerprint(usr)
- usr.visible_message("\blue [usr] inserts a power cell into \the [src].", "\blue You insert the power cell into \the [src].")
+ usr.visible_message("[usr] inserts a power cell into \the [src]. ", "You insert the power cell into \the [src]. ")
updateDialog()
else
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 12404d0574e..614f4d8f53f 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -203,6 +203,10 @@
var/emotion = "Neutral"
+/obj/machinery/ai_status_display/attack_ai(mob/living/silicon/ai/user)
+ if(isAI(user))
+ user.ai_statuschange()
+
/obj/machinery/ai_status_display/process()
if(stat & NOPOWER)
overlays.Cut()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index b50fc3566d8..eee465e062a 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -41,33 +41,33 @@
MASK_TYPE = /obj/item/clothing/mask/gas
/obj/machinery/suit_storage_unit/engine
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/engineering
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/engineering
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engineering
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/engineering
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/ce
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/elite
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/elite
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/elite
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/elite
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/security
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/security
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/security
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/security
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/security
MASK_TYPE = /obj/item/clothing/mask/gas/sechailer
/obj/machinery/suit_storage_unit/atmos
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/atmos
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/atmos
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/atmos
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/atmos
MASK_TYPE = /obj/item/clothing/mask/gas
/obj/machinery/suit_storage_unit/mining
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/mining
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/mining
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/mining
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/mining
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/cmo
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/medical
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/medical
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/medical
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/medical
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/New()
@@ -503,7 +503,7 @@
return
if(istype(I, /obj/item/weapon/screwdriver))
src.panelopen = !src.panelopen
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, I.usesound, 100, 1)
to_chat(user, text("You [] the unit's maintenance panel. ",(src.panelopen ? "open up" : "close") ))
src.updateUsrDialog()
return
@@ -628,7 +628,7 @@
var/target_species = "Human"
var/mob/living/carbon/human/occupant = null
- var/obj/item/clothing/suit/space/rig/suit = null
+ var/obj/item/clothing/suit/space/hardsuit/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
/obj/machinery/suit_cycler/engineering
@@ -667,11 +667,11 @@
return
if(locked)
- to_chat(user, "\red The suit cycler is locked.")
+ to_chat(user, "The suit cycler is locked. ")
return
if(src.contents.len > 0)
- to_chat(user, "\red There is no room inside the cycler for [G.affecting.name].")
+ to_chat(user, "There is no room inside the cycler for [G.affecting.name]. ")
return
visible_message("[user] starts putting [G.affecting.name] into the suit cycler.")
@@ -698,7 +698,7 @@
else if(istype(I,/obj/item/clothing/head/helmet/space))
if(locked)
- to_chat(user, "\red The suit cycler is locked.")
+ to_chat(user, "The suit cycler is locked. ")
return
if(helmet)
@@ -714,17 +714,17 @@
src.updateUsrDialog()
return
- else if(istype(I,/obj/item/clothing/suit/space/rig))
+ else if(istype(I,/obj/item/clothing/suit/space/hardsuit))
if(locked)
- to_chat(user, "\red The suit cycler is locked.")
+ to_chat(user, "The suit cycler is locked. ")
return
if(suit)
to_chat(user, "The cycler already contains a hardsuit.")
return
- var/obj/item/clothing/suit/space/rig/S = I
+ var/obj/item/clothing/suit/space/hardsuit/S = I
if(S.helmet)
to_chat(user, "\The [S] will not fit into the cycler with a helmet attached.")
@@ -747,11 +747,11 @@
/obj/machinery/suit_cycler/emag_act(user as mob)
if(emagged)
- to_chat(user, "\red The cycler has already been subverted.")
+ to_chat(user, "The cycler has already been subverted. ")
return
//Clear the access reqs, disable the safeties, and open up all paintjobs.
- to_chat(user, "\red You run the sequencer across the interface, corrupting the operating protocols.")
+ to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols. ")
departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$")
emagged = 1
safeties = 0
@@ -875,12 +875,12 @@
locked = !locked
to_chat(usr, "You [locked ? "" : "un"]lock \the [src].")
else
- to_chat(usr, "\red Access denied.")
+ to_chat(usr, "Access denied. ")
else if(href_list["begin_decontamination"])
if(safeties && occupant)
- to_chat(usr, "\red The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")
+ to_chat(usr, "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle. ")
return
active = 1
@@ -979,7 +979,7 @@
/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob)
if(locked || active)
- to_chat(user, "\red The cycler is locked.")
+ to_chat(user, "The cycler is locked. ")
return
if(!occupant)
@@ -1049,60 +1049,60 @@
if("Engineering")
if(helmet)
helmet.name = "engineering hardsuit helmet"
- helmet.icon_state = "rig0-engineering"
+ helmet.icon_state = "hardsuit0-engineering"
helmet.item_state = "eng_helm"
helmet.item_color = "engineering"
if(suit)
suit.name = "engineering hardsuit"
- suit.icon_state = "rig-engineering"
+ suit.icon_state = "hardsuit-engineering"
suit.item_state = "eng_hardsuit"
if("Mining")
if(helmet)
helmet.name = "mining hardsuit helmet"
- helmet.icon_state = "rig0-mining"
+ helmet.icon_state = "hardsuit0-mining"
helmet.item_state = "mining_helm"
helmet.item_color = "mining"
if(suit)
suit.name = "mining hardsuit"
- suit.icon_state = "rig-mining"
+ suit.icon_state = "hardsuit-mining"
suit.item_state = "mining_hardsuit"
if("Medical")
if(helmet)
helmet.name = "medical hardsuit helmet"
- helmet.icon_state = "rig0-medical"
+ helmet.icon_state = "hardsuit0-medical"
helmet.item_state = "medical_helm"
helmet.item_color = "medical"
if(suit)
suit.name = "medical hardsuit"
- suit.icon_state = "rig-medical"
+ suit.icon_state = "hardsuit-medical"
suit.item_state = "medical_hardsuit"
if("Security")
if(helmet)
helmet.name = "security hardsuit helmet"
- helmet.icon_state = "rig0-sec"
+ helmet.icon_state = "hardsuit0-sec"
helmet.item_state = "sec_helm"
helmet.item_color = "sec"
if(suit)
suit.name = "security hardsuit"
- suit.icon_state = "rig-sec"
+ suit.icon_state = "hardsuit-sec"
suit.item_state = "sec_hardsuit"
if("Atmos")
if(helmet)
helmet.name = "atmospherics hardsuit helmet"
- helmet.icon_state = "rig0-atmos"
+ helmet.icon_state = "hardsuit0-atmos"
helmet.item_state = "atmos_helm"
helmet.item_color = "atmos"
if(suit)
suit.name = "atmospherics hardsuit"
- suit.icon_state = "rig-atmos"
+ suit.icon_state = "hardsuit-atmos"
suit.item_state = "atmos_hardsuit"
if("^%###^%$")
if(helmet)
helmet.name = "blood-red hardsuit helmet"
- helmet.icon_state = "rig0-syndie"
+ helmet.icon_state = "hardsuit0-syndie"
helmet.item_state = "syndie_helm"
helmet.item_color = "syndie"
if(suit)
suit.name = "blood-red hardsuit"
suit.item_state = "syndie_hardsuit"
- suit.icon_state = "rig-syndie"
+ suit.icon_state = "hardsuit-syndie"
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index bf4300351fa..193c311e012 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -41,8 +41,7 @@
..()
/obj/machinery/syndicatebomb/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/syndicatebomb/examine(mob/user)
@@ -59,14 +58,14 @@
to_chat(user, "The bomb must be placed on solid ground to attach it ")
else
to_chat(user, "You firmly wrench the bomb to the floor ")
- playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
anchored = 1
if(active)
to_chat(user, "The bolts lock in place ")
else
if(!active)
to_chat(user, "You wrench the bomb from the floor ")
- playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
anchored = 0
else
to_chat(user, "The bolts are locked down! ")
@@ -89,7 +88,7 @@
else
to_chat(user, "There isn't anything in here to remove! ")
else if(open_panel)
- to_chat(user, "The wires conneting the shell to the explosives are holding it down! ")
+ to_chat(user, "The wires connecting the shell to the explosives are holding it down! ")
else
to_chat(user, "The cover is screwed on, it won't pry off! ")
else if(istype(I, /obj/item/weapon/bombcore))
@@ -103,37 +102,50 @@
else
..()
-/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
+/obj/machinery/syndicatebomb/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/syndicatebomb/attack_hand(mob/user)
interact(user)
/obj/machinery/syndicatebomb/attack_ai()
return
-/obj/machinery/syndicatebomb/interact(var/mob/user)
+/obj/machinery/syndicatebomb/interact(mob/user)
if(wires && open_panel)
wires.Interact(user)
- if(!open_panel)
+ if(!open_panel && can_interact(user))
if(!active)
spawn()
settings(user)
return
else if(anchored)
to_chat(user, "The bomb is bolted to the floor! ")
- return
-/obj/machinery/syndicatebomb/proc/settings(var/mob/user)
+/obj/machinery/syndicatebomb/proc/can_interact(mob/user)
+ if(user.can_advanced_admin_interact())
+ return TRUE
+ if(!isliving(user))
+ return FALSE
+ if(user.incapacitated())
+ return FALSE
+ if(!Adjacent(user))
+ return FALSE
+ return TRUE
+
+/obj/machinery/syndicatebomb/proc/settings(mob/user)
var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num
newtime = Clamp(newtime, 120, 60000)
- if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station
+ if(can_interact(user)) //No running off and setting bombs from across the station
timer = newtime
- src.loc.visible_message("[bicon(src)] timer set for [timer] seconds. ")
- if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user))
+ loc.visible_message("[bicon(src)] timer set for [timer] seconds. ")
+ if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user))
if(defused || active)
if(defused)
- src.loc.visible_message("[bicon(src)] Device error: User intervention required. ")
+ loc.visible_message("[bicon(src)] Device error: User intervention required. ")
return
else
- src.loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area. ")
+ loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area. ")
playsound(loc, 'sound/machines/click.ogg', 30, 1)
active = 1
update_icon()
@@ -143,8 +155,8 @@
var/area/A = get_area(bombturf)
if(payload && !istype(payload, /obj/item/weapon/bombcore/training))
msg_admin_attack("[key_name_admin(user)] has primed a [name] ([payload]) for detonation at [A.name] (JMP) .")
- log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
- payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!"
+ log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name] ([bombturf.x], [bombturf.y], [bombturf.z])")
+ payload.adminlog = "\The [src] that [key_name(user)] had primed detonated!"
/obj/machinery/syndicatebomb/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
@@ -180,7 +192,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "syndicate=6;combat=5"
burn_state = FLAMMABLE //Burnable (but the casing isn't)
var/adminlog = null
@@ -257,6 +269,7 @@
var/obj/machinery/syndicatebomb/B = src.loc
for(var/i = 0; i < amt_summon; i++)
var/atom/movable/X = new summon_path
+ X.admin_spawned = TRUE
X.loc = get_turf(src)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
@@ -283,7 +296,7 @@
/obj/item/weapon/bombcore/miniature
name = "small bomb core"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/bombcore/miniature/detonate()
explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb
@@ -297,7 +310,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "syndicate=2"
var/cooldown = 0
var/detonated = 0
@@ -322,4 +335,4 @@
detonated = 0
existant = 0
cooldown = 1
- spawn(30) cooldown = 0
\ No newline at end of file
+ spawn(30) cooldown = 0
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index ae0b2738d1b..48d65eb051b 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -24,7 +24,8 @@
if(stat & (BROKEN|NOPOWER))
return
user.set_machine(src)
- var/dat = "Telecommunication Server Monitor Telecommunications Server Monitor "
+ var/list/dat = list()
+ dat += "Telecommunication Server Monitor Telecommunications Server Monitor "
switch(screen)
@@ -63,55 +64,16 @@
var/i = 0
for(var/datum/comm_log_entry/C in SelectedServer.log_entries)
i++
-
-
// If the log is a speech file
if(C.input_type == "Speech File")
-
dat += "[C.name] \[X\] "
- // -- Determine race of orator --
-
- var/race // The actual race of the mob
- var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human
- var/mobtype = C.parameters["mobtype"]
- var/mob/M = new mobtype
-
- if(ishuman(M) || isbrain(M))
- var/mob/living/carbon/human/H = M
- race = "[H.species.name]"
-
-
- else if(issmall(M))
- race = "Monkey"
- language = race
-
- else if(issilicon(M) || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
- race = "Artificial Life"
-
- else if(isslime(M)) // NT knows a lot about slimes, but not aliens. Can identify slimes
- race = "Slime"
- language = race
-
- else if(isbot(M))
- race = "Bot"
-
- else if(isanimal(M))
- race = "Domestic Animal"
- language = race
-
- else
- race = "Unidentifiable "
- language = race
-
- qdel(M)
-
// -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
- if(language == "Human" || universal_translate || C.parameters["uspeech"])
+ if(user.say_understands(null, C.parameters["language"]) || universal_translate || C.parameters["uspeech"])
dat += "Data type : [C.input_type] "
dat += "Source : [C.parameters["name"]] (Job: [C.parameters["job"]]) "
- dat += "Class : [race] "
+ dat += "Class : [C.parameters["race"]] "
dat += "Contents : \"[C.parameters["message"]]\" "
@@ -120,7 +82,7 @@
else
dat += "Data type : Audio File "
dat += "Source : Unidentifiable "
- dat += "Class : [race] "
+ dat += "Class : [C.parameters["race"]] "
dat += "Contents : Unintelligble "
dat += " "
@@ -136,7 +98,7 @@
- user << browse(dat, "window=comm_monitor;size=575x400")
+ user << browse(dat.Join(""), "window=comm_monitor;size=575x400")
onclose(user, "server_control")
temp = ""
@@ -187,7 +149,7 @@
if(href_list["delete"])
if(!src.allowed(usr) && !emagged)
- to_chat(usr, "\red ACCESS DENIED.")
+ to_chat(usr, "ACCESS DENIED. ")
return
if(SelectedServer)
@@ -222,10 +184,10 @@
attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params)
if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, D.usesound, 50, 1)
+ if(do_after(user, 20 * D.toolspeed, target = src))
if(src.stat & BROKEN)
- to_chat(user, "\blue The broken glass falls out.")
+ to_chat(user, "The broken glass falls out. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
@@ -237,7 +199,7 @@
A.anchored = 1
qdel(src)
else
- to_chat(user, "\blue You disconnect the monitor.")
+ to_chat(user, "You disconnect the monitor. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
for(var/obj/C in src)
@@ -254,4 +216,4 @@
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- to_chat(user, "\blue You you disable the security protocols")
+ to_chat(user, "You you disable the security protocols ")
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index c1a10cacd48..db436bfb772 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -24,24 +24,24 @@
if(0)
if(istype(P, /obj/item/weapon/screwdriver))
to_chat(user, "You unfasten the bolts.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
construct_op++
if(1)
if(istype(P, /obj/item/weapon/screwdriver))
to_chat(user, "You fasten the bolts.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc,P.usesound, 50, 1)
construct_op--
if(istype(P, /obj/item/weapon/wrench))
to_chat(user, "You dislodge the external plating.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, P.usesound, 75, 1)
construct_op++
if(2)
if(istype(P, /obj/item/weapon/wrench))
to_chat(user, "You secure the external plating.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, P.usesound, 75, 1)
construct_op--
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables.")
construct_op++
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
@@ -51,6 +51,7 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/A = P
if(A.amount >= 5)
+ playsound(loc, A.usesound, 50, 1)
to_chat(user, "You insert the cables.")
A.amount -= 5
if(A.amount <= 0)
@@ -60,8 +61,8 @@
stat &= ~BROKEN // the machine's not borked anymore!
if(istype(P, /obj/item/weapon/crowbar))
to_chat(user, "You begin prying out the circuit board other components...")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user,60, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(user, 60 * P.toolspeed, target = src))
to_chat(user, "You finish prying out the components.")
// Drop all the component stuff
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index a4e481f430b..953fdb68b8b 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -475,7 +475,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
// Copy the signal.data entries we want
log.parameters["mobtype"] = signal.data["mobtype"]
+ log.parameters["race"] = signal.data["race"]
log.parameters["job"] = signal.data["job"]
+ log.parameters["language"] = signal.data["language"]
log.parameters["key"] = signal.data["key"]
log.parameters["vmessage"] = signal.data["message"]
log.parameters["vname"] = signal.data["vname"]
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 9baa2a1a12f..6b5201460e4 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -128,10 +128,10 @@
attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params)
if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, D.usesound, 50, 1)
+ if(do_after(user, 20 * D.toolspeed, target = src))
if(src.stat & BROKEN)
- to_chat(user, "\blue The broken glass falls out.")
+ to_chat(user, "The broken glass falls out. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A )
@@ -143,7 +143,7 @@
A.anchored = 1
qdel(src)
else
- to_chat(user, "\blue You disconnect the monitor.")
+ to_chat(user, "You disconnect the monitor. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A )
for(var/obj/C in src)
@@ -160,4 +160,4 @@
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- to_chat(user, "\blue You you disable the security protocols")
+ to_chat(user, "You you disable the security protocols ")
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 001771b7efa..2aa0c2a5d59 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -340,10 +340,10 @@
/obj/machinery/computer/telecomms/traffic/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params)
if(istype(D, /obj/item/weapon/screwdriver))
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(get_turf(src), D.usesound, 50, 1)
+ if(do_after(user, 20 * D.toolspeed, target = src))
if(src.stat & BROKEN)
- to_chat(user, "\blue The broken glass falls out.")
+ to_chat(user, "The broken glass falls out. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
@@ -355,7 +355,7 @@
A.anchored = 1
qdel(src)
else
- to_chat(user, "\blue You disconnect the monitor.")
+ to_chat(user, "You disconnect the monitor. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
for(var/obj/C in src)
@@ -372,7 +372,7 @@
if(!emagged)
playsound(get_turf(src), 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- to_chat(user, "\blue You you disable the security protocols")
+ to_chat(user, "You you disable the security protocols ")
/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user)
if(issilicon(user) || in_range(user, src))
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 843002a804d..8479e4e051b 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -55,7 +55,7 @@
/obj/machinery/computer/teleporter/emag_act(user as mob)
if(!emagged)
emagged = 1
- to_chat(user, "\blue The teleporter can now lock on to Syndicate beacons!")
+ to_chat(user, "The teleporter can now lock on to Syndicate beacons! ")
else
ui_interact(user)
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index f34e28dcd18..878ea0737aa 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -11,6 +11,7 @@
var/cooldown_duration = 600 // 1 minute
var/cooldown = 0
var/robot_cell_charge = 5000
+ var/acceptdir = EAST
/obj/machinery/transformer/New()
// On us
@@ -28,6 +29,12 @@
else
icon_state = initial(icon_state)
+/obj/machinery/transformer/setDir(newdir)
+ . = ..()
+ var/obj/machinery/conveyor/C = locate() in loc
+ C.setDir(newdir)
+ acceptdir = turn(newdir, 180)
+
/obj/machinery/transformer/Bumped(var/atom/movable/AM)
if(cooldown == 1)
@@ -38,7 +45,7 @@
// Only humans can enter from the west side, while lying down.
var/move_dir = get_dir(loc, AM.loc)
var/mob/living/carbon/human/H = AM
- if((transform_standing || H.lying) && move_dir == EAST)// || move_dir == WEST)
+ if((transform_standing || H.lying) && move_dir == acceptdir)// || move_dir == WEST)
AM.loc = src.loc
do_transform(AM)
@@ -255,3 +262,94 @@
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
sleep(30)
+/obj/machinery/transformer/equipper
+ name = "Auto-equipper 9000"
+ desc = "Either in employ of people who cannot dress themselves, or Wallace and Gromit."
+ var/selected_outfit = /datum/outfit/job/assistant
+ var/prestrip = TRUE
+
+/obj/machinery/transformer/equipper/do_transform(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(!ispath(selected_outfit, /datum/outfit))
+ to_chat(H, "This equipper is not properly configured! 'selected_outfit': '[selected_outfit]' ")
+ return
+
+ if(prestrip)
+ for(var/obj/item/I in H)
+ if(istype(I, /obj/item/weapon/implant))
+ continue
+ if(istype(I, /obj/item/organ))
+ continue
+ qdel(I)
+
+ H.equipOutfit(selected_outfit)
+ H.species.after_equip_job(null, H)
+
+/obj/machinery/transformer/transmogrifier
+ name = "species transmogrifier"
+ desc = "As promoted in Calvin & Hobbes!"
+ var/target_species = "Human"
+
+
+/obj/machinery/transformer/transmogrifier/do_transform(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(!(target_species in all_species))
+ to_chat(H, "'[target_species]' is not a valid species! ")
+ return
+ H.set_species(target_species)
+
+
+/obj/machinery/transformer/dnascrambler
+ name = "genetic scrambler"
+ desc = "Step right in and become a new you!"
+
+
+/obj/machinery/transformer/dnascrambler/do_transform(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+
+ scramble(1, H, 100)
+ H.generate_name()
+ H.sync_organ_dna(assimilate = 1)
+ H.update_body(0)
+ H.reset_hair()
+ H.dna.ResetUIFrom(H)
+
+
+/obj/machinery/transformer/gene_applier
+ name = "genetic blueprint applier"
+ desc = "Here begin the clone wars. Upload a template by using a genetics disk on this machine."
+ var/datum/dna/template
+ var/locked = FALSE // For admins sealing the deal
+
+/obj/machinery/transformer/gene_applier/do_transform(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(!istype(template))
+ to_chat(H, "No genetic template configured! ")
+ return
+ var/prev_ue = H.dna.unique_enzymes
+ H.set_species(template.species)
+ H.dna = template.Clone()
+ H.real_name = template.real_name
+ H.sync_organ_dna(assimilate = 0, old_ue = prev_ue)
+ H.UpdateAppearance()
+ domutcheck(H, null, MUTCHK_FORCED)
+ H.update_mutations()
+
+/obj/machinery/transformer/gene_applier/attackby(obj/item/W, mob/living/user, params)
+ if(istype(W, /obj/item/weapon/disk/data))
+ if(locked)
+ to_chat(user, "Access Denied. ")
+ return FALSE
+ var/obj/item/weapon/disk/data/D = W
+ if(!D.buf)
+ to_chat(user, "Error: No data found. ")
+ return FALSE
+ template = D.buf.dna.Clone()
+ to_chat(user, "Upload of gene template for '[template.real_name]' complete! ")
+ return TRUE
+ else
+ return ..()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 21da8c4159c..ad5aeb5fc61 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -25,6 +25,9 @@
var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
var/ailock = 0 //Silicons cannot use this
+
+ var/syndicate = 0
+ var/faction = "" // Turret controls can only access turrets that are in the same faction
req_access = list(access_ai_upload)
@@ -36,6 +39,23 @@
enabled = 1
lethal = 1
icon_state = "control_kill"
+
+/obj/machinery/turretid/syndicate
+ enabled = 1
+ lethal = 1
+ icon_state = "control_kill"
+
+ lethal = 1
+ check_arrest = 0
+ check_records = 0
+ check_weapons = 0
+ check_access = 0
+ check_anomalies = 1
+ check_synth = 1
+ ailock = 1
+
+ syndicate = 1
+ faction = "syndicate"
/obj/machinery/turretid/Destroy()
if(control_area)
@@ -50,7 +70,7 @@
control_area = get_area(src)
else if(istext(control_area))
for(var/area/A in world)
- if(A.name && A.name==control_area)
+ if(A.name && A.name == control_area)
control_area = A
break
@@ -130,10 +150,10 @@
data["access"] = !isLocked(user)
data["locked"] = locked
data["enabled"] = enabled
- data["is_lethal"] = 1
+ data["lethal_control"] = !syndicate ? 1 : 0
data["lethal"] = lethal
- if(data["access"])
+ if(data["access"] && !syndicate)
var/settings[0]
settings[++settings.len] = list("category" = "Neutralize All Non-Synthetics", "setting" = "check_synth", "value" = check_synth)
settings[++settings.len] = list("category" = "Check Weapon Authorization", "setting" = "check_weapons", "value" = check_weapons)
@@ -156,6 +176,8 @@
var/value = text2num(href_list["value"])
if(href_list["command"] == "enable")
enabled = value
+ else if(syndicate)
+ return 1
else if(href_list["command"] == "lethal")
lethal = value
else if(href_list["command"] == "check_synth")
@@ -188,7 +210,8 @@
if(istype(control_area))
for(var/obj/machinery/porta_turret/aTurret in control_area)
- aTurret.setState(TC)
+ if(faction == aTurret.faction)
+ aTurret.setState(TC)
update_icon()
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
deleted file mode 100644
index 362f69c2a4c..00000000000
--- a/code/game/machinery/turrets.dm
+++ /dev/null
@@ -1,580 +0,0 @@
-/area/turret_protected
- name = "Turret Protected Area"
- var/list/turretTargets = list()
-
-/area/turret_protected/proc/subjectDied(target)
- if( isliving(target) )
- if( !issilicon(target) )
- var/mob/living/L = target
- if( L.stat )
- if( L in turretTargets )
- src.Exited(L)
-
-
-/area/turret_protected/Entered(O)
- ..()
- if( iscarbon(O) )
- turretTargets |= O
- else if( istype(O, /obj/mecha) )
- var/obj/mecha/Mech = O
- if( Mech.occupant )
- turretTargets |= Mech
- else if( istype(O, /obj/spacepod) )
- var/obj/spacepod/Pod = O
- if( Pod.pilot )
- turretTargets |= Pod
- else if(istype(O,/mob/living/simple_animal))
- turretTargets |= O
- return 1
-
-/area/turret_protected/Exited(O)
- if( ismob(O) && !issilicon(O) )
- turretTargets -= O
- else if( istype(O, /obj/mecha) )
- turretTargets -= O
- else if( istype(O, /obj/spacepod) )
- turretTargets -= O
- ..()
- return 1
-
-
-/obj/machinery/turret
- name = "turret"
- icon = 'icons/obj/turrets.dmi'
- icon_state = "grey_target_prism"
- var/raised = 0
- var/enabled = 1
- anchored = 1
- layer = 3
- invisibility = INVISIBILITY_LEVEL_TWO
- density = 1
- var/lasers = 0
- var/lasertype = 1
- // 1 = lasers
- // 2 = cannons
- // 3 = pulse
- // 4 = change (HONK)
- // 5 = bluetag
- // 6 = redtag
- var/health = 80
- var/obj/machinery/turretcover/cover = null
- var/popping = 0
- var/wasvalid = 0
- var/lastfired = 0
- var/shot_delay = 30 //3 seconds between shots
- var/datum/effect/system/spark_spread/spark_system
- use_power = 1
- idle_power_usage = 50
- active_power_usage = 300
-// var/list/targets
- var/atom/movable/cur_target
- var/targeting_active = 0
- var/area/turret_protected/protected_area
-
-
-/obj/machinery/turret/New()
- spark_system = new /datum/effect/system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
-// targets = new
- ..()
- return
-
-/obj/machinery/turretcover
- name = "pop-up turret cover"
- icon = 'icons/obj/turrets.dmi'
- icon_state = "turretCover"
- anchored = 1
- layer = 3.5
- density = 0
- var/obj/machinery/turret/host = null
-
-/obj/machinery/turret/proc/isPopping()
- return (popping!=0)
-
-/obj/machinery/turret/power_change()
- if(stat & BROKEN)
- icon_state = "grey_target_prism"
- else
- if( powered() )
- if(src.enabled)
- if(src.lasers)
- icon_state = "orange_target_prism"
- else
- icon_state = "target_prism"
- else
- icon_state = "grey_target_prism"
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "grey_target_prism"
- stat |= NOPOWER
-
-/obj/machinery/turret/proc/setState(var/enabled, var/lethal)
- src.enabled = enabled
- src.lasers = lethal
- src.power_change()
-
-
-/obj/machinery/turret/proc/get_protected_area()
- var/area/turret_protected/TP = get_area(src)
- if(istype(TP))
- return TP
- return
-
-/obj/machinery/turret/proc/check_target(var/atom/movable/T as mob|obj)
- if( T && T in protected_area.turretTargets )
- var/area/area_T = get_area(T)
- if( !area_T || (area_T.type != protected_area.type) )
- protected_area.Exited(T)
- return 0 //If the guy is somehow not in the turret's area (teleportation), get them out the damn list. --NEO
- if( iscarbon(T) )
- var/mob/living/carbon/MC = T
- if( !MC.stat )
- if( !MC.lying || lasers )
- return 1
- else if( istype(T, /obj/mecha) )
- var/obj/mecha/ME = T
- if( ME.occupant )
- return 1
- else if( istype(T, /obj/spacepod) )
- var/obj/spacepod/SP = T
- if( SP.pilot )
- return 1
- else if(istype(T,/mob/living/simple_animal))
- var/mob/living/simple_animal/A = T
- if( !A.stat )
- if(lasers)
- return 1
- return 0
-
-/obj/machinery/turret/proc/get_new_target()
- var/list/new_targets = new
- var/new_target
- for(var/mob/living/carbon/M in protected_area.turretTargets)
- if(!M.stat)
- if(!M.lying || lasers)
- new_targets += M
- for(var/obj/mecha/M in protected_area.turretTargets)
- if(M.occupant)
- new_targets += M
- for(var/obj/spacepod/M in protected_area.turretTargets)
- if(M.pilot)
- new_targets += M.pilot
- for(var/mob/living/simple_animal/M in protected_area.turretTargets)
- if(!M.stat)
- new_targets += M
- if(new_targets.len)
- new_target = pick(new_targets)
- return new_target
-
-
-/obj/machinery/turret/process()
- if(stat & (NOPOWER|BROKEN))
- return
- if(src.cover==null)
- src.cover = new /obj/machinery/turretcover(src.loc)
- src.cover.host = src
- protected_area = get_protected_area()
- if(!enabled || !protected_area || protected_area.turretTargets.len<=0)
- if(!isDown() && !isPopping())
- popDown()
- return
- if(!check_target(cur_target)) //if current target fails target check
- cur_target = get_new_target() //get new target
-
- if(cur_target) //if it's found, proceed
-// to_chat(world, "[cur_target]")
- if(!isPopping())
- if(isDown())
- popUp()
- use_power = 2
- else
- spawn()
- if(!targeting_active)
- targeting_active = 1
- target()
- targeting_active = 0
-
- if(prob(15))
- if(prob(50))
- playsound(get_turf(src), 'sound/effects/turret/move1.wav', 60, 1)
- else
- playsound(get_turf(src), 'sound/effects/turret/move2.wav', 60, 1)
-
- else if(!isPopping())//else, pop down
- if(!isDown())
- popDown()
- use_power = 1
- return
-
-
-/obj/machinery/turret/proc/target()
- while(src && enabled && !stat && check_target(cur_target))
- src.dir = get_dir(src, cur_target)
- shootAt(cur_target)
- sleep(shot_delay)
- return
-
-/obj/machinery/turret/proc/shootAt(var/atom/movable/target)
- var/turf/T = get_turf(src)
- var/turf/U = get_turf(target)
- if(!T || !U)
- return
- var/obj/item/projectile/A
- if(src.lasers)
- switch(lasertype)
- if(1)
- A = new /obj/item/projectile/beam(loc)
- if(2)
- A = new /obj/item/projectile/beam/laser/heavylaser(loc)
- if(3)
- A = new /obj/item/projectile/beam/pulse(loc)
- if(4)
- A = new /obj/item/projectile/magic/change(loc)
- if(5)
- A = new /obj/item/projectile/beam/lasertag/bluetag(loc)
- if(6)
- A = new /obj/item/projectile/beam/lasertag/redtag(loc)
- use_power(500)
- else
- A = new /obj/item/projectile/energy/electrode( loc )
- use_power(200)
- if(src.lasers)
- playsound(get_turf(src), 'sound/weapons/Laser.ogg', 60, 1)
- else
- playsound(get_turf(src), 'sound/weapons/Taser.ogg', 60, 1)
- A.original = target
- A.current = T
- A.yo = U.y - T.y
- A.xo = U.x - T.x
- A.fire()
- return A
-
-
-/obj/machinery/turret/proc/isDown()
- return (invisibility!=0)
-
-/obj/machinery/turret/proc/popUp()
- if((!isPopping()) || src.popping==-1)
- invisibility = 0
- popping = 1
- playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1)
- if(src.cover!=null)
- flick("popup", src.cover)
- src.cover.icon_state = "openTurretCover"
- spawn(10)
- if(popping==1) popping = 0
-
-/obj/machinery/turret/proc/popDown()
- if((!isPopping()) || src.popping==1)
- popping = -1
- playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1)
- if(src.cover!=null)
- flick("popdown", src.cover)
- src.cover.icon_state = "turretCover"
- spawn(10)
- if(popping==-1)
- invisibility = INVISIBILITY_LEVEL_TWO
- popping = 0
-
-/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
- if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- src.health -= Proj.damage
- ..()
- if(prob(45) && Proj.damage > 0) src.spark_system.start()
- qdel(Proj)
- if(src.health <= 0)
- src.die()
- return
-
-/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
- ..()
- user.changeNext_move(CLICK_CD_MELEE)
- playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1)
- src.spark_system.start()
- src.health -= W.force * 0.5
- if(src.health <= 0)
- src.die()
- return
-
-/obj/machinery/turret/emp_act(severity)
- switch(severity)
- if(1)
- enabled = 0
- lasers = 0
- power_change()
- ..()
-
-/obj/machinery/turret/ex_act(severity)
- if(severity < 3)
- src.die()
-
-/obj/machinery/turret/proc/die()
- src.health = 0
- src.density = 0
- src.stat |= BROKEN
- src.icon_state = "destroyed_target_prism"
- if(cover!=null)
- qdel(cover)
- sleep(3)
- flick("explosion", src)
- spawn(13)
- qdel(src)
-
-
-/obj/machinery/turret/attack_animal(mob/living/simple_animal/M as mob)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- if(M.melee_damage_upper == 0) return
- if(!(stat & BROKEN))
- visible_message("[M] [M.attacktext] [src]! ")
- add_logs(src, M, "attacked", admin=0, print_attack_log = 0)
- //src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey]) ")
- src.health -= M.melee_damage_upper
- if(src.health <= 0)
- src.die()
- else
- to_chat(M, "That object is useless to you. ")
- return
-
-
-
-
-/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- if(!(stat & BROKEN))
- playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- visible_message("[M] has slashed at [src]! ")
- src.health -= 15
- if(src.health <= 0)
- src.die()
- else
- to_chat(M, "\green That object is useless to you.")
- return
-
-
-
-/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0)
- if(..(href, href_list))
- return 1
- if(src.locked)
- if(!istype(usr, /mob/living/silicon))
- to_chat(usr, "Control panel is locked!")
- return
- if(href_list["toggleOn"])
- src.enabled = !src.enabled
- src.updateTurrets()
- else if(href_list["toggleLethal"])
- src.lethal = !src.lethal
- src.updateTurrets()
- if(!nowindow)
- src.attack_hand(usr)
-
-/obj/machinery/turretid/proc/update_icons()
- if(src.enabled)
- if(src.lethal)
- icon_state = "control_kill"
- else
- icon_state = "control_stun"
- else
- icon_state = "control_standby"
- //CODE FIXED BUT REMOVED
-// if(control_area) //USE: updates other controls in the area
-// for(var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was
-// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person
-// Turret_Control.icon_state = icon_state //who coded it originally was just tired
-// Turret_Control.enabled = enabled //or something. I don't see any situation
-// Turret_Control.lethal = lethal //in which this would be used on the current map.
- //If he wants it back he can uncomment it
-
-
-/obj/machinery/gun_turret //related to turrets but work way differentely because of being mounted on a moving ship.
- name = "machine gun turret"
- desc = "Syndicate heavy defense turret. It really packs a bunch."
- density = 1
- anchored = 1
- var/state = 0 //Like stat on mobs, 0 is alive, 1 is damaged, 2 is dead
- var/faction = "syndicate"
- var/atom/cur_target = null
- var/scan_range = 9 //You will never see them coming
- var/health = 200 //Because it lacks a cover, and is mostly to keep people from touching the syndie shuttle.
- var/bullet_type = /obj/item/projectile/bullet
- var/firing_sound = 'sound/weapons/Gunshot3.ogg'
- var/base_icon = "syndieturret"
- icon = 'icons/obj/turrets.dmi'
- icon_state = "syndieturret0"
-
-/obj/machinery/gun_turret/New()
- ..()
- take_damage(0) //check your health
-
-/obj/machinery/gun_turret/ex_act(severity)
- switch(severity)
- if(1)
- die()
- if(2)
- take_damage(100)
- if(3)
- take_damage(50)
- return
-
-/obj/machinery/gun_turret/emp_act() //Can't emp an mechanical turret.
- return
-
-/obj/machinery/gun_turret/update_icon()
- if(state > 2 || state < 0) //someone fucked up the vars so fix them
- take_damage(0)
- icon_state = "[base_icon]" + "[state]"
- return
-
-
-/obj/machinery/gun_turret/proc/take_damage(damage)
- health -= damage
- var/orig_health = initial(health)
- var/health_percent = (health/orig_health) * 100
-
- if(health_percent > 50)
- state = 0
- else
- state = 1
- if(health_percent <= 0)
- if(state != 2)
- die()
- return
- state = 2
-
- update_icon()
-
-
-
-
-/obj/machinery/gun_turret/bullet_act(var/obj/item/projectile/Proj)
- if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- take_damage(Proj.damage)
- return
-
-/obj/machinery/gun_turret/proc/die()
- state = 2
- update_icon()
-
-/obj/machinery/gun_turret/attack_hand(mob/user)
- return
-
-/obj/machinery/gun_turret/attack_ai(mob/user)
- return attack_hand(user)
-
-
-/obj/machinery/gun_turret/attack_alien(mob/living/user as mob)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- user.visible_message("[user] slashes at [src]", "You slash at [src]")
- take_damage(15)
- return
-
-/obj/machinery/gun_turret/proc/validate_target(atom/target)
- if(get_dist(target, src)>scan_range)
- return 0
- if(istype(target, /mob))
- var/mob/M = target
- if(!M.stat)
- return 1
- else if(istype(target, /obj/mecha))
- var/obj/mecha/M = target
- if(M.occupant)
- return 1
- else if(istype(target, /obj/spacepod))
- var/obj/spacepod/S = target
- if(S.pilot)
- return 1
- return 0
-
-
-/obj/machinery/gun_turret/process()
- if(state == 2)
- return
- if(cur_target && !validate_target(cur_target))
- cur_target = null
- if(!cur_target)
- cur_target = get_target()
- if(cur_target)
- fire(cur_target)
- return
-
-
-/obj/machinery/gun_turret/proc/get_target()
- var/list/pos_targets = list()
- var/target = null
- for(var/mob/living/M in view(scan_range,src))
- if(M.stat)
- continue
- if(faction in M.faction)
- continue
- if(ispAI(M))
- continue
- pos_targets += M
- for(var/obj/mecha/M in oview(scan_range, src))
- if(M.occupant)
- if(faction in M.occupant.faction)
- continue
- if(!M.occupant)
- continue //Don't shoot at empty mechs.
- pos_targets += M
- for(var/obj/spacepod/M in oview(scan_range, src))
- if(M.pilot)
- var/mob/P = M.pilot
- if(faction in P.faction)
- continue
- if(!M.pilot)
- continue //Don't shoot at empty pods.
- pos_targets += M
- if(pos_targets.len)
- target = pick(pos_targets)
- return target
-
-
-/obj/machinery/gun_turret/proc/fire(atom/target)
- if(!target)
- cur_target = null
- return
- src.dir = get_dir(src,target)
- var/turf/targloc = get_turf(target)
- if(!src)
- return
- var/turf/curloc = get_turf(src)
- if(!targloc || !curloc)
- return
- if(targloc == curloc)
- return
- playsound(get_turf(src), firing_sound, 60, 1)
- var/obj/item/projectile/A = new bullet_type(curloc)
- A.original = target
- A.current = curloc
- A.yo = targloc.y - curloc.y
- A.xo = targloc.x - curloc.x
- A.fire()
- return
-
-
-/obj/machinery/gun_turret/interior
- name = "machine gun turret (.45)"
- desc = "Syndicate interior defense turret chambered for .45 rounds. Designed to down intruders without damaging the hull."
- bullet_type = /obj/item/projectile/bullet/midbullet
-
-/obj/machinery/gun_turret/exterior
- name = "machine gun turret (7.62)"
- desc = "Syndicate exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."
- bullet_type = /obj/item/projectile/bullet
-
-/obj/machinery/gun_turret/grenade
- name = "mounted grenade launcher (40mm)"
- desc = "Syndicate 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."
- bullet_type = /obj/item/projectile/bullet/a40mm
-
-/obj/machinery/gun_turret/assault_pod
- name = "machine gun turret (4.6x30mm)"
- desc = "Syndicate exterior defense turret chambered for 4.6x30mm rounds. Designed to be fitted to assault pods, it uses low calliber bullets to save space."
- health = 100
- bullet_type = /obj/item/projectile/bullet/weakbullet3
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 55b7a18c936..f9de8b8d596 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -146,11 +146,8 @@
product_records.Add(product)
/obj/machinery/vending/Destroy()
- qdel(wires) // qdel
- wires = null
- if(coin)
- qdel(coin) // qdel
- coin = null
+ QDEL_NULL(wires)
+ QDEL_NULL(coin)
return ..()
/obj/machinery/vending/ex_act(severity)
@@ -221,8 +218,8 @@
if(PDA.id)
paid = pay_with_card(PDA.id)
handled = 1
- else if(istype(I, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/C = I
+ else if(istype(I, /obj/item/stack/spacecash))
+ var/obj/item/stack/spacecash/C = I
paid = pay_with_cash(C, user)
handled = 1
@@ -237,7 +234,7 @@
return
if(istype(I, /obj/item/weapon/screwdriver) && anchored)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
overlays.Cut()
@@ -264,7 +261,7 @@
I.loc = src
coin = I
categories |= CAT_COIN
- to_chat(user, "\blue You insert the [I] into the [src]")
+ to_chat(user, "You insert the [I] into the [src] ")
nanomanager.update_uis(src)
return
else if(istype(I, refill_canister) && refill_canister != null)
@@ -297,8 +294,8 @@
*
* usr is the mob who gets the change.
*/
-/obj/machinery/vending/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
- if(currently_vending.price > cashmoney.get_total())
+/obj/machinery/vending/proc/pay_with_cash(obj/item/stack/spacecash/cashmoney, mob/user)
+ if(currently_vending.price > cashmoney.amount)
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
to_chat(usr, "[bicon(cashmoney)] That is not enough money. ")
@@ -310,12 +307,7 @@
// just assume that all spacecash that's not something else is a bill
visible_message("[usr] inserts a credit chip into [src]. ")
- var/left = cashmoney.get_total() - currently_vending.price
- usr.unEquip(cashmoney)
- qdel(cashmoney)
-
- if(left)
- dispense_cash(left, src.loc, user)
+ cashmoney.use(currently_vending.price)
// Vending machines have no idea who paid with cash
credit_purchase("(cash)")
@@ -389,10 +381,13 @@
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
-/obj/machinery/vending/attack_ai(mob/user as mob)
+/obj/machinery/vending/attack_ai(mob/user)
return attack_hand(user)
-/obj/machinery/vending/attack_hand(mob/user as mob)
+/obj/machinery/vending/attack_ghost(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/vending/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
@@ -465,7 +460,7 @@
usr.put_in_hands(coin)
coin = null
- to_chat(usr, "\blue You remove the [coin] from the [src]")
+ to_chat(usr, "You remove [coin] from [src]. ")
categories &= ~CAT_COIN
if(href_list["pay"])
@@ -479,127 +474,127 @@
else if(istype(usr.get_active_hand(), /obj/item/weapon/card))
paid = pay_with_card(usr.get_active_hand())
handled = 1
+ else if(usr.can_admin_interact())
+ paid = 1
+ handled = 1
if(paid)
- src.vend(currently_vending, usr)
+ vend(currently_vending, usr)
return
else if(handled)
nanomanager.update_uis(src)
return // don't smack that machine with your 2 credits
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
- if((href_list["vend"]) && (src.vend_ready) && (!currently_vending))
+ if((href_list["vend"]) && vend_ready && !currently_vending)
- if(issilicon(usr) && !isrobot(usr))
- to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic! ")
- return
+ if(issilicon(usr) && !isrobot(usr))
+ to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic! ")
+ return
- if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
- to_chat(usr, "Access denied. ")//Unless emagged of course
+ if(!allowed(usr) && !usr.can_admin_interact() && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
+ to_chat(usr, "Access denied. ") //Unless emagged of course
+ flick(icon_deny,src)
+ return
- flick(icon_deny,src)
- return
+ var/key = text2num(href_list["vend"])
+ var/datum/data/vending_product/R = product_records[key]
- var/key = text2num(href_list["vend"])
- var/datum/data/vending_product/R = product_records[key]
+ // This should not happen unless the request from NanoUI was bad
+ if(!(R.category & categories))
+ return
- // This should not happen unless the request from NanoUI was bad
- if(!(R.category & src.categories))
- return
-
- if(R.price <= 0)
- src.vend(R, usr)
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ if(!vendor_account || vendor_account.suspended)
+ status_message = "This machine is currently unable to process payments due to problems with the associated account."
+ status_error = 1
else
- src.currently_vending = R
- if(!vendor_account || vendor_account.suspended)
- src.status_message = "This machine is currently unable to process payments due to problems with the associated account."
- src.status_error = 1
- else
- src.status_message = "Please swipe a card or insert cash to pay for the item."
- src.status_error = 0
+ status_message = "Please swipe a card or insert cash to pay for the item."
+ status_error = 0
- else if(href_list["cancelpurchase"])
- src.currently_vending = null
+ else if(href_list["cancelpurchase"])
+ currently_vending = null
- else if((href_list["togglevoice"]) && (src.panel_open))
- src.shut_up = !src.shut_up
+ else if(href_list["togglevoice"] && panel_open)
+ shut_up = !src.shut_up
- src.add_fingerprint(usr)
- nanomanager.update_uis(src)
+ add_fingerprint(usr)
+ nanomanager.update_uis(src)
/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user)
- if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
+ if(!allowed(usr) && !usr.can_admin_interact() && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
to_chat(usr, "Access denied. ")//Unless emagged of course
+ flick(icon_deny,src)
+ return
- flick(src.icon_deny,src)
- return
if(!R.amount)
- to_chat(user, "\red The vending machine has ran out of that product.")
+ to_chat(user, "The vending machine has ran out of that product. ")
return
- src.vend_ready = 0 //One thing at a time!!
- src.status_message = "Vending..."
- src.status_error = 0
+
+ vend_ready = 0 //One thing at a time!!
+ status_message = "Vending..."
+ status_error = 0
nanomanager.update_uis(src)
if(R.category & CAT_COIN)
if(!coin)
- to_chat(user, "\blue You need to insert a coin to get this item.")
+ to_chat(user, "You need to insert a coin to get this item. ")
return
if(coin.string_attached)
if(prob(50))
- to_chat(user, "\blue You successfully pull the coin out before the [src] could swallow it.")
+ to_chat(user, "You successfully pull the coin out before the [src] could swallow it. ")
else
- to_chat(user, "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all.")
- coin = null
- qdel(coin)
+ to_chat(user, "You weren't able to pull the coin out fast enough, the machine ate it, string and all. ")
+ QDEL_NULL(coin)
categories &= ~CAT_COIN
else
- coin = null
- qdel(coin)
+ QDEL_NULL(coin)
categories &= ~CAT_COIN
R.amount--
- if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply)
+ if(((last_reply + (vend_delay + 200)) <= world.time) && vend_reply)
spawn(0)
- src.speak(src.vend_reply)
- src.last_reply = world.time
+ speak(src.vend_reply)
+ last_reply = world.time
use_power(vend_power_usage) //actuators and stuff
- if(src.icon_vend) //Show the vending animation if needed
- flick(src.icon_vend,src)
+ if(icon_vend) //Show the vending animation if needed
+ flick(icon_vend,src)
spawn(src.vend_delay)
new R.product_path(get_turf(src))
- src.status_message = ""
- src.status_error = 0
- src.vend_ready = 1
+ status_message = ""
+ status_error = 0
+ vend_ready = 1
currently_vending = null
nanomanager.update_uis(src)
/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user)
- if(src.panel_open)
- to_chat(user, "\blue You stock the [src] with \a [R.product_name]")
+ if(panel_open)
+ to_chat(user, "You stock the [src] with \a [R.product_name] ")
R.amount++
- src.updateUsrDialog()
+ updateUsrDialog()
/obj/machinery/vending/process()
if(stat & (BROKEN|NOPOWER))
return
- if(!src.active)
+ if(!active)
return
if(src.seconds_electrified > 0)
src.seconds_electrified--
//Pitch to the people! Really sell it!
- if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5))
+ if(((last_slogan + src.slogan_delay) <= world.time) && (slogan_list.len > 0) && (!shut_up) && prob(5))
var/slogan = pick(src.slogan_list)
- src.speak(slogan)
- src.last_slogan = world.time
+ speak(slogan)
+ last_slogan = world.time
- if(src.shoot_inventory && prob(shoot_chance))
- src.throw_item()
+ if(shoot_inventory && prob(shoot_chance))
+ throw_item()
return
@@ -620,12 +615,12 @@
stat &= ~NOPOWER
else
spawn(rand(0, 15))
- src.icon_state = "[initial(icon_state)]-off"
+ icon_state = "[initial(icon_state)]-off"
stat |= NOPOWER
//Oh no we're malfunctioning! Dump out some product and break.
/obj/machinery/vending/proc/malfunction()
- for(var/datum/data/vending_product/R in src.product_records)
+ for(var/datum/data/vending_product/R in product_records)
if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
@@ -633,12 +628,12 @@
continue
while(R.amount>0)
- new dump_path(src.loc)
+ new dump_path(loc)
R.amount--
break
stat |= BROKEN
- src.icon_state = "[initial(icon_state)]-broken"
+ icon_state = "[initial(icon_state)]-broken"
return
//Somebody cut an important wire and now we're following a new definition of "pitch."
@@ -648,7 +643,7 @@
if(!target)
return 0
- for(var/datum/data/vending_product/R in src.product_records)
+ for(var/datum/data/vending_product/R in product_records)
if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
@@ -656,13 +651,13 @@
continue
R.amount--
- throw_item = new dump_path(src.loc)
+ throw_item = new dump_path(loc)
break
if(!throw_item)
return 0
spawn(0)
throw_item.throw_at(target, 16, 3, src)
- src.visible_message("[src] launches [throw_item.name] at [target.name]! ")
+ visible_message("[src] launches [throw_item.name] at [target.name]! ")
return 1
/*
@@ -800,6 +795,17 @@
/obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 6)
prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50,
/obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 50)
+ refill_canister = /obj/item/weapon/vending_refill/chinese
+
+/obj/machinery/vending/chinese/New()
+ ..()
+ component_parts = list()
+ var/obj/item/weapon/circuitboard/vendor/V = new(null)
+ V.set_type(type)
+ component_parts += V
+ component_parts += new /obj/item/weapon/vending_refill/chinese(0)
+ component_parts += new /obj/item/weapon/vending_refill/chinese(0)
+ component_parts += new /obj/item/weapon/vending_refill/chinese(0)
/obj/machinery/vending/cola
name = "\improper Robust Softdrinks"
@@ -865,10 +871,10 @@
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
vend_delay = 34
icon_state = "cigs"
- products = list(/obj/item/weapon/storage/fancy/cigarettes = 5,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 2, /obj/item/weapon/reagent_containers/food/pill/patch/nicotine = 10, /obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/rollingpaperpack = 5)
+ products = list(/obj/item/weapon/storage/fancy/cigarettes = 5,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 2, /obj/item/weapon/reagent_containers/food/pill/patch/nicotine = 10, /obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/storage/fancy/rollingpapers = 5)
contraband = list(/obj/item/weapon/lighter/zippo = 4)
premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold = 1)
- prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 150, /obj/item/weapon/reagent_containers/food/pill/patch/nicotine = 15, /obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60, /obj/item/weapon/rollingpaperpack = 20)
+ prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 60,/obj/item/weapon/storage/fancy/cigarettes/cigpack_random = 150, /obj/item/weapon/reagent_containers/food/pill/patch/nicotine = 15, /obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60, /obj/item/weapon/storage/fancy/rollingpapers = 20)
refill_canister = /obj/item/weapon/vending_refill/cigarette
/obj/machinery/vending/cigarette/New()
@@ -955,8 +961,8 @@
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri"
icon_deny = "nutri-deny"
- products = list(/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez = 35,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/l4z = 25,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/rh = 15,/obj/item/weapon/plantspray/pests = 20,
- /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
+ products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/weapon/reagent_containers/spray/pestspray = 20,
+ /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5,/obj/item/weapon/cultivator = 3,/obj/item/weapon/shovel/spade = 3,/obj/item/device/plant_analyzer = 4)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
///obj/item/beezeez = 45,
@@ -967,16 +973,16 @@
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
- products = list(/obj/item/seeds/aloeseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/appleseed = 3,/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,
- /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/chantermycelium = 3,
- /obj/item/seeds/chiliseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/coffeeaseed = 3,/obj/item/seeds/comfreyseed =3,/obj/item/seeds/cornseed = 3,
- /obj/item/seeds/eggplantseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/lemonseed = 3,
- /obj/item/seeds/limeseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/peanutseed = 3,/obj/item/seeds/potatoseed = 3,/obj/item/seeds/poppyseed = 3,
- /obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/riceseed = 3,/obj/item/seeds/soyaseed = 3,/obj/item/seeds/sunflowerseed = 3,
- /obj/item/seeds/teaasperaseed = 3,/obj/item/seeds/tobaccoseed = 3,/obj/item/seeds/tomatoseed = 3,
- /obj/item/seeds/towermycelium = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/whitebeetseed = 3)
- contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2,
- /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/random = 2, /obj/item/seeds/reishimycelium = 2, /obj/item/seeds/brownmold = 2)
+ products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3,/obj/item/seeds/apple = 3,/obj/item/seeds/banana = 3,/obj/item/seeds/berry = 3,
+ /obj/item/seeds/cabbage = 3,/obj/item/seeds/carrot = 3,/obj/item/seeds/cherry = 3,/obj/item/seeds/chanter = 3,
+ /obj/item/seeds/chili = 3,/obj/item/seeds/cocoapod = 3,/obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3,
+ /obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3,/obj/item/seeds/grape = 3,/obj/item/seeds/grass = 3,/obj/item/seeds/lemon = 3,
+ /obj/item/seeds/lime = 3,/obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3,
+ /obj/item/seeds/pumpkin = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/wheat/rice = 3,/obj/item/seeds/soya = 3,/obj/item/seeds/sunflower = 3,
+ /obj/item/seeds/tea = 3,/obj/item/seeds/tobacco = 3,/obj/item/seeds/tomato = 3,
+ /obj/item/seeds/tower = 3,/obj/item/seeds/watermelon = 3,/obj/item/seeds/wheat = 3,/obj/item/seeds/whitebeet = 3)
+ contraband = list(/obj/item/seeds/amanita = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/liberty = 2,/obj/item/seeds/nettle = 2,
+ /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2,/obj/item/seeds/cannabis = 3, /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2)
premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1)
/**
@@ -1117,7 +1123,7 @@
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access_txt = "11" //Engineering Equipment access
- products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/firealarm_electronics = 10,/obj/item/weapon/apc_electronics = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/stock_parts/cell/high = 10,/obj/item/weapon/camera_assembly = 10)
+ products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/firelock_electronics = 10,/obj/item/weapon/firealarm_electronics = 10,/obj/item/weapon/apc_electronics = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/stock_parts/cell/high = 10,/obj/item/weapon/camera_assembly = 10)
contraband = list(/obj/item/weapon/stock_parts/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
@@ -1151,13 +1157,6 @@
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
-
-/obj/machinery/vending/eva
- name = "\improper Hardsuit Kits"
- desc = "Conversion kits for your alien hardsuit needs."
- products = list(/obj/item/device/modkit = 6,/obj/item/device/modkit/tajaran = 6,/obj/item/device/modkit/unathi = 6,/obj/item/device/modkit/skrell = 6,/obj/item/device/modkit/vox = 6)
-
-
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement."
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index e075457a9e5..e27a97c796c 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -199,7 +199,7 @@
/obj/machinery/washing_machine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
/*if(istype(W,/obj/item/weapon/screwdriver))
panel = !panel
- to_chat(user, "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel")*/
+ to_chat(user, "you [panel ? "open" : "close"] the [src]'s maintenance panel")*/
if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp))
if( state in list( 1, 3, 6 ) )
if(!crayon)
@@ -278,9 +278,9 @@
W.loc = src
state = 3
else
- to_chat(user, "\blue You can't put the item in right now.")
+ to_chat(user, "You can't put the item in right now. ")
else
- to_chat(user, "\blue The washing machine is full.")
+ to_chat(user, "The washing machine is full. ")
else
..()
update_icon()
@@ -302,7 +302,7 @@
crayon = null
state = 1
if(5)
- to_chat(user, "\red The [src] is busy.")
+ to_chat(user, "The [src] is busy. ")
if(6)
state = 7
if(7)
diff --git a/code/game/magic/Uristrunes.dm b/code/game/magic/Uristrunes.dm
index 5cb7dc4127e..ed881c71fb1 100644
--- a/code/game/magic/Uristrunes.dm
+++ b/code/game/magic/Uristrunes.dm
@@ -17,7 +17,10 @@ var/runetype = "rune"
/proc/get_rune(symbol_bits, animated = 0)
var/lookup = "[symbol_bits]-[animated]"
- if(ticker.mode.cultdat.theme == "fire")
+
+ if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way
+ runetype = "rune"
+ else if(ticker.mode.cultdat.theme == "fire")
runetype = "fire-rune"
if(lookup in rune_cache)
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index c75ff304922..471a24078fb 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -46,17 +46,13 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
- ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
+ ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
ME.attach(src)
-/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new(src)
+/obj/mecha/combat/gygax/dark/add_cell()
+ cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
cell.charge = 30000
cell.maxcharge = 30000
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index cecbc1e5b13..1a901f4a71e 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -21,7 +21,7 @@
add_req_access = 0
internal_damage_threshold = 25
force = 45
- max_equip = 4
+ max_equip = 5
/obj/mecha/combat/marauder/loaded/New()
@@ -30,6 +30,8 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
ME.attach(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray(src)
+ ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
@@ -47,8 +49,13 @@
health = 550
wreckage = /obj/effect/decal/mecha_wreckage/seraph
internal_damage_threshold = 20
- force = 55
- max_equip = 5
+ force = 80
+ max_equip = 8
+
+/obj/mecha/combat/marauder/seraph/add_cell()
+ cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
+ cell.charge = 40000
+ cell.maxcharge = 40000
/obj/mecha/combat/marauder/seraph/loaded/New()
..()//Let it equip whatever is needed.
@@ -57,17 +64,20 @@
for(ME in equipment)
equipment -= ME
qdel(ME)
- ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy(src)
ME.attach(src)
- ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple(src)
ME.attach(src)
- ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual(src)
+ ME.attach(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
+
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
name = "Mauler"
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 205fb4497cd..5f66ad3a85c 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -28,18 +28,18 @@
ME = new /obj/item/mecha_parts/mecha_equipment/gravcatapult
ME.attach(src)
-/obj/mecha/combat/phazon/Bump(var/atom/obstacle)
- if(phasing && get_charge() >= phasing_energy_drain)
- spawn()
- if(can_move)
- can_move = 0
- flick("phazon-phase", src)
- forceMove(get_step(src, dir))
- use_power(phasing_energy_drain)
- sleep(step_in * 3)
- can_move = 1
- else
- . = ..()
+/obj/mecha/combat/phazon/mechstep(direction)
+ . = ..()
+ if(!. && phasing && get_charge() >= phasing_energy_drain)
+ if(can_move)
+ can_move = 0
+ flick("phazon-phase", src)
+ forceMove(get_step(src, direction))
+ use_power(phasing_energy_drain)
+ playsound(src,stepsound,40,1)
+ sleep(step_in * 3)
+ can_move = 1
+ return 1
/obj/mecha/combat/phazon/click_action(atom/target,mob/user)
if(phasing)
@@ -62,7 +62,7 @@
if("Torch")
damtype = "fire"
occupant_message("A torch tip extends from your exosuit's hand, glowing red.")
- if("Toxic injector")
+ if("Toxic Injector")
damtype = "tox"
occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.")
playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1)
diff --git a/code/game/mecha/combat/recitence.dm b/code/game/mecha/combat/reticence.dm
similarity index 79%
rename from code/game/mecha/combat/recitence.dm
rename to code/game/mecha/combat/reticence.dm
index 04e1e98c063..19eb34fb448 100644
--- a/code/game/mecha/combat/recitence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -1,6 +1,6 @@
-/obj/mecha/combat/recitence
+/obj/mecha/combat/reticence
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
- name = "\improper Recitence"
+ name = "\improper Reticence"
icon_state = "mime"
initial_icon = "mime"
step_in = 2
@@ -9,17 +9,18 @@
deflect_chance = 30
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 15000
- wreckage = /obj/effect/decal/mecha_wreckage/recitence
+ wreckage = /obj/effect/decal/mecha_wreckage/reticence
operation_req_access = list(access_mime)
add_req_access = 0
internal_damage_threshold = 60
max_equip = 3
step_energy_drain = 3
stepsound = null
+ turnsound = null
-/obj/mecha/combat/recitence/loaded/New()
+/obj/mecha/combat/reticence/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/mimercd //HAHA IT MAKES WALLS GET IT
- ME.attach(src)
\ No newline at end of file
+ ME.attach(src)
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index d95570cf88f..13602957de1 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -243,7 +243,6 @@
desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "syringegun"
- flags = NOREACT
var/list/syringes
var/list/known_reagents
var/list/processed_reagents
@@ -259,6 +258,7 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New()
..()
create_reagents(max_volume)
+ reagents.set_reacting(FALSE)
syringes = new
known_reagents = list("epinephrine"="Epinephrine","charcoal"="Charcoal")
processed_reagents = new
@@ -273,7 +273,8 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail()
..()
- flags &= ~NOREACT
+ if(reagents)
+ reagents.set_reacting(TRUE)
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M)
if(..())
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 184766dc3ed..3f60c56a952 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -9,17 +9,25 @@
icon_state = "mecha_teleport"
origin_tech = "bluespace=10"
equip_cooldown = 150
- energy_drain = 1000
+ energy_drain = 8000
range = RANGED
+ var/tele_precision = 4
/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target)
if(!action_checks(target) || !is_teleport_allowed(loc.z))
return
var/turf/T = get_turf(target)
if(T)
- do_teleport(chassis, T, 4)
+ chassis.use_power(energy_drain)
+ do_teleport(chassis, T, tele_precision)
return 1
+/obj/item/mecha_parts/mecha_equipment/teleporter/precise
+ name = "upgraded teleporter"
+ desc = "An exosuit module that allows exosuits to teleport to any position in view. This is the high-precision, energy-efficient version."
+ origin_tech = "bluespace=13"
+ energy_drain = 1000
+ tele_precision = 1
////////////////////////////////////////////// WORMHOLE GENERATOR //////////////////////////////////////////
@@ -177,7 +185,7 @@
icon_state = "repair_droid"
origin_tech = "magnets=3;programming=3"
equip_cooldown = 20
- energy_drain = 100
+ energy_drain = 50
range = 0
var/health_boost = 1
var/icon/droid_overlay
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 23e18d53a0d..7a0e388b39e 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -194,6 +194,8 @@
range = MELEE|RANGED
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
var/canRwall = 0
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/mecha_parts/mecha_equipment/rcd/New()
rcd_list += src
@@ -224,7 +226,7 @@
if(do_after_cooldown(W))
chassis.spark_system.start()
W.ChangeTurf(/turf/simulated/floor/plating)
- playsound(W, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(W, usesound, 50, 1)
else if(istype(target, /turf/simulated/floor))
var/turf/simulated/floor/F = target
occupant_message("Deconstructing [target]...")
@@ -232,27 +234,27 @@
chassis.spark_system.start()
F.ChangeTurf(/turf/space)
F.air_update_turf()
- playsound(F, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(F, usesound, 50, 1)
else if(istype(target, /obj/machinery/door/airlock))
occupant_message("Deconstructing [target]...")
if(do_after_cooldown(target))
chassis.spark_system.start()
qdel(target)
- playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(target, usesound, 50, 1)
if(1)
if(istype(target, /turf/space))
var/turf/space/S = target
occupant_message("Building Floor...")
if(do_after_cooldown(S))
S.ChangeTurf(/turf/simulated/floor/plating)
- playsound(S, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(S, usesound, 50, 1)
chassis.spark_system.start()
else if(istype(target, /turf/simulated/floor))
var/turf/simulated/floor/F = target
occupant_message("Building Wall...")
if(do_after_cooldown(F))
F.ChangeTurf(/turf/simulated/wall)
- playsound(F, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(F, usesound, 50, 1)
chassis.spark_system.start()
if(2)
if(istype(target, /turf/simulated/floor))
@@ -261,7 +263,7 @@
chassis.spark_system.start()
var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target)
T.autoclose = 1
- playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(target, usesound, 50, 1)
playsound(target, 'sound/effects/sparks2.ogg', 50, 1)
@@ -283,14 +285,14 @@
/obj/item/mecha_parts/mecha_equipment/mimercd
name = "mounted MRCD"
- desc = "An exosuit-mounted Mime Rapid Construction Device. (Can be attached to: Recitence)"
+ desc = "An exosuit-mounted Mime Rapid Construction Device. (Can be attached to: Reticence)"
icon_state = "mecha_rcd"
origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4"
equip_cooldown = 10
energy_drain = 250
range = MELEE|RANGED
-/obj/item/mecha_parts/mecha_equipment/mimercd/can_attach(obj/mecha/combat/recitence/M)
+/obj/item/mecha_parts/mecha_equipment/mimercd/can_attach(obj/mecha/combat/reticence/M)
if(..())
if(istype(M))
return 1
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index fedb792c37d..5fea88f278f 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -68,17 +68,23 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
equip_cooldown = 8
- name = "CH-PS \"Immolator\" Laser"
+ name = "CH-PS \"Firedart\" Laser"
icon_state = "mecha_laser"
energy_drain = 30
projectile = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg'
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
+ name = "CH-PD Disabler"
+ projectile = /obj/item/projectile/beam/disabler
+ projectiles_per_shot = 2
+ projectile_delay = 1
+
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
equip_cooldown = 10
name = "CH-LC \"Solaris\" Laser Cannon"
icon_state = "mecha_laser"
- energy_drain = 40
+ energy_drain = 60
projectile = /obj/item/projectile/beam/laser/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg'
@@ -90,6 +96,41 @@
projectile = /obj/item/projectile/ion
fire_sound = 'sound/weapons/Laser.ogg'
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
+ equip_cooldown = 35
+ name = "P-X Tesla Cannon"
+ desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine"
+ icon_state = "mecha_laser"
+ origin_tech = "materials=4;combat=5;magnets=4"
+ energy_drain = 500
+ projectile = /obj/item/projectile/energy/shock_revolver
+ fire_sound = 'sound/magic/lightningbolt.ogg'
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray
+ equip_cooldown = 35
+ name = "S-1 X-Ray Projector"
+ desc = "A weapon for combat exosuits. Fires beams of X-Rays that pass through solid matter."
+ icon_state = "mecha_laser"
+ origin_tech = "materials=3;combat=5;magnets=2;syndicate=2"
+ energy_drain = 80
+ projectile = /obj/item/projectile/beam/xray
+ fire_sound = 'sound/weapons/laser3.ogg'
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple
+ name = "X-XR Triple-barrel X-Ray Stream Projector"
+ projectiles_per_shot = 3
+ projectile_delay = 1
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
+ equip_cooldown = 35
+ name = "ZFI Immolation Beam Gun"
+ desc = "A weapon for combat exosuits. Fires beams of extreme heat that set targets on fire."
+ icon_state = "mecha_laser"
+ origin_tech = "materials=4;combat=4;magnets=3;plasmatech=2"
+ energy_drain = 80
+ projectile = /obj/item/projectile/beam/immolator
+ fire_sound = 'sound/weapons/laser3.ogg'
+
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
equip_cooldown = 30
name = "eZ-13 mk2 Heavy pulse rifle"
@@ -111,15 +152,15 @@
if(ismob(A))
var/mob/M = A
if(istype(firer, /mob))
- M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src] "
- firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src] "
+ M.create_attack_log("[firer]/[firer.ckey] shot [M]/[M.ckey] with a [src] ")
+ firer.create_attack_log("[firer]/[firer.ckey] shot [M]/[M.ckey] with a [src] ")
log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] ")
if(!iscarbon(firer))
M.LAssailant = null
else
M.LAssailant = firer
else
- M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src] "
+ M.create_attack_log("UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src] ")
log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] ")
if(life <= 0)
qdel(src)
@@ -183,7 +224,7 @@
spawn(20)
if(thingy)
walk(thingy,0)
- for(var/obj/mecha/combat/recitence/R in oview(6, chassis))
+ for(var/obj/mecha/combat/reticence/R in oview(6, chassis))
R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.")
R.use_power(R.get_charge() / 4)
@@ -237,14 +278,14 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
- fire_sound = "sound/weapons/Gunshot_silenced.ogg"
+ fire_sound = 'sound/weapons/Gunshot_silenced.ogg'
icon_state = "mecha_mime"
equip_cooldown = 15
projectile = /obj/item/projectile/bullet/mime
projectiles = 20
projectile_energy_cost = 50
-/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced/can_attach(obj/mecha/combat/recitence/M as obj)
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced/can_attach(obj/mecha/combat/reticence/M as obj)
if(..())
if(istype(M))
return 1
@@ -273,8 +314,12 @@
variance = 6
projectile_delay = 2
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual
+ name = "XMG-9 Autocannon"
+ projectiles_per_shot = 6
+
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
- name = "SRM-8 Missile Rack"
+ name = "SRM-8 Light Missile Rack"
icon_state = "mecha_missilerack"
projectile = /obj/item/missile
fire_sound = 'sound/effects/bang.ogg'
@@ -283,6 +328,7 @@
equip_cooldown = 60
var/missile_speed = 2
var/missile_range = 30
+ var/heavy_missile = 0
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/action(target, params)
if(!action_checks(target))
@@ -290,6 +336,8 @@
set_ready_state(0)
var/obj/item/missile/M = new projectile(chassis.loc)
M.primed = 1
+ if(heavy_missile)
+ M.heavy_missile = 1
playsound(chassis, fire_sound, 50, 1)
M.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
@@ -300,16 +348,23 @@
do_after_cooldown()
return
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy
+ name = "SRX-13 Heavy Missile Launcher"
+ heavy_missile = 1
/obj/item/missile
icon = 'icons/obj/grenade.dmi'
icon_state = "missile"
var/primed = null
+ var/heavy_missile = 0
throwforce = 15
/obj/item/missile/throw_impact(atom/hit_atom)
if(primed)
- explosion(hit_atom, 0, 0, 2, 4, 0)
+ if(heavy_missile)
+ explosion(hit_atom, 2, 3, 4, 6, 0)
+ else
+ explosion(hit_atom, 0, 0, 2, 4, 0)
qdel(src)
else
..()
@@ -358,7 +413,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
name = "Banana Mortar"
icon_state = "mecha_bananamrtr"
- projectile = /obj/item/weapon/bananapeel
+ projectile = /obj/item/weapon/grown/bananapeel
fire_sound = 'sound/items/bikehorn.ogg'
projectiles = 15
missile_speed = 1.5
@@ -375,7 +430,7 @@
if(!action_checks(target))
return
set_ready_state(0)
- var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc)
+ var/obj/item/weapon/grown/bananapeel/B = new projectile(chassis.loc)
playsound(chassis, fire_sound, 60, 1)
B.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
@@ -448,7 +503,7 @@
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles."
icon_state = "mecha_plasmacutter"
item_state = "plasmacutter"
- energy_drain = 60
+ energy_drain = 30
origin_tech = "materials=3;combat=2;powerstorage=3;plasmatech=3"
projectile = /obj/item/projectile/plasma/adv/mech
fire_sound = 'sound/weapons/laser.ogg'
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 3da5587b2a4..cd20b68f10d 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -39,7 +39,7 @@
"Gygax",
"Durand",
"H.O.N.K",
- "Recitence",
+ "Reticence",
"Phazon",
"Exosuit Equipment",
"Cyborg Upgrade Modules",
@@ -262,13 +262,13 @@
return 1
return interact(user)
-/obj/machinery/mecha_part_fabricator/interact(mob/user as mob)
+/obj/machinery/mecha_part_fabricator/interact(mob/user)
var/dat, left_part
if(..())
return
user.set_machine(src)
var/turf/exit = get_step(src,SOUTH)
- if(exit.density)
+ if(isliving(user) && exit.density)
visible_message("[bicon(src)] \The [src] beeps, \"Error! Part outlet is obstructed.\"")
return
if(temp)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index cd3d62d44ff..2fa9b3af00f 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -50,6 +50,7 @@
var/obj/machinery/atmospherics/unary/portables_connector/connected_port = null
var/obj/item/device/radio/radio = null
+ var/list/trackers = list()
var/max_temperature = 25000
var/internal_damage_threshold = 50 //health percentage below which internal damage is possible
@@ -74,7 +75,7 @@
var/melee_cooldown = 10
var/melee_can_hit = 1
- hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD)
+ hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD)
/obj/mecha/New()
..()
@@ -93,6 +94,7 @@
processing_objects.Add(src)
removeVerb(/obj/mecha/verb/disconnect_from_port)
+ poi_list |= src
log_message("[src] created.")
mechas_list += src //global mech list
prepare_huds()
@@ -101,6 +103,7 @@
diag_hud_set_mechhealth()
diag_hud_set_mechcell()
diag_hud_set_mechstat()
+ diag_hud_set_mechtracking()
////////////////////////
////// Helpers /////////
@@ -164,7 +167,7 @@
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
-/obj/mecha/hear_talk(mob/M as mob, text)
+/obj/mecha/hear_talk(mob/M, text)
if(M == occupant && radio.broadcasting)
radio.talk_into(M, text)
@@ -331,7 +334,7 @@
else if(istype(obstacle, /obj/structure/grille/))
var/obj/structure/grille/G = obstacle
G.health = (0.25*initial(G.health))
- G.destroyed = 1
+ G.broken = 1
G.icon_state = "[initial(G.icon_state)]-b"
G.density = 0
new /obj/item/stack/rods(get_turf(G.loc))
@@ -365,9 +368,12 @@
breakthrough = 1
else
- throwing = 0 //so mechas don't get stuck when landing after being sent by a Mass Driver
+ if(throwing)
+ throwing.finalize(FALSE)
crashing = null
+ ..()
+
if(breakthrough)
if(crashing)
spawn(1)
@@ -464,7 +470,7 @@
qdel(src)
return
-/obj/mecha/attack_hand(mob/living/user as mob)
+/obj/mecha/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
log_message("Attack by hand/paw. Attacker - [user].",1)
@@ -480,7 +486,7 @@
return
-/obj/mecha/attack_alien(mob/living/user as mob)
+/obj/mecha/attack_alien(mob/living/user)
log_message("Attack by alien. Attacker - [user].",1)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
@@ -488,18 +494,18 @@
take_damage(15)
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1)
- to_chat(user, "\red You slash at the armored suit!")
- visible_message("\red The [user] slashes at [name]'s armor!")
+ to_chat(user, "You slash at the armored suit! ")
+ visible_message("The [user] slashes at [name]'s armor! ")
else
log_append_to_last("Armor saved.")
playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1)
- to_chat(user, "\green Your claws had no effect!")
- occupant_message("\blue The [user]'s claws are stopped by the armor.")
- visible_message("\blue The [user] rebounds off [name]'s armor!")
+ to_chat(user, "Your claws had no effect! ")
+ occupant_message("The [user]'s claws are stopped by the armor. ")
+ visible_message("The [user] rebounds off [name]'s armor! ")
return
-/obj/mecha/attack_animal(mob/living/simple_animal/user as mob)
+/obj/mecha/attack_animal(mob/living/simple_animal/user)
log_message("Attack by simple animal. Attacker - [user].",1)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
@@ -512,16 +518,16 @@
take_damage(damage)
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
visible_message("[user] [user.attacktext] [src]!")
- user.attack_log += text("\[[time_stamp()]\] attacked [src.name] ")
+ user.create_attack_log("attacked [name] ")
else
log_append_to_last("Armor saved.")
playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1)
- occupant_message("\blue The [user]'s attack is stopped by the armor.")
- visible_message("\blue The [user] rebounds off [name]'s armor!")
- user.attack_log += text("\[[time_stamp()]\] attacked [name] ")
+ occupant_message("The [user]'s attack is stopped by the armor. ")
+ visible_message("The [user] rebounds off [name]'s armor! ")
+ user.create_attack_log("attacked [name] ")
return
-/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
+/obj/mecha/hitby(atom/movable/A) //wrapper
..()
log_message("Hit by [A].",1)
@@ -534,6 +540,7 @@
dam_coeff = B.damage_coeff
counter_tracking = 1
break
+
if(istype(A, /obj/item/mecha_parts/mecha_tracking))
if(!counter_tracking)
A.forceMove(src)
@@ -607,15 +614,12 @@
WR.crowbar_salvage += internal_tank
internal_tank.forceMove(WR)
else
- for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
- E.forceMove(loc)
- qdel(E)
- if(cell)
- qdel(cell)
- if(internal_tank)
- qdel(internal_tank)
+ QDEL_LIST(equipment)
+ QDEL_NULL(cell)
+ QDEL_NULL(internal_tank)
processing_objects.Remove(src)
+ poi_list.Remove(src)
equipment.Cut()
cell = null
internal_tank = null
@@ -625,8 +629,7 @@
else
qdel(cabin_air)
cabin_air = null
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
mechas_list -= src //global mech list
return ..()
@@ -659,7 +662,7 @@
/obj/mecha/emp_act(severity)
if(get_charge())
- use_power((cell.charge / 2) / severity)
+ use_power((cell.charge/3)/(severity*2))
take_damage(50 / severity, "energy")
log_message("EMP detected", 1)
check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL, MECHA_INT_CONTROL_LOST, MECHA_INT_SHORT_CIRCUIT), 1)
@@ -730,7 +733,7 @@
// Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech
user.visible_message("[user] begins levering out the MMI from the [src].", "You begin to lever out the MMI from the [src].")
to_chat(occupant, "[user] is prying you out of the exosuit! ")
- if(do_after(user,80,target=src))
+ if(do_after(user, 80 * W.toolspeed, target=src))
user.visible_message("[user] pries the MMI out of the [src]! ", "You finish removing the MMI from the [src]! ")
go_out()
return
@@ -796,7 +799,9 @@
to_chat(user, "\the [W] is stuck to your hand, you cannot put it in \the [src] ")
return
W.forceMove(src)
+ trackers += W
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]. ")
+ diag_hud_set_mechtracking()
return
else if(istype(W, /obj/item/weapon/paintkit))
@@ -831,6 +836,8 @@
/obj/mecha/proc/attacked_by(obj/item/I, mob/user)
log_message("Attacked by [I]. Attacker - [user]")
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
var/deflection = deflect_chance
var/dam_coeff = 1
for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment)
@@ -850,11 +857,11 @@
/obj/mecha/emag_act(user as mob)
if(istype(src, /obj/mecha/working/ripley) && emagged == 0)
emagged = 1
- to_chat(usr, "\blue You slide the card through the [src]'s ID slot.")
+ to_chat(usr, "You slide the card through the [src]'s ID slot. ")
playsound(loc, "sparks", 100, 1)
desc += "The mech's equipment slots spark dangerously! "
else
- to_chat(usr, "\red The [src]'s ID slot rejects the card.")
+ to_chat(usr, "The [src]'s ID slot rejects the card. ")
return
@@ -862,20 +869,35 @@
//////////// AI piloting ////////////
/////////////////////////////////////
-/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob)
+/obj/mecha/attack_ai(mob/living/silicon/ai/user)
if(!isAI(user))
return
//Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot.
if(user.can_dominate_mechs)
examine(user) //Get diagnostic information!
- var/obj/item/mecha_parts/mecha_tracking/B = locate(/obj/item/mecha_parts/mecha_tracking) in src
- if(B) //Beacons give the AI more detailed mech information.
+ for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)
to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:")
- to_chat(user, "[B.get_mecha_info()]")
+ to_chat(user, "[B.get_mecha_info_text()]")
+ break
//Nothing like a big, red link to make the player feel powerful!
to_chat(user, "ASSUME DIRECT CONTROL? ")
+ else
+ examine(user)
+ if(occupant)
+ user << "This exosuit has a pilot and cannot be controlled. "
+ return
+ var/can_control_mech = FALSE
+ for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers)
+ can_control_mech = TRUE
+ to_chat(user, "[bicon(src)] Status of [name]: \n\
+ [A.get_mecha_info_text()]")
+ break
+ if(!can_control_mech)
+ to_chat(user, "You cannot control exosuits without AI control beacons installed. ")
+ return
+ to_chat(user, "Take control of exosuit? ")
-/obj/mecha/transfer_ai(var/interaction, mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
+/obj/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card)
if(!..())
return
@@ -903,12 +925,13 @@
to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.")
to_chat(user, "Transfer successful : [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.")
- if(AI_MECH_HACK) //Called by Malf AI mob on the mech.
- new /obj/structure/AIcore/deactivated(AI.loc)
- if(occupant) //Oh, I am sorry, were you using that?
- to_chat(AI, "Pilot detected! Forced ejection initiated!")
- to_chat(occupant, "You have been forcibly ejected! ")
- go_out(1) //IT IS MINE, NOW. SUCK IT, RD!
+ if(AI_MECH_HACK) //Called by AIs on the mech
+ AI.linked_core = new /obj/structure/AIcore/deactivated(AI.loc)
+ if(AI.can_dominate_mechs)
+ if(occupant) //Oh, I am sorry, were you using that?
+ to_chat(AI, "Pilot detected! Forced ejection initiated!")
+ to_chat(occupant, "You have been forcibly ejected! ")
+ go_out(1) //IT IS MINE, NOW. SUCK IT, RD!
ai_enter_mech(AI, interaction)
if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech.
@@ -928,7 +951,7 @@
ai_enter_mech(AI, interaction)
//Hack and From Card interactions share some code, so leave that here for both to use.
-/obj/mecha/proc/ai_enter_mech(var/mob/living/silicon/ai/AI, var/interaction)
+/obj/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI, interaction)
AI.aiRestorePowerRoutine = 0
AI.loc = src
occupant = AI
@@ -941,7 +964,7 @@
AI.remote_control = src
AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES.
- to_chat(AI, "[interaction == AI_MECH_HACK ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector! " \
+ to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector! " \
: "You have been uploaded to a mech's onboard computer."]")
to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions. ")
@@ -1024,12 +1047,12 @@
var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc
if(possible_port)
if(connect(possible_port))
- occupant_message("\blue [name] connects to the port.")
+ occupant_message("[name] connects to the port. ")
verbs += /obj/mecha/verb/disconnect_from_port
verbs -= /obj/mecha/verb/connect_to_port
return
else
- occupant_message("\red [name] failed to connect to the port.")
+ occupant_message("[name] failed to connect to the port. ")
return
else
occupant_message("Nothing happens")
@@ -1044,11 +1067,11 @@
if(usr!=occupant)
return
if(disconnect())
- occupant_message("\blue [name] disconnects from the port.")
+ occupant_message("[name] disconnects from the port. ")
verbs -= /obj/mecha/verb/disconnect_from_port
verbs += /obj/mecha/verb/connect_to_port
else
- occupant_message("\red [name] is not connected to the port at the moment.")
+ occupant_message("[name] is not connected to the port at the moment. ")
/obj/mecha/verb/toggle_lights()
set name = "Toggle Lights"
@@ -1168,7 +1191,7 @@
to_chat(user, "You stop inserting the MMI. ")
return 0
-/obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
if(mmi_as_oc && user in range(1))
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
to_chat(user, "Consciousness matrix not detected.")
@@ -1235,7 +1258,7 @@
if(occupant && occupant == M) // The occupant exited the mech without calling go_out()
go_out(1, newloc)
-/obj/mecha/proc/go_out(var/forced, var/atom/newloc = loc)
+/obj/mecha/proc/go_out(forced, atom/newloc = loc)
if(!occupant)
return
var/atom/movable/mob_container
@@ -1244,15 +1267,29 @@
if(ishuman(occupant))
mob_container = occupant
//RemoveActions(occupant, human_occupant=1)
- else if(istype(occupant, /mob/living/carbon/brain))
+ else if(isbrain(occupant))
var/mob/living/carbon/brain/brain = occupant
//RemoveActions(brain)
mob_container = brain.container
- else if(isAI(occupant) && forced) //This should only happen if there are multiple AIs in a round, and at least one is Malf.
- //RemoveActions(occupant)
- occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced.
- occupant = null
- return
+ else if(isAI(occupant))
+ var/mob/living/silicon/ai/AI = occupant
+ if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf.
+ //RemoveActions(occupant)
+ occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced.
+ occupant = null
+ return
+ else
+ if(!AI.linked_core || qdeleted(AI.linked_core))
+ to_chat(AI, "Inactive core destroyed. Unable to return. ")
+ AI.linked_core = null
+ return
+ to_chat(AI, "Returning to core... ")
+ AI.controlled_mech = null
+ AI.remote_control = null
+ //RemoveActions(occupant, 1)
+ mob_container = AI
+ newloc = get_turf(AI.linked_core)
+ qdel(AI.linked_core)
else
return
var/mob/living/L = occupant
@@ -1435,6 +1472,7 @@
diag_hud_set_mechhealth()
diag_hud_set_mechcell()
diag_hud_set_mechstat()
+ diag_hud_set_mechtracking()
/obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index f1641c94b64..b570f17ccfe 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -6,22 +6,25 @@
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.remove_fuel(0, user))
- playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(holder, W.usesound, 50, 1)
else
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
- playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
+ var/obj/item/weapon/wrench/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/screwdriver))
- playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/screwdriver/S = used_atom
+ playsound(holder, S.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.use(4))
- playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(holder, C.usesound, 50, 1)
else
to_chat(user, ("There's not enough cable to finish the task."))
return 0
@@ -38,22 +41,25 @@
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.remove_fuel(0, user))
- playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(holder, W.usesound, 50, 1)
else
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
- playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
+ var/obj/item/weapon/wrench/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/screwdriver))
- playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/screwdriver/S = used_atom
+ playsound(holder, S.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.use(4))
- playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(holder, C.usesound, 50, 1)
else
to_chat(user, ("There's not enough cable to finish the task."))
return 0
@@ -857,48 +863,48 @@
feedback_inc("mecha_honker_created",1)
return
-/datum/construction/mecha/recitence_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/recitence_torso),//1
- list("key"=/obj/item/mecha_parts/part/recitence_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/recitence_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/recitence_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/recitence_right_leg),//5
- list("key"=/obj/item/mecha_parts/part/recitence_head)
+/datum/construction/mecha/reticence_chassis
+ steps = list(list("key"=/obj/item/mecha_parts/part/reticence_torso),//1
+ list("key"=/obj/item/mecha_parts/part/reticence_left_arm),//2
+ list("key"=/obj/item/mecha_parts/part/reticence_right_arm),//3
+ list("key"=/obj/item/mecha_parts/part/reticence_left_leg),//4
+ list("key"=/obj/item/mecha_parts/part/reticence_right_leg),//5
+ list("key"=/obj/item/mecha_parts/part/reticence_head)
)
-/datum/construction/mecha/recitence_chassis/action(atom/used_atom,mob/user as mob)
+/datum/construction/mecha/reticence_chassis/action(atom/used_atom,mob/user as mob)
return check_all_steps(used_atom,user)
-/datum/construction/mecha/recitence_chassis/custom_action(step, atom/used_atom, mob/user)
+/datum/construction/mecha/reticence_chassis/custom_action(step, atom/used_atom, mob/user)
user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]")
holder.overlays += used_atom.icon_state + "+o"
qdel(used_atom)
return 1
-/datum/construction/mecha/recitence_chassis/spawn_result()
+/datum/construction/mecha/reticence_chassis/spawn_result()
var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/mecha/recitence(const_holder)
+ const_holder.construct = new /datum/construction/mecha/reticence(const_holder)
const_holder.density = 1
qdel(src)
return
-/datum/construction/mecha/recitence
- result = "/obj/mecha/combat/recitence"
+/datum/construction/mecha/reticence
+ result = "/obj/mecha/combat/reticence"
steps = list(list("key"=/obj/effect/dummy/mecha_emote_step),//1
list("key"=/obj/item/clothing/suit/suspenders),//2
list("key"=/obj/effect/dummy/mecha_emote_step),//3
list("key"=/obj/item/clothing/mask/gas/mime),//4
list("key"=/obj/effect/dummy/mecha_emote_step),//5
list("key"=/obj/item/clothing/head/beret),//6
- list("key"=/obj/item/weapon/circuitboard/mecha/recitence/targeting),//7
- list("key"=/obj/item/weapon/circuitboard/mecha/recitence/peripherals),//8
- list("key"=/obj/item/weapon/circuitboard/mecha/recitence/main),//9
+ list("key"=/obj/item/weapon/circuitboard/mecha/reticence/targeting),//7
+ list("key"=/obj/item/weapon/circuitboard/mecha/reticence/peripherals),//8
+ list("key"=/obj/item/weapon/circuitboard/mecha/reticence/main),//9
)
-/datum/construction/mecha/recitence/action(atom/used_atom,mob/user)
+/datum/construction/mecha/reticence/action(atom/used_atom,mob/user)
return check_step(used_atom,user)
-/datum/construction/mecha/recitence/custom_action(step, atom/used_atom, mob/user)
+/datum/construction/mecha/reticence/custom_action(step, atom/used_atom, mob/user)
if(!..())
return 0
@@ -929,9 +935,9 @@
qdel(used_atom)
return 1
-/datum/construction/mecha/recitence/spawn_result()
+/datum/construction/mecha/reticence/spawn_result()
..()
- feedback_inc("mecha_recitence_created",1)
+ feedback_inc("mecha_reticence_created",1)
return
/datum/construction/mecha/durand_chassis
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 11c940f7971..1e2868673c0 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -10,10 +10,10 @@
var/screen = 0
var/stored_data
-/obj/machinery/computer/mecha/attack_ai(var/mob/user as mob)
+/obj/machinery/computer/mecha/attack_ai(mob/user)
return attack_hand(user)
-/obj/machinery/computer/mecha/attack_hand(var/mob/user as mob)
+/obj/machinery/computer/mecha/attack_hand(mob/user)
ui_interact(user)
/obj/machinery/computer/mecha/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
@@ -71,13 +71,14 @@
desc = "Device used to transmit exosuit data."
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "programming=2;magnets=2"
+ var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking.
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
if(!in_mecha())
- return 0
- var/obj/mecha/M = src.loc
+ return FALSE
+ var/obj/mecha/M = loc
var/list/answer[0]
answer["reference"] = "\ref[src]"
answer["name"] = sanitize(replacetext(M.name,"\"","'")) // Double apostrophes break JSON
@@ -101,6 +102,25 @@
return answer
+/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info_text()
+ if(!in_mecha())
+ return FALSE
+ var/obj/mecha/M = loc
+ var/cell_charge = M.get_charge()
+ var/area/A = get_area(M)
+ var/answer = {"Name: [M.name]
+ Integrity: [M.health/initial(M.health)*100]%
+ Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]
+ Airtank: [M.return_pressure()]kPa
+ Pilot: [M.occupant||"None"]
+ Location: [sanitize(A.name)||"Unknown"]
+ Active equipment: [M.selected||"None"] "}
+ if(istype(M, /obj/mecha/working/ripley))
+ var/obj/mecha/working/ripley/RM = M
+ answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]% "
+
+ return answer
+
/obj/item/mecha_parts/mecha_tracking/emp_act()
qdel(src)
return
@@ -110,9 +130,9 @@
return
/obj/item/mecha_parts/mecha_tracking/proc/in_mecha()
- if(istype(src.loc, /obj/mecha))
- return src.loc
- return 0
+ if(istype(loc, /obj/mecha))
+ return loc
+ return FALSE
/obj/item/mecha_parts/mecha_tracking/proc/shock()
var/obj/mecha/M = in_mecha()
@@ -121,19 +141,26 @@
qdel(src)
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
- if(!src.in_mecha())
+ if(!in_mecha())
return 0
- var/obj/mecha/M = src.loc
+ var/obj/mecha/M = loc
return M.get_log_html()
+/obj/item/mecha_parts/mecha_tracking/ai_control
+ name = "exosuit AI control beacon"
+ desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit."
+ origin_tech = "programming=3;magnets=2;engineering=2"
+ ai_beacon = TRUE
+
/obj/item/weapon/storage/box/mechabeacons
name = "Exosuit Tracking Beacons"
- New()
- ..()
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
- new /obj/item/mecha_parts/mecha_tracking(src)
+
+/obj/item/weapon/storage/box/mechabeacons/New()
+ ..()
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
+ new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 60c352c20bd..0516d8bf659 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -6,7 +6,7 @@
name = "mecha part"
icon = 'icons/mecha/mech_construct.dmi'
icon_state = "blank"
- w_class = 6
+ w_class = WEIGHT_CLASS_GIGANTIC
flags = CONDUCT
origin_tech = "programming=2;materials=2"
@@ -17,13 +17,16 @@
var/datum/construction/construct
flags = CONDUCT
- attackby(obj/item/W as obj, mob/user as mob, params)
- if(!construct || !construct.action(W, user))
- ..()
- return
+/obj/item/mecha_parts/chassis/Destroy()
+ QDEL_NULL(construct)
+ return ..()
- attack_hand()
- return
+/obj/item/mecha_parts/chassis/attackby(obj/item/W, mob/user, params)
+ if(!construct || !construct.action(W, user))
+ ..()
+
+/obj/item/mecha_parts/chassis/attack_hand()
+ return
/////////// Ripley
@@ -223,14 +226,14 @@
icon_state = "honker_r_leg"
-////////// Recitence
+////////// Reticence
-/obj/item/mecha_parts/chassis/recitence
- name = "Recitence Chassis"
+/obj/item/mecha_parts/chassis/reticence
+ name = "Reticence Chassis"
-/obj/item/mecha_parts/chassis/recitence/New()
+/obj/item/mecha_parts/chassis/reticence/New()
..()
- construct = new /datum/construction/mecha/recitence_chassis(src)
+ construct = new /datum/construction/mecha/reticence_chassis(src)
/obj/effect/dummy/mecha_emote_step
var/emote
@@ -238,37 +241,37 @@
/obj/effect/dummy/mecha_emote_step/New(e)
emote = e
-/obj/item/mecha_parts/chassis/recitence/hear_message(mob/living/M, msg)
- if(!istype(M) || !istype(construct, /datum/construction/mecha/recitence))
+/obj/item/mecha_parts/chassis/reticence/hear_message(mob/living/M, msg)
+ if(!istype(M) || !istype(construct, /datum/construction/mecha/reticence))
return
// is the current step the dummy emote object?
var/list/steps = construct.steps
if(steps[steps.len]["key"] == /obj/effect/dummy/mecha_emote_step)
construct.action(new /obj/effect/dummy/mecha_emote_step(msg), M)
-/obj/item/mecha_parts/part/recitence_torso
- name = "Recitence Torso"
- icon_state = "recitence_harness"
+/obj/item/mecha_parts/part/reticence_torso
+ name = "Reticence Torso"
+ icon_state = "reticence_harness"
-/obj/item/mecha_parts/part/recitence_head
- name = "Recitence Head"
- icon_state = "recitence_head"
+/obj/item/mecha_parts/part/reticence_head
+ name = "Reticence Head"
+ icon_state = "reticence_head"
-/obj/item/mecha_parts/part/recitence_left_arm
- name = "Recitence Left Arm"
- icon_state = "recitence_l_arm"
+/obj/item/mecha_parts/part/reticence_left_arm
+ name = "Reticence Left Arm"
+ icon_state = "reticence_l_arm"
-/obj/item/mecha_parts/part/recitence_right_arm
- name = "Recitence Right Arm"
- icon_state = "recitence_r_arm"
+/obj/item/mecha_parts/part/reticence_right_arm
+ name = "Reticence Right Arm"
+ icon_state = "reticence_r_arm"
-/obj/item/mecha_parts/part/recitence_left_leg
- name = "Recitence Left Leg"
- icon_state = "recitence_l_leg"
+/obj/item/mecha_parts/part/reticence_left_leg
+ name = "Reticence Left Leg"
+ icon_state = "reticence_l_leg"
-/obj/item/mecha_parts/part/recitence_right_leg
- name = "Recitence Right Leg"
- icon_state = "recitence_r_leg"
+/obj/item/mecha_parts/part/reticence_right_leg
+ name = "Reticence Right Leg"
+ icon_state = "reticence_r_leg"
////////// Phazon
@@ -376,7 +379,7 @@
board_type = "other"
flags = CONDUCT
force = 5.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 5.0
throw_speed = 3
throw_range = 15
@@ -455,19 +458,19 @@
name = "Circuit board (H.O.N.K Central Control module)"
icon_state = "mainboard"
-/obj/item/weapon/circuitboard/mecha/recitence
+/obj/item/weapon/circuitboard/mecha/reticence
origin_tech = "programming=4"
-/obj/item/weapon/circuitboard/mecha/recitence/peripherals
- name = "circuit board (Reticience Peripherals Control module)"
+/obj/item/weapon/circuitboard/mecha/reticence/peripherals
+ name = "circuit board (Reticence Peripherals Control module)"
icon_state = "mcontroller"
-/obj/item/weapon/circuitboard/mecha/recitence/targeting
- name = "circuit board (Reticience Weapon Control and Targeting module)"
+/obj/item/weapon/circuitboard/mecha/reticence/targeting
+ name = "circuit board (Reticence Weapon Control and Targeting module)"
icon_state = "mcontroller"
-/obj/item/weapon/circuitboard/mecha/recitence/main
- name = "circuit board (Reticience Central Control module)"
+/obj/item/weapon/circuitboard/mecha/reticence/main
+ name = "circuit board (Reticence Central Control module)"
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/odysseus
@@ -484,5 +487,3 @@
/obj/item/weapon/circuitboard/mecha/pod
name = "Circuit board (Space Pod Mainboard)"
icon_state = "mainboard"
-
-
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 6bd600eaaa7..af6f2f20b3f 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -35,7 +35,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(salvage_num <= 0)
user.visible_message("[user] begins to slice apart the now completely stripped [src].", "You begin to slice apart the [src].", "You hear the sound of a welder nearby.")
- if(WT.remove_fuel(0,user) && do_after(user,80,target=src))
+ if(WT.remove_fuel(0,user) && do_after(user, 80 * WT.toolspeed, target = src))
user.visible_message("The now-dilapidated [src] falls apart in a clatter.", "As you slice apart the final support structures, the [src] falls apart in a heap.", "You hear metal clanking to the floor.")
new /obj/item/stack/sheet/metal(src.loc)
var/obj/item/stack/rods/rods = new /obj/item/stack/rods(src.loc)
@@ -55,7 +55,7 @@
else
to_chat(user, "You failed to salvage anything valuable from [src].")
else
- to_chat(user, "\blue You need more welding fuel to complete this task.")
+ to_chat(user, "You need more welding fuel to complete this task. ")
else if(istype(W, /obj/item/weapon/wirecutters))
if(salvage_num <= 0)
to_chat(user, "You don't see anything that can be cut with [W].")
@@ -118,8 +118,8 @@
name = "Seraph wreckage"
icon_state = "seraph-broken"
-/obj/effect/decal/mecha_wreckage/recitence
- name = "\improper Recitence wreckage"
+/obj/effect/decal/mecha_wreckage/reticence
+ name = "\improper Reticence wreckage"
icon_state = "mime-broken"
/obj/effect/decal/mecha_wreckage/ripley
diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm
index ce28687a9e6..8aee3ef1f4c 100644
--- a/code/game/mecha/medical/medical.dm
+++ b/code/game/mecha/medical/medical.dm
@@ -4,4 +4,4 @@
/obj/mecha/medical/New()
..()
- new /obj/item/mecha_parts/mecha_tracking(src)
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index f26e34834fb..6c563bb22b3 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -110,10 +110,10 @@
//Add ore box to cargo
cargo.Add(new /obj/structure/ore_box(src))
- //Attach hydrolic clamp
+ //Attach hydraulic clamp
var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp
HC.attach(src)
- for(var/obj/item/mecha_parts/mecha_tracking/B in contents)//Deletes the beacon so it can't be found easily
+ for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily
qdel(B)
var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/mining_scanner
@@ -129,7 +129,7 @@
if(href_list["drop_from_cargo"])
var/obj/O = locate(href_list["drop_from_cargo"])
if(O && O in cargo)
- occupant_message("\blue You unload [O].")
+ occupant_message("You unload [O]. ")
O.loc = get_turf(src)
cargo -= O
var/turf/T = get_turf(O)
diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm
index ccbfe2ef21b..e4c001a508a 100644
--- a/code/game/mecha/working/working.dm
+++ b/code/game/mecha/working/working.dm
@@ -3,4 +3,4 @@
/obj/mecha/working/New()
..()
- new /obj/item/mecha_parts/mecha_tracking(src)
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index ea692339ac3..8ff0d7cfcf4 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -35,11 +35,11 @@
return FALSE
//procs that handle the actual buckling and unbuckling
-/atom/movable/proc/buckle_mob(mob/living/M)
- if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.buckled_mob || buckled_mob || (buckle_requires_restraints && !M.restrained()) || M == src)
+/atom/movable/proc/buckle_mob(mob/living/M, force = 0)
+ if((!can_buckle && !force)|| !istype(M) || (M.loc != loc) || M.buckled || M.buckled_mob || buckled_mob || (buckle_requires_restraints && !M.restrained()) || M == src)
return 0
- if(isslime(M) || isAI(M))
+ if((isslime(M) || isAI(M)) && !force)
if(M == usr)
to_chat(M, "You are unable to buckle yourself to the [src]! ")
else
@@ -54,7 +54,7 @@
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled, new_master = src)
return 1
-/obj/buckle_mob(mob/living/M)
+/obj/buckle_mob(mob/living/M, force = 0)
. = ..()
if(.)
if(burn_state == ON_FIRE) //Sets the mob on fire if you buckle them to a burning atom/movableect
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 106c451ca09..ebeda7a77c0 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -104,9 +104,9 @@
/obj/structure/alien/resin/hitby(atom/movable/AM)
..()
var/tforce = 0
- if(!isobj(AM))
+ if(ismob(AM))
tforce = 10
- else
+ else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
@@ -222,7 +222,7 @@
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(0, user))
damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, WT.usesound, 100, 1)
health -= damage
healthcheck()
@@ -363,7 +363,8 @@
break
/obj/structure/alien/egg/bullet_act(obj/item/projectile/Proj)
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
..()
healthcheck()
@@ -380,7 +381,7 @@
if(WT.remove_fuel(0, user))
damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, WT.usesound, 100, 1)
health -= damage
user.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 090a7437a5b..89baf450720 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -18,6 +18,12 @@
var/new_frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ))
aSignal.set_frequency(new_frequency)
+ poi_list |= src
+
+/obj/effect/anomaly/Destroy()
+ QDEL_NULL(aSignal)
+ poi_list.Remove(src)
+ return ..()
/obj/effect/anomaly/proc/anomalyEffect()
if(prob(50))
diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm
deleted file mode 100644
index 65d873666d1..00000000000
--- a/code/game/objects/effects/datacore-effect.dm
+++ /dev/null
@@ -1,228 +0,0 @@
-//This item is not completely unused- the central datacore datum uses it.
-/*
- * This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
- */
-
-/obj/effect/datacore
- name = "datacore"
- var/medical[] = list()
- var/general[] = list()
- var/security[] = list()
- //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
- var/locked[] = list()
-
-
-/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
- var/list/heads = new()
- var/list/sec = new()
- var/list/eng = new()
- var/list/med = new()
- var/list/sci = new()
- var/list/ser = new()
- var/list/sup = new()
- var/list/bot = new()
- var/list/misc = new()
- var/list/isactive = new()
- var/dat = {"
-
-
- Name Rank Activity
- "}
- var/even = 0
- // sort mobs
- for(var/datum/data/record/t in data_core.general)
- var/name = t.fields["name"]
- var/rank = t.fields["rank"]
- var/real_rank = t.fields["real_rank"]
- if(OOC)
- var/active = 0
- for(var/mob/M in player_list)
- if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
- active = 1
- break
- isactive[name] = active ? "Active" : "Inactive"
- else
- isactive[name] = t.fields["p_stat"]
-// to_chat(world, "[name]: [rank]")
- //cael - to prevent multiple appearances of a player/job combination, add a continue after each line
- var/department = 0
- if(real_rank in command_positions)
- heads[name] = rank
- department = 1
- if(real_rank in security_positions)
- sec[name] = rank
- department = 1
- if(real_rank in engineering_positions)
- eng[name] = rank
- department = 1
- if(real_rank in medical_positions)
- med[name] = rank
- department = 1
- if(real_rank in science_positions)
- sci[name] = rank
- department = 1
- if(real_rank in service_positions)
- ser[name] = rank
- department = 1
- if(real_rank in supply_positions)
- sup[name] = rank
- department = 1
- if(real_rank in nonhuman_positions)
- bot[name] = rank
- department = 1
- if(!department && !(name in heads))
- misc[name] = rank
- if(heads.len > 0)
- dat += "Heads "
- for(name in heads)
- dat += "[name] [heads[name]] [isactive[name]] "
- even = !even
- if(sec.len > 0)
- dat += "Security "
- for(name in sec)
- dat += "[name] [sec[name]] [isactive[name]] "
- even = !even
- if(eng.len > 0)
- dat += "Engineering "
- for(name in eng)
- dat += "[name] [eng[name]] [isactive[name]] "
- even = !even
- if(med.len > 0)
- dat += "Medical "
- for(name in med)
- dat += "[name] [med[name]] [isactive[name]] "
- even = !even
- if(sci.len > 0)
- dat += "Science "
- for(name in sci)
- dat += "[name] [sci[name]] [isactive[name]] "
- even = !even
- if(ser.len > 0)
- dat += "Service "
- for(name in ser)
- dat += "[name] [ser[name]] [isactive[name]] "
- even = !even
- if(sup.len > 0)
- dat += "Supply "
- for(name in sup)
- dat += "[name] [sup[name]] [isactive[name]] "
- even = !even
- // in case somebody is insane and added them to the manifest, why not
- if(bot.len > 0)
- dat += "Silicon "
- for(name in bot)
- dat += "[name] [bot[name]] [isactive[name]] "
- even = !even
- // misc guys
- if(misc.len > 0)
- dat += "Miscellaneous "
- for(name in misc)
- dat += "[name] [misc[name]] [isactive[name]] "
- even = !even
-
- dat += "
"
- dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
- dat = replacetext(dat, "\t", "")
- return dat
-
-
-/*
-We can't just insert in HTML into the nanoUI so we need the raw data to play with.
-Instead of creating this list over and over when someone leaves their PDA open to the page
-we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
-using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( )
-*/
-
-var/global/list/PDA_Manifest = list()
-
-/obj/effect/datacore/proc/get_manifest_json()
- if(PDA_Manifest.len)
- return
- var/heads[0]
- var/sec[0]
- var/eng[0]
- var/med[0]
- var/sci[0]
- var/ser[0]
- var/sup[0]
- var/bot[0]
- var/misc[0]
- for(var/datum/data/record/t in data_core.general)
- var/name = sanitize(t.fields["name"])
- var/rank = sanitize(t.fields["rank"])
- var/real_rank = t.fields["real_rank"]
-
- var/isactive = t.fields["p_stat"]
- var/department = 0
- var/depthead = 0 // Department Heads will be placed at the top of their lists.
- if(real_rank in command_positions)
- heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- depthead = 1
- if(rank == "Captain" && heads.len != 1)
- heads.Swap(1, heads.len)
-
- if(real_rank in security_positions)
- sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sec.len != 1)
- sec.Swap(1, sec.len)
-
- if(real_rank in engineering_positions)
- eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && eng.len != 1)
- eng.Swap(1, eng.len)
-
- if(real_rank in medical_positions)
- med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && med.len != 1)
- med.Swap(1, med.len)
-
- if(real_rank in science_positions)
- sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sci.len != 1)
- sci.Swap(1, sci.len)
-
- if(real_rank in service_positions)
- ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && ser.len != 1)
- ser.Swap(1, ser.len)
-
- if(real_rank in supply_positions)
- sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sup.len != 1)
- sup.Swap(1, sup.len)
-
- if(real_rank in nonhuman_positions)
- bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
-
- if(!department && !(name in heads))
- misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
-
-
- PDA_Manifest = list(\
- "heads" = heads,\
- "sec" = sec,\
- "eng" = eng,\
- "med" = med,\
- "sci" = sci,\
- "ser" = ser,\
- "sup" = sup,\
- "bot" = bot,\
- "misc" = misc\
- )
- return
-
diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm
index aad9f5ab4bf..3d6a47a00b9 100644
--- a/code/game/objects/effects/decals/Cleanable/fuel.dm
+++ b/code/game/objects/effects/decals/Cleanable/fuel.dm
@@ -1,4 +1,4 @@
-obj/effect/decal/cleanable/liquid_fuel
+/obj/effect/decal/cleanable/liquid_fuel
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
@@ -6,52 +6,53 @@ obj/effect/decal/cleanable/liquid_fuel
anchored = 1
var/amount = 1 //Basically moles.
- New(newLoc,amt=1)
- src.amount = amt
+/obj/effect/decal/cleanable/liquid_fuel/New(newLoc,amt=1)
+ amount = amt
- //Be absorbed by any other liquid fuel in the tile.
- for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
- if(other != src)
- other.amount += src.amount
- spawn other.Spread()
- qdel(src)
+ //Be absorbed by any other liquid fuel in the tile.
+ for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
+ if(other != src)
+ other.amount += amount
+ spawn other.Spread()
+ qdel(src)
- Spread()
- . = ..()
+ Spread()
+ . = ..()
- proc/Spread()
- //Allows liquid fuels to sometimes flow into other tiles.
- if(amount < 0.5) return
- var/turf/simulated/S = loc
- if(!istype(S)) return
- for(var/d in cardinal)
- if(rand(25))
- var/turf/simulated/target = get_step(src,d)
- var/turf/simulated/origin = get_turf(src)
- if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
- if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
- new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
- amount *= 0.75
+/obj/effect/decal/cleanable/liquid_fuel/proc/Spread()
+ //Allows liquid fuels to sometimes flow into other tiles.
+ if(amount < 0.5) return
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+ for(var/d in cardinal)
+ if(rand(25))
+ var/turf/simulated/target = get_step(src, d)
+ var/turf/simulated/origin = get_turf(src)
+ if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
+ if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
+ new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
+ amount *= 0.75
- flamethrower_fuel
- icon_state = "mustard"
- anchored = 0
- New(newLoc, amt = 1, d = 0)
- dir = d //Setting this direction means you won't get torched by your own flamethrower.
- . = ..()
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
+ icon_state = "mustard"
+ anchored = 0
- Spread()
- //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
- if(amount < 0.1) return
- var/turf/simulated/S = loc
- if(!istype(S)) return
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0)
+ dir = d //Setting this direction means you won't get torched by your own flamethrower.
+ . = ..()
- for(var/d in list(turn(dir,90),turn(dir,-90), dir))
- var/turf/simulated/O = get_step(S,d)
- if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
- continue
- if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
- new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
- O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
+ //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
+ if(amount < 0.1) return
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
- amount *= 0.25
+ for(var/d in list(turn(dir,90),turn(dir,-90), dir))
+ var/turf/simulated/O = get_step(S,d)
+ if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
+ continue
+ if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
+ new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
+ O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+
+ amount *= 0.25
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 0c0f7cbdf91..37063b8a90b 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -20,6 +20,7 @@ var/global/list/image/splatter_cache=list()
var/basecolor="#A10808" // Color when wet.
var/amount = 5
appearance_flags = NO_CLIENT_COLOR
+ var/dry_timer = 0
/obj/effect/decal/cleanable/blood/New()
..()
@@ -41,8 +42,7 @@ var/global/list/image/splatter_cache=list()
if(B.blood_DNA)
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
- spawn(DRYING_TIME * (amount+1))
- dry()
+ dry_timer = addtimer(src, "dry", DRYING_TIME * (amount+1))
/obj/effect/decal/cleanable/blood/Destroy()
if(GAMEMODE_IS_CULT)
@@ -51,7 +51,9 @@ var/global/list/image/splatter_cache=list()
if(T && (is_station_level(T.z)))
mode_ticker.bloody_floors -= T
mode_ticker.blood_check()
- .=..()
+ if(dry_timer)
+ deltimer(dry_timer)
+ return ..()
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
@@ -118,9 +120,12 @@ var/global/list/image/splatter_cache=list()
user.update_inv_gloves(1)
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
+/obj/effect/decal/cleanable/blood/can_bloodcrawl_in()
+ return TRUE
+
/obj/effect/decal/cleanable/blood/splatter
- random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
- amount = 2
+ random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
+ amount = 2
/obj/effect/decal/cleanable/blood/drip
name = "drips of blood"
@@ -134,8 +139,7 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/drip/New()
..()
- spawn(1)
- drips |= icon_state
+ drips |= icon_state
/obj/effect/decal/cleanable/blood/writing
icon_state = "tracks"
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 3c0a712a311..1b9880bb79a 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -89,15 +89,20 @@
/obj/effect/decal/cleanable/cobweb/fire_act()
qdel(src)
-/obj/effect/decal/cleanable/molten_item
+/obj/effect/decal/cleanable/molten_object
name = "gooey grey mass"
desc = "It looks like a melted... something."
density = 0
anchored = 1
layer = 3
- icon = 'icons/obj/chemical.dmi'
+ gender = NEUTER
+ icon = 'icons/effects/effects.dmi'
icon_state = "molten"
+/obj/effect/decal/cleanable/molten_object/large
+ name = "big gooey grey mass"
+ icon_state = "big_molten"
+
/obj/effect/decal/cleanable/cobweb2
name = "cobweb"
desc = "Somebody should remove that."
@@ -145,6 +150,15 @@
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
+/obj/effect/decal/cleanable/plant_smudge
+ name = "plant smudge"
+ density = 0
+ anchored = 1
+ layer = 2
+ gender = NEUTER
+ icon = 'icons/effects/tomatodecal.dmi'
+ random_icon_states = list("smashed_plant")
+
/obj/effect/decal/cleanable/egg_smudge
name = "smashed egg"
desc = "Seems like this one won't hatch."
@@ -163,16 +177,6 @@
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
-/obj/effect/decal/cleanable/fruit_smudge
- name = "smudge"
- desc = "Some kind of fruit smear."
- density = 0
- anchored = 1
- layer = 2
- icon = 'icons/effects/blood.dmi'
- icon_state = "mfloor1"
- random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
-
/obj/effect/decal/cleanable/fungus
name = "space fungus"
desc = "A fungal growth. Looks pretty nasty."
diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm
index 16688932b9c..5fc09b6ec34 100644
--- a/code/game/objects/effects/decals/Cleanable/robots.dm
+++ b/code/game/objects/effects/decals/Cleanable/robots.dm
@@ -11,6 +11,9 @@
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
return
+
+/obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in()
+ return FALSE
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
spawn (0)
@@ -42,6 +45,9 @@
desc = "It's black and greasy. Looks like Beepsky made another mess."
basecolor="#030303"
+/obj/effect/decal/cleanable/blood/oil/can_bloodcrawl_in()
+ return FALSE
+
/obj/effect/decal/cleanable/blood/oil/dry()
return
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 0d6bf3255a5..cfde9ab55a4 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -1,9 +1,11 @@
/obj/effect/decal/cleanable
var/list/random_icon_states = list()
- var/targeted_by = null // Used so cleanbots can't claim a mess.
var/noscoop = 0 //if it has this, don't let it be scooped up
var/noclear = 0 //if it has this, don't delete it when its' scooped up
+/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
+ return FALSE
+
/obj/effect/decal/cleanable/New()
if(random_icon_states && length(src.random_icon_states) > 0)
src.icon_state = pick(src.random_icon_states)
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 9c3dd867c74..1ab2cd985cf 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -2,7 +2,7 @@
#define NUM_OF_POSTER_DESIGNS 33 //subtype 0-contraband posters
-#define NUM_OF_POSTER_DESIGNS_LEGIT 33 //subtype 1-corporate approved posters
+#define NUM_OF_POSTER_DESIGNS_LEGIT 40 //subtype 1-corporate approved posters
/obj/item/weapon/contraband
name = "contraband item"
@@ -167,20 +167,20 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Rebels Unite!"
desc += " A poster telling the viewer to rebel against Nanotrasen."
if(24)
- name += " - C-20r Advertisment"
+ name += " - C-20r Advertisement"
desc += " A poster advertising the Scarborough Arms C-20r."
if(25)
name += " - Have A Puff"
desc += " Who cares about lung cancer when you're high as a kite?"
if(26)
- name += " - Revolver Advertisment"
+ name += " - Revolver Advertisement"
desc += " Because seven shots are all you need."
if(27)
name += " - D-Day Promotional Poster"
desc += " A promotional poster for some rapper."
if(28)
- name += " - Syndicate Pistol Advertisment"
- desc += " A poster advertising syndicate pistols as being 'Classy as fuck'."
+ name += " - Syndicate Pistol Advertisement"
+ desc += " A poster advertising Syndicate pistols as being 'Classy as fuck'."
if(29)
name += " - E-sword Rainbow"
desc += " All the colors of bloody murder rainbow."
@@ -188,7 +188,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Red Rum"
desc += " Looking at this poster makes you want to kill."
if(31)
- name += " - CC 64K Advertisment"
+ name += " - CC 64K Advertisement"
desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!"
if(32)
name += " - Punch Shit"
@@ -198,13 +198,13 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
desc += " The Griffin commands you to be the worst you can be. Will you?"
else
name += " - Error (subtype 0 serial_number)"
- desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/tgstation/-tg-station/issues."
+ desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues."
if(subtype == 1)
icon_state = "poster[serial_number]_legit"
switch(serial_number)
if(1)
- name += " - Here for Your Saftey"
+ name += " - Here for Your Safety"
desc += " A poster glorifying the station's security force."
if(2)
name += " - Nanotrasen Logo"
@@ -247,7 +247,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
desc += " This thing is all in Japanese."
if(15)
name += " - Get Your LEGS"
- desc += " LEGS: Leadership, Experiance, Genius, S(Opportunity)."
+ desc += " LEGS: Leadership, Experience, Genius, S(Opportunity)."
if(16)
name += " - Do Not Question"
desc += " A poster instructing the viewer not to ask about things they aren't meant to know."
@@ -258,58 +258,79 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Soft Cap Pop Art"
desc += " A poster reprint of some cheap pop art."
if(19)
- name += " - Saftey: Internals"
+ name += " - Safety: Internals"
desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic."
if(20)
- name += " - Saftey: Eye Protection"
+ name += " - Safety: Eye Protection"
desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
if(21)
- name += " - Saftey: Report"
+ name += " - Safety: Report"
desc += " A poster instructing the viewer to report suspicious activity to the security force."
if(22)
name += " - Report Crimes"
- desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malconetents."
+ desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malcontents."
if(23)
name += " - Ion Rifle"
desc += " A poster displaying an Ion Rifle."
if(24)
- name += " - Foam Force Advertisment"
+ name += " - Foam Force Advertisement"
desc += " Foam Force, it's Foam or be Foamed!"
if(25)
- name += " - Cohiba Robusto Advertisment"
+ name += " - Cohiba Robusto Advertisement"
desc += " Cohiba Robusto, the classy cigar."
if(26)
- name += " - 50th Aniversery Vintage Reprint"
- desc += " A reprint of a poster from 2504, commemorating the 50th Aniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen."
+ name += " - 50th Anniversary Vintage Reprint"
+ desc += " A reprint of a poster from 2504, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen."
if(27)
name += " - Fruit Bowl"
desc += " Simple, yet awe inspiring."
if(28)
- name += " - NanoPDA 1000 Advertisment"
+ name += " - NanoPDA 1000 Advertisement"
desc += " A poster advertising the latest PDA from Nanotrasen."
if(29)
name += " - Enlist"
desc += " Enlist in the Nanotrasen ERT reserves today!"
if(30)
- name += " - Nanomichi Advertisment"
+ name += " - Nanomichi Advertisement"
desc += " A poster advertising Nanomichi brand audio cassettes."
if(31)
name += " - 12 Gauge"
- desc += " A poster boasting about the superiority of 12 gauge shotgun shells."
+ desc += " A poster boasting about the superiority of 12-gauge shotgun shells."
if(32)
name += " - High-Class Martini"
- desc += " I told you to shake it, no stirring"
+ desc += " I told you to shake it, no stirring."
if(33)
name += " - The Owl"
desc += " The Owl would do his best to protect the station. Will you?"
+ if(34)
+ name += " - Spider Risk"
+ desc += " A poster detailing what to do when giant spiders are seen."
+ if(35)
+ name += " - Kill Syndicate"
+ desc += " A poster demanding that all crew should be ready to fight the Syndicate."
+ if(36)
+ name += " - Information on Air"
+ desc += " A poster providing visual aid to remind crew of air canisters."
+ if(37)
+ name += " - Information on Air"
+ desc += " A poster providing visual aid to remind crew of air canisters."
+ if(38)
+ name += " - Dig for Glory!"
+ desc += " A poster providing trying to convince crew to mine for ore."
+ if(39)
+ name += " - Religious Poster"
+ desc += " A generic religious poser telling you to believe."
+ if(40)
+ name += " - Stay Healthy!"
+ desc += " A healthy crew is a happy crew!"
else
name += " - Error (subtype 1 serial_number)"
- desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/NTStation/NTstation13/issues."
+ desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues."
..()
obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wirecutters))
- playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
if(ruined)
to_chat(user, "You remove the remnants of the poster. ")
qdel(src)
@@ -405,6 +426,6 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
//Putting non-contraband posters here because everything else here is related to posters anyway. -JS
/obj/item/weapon/contraband/poster/legit
- desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidlines."
+ desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidelines."
icon_state = "rolled_poster_legit"
subtype = 1
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 90e4c47b276..1cd105367ed 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -337,8 +337,8 @@ steam.start() -- spawns the effect
return
-/obj/effect/effect/bad_smoke/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/effect/effect/bad_smoke/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
if(istype(mover, /obj/item/projectile/beam))
var/obj/item/projectile/beam/B = mover
B.damage = (B.damage/2)
@@ -425,21 +425,6 @@ steam.start() -- spawns the effect
/obj/effect/effect/chem_smoke/Move()
..()
- return
-
-// Spores
-/datum/effect/system/chem_smoke_spread/spores
- var/datum/seed/seed
-
-/datum/effect/system/chem_smoke_spread/spores/New(seed_name)
- if(seed_name && plant_controller)
- seed = plant_controller.seeds[seed_name]
- if(!seed)
- qdel(src)
- ..()
-
-
-
/datum/effect/system/chem_smoke_spread/New()
..()
chemholder = new/obj()
@@ -517,13 +502,6 @@ steam.start() -- spawns the effect
var/mob/living/carbon/C = A
if(C.can_breathe_gas())
chemholder.reagents.copy_to(C, chemholder.reagents.total_volume)
- if(istype(A, /obj/machinery/portable_atmospherics/hydroponics))
- var/obj/machinery/portable_atmospherics/hydroponics/tray = A
- chemholder.reagents.copy_to(tray, chemholder.reagents.total_volume)
- if(istype(A, /obj/effect/plant))
- var/obj/effect/plant/plant = A
- if(chemholder.reagents.has_reagent("atrazine"))
- plant.die_off()
qdel(smokeholder)
for(i=0, i 20)
@@ -772,7 +750,7 @@ steam.start() -- spawns the effect
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
I.dir = src.holder.dir
flick("ion_fade", I)
- I.icon_state = "blank"
+ I.icon_state = ""
spawn( 20 )
if(I)
I.delete()
@@ -834,8 +812,8 @@ steam.start() -- spawns the effect
II.dir = src.holder.dir
flick("ion_fade", I)
flick("ion_fade", II)
- I.icon_state = "blank"
- II.icon_state = "blank"
+ I.icon_state = ""
+ II.icon_state = ""
spawn( 20 )
if(I) I.delete()
if(II) II.delete()
@@ -899,21 +877,22 @@ steam.start() -- spawns the effect
// Similar to smoke, but spreads out more
// metal foams leave behind a foamed metal wall
-/obj/effect/effect/foam
+/obj/structure/foam
name = "foam"
+ icon = 'icons/effects/effects.dmi'
icon_state = "foam"
opacity = 0
anchored = 1
density = 0
layer = OBJ_LAYER + 0.9
mouse_opacity = 0
+ animate_movement = 0
var/amount = 3
var/expand = 1
- animate_movement = 0
var/metal = 0
-/obj/effect/effect/foam/New(loc, var/ismetal=0)
+/obj/structure/foam/New(loc, var/ismetal=0)
..(loc)
icon_state = "[ismetal ? "m":""]foam"
if(!ismetal && reagents)
@@ -940,11 +919,11 @@ steam.start() -- spawns the effect
flick("[icon_state]-disolve", src)
sleep(5)
- delete()
+ qdel(src)
return
// on delete, transfer any reagents to the floor
-/obj/effect/effect/foam/Destroy()
+/obj/structure/foam/Destroy()
if(!metal && reagents)
reagents.handle_reactions()
for(var/atom/A in oview(1, src))
@@ -955,7 +934,7 @@ steam.start() -- spawns the effect
reagents.reaction(A, TOUCH, fraction)
return ..()
-/obj/effect/effect/foam/process()
+/obj/structure/foam/process()
if(--amount < 0)
return
@@ -970,11 +949,11 @@ steam.start() -- spawns the effect
if(!T.Enter(src))
continue
- var/obj/effect/effect/foam/F = locate() in T
+ var/obj/structure/foam/F = locate() in T
if(F)
continue
- F = new /obj/effect/effect/foam(T, metal)
+ F = new /obj/structure/foam(T, metal)
F.amount = amount
if(!metal)
F.create_reagents(15)
@@ -985,15 +964,15 @@ steam.start() -- spawns the effect
// foam disolves when heated
// except metal foams
-/obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(!metal && prob(max(0, exposed_temperature - 475)))
flick("[icon_state]-disolve", src)
spawn(5)
- delete()
+ qdel(src)
-/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
+/obj/structure/foam/Crossed(var/atom/movable/AM)
if(metal)
return
@@ -1038,13 +1017,13 @@ steam.start() -- spawns the effect
/datum/effect/system/foam_spread/start()
spawn(0)
- var/obj/effect/effect/foam/F = locate() in location
+ var/obj/structure/foam/F = locate() in location
if(F)
F.amount += amount
F.amount = min(F.amount, 27)
return
- F = new /obj/effect/effect/foam(location, metal)
+ F = new /obj/structure/foam(location, metal)
F.amount = amount
if(!metal) // don't carry other chemicals if a metal foam
@@ -1146,8 +1125,7 @@ steam.start() -- spawns the effect
M.visible_message("[M] tears apart \the [src]! ");
qdel(src)
-/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
- if(air_group) return 0
+/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5)
return !density
/obj/structure/foamedmetal/CanAtmosPass()
@@ -1177,10 +1155,10 @@ steam.start() -- spawns the effect
s.start()
for(var/mob/M in viewers(5, location))
- to_chat(M, "\red The solution violently explodes.")
+ to_chat(M, "The solution violently explodes. ")
for(var/mob/M in viewers(1, location))
if(prob (50 * amount))
- to_chat(M, "\red The explosion knocks you down.")
+ to_chat(M, "The explosion knocks you down. ")
M.Weaken(rand(1,5))
return
else
@@ -1203,7 +1181,7 @@ steam.start() -- spawns the effect
flash += (round(amount/4) * flashing_factor)
for(var/mob/M in viewers(8, location))
- to_chat(M, "\red The solution violently explodes.")
+ to_chat(M, "The solution violently explodes. ")
explosion(location, devastation, heavy, light, flash)
diff --git a/code/game/objects/effects/explosion_particles.dm b/code/game/objects/effects/explosion_particles.dm
index bb4fb2e8fd2..3334b27a712 100644
--- a/code/game/objects/effects/explosion_particles.dm
+++ b/code/game/objects/effects/explosion_particles.dm
@@ -48,7 +48,6 @@
..()
spawn (10)
qdel(src)
- return
/datum/effect/system/explosion/set_up(turf/loc)
..(loc=loc)
@@ -58,6 +57,11 @@
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
P.set_up(10,location)
P.start()
+
+/datum/effect/system/explosion/smoke
+
+/datum/effect/system/explosion/smoke/start()
+ ..()
spawn(5)
var/datum/effect/system/harmless_smoke_spread/S = new/datum/effect/system/harmless_smoke_spread()
S.set_up(5,0,location,null)
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index a9e165666fc..5c5005fb6fd 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -25,7 +25,7 @@
proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null)
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
- to_chat(world, "\red Gib list length mismatch!")
+ to_chat(world, "Gib list length mismatch! ")
return
var/obj/effect/decal/cleanable/blood/gibs/gib = null
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index ec77aa2e3a9..f641cb26c32 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -1,33 +1,63 @@
//separate dm since hydro is getting bloated already
-/obj/effect/glowshroom
+/obj/structure/glowshroom
name = "glowshroom"
+ desc = "Mycena Bregprox, a species of mushroom that glows in the dark."
anchored = 1
opacity = 0
density = 0
icon = 'icons/obj/lighting.dmi'
- icon_state = "glowshroomf"
+ icon_state = "glowshroom" //replaced in New
layer = 2.1
var/endurance = 30
- var/potency = 30
var/delay = 1200
var/floor = 0
- var/yield = 3
- var/spreadChance = 40
+ var/generation = 1
var/spreadIntoAdjacentChance = 60
- var/evolveChance = 2
- var/lastTick = 0
- var/spreaded = 1
+ var/obj/item/seeds/myseed = /obj/item/seeds/glowshroom
-/obj/effect/glowshroom/single
- spreadChance = 0
+/obj/structure/glowshroom/glowcap
+ name = "glowcap"
+ desc = "Mycena Ruthenia, a species of mushroom that, while it does glow in the dark, is not actually bioluminescent."
+ icon_state = "glowcap"
+ myseed = /obj/item/seeds/glowshroom/glowcap
-/obj/effect/glowshroom/New()
+/obj/structure/glowshroom/shadowshroom
+ name = "shadowshroom"
+ desc = "Mycena Umbra, a species of mushroom that emits shadow instead of light."
+ icon_state = "shadowshroom"
+ myseed = /obj/item/seeds/glowshroom/shadowshroom
+/obj/structure/glowshroom/single/Spread()
+ return
+
+/obj/structure/glowshroom/examine(mob/user)
+ . = ..()
+ to_chat(user, "This is a [generation]\th generation [name]!")
+
+/obj/structure/glowshroom/Destroy()
+ QDEL_NULL(myseed)
+ return ..()
+
+/obj/structure/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats)
..()
-
- dir = CalcDir()
-
+ if(newseed)
+ myseed = newseed.Copy()
+ myseed.forceMove(src)
+ else
+ myseed = new myseed(src)
+ if(mutate_stats) //baby mushrooms have different stats :3
+ myseed.adjust_potency(rand(-3,6))
+ myseed.adjust_yield(rand(-1,2))
+ myseed.adjust_production(rand(-3,6))
+ myseed.adjust_endurance(rand(-3,6))
+ delay = delay - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
+ endurance = myseed.endurance
+ if(myseed.get_gene(/datum/plant_gene/trait/glow))
+ var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
+ set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
+ setDir(CalcDir())
+ var/base_icon_state = initial(icon_state)
if(!floor)
switch(dir) //offset to make it be on the wall rather than on the floor
if(NORTH)
@@ -38,70 +68,58 @@
pixel_x = 32
if(WEST)
pixel_x = -32
- icon_state = "glowshroom[rand(1,3)]"
+ icon_state = "[base_icon_state][rand(1,3)]"
else //if on the floor, glowshroom on-floor sprite
- icon_state = "glowshroomf"
+ icon_state = "[base_icon_state]f"
- processing_objects += src
+ addtimer(src, "Spread", delay, FALSE)
+/obj/structure/glowshroom/proc/Spread()
+ var/turf/ownturf = get_turf(src)
+ var/shrooms_planted = 0
+ for(var/i in 1 to myseed.yield)
+ if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
+ var/list/possibleLocs = list()
+ var/spreadsIntoAdjacent = FALSE
- set_light(round(potency/10))
- lastTick = world.timeofday
+ if(prob(spreadIntoAdjacentChance))
+ spreadsIntoAdjacent = TRUE
-
-/obj/effect/glowshroom/Destroy()
- processing_objects -= src
- return ..()
-
-/obj/effect/glowshroom/process()
- if(!spreaded)
- return
-
- if(((world.timeofday - lastTick) > delay) || ((world.timeofday - lastTick) < 0))
- lastTick = world.timeofday
- spreaded = 0
-
- for(var/i=1,i<=yield,i++)
- if(prob(spreadChance))
- var/list/possibleLocs = list()
- var/spreadsIntoAdjacent = 0
-
- if(prob(spreadIntoAdjacentChance))
- spreadsIntoAdjacent = 1
-
- for(var/turf/simulated/floor/plating/airless/asteroid/earth in view(3,src))
- if(spreadsIntoAdjacent || !locate(/obj/effect/glowshroom) in view(1,earth))
- possibleLocs += earth
-
- if(!possibleLocs.len)
- break
-
- var/turf/newLoc = pick(possibleLocs)
-
- var/shroomCount = 0 //hacky
- var/placeCount = 1
- for(var/obj/effect/glowshroom/shroom in newLoc)
- shroomCount++
- for(var/wallDir in cardinal)
- var/turf/isWall = get_step(newLoc,wallDir)
- if(isWall.density)
- placeCount++
- if(shroomCount >= placeCount)
+ for(var/turf/simulated/floor/earth in view(3,src))
+ if(!ownturf.CanAtmosPass(earth))
continue
+ if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth))
+ possibleLocs += earth
+ CHECK_TICK
- var/obj/effect/glowshroom/child = new /obj/effect/glowshroom(newLoc)
- child.potency = potency
- child.yield = yield
- child.delay = delay
- child.endurance = endurance
+ if(!possibleLocs.len)
+ break
- spreaded++
+ var/turf/newLoc = pick(possibleLocs)
- if(prob(evolveChance)) //very low chance to evolve on its own
- potency += rand(4,6)
+ var/shroomCount = 0 //hacky
+ var/placeCount = 1
+ for(var/obj/structure/glowshroom/shroom in newLoc)
+ shroomCount++
+ for(var/wallDir in cardinal)
+ var/turf/isWall = get_step(newLoc,wallDir)
+ if(isWall.density)
+ placeCount++
+ if(shroomCount >= placeCount)
+ continue
-/obj/effect/glowshroom/proc/CalcDir(turf/location = loc)
- //set background = 1
+ var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE)
+ child.generation = generation + 1
+ shrooms_planted++
+
+ CHECK_TICK
+ else
+ shrooms_planted++ //if we failed due to generation, don't try to plant one later
+ if(shrooms_planted < myseed.yield) //if we didn't get all possible shrooms planted, try again later
+ myseed.yield -= shrooms_planted
+ addtimer(src, "Spread", delay, FALSE)
+
+/obj/structure/glowshroom/proc/CalcDir(turf/location = loc)
var/direction = 16
for(var/wallDir in cardinal)
@@ -109,7 +127,7 @@
if(newTurf.density)
direction |= wallDir
- for(var/obj/effect/glowshroom/shroom in location)
+ for(var/obj/structure/glowshroom/shroom in location)
if(shroom == src)
continue
if(shroom.floor) //special
@@ -133,34 +151,37 @@
floor = 1
return 1
-/obj/effect/glowshroom/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/glowshroom/attackby(obj/item/I, mob/user)
..()
-
- endurance -= W.force
-
- CheckEndurance()
-
-/obj/effect/glowshroom/ex_act(severity)
- switch(severity)
- if(1.0)
- qdel(src)
+ var/damage_to_do = I.force
+ if(istype(I, /obj/item/weapon/scythe))
+ var/obj/item/weapon/scythe/S = I
+ if(S.extend) //so folded telescythes won't get damage boosts / insta-clears (they instead will instead be treated like non-scythes)
+ damage_to_do *= 4
+ for(var/obj/structure/glowshroom/G in range(1,src))
+ G.endurance -= damage_to_do
+ G.CheckEndurance()
return
- if(2.0)
+ if(I.damtype != STAMINA)
+ endurance -= damage_to_do
+ CheckEndurance()
+
+/obj/structure/glowshroom/ex_act(severity)
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
if(prob(50))
qdel(src)
- return
- if(3.0)
+ if(3)
if(prob(5))
qdel(src)
- return
- else
- return
-/obj/effect/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
endurance -= 5
CheckEndurance()
-/obj/effect/glowshroom/proc/CheckEndurance()
+/obj/structure/glowshroom/proc/CheckEndurance()
if(endurance <= 0)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index f46810486ca..e5b1098e2d0 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -1,252 +1,270 @@
-/obj/effect/landmark
- name = "landmark"
- icon = 'icons/mob/screen_gen.dmi'
- icon_state = "x2"
- anchored = 1.0
- unacidable = 1
-
-/obj/effect/landmark/New()
-
- ..()
- set_tag()
- invisibility = 101
-
- switch(name) //some of these are probably obsolete
- if("start")
- newplayer_start += loc
- qdel(src)
-
- if("wizard")
- wizardstart += loc
- qdel(src)
-
- if("JoinLate")
- latejoin += loc
- qdel(src)
-
- if("JoinLateGateway")
- latejoin_gateway += loc
- qdel(src)
-
- if("JoinLateCryo")
- latejoin_cryo += loc
- qdel(src)
-
- if("JoinLateCyborg")
- latejoin_cyborg += loc
- qdel(src)
-
- if("prisonwarp")
- prisonwarp += loc
- qdel(src)
+/obj/effect/landmark
+ name = "landmark"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ anchored = 1.0
+ unacidable = 1
- if("prisonsecuritywarp")
- prisonsecuritywarp += loc
- qdel(src)
+/obj/effect/landmark/New()
- if("tdome1")
- tdome1 += loc
+ ..()
+ set_tag()
+ invisibility = 101
- if("tdome2")
- tdome2 += loc
+ switch(name) //some of these are probably obsolete
+ if("start")
+ newplayer_start += loc
+ qdel(src)
- if("tdomeadmin")
- tdomeadmin += loc
+ if("wizard")
+ wizardstart += loc
+ qdel(src)
- if("tdomeobserve")
- tdomeobserve += loc
+ if("avatarspawn")
+ avatarspawn += loc
- if("aroomwarp")
- aroomwarp += loc
-
- if("blobstart")
- blobstart += loc
- qdel(src)
-
- if("xeno_spawn")
- xeno_spawn += loc
- qdel(src)
-
- if("ninjastart")
- ninjastart += loc
- qdel(src)
-
- if("carpspawn")
- carplist += loc
-
- if("voxstart")
- raider_spawn += loc
-
- if("ERT Director")
- ertdirector += loc
- qdel(src)
+ if("JoinLate")
+ latejoin += loc
+ qdel(src)
- if("Response Team")
- emergencyresponseteamspawn += loc
- qdel(src)
-
- landmarks_list += src
- return 1
-
-/obj/effect/landmark/Destroy()
- landmarks_list -= src
- ..()
- return QDEL_HINT_HARDDEL_NOW
-
-/obj/effect/landmark/proc/set_tag()
- tag = text("landmark*[]", name)
-
-
-/obj/effect/landmark/start
- name = "start"
- icon = 'icons/mob/screen_gen.dmi'
- icon_state = "x"
- anchored = 1.0
-
-/obj/effect/landmark/start/set_tag()
- tag = "start*[name]"
-
-
-//Costume spawner landmarks
-
-/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
-
- var/list/options = typesof(/obj/effect/landmark/costume)
- var/PICK= options[rand(1,options.len)]
- new PICK(src.loc)
- qdel(src)
-
-//SUBCLASSES. Spawn a bunch of items and disappear likewise
-/obj/effect/landmark/costume/chicken/New()
- new /obj/item/clothing/suit/chickensuit(src.loc)
- new /obj/item/clothing/head/chicken(src.loc)
- new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/gladiator/New()
- new /obj/item/clothing/under/gladiator(src.loc)
- new /obj/item/clothing/head/helmet/gladiator(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/madscientist/New()
- new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
- new /obj/item/clothing/head/flatcap(src.loc)
- new /obj/item/clothing/suit/storage/labcoat/mad(src.loc)
- new /obj/item/clothing/glasses/gglasses(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/elpresidente/New()
- new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
- new /obj/item/clothing/head/flatcap(src.loc)
- new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc)
- new /obj/item/clothing/shoes/jackboots(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/nyangirl/New()
- new /obj/item/clothing/under/schoolgirl(src.loc)
- new /obj/item/clothing/head/kitty(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/maid/New()
- new /obj/item/clothing/under/blackskirt(src.loc)
- var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
- new CHOICE(src.loc)
- new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/butler/New()
- new /obj/item/clothing/suit/wcoat(src.loc)
- new /obj/item/clothing/under/suit_jacket(src.loc)
- new /obj/item/clothing/head/that(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/scratch/New()
- new /obj/item/clothing/gloves/color/white(src.loc)
- new /obj/item/clothing/shoes/white(src.loc)
- new /obj/item/clothing/under/scratch(src.loc)
- if(prob(30))
- new /obj/item/clothing/head/cueball(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/highlander/New()
- new /obj/item/clothing/under/kilt(src.loc)
- new /obj/item/clothing/head/beret(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/prig/New()
- new /obj/item/clothing/suit/wcoat(src.loc)
- new /obj/item/clothing/glasses/monocle(src.loc)
- var/CHOICE= pick( /obj/item/clothing/head/bowlerhat, /obj/item/clothing/head/that)
- new CHOICE(src.loc)
- new /obj/item/clothing/shoes/black(src.loc)
- new /obj/item/weapon/cane(src.loc)
- new /obj/item/clothing/under/sl_suit(src.loc)
- new /obj/item/clothing/mask/fakemoustache(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/plaguedoctor/New()
- new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
- new /obj/item/clothing/head/plaguedoctorhat(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/nightowl/New()
- new /obj/item/clothing/under/owl(src.loc)
- new /obj/item/clothing/mask/gas/owl_mask(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/waiter/New()
- new /obj/item/clothing/under/waiter(src.loc)
- var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
- new CHOICE(src.loc)
- new /obj/item/clothing/suit/apron(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/pirate/New()
- new /obj/item/clothing/under/pirate(src.loc)
- new /obj/item/clothing/suit/pirate_black(src.loc)
- var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
- new CHOICE(src.loc)
- new /obj/item/clothing/glasses/eyepatch(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/commie/New()
- new /obj/item/clothing/under/soviet(src.loc)
- new /obj/item/clothing/head/ushanka(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/imperium_monk/New()
- new /obj/item/clothing/suit/imperium_monk(src.loc)
- if(prob(25))
- new /obj/item/clothing/mask/gas/cyborg(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/holiday_priest/New()
- new /obj/item/clothing/suit/holidaypriest(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/marisawizard/fake/New()
- new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
- new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/cutewitch/New()
- new /obj/item/clothing/under/sundress(src.loc)
- new /obj/item/clothing/head/witchwig(src.loc)
- new /obj/item/weapon/twohanded/staff/broom(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/fakewizard/New()
- new /obj/item/clothing/suit/wizrobe/fake(src.loc)
- new /obj/item/clothing/head/wizard/fake(src.loc)
- new /obj/item/weapon/twohanded/staff/(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/sexyclown/New()
- new /obj/item/clothing/mask/gas/sexyclown(src.loc)
- new /obj/item/clothing/under/sexyclown(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/sexymime/New()
- new /obj/item/clothing/mask/gas/sexymime(src.loc)
- new /obj/item/clothing/under/sexymime(src.loc)
- qdel(src)
+ if("JoinLateGateway")
+ latejoin_gateway += loc
+ qdel(src)
+
+ if("JoinLateCryo")
+ latejoin_cryo += loc
+ qdel(src)
+
+ if("JoinLateCyborg")
+ latejoin_cyborg += loc
+ qdel(src)
+
+ if("prisonwarp")
+ prisonwarp += loc
+ qdel(src)
+
+ if("prisonsecuritywarp")
+ prisonsecuritywarp += loc
+ qdel(src)
+
+ if("tdome1")
+ tdome1 += loc
+
+ if("tdome2")
+ tdome2 += loc
+
+ if("tdomeadmin")
+ tdomeadmin += loc
+
+ if("tdomeobserve")
+ tdomeobserve += loc
+
+ if("aroomwarp")
+ aroomwarp += loc
+
+ if("blobstart")
+ blobstart += loc
+ qdel(src)
+
+ if("xeno_spawn")
+ xeno_spawn += loc
+ qdel(src)
+
+ if("ninjastart")
+ ninjastart += loc
+ qdel(src)
+
+ if("carpspawn")
+ carplist += loc
+
+ if("voxstart")
+ raider_spawn += loc
+
+ if("ERT Director")
+ ertdirector += loc
+ qdel(src)
+
+ if("Response Team")
+ emergencyresponseteamspawn += loc
+ qdel(src)
+
+ landmarks_list += src
+ return 1
+
+/obj/effect/landmark/Destroy()
+ landmarks_list -= src
+ ..()
+ return QDEL_HINT_HARDDEL_NOW
+
+/obj/effect/landmark/proc/set_tag()
+ tag = text("landmark*[]", name)
+
+
+/obj/effect/landmark/start
+ name = "start"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x"
+ anchored = 1.0
+
+/obj/effect/landmark/start/set_tag()
+ tag = "start*[name]"
+
+
+//Costume spawner landmarks
+
+/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
+
+ var/list/options = typesof(/obj/effect/landmark/costume)
+ var/PICK= options[rand(1,options.len)]
+ new PICK(src.loc)
+ qdel(src)
+
+//SUBCLASSES. Spawn a bunch of items and disappear likewise
+/obj/effect/landmark/costume/chicken/New()
+ new /obj/item/clothing/suit/chickensuit(src.loc)
+ new /obj/item/clothing/head/chicken(src.loc)
+ new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/gladiator/New()
+ new /obj/item/clothing/under/gladiator(src.loc)
+ new /obj/item/clothing/head/helmet/gladiator(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/madscientist/New()
+ new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
+ new /obj/item/clothing/head/flatcap(src.loc)
+ new /obj/item/clothing/suit/storage/labcoat/mad(src.loc)
+ new /obj/item/clothing/glasses/gglasses(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/elpresidente/New()
+ new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
+ new /obj/item/clothing/head/flatcap(src.loc)
+ new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc)
+ new /obj/item/clothing/shoes/jackboots(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/nyangirl/New()
+ new /obj/item/clothing/under/schoolgirl(src.loc)
+ new /obj/item/clothing/head/kitty(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/maid/New()
+ new /obj/item/clothing/under/blackskirt(src.loc)
+ var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
+ new CHOICE(src.loc)
+ new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/butler/New()
+ new /obj/item/clothing/suit/wcoat(src.loc)
+ new /obj/item/clothing/under/suit_jacket(src.loc)
+ new /obj/item/clothing/head/that(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/scratch/New()
+ new /obj/item/clothing/gloves/color/white(src.loc)
+ new /obj/item/clothing/shoes/white(src.loc)
+ new /obj/item/clothing/under/scratch(src.loc)
+ if(prob(30))
+ new /obj/item/clothing/head/cueball(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/highlander/New()
+ new /obj/item/clothing/under/kilt(src.loc)
+ new /obj/item/clothing/head/beret(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/prig/New()
+ new /obj/item/clothing/suit/wcoat(src.loc)
+ new /obj/item/clothing/glasses/monocle(src.loc)
+ var/CHOICE= pick( /obj/item/clothing/head/bowlerhat, /obj/item/clothing/head/that)
+ new CHOICE(src.loc)
+ new /obj/item/clothing/shoes/black(src.loc)
+ new /obj/item/weapon/cane(src.loc)
+ new /obj/item/clothing/under/sl_suit(src.loc)
+ new /obj/item/clothing/mask/fakemoustache(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/plaguedoctor/New()
+ new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
+ new /obj/item/clothing/head/plaguedoctorhat(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/nightowl/New()
+ new /obj/item/clothing/under/owl(src.loc)
+ new /obj/item/clothing/mask/gas/owl_mask(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/waiter/New()
+ new /obj/item/clothing/under/waiter(src.loc)
+ var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
+ new CHOICE(src.loc)
+ new /obj/item/clothing/suit/apron(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/pirate/New()
+ new /obj/item/clothing/under/pirate(src.loc)
+ new /obj/item/clothing/suit/pirate_black(src.loc)
+ var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
+ new CHOICE(src.loc)
+ new /obj/item/clothing/glasses/eyepatch(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/commie/New()
+ new /obj/item/clothing/under/soviet(src.loc)
+ new /obj/item/clothing/head/ushanka(src.loc)
+ qdel(src)
+
+
+/obj/effect/landmark/costume/imperium_monk/New()
+ new /obj/item/clothing/suit/imperium_monk(src.loc)
+ if(prob(25))
+ new /obj/item/clothing/mask/gas/cyborg(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/holiday_priest/New()
+ new /obj/item/clothing/suit/holidaypriest(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/marisawizard/fake/New()
+ new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
+ new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/cutewitch/New()
+ new /obj/item/clothing/under/sundress(src.loc)
+ new /obj/item/clothing/head/witchwig(src.loc)
+ new /obj/item/weapon/twohanded/staff/broom(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/fakewizard/New()
+ new /obj/item/clothing/suit/wizrobe/fake(src.loc)
+ new /obj/item/clothing/head/wizard/fake(src.loc)
+ new /obj/item/weapon/twohanded/staff/(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/sexyclown/New()
+ new /obj/item/clothing/mask/gas/sexyclown(src.loc)
+ new /obj/item/clothing/under/sexyclown(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/costume/sexymime/New()
+ new /obj/item/clothing/mask/gas/sexymime(src.loc)
+ new /obj/item/clothing/under/sexymime(src.loc)
+ qdel(src)
+
+/obj/effect/landmark/ruin
+ var/datum/map_template/ruin/ruin_template
+
+/obj/effect/landmark/ruin/New(loc, my_ruin_template)
+ name = "ruin_[ruin_landmarks.len + 1]"
+ ..(loc)
+ ruin_template = my_ruin_template
+ ruin_landmarks |= src
+
+/obj/effect/landmark/ruin/Destroy()
+ ruin_landmarks -= src
+ ruin_template = null
+ . = ..()
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index c9cb0c62eab..17029920dd3 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -1,94 +1,171 @@
/obj/effect/mine
- name = "Mine"
+ name = "dummy mine"
desc = "I Better stay away from that thing."
- density = 1
+ density = 0
anchored = 1
- layer = 3
icon = 'icons/obj/weapons.dmi'
- icon_state = "uglymine"
- var/triggerproc = "explode" //name of the proc thats called when the mine is triggered
- var/triggered = 0
-
-/obj/effect/mine/New()
icon_state = "uglyminearmed"
+ var/triggered = 0
+ var/faction = "syndicate"
+
+/obj/effect/mine/proc/mineEffect(mob/living/victim)
+ to_chat(victim, "*click* ")
/obj/effect/mine/Crossed(AM as mob|obj)
- Bumped(AM)
+ if(!isliving(AM))
+ return
+ if(isanimal(AM))
+ var/mob/living/simple_animal/SA = AM
+ if(faction && (faction in SA.faction))
+ return
+ if(!SA.flying)
+ triggermine(SA)
+ else
+ triggermine(AM)
-/obj/effect/mine/Bumped(mob/M as mob|obj)
-
- if(triggered) return
-
- if(istype(M, /mob/living/carbon/human))
- for(var/mob/O in viewers(world.view, src.loc))
- to_chat(O, "[M] triggered the [bicon(src)] [src] ")
- triggered = 1
- call(src,triggerproc)(M)
-
-/obj/effect/mine/proc/triggerrad(obj)
+/obj/effect/mine/proc/triggermine(mob/living/victim)
+ if(triggered)
+ return
+ visible_message("[victim] sets off \icon[src] [src]! ")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- obj:radiation += 50
- randmutb(obj)
- domutcheck(obj,null)
- spawn(0)
- qdel(src)
+ mineEffect(victim)
+ triggered = 1
+ qdel(src)
-/obj/effect/mine/proc/triggerstun(obj)
- if(ismob(obj))
- var/mob/M = obj
- M.Stun(30)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- spawn(0)
- qdel(src)
+/obj/effect/mine/explosive
+ name = "explosive mine"
+ var/range_devastation = 0
+ var/range_heavy = 1
+ var/range_light = 2
+ var/range_flash = 3
-/obj/effect/mine/proc/triggern2o(obj)
- atmos_spawn_air(SPAWN_N2O, 360)
- spawn(0)
- qdel(src)
+/obj/effect/mine/explosive/mineEffect(mob/living/victim)
+ explosion(loc, range_devastation, range_heavy, range_light, range_flash)
-/obj/effect/mine/proc/triggerplasma(obj)
- atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 360)
- spawn(0)
- qdel(src)
+/obj/effect/mine/stun
+ name = "stun mine"
+ var/stun_time = 8
-/obj/effect/mine/proc/triggerkick(obj)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- qdel(obj:client)
- spawn(0)
- qdel(src)
-
-/obj/effect/mine/proc/explode(obj)
- explosion(loc, 0, 1, 2, 3)
- spawn(0)
- qdel(src)
+/obj/effect/mine/stun/mineEffect(mob/living/victim)
+ if(isliving(victim))
+ victim.Weaken(stun_time)
/obj/effect/mine/dnascramble
name = "Radiation Mine"
- icon_state = "uglymine"
- triggerproc = "triggerrad"
+ var/radiation_amount
-/obj/effect/mine/plasma
- name = "Plasma Mine"
- icon_state = "uglymine"
- triggerproc = "triggerplasma"
+/obj/effect/mine/dnascramble/mineEffect(mob/living/victim)
+ victim.apply_effect(radiation_amount, IRRADIATE, 0)
+ randmutb(victim)
+ domutcheck(victim ,null)
-/obj/effect/mine/kick
- name = "Kick Mine"
- icon_state = "uglymine"
- triggerproc = "triggerkick"
+/obj/effect/mine/gas
+ name = "oxygen mine"
+ var/gas_amount = 360
+ var/gas_type = SPAWN_OXYGEN
-/obj/effect/mine/n2o
- name = "N2O Mine"
- icon_state = "uglymine"
- triggerproc = "triggern2o"
+/obj/effect/mine/gas/mineEffect(mob/living/victim)
+ atmos_spawn_air(gas_type, gas_amount)
-/obj/effect/mine/stun
- name = "Stun Mine"
- icon_state = "uglymine"
- triggerproc = "triggerstun"
+/obj/effect/mine/gas/plasma
+ name = "plasma mine"
+ gas_type = SPAWN_HEAT | SPAWN_TOXINS
+
+/obj/effect/mine/gas/n2o
+ name = "\improper N2O mine"
+ gas_type = SPAWN_N2O
+
+/obj/effect/mine/sound
+ name = "honkblaster 1000"
+ var/sound = 'sound/items/bikehorn.ogg'
+
+/obj/effect/mine/sound/mineEffect(mob/living/victim)
+ playsound(loc, sound, 100, 1)
+
+/obj/effect/mine/sound/bwoink
+ name = "bwoink mine"
+ sound = 'sound/effects/adminhelp.ogg'
+
+/obj/effect/mine/pickup
+ name = "pickup"
+ desc = "pick me up"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "electricity2"
+ density = 0
+ var/duration = 0
+
+/obj/effect/mine/pickup/New()
+ ..()
+ animate(src, pixel_y = 4, time = 20, loop = -1)
+
+/obj/effect/mine/pickup/triggermine(mob/living/victim)
+ if(triggered)
+ return
+ triggered = 1
+ invisibility = 101
+ mineEffect(victim)
+ qdel(src)
+
+/obj/effect/mine/pickup/bloodbath
+ name = "Red Orb"
+ desc = "You feel angry just looking at it."
+ duration = 1200 //2min
+ color = "red"
+
+/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim)
+ if(!istype(victim) || !victim.client)
+ return
+ to_chat(victim, "RIP AND TEAR ")
+ victim << 'sound/misc/e1m1.ogg'
+ var/old_color = victim.client.color
+ var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
+ var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
+
+ spawn(0)
+ new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0)
+
+ var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
+ chainsaw.flags |= NODROP
+ victim.drop_l_hand()
+ victim.drop_r_hand()
+ victim.put_in_hands(chainsaw)
+ chainsaw.attack_self(victim)
+ chainsaw.wield(victim)
+ victim.reagents.add_reagent("adminordrazine", 25)
+
+ victim.client.color = pure_red
+ animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT)
+ spawn(10)
+ animate(victim.client,color = old_color, time = duration)//, easing = SINE_EASING|EASE_OUT)
+ spawn(duration)
+ to_chat(victim, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.")
+ qdel(chainsaw)
+ qdel(src)
+
+/obj/effect/mine/pickup/healing
+ name = "Blue Orb"
+ desc = "You feel better just looking at it."
+ color = "blue"
+
+/obj/effect/mine/pickup/healing/mineEffect(mob/living/carbon/victim)
+ if(!victim.client || !istype(victim))
+ return
+ to_chat(victim, "You feel great! ")
+ victim.revive()
+
+/obj/effect/mine/pickup/speed
+ name = "Yellow Orb"
+ desc = "You feel faster just looking at it."
+ color = "yellow"
+ duration = 300
+
+/obj/effect/mine/pickup/speed/mineEffect(mob/living/carbon/victim)
+ if(!victim.client || !istype(victim))
+ return
+ to_chat(victim, "You feel fast! ")
+ victim.status_flags |= GOTTAGOREALLYFAST
+ spawn(duration)
+ victim.status_flags &= ~GOTTAGOREALLYFAST
+ to_chat(victim, "You slow down. ")
\ No newline at end of file
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 94967f60c95..0bb6278c0bc 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -1,4 +1,3 @@
-
/obj/effect/overlay
name = "overlay"
unacidable = 1
@@ -17,60 +16,9 @@
var/tmp/atom/BeamSource
New()
..()
- spawn(10) qdel(src)
-
-
-/obj/effect/overlay/temp
- anchored = 1
- layer = 4.1
- mouse_opacity = 0
- var/duration = 10
- var/randomdir = 1
-
-/obj/effect/overlay/temp/New()
- if(randomdir)
- dir = pick(cardinal)
- spawn(duration)
- qdel(src)
-
-/obj/effect/overlay/temp/revenant
- name = "spooky lights"
- icon = 'icons/effects/effects.dmi'
- icon_state = "purplesparkles"
-
-/obj/effect/overlay/temp/revenant/cracks
- name = "glowing cracks"
- icon_state = "purplecrack"
- duration = 6
-
-/obj/effect/overlay/temp/guardian
- randomdir = 0
-
-/obj/effect/overlay/temp/guardian/phase
- duration = 5
- icon_state = "phasein"
-
-/obj/effect/overlay/temp/guardian/phase/out
- icon_state = "phaseout"
-
-/obj/effect/overlay/temp/emp
- name = "emp sparks"
- icon = 'icons/effects/effects.dmi'
- icon_state = "empdisable"
-
-/obj/effect/overlay/temp/emp/pulse
- name = "emp pulse"
- icon_state = "emp pulse"
- duration = 8
- randomdir = 0
-
-/obj/effect/overlay/temp/kinetic_blast
- name = "kinetic explosion"
- icon = 'icons/obj/projectiles.dmi'
- icon_state = "kinetic_blast"
- layer = 4.1
- duration = 4
-
+ spawn(10)
+ qdel(src)
+
/obj/effect/overlay/palmtree_r
name = "Palm tree"
icon = 'icons/misc/beach2.dmi'
@@ -98,6 +46,164 @@
icon_state = "admin"
layer = 4.1
+/obj/effect/overlay/temp
+ anchored = 1
+ layer = 4.1
+ mouse_opacity = 0
+ var/duration = 10
+ var/randomdir = 1
+
+/obj/effect/overlay/temp/New()
+ if(randomdir)
+ dir = pick(cardinal)
+
+ flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation.
+
+ spawn(duration)
+ qdel(src)
+
+/obj/effect/overlay/temp/revenant
+ name = "spooky lights"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "purplesparkles"
+
+/obj/effect/overlay/temp/revenant/cracks
+ name = "glowing cracks"
+ icon_state = "purplecrack"
+ duration = 6
+
+/obj/effect/overlay/temp/guardian
+ randomdir = 0
+
+/obj/effect/overlay/temp/guardian/phase
+ duration = 5
+ icon_state = "phasein"
+
+/obj/effect/overlay/temp/guardian/phase/out
+ icon_state = "phaseout"
+
+/obj/effect/overlay/temp/emp
+ name = "emp sparks"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "empdisable"
+
+/obj/effect/overlay/temp/emp/pulse
+ name = "emp pulse"
+ icon_state = "emppulse"
+ duration = 8
+ randomdir = 0
+
+/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed
+ name = "healing glow"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "heal"
+ duration = 15
+
+/obj/effect/overlay/temp/heal/New(loc, colour)
+ ..()
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-9, 0)
+ if(colour)
+ color = colour
+
+/obj/effect/overlay/temp/kinetic_blast
+ name = "kinetic explosion"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "kinetic_blast"
+ layer = 4.1
+ duration = 4
+
+/obj/effect/overlay/temp/explosion
+ name = "explosion"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "explosion"
+ pixel_x = -32
+ pixel_y = -32
+ duration = 8
+
+/obj/effect/overlay/temp/explosion/fast
+ icon_state = "explosionfast"
+ duration = 4
+
+/obj/effect/overlay/temp/decoy
+ desc = "It's a decoy!"
+ duration = 15
+
+/obj/effect/overlay/temp/decoy/New(loc, atom/mimiced_atom)
+ ..()
+ alpha = initial(alpha)
+ if(mimiced_atom)
+ name = mimiced_atom.name
+ appearance = mimiced_atom.appearance
+ dir = mimiced_atom.dir
+ mouse_opacity = 0
+
+/obj/effect/overlay/temp/decoy/fading/New(loc, atom/mimiced_atom)
+ ..()
+ animate(src, alpha = 0, time = duration)
+
+/obj/effect/overlay/temp/cult
+ icon = 'icons/effects/effects.dmi'
+ randomdir = 0
+ duration = 10
+
+/obj/effect/overlay/temp/cult/sparks
+ randomdir = 1
+ name = "blood sparks"
+ icon_state = "bloodsparkles"
+
+/obj/effect/overlay/temp/dir_setting
+ randomdir = FALSE
+
+/obj/effect/overlay/temp/dir_setting/New(loc, set_dir)
+ if(set_dir)
+ dir = set_dir
+ ..()
+
+/obj/effect/overlay/temp/dir_setting/bloodsplatter
+ icon = 'icons/effects/blood.dmi'
+ duration = 5
+ randomdir = FALSE
+ layer = MOB_LAYER - 0.1
+ var/splatter_type = "splatter"
+
+/obj/effect/overlay/temp/dir_setting/bloodsplatter/New(loc, set_dir)
+ if(set_dir in diagonals)
+ icon_state = "[splatter_type][pick(1, 2, 6)]"
+ else
+ icon_state = "[splatter_type][pick(3, 4, 5)]"
+ ..()
+ var/target_pixel_x = 0
+ var/target_pixel_y = 0
+ switch(set_dir)
+ if(NORTH)
+ target_pixel_y = 16
+ if(SOUTH)
+ target_pixel_y = -16
+ layer = MOB_LAYER + 0.1
+ if(EAST)
+ target_pixel_x = 16
+ if(WEST)
+ target_pixel_x = -16
+ if(NORTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = 16
+ if(NORTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = 16
+ if(SOUTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = -16
+ layer = MOB_LAYER + 0.1
+ if(SOUTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = -16
+ layer = MOB_LAYER + 0.1
+ animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
+
+/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter
+ splatter_type = "xsplatter"
+
/obj/effect/overlay/wall_rot
name = "Wallrot"
desc = "Ick..."
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 0293231c60e..7045a06a875 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -67,7 +67,7 @@
/obj/item/clothing/gloves/color/black = 20,
/obj/item/clothing/head/hardhat = 10,
/obj/item/clothing/head/hardhat/red = 10,
- /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10,
+ /obj/item/clothing/head/that = 10,
/obj/item/clothing/head/ushanka = 10,
/obj/item/clothing/head/welding = 10,
/obj/item/clothing/mask/gas = 10,
@@ -103,8 +103,8 @@
/obj/item/weapon/hand_labeler = 10,
/obj/item/weapon/paper/crumpled = 10,
/obj/item/weapon/pen = 10,
- /obj/item/weapon/minihoe = 10,
- /obj/item/weapon/plantspray/pests = 10,
+ /obj/item/weapon/cultivator = 10,
+ /obj/item/weapon/reagent_containers/spray/pestspray = 10,
/obj/item/weapon/stock_parts/cell = 30,
/obj/item/weapon/storage/belt/utility = 20,
/obj/item/weapon/storage/box = 20,
@@ -121,14 +121,15 @@
/obj/item/weapon/wirecutters = 10,
/obj/item/weapon/wrench = 40,
/obj/item/weapon/relic = 35,
+ /obj/item/weaponcrafting/receiver = 20,
/obj/item/clothing/shoes/brown = 30,
- /obj/item/seeds/ambrosiadeusseed = 10,
- /obj/item/seeds/ambrosiavulgarisseed = 20,
+ /obj/item/seeds/ambrosia/deus = 10,
+ /obj/item/seeds/ambrosia = 20,
/obj/item/clothing/under/color/black = 30,
/obj/item/stack/tape_roll = 10,
////////////////CONTRABAND STUFF//////////////////
/obj/item/weapon/grenade/clown_grenade = 3,
- /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 3,
+ /obj/item/seeds/ambrosia/cruciatus = 3,
/obj/item/weapon/gun/projectile/automatic/pistol/empty = 1,
/obj/item/ammo_box/magazine/m10mm = 4,
/obj/item/weapon/soap/syndie = 7,
@@ -148,7 +149,7 @@
/obj/item/weapon/implanter/storage = 1,
/obj/item/toy/cards/deck/syndicate = 2,
/obj/item/weapon/storage/secure/briefcase/syndie = 2,
- "" = 90
+ "" = 70
)
/obj/effect/spawner/lootdrop/crate_spawner // for ruins
@@ -192,8 +193,8 @@
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/spacecash/c200 = 1,
+ /obj/item/stack/spacecash/c200 = 1,
/obj/item/weapon/airlock_electronics = 1,
- /obj/item/weapon/gun/energy/kinetic_accelerator/super = 1,
+ /obj/item/weapon/gun/energy/kinetic_accelerator = 1,
/obj/item/pizzabox = 3,
)
diff --git a/code/game/objects/effects/spawners/random_barrier.dm b/code/game/objects/effects/spawners/random_barrier.dm
new file mode 100644
index 00000000000..3fd81bcf9b0
--- /dev/null
+++ b/code/game/objects/effects/spawners/random_barrier.dm
@@ -0,0 +1,65 @@
+/obj/effect/spawner/random_barrier
+ name = "random tile"
+ var/list/result = list(
+ /turf/simulated/floor/plasteel = 1,
+ /turf/simulated/wall = 1,
+ /obj/structure/falsewall = 1,
+ /obj/effect/spawner/window/reinforced = 1,
+ /obj/machinery/door/airlock = 1,
+ /obj/machinery/door/airlock/welded = 1,
+ /obj/structure/barricade/wooden = 1)
+
+// This needs to come before the initialization wave because
+// the thing it creates might need to be initialized too
+/obj/effect/spawner/random_barrier/New()
+ . = ..()
+ var/turf/T = get_turf(src)
+ if(!T)
+ log_runtime(EXCEPTION("Barrier spawner placed in nullspace!"), src)
+ return
+ var/thing_to_place = pickweight(result)
+ if(ispath(thing_to_place, /turf))
+ T.ChangeTurf(thing_to_place)
+ else
+ new thing_to_place(T)
+ qdel(src)
+
+/obj/effect/spawner/random_barrier/wall_probably
+ name = "probably a wall"
+ result = list(
+ /turf/simulated/wall = 9,
+ /obj/structure/falsewall = 1)
+
+/obj/effect/spawner/random_barrier/floor_probably
+ name = "probably a floor"
+ result = list(
+ /turf/simulated/floor/plasteel = 3,
+ /turf/simulated/wall = 1)
+
+/obj/effect/spawner/random_barrier/obstruction
+ name = "obstruction"
+ result = list(
+ /turf/simulated/wall = 1,
+ /obj/structure/falsewall = 1,
+ /obj/structure/barricade/wooden = 1,
+ /obj/machinery/door/airlock/welded = 1)
+
+/obj/effect/spawner/random_barrier/possibly_welded_airlock // these have no access restrictions, so for internal maintenance only
+ name = "possibly welded airlock"
+ result = list(
+ /obj/machinery/door/airlock = 3,
+ /obj/machinery/door/airlock/welded = 1)
+
+/obj/effect/spawner/random_spawners/grille_often
+ name = "grille often"
+ result = list(
+ /obj/structure/grille = 8,
+ /obj/structure/grille/broken = 4,
+ /turf/simulated/floor/plating = 2)
+
+/obj/effect/spawner/random_spawners/grille_maybe
+ name = "grille maybe"
+ result = list(
+ /obj/structure/grille = 2,
+ /obj/structure/grille/broken = 2,
+ /turf/simulated/floor/plating = 5)
diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm
new file mode 100644
index 00000000000..621c8799cc2
--- /dev/null
+++ b/code/game/objects/effects/spawners/random_spawners.dm
@@ -0,0 +1,110 @@
+/obj/effect/spawner/random_spawners
+ name = "random spawners"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ color = "#00FF00"
+ var/list/result = list(
+ /turf/simulated/floor/plasteel = 1,
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/blood/splatter = 1,
+ /obj/effect/decal/cleanable/blood/oil = 1,
+ /obj/effect/decal/cleanable/fungus = 1)
+
+// This needs to come before the initialization wave because
+// the thing it creates might need to be initialized too
+/obj/effect/spawner/random_spawners/New()
+ . = ..()
+ var/turf/T = get_turf(src)
+ if(!T)
+ log_runtime(EXCEPTION("Spawner placed in nullspace!"), src)
+ return
+ var/thing_to_place = pickweight(result)
+ if(ispath(thing_to_place, /turf))
+ T.ChangeTurf(thing_to_place)
+ else
+ new thing_to_place(T)
+ qdel(src)
+
+/obj/effect/spawner/random_spawners/blood_maybe
+ name = "blood maybe"
+ result = list(
+ /turf/simulated/floor/plating = 20,
+ /obj/effect/decal/cleanable/blood/splatter = 1)
+
+/obj/effect/spawner/random_spawners/blood_often
+ name = "blood often"
+ result = list(
+ /turf/simulated/floor/plating = 5,
+ /obj/effect/decal/cleanable/blood/splatter = 1)
+
+/obj/effect/spawner/random_spawners/oil_maybe
+ name = "oil maybe"
+ result = list(
+ /turf/simulated/floor/plating = 20,
+ /obj/effect/decal/cleanable/blood/oil = 1)
+
+/obj/effect/spawner/random_spawners/oil_maybe
+ name = "oil often"
+ result = list(
+ /turf/simulated/floor/plating = 5,
+ /obj/effect/decal/cleanable/blood/oil = 1)
+
+/obj/effect/spawner/random_spawners/wall_rusted_probably
+ name = "rusted wall probably"
+ result = list(
+ /turf/simulated/wall = 2,
+ /turf/simulated/wall/rust = 7)
+
+/obj/effect/spawner/random_spawners/wall_rusted_maybe
+ name = "rusted wall maybe"
+ result = list(
+ /turf/simulated/wall = 7,
+ /turf/simulated/wall/rust = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_left_frequent
+ name = "cobweb left frequent"
+ result = list(
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/cobweb = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_right_frequent
+ name = "cobweb right frequent"
+ result = list(
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/cobweb2 = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_left_rare
+ name = "cobweb left rare"
+ result = list(
+ /turf/simulated/floor/plating = 10,
+ /obj/effect/decal/cleanable/cobweb = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_right_rare
+ name = "cobweb right rare"
+ result = list(
+ /turf/simulated/floor/plating = 10,
+ /obj/effect/decal/cleanable/cobweb2 = 1)
+
+/obj/effect/spawner/random_spawners/dirt_frequent
+ name = "dirt frequent"
+ result = list(
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/dirt = 1)
+
+/obj/effect/spawner/random_spawners/dirt_rare
+ name = "dirt rare"
+ result = list(
+ /turf/simulated/floor/plating = 10,
+ /obj/effect/decal/cleanable/dirt = 1)
+
+/obj/effect/spawner/random_spawners/fungus_maybe
+ name = "rusted wall maybe"
+ result = list(
+ /turf/simulated/wall = 7,
+ /obj/effect/decal/cleanable/fungus = 1)
+
+/obj/effect/spawner/random_spawners/fungus_probably
+ name = "rusted wall maybe"
+ result = list(
+ /turf/simulated/wall = 1,
+ /obj/effect/decal/cleanable/fungus = 7)
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 8443ac90f17..2265c166461 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -1,14 +1,19 @@
//generic procs copied from obj/effect/alien
-/obj/effect/spider
+/obj/structure/spider
name = "web"
desc = "it's stringy and sticky"
icon = 'icons/effects/effects.dmi'
anchored = 1
density = 0
var/health = 15
+ var/master_commander = null
+
+/obj/structure/spider/Destroy()
+ master_commander = null
+ return ..()
//similar to weeds, but only barfed out by nurses manually
-/obj/effect/spider/ex_act(severity)
+/obj/structure/spider/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
@@ -20,7 +25,7 @@
qdel(src)
return
-/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user, params)
+/obj/structure/spider/attackby(var/obj/item/weapon/W, var/mob/user, params)
if(W.attack_verb.len)
visible_message("[user] has [pick(W.attack_verb)] \the [src] with \the [W]! ")
else
@@ -33,34 +38,34 @@
if(WT.remove_fuel(0, user))
damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, WT.usesound, 100, 1)
health -= damage
healthcheck()
-/obj/effect/spider/bullet_act(var/obj/item/projectile/Proj)
+/obj/structure/spider/bullet_act(var/obj/item/projectile/Proj)
..()
health -= Proj.damage
healthcheck()
-/obj/effect/spider/proc/healthcheck()
+/obj/structure/spider/proc/healthcheck()
if(health <= 0)
qdel(src)
-/obj/effect/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
health -= 5
healthcheck()
-/obj/effect/spider/stickyweb
+/obj/structure/spider/stickyweb
icon_state = "stickyweb1"
-/obj/effect/spider/stickyweb/New()
+/obj/structure/spider/stickyweb/New()
if(prob(50))
icon_state = "stickyweb2"
-/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider))
return 1
else if(istype(mover, /mob/living))
@@ -71,33 +76,32 @@
return prob(30)
return 1
-/obj/effect/spider/eggcluster
+/obj/structure/spider/eggcluster
name = "egg cluster"
desc = "They seem to pulse slightly with an inner life"
icon_state = "eggs"
var/amount_grown = 0
var/player_spiders = 0
var/faction = list()
- var/master_commander = null
-/obj/effect/spider/eggcluster/New()
+/obj/structure/spider/eggcluster/New()
pixel_x = rand(3,-3)
pixel_y = rand(3,-3)
processing_objects.Add(src)
-/obj/effect/spider/eggcluster/process()
+/obj/structure/spider/eggcluster/process()
amount_grown += rand(0,2)
if(amount_grown >= 100)
var/num = rand(3,12)
for(var/i=0, i[src] dies! ")
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
-/obj/effect/spider/spiderling/healthcheck()
+/obj/structure/spider/spiderling/healthcheck()
if(health <= 0)
die()
-/obj/effect/spider/spiderling/process()
+/obj/structure/spider/spiderling/process()
if(travelling_in_vent)
if(istype(src.loc, /turf))
travelling_in_vent = 0
@@ -217,17 +225,17 @@
icon_state = "greenshatter"
anchored = 1
-/obj/effect/spider/cocoon
+/obj/structure/spider/cocoon
name = "cocoon"
desc = "Something wrapped in silky spider web"
icon_state = "cocoon1"
health = 60
-/obj/effect/spider/cocoon/New()
+/obj/structure/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
-/obj/effect/spider/cocoon/Destroy()
- src.visible_message("\The [src] splits open. ")
+/obj/structure/spider/cocoon/Destroy()
+ visible_message("[src] splits open. ")
for(var/atom/movable/A in contents)
- A.loc = src.loc
+ A.forceMove(loc)
return ..()
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 9e36faae088..4aea96c167b 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -1,6 +1,6 @@
//TODO: Flash range does nothing currently
-/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0)
+/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
@@ -64,9 +64,14 @@
M << 'sound/effects/explosionfar.ogg'
if(heavy_impact_range > 1)
- var/datum/effect/system/explosion/E = new/datum/effect/system/explosion()
- E.set_up(epicenter)
- E.start()
+ if(smoke)
+ var/datum/effect/system/explosion/smoke/E = new/datum/effect/system/explosion/smoke()
+ E.set_up(epicenter)
+ E.start()
+ else
+ var/datum/effect/system/explosion/E = new/datum/effect/system/explosion()
+ E.set_up(epicenter)
+ E.start()
var/x0 = epicenter.x
var/y0 = epicenter.y
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index b34cc09ca89..cca6f9d9265 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -19,7 +19,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/r_speed = 1.0
var/health = null
var/hitsound = null
- var/w_class = 3
+ var/usesound = null
+ var/w_class = WEIGHT_CLASS_NORMAL
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 3
@@ -54,12 +55,16 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/strip_delay = DEFAULT_ITEM_STRIP_DELAY
var/put_on_delay = DEFAULT_ITEM_PUTON_DELAY
var/breakouttime = 0
-
+ var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/flags_size = 0 //flag, primarily used for clothing to determine if a fatty can wear something or not.
var/block_chance = 0
var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom
+ var/mob/thrownby = null
+
+ var/toolspeed = 1 // If this item is a tool, the speed multiplier
+
/* Species-specific sprites, concept stolen from Paradise//vg/.
ex:
sprite_sheets = list(
@@ -78,11 +83,12 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
new path(src)
/obj/item/Destroy()
+ QDEL_NULL(hidden_uplink)
if(ismob(loc))
var/mob/m = loc
m.unEquip(src, 1)
- for(var/X in actions)
- qdel(X)
+ QDEL_LIST(actions)
+ master = null
return ..()
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
@@ -140,16 +146,18 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/examine(mob/user, var/distance = -1)
var/size
switch(src.w_class)
- if(1.0)
+ if(WEIGHT_CLASS_TINY)
size = "tiny"
- if(2.0)
+ if(WEIGHT_CLASS_SMALL)
size = "small"
- if(3.0)
+ if(WEIGHT_CLASS_NORMAL)
size = "normal-sized"
- if(4.0)
+ if(WEIGHT_CLASS_BULKY)
size = "bulky"
- if(5.0)
+ if(WEIGHT_CLASS_HUGE)
size = "huge"
+ if(WEIGHT_CLASS_GIGANTIC)
+ size = "gigantic"
. = ..(user, distance, "", "It is a [size] item.")
@@ -182,9 +190,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(!user) return 0
if(hasorgans(user))
var/mob/living/carbon/human/H = user
- var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
+ var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(user.hand)
- temp = H.organs_by_name["l_hand"]
+ temp = H.bodyparts_by_name["l_hand"]
if(!temp)
to_chat(user, "You try to use your hand, but it's missing! ")
return 0
@@ -213,7 +221,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/obj/item/weapon/storage/S = src.loc
S.remove_from_storage(src)
- src.throwing = 0
+ if(throwing)
+ throwing.finalize(FALSE)
if(loc == user)
if(!user.unEquip(src))
return 0
@@ -227,36 +236,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
user.put_in_active_hand(src)
return 1
-
-/obj/item/attack_alien(mob/user as mob)
-
- if(isalien(user)) // -- TLE
- var/mob/living/carbon/alien/A = user
-
- if(!A.has_fine_manipulation)
- if(src in A.contents) // To stop Aliens having items stuck in their pockets
- A.unEquip(src)
- to_chat(user, "Your claws aren't capable of such fine manipulation.")
- return
-
- if(istype(src.loc, /obj/item/weapon/storage))
- for(var/mob/M in range(1, src.loc))
- if(M.s_active == src.loc)
- if(M.client)
- M.client.screen -= src
- src.throwing = 0
- if(src.loc == user)
- if(!user.unEquip(src))
- return
- else
- if(istype(src.loc, /mob/living))
- return
- src.pickup(user)
-
- user.put_in_active_hand(src)
- return
-
-
/obj/item/attack_alien(mob/user as mob)
var/mob/living/carbon/alien/A = user
@@ -319,9 +298,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/proc/talk_into(mob/M, var/text, var/channel=null)
return
-/obj/item/proc/moved(mob/user, old_loc)
- return
-
/obj/item/proc/dropped(mob/user)
for(var/X in actions)
var/datum/action/A = X
@@ -388,22 +364,22 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr))
return
if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
- to_chat(usr, "\red You can't pick things up!")
+ to_chat(usr, "You can't pick things up! ")
return
if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained
- to_chat(usr, "\red You can't pick things up!")
+ to_chat(usr, "You can't pick things up! ")
return
if(src.anchored) //Object isn't anchored
- to_chat(usr, "\red You can't pick that up!")
+ to_chat(usr, "You can't pick that up! ")
return
if(!usr.hand && usr.r_hand) //Right hand is not full
- to_chat(usr, "\red Your right hand is full.")
+ to_chat(usr, "Your right hand is full. ")
return
if(usr.hand && usr.l_hand) //Left hand is not full
- to_chat(usr, "\red Your left hand is full.")
+ to_chat(usr, "Your left hand is full. ")
return
if(!istype(src.loc, /turf)) //Object is on a turf
- to_chat(usr, "\red You can't pick that up!")
+ to_chat(usr, "You can't pick that up! ")
return
//All checks are done, time to pick it up!
usr.UnarmedAttack(src)
@@ -429,9 +405,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/mob/living/carbon/human/H = M
if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
+ (H.head && H.head.flags_cover & HEADCOVERSEYES) || \
+ (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || \
+ (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES) \
))
// you can't stab someone in the eyes wearing a mask!
to_chat(user, "You're going to need to remove that mask/helmet/glasses first! ")
@@ -465,7 +441,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(istype(H))
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(!eyes) // should still get stabbed in the head
- var/obj/item/organ/external/head/head = H.organs_by_name["head"]
+ var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
head.take_damage(rand(10,14), 1)
return
eyes.take_damage(rand(3,4), 1)
@@ -542,6 +518,23 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
throw_at(S,14,3)
else ..()
+/obj/item/throw_impact(atom/A)
+ if(A && !qdeleted(A))
+ var/itempush = 1
+ if(w_class < WEIGHT_CLASS_BULKY)
+ itempush = 0 // too light to push anything
+ return A.hitby(src, 0, itempush)
+
+/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
+ thrownby = thrower
+ callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
+ . = ..(target, range, speed, thrower, spin, diagonals_first, callback)
+
+/obj/item/proc/after_throw(datum/callback/callback)
+ if(callback) //call the original callback
+ . = callback.Invoke()
+ throw_speed = initial(throw_speed) //explosions change this.
+
/obj/item/proc/pwr_drain()
return 0 // Process Kill
diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm
index 8ce5ecc288f..c7d283908d7 100644
--- a/code/game/objects/items/ashtray.dm
+++ b/code/game/objects/items/ashtray.dm
@@ -59,14 +59,14 @@
die()
return
if(contents.len)
- src.visible_message("\red [src] slams into [hit_atom] spilling its contents!")
+ src.visible_message("[src] slams into [hit_atom] spilling its contents! ")
for(var/obj/item/clothing/mask/cigarette/O in contents)
O.loc = src.loc
icon_state = icon_empty
return ..()
/obj/item/ashtray/proc/die()
- src.visible_message("\red [src] shatters spilling its contents!")
+ src.visible_message("[src] shatters spilling its contents! ")
for(var/obj/item/clothing/mask/cigarette/O in contents)
O.loc = src.loc
icon_state = icon_broken
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 198c6ce45aa..315eacb8f95 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -51,9 +51,9 @@
desc = "This is a one-use permit that allows the user to officially declare a built room as new addition to the station."
fluffnotice = "Nanotrasen Engineering requires all on-station construction projects to be approved by a head of staff, as detailed in Nanotrasen Company Regulation 512-C (Mid-Shift Modifications to Company Property). \
By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
-/obj/item/areaeditor/permit/attack_self(mob/user as mob)
+/obj/item/areaeditor/permit/attack_self(mob/user)
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
@@ -76,7 +76,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "blueprints"
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/list/showing = list()
var/client/viewing
@@ -85,7 +85,7 @@
return ..()
-/obj/item/areaeditor/blueprints/attack_self(mob/user as mob)
+/obj/item/areaeditor/blueprints/attack_self(mob/user)
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
@@ -153,7 +153,7 @@
/obj/item/areaeditor/proc/get_area_type(var/area/A = get_area())
- if(istype(A,/area/space))
+ if(A.outdoors)
return AREA_SPACE
var/list/SPECIALS = list(
/area/shuttle,
@@ -305,3 +305,10 @@
return ROOM_ERR_SPACE
found+=T
return found
+
+//Blueprint Subtypes
+
+/obj/item/areaeditor/blueprints/cyborg
+ name = "station schematics"
+ desc = "A digital copy of the station blueprints stored in your memory."
+ fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index e7443755978..4108fe85ddd 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -5,7 +5,7 @@
desc = "A folded bag designed for the storage and transportation of cadavers."
icon = 'icons/obj/bodybag.dmi'
icon_state = "bodybag_folded"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_self(mob/user)
var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc)
@@ -126,7 +126,7 @@
MouseDrop(over_object, src_location, over_location)
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
if(!ishuman(usr)) return
- to_chat(usr, "\red You can't fold that up anymore..")
+ to_chat(usr, "You can't fold that up anymore.. ")
..()
attackby(W as obj, mob/user as mob, params)
@@ -135,5 +135,5 @@
src.locked = !src.locked
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
- to_chat(user, "\red Access denied.")
- return
\ No newline at end of file
+ to_chat(user, "Access denied. ")
+ return
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index f0c3ee84e98..801f74770ba 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
item_state = "candle1"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/wax = 200
var/lit = 0
var/infinite = 0
@@ -17,6 +17,10 @@
// No visible message
light(show_message = 0)
+/obj/item/candle/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
/obj/item/candle/update_icon()
var/i
if(wax>150)
@@ -87,4 +91,4 @@
/obj/item/candle/eternal
desc = "A candle. This one seems to have an odd quality about the wax."
- infinite = 1
\ No newline at end of file
+ infinite = 1
diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm
index 4c2c5420d1a..0fe6cf48631 100644
--- a/code/game/objects/items/control_wand.dm
+++ b/code/game/objects/items/control_wand.dm
@@ -8,7 +8,7 @@
icon = 'icons/obj/device.dmi'
name = "control wand"
desc = "Remotely controls airlocks."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/mode = WAND_OPEN
var/region_access = 1 //See access.dm
var/obj/item/weapon/card/id/ID
@@ -19,9 +19,7 @@
ID.access = get_region_accesses(region_access)
/obj/item/weapon/door_remote/Destroy()
- if(ID)
- qdel(ID)
- ID = null
+ QDEL_NULL(ID)
return ..()
/obj/item/weapon/door_remote/attack_self(mob/user)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index d805105a906..a3d302f1326 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -7,9 +7,10 @@
desc = "A colourful crayon. Looks tasty. Mmmm..."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT | SLOT_EARS
attack_verb = list("attacked", "coloured")
+ toolspeed = 1
var/colour = "#FF0000" //RGB
var/drawtype = "rune"
var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead")
@@ -77,7 +78,7 @@
drawtype = temp
update_window(usr)
-/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
+/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
if(is_type_in_list(target,validSurfaces))
var/temp = "rune"
@@ -86,7 +87,7 @@
else if(graffiti.Find(drawtype))
temp = "graffiti"
to_chat(user, "You start drawing a [temp] on the [target.name].")
- if(instant || do_after(user, 50, target = target))
+ if(instant || do_after(user, 50 * toolspeed, target = target))
var/obj/effect/decal/cleanable/crayon/C = new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp)
C.add_hiddenprint(user)
to_chat(user, "You finish drawing [temp].")
@@ -95,17 +96,22 @@
if(!uses)
to_chat(user, "You used up your [name]! ")
qdel(src)
- return
-/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
+/obj/item/toy/crayon/attack(mob/M, mob/user)
var/huffable = istype(src,/obj/item/toy/crayon/spraycan)
if(M == user)
- to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!")
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!H.check_has_mouth())
+ to_chat(user, "You do not have a mouth! ")
+ return
+ playsound(loc, 'sound/items/eatfood.ogg', 50, 0)
+ to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious! ")
user.nutrition += 5
if(uses)
uses -= 5
if(uses <= 0)
- to_chat(user, "There is no more of [name] left! ")
+ to_chat(user, "There is no more of [name] left! ")
qdel(src)
else
..()
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index 991d04fbd63..3125c24837a 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -8,6 +8,11 @@
var/mob/owner = null // Carp doesn't attack owner, set when using in hand
var/owned = 1 // Boolean, no owner to begin with
+
+/obj/item/toy/carpplushie/dehy_carp/Destroy()
+ owner = null
+ return ..()
+
// Attack self
/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob)
src.add_fingerprint(user) // Anyone can add their fingerprints to it with this
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 0d02add30a3..542d3cd3fb4 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/aicards.dmi'
icon_state = "aicard" // aicard-full
item_state = "electronic"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
flags = NOBLUDGEON
var/flush = null
diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm
index 2d08b4f582b..2839715d7d7 100644
--- a/code/game/objects/items/devices/autopsy.dm
+++ b/code/game/objects/items/devices/autopsy.dm
@@ -1,26 +1,30 @@
-
-//moved these here from code/defines/obj/weapon.dm
-//please preference put stuff where it's easy to find - C
-
/obj/item/weapon/autopsy_scanner
name = "autopsy scanner"
desc = "Extracts information on wounds."
icon = 'icons/obj/autopsy_scanner.dmi'
icon_state = ""
flags = CONDUCT
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=1"
var/list/datum/autopsy_data_scanner/wdata = list()
- var/list/datum/autopsy_data_scanner/chemtraces = list()
+ var/list/chemtraces = list()
var/target_name = null
var/timeofdeath = null
+/obj/item/weapon/autopsy_scanner/Destroy()
+ QDEL_LIST_ASSOC_VAL(wdata)
+ return ..()
+
/datum/autopsy_data_scanner
var/weapon = null // this is the DEFINITE weapon type that was used
var/list/organs_scanned = list() // this maps a number of scanned organs to
// the wounds to those organs with this data's weapon type
var/organ_names = ""
+/datum/autopsy_data_scanner/Destroy()
+ QDEL_LIST_ASSOC_VAL(organs_scanned)
+ return ..()
+
/datum/autopsy_data
var/weapon = null
var/pretend_weapon = null
@@ -28,28 +32,23 @@
var/hits = 0
var/time_inflicted = 0
- proc/copy()
- var/datum/autopsy_data/W = new()
- W.weapon = weapon
- W.pretend_weapon = pretend_weapon
- W.damage = damage
- W.hits = hits
- W.time_inflicted = time_inflicted
- return W
+/datum/autopsy_data/proc/copy()
+ var/datum/autopsy_data/W = new()
+ W.weapon = weapon
+ W.pretend_weapon = pretend_weapon
+ W.damage = damage
+ W.hits = hits
+ W.time_inflicted = time_inflicted
+ return W
-/obj/item/weapon/autopsy_scanner/proc/add_data(var/obj/item/organ/external/O)
- if(!O.autopsy_data.len && !O.trace_chemicals.len) return
+/obj/item/weapon/autopsy_scanner/proc/add_data(obj/item/organ/external/O)
+ if(!O.autopsy_data.len && !O.trace_chemicals.len)
+ return
for(var/V in O.autopsy_data)
var/datum/autopsy_data/W = O.autopsy_data[V]
if(!W.pretend_weapon)
- /*
- // the more hits, the more likely it is that we get the right weapon type
- if(prob(50 + W.hits * 10 + W.damage))
- */
-
- // Buffing this stuff up for now!
if(1)
W.pretend_weapon = W.weapon
else
@@ -75,11 +74,8 @@
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
chemtraces += V
-/obj/item/weapon/autopsy_scanner/verb/print_data()
- set src in view(usr, 1)
- set name = "Print Data"
- if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
- to_chat(usr, "No.")
+/obj/item/weapon/autopsy_scanner/attack_self(mob/user)
+ if(!wdata.len && !chemtraces.len)
return
var/scan_data = ""
@@ -101,8 +97,10 @@
var/wname = W.pretend_weapon
- if(wname in weapon_chances) weapon_chances[wname] += W.damage
- else weapon_chances[wname] = max(W.damage, 1)
+ if(wname in weapon_chances)
+ weapon_chances[wname] += W.damage
+ else
+ weapon_chances[wname] = max(W.damage, 1)
total_score+=W.damage
@@ -126,7 +124,8 @@
if(30 to 1000)
damage_desc = "severe "
- if(!total_score) total_score = D.organs_scanned.len
+ if(!total_score)
+ total_score = D.organs_scanned.len
scan_data += "Weapon #[n] "
if(damaging_weapon)
@@ -147,36 +146,19 @@
for(var/chemID in chemtraces)
scan_data += chemID
scan_data += " "
+ user.visible_message("[src] rattles and prints out a sheet of paper. ")
- for(var/mob/O in viewers(usr))
- O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
-
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
- var/obj/item/weapon/paper/P = new(usr.loc)
+ var/obj/item/weapon/paper/P = new(user.loc)
P.name = "Autopsy Data ([target_name])"
P.info = "[scan_data] "
P.overlays += "paper_words"
- if(istype(usr,/mob/living/carbon))
- // place the item in the usr's hand if possible
- if(!usr.r_hand)
- P.loc = usr
- usr.r_hand = P
- P.layer = 20
- P.plane = HUD_PLANE
- else if(!usr.l_hand)
- P.loc = usr
- usr.l_hand = P
- P.layer = 20
- P.plane = HUD_PLANE
+ user.put_in_hands(P)
- if(istype(usr,/mob/living/carbon/human))
- usr:update_inv_l_hand()
- usr:update_inv_r_hand()
-
-/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
+/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M, mob/living/carbon/user)
if(!istype(M))
return
@@ -185,23 +167,18 @@
if(target_name != M.name)
target_name = M.name
- src.wdata = list()
- src.chemtraces = list()
- src.timeofdeath = null
- to_chat(user, "\red A new patient has been registered.. Purging data for previous patient.")
+ wdata.Cut()
+ chemtraces.Cut()
+ timeofdeath = null
+ to_chat(user, "A new patient has been registered. Purging data for previous patient. ")
- src.timeofdeath = M.timeofdeath
+ timeofdeath = M.timeofdeath
var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting)
if(!S)
- to_chat(usr, "You can't scan this body part. ")
+ to_chat(user, "You can't scan this body part. ")
return
- if(!S.open)
- to_chat(usr, "You have to cut the limb open first! ")
- return
- for(var/mob/O in viewers(M))
- O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.name] with \the [src.name]", 1)
+ M.visible_message("[user] scans the wounds on [M]'s [S] with [src] ")
- src.add_data(S)
-
- return 1
+ add_data(S)
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index af745b97f1f..5554fd4f0f4 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -9,7 +9,7 @@
desc = "For illicit snooping through the camera network."
icon = 'icons/obj/device.dmi'
icon_state = "camera_bug"
- w_class = 1.0
+ w_class = WEIGHT_CLASS_TINY
item_state = "camera_bug"
throw_speed = 4
throw_range = 20
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index d3f13c284c1..ff7eb0ac2cc 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -7,7 +7,7 @@
throwforce = 5.0
throw_speed = 3
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "syndicate=4;magnets=4"
var/can_use = 1
var/obj/effect/dummy/chameleon/active_dummy = null
@@ -150,4 +150,4 @@
/obj/effect/dummy/chameleon/Destroy()
master.disrupt(0)
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm
deleted file mode 100644
index 0984b437155..00000000000
--- a/code/game/objects/items/devices/debugger.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Multitool -- A multitool is used for hacking electronic devices.
- * TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
- *
- */
-
-/obj/item/device/debugger
- icon = 'icons/obj/hacktool.dmi'
- name = "debugger"
- desc = "Used to debug electronic equipment."
- icon_state = "hacktool-g"
- flags = CONDUCT
- force = 5.0
- w_class = 2
- throwforce = 5.0
- throw_range = 15
- throw_speed = 3
- desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
- materials = list(MAT_METAL=50, MAT_GLASS=20)
- origin_tech = "magnets=1;engineering=1"
- var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
-
-/obj/item/device/debugger/is_used_on(obj/O, mob/user)
- if(istype(O, /obj/machinery/power/apc))
- var/obj/machinery/power/apc/A = O
- if(A.emagged || A.malfhack)
- to_chat(user, "\red There is a software error with the device.")
- else
- to_chat(user, "\blue The device's software appears to be fine.")
- return 1
- if(istype(O, /obj/machinery/door))
- var/obj/machinery/door/D = O
- if(D.operating == -1)
- to_chat(user, "\red There is a software error with the device.")
- else
- to_chat(user, "\blue The device's software appears to be fine.")
- return 1
- else if(istype(O, /obj/machinery))
- var/obj/machinery/A = O
- if(A.emagged)
- to_chat(user, "\red There is a software error with the device.")
- else
- to_chat(user, "\blue The device's software appears to be fine.")
- return 1
\ No newline at end of file
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 52a9a343e6b..e309cae9bbe 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -4,7 +4,7 @@
icon_state = "flash"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
flags = CONDUCT
@@ -152,7 +152,7 @@
if(M.stat == CONSCIOUS)
M.mind_initialize() //give them a mind datum if they don't have one.
var/resisted
- if(!isloyal(M))
+ if(!ismindshielded(M))
if(user.mind in ticker.mode.head_revolutionaries)
if(ticker.mode.add_revolutionary(M.mind))
times_used -- //Flashes less likely to burn out for headrevs when used for conversion
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 7806982a627..f82e8ab2cee 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "flashlight"
item_state = "flashlight"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=50, MAT_GLASS=20)
@@ -35,6 +35,7 @@
return 0
on = !on
+ playsound(user, 'sound/weapons/empty.ogg', 100, 1)
update_brightness(user)
for(var/X in actions)
var/datum/action/A = X
@@ -54,8 +55,8 @@
return
var/mob/living/carbon/human/H = M //mob has protective eyewear
- if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
- to_chat(user, "You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first. ")
+ if(istype(H) && ((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES)))
+ to_chat(user, "You're going to need to remove that [(H.head && H.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask" : "glasses"] first. ")
return
if(M == user) //they're using it on themselves
@@ -70,12 +71,13 @@
user.visible_message("[user] directs [src] to [M]'s eyes. ", \
"You direct [src] to [M]'s eyes. ")
- if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected
- if(M.stat == DEAD || M.disabilities & BLIND) //mob is dead or fully blind
- to_chat(user, "[M] pupils does not react to the light! ")
- else if(XRAY in M.mutations) //mob has X-RAY vision
- to_chat(user, "[M] pupils give an eerie glow! ")
- else //they're okay!
+ if(istype(H)) //robots and aliens are unaffected
+ var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
+ if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind
+ to_chat(user, "[M]'s pupils are unresponsive to the light! ")
+ else if((XRAY in M.mutations) || (eyes.colourblind_darkview && eyes.colourblind_darkview == eyes.get_dark_view())) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
+ to_chat(user, "[M]'s pupils glow eerily! ")
+ else //they're okay!
if(M.flash_eyes(visual = 1))
to_chat(user, "[M]'s pupils narrow. ")
else
@@ -86,7 +88,7 @@
desc = "A pen-sized light, used by medical staff."
icon_state = "penlight"
item_state = ""
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT | SLOT_EARS
flags = CONDUCT
brightness_on = 2
@@ -107,7 +109,7 @@
item_state = ""
flags = CONDUCT
brightness_on = 2
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
// the desk lamps are a bit special
/obj/item/device/flashlight/lamp
@@ -116,7 +118,7 @@
icon_state = "lamp"
item_state = "lamp"
brightness_on = 5
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
materials = list()
on = 1
@@ -151,7 +153,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/flare
name = "flare"
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
brightness_on = 8 // Made it brighter (from 7 to 8).
light_color = "#ff0000" // changed colour to a more brighter red.
icon_state = "flare"
@@ -212,7 +214,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/flare/torch
name = "torch"
desc = "A torch fashioned from some leaves and a log."
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
brightness_on = 7
icon_state = "torch"
item_state = "torch"
@@ -225,7 +227,7 @@ obj/item/device/flashlight/lamp/bananalamp
icon = 'icons/obj/lighting.dmi'
icon_state = "floor1" //not a slime extract sprite but... something close enough!
item_state = "slime"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
brightness_on = 6
light_color = "#FFBF00"
materials = list()
diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm
index c278a1be72a..74b119c7b62 100644
--- a/code/game/objects/items/devices/floor_painter.dm
+++ b/code/game/objects/items/devices/floor_painter.dm
@@ -3,37 +3,37 @@
/obj/item/device/floor_painter
name = "floor painter"
icon_state = "floor_painter"
-
+
var/floor_icon
var/floor_state = "floor"
var/floor_dir = SOUTH
-
- w_class = 1
+
+ w_class = WEIGHT_CLASS_TINY
item_state = "electronic"
flags = CONDUCT
slot_flags = SLOT_BELT
-
- var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
+
+ var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
"bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold",
"cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor",
"freezerfloor", "green", "greenblue", "greenbluefull", "greencorner", "greenfull", "greenyellow",
"greenyellowfull", "grimy", "loadingarea", "neutral", "neutralcorner", "neutralfull", "orange", "orangecorner",
"orangefull", "purple", "purplecorner", "purplefull", "rampbottom", "ramptop", "red", "redblue", "redbluefull",
- "redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
- "warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
- "whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
- "whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
+ "redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
+ "warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
+ "whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
+ "whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"yellowcorner", "yellowcornersiding", "yellowsiding")
/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params)
if(!proximity)
return
-
+
var/turf/simulated/floor/plasteel/F = A
if(!istype(F))
to_chat(user, "\The [src] can only be used on station flooring. ")
return
-
+
F.icon_state = floor_state
F.icon_regular_floor = floor_state
F.dir = floor_dir
@@ -60,7 +60,7 @@
Choose Direction
Direction: [dir2text(floor_dir)]
"}
-
+
var/datum/browser/popup = new(user, "floor_painter", name, 225, 300)
popup.set_content(dat)
popup.open()
@@ -68,7 +68,7 @@
/obj/item/device/floor_painter/Topic(href, href_list)
if(..())
return
-
+
if(href_list["choose_state"])
var/state = input("Please select a style", "[src]") as null|anything in allowed_states
if(state)
@@ -92,7 +92,7 @@
index = 1
floor_state = allowed_states[index]
floor_dir = SOUTH
-
+
floor_icon = icon('icons/turf/floors.dmi', floor_state, floor_dir)
if(usr)
attack_self(usr)
diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm
index eaf1c668e3c..6c0e4645cc9 100644
--- a/code/game/objects/items/devices/guitar.dm
+++ b/code/game/objects/items/devices/guitar.dm
@@ -17,18 +17,14 @@
song.instrumentExt = "ogg"
/obj/item/device/guitar/Destroy()
- qdel(song)
- song = null
+ QDEL_NULL(song)
return ..()
/obj/item/device/guitar/attack_self(mob/user as mob)
ui_interact(user)
/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(!user)
- return
-
- if(!isliving(user) || user.stat || user.restrained() || user.lying)
+ if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 172cee5ad94..ee49962cfe7 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -8,7 +8,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=500, MAT_GLASS=500)
- w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
+ w_class = WEIGHT_CLASS_SMALL //Increased to 2, because diodes are w_class 2. Conservation of matter.
origin_tech = "combat=1"
origin_tech = "magnets=2"
var/energy = 5
@@ -35,9 +35,7 @@
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/Destroy()
- if(diode)
- qdel(diode)
- diode = null
+ QDEL_NULL(diode)
return ..()
/obj/item/device/laser_pointer/upgraded/New()
@@ -128,8 +126,8 @@
to_chat(S, "Your sensors were overloaded by a laser! ")
outmsg = "You overload [S] by shining [src] at their sensors. "
- S.attack_log += text("\[[time_stamp()]\] Has had a laser pointer shone in their eyes by [user.name] ([user.ckey]) ")
- user.attack_log += text("\[[time_stamp()]\] Shone a laser pointer in the eyes of [S.name] ([S.ckey]) ")
+ S.create_attack_log("Has had a laser pointer shone in their eyes by [user.name] ([user.ckey]) ")
+ user.create_attack_log("Shone a laser pointer in the eyes of [S.name] ([S.ckey]) ")
log_attack("[user.name] ([user.ckey]) Shone a laser pointer in the eyes of [S.name] ([S.ckey]) ")
else
outmsg = "You fail to overload [S] by shining [src] at their sensors. "
@@ -142,7 +140,7 @@
outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera! "
log_admin("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer")
- user.attack_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer")
+ user.create_attack_log("[user.name] ([user.ckey]) EMPd a camera with a laser pointer")
else
outmsg = "You missed the lens of [C] with [src]. "
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 263f287a823..c59e39a2043 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -3,7 +3,7 @@
desc = "A device used to project your voice. Loudly."
icon_state = "megaphone"
item_state = "radio"
- w_class = 1
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
var/spamcheck = 0
@@ -12,24 +12,22 @@
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!")
/obj/item/device/megaphone/attack_self(mob/living/user as mob)
- if(user.client)
- if(user.client.prefs.muted & MUTE_IC)
- to_chat(src, "\red You cannot speak in IC (muted).")
- return
- if(!ishuman(user))
- to_chat(user, "\red You don't know how to use this!")
+ if(user.client && (user.client.prefs.muted & MUTE_IC))
+ to_chat(src, "You cannot speak in IC (muted). ")
return
- if(user.silent)
+ if(!ishuman(user))
+ to_chat(user, "You don't know how to use this! ")
+ return
+ if(!user.can_speak())
to_chat(user, "You find yourself unable to speak at all. ")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H && H.mind)
- if(H.mind.miming)
- to_chat(user, "Your vow of silence prevents you from speaking. ")
- return
+ if(H && H.mind && H.mind.miming)
+ to_chat(user, "Your vow of silence prevents you from speaking. ")
+ return
if(spamcheck)
- to_chat(user, "\red \The [src] needs to recharge!")
+ to_chat(user, "\The [src] needs to recharge! ")
return
var/message = input(user, "Shout a message:", "Megaphone") as text|null
@@ -39,28 +37,27 @@
if(!message)
return
message = capitalize(message)
- if((src.loc == user && usr.stat == 0))
+ if((loc == user && !user.incapacitated()))
if(emagged)
if(insults)
saymsg(user, pick(insultmsg))
insults--
else
- to_chat(user, "\red *BZZZZzzzzzt*")
+ to_chat(user, "*BZZZZzzzzzt* ")
else
saymsg(user, message)
spamcheck = 1
spawn(20)
spamcheck = 0
- return
/obj/item/device/megaphone/proc/saymsg(mob/living/user as mob, message)
- audible_message("[user] broadcasts, \"[message]\" ", hearing_distance = 14)
+ audible_message("[user] broadcasts, \"[message]\" ", hearing_distance = 14)
for(var/obj/O in oview(14, get_turf(src)))
- O.hear_talk(user, "[message] ")
+ O.hear_talk(user, "[message] ")
/obj/item/device/megaphone/emag_act(user as mob)
if(!emagged)
- to_chat(user, "\red You overload \the [src]'s voice synthesizer.")
+ to_chat(user, "You overload \the [src]'s voice synthesizer. ")
emagged = 1
insults = rand(1, 3)//to prevent dickflooding
diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm
deleted file mode 100644
index 52603b99a0b..00000000000
--- a/code/game/objects/items/devices/modkit.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-#define MODKIT_HELMET 1
-#define MODKIT_SUIT 2
-#define MODKIT_FULL 3
-
-/obj/item/device/modkit
- name = "hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user."
- icon_state = "modkit"
- var/parts = MODKIT_FULL
- var/target_species = "Human"
-
- var/list/permitted_types = list(
- /obj/item/clothing/head/helmet/space/rig,
- /obj/item/clothing/suit/space/rig
- )
-
-/obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity)
- if(!proximity)
- return
-
- if(!target_species)
- return //it shouldn't be null, okay?
-
- if(!parts)
- to_chat(user, "This kit has no parts for this modification left. ")
- user.unEquip(src)
- qdel(src)
- return
-
- var/allowed = 0
- for(var/permitted_type in permitted_types)
- if(istype(O, permitted_type))
- allowed = 1
-
- var/obj/item/clothing/I = O
- if(!istype(I) || !allowed)
- to_chat(user, "[src] is unable to modify that. ")
- return
-
- var/excluding = ("exclude" in I.species_restricted)
- var/in_list = (target_species in I.species_restricted)
- if(excluding ^ in_list)
- to_chat(user, "[I] is already modified. ")
- return
-
- if(!isturf(O.loc))
- to_chat(user, "[O] must be safely placed on the ground for modification. ")
- return
-
- playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1)
-
- user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].")
-
- I.refit_for_species(target_species)
-
- if(istype(I, /obj/item/clothing/head/helmet))
- parts &= ~MODKIT_HELMET
- if(istype(I, /obj/item/clothing/suit))
- parts &= ~MODKIT_SUIT
-
- if(!parts)
- user.unEquip(src)
- qdel(src)
-
-/obj/item/device/modkit/examine(mob/user)
- ..(user)
- to_chat(user, "It looks as though it modifies hardsuits to fit [target_species] users.")
-
-/obj/item/device/modkit/tajaran
- name = "Tajaran hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran."
- target_species = "Tajaran"
-
-/obj/item/device/modkit/unathi
- name = "Unathi hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Unathi."
- target_species = "Unathi"
-
-/obj/item/device/modkit/skrell
- name = "Skrell hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Skrell."
- target_species = "Skrell"
-
-/obj/item/device/modkit/vox
- name = "Vox hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Vox."
- target_species = "Vox"
\ No newline at end of file
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 742afb83c81..4483a920355 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -1,3 +1,7 @@
+#define PROXIMITY_NONE ""
+#define PROXIMITY_ON_SCREEN "_red"
+#define PROXIMITY_NEAR "_yellow"
+
/**
* Multitool -- A multitool is used for hacking electronic devices.
* TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
@@ -10,13 +14,15 @@
icon_state = "multitool"
flags = CONDUCT
force = 5.0
- w_class = 2
- throwforce = 5.0
- throw_range = 15
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 0
+ throw_range = 7
throw_speed = 3
- desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
materials = list(MAT_METAL=50, MAT_GLASS=20)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = "magnets=1;engineering=2"
+ toolspeed = 1
+ hitsound = 'sound/weapons/tap.ogg'
+ var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
var/obj/machinery/buffer // simple machine buffer for device linkage
/obj/item/device/multitool/proc/IsBufferA(var/typepath)
@@ -26,40 +32,79 @@
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
+/obj/item/device/multitool/Destroy()
+ buffer = null
+ return ..()
/obj/item/device/multitool/ai_detect
- var/track_delay = 0
+ var/track_cooldown = 0
+ var/track_delay = 10 //How often it checks for proximity
+ var/detect_state = PROXIMITY_NONE
+ var/rangealert = 8 //Glows red when inside
+ var/rangewarning = 20 //Glows yellow when inside
+ origin_tech = "magnets=1;engineering=2;syndicate=1"
/obj/item/device/multitool/ai_detect/New()
..()
processing_objects += src
-
/obj/item/device/multitool/ai_detect/Destroy()
processing_objects -= src
return ..()
/obj/item/device/multitool/ai_detect/process()
-
- if(track_delay > world.time)
+ if(track_cooldown > world.time)
return
+ detect_state = PROXIMITY_NONE
+ multitool_detect()
+ icon_state = "[initial(icon_state)][detect_state]"
+ track_cooldown = world.time + track_delay
- var/found_eye = 0
-
- for(var/mob/camera/aiEye/A in living_mob_list)
-
- var/turf/our_turf = get_turf(src)
- var/turf/eye_turf = get_turf(A)
-
- if(get_dist(our_turf, eye_turf) < 9)
- found_eye = 1
+/obj/item/device/multitool/ai_detect/proc/multitool_detect()
+ var/turf/our_turf = get_turf(src)
+ for(var/mob/living/silicon/ai/AI in ai_list)
+ if(AI.cameraFollow == src)
+ detect_state = PROXIMITY_ON_SCREEN
break
- if(found_eye)
- icon_state = "[initial(icon_state)]_red"
- else
- icon_state = initial(icon_state)
+ if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
+ var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
+ if(chunk)
+ if(chunk.seenby.len)
+ for(var/mob/camera/aiEye/A in chunk.seenby)
+ var/turf/detect_turf = get_turf(A)
+ if(get_dist(our_turf, detect_turf) < rangealert)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+ if(get_dist(our_turf, detect_turf) < rangewarning)
+ detect_state = PROXIMITY_NEAR
+ break
- track_delay = world.time + 10 // 1 second
- return
+/obj/item/device/multitool/ai_detect/admin
+ desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
+ track_delay = 5
+ shows_wire_information = TRUE
+/obj/item/device/multitool/ai_detect/admin/multitool_detect()
+ var/turf/our_turf = get_turf(src)
+ for(var/mob/J in urange(rangewarning,our_turf))
+ if(check_rights(R_ADMIN, 0, J))
+ detect_state = PROXIMITY_NEAR
+ var/turf/detect_turf = get_turf(J)
+ if(get_dist(our_turf, detect_turf) < rangealert)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+
+/obj/item/device/multitool/cyborg
+ name = "multitool"
+ desc = "Optimised and stripped-down version of a regular multitool."
+ toolspeed = 0.5
+
+/obj/item/device/multitool/abductor
+ name = "alien multitool"
+ desc = "An omni-technological interface."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "multitool"
+ toolspeed = 0.1
+ origin_tech = "magnets=5;engineering=5;abductor=3"
+ shows_wire_information = TRUE
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 68b0b8d2dca..1d42bf70108 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/aicards.dmi'
icon_state = "pai"
item_state = "electronic"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "programming=2"
var/request_cooldown = 5 // five seconds
@@ -11,11 +11,16 @@
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
+ var/list/faction = list("neutral") // The factions the pAI will inherit from the card
+
+/obj/item/device/paicard/syndicate
+ name = "syndicate personal AI device"
+ faction = list("syndicate")
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
return
- var/obj/item/weapon/rig/rig = src.get_rig()
+ var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig))
rig.forced_move(direction, user)
@@ -26,11 +31,8 @@
/obj/item/device/paicard/Destroy()
if(pai)
pai.ghostize()
- qdel(pai)
- pai = null
- if(radio)
- qdel(radio)
- radio = null
+ QDEL_NULL(pai)
+ QDEL_NULL(radio)
return ..()
/obj/item/device/paicard/attack_self(mob/user)
@@ -257,10 +259,10 @@
var/delta = (world.time / 10) - last_request
if(request_cooldown > delta)
var/cooldown_time = round(request_cooldown - ((world.time / 10) - last_request), 1)
- to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.")
+ to_chat(usr, "The request system is currently offline. Please wait another [cooldown_time] seconds. ")
return
last_request = world.time / 10
- src.looking_for_personality = 1
+ looking_for_personality = 1
paiController.findPAI(src, usr)
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
@@ -297,35 +299,35 @@
// WIRE_TRANSMIT = 4
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
- src.pai = personality
- src.overlays += "pai-happy"
+ pai = personality
+ overlays += "pai-happy"
/obj/item/device/paicard/proc/removePersonality()
- src.pai = null
- src.overlays.Cut()
- src.overlays += "pai-off"
+ pai = null
+ overlays.Cut()
+ overlays += "pai-off"
/obj/item/device/paicard
var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
- src.overlays.Cut()
+ overlays.Cut()
switch(emotion)
- if(1) src.overlays += "pai-happy"
- if(2) src.overlays += "pai-cat"
- if(3) src.overlays += "pai-extremely-happy"
- if(4) src.overlays += "pai-face"
- if(5) src.overlays += "pai-laugh"
- if(6) src.overlays += "pai-off"
- if(7) src.overlays += "pai-sad"
- if(8) src.overlays += "pai-angry"
- if(9) src.overlays += "pai-what"
+ if(1) overlays += "pai-happy"
+ if(2) overlays += "pai-cat"
+ if(3) overlays += "pai-extremely-happy"
+ if(4) overlays += "pai-face"
+ if(5) overlays += "pai-laugh"
+ if(6) overlays += "pai-off"
+ if(7) overlays += "pai-sad"
+ if(8) overlays += "pai-angry"
+ if(9) overlays += "pai-what"
current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
- var/turf/T = get_turf_or_move(src.loc)
+ var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
- M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2)
+ M.show_message("[src] flashes a message across its screen, \"Additional personalities available for download.\" ", 3, "[src] bleeps electronically. ", 2)
/obj/item/device/paicard/emp_act(severity)
for(var/mob/M in src)
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index 836da188bba..093d7481c51 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -63,7 +63,7 @@
var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires
if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
return
- playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
+ playsound(src, I.usesound, 50, 1, 1)
user.visible_message("[user] cuts the [chosen_wire] wire! ", "You cut the [chosen_wire] wire! ")
sleep(5)
if(chosen_wire == correct_wire)
@@ -84,8 +84,8 @@
to_chat(user, "You can't see the box well enough to cut the wires out. ")
return
user.visible_message("[user] starts removing the payload and wires from \the [src]. ")
- if(do_after(user, 40, target = src))
- playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
+ if(do_after(user, 40 * I.toolspeed, target = src))
+ playsound(src, I.usesound, 50, 1, 1)
user.unEquip(src)
user.visible_message("[user] removes the insides of \the [src]! ")
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(src.loc)
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 25e975fa920..7c81ca0e6e9 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -5,7 +5,7 @@
desc = "A nulling power sink which drains energy from electrical systems."
icon_state = "powersink0"
item_state = "electronic"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
throwforce = 5
throw_speed = 1
@@ -13,7 +13,7 @@
materials = list(MAT_METAL=750)
origin_tech = "powerstorage=3;syndicate=5"
var/drain_rate = 1600000 // amount of power to drain per tick
- var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts.
+ var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts.
var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts.
var/power_drained = 0 // Amount of power drained.
var/max_power = 1e10 // Detonation point.
@@ -27,6 +27,8 @@
/obj/item/device/powersink/Destroy()
processing_objects.Remove(src)
processing_power_items.Remove(src)
+ PN = null
+ attached = null
return ..()
/obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user)
@@ -110,10 +112,10 @@
if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = T.master
if(A.operating && A.cell)
- var/cur_charge = A.cell.charge / CELLRATE
- var/drain_val = min(apc_drain_rate, cur_charge)
- A.cell.use(drain_val * CELLRATE)
- drained += drain_val
+ A.cell.charge = max(0, A.cell.charge - apc_drain_rate)
+ drained += apc_drain_rate
+ if(A.charging == 2) // If the cell was full
+ A.charging = 1 // It's no longer full
power_drained += drained
return 1
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 5dc67b15478..55f42587104 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -21,7 +21,7 @@
if(!emagged)
emagged = 1
syndicate = 1
- to_chat(user, "\blue The This beacon now only be locked on to by emagged teleporters!")
+ to_chat(user, "The This beacon now only be locked on to by emagged teleporters! ")
/obj/item/device/radio/beacon/hear_talk()
return
@@ -58,7 +58,7 @@
/obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob)
if(user)
- to_chat(user, "\blue Locked In")
+ to_chat(user, "Locked In ")
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
@@ -71,7 +71,7 @@
/obj/item/device/radio/beacon/syndicate/bomb/attack_self(mob/user as mob)
if(user)
- to_chat(user, "\blue Locked In")
+ to_chat(user, "Locked In ")
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 35848bdc087..7c01d03ca36 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -6,7 +6,7 @@
frequency = 1449
flags = CONDUCT
slot_flags = SLOT_BACK
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
var/code = 2
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 7350f3965cc..a31e09e896c 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
item_state = ""
+ w_class = WEIGHT_CLASS_TINY
var/translate_binary = 0
var/translate_hive = 0
var/syndie = 0
@@ -147,4 +148,4 @@
name = "AI Integrated Encryption Key"
desc = "Integrated encryption key"
icon_state = "cap_cypherkey"
- channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
\ No newline at end of file
+ channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index ecb1c38d9d7..9fd1e40b4f7 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -32,12 +32,8 @@
recalculateChannels(1)
/obj/item/device/radio/headset/Destroy()
- if(keyslot1)
- qdel(keyslot1)
- if(keyslot2)
- qdel(keyslot2)
- keyslot1 = null
- keyslot2 = null
+ QDEL_NULL(keyslot1)
+ QDEL_NULL(keyslot2)
return ..()
/obj/item/device/radio/headset/list_channels(var/mob/user)
@@ -64,17 +60,15 @@
return ..()
-/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
- if(aiOverride)
- return ..(freq, level)
+/obj/item/device/radio/headset/is_listening()
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.l_ear == src || H.r_ear == src)
- return ..(freq, level)
- else if(isanimal(loc))
- // frankly, all the ones with inventory are small enough to not warrant snowflaking the slot check somehow
- return ..(freq, level)
- return -1
+ return ..()
+ else if(isanimal(loc) || isAI(loc))
+ return ..()
+
+ return FALSE
/obj/item/device/radio/headset/alt
name = "bowman headset"
@@ -304,10 +298,10 @@
var/myAi = null // Atlantis: Reference back to the AI which has this radio.
var/disabledAi = 0 // Atlantis: Used to manually disable AI's integrated radio via intellicard menu.
-/obj/item/device/radio/headset/heads/ai_integrated/receive_range(freq, level)
+/obj/item/device/radio/headset/heads/ai_integrated/is_listening()
if(disabledAi)
- return -1 //Transciever Disabled.
- return ..(freq, level, 1)
+ return FALSE
+ return ..()
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.set_machine(src)
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 502a5da02b3..4cf20378443 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -3,7 +3,7 @@
desc = "Talk through this."
icon_state = "intercom"
anchored = 1
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
canhear_range = 2
flags = CONDUCT
var/number = 0
@@ -120,15 +120,13 @@
attack_self(user)
/obj/item/device/radio/intercom/receive_range(freq, level)
- if(!on)
+ if(!is_listening())
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
// TODO: Integrate radio with the space manager
if(isnull(position) || !(position.z in level))
return -1
- if(!src.listening)
- return -1
if(freq in ANTAG_FREQS)
if(!(src.syndie))
return -1//Prevents broadcast of messages over devices lacking the encryption
@@ -140,8 +138,8 @@
if(3)
if(iswirecutter(W) && b_stat && wires.IsAllCut())
to_chat(user, "You cut out the intercoms wiring and disconnect its electronics. ")
- playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
if(buildstage != 3)
return
new /obj/item/stack/cable_coil(get_turf(src),5)
@@ -154,8 +152,8 @@
else return ..()
if(2)
if(isscrewdriver(W))
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
update_icon()
on = 1
b_stat = 0
@@ -172,15 +170,15 @@
if(coil.amount < 5)
to_chat(user, "You need more cable for this! ")
return
- if(do_after(user, 10, target = src))
+ if(do_after(user, 10 * coil.toolspeed, target = src))
coil.use(5)
to_chat(user, "You wire \the [src]! ")
buildstage = 2
return 1
if(iscrowbar(W))
to_chat(user, "You begin removing the electronics... ")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
if(buildstage != 1)
return
new /obj/item/weapon/intercom_electronics(get_turf(src))
@@ -189,19 +187,19 @@
return 1
if(0)
if(istype(W,/obj/item/weapon/intercom_electronics))
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
qdel(W)
to_chat(user, "You insert \the [W] into \the [src]! ")
buildstage = 1
return 1
if(iswelder(W))
var/obj/item/weapon/weldingtool/WT=W
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
if(!WT.remove_fuel(3, user))
to_chat(user, "You're out of welding fuel. ")
return 1
- if(do_after(user, 10, target = src))
+ if(do_after(user, 10 * WT.toolspeed, target = src))
to_chat(user, "You cut the intercom frame from the wall! ")
new /obj/item/mounted/frame/intercom(get_turf(src))
qdel(src)
@@ -233,8 +231,10 @@
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "Looks like a circuit. Probably is."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/device/radio/intercom/locked
var/locked_frequency
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index f4f95559ad9..d324de69231 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -30,7 +30,6 @@ var/global/list/default_medbay_channels = list(
var/frequency = PUB_FREQ //common chat
var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies
var/canhear_range = 3 // the range which mobs can hear this radio from
- var/obj/item/device/radio/patch_link = null
var/datum/wires/radio/wires = null
var/b_stat = 0
var/broadcasting = 0
@@ -45,7 +44,7 @@ var/global/list/default_medbay_channels = list(
slot_flags = SLOT_BELT
throw_speed = 2
throw_range = 9
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=75)
@@ -54,32 +53,31 @@ var/global/list/default_medbay_channels = list(
var/list/internal_channels
-/obj/item/device/radio
var/datum/radio_frequency/radio_connection
var/list/datum/radio_frequency/secure_radio_connections = new
- proc/set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
+
+/obj/item/device/radio/proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
/obj/item/device/radio/New()
..()
wires = new(src)
- if(radio_controller)
- initialize()
internal_channels = default_internal_channels.Copy()
+ global_radios |= src
/obj/item/device/radio/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
if(radio_controller)
radio_controller.remove_object(src, frequency)
for(var/ch_name in channels)
radio_controller.remove_object(src, radiochannels[ch_name])
- patch_link = null
+ global_radios -= src
+ follow_target = null
return ..()
@@ -92,7 +90,7 @@ var/global/list/default_medbay_channels = list(
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
/obj/item/device/radio/attack_ghost(mob/user)
- return ui_interact(user)
+ return interact(user)
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
@@ -178,11 +176,6 @@ var/global/list/default_medbay_channels = list(
/mob/dead/observer/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
return can_admin_interact()
-/obj/item/device/radio/proc/text_wires()
- if(b_stat)
- return wires.GetInteractWindow()
- return
-
/obj/item/device/radio/proc/ToggleBroadcast()
broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
@@ -240,7 +233,6 @@ var/global/list/default_medbay_channels = list(
var/datum/radio_frequency/connection = null
if(channel && channels && channels.len > 0)
if(channel == "department")
-// to_chat(world, "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"")
channel = channels[1]
connection = secure_radio_connections[channel]
else
@@ -257,9 +249,8 @@ var/global/list/default_medbay_channels = list(
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
- 4, 0, zlevel, connection.frequency, follow_target=follow_target)
+ 4, 0, zlevel, connection.frequency, follow_target = follow_target)
qdel(A)
- return
// Just a dummy mob used for making announcements, so we don't create AIs to do this
// I'm not sure who thought that was a good idea. -- Crazylemon
@@ -276,7 +267,8 @@ var/global/list/default_medbay_channels = list(
/mob/living/automatedannouncer/Destroy()
if(lifetime_timer)
deltimer(lifetime_timer)
- ..()
+ lifetime_timer = null
+ return ..()
/mob/living/automatedannouncer/proc/autocleanup()
log_runtime(EXCEPTION("An announcer somehow managed to outlive the radio! Deleting!"), src, list("Message: '[message]'"))
@@ -320,7 +312,7 @@ var/global/list/default_medbay_channels = list(
actually transmit large mass. Headsets are the only radio devices capable
of sending subspace transmissions to the Communications Satellite.
- A headset sends a signal to a subspace listener/reciever elsewhere in space,
+ A headset sends a signal to a subspace listener/receiver elsewhere in space,
the signal gets processed and logged, and an audible transmission gets sent
to each individual headset.
*/
@@ -401,6 +393,7 @@ var/global/list/default_medbay_channels = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
+ "race" = signal.get_race(M),
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
@@ -462,6 +455,7 @@ var/global/list/default_medbay_channels = list(
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
+ "race" = signal.get_race(M), // text to show next to mob in comms log console
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
@@ -532,19 +526,15 @@ var/global/list/default_medbay_channels = list(
// what the range is in which mobs will hear the radio
// returns: -1 if can't receive, range otherwise
- if(!wires || wires.IsIndexCut(WIRE_RECEIVE))
- return -1
- if(!listening)
+ if(!is_listening())
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
if(!position || !(position.z in level))
return -1
if(freq in ANTAG_FREQS)
- if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
+ if(!(syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
return -1
- if(!on)
- return -1
if(!freq) //recieved on main frequency
if(!listening)
return -1
@@ -561,19 +551,34 @@ var/global/list/default_medbay_channels = list(
return canhear_range
/obj/item/device/radio/proc/send_hear(freq, level)
-
var/range = receive_range(freq, level)
if(range > -1)
return get_mobs_in_view(canhear_range, src)
+/obj/item/device/radio/proc/is_listening()
+ var/is_listening = TRUE
+ if(!on)
+ is_listening = FALSE
+ if(!wires || wires.IsIndexCut(WIRE_RECEIVE))
+ is_listening = FALSE
+ if(!listening)
+ is_listening = FALSE
+
+ return is_listening
+
+/obj/item/device/radio/proc/send_announcement()
+ if(is_listening())
+ return get_mobs_in_view(canhear_range, src)
+
+ return null
/obj/item/device/radio/examine(mob/user, var/distance = -1)
. = ..(user, distance)
if((in_range(src, user) || loc == user))
if(b_stat)
- user.show_message("\blue \the [src] can be attached and modified!")
+ user.show_message("\the [src] can be attached and modified! ")
else
- user.show_message("\blue \the [src] can not be modified or attached!")
+ user.show_message("\the [src] can not be modified or attached! ")
return .
/obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
@@ -584,9 +589,9 @@ var/global/list/default_medbay_channels = list(
b_stat = !( b_stat )
if(!istype(src, /obj/item/device/radio/beacon))
if(b_stat)
- user.show_message("\blue The radio can now be attached and modified!")
+ user.show_message("The radio can now be attached and modified! ")
else
- user.show_message("\blue The radio can no longer be modified or attached!")
+ user.show_message("The radio can no longer be modified or attached! ")
updateDialog()
//Foreach goto(83)
add_fingerprint(user)
@@ -594,12 +599,20 @@ var/global/list/default_medbay_channels = list(
else return
/obj/item/device/radio/emp_act(severity)
+ frequency = get_random_freq()
+ if(listening == 1)
+ visible_message("\The [src] screeches violently! ")
+
broadcasting = 0
listening = 0
for(var/ch_name in channels)
channels[ch_name] = 0
..()
+/obj/item/device/radio/proc/get_random_freq()
+ var/rand_freq = round(rand(1440, 1480), 10) + pick(1, 3, 5, 9)
+ return rand_freq
+
///////////////////////////////
//////////Borg Radios//////////
///////////////////////////////
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 9a9edbb62ad..a1112493b01 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -14,7 +14,7 @@ REAGENT SCANNER
icon_state = "t-ray0"
var/on = 0
slot_flags = SLOT_BELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
materials = list(MAT_METAL=150)
origin_tech = "magnets=1;engineering=1"
@@ -117,7 +117,7 @@ REAGENT SCANNER
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 5
throw_range = 10
materials = list(MAT_METAL=200)
@@ -128,24 +128,24 @@ REAGENT SCANNER
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
- to_chat(user, text("\red You try to analyze the floor's vitals!"))
+ to_chat(user, text("You try to analyze the floor's vitals! "))
for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
- user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1)
- user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1)
- user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
- user.show_message("\blue Body Temperature: ???", 1)
+ O.show_message(text("[user] has analyzed the floor's vitals! "), 1)
+ user.show_message(text("Analyzing Results for The floor:\n\t Overall Status: Healthy "), 1)
+ user.show_message(text("\t Damage Specifics: [0]-[0]-[0]-[0] "), 1)
+ user.show_message("Key: Suffocation/Toxin/Burns/Brute ", 1)
+ user.show_message("Body Temperature: ??? ", 1)
return
user.visible_message("[user] has analyzed [M]'s vitals. "," You have analyzed [M]'s vitals. ")
if(!istype(M,/mob/living/carbon/human) || M.isSynthetic())
//these sensors are designed for organic life
- user.show_message("\blue Analyzing Results for ERROR:\n\t Overall Status: ERROR")
+ user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR ")
user.show_message("\t Key: Suffocation /Toxin /Burns /Brute ", 1)
user.show_message("\t Damage Specifics: ? - ? - ? - ? ")
- user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
- user.show_message("\red Warning: Blood Level ERROR: --% --cl.\blue Type: ERROR")
- user.show_message("\blue Subject's pulse: -- bpm. ")
+ user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F) ", 1)
+ user.show_message("Warning: Blood Level ERROR: --% --cl. Type: ERROR ")
+ user.show_message("Subject's pulse: -- bpm. ")
return
var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss())))
@@ -155,34 +155,34 @@ REAGENT SCANNER
var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()] " : M.getBruteLoss()
if(M.status_flags & FAKEDEATH)
OX = fake_oxy > 50 ? "[fake_oxy] " : fake_oxy
- user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: dead")
+ user.show_message("Analyzing Results for [M]:\n\t Overall Status: dead ")
else
- user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"]")
+ user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"] ")
user.show_message("\t Key: Suffocation /Toxin /Burns /Brute ", 1)
user.show_message("\t Damage Specifics: [OX] - [TX] - [BU] - [BR] ")
- user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
+ user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F) ", 1)
if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
- user.show_message("\blue Time of Death: [worldtime2text(M.timeofdeath)]")
+ user.show_message("Time of Death: [worldtime2text(M.timeofdeath)] ")
if(istype(M, /mob/living/carbon/human) && mode == 1)
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("\blue Localized Damage, Brute/Burn:",1)
+ user.show_message("Localized Damage, Brute/Burn: ",1)
if(length(damaged)>0)
for(var/obj/item/organ/external/org in damaged)
- user.show_message(text("\blue \t []: [][]\blue - []", \
+ user.show_message(text("\t []: [][] - [] ", \
capitalize(org.name), \
- (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
+ (org.brute_dam > 0) ? "[org.brute_dam] " :0, \
(org.status & ORGAN_BLEEDING)?"\[Bleeding\] ":"\t", \
(org.burn_dam > 0) ? "[org.burn_dam] " :0),1)
else
- user.show_message("\blue \t Limbs are OK.",1)
+ user.show_message("\t Limbs are OK. ",1)
OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected " : "Subject bloodstream oxygen level normal"
TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected " : "Subject bloodstream toxin level minimal"
BU = M.getFireLoss() > 50 ? "Severe burn damage detected " : "Subject burn injury status O.K"
BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected " : "Subject brute-force injury status O.K"
if(M.status_flags & FAKEDEATH)
- OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal"
+ OX = fake_oxy > 50 ? "Severe oxygen deprivation detected " : "Subject bloodstream oxygen level normal "
user.show_message("[OX] | [TX] | [BU] | [BR]")
if(istype(M, /mob/living/carbon))
if(upgraded)
@@ -195,36 +195,36 @@ REAGENT SCANNER
if(M.getCloneLoss())
user.show_message("Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage. ")
if(M.has_brain_worms())
- user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.")
+ user.show_message("Subject suffering from aberrant brain activity. Recommend further scanning. ")
else if(M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain))
- user.show_message("\red Subject is brain dead.")
+ user.show_message("Subject is brain dead. ")
else if(M.getBrainLoss() >= 60)
- user.show_message("\red Severe brain damage detected. Subject likely to have mental retardation.")
+ user.show_message("Severe brain damage detected. Subject likely to have mental retardation. ")
else if(M.getBrainLoss() >= 10)
- user.show_message("\red Significant brain damage detected. Subject may have had a concussion.")
+ user.show_message("Significant brain damage detected. Subject may have had a concussion. ")
if(ishuman(M))
var/mob/living/carbon/human/H = M
- for(var/name in H.organs_by_name)
- var/obj/item/organ/external/e = H.organs_by_name[name]
+ for(var/name in H.bodyparts_by_name)
+ var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(!e)
continue
var/limb = e.name
if(e.status & ORGAN_BROKEN)
if((e.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")) && !(e.status & ORGAN_SPLINTED))
- user.show_message("\red Unsecured fracture in subject [limb]. Splinting recommended for transport.")
+ user.show_message("Unsecured fracture in subject [limb]. Splinting recommended for transport. ")
if(e.has_infected_wound())
- user.show_message("\red Infected wound detected in subject [limb]. Disinfection recommended.")
+ user.show_message("Infected wound detected in subject [limb]. Disinfection recommended. ")
- for(var/name in H.organs_by_name)
- var/obj/item/organ/external/e = H.organs_by_name[name]
+ for(var/name in H.bodyparts_by_name)
+ var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(!e)
continue
if(e.status & ORGAN_BROKEN)
- user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
+ user.show_message(text("Bone fractures detected. Advanced scanner required for location. "), 1)
break
- for(var/obj/item/organ/external/e in H.organs)
+ for(var/obj/item/organ/external/e in H.bodyparts)
for(var/datum/wound/W in e.wounds) if(W.internal)
- user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1)
+ user.show_message(text("Internal bleeding detected. Advanced scanner required for location. "), 1)
break
if(H.vessel)
var/blood_type = H.get_blood_name()
@@ -232,17 +232,17 @@ REAGENT SCANNER
var/blood_percent = blood_volume / BLOOD_VOLUME_NORMAL
blood_percent *= 100
if(blood_volume <= 500)
- user.show_message("\red Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl")
+ user.show_message("Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl ")
else if(blood_volume <= 336)
- user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl")
+ user.show_message("Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl ")
else
- user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl")
+ user.show_message("Blood Level Normal: [blood_percent]% [blood_volume]cl ")
if(H.species.exotic_blood)
user.show_message("Subject possesses exotic blood. ")
user.show_message("Exotic blood type: [blood_type]. ")
- if(H.heart_attack && H.stat != DEAD)
+ if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
user.show_message("Subject suffering from heart attack: Apply defibrillator immediately. ")
- user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm. ")
+ user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm. ")
var/implant_detect
for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs)
if(CI.status == ORGAN_ROBOT)
@@ -253,7 +253,7 @@ REAGENT SCANNER
if(H.gene_stability < 40)
user.show_message("Subject's genes are quickly breaking down! ")
else if(H.gene_stability < 70)
- user.show_message("Subject's genes are showing signs of spontenous breakdown. ")
+ user.show_message("Subject's genes are showing signs of spontaneous breakdown. ")
else if(H.gene_stability < 85)
user.show_message("Subject's genes are showing minor signs of instability. ")
else
@@ -279,7 +279,7 @@ REAGENT SCANNER
else
to_chat(user, "You install the upgrade in the [src]. ")
overlays += "advanced"
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
upgraded = 1
qdel(W)
@@ -294,15 +294,16 @@ REAGENT SCANNER
name = "Health Analyzer Upgrade"
icon_state = "healthupgrade"
desc = "An upgrade unit that can be installed on a health analyzer for expanded functionality."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "magnets=2;biotech=2"
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/device/analyzer
desc = "A hand-held environmental scanner which reports current gas levels."
name = "analyzer"
icon_state = "atmos"
item_state = "analyzer"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 0
@@ -368,7 +369,7 @@ REAGENT SCANNER
name = "mass-spectrometer"
icon_state = "spectrometer"
item_state = "analyzer"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT | OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 5
@@ -378,6 +379,9 @@ REAGENT SCANNER
origin_tech = "magnets=2;biotech=2"
var/details = 0
var/recent_fail = 0
+ var/datatoprint = ""
+ var/scanning = 1
+ actions_types = list(/datum/action/item_action/print_report)
/obj/item/device/mass_spectrometer/New()
..()
@@ -408,13 +412,13 @@ REAGENT SCANNER
else
blood_traces = params2list(R.data["trace_chem"])
break
- var/dat = "Trace Chemicals Found: "
+ var/dat = ""
for(var/R in blood_traces)
if(prob(reliability))
if(details)
dat += "[R] ([blood_traces[R]] units) "
else
- dat += "[R] "
+ dat += "[R] "
recent_fail = 0
else
if(recent_fail)
@@ -423,8 +427,14 @@ REAGENT SCANNER
return
else
recent_fail = 1
- to_chat(user, "[dat]")
- reagents.clear_reagents()
+ if(dat)
+ to_chat(user, "Trace chemicals detected in blood sample: [dat]")
+ datatoprint = dat
+ scanning = 0
+ reagents.clear_reagents()
+ else
+ reagents.clear_reagents()
+ to_chat(user, "No trace chemicals detected in blood sample. ")
return
/obj/item/device/mass_spectrometer/adv
@@ -433,12 +443,34 @@ REAGENT SCANNER
details = 1
origin_tech = "magnets=4;biotech=2"
+/obj/item/device/mass_spectrometer/proc/print_report()
+ if(!scanning)
+ usr.visible_message("[src] rattles and prints out a sheet of paper. ")
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
+ sleep(50)
+
+ var/obj/item/weapon/paper/P = new(get_turf(src))
+ P.name = "Mass Spectrometer Scanner Report: [worldtime2text()]"
+ P.info = " Mass Spectrometer Data Analysis: Trace chemicals detected: [datatoprint] "
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.put_in_hands(P)
+ to_chat(M, "Report printed. Log cleared.")
+ datatoprint = ""
+ scanning = 1
+ else
+ to_chat(usr, "[src] has no logs or is already in use. ")
+
+/obj/item/device/mass_spectrometer/ui_action_click()
+ print_report()
+
/obj/item/device/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents."
icon_state = "spectrometer"
item_state = "analyzer"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 5
@@ -448,6 +480,9 @@ REAGENT SCANNER
origin_tech = "magnets=2;biotech=2"
var/details = 0
var/recent_fail = 0
+ var/datatoprint = ""
+ var/scanning = 1
+ actions_types = list(/datum/action/item_action/print_report)
/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob)
if(user.stat)
@@ -460,7 +495,6 @@ REAGENT SCANNER
if(crit_fail)
to_chat(user, "This device has critically failed and is no longer functional! ")
return
-
if(!isnull(O.reagents))
var/dat = ""
if(O.reagents.reagent_list.len > 0)
@@ -477,11 +511,12 @@ REAGENT SCANNER
recent_fail = 1
if(dat)
to_chat(user, "Chemicals found: [dat] ")
+ datatoprint = dat
+ scanning = 0
else
to_chat(user, "No active chemical agents found in [O]. ")
else
to_chat(user, "No significant chemical agents found in [O]. ")
-
return
/obj/item/device/reagent_scanner/adv
@@ -490,12 +525,34 @@ REAGENT SCANNER
details = 1
origin_tech = "magnets=4;biotech=2"
+/obj/item/device/reagent_scanner/proc/print_report()
+ if(!scanning)
+ usr.visible_message("[src] rattles and prints out a sheet of paper. ")
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
+ sleep(50)
+
+ var/obj/item/weapon/paper/P = new(get_turf(src))
+ P.name = "Reagent Scanner Report: [worldtime2text()]"
+ P.info = "Reagent Scanner Data Analysis: Chemical agents detected: [datatoprint] "
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.put_in_hands(P)
+ to_chat(M, "Report printed. Log cleared.")
+ datatoprint = ""
+ scanning = 1
+ else
+ to_chat(usr, "[src] has no logs or is already in use. ")
+
+/obj/item/device/reagent_scanner/ui_action_click()
+ print_report()
+
/obj/item/device/slime_scanner
name = "slime scanner"
icon_state = "adv_spectrometer_s"
item_state = "analyzer"
origin_tech = "biotech=1"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
throwforce = 0
throw_speed = 3
@@ -530,5 +587,5 @@ REAGENT SCANNER
user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1)
user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
if(T.cores > 1)
- user.show_message("Anomalious slime core amount detected", 1)
+ user.show_message("Anomalous slime core amount detected", 1)
user.show_message("Growth progress: [T.amount_grown]/10", 1)
diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm
index e1dd31b79be..b063682f770 100644
--- a/code/game/objects/items/devices/sensor_device.dm
+++ b/code/game/objects/items/devices/sensor_device.dm
@@ -3,7 +3,7 @@
desc = "A miniature machine that tracks suit sensors across the station."
icon = 'icons/obj/device.dmi'
icon_state = "scanner"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "biotech=3;materials=3;magnets=3"
var/datum/nano_module/crew_monitor/crew_monitor
@@ -12,12 +12,11 @@
crew_monitor = new(src)
/obj/item/device/sensor_device/Destroy()
- qdel(crew_monitor)
- crew_monitor = null
+ QDEL_NULL(crew_monitor)
return ..()
/obj/item/device/sensor_device/attack_self(mob/user as mob)
ui_interact(user)
/obj/item/device/sensor_device/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- crew_monitor.ui_interact(user, ui_key, ui, force_open)
\ No newline at end of file
+ crew_monitor.ui_interact(user, ui_key, ui, force_open)
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index d804c874e1a..9f773c0d402 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -3,7 +3,7 @@
desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
icon_state = "taperecorder_empty"
item_state = "analyzer"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
materials = list(MAT_METAL=60, MAT_GLASS=30)
force = 2
@@ -21,9 +21,7 @@
update_icon()
/obj/item/device/taperecorder/Destroy()
- if(mytape)
- qdel(mytape)
- mytape = null
+ QDEL_NULL(mytape)
return ..()
/obj/item/device/taperecorder/examine(mob/user)
@@ -157,8 +155,7 @@
return
else if(playing)
playing = 0
- var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder : Playback stopped. ")
+ atom_say("Playback stopped.")
update_icon()
@@ -187,19 +184,18 @@
break
if(mytape.storedinfo.len < i)
break
- var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder : [mytape.storedinfo[i]] ")
+ atom_say("[mytape.storedinfo[i]]")
if(mytape.storedinfo.len < i + 1)
playsleepseconds = 1
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder : End of recording. ")
+ atom_say("End of recording.")
else
playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
if(playsleepseconds > 14)
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder : Skipping [playsleepseconds] seconds of silence ")
+ atom_say("Skipping [playsleepseconds] seconds of silence.")
playsleepseconds = 1
i++
@@ -231,7 +227,7 @@
return
to_chat(usr, "Transcript printed. ")
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
var/t1 = "Transcript: "
for(var/i = 1, mytape.storedinfo.len >= i, i++)
@@ -253,7 +249,7 @@
desc = "A magnetic tape that can hold up to ten minutes of content."
icon_state = "tape_white"
item_state = "analyzer"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=20, MAT_GLASS=5)
force = 1
throwforce = 0
@@ -303,7 +299,7 @@
/obj/item/device/tape/attackby(obj/item/I, mob/user)
if(ruined && istype(I, /obj/item/weapon/screwdriver))
to_chat(user, "You start winding the tape back in. ")
- if(do_after(user, 120, target = src))
+ if(do_after(user, 120 * I.toolspeed, target = src))
to_chat(user, "You wound the tape back in! ")
fix()
else if(istype(I, /obj/item/weapon/pen))
@@ -316,4 +312,4 @@
//Random colour tapes
/obj/item/device/tape/random/New()
- icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
\ No newline at end of file
+ icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 0b38b3f9e18..5f140f05d03 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -19,7 +19,7 @@ effective or pretty fucking useless.
desc = "A strange device with twin antennas."
icon_state = "batterer"
throwforce = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 4
throw_range = 10
flags = CONDUCT
@@ -79,7 +79,7 @@ effective or pretty fucking useless.
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=400)
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index f126910bcbb..9c293bd6073 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -2,94 +2,93 @@
icon = 'icons/obj/assemblies.dmi'
name = "tank transfer valve"
icon_state = "valve_1"
+ item_state = "ttv"
desc = "Regulates the transfer of air between two tanks"
- var/obj/item/weapon/tank/tank_one
- var/obj/item/weapon/tank/tank_two
- var/obj/item/device/attached_device
- var/mob/attacher = null
+ var/obj/item/weapon/tank/tank_one = null
+ var/obj/item/weapon/tank/tank_two = null
+ var/obj/item/device/assembly/attached_device = null
+ var/mob/living/attacher = null
var/valve_open = 0
var/toggle = 1
origin_tech = "materials=1;engineering=1"
/obj/item/device/transfer_valve/Destroy()
- if(tank_one)
- qdel(tank_one)
- tank_one = null
- if(tank_two)
- qdel(tank_two)
- tank_two = null
- if(attached_device)
- qdel(attached_device)
- attached_device = null
+ QDEL_NULL(tank_one)
+ QDEL_NULL(tank_two)
+ QDEL_NULL(attached_device)
+ attacher = null
return ..()
-/obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D)
-
/obj/item/device/transfer_valve/IsAssemblyHolder()
return 1
-/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params)
- if(istype(item, /obj/item/weapon/tank))
+/obj/item/device/transfer_valve/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/tank))
if(tank_one && tank_two)
to_chat(user, "There are already two tanks attached, remove one first. ")
return
if(!tank_one)
- tank_one = item
- user.drop_item()
- item.loc = src
+ if(!user.unEquip(I))
+ return
+ tank_one = I
+ I.forceMove(src)
to_chat(user, "You attach the tank to the transfer valve. ")
+ if(I.w_class > w_class)
+ w_class = I.w_class
else if(!tank_two)
- tank_two = item
- user.drop_item()
- item.loc = src
+ if(!user.unEquip(I))
+ return
+ tank_two = I
+ I.forceMove(src)
to_chat(user, "You attach the tank to the transfer valve. ")
+ if(I.w_class > w_class)
+ w_class = I.w_class
update_icon()
nanomanager.update_uis(src) // update all UIs attached to src
//TODO: Have this take an assemblyholder
- else if(isassembly(item))
- var/obj/item/device/assembly/A = item
+ else if(isassembly(I))
+ var/obj/item/device/assembly/A = I
if(A.secured)
to_chat(user, "The device is secured. ")
return
if(attached_device)
to_chat(user, "There is already a device attached to the valve, remove it first. ")
return
- user.remove_from_mob(item)
+ user.remove_from_mob(A)
attached_device = A
- A.loc = src
- to_chat(user, "You attach the [item] to the valve controls and secure it. ")
+ A.forceMove(src)
+ to_chat(user, "You attach the [A] to the valve controls and secure it. ")
A.holder = src
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
- bombers += "[key_name(user)] attached a [item] to a transfer valve."
- msg_admin_attack("[key_name_admin(user)]attached [item] to a transfer valve.")
- log_game("[key_name_admin(user)] attached [item] to a transfer valve.")
+ bombers += "[key_name(user)] attached a [A] to a transfer valve."
+ msg_admin_attack("[key_name_admin(user)]attached [A] to a transfer valve.")
+ log_game("[key_name_admin(user)] attached [A] to a transfer valve.")
attacher = user
nanomanager.update_uis(src) // update all UIs attached to src
- return
-/obj/item/device/transfer_valve/HasProximity(atom/movable/AM as mob|obj)
- if(!attached_device) return
+/obj/item/device/transfer_valve/HasProximity(atom/movable/AM)
+ if(!attached_device)
+ return
attached_device.HasProximity(AM)
- return
-/obj/item/device/transfer_valve/hear_talk(mob/living/M as mob, msg)
+/obj/item/device/transfer_valve/hear_talk(mob/living/M, msg)
..()
for(var/obj/O in contents)
O.hear_talk(M, msg)
-/obj/item/device/transfer_valve/hear_message(mob/living/M as mob, msg)
+/obj/item/device/transfer_valve/hear_message(mob/living/M, msg)
..()
for(var/obj/O in contents)
O.hear_message(M, msg)
-/obj/item/device/transfer_valve/attack_self(mob/user as mob)
+/obj/item/device/transfer_valve/attack_self(mob/user)
ui_interact(user)
-/obj/item/device/transfer_valve/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/item/device/transfer_valve/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -113,36 +112,40 @@
/obj/item/device/transfer_valve/Topic(href, href_list)
..()
- if( usr.stat || usr.restrained() )
+ if(usr.incapacitated())
return 0
- if(src.loc != usr)
+ if(loc != usr)
return 0
if(tank_one && href_list["tankone"])
split_gases()
valve_open = 0
- tank_one.loc = get_turf(src)
+ tank_one.forceMove(get_turf(src))
tank_one = null
update_icon()
+ if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
+ w_class = WEIGHT_CLASS_NORMAL
else if(tank_two && href_list["tanktwo"])
split_gases()
valve_open = 0
- tank_two.loc = get_turf(src)
+ tank_two.forceMove(get_turf(src))
tank_two = null
update_icon()
+ if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
+ w_class = WEIGHT_CLASS_NORMAL
else if(href_list["open"])
toggle_valve()
else if(attached_device)
if(href_list["rem_device"])
- attached_device.loc = get_turf(src)
- attached_device:holder = null
+ attached_device.forceMove(get_turf(src))
+ attached_device.holder = null
attached_device = null
update_icon()
if(href_list["device"])
attached_device.attack_self(usr)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
return 1 // Returning 1 sends an update to attached UIs
-/obj/item/device/transfer_valve/process_activation(var/obj/item/device/D)
+/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D)
if(toggle)
toggle = 0
toggle_valve()
@@ -188,7 +191,7 @@
*/
/obj/item/device/transfer_valve/proc/toggle_valve()
- if(valve_open==0 && (tank_one && tank_two))
+ if(!valve_open && tank_one && tank_two)
valve_open = 1
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -206,17 +209,12 @@
log_game("Bomb valve opened at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name(mob)]")
merge_gases()
spawn(20) // In case one tank bursts
- for(var/i=0,i<5,i++)
- src.update_icon()
+ for(var/i in 1 to 5)
+ update_icon()
sleep(10)
- src.update_icon()
+ update_icon()
- else if(valve_open==1 && (tank_one && tank_two))
+ else if(valve_open && tank_one && tank_two)
split_gases()
valve_open = 0
- src.update_icon()
-
-// this doesn't do anything but the timer etc. expects it to be here
-// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
-/obj/item/device/transfer_valve/proc/c_state()
- return
+ update_icon()
diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm
index 323fb3db4f4..3ef6b2bef85 100644
--- a/code/game/objects/items/devices/violin.dm
+++ b/code/game/objects/items/devices/violin.dm
@@ -18,8 +18,7 @@
song.instrumentExt = "ogg"
/obj/item/device/violin/Destroy()
- qdel(song)
- song = null
+ QDEL_NULL(song)
return ..()
/obj/item/device/violin/initialize()
@@ -30,10 +29,7 @@
ui_interact(user)
/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(!user)
- return
-
- if(!isliving(user) || user.stat || user.restrained() || user.lying)
+ if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm
index c65f0a94355..d9aae300360 100644
--- a/code/game/objects/items/devices/whistle.dm
+++ b/code/game/objects/items/devices/whistle.dm
@@ -3,7 +3,7 @@
desc = "Used by obese officers to save their breath for running."
icon_state = "voice0"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
flags = CONDUCT
var/spamcheck = 0
@@ -26,6 +26,5 @@
/obj/item/device/hailer/emag_act(user as mob)
if(!emagged)
- to_chat(user, "\red You overload \the [src]'s voice synthesizer.")
+ to_chat(user, "You overload \the [src]'s voice synthesizer. ")
emagged = 1
-
diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm
index f76a4942195..9540dcbb966 100644
--- a/code/game/objects/items/documents.dm
+++ b/code/game/objects/items/documents.dm
@@ -5,7 +5,7 @@
icon_state = "docs_generic"
item_state = "paper"
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_range = 1
throw_speed = 1
layer = 4
@@ -26,4 +26,4 @@
/obj/item/documents/syndicate/blue
name = "'Blue' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
- icon_state = "docs_blue"
\ No newline at end of file
+ icon_state = "docs_blue"
diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm
index e05182bf3c1..0117f1b9f19 100644
--- a/code/game/objects/items/flag.dm
+++ b/code/game/objects/items/flag.dm
@@ -1,6 +1,6 @@
/obj/item/flag
icon = 'icons/obj/flag.dmi'
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
burntime = 20
burn_state = FLAMMABLE
@@ -156,7 +156,7 @@
name = "Nar'Sie Cultist flag"
desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT."
icon_state = "cultflag"
-
+
//Chameleon
/obj/item/flag/chameleon
@@ -165,7 +165,7 @@
icon_state = "ntflag"
origin_tech = "materials=3;magnets=4;syndicate=4"
var/used = 0
-
+
/obj/item/flag/chameleon/attack_self(mob/user)
if(used)
return
@@ -190,7 +190,7 @@
icon_state = chosen_flag.icon_state
desc = chosen_flag.desc
used = 1
-
+
/obj/item/flag/chameleon/burn()
explosion(loc,1,2,4,4, flame_range = 4)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index 855c97d9b12..5f55a5acdcc 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -5,16 +5,14 @@
item_state = "lgloves"
force = 0
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 7
var/state
var/datum/gas_mixture/air_contents = null
/obj/item/latexballon/Destroy()
- if(air_contents)
- qdel(air_contents)
- air_contents = null
+ QDEL_NULL(air_contents)
return ..()
/obj/item/latexballon/proc/blow(obj/item/weapon/tank/tank, mob/user)
@@ -62,4 +60,4 @@
blow(T, user)
return
if(is_sharp(W) || is_hot(W) || can_puncture(W))
- burst()
\ No newline at end of file
+ burst()
diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm
index f2fa9596375..67b1523db8d 100644
--- a/code/game/objects/items/misc.dm
+++ b/code/game/objects/items/misc.dm
@@ -16,9 +16,9 @@
item_state = "beachball"
density = 0
anchored = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
force = 0.0
throwforce = 0.0
throw_speed = 1
throw_range = 20
- flags = CONDUCT
\ No newline at end of file
+ flags = CONDUCT
diff --git a/code/game/objects/items/mountable_frames/frames.dm b/code/game/objects/items/mountable_frames/frames.dm
index e377cac4015..b8ef9216053 100644
--- a/code/game/objects/items/mountable_frames/frames.dm
+++ b/code/game/objects/items/mountable_frames/frames.dm
@@ -3,6 +3,8 @@
desc = "Place it on a wall."
var/sheets_refunded = 2
var/list/mount_reqs = list() //can contain simfloor, nospace. Used in try_build to see if conditions are needed, then met
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/mounted/frame/attackby(obj/item/weapon/W, mob/user)
..()
diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm
index 907be15d850..127f3f82c41 100644
--- a/code/game/objects/items/policetape.dm
+++ b/code/game/objects/items/policetape.dm
@@ -3,7 +3,7 @@
name = "tape roll"
icon = 'icons/policetape.dmi'
icon_state = "rollstart"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/turf/start
var/turf/end
var/tape_type = /obj/item/tape
@@ -66,13 +66,13 @@ var/list/tape_roll_applications = list()
/obj/item/taperoll/attack_self(mob/user as mob)
if(icon_state == "[icon_base]_start")
start = get_turf(src)
- to_chat(usr, "\blue You place the first end of the [src].")
+ to_chat(usr, "You place the first end of the [src]. ")
icon_state = "[icon_base]_stop"
else
icon_state = "[icon_base]_start"
end = get_turf(src)
if(start.y != end.y && start.x != end.x || start.z != end.z)
- to_chat(usr, "\blue [src] can only be laid horizontally or vertically.")
+ to_chat(usr, "[src] can only be laid horizontally or vertically. ")
return
var/turf/cur = start
@@ -101,7 +101,7 @@ var/list/tape_roll_applications = list()
break
cur = get_step_towards(cur,end)
if(!can_place)
- to_chat(usr, "\blue You can't run \the [src] through that!")
+ to_chat(usr, "You can't run \the [src] through that! ")
return
cur = start
@@ -115,7 +115,7 @@ var/list/tape_roll_applications = list()
P.icon_state = "[P.icon_base]_[dir]"
cur = get_step_towards(cur,end)
//is_blocked_turf(var/turf/T)
- to_chat(usr, "\blue You finish placing the [src].")//Git Test
+ to_chat(usr, "You finish placing the [src]. ")//Git Test
/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity)
@@ -128,7 +128,7 @@ var/list/tape_roll_applications = list()
P.loc = locate(T.x,T.y,T.z)
P.icon_state = "[src.icon_base]_door"
P.layer = 3.2
- to_chat(user, "\blue You finish placing the [src].")
+ to_chat(user, "You finish placing the [src]. ")
if(istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor))
var/turf/F = A
@@ -147,11 +147,11 @@ var/list/tape_roll_applications = list()
tape_roll_applications[F] |= direction
return
-/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0)
if(!density) return 1
- if(air_group || (height==0)) return 1
+ if(height==0) return 1
- if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing == 1) )
+ if((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing))
return 1
else if(ismob(mover) && allowed(mover))
return 1
@@ -201,5 +201,3 @@ var/list/tape_roll_applications = list()
qdel(src)
return
-
-
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index 7e15df8676c..5cc0ab739c0 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -263,7 +263,7 @@
/mob/living/simple_animal/hostile/creature,/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/hivebot,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/pirate)
- visible_message("\red Something falls out of the [src]!")
+ visible_message("Something falls out of the [src]! ")
var/obj/item/weapon/grenade/clusterbuster/C = new(src.loc)
C.prime()
spawn(10)
diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm
index a27cfe68476..589e1ba87e0 100644
--- a/code/game/objects/items/robot/ai_upgrades.dm
+++ b/code/game/objects/items/robot/ai_upgrades.dm
@@ -5,7 +5,7 @@
/obj/item/device/malf_upgrade
name = "combat software upgrade"
desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs."
- icon = 'icons/obj/cloning.dmi'
+ icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
@@ -26,7 +26,7 @@
/obj/item/device/surveillance_upgrade
name = "surveillance software upgrade"
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
- icon = 'icons/obj/cloning.dmi'
+ icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
/obj/item/device/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index f8ca693bf9c..ef1589f50b7 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -10,8 +10,7 @@
var/model_info
dir = SOUTH
-
-/obj/item/robot_parts/New(var/newloc, var/model)
+/obj/item/robot_parts/New(newloc, model)
..(newloc)
if(model_info && model)
model_info = model
@@ -57,9 +56,13 @@
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
part = list("groin","chest")
- var/wires = 0.0
+ var/wired = FALSE
var/obj/item/weapon/stock_parts/cell/cell = null
+/obj/item/robot_parts/chest/Destroy()
+ QDEL_NULL(cell)
+ return ..()
+
/obj/item/robot_parts/head
name = "head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
@@ -68,6 +71,11 @@
var/obj/item/device/flash/flash1 = null
var/obj/item/device/flash/flash2 = null
+/obj/item/robot_parts/head/Destroy()
+ QDEL_NULL(flash1)
+ QDEL_NULL(flash2)
+ return ..()
+
/obj/item/robot_parts/robot_suit
name = "endoskeleton"
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
@@ -88,91 +96,110 @@
/obj/item/robot_parts/robot_suit/New()
..()
- src.updateicon()
+ updateicon()
+
+/obj/item/robot_parts/robot_suit/Destroy()
+ QDEL_NULL(l_arm)
+ QDEL_NULL(r_arm)
+ QDEL_NULL(l_leg)
+ QDEL_NULL(r_leg)
+ QDEL_NULL(chest)
+ QDEL_NULL(head)
+ forced_ai = null
+ return ..()
/obj/item/robot_parts/robot_suit/proc/updateicon()
- src.overlays.Cut()
- if(src.l_arm)
- src.overlays += "l_arm+o"
- if(src.r_arm)
- src.overlays += "r_arm+o"
- if(src.chest)
- src.overlays += "chest+o"
- if(src.l_leg)
- src.overlays += "l_leg+o"
- if(src.r_leg)
- src.overlays += "r_leg+o"
- if(src.head)
- src.overlays += "head+o"
+ overlays.Cut()
+ if(l_arm)
+ overlays += "l_arm+o"
+ if(r_arm)
+ overlays += "r_arm+o"
+ if(chest)
+ overlays += "chest+o"
+ if(l_leg)
+ overlays += "l_leg+o"
+ if(r_leg)
+ overlays += "r_leg+o"
+ if(head)
+ overlays += "head+o"
/obj/item/robot_parts/robot_suit/proc/check_completion()
- if(src.l_arm && src.r_arm)
- if(src.l_leg && src.r_leg)
- if(src.chest && src.head)
+ if(l_arm && r_arm)
+ if(l_leg && r_leg)
+ if(chest && head)
feedback_inc("cyborg_frames_built",1)
return 1
return 0
-/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/robot_parts/robot_suit/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
+ var/obj/item/stack/sheet/metal/M = W
var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly
- B.loc = get_turf(src)
+ B.forceMove(get_turf(src))
to_chat(user, "You armed the robot frame")
- W:use(1)
+ M.use(1)
if(user.get_inactive_hand()==src)
user.unEquip(src)
user.put_in_inactive_hand(B)
qdel(src)
if(istype(W, /obj/item/robot_parts/l_leg))
- if(src.l_leg) return
+ if(l_leg)
+ return
user.drop_item()
- W.loc = src
- src.l_leg = W
- src.updateicon()
+ W.forceMove(src)
+ l_leg = W
+ updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
- if(src.r_leg) return
+ if(r_leg)
+ return
user.drop_item()
- W.loc = src
- src.r_leg = W
- src.updateicon()
+ W.forceMove(src)
+ r_leg = W
+ updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
- if(src.l_arm) return
+ if(l_arm)
+ return
user.drop_item()
- W.loc = src
- src.l_arm = W
- src.updateicon()
+ W.forceMove(src)
+ l_arm = W
+ updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
- if(src.r_arm) return
+ if(r_arm)
+ return
user.drop_item()
- W.loc = src
- src.r_arm = W
- src.updateicon()
+ W.forceMove(src)
+ r_arm = W
+ updateicon()
if(istype(W, /obj/item/robot_parts/chest))
- if(src.chest) return
- if(W:wires && W:cell)
+ var/obj/item/robot_parts/chest/CH = W
+ if(chest)
+ return
+ if(CH.wired && CH.cell)
user.drop_item()
- W.loc = src
- src.chest = W
- src.updateicon()
- else if(!W:wires)
- to_chat(user, "\blue You need to attach wires to it first!")
+ W.forceMove(src)
+ chest = W
+ updateicon()
+ else if(!CH.wired)
+ to_chat(user, "You need to attach wires to it first! ")
else
- to_chat(user, "\blue You need to attach a cell to it first!")
+ to_chat(user, "You need to attach a cell to it first! ")
if(istype(W, /obj/item/robot_parts/head))
- if(src.head) return
- if(W:flash2 && W:flash1)
+ var/obj/item/robot_parts/head/HD = W
+ if(head)
+ return
+ if(HD.flash2 && HD.flash1)
user.drop_item()
- W.loc = src
- src.head = W
- src.updateicon()
+ W.forceMove(src)
+ head = W
+ updateicon()
else
- to_chat(user, "\blue You need to attach a flash to it first!")
+ to_chat(user, "You need to attach a flash to it first! ")
if(istype(W, /obj/item/device/multitool))
if(check_completion())
@@ -183,11 +210,11 @@
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
- if(!istype(loc,/turf))
- to_chat(user, "\red You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.")
+ if(!isturf(loc))
+ to_chat(user, "You can't put [M] in, the frame has to be standing on the ground to be perfectly precise. ")
return
if(!M.brainmob)
- to_chat(user, "\red Sticking an empty [W] into the frame would sort of defeat the purpose.")
+ to_chat(user, "Sticking an empty [M] into the frame would sort of defeat the purpose. ")
return
if(!M.brainmob.key)
@@ -202,23 +229,24 @@
ghost_can_reenter = 1
break
if(!ghost_can_reenter)
- to_chat(user, "\The [W] is completely unresponsive; there's no point. ")
+ to_chat(user, "[M] is completely unresponsive; there's no point. ")
return
if(M.brainmob.stat == DEAD)
- to_chat(user, "\red Sticking a dead [W] into the frame would sort of defeat the purpose.")
+ to_chat(user, "Sticking a dead [M] into the frame would sort of defeat the purpose. ")
return
if(M.brainmob.mind in ticker.mode.head_revolutionaries)
- to_chat(user, "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W].")
+ to_chat(user, "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M]. ")
return
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept"))
- to_chat(user, "\red This [W] does not seem to fit.")
+ to_chat(user, "This [W] does not seem to fit. ")
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
- if(!O) return
+ if(!O)
+ return
user.drop_item()
@@ -257,9 +285,9 @@
O.job = "Cyborg"
O.cell = chest.cell
- chest.cell.loc = O
+ chest.cell.forceMove(O)
chest.cell = null
- W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
+ M.forceMove(O) //Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
// Since we "magically" installed a cell, we also have to update the correct component.
if(O.cell)
var/datum/robot_component/cell_component = O.components["power cell"]
@@ -271,7 +299,8 @@
feedback_inc("cyborg_birth",1)
callHook("borgify", list(O))
- src.loc = O
+ forceMove(O)
+ O.robot_suit = src
if(!locomotion)
O.lockcharge = 1
@@ -308,8 +337,8 @@
return
if(href_list["Name"])
- var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name),1)
- if(!in_range(src, usr) && src.loc != usr)
+ var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", created_name),1)
+ if(!in_range(src, usr) && loc != usr)
return
if(new_name)
created_name = new_name
@@ -337,59 +366,54 @@
/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/stock_parts/cell))
- if(src.cell)
- to_chat(user, "\blue You have already inserted a cell!")
+ if(cell)
+ to_chat(user, "You have already inserted a cell! ")
return
else
user.drop_item()
- W.loc = src
- src.cell = W
- to_chat(user, "\blue You insert the cell!")
+ W.forceMove(src)
+ cell = W
+ to_chat(user, "You insert the cell! ")
if(istype(W, /obj/item/stack/cable_coil))
- if(src.wires)
- to_chat(user, "\blue You have already inserted wire!")
+ if(wired)
+ to_chat(user, "You have already inserted wire! ")
return
else
var/obj/item/stack/cable_coil/coil = W
coil.use(1)
- src.wires = 1.0
- to_chat(user, "\blue You insert the wire!")
+ wired = TRUE
+ to_chat(user, "You insert the wire! ")
return
/obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/device/flash))
if(istype(user,/mob/living/silicon/robot))
- to_chat(user, "\red How do you propose to do that?")
+ to_chat(user, "How do you propose to do that? ")
return
- else if(src.flash1 && src.flash2)
- to_chat(user, "\blue You have already inserted the eyes!")
+ else if(flash1 && flash2)
+ to_chat(user, "You have already inserted the eyes! ")
return
- else if(src.flash1)
+ else if(flash1)
user.drop_item()
- W.loc = src
- src.flash2 = W
- to_chat(user, "\blue You insert the flash into the eye socket!")
+ W.forceMove(src)
+ flash2 = W
+ to_chat(user, "You insert the flash into the eye socket! ")
else
user.drop_item()
- W.loc = src
- src.flash1 = W
- to_chat(user, "\blue You insert the flash into the eye socket!")
+ W.forceMove(src)
+ flash1 = W
+ to_chat(user, "You insert the flash into the eye socket! ")
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
- to_chat(user, "\blue You install some manipulators and modify the head, creating a functional spider-bot!")
+ to_chat(user, "You install some manipulators and modify the head, creating a functional spider-bot! ")
new /mob/living/simple_animal/spiderbot(get_turf(loc))
user.drop_item()
qdel(W)
qdel(src)
- return
- return
-/obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/card/emag))
- if(sabotaged)
- to_chat(user, "\red [src] is already sabotaged!")
- else
- to_chat(user, "\red You slide [W] into the dataport on [src] and short out the safeties.")
- sabotaged = 1
- return
- ..()
+/obj/item/robot_parts/emag_act(user)
+ if(sabotaged)
+ to_chat(user, "[src] is already sabotaged! ")
+ else
+ to_chat(user, "You slide the emag into the dataport on [src] and short out the safeties. ")
+ sabotaged = 1
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index bd6f3acfdee..40cc65da34a 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -196,25 +196,6 @@
return 1
-/obj/item/borg/upgrade/hyperka
- name = "mining cyborg hyper-kinetic accelerator"
- desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
- icon_state = "cyborg_upgrade3"
- require_module = 1
- module_type = /obj/item/weapon/robot_module/miner
-
-/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R)
- if(..())
- return
-
- for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
- qdel(H)
-
- R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module)
- R.module.rebuild()
-
- return 1
-
/obj/item/borg/upgrade/syndicate
name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a cyborg"
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 611a5a3e37e..a46e84d1573 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -96,7 +96,7 @@
if(hp <= 0)
for(var/mob/O in oviewers())
if((O.client && !( O.blinded )))
- to_chat(O, "\red [src] breaks into tiny pieces and collapses!")
+ to_chat(O, "[src] breaks into tiny pieces and collapses! ")
qdel(src)
// Create a temporary object to represent the damage
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 2c6d04b9c06..e50c51ba100 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/items.dmi'
amount = 6
max_amount = 6
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
var/heal_brute = 0
@@ -152,8 +152,6 @@
icon_state = "burnkit"
heal_burn = 25
-
-
//Medical Herbs//
@@ -161,8 +159,8 @@
name = "\improper Comfrey leaf"
singular_name = "Comfrey leaf"
desc = "A soft leaf that is rubbed on bruises."
- icon = 'icons/obj/hydroponics_products.dmi'
- icon_state = "alien3-product"
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "tea_aspera_leaves"
color = "#378C61"
heal_brute = 12
@@ -171,14 +169,13 @@
name = "\improper Aloe Vera leaf"
singular_name = "Aloe Vera leaf"
desc = "A cold leaf that is rubbed on burns."
- icon = 'icons/obj/hydroponics_products.dmi'
- icon_state = "ambrosia-product"
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "ambrosiavulgaris"
color = "#4CC5C7"
heal_burn = 12
-
-//Splits//
+//Splints//
/obj/item/stack/medical/splint
@@ -206,14 +203,14 @@
to_chat(user, "You remove the splint from [H]'s [limb]. ")
return
if(M == user)
- user.visible_message("[user] starts to apply [src] to [H]'s [limb]. ", \
- "You start to apply [src] to [H]'s [limb]. ", \
+ user.visible_message("[user] starts to apply [src] to their [limb]. ", \
+ "You start to apply [src] to your [limb]. ", \
"You hear something being wrapped. ")
if(!do_mob(user, H, self_delay))
return
else
- user.visible_message("[user] applies [src] to their [limb]. ", \
- "You apply [src] to your [limb]. ", \
+ user.visible_message("[user] applies [src] to [H]'s [limb]. ", \
+ "You apply [src] to [H]'s [limb]. ", \
"You hear something being wrapped. ")
affecting.status |= ORGAN_SPLINTED
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index 55e1cc4a722..a21bb504fdc 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -6,7 +6,7 @@
icon_state = "tube"
origin_tech = "materials=3;engineering=2"
amount = 10
-
+ toolspeed = 1
/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
if(!istype(M) || !istype(user))
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index e4866856e97..96d5d381a72 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -1,3 +1,7 @@
+var/global/list/datum/stack_recipe/rod_recipes = list ( \
+ new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ )
+
/obj/item/stack/rods
name = "metal rod"
desc = "Some rods. Can be used for building, or something."
@@ -5,22 +9,24 @@
icon_state = "rods"
item_state = "rods"
flags = CONDUCT
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 9.0
throwforce = 10.0
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=1000)
- max_amount = 60
+ max_amount = 50
attack_verb = list("hit", "bludgeoned", "whacked")
hitsound = 'sound/weapons/grenadelaunch.ogg'
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/stack/rods/cyborg
materials = list()
-/obj/item/stack/rods/New(var/loc, var/amount=null)
+/obj/item/stack/rods/New(loc, amount=null)
..()
-
+ recipes = rod_recipes
update_icon()
/obj/item/stack/rods/update_icon()
@@ -30,12 +36,12 @@
else
icon_state = "rods"
-/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/stack/rods/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(get_amount() < 2)
- to_chat(user, "You need at least two rods to do this. ")
+ to_chat(user, "You need at least two rods to do this! ")
return
if(WT.remove_fuel(0,user))
@@ -45,9 +51,9 @@
// stack was moved into another one on the pile
new_item = locate() in user.loc
- user.visible_message("[user.name] shaped [src] into metal with the weldingtool. ", \
- "You shaped [src] into metal with the weldingtool. ", \
- "You hear welding. ")
+ user.visible_message("[user.name] shape [src] into metal with the welding tool.", \
+ "You shape [src] into metal with the welding tool. ", \
+ "You hear welding. ")
var/replace = user.get_inactive_hand() == src
use(2)
@@ -57,34 +63,3 @@
user.put_in_hands(new_item)
return
..()
-
-
-/obj/item/stack/rods/attack_self(mob/user as mob)
- src.add_fingerprint(user)
-
- if(!istype(user.loc,/turf)) return 0
-
- if(locate(/obj/structure/grille, usr.loc))
- for(var/obj/structure/grille/G in usr.loc)
- if(G.destroyed)
- G.health = 10
- G.density = 1
- G.destroyed = 0
- G.icon_state = "grille"
- use(1)
- else
- return 1
- else
- if(amount < 2)
- to_chat(user, "\blue You need at least two rods to do this.")
- return
- to_chat(usr, "\blue Assembling grille...")
-
- if(!do_after(usr, 10, target = user))
- return
-
- var /obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
- to_chat(usr, "\blue You assemble a grille")
- F.add_fingerprint(usr)
- use(2)
- return
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 0a52ea4c552..deea1ecc24e 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -22,6 +22,10 @@
origin_tech = "materials=1"
var/created_window = /obj/structure/window/basic
var/full_window = /obj/structure/window/full/basic
+ merge_type = /obj/item/stack/sheet/glass
+
+/obj/item/stack/sheet/glass/fifty
+ amount = 50
/obj/item/stack/sheet/glass/cyborg
materials = list()
@@ -34,7 +38,7 @@
if(istype(W,/obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
if(CC.amount < 5)
- to_chat(user, "\b There is not enough wire in this coil. You need 5 lengths.")
+ to_chat(user, "There is not enough wire in this coil. You need 5 lengths. ")
return
CC.use(5)
to_chat(user, "You attach wire to the [name]. ")
@@ -152,6 +156,7 @@
origin_tech = "materials=2"
var/created_window = /obj/structure/window/reinforced
var/full_window = /obj/structure/window/full/reinforced
+ merge_type = /obj/item/stack/sheet/rglass
/obj/item/stack/sheet/rglass/cyborg
materials = list()
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 4678d18a2f3..e222f1627cd 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -102,19 +102,49 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
icon_state = "sheet-leather"
origin_tech = "materials=2"
+/obj/item/stack/sheet/sinew
+ name = "watcher sinew"
+ icon = 'icons/obj/mining.dmi'
+ desc = "Long stringy filaments which presumably came from a watcher's wings."
+ singular_name = "watcher sinew"
+ icon_state = "sinew"
+ origin_tech = "biotech=4"
+var/global/list/datum/stack_recipe/sinew_recipes = list ( \
+ new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \
+ )
+
+/obj/item/stack/sheet/sinew/New(var/loc, var/amount=null)
+ recipes = sinew_recipes
+ return ..()
+
+/obj/item/stack/sheet/animalhide/goliath_hide
+ name = "goliath hide plates"
+ desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "goliath_hide"
+ singular_name = "hide plate"
+ flags = NOBLUDGEON
+ w_class = WEIGHT_CLASS_NORMAL
+ layer = MOB_LAYER
+
+/obj/item/stack/sheet/animalhide/ashdrake
+ name = "ash drake hide"
+ desc = "The strong, scaled hide of an ash drake."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "dragon_hide"
+ singular_name = "drake plate"
+ flags = NOBLUDGEON
+ w_class = WEIGHT_CLASS_NORMAL
+ layer = MOB_LAYER
//Step one - dehairing.
/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if( istype(W, /obj/item/weapon/kitchen/knife) || \
- istype(W, /obj/item/weapon/twohanded/fireaxe) || \
- istype(W, /obj/item/weapon/hatchet) )
-
- //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
- usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh")
- if(do_after(user,50, target = src))
- to_chat(usr, "\blue You cut the hair from this [src.singular_name]")
+ if(W.sharp)
+ user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]... ", "You hear the sound of a knife rubbing against flesh. ")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ to_chat(user, "You cut the hair from this [src.singular_name]. ")
//Try locating an exisitng stack on the tile and add to there if possible
for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc)
if(HS.amount < 50)
@@ -128,7 +158,6 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
else
..()
-
//Step two - washing..... it's actually in washing machine code.
//Step three - drying
@@ -148,4 +177,4 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
var/obj/item/stack/sheet/leather/HS = new(src.loc)
HS.amount = 1
wetness = initial(wetness)
- src.use(1)
\ No newline at end of file
+ src.use(1)
diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm
index 4d8b27a6690..d399e152bbe 100644
--- a/code/game/objects/items/stacks/sheets/light.dm
+++ b/code/game/objects/items/stacks/sheets/light.dm
@@ -3,8 +3,9 @@
gender = PLURAL
singular_name = "wired glass floor tile"
desc = "A glass tile, which is wired, somehow."
+ icon = 'icons/obj/tiles.dmi'
icon_state = "glass_wire"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 3.0
throwforce = 5.0
throw_speed = 5
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 3afb9b21eab..fc933a14f20 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -5,75 +5,106 @@ Mineral Sheets
- Diamond
- Uranium
- Plasma
- - Plastic
- Gold
- Silver
- Bananium
- Tranqillite
- Enriched Uranium
- Platinum
- - Metallic Hydrogen
- - Tritium
- - Osmium
*/
var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
- new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("Breakdown into sand", /obj/item/weapon/ore/glass, 1, one_per_turf = 0, on_floor = 1), \
)
var/global/list/datum/stack_recipe/silver_recipes = list ( \
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("Janitor Statue", /obj/structure/statue/silver/janitor, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Sec Officer Statue", /obj/structure/statue/silver/sec, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Sec Borg Statue", /obj/structure/statue/silver/secborg, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Med Doctor Statue", /obj/structure/statue/silver/md, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Med Borg Statue", /obj/structure/statue/silver/medborg, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/diamond_recipes = list ( \
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/uranium_recipes = list ( \
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("Nuke Statue", /obj/structure/statue/uranium/nuke, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Engineer Statue", /obj/structure/statue/uranium/eng, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/gold_recipes = list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("HoS Statue", /obj/structure/statue/gold/hos, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("HoP Statue", /obj/structure/statue/gold/hop, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("CE Statue", /obj/structure/statue/gold/ce, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("RD Statue", /obj/structure/statue/gold/rd, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \
+ null, \
new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \
)
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/plastic_recipes = list ( \
- new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
- new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
- new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \
- new/datum/stack_recipe("bean mould", /obj/item/weapon/kitchen/mould/bean, 1, on_floor = 1), \
- new/datum/stack_recipe("ball mould", /obj/item/weapon/kitchen/mould/ball, 1, on_floor = 1), \
- new/datum/stack_recipe("cane mould", /obj/item/weapon/kitchen/mould/cane, 1, on_floor = 1), \
- new/datum/stack_recipe("cash mould", /obj/item/weapon/kitchen/mould/cash, 1, on_floor = 1), \
- new/datum/stack_recipe("coin mould", /obj/item/weapon/kitchen/mould/coin, 1, on_floor = 1), \
- new/datum/stack_recipe("sucker mould", /obj/item/weapon/kitchen/mould/loli, 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/bananium_recipes = list ( \
+ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
+ null, \
new/datum/stack_recipe("bananium computer frame", /obj/structure/computerframe/HONKputer, 50, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("bananium grenade casing", /obj/item/weapon/grenade/bananade/casing, 4, on_floor = 1), \
)
var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
- new/datum/stack_recipe("silent tile", /obj/item/stack/tile/silent, 1, 4, 20), \
new/datum/stack_recipe("invisible wall", /obj/structure/barricade/mime, 5, one_per_turf = 1, on_floor = 1, time = 50), \
+ null, \
+ new/datum/stack_recipe("silent tile", /obj/item/stack/tile/mineral/tranquillite, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe("Mime Statue", /obj/structure/statue/tranquillite/mime, 5, one_per_turf = 1, on_floor = 1), \
+ )
+
+var/global/list/datum/stack_recipe/abductor_recipes = list ( \
+ new/datum/stack_recipe("alien bed", /obj/structure/stool/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("alien table frame", /obj/structure/abductor_tableframe, 1, time = 15, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \
)
/obj/item/stack/sheet/mineral
force = 5.0
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
@@ -100,11 +131,11 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/diamond
name = "diamond"
icon_state = "sheet-diamond"
+ singular_name = "diamond"
origin_tech = "materials=6"
sheettype = "diamond"
materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT)
-
/obj/item/stack/sheet/mineral/diamond/New()
..()
recipes = diamond_recipes
@@ -112,6 +143,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/uranium
name = "uranium"
icon_state = "sheet-uranium"
+ singular_name = "uranium sheet"
origin_tech = "materials=5"
sheettype = "uranium"
materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT)
@@ -123,6 +155,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/plasma
name = "solid plasma"
icon_state = "sheet-plasma"
+ singular_name = "plasma sheet"
origin_tech = "plasmatech=2;materials=2"
sheettype = "plasma"
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
@@ -145,22 +178,10 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, amount*10)
qdel(src)
-/obj/item/stack/sheet/mineral/plastic
- name = "Plastic"
- icon_state = "sheet-plastic"
- origin_tech = "materials=3"
-
-/obj/item/stack/sheet/mineral/plastic/New()
- ..()
- recipes = plastic_recipes
-
-/obj/item/stack/sheet/mineral/plastic/cyborg
- name = "plastic sheets"
- icon_state = "sheet-plastic"
-
/obj/item/stack/sheet/mineral/gold
name = "gold"
icon_state = "sheet-gold"
+ singular_name = "gold bar"
origin_tech = "materials=4"
sheettype = "gold"
materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT)
@@ -172,6 +193,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/silver
name = "silver"
icon_state = "sheet-silver"
+ singular_name = "silver bar"
origin_tech = "materials=3"
sheettype = "silver"
materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT)
@@ -183,23 +205,24 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
/obj/item/stack/sheet/mineral/bananium
name = "bananium"
icon_state = "sheet-clown"
+ singular_name = "bananium sheet"
origin_tech = "materials=4"
sheettype = "bananium"
materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT)
-/obj/item/stack/sheet/mineral/bananium/New(var/loc, var/amount=null)
+/obj/item/stack/sheet/mineral/bananium/New(loc, amount=null)
..()
recipes = bananium_recipes
/obj/item/stack/sheet/mineral/tranquillite
name = "tranquillite"
- singular_name = "beret"
icon_state = "sheet-mime"
+ singular_name = "beret"
origin_tech = "materials=4"
sheettype = "tranquillite"
materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT)
-/obj/item/stack/sheet/mineral/tranquillite/New(var/loc, var/amount=null)
+/obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null)
..()
recipes = tranquillite_recipes
@@ -209,9 +232,7 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
origin_tech = "materials=6"
materials = list(MAT_URANIUM=3000)
-/*
- * Alien Alloy
- */
+//Alien Alloy
/obj/item/stack/sheet/mineral/abductor
name = "alien alloy"
icon = 'icons/obj/abductor.dmi'
@@ -219,20 +240,12 @@ var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
singular_name = "alien alloy sheet"
force = 5
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 1
throw_range = 3
origin_tech = "materials=6;abductor=1"
sheettype = "abductor"
-var/global/list/datum/stack_recipe/abductor_recipes = list ( \
- new/datum/stack_recipe("alien bed", /obj/structure/stool/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("alien table frame", /obj/structure/abductor_tableframe, 1, time = 15, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \
- )
-
-/obj/item/stack/sheet/mineral/abductor/New(var/loc, var/amount=null)
+/obj/item/stack/sheet/mineral/abductor/New(loc, amount=null)
recipes = abductor_recipes
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 509d6adb0a7..858365f6d29 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -4,7 +4,9 @@
* Plasteel
* Wood
* Cloth
+ * Plastic
* Cardboard
+ * Runed Metal (cult)
*/
/*
@@ -20,6 +22,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("barber chair", /obj/structure/stool/bed/chair/barber, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wheelchair", /obj/structure/stool/bed/chair/wheelchair, 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("psychiatrist bed", /obj/structure/stool/psychbed, 5, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe_list("office chairs",list(
new /datum/stack_recipe("dark office chair", /obj/structure/stool/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1),
@@ -47,12 +50,14 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20),
- new /datum/stack_recipe/rods("metal rod", /obj/item/stack/rods, 1, 2, 60),
+ new /datum/stack_recipe/rods("metal rod", /obj/item/stack/rods, 1, 2, 50),
null,
new /datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe_list("airlock assemblies", list(
@@ -63,7 +68,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1),
-/* new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), */
new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1),
@@ -97,15 +101,19 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
throwforce = 10.0
flags = CONDUCT
origin_tech = "materials=1"
+ merge_type = /obj/item/stack/sheet/metal
+
+/obj/item/stack/sheet/metal/cyborg
+ materials = list()
+
+/obj/item/stack/sheet/metal/fifty
+ amount = 50
/obj/item/stack/sheet/metal/narsie_act()
if(prob(20))
new /obj/item/stack/sheet/runed_metal(loc, amount)
qdel(src)
-/obj/item/stack/sheet/metal/cyborg
- materials = list()
-
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
recipes = metal_recipes
return ..()
@@ -130,6 +138,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list(
throwforce = 10.0
flags = CONDUCT
origin_tech = "materials=2"
+ merge_type = /obj/item/stack/sheet/plasteel
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
recipes = plasteel_recipes
@@ -145,13 +154,17 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("wooden chair", /obj/structure/stool/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("dog bed", /obj/structure/stool/bed/dogbed, 10, time = 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40),
new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden buckler", /obj/item/weapon/shield/riot/buckler, 20, time = 40),
new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),
- new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10)
+ new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),
+ new /datum/stack_recipe("baseball bat", /obj/item/weapon/melee/baseball_bat, 5, time = 15)
)
/obj/item/stack/sheet/wood
@@ -162,6 +175,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
icon_state = "sheet-wood"
origin_tech = "materials=1;biotech=1"
burn_state = FLAMMABLE
+ merge_type = /obj/item/stack/sheet/wood
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
recipes = wood_recipes
@@ -170,13 +184,43 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
/*
* Cloth
*/
+var/global/list/datum/stack_recipe/cloth_recipes = list ( \
+ new/datum/stack_recipe("grey jumpsuit", /obj/item/clothing/under/color/grey, 3), \
+ new/datum/stack_recipe("black shoes", /obj/item/clothing/shoes/black, 2), \
+ null, \
+ new/datum/stack_recipe("backpack", /obj/item/weapon/storage/backpack, 4), \
+ new/datum/stack_recipe("dufflebag", /obj/item/weapon/storage/backpack/duffel, 6), \
+ null, \
+ new/datum/stack_recipe("plant bag", /obj/item/weapon/storage/bag/plants, 4), \
+ new/datum/stack_recipe("book bag", /obj/item/weapon/storage/bag/books, 4), \
+ new/datum/stack_recipe("mining satchel", /obj/item/weapon/storage/bag/ore, 4), \
+ new/datum/stack_recipe("chemistry bag", /obj/item/weapon/storage/bag/chemistry, 4), \
+ new/datum/stack_recipe("bio bag", /obj/item/weapon/storage/bag/bio, 4), \
+ null, \
+ new/datum/stack_recipe("rag", /obj/item/weapon/reagent_containers/glass/rag, 1), \
+ new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 3), \
+ null, \
+ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
+ new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
+ )
+
/obj/item/stack/sheet/cloth
name = "cloth"
- desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
+ desc = "Is it cotton? Linen? Denim? Burlap? Canvas? You can't tell."
singular_name = "cloth roll"
icon_state = "sheet-cloth"
origin_tech = "materials=2"
burn_state = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/cloth
+
+/obj/item/stack/sheet/cloth/New(loc, amount=null)
+ recipes = cloth_recipes
+ ..()
+
+/obj/item/stack/sheet/cloth/ten
+ amount = 10
/*
* Cardboard
@@ -202,6 +246,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
icon_state = "sheet-card"
origin_tech = "materials=1"
burn_state = FLAMMABLE
+ merge_type = /obj/item/stack/sheet/cardboard
/obj/item/stack/sheet/cardboard/New(var/loc, var/amt = null)
recipes = cardboard_recipes
@@ -213,7 +258,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 1, time = 50, one_per_turf = 1, on_floor = 1),
- new/datum/stack_recipe("runed girder", /obj/structure/cultgirder, 1, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("pylon", /obj/structure/cult/functional/pylon, 3, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("forge", /obj/structure/cult/functional/forge, 5, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("archives", /obj/structure/cult/functional/tome, 2, time = 40, one_per_turf = 1, on_floor = 1), \
@@ -227,6 +272,7 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
icon_state = "sheet-runed"
icon = 'icons/obj/items.dmi'
sheettype = "runed"
+ merge_type = /obj/item/stack/sheet/runed_metal
/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
if(!iscultist(user))
@@ -240,3 +286,56 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
/obj/item/stack/sheet/runed_metal/New(var/loc, var/amount=null)
recipes = runed_metal_recipes
return ..()
+
+/*
+ * Bones
+ */
+/obj/item/stack/sheet/bone
+ name = "bones"
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "bone"
+ singular_name = "bone"
+ desc = "Someone's been drinking their milk."
+ force = 7
+ throwforce = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 1
+ throw_range = 3
+ origin_tech = "materials=2;biotech=2"
+
+var/global/list/datum/stack_recipe/plastic_recipes = list ( \
+ new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = 1, on_floor = 1, time = 40), \
+ new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
+ new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
+ new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \
+ new/datum/stack_recipe("bean mould", /obj/item/weapon/kitchen/mould/bean, 1, on_floor = 1), \
+ new/datum/stack_recipe("ball mould", /obj/item/weapon/kitchen/mould/ball, 1, on_floor = 1), \
+ new/datum/stack_recipe("cane mould", /obj/item/weapon/kitchen/mould/cane, 1, on_floor = 1), \
+ new/datum/stack_recipe("cash mould", /obj/item/weapon/kitchen/mould/cash, 1, on_floor = 1), \
+ new/datum/stack_recipe("coin mould", /obj/item/weapon/kitchen/mould/coin, 1, on_floor = 1), \
+ new/datum/stack_recipe("sucker mould", /obj/item/weapon/kitchen/mould/loli, 1, on_floor = 1), \
+ )
+
+/obj/item/stack/sheet/plastic
+ name = "plastic"
+ desc = "Compress dinosaur over millions of years, then refine, split and mold, and voila! You have plastic."
+ singular_name = "plastic sheet"
+ icon_state = "sheet-plastic"
+ throwforce = 7
+ origin_tech = "materials=1;biotech=1"
+ merge_type = /obj/item/stack/sheet/plastic
+
+/obj/item/stack/sheet/plastic/New()
+ recipes = plastic_recipes
+ . = ..()
+
+/obj/item/stack/sheet/plastic/fifty
+ amount = 50
+
+/obj/item/stack/sheet/plastic/five
+ amount = 5
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index 2a8b2130be6..3a92d0f7662 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -1,6 +1,6 @@
/obj/item/stack/sheet
name = "sheet"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 5
throwforce = 5
max_amount = 50
@@ -9,6 +9,8 @@
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
var/perunit = MINERAL_MATERIAL_AMOUNT
var/sheettype = null //this is used for girders in the creation of walls/false walls
+ usesound = 'sound/items/Deconstruct.ogg'
+ toolspeed = 1
// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use
@@ -22,4 +24,4 @@
else
for(var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z))
S.add(stack,user)
- ..()*/
\ No newline at end of file
+ ..()*/
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 852be314b1c..d4d4ae7f48c 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -14,11 +14,14 @@
var/singular_name
var/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
+ var/merge_type = null // This path and its children should merge with this stack, defaults to src.type
/obj/item/stack/New(var/loc, var/amt = null)
..()
if(amt != null) //Allow for stacks with the amount=0
amount = amt
+ if(!merge_type)
+ merge_type = type
/obj/item/stack/Destroy()
if(usr && usr.machine == src)
@@ -232,7 +235,7 @@
/obj/item/stack/attackby(obj/item/W, mob/user, params)
..()
- if(istype(W, type))
+ if(istype(W, merge_type))
var/obj/item/stack/S = W
if(S.amount >= max_amount)
return 1
diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm
index 0c6c3d42cf3..d2fb50bd385 100644
--- a/code/game/objects/items/stacks/telecrystal.dm
+++ b/code/game/objects/items/stacks/telecrystal.dm
@@ -5,7 +5,7 @@
singular_name = "telecrystal"
icon = 'icons/obj/telescience.dmi'
icon_state = "telecrystal"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
max_amount = 50
flags = NOBLUDGEON
origin_tech = "materials=6;syndicate=1"
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index 7e6d5459dbf..8e830f27407 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -1,3 +1,108 @@
+/obj/item/stack/tile/mineral/plasma
+ name = "plasma tile"
+ singular_name = "plasma floor tile"
+ desc = "A tile made out of highly flammable plasma. This can only end well."
+ icon_state = "tile_plasma"
+ origin_tech = "plasmatech=1"
+ turf_type = /turf/simulated/floor/mineral/plasma
+ mineralType = "plasma"
+ materials = list(MAT_PLASMA=500)
+
+/obj/item/stack/tile/mineral/uranium
+ name = "uranium tile"
+ singular_name = "uranium floor tile"
+ desc = "A tile made out of uranium. You feel a bit woozy."
+ icon_state = "tile_uranium"
+ turf_type = /turf/simulated/floor/mineral/uranium
+ mineralType = "uranium"
+ materials = list(MAT_URANIUM=500)
+
+var/global/list/datum/stack_recipe/gold_tile_recipes = list ( \
+ new/datum/stack_recipe("fancy gold tile", /obj/item/stack/tile/mineral/gold/fancy, max_res_amount = 20), \
+ )
+
+/obj/item/stack/tile/mineral/gold
+ name = "gold tile"
+ singular_name = "gold floor tile"
+ desc = "A tile made out of gold, the swag seems strong here."
+ icon_state = "tile_gold"
+ turf_type = /turf/simulated/floor/mineral/gold
+ mineralType = "gold"
+ materials = list(MAT_GOLD=500)
+
+/obj/item/stack/tile/mineral/gold/New(loc, amount=null)
+ ..()
+ recipes = gold_tile_recipes
+
+var/global/list/datum/stack_recipe/goldfancy_tile_recipes = list ( \
+ new/datum/stack_recipe("regular gold tile", /obj/item/stack/tile/mineral/gold, max_res_amount = 20), \
+ )
+
+/obj/item/stack/tile/mineral/gold/fancy
+ icon_state = "tile_goldfancy"
+ turf_type = /turf/simulated/floor/mineral/gold/fancy
+
+/obj/item/stack/tile/mineral/gold/fancy/New(loc, amount=null)
+ ..()
+ recipes = goldfancy_tile_recipes
+
+var/global/list/datum/stack_recipe/silver_tile_recipes = list ( \
+ new/datum/stack_recipe("fancy silver tile", /obj/item/stack/tile/mineral/silver/fancy, max_res_amount = 20), \
+ )
+
+/obj/item/stack/tile/mineral/silver
+ name = "silver tile"
+ singular_name = "silver floor tile"
+ desc = "A tile made out of silver, the light shining from it is blinding."
+ icon_state = "tile_silver"
+ turf_type = /turf/simulated/floor/mineral/silver
+ mineralType = "silver"
+ materials = list(MAT_SILVER=500)
+
+/obj/item/stack/tile/mineral/silver/New(loc, amount=null)
+ ..()
+ recipes = silver_tile_recipes
+
+var/global/list/datum/stack_recipe/silverfancy_tile_recipes = list ( \
+ new/datum/stack_recipe("regular silver tile", /obj/item/stack/tile/mineral/silver, max_res_amount = 20), \
+ )
+
+/obj/item/stack/tile/mineral/silver/fancy
+ icon_state = "tile_silverfancy"
+ turf_type = /turf/simulated/floor/mineral/silver/fancy
+
+/obj/item/stack/tile/mineral/silver/fancy/New(loc, amount=null)
+ ..()
+ recipes = silverfancy_tile_recipes
+
+/obj/item/stack/tile/mineral/diamond
+ name = "diamond tile"
+ singular_name = "diamond floor tile"
+ desc = "A tile made out of diamond. Wow, just, wow."
+ icon_state = "tile_diamond"
+ origin_tech = "materials=2"
+ turf_type = /turf/simulated/floor/mineral/diamond
+ mineralType = "diamond"
+ materials = list(MAT_DIAMOND=500)
+
+/obj/item/stack/tile/mineral/bananium
+ name = "bananium tile"
+ singular_name = "bananium floor tile"
+ desc = "A tile made out of bananium, HOOOOOOOOONK!"
+ icon_state = "tile_bananium"
+ turf_type = /turf/simulated/floor/mineral/bananium
+ mineralType = "bananium"
+ materials = list(MAT_BANANIUM=500)
+
+/obj/item/stack/tile/mineral/tranquillite
+ name = "silent tile"
+ singular_name = "silent floor tile"
+ desc = "A tile made out of tranquillite, SHHHHHHHHH!"
+ icon_state = "tile_tranquillite"
+ turf_type = /turf/simulated/floor/mineral/tranquillite
+ mineralType = "tranquillite"
+ materials = list(MAT_TRANQUILLITE=500)
+
/obj/item/stack/tile/mineral/abductor
name = "alien floor tile"
singular_name = "alien floor tile"
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index f5b3650c5bb..1fec38f491b 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -1,34 +1,75 @@
-/* Different misc types of tiles
- * Contains:
- * Grass
- * Wood
- * Carpet
- * Plasteel
- * Light
- * Fakespace
- * High-traction
- \\ If you don't update the contains list, I'm going to shank you
- */
/obj/item/stack/tile
name = "broken tile"
singular_name = "broken tile"
desc = "A broken tile. This should not exist."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/tiles.dmi'
icon_state = "tile"
item_state = "tile"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 1
throwforce = 1
throw_speed = 5
throw_range = 20
max_amount = 60
flags = CONDUCT
+ origin_tech = "materials=1"
var/turf_type = null
var/mineralType = null
-/*
- * Grass
- */
+/obj/item/stack/tile/New(loc, amount)
+ ..()
+ pixel_x = rand(-3, 3)
+ pixel_y = rand(-3, 3) //randomize a little
+
+/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
+ if(iswelder(W))
+ var/obj/item/weapon/weldingtool/WT = W
+
+ if(is_hot(W) && !mineralType)
+ to_chat(user, "You can not reform this! ")
+ return
+
+ if(get_amount() < 4)
+ to_chat(user, "You need at least four tiles to do this! ")
+ return
+
+ if(WT.remove_fuel(0,user))
+
+ if(mineralType == "plasma")
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5)
+ user.visible_message("[user.name] sets the plasma tiles on fire! ", \
+ "You set the plasma tiles on fire! ")
+ qdel(src)
+ return
+
+ if (mineralType == "metal")
+ var/obj/item/stack/sheet/metal/new_item = new(user.loc)
+ user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \
+ "You shaped [src] into metal with the welding tool. ", \
+ "You hear welding. ")
+ var/obj/item/stack/rods/R = src
+ src = null
+ var/replace = (user.get_inactive_hand()==R)
+ R.use(4)
+ if(!R && replace)
+ user.put_in_hands(new_item)
+
+ else
+ var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc)
+ user.visible_message("[user.name] shaped [src] into a sheet with the welding tool.", \
+ "You shaped [src] into a sheet with the welding tool. ", \
+ "You hear welding. ")
+ var/obj/item/stack/rods/R = src
+ src = null
+ var/replace = (user.get_inactive_hand()==R)
+ R.use(4)
+ if (!R && replace)
+ user.put_in_hands(new_item)
+ else
+ return ..()
+
+//Grass
/obj/item/stack/tile/grass
name = "grass tiles"
gender = PLURAL
@@ -39,21 +80,18 @@
turf_type = /turf/simulated/floor/grass
burn_state = FLAMMABLE
-/*
- * Wood
- */
+//Wood
/obj/item/stack/tile/wood
name = "wood floor tiles"
gender = PLURAL
singular_name = "wood floor tile"
desc = "an easy to fit wood floor tile"
icon_state = "tile-wood"
+ origin_tech = "biotech=1"
turf_type = /turf/simulated/floor/wood
burn_state = FLAMMABLE
-/*
- * Carpets
- */
+//Carpets
/obj/item/stack/tile/carpet
name = "carpet"
singular_name = "carpet"
@@ -62,9 +100,7 @@
turf_type = /turf/simulated/floor/carpet
burn_state = FLAMMABLE
-/*
- * Plasteel
- */
+//Plasteel
/obj/item/stack/tile/plasteel
name = "floor tiles"
gender = PLURAL
@@ -80,9 +116,7 @@
turf_type = /turf/simulated/floor/plasteel
mineralType = "metal"
-/*
- * Light
- */
+//Light
/obj/item/stack/tile/light
name = "light tiles"
gender = PLURAL
@@ -94,9 +128,7 @@
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
turf_type = /turf/simulated/floor/light
-/*
- * Fakespace
- */
+//Fakespace
/obj/item/stack/tile/fakespace
name = "astral carpet"
singular_name = "astral carpet"
@@ -104,6 +136,7 @@
icon_state = "tile_space"
turf_type = /turf/simulated/floor/fakespace
burn_state = FLAMMABLE
+ merge_type = /obj/item/stack/tile/fakespace
/obj/item/stack/tile/fakespace/loaded
amount = 30
@@ -116,24 +149,15 @@
icon_state = "tile_noslip"
turf_type = /turf/simulated/floor/noslip
origin_tech = "materials=3"
+ merge_type = /obj/item/stack/tile/noslip
/obj/item/stack/tile/noslip/loaded
amount = 20
-/obj/item/stack/tile/silent
- name = "silent tile"
- singular_name = "silent floor tile"
- desc = "A tile made out of tranquillite, SHHHHHHHHH!"
- icon_state = "tile-silent"
- origin_tech = "materials=1"
- turf_type = /turf/simulated/floor/silent
- mineralType = "tranquillite"
- materials = list(MAT_TRANQUILLITE=500)
-
//Pod floor
/obj/item/stack/tile/pod
name = "pod floor tile"
singular_name = "pod floor tile"
desc = "A grooved floor tile."
icon_state = "tile_pod"
- turf_type = /turf/simulated/floor/pod
\ No newline at end of file
+ turf_type = /turf/simulated/floor/pod
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 69f03730ce2..575cf09a6b1 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -43,14 +43,20 @@
/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
-/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
- if(!proximity) return
- if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1)
- A.reagents.trans_to(src, 10)
- to_chat(user, "You fill the balloon with the contents of [A]. ")
- desc = "A translucent balloon with some form of liquid sloshing around in it."
- update_icon()
- return
+/obj/item/toy/balloon/afterattack(atom/A, mob/user, proximity)
+ if(!proximity)
+ return
+ if(istype(A, /obj/structure/reagent_dispensers))
+ var/obj/structure/reagent_dispensers/RD = A
+ if(RD.reagents.total_volume <= 0)
+ to_chat(user, "[RD] is empty. ")
+ else if(reagents.total_volume >= 10)
+ to_chat(user, "[src] is full. ")
+ else
+ A.reagents.trans_to(src, 10)
+ to_chat(user, "You fill the balloon with the contents of [A]. ")
+ desc = "A translucent balloon with some form of liquid sloshing around in it."
+ update_icon()
/obj/item/toy/balloon/wash(mob/user, atom/source)
if(reagents.total_volume < 10)
@@ -107,7 +113,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
/*
* Fake telebeacon
@@ -138,7 +144,7 @@
icon_state = "sword0"
item_state = "sword0"
var/active = 0.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
/obj/item/toy/sword/attack_self(mob/user as mob)
@@ -148,13 +154,13 @@
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
icon_state = "swordblue"
item_state = "swordblue"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
else
to_chat(user, "You push the plastic blade back down into the handle. ")
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
icon_state = "sword0"
item_state = "sword0"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -212,7 +218,7 @@
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -233,7 +239,7 @@
throwforce = 5.0
throw_speed = 10
throw_range = 30
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
/obj/item/toy/snappop/virus/throw_impact(atom/hit_atom)
@@ -254,7 +260,7 @@
desc = "Wow!"
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/ash_type = /obj/effect/decal/cleanable/ash
/obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1)
@@ -397,7 +403,7 @@
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
@@ -432,7 +438,7 @@ obj/item/toy/cards/deck
icon = 'icons/obj/toy.dmi'
deckstyle = "nanotrasen"
icon_state = "deck_nanotrasen_full"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
var/list/cards = list()
@@ -562,7 +568,7 @@ obj/item/toy/cards/cardhand
desc = "A number of cards not in a deck, customarily held in ones hand."
icon = 'icons/obj/toy.dmi'
icon_state = "nanotrasen_hand2"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/list/currenthand = list()
var/choice = null
@@ -655,7 +661,7 @@ obj/item/toy/cards/singlecard
desc = "a card"
icon = 'icons/obj/toy.dmi'
icon_state = "singlecard_nanotrasen_down"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/cardname = null
var/flipped = 0
pixel_x = -5
@@ -781,7 +787,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A plastic model of a Nuclear Fission Explosive."
icon = 'icons/obj/toy.dmi'
icon_state = "nuketoyidle"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/nuke/attack_self(mob/user)
@@ -804,7 +810,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A toy for therapeutic and recreational purposes."
icon_state = "therapyred"
item_state = "egg4"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/cooldown = 0
/obj/item/toy/therapy/New()
@@ -857,7 +863,7 @@ obj/item/toy/cards/deck/syndicate/black
name = "toddler"
desc = "This baby looks almost real. Wait, did it just burp?"
force = 5
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
@@ -877,10 +883,10 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/minimeteor
name = "Mini-Meteor"
- desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor™"
+ desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor."
icon = 'icons/obj/toy.dmi'
icon_state = "minimeteor"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/toy/minimeteor/throw_impact(atom/hit_atom)
..()
@@ -1089,7 +1095,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "foamblade"
item_state = "arm_blade"
attack_verb = list("pricked", "absorbed", "gored")
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
burn_state = FLAMMABLE
/*
@@ -1101,7 +1107,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/device.dmi'
icon_state = "flash"
item_state = "flashtool"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
/obj/item/toy/flash/attack(mob/living/M, mob/user)
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
@@ -1117,7 +1123,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/redbutton/attack_self(mob/user)
@@ -1142,7 +1148,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "A little toy model AI core with real law announcing action!"
icon = 'icons/obj/toy.dmi'
icon_state = "AI"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/AI/attack_self(mob/user)
@@ -1161,7 +1167,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "An action figure modeled after 'The Owl', defender of justice."
icon = 'icons/obj/toy.dmi'
icon_state = "owlprize"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/owl/attack_self(mob/user)
@@ -1180,7 +1186,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
icon = 'icons/obj/toy.dmi'
icon_state = "griffinprize"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/griffin/attack_self(mob/user)
@@ -1197,7 +1203,7 @@ obj/item/toy/cards/deck/syndicate/black
// DND Character minis. Use the naming convention (type)character for the icon states.
/obj/item/toy/character
icon = 'icons/obj/toy.dmi'
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
pixel_z = 5
/obj/item/toy/character/alien
@@ -1250,7 +1256,7 @@ obj/item/toy/cards/deck/syndicate/black
desc = "The perfect pet!"
icon = 'icons/obj/toy.dmi'
icon_state = "pet_rock"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 5
throwforce = 5
attack_verb = list("attacked", "bashed", "smashed", "stoned")
@@ -1274,7 +1280,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/toy.dmi'
icon_state = "minigibber"
attack_verb = list("grinded", "gibbed")
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
var/obj/stored_minature = null
@@ -1295,7 +1301,7 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/minigibber/attackby(var/obj/O, var/mob/user, params)
if(istype(O,/obj/item/toy/character) && O.loc == user)
to_chat(user, "You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input. ")
- if(do_after(user,10, target = src))
+ if(do_after(user, 10, target = src))
if(O.loc != user)
to_chat(user, "\The [O] is too far away to feed into \the [src]! ")
else
@@ -1316,7 +1322,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "toy_xeno"
name = "xenomorph action figure"
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/toy_xeno/attack_self(mob/user)
@@ -1346,7 +1352,7 @@ obj/item/toy/cards/deck/syndicate/black
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=2000)
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throwforce = 5
throw_speed = 4
throw_range = 5
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index dc538674993..30a75b310b6 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -4,7 +4,7 @@
//Added by Jack Rost
/obj/item/trash
icon = 'icons/obj/trash.dmi'
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
desc = "This is rubbish."
burn_state = FLAMMABLE
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 50306ac7e02..17d40971804 100755
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -14,7 +14,7 @@ AI MODULES
desc = "An AI Module for transmitting encrypted instructions to the AI."
flags = CONDUCT
force = 5.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 5.0
throw_speed = 3
throw_range = 15
@@ -367,7 +367,7 @@ AI MODULES
log_law_changes(target, sender)
lawchanges.Add("The law is '[newFreeFormLaw]'")
- to_chat(target, "\red BZZZZT")
+ to_chat(target, "BZZZZT ")
var/law = "[newFreeFormLaw]"
target.add_ion_law(law)
target.show_laws()
@@ -397,4 +397,4 @@ AI MODULES
laws[1] = generate_ion_law()
to_chat(user, "You press the button on [src]. ")
playsound(user, 'sound/machines/click.ogg', 20, 1)
- src.loc.visible_message("[bicon(src)] [laws[1]] ")
\ No newline at end of file
+ src.loc.visible_message("[bicon(src)] [laws[1]] ")
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 088c26f06c2..cd00d2f2b78 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -7,7 +7,7 @@ RCD
/obj/item/weapon/rcd
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build and deconstruct walls and floors."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
opacity = 0
density = 0
@@ -17,9 +17,11 @@ RCD
throwforce = 10.0
throw_speed = 3
throw_range = 5
- w_class = 3
- materials = list(MAT_METAL=100000)
+ w_class = WEIGHT_CLASS_NORMAL
+ materials = list(MAT_METAL = 30000)
origin_tech = "engineering=4;materials=2"
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
var/datum/effect/system/spark_spread/spark_system
var/max_matter = 100
var/matter = 0
@@ -28,6 +30,7 @@ RCD
var/canRwall = 0
var/menu = 1
var/door_type = /obj/machinery/door/airlock
+ var/door_name = "Airlock"
req_access = list(access_engine)
var/list/door_accesses = list()
var/list/door_accesses_list = list()
@@ -56,8 +59,7 @@ RCD
return
/obj/item/weapon/rcd/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
rcd_list -= src
return ..()
@@ -85,7 +87,7 @@ RCD
/obj/item/weapon/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 400, 400, state = state)
+ ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 450, 400, state = state)
ui.open()
ui.set_auto_update(1)
@@ -93,6 +95,7 @@ RCD
var/data[0]
data["mode"] = mode
data["door_type"] = door_type
+ data["door_name"] = door_name
data["menu"] = menu
data["matter"] = matter
data["max_matter"] = max_matter
@@ -164,8 +167,13 @@ RCD
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
. = 1
+ if(href_list["choice"] && !locked)
+ var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.","Airlock Name"),1,MAX_MESSAGE_LEN))
+ if(temp_t)
+ door_name = temp_t
+
/obj/item/weapon/rcd/proc/activate()
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, usesound, 50, 1)
/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity)
@@ -190,7 +198,7 @@ RCD
if(checkResource(3, user))
to_chat(user, "Building Wall ...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 20, target = A))
+ if(do_after(user, 20 * toolspeed, target = A))
if(!useResource(3, user)) return 0
activate()
var/turf/AT = A
@@ -203,10 +211,11 @@ RCD
if(checkResource(10, user))
to_chat(user, "Building Airlock...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 50, target = A))
+ if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(10, user)) return 0
activate()
var/obj/machinery/door/airlock/T = new door_type(A)
+ T.name = door_name
T.autoclose = 1
if(one_access)
T.req_one_access = door_accesses.Copy()
@@ -223,7 +232,7 @@ RCD
if(checkResource(5, user))
to_chat(user, "Deconstructing Wall...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 40, target = A))
+ if(do_after(user, 40 * toolspeed, target = A))
if(!useResource(5, user)) return 0
activate()
var/turf/AT = A
@@ -235,7 +244,7 @@ RCD
if(checkResource(5, user))
to_chat(user, "Deconstructing Floor...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 50, target = A))
+ if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(5, user)) return 0
activate()
var/turf/AT = A
@@ -247,7 +256,7 @@ RCD
if(checkResource(20, user))
to_chat(user, "Deconstructing Airlock...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 50, target = A))
+ if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(20, user)) return 0
activate()
qdel(A)
@@ -262,7 +271,7 @@ RCD
return 0
to_chat(user, "Deconstructing window...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(!do_after(user, 20, target = A))
+ if(!do_after(user, 20 * toolspeed, target = A))
return 0
if(locate(/obj/structure/window/full/shuttle) in A.contents)
return 0 // Let's not give shuttle-griefers an easy time.
@@ -270,8 +279,7 @@ RCD
return 0
activate()
var/turf/T1 = get_turf(A)
- qdel(A)
- A = null
+ QDEL_NULL(A)
for(var/obj/structure/window/W in T1.contents)
W.disassembled = 1
W.density = 0
@@ -299,7 +307,7 @@ RCD
return 0
to_chat(user, "Constructing window...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(!do_after(user, 20, target = A))
+ if(!do_after(user, 20 * toolspeed, target = A))
return 0
if(locate(/obj/structure/grille) in A.contents)
return 0 // We already have window
@@ -368,6 +376,9 @@ RCD
explosion(src, 0, 0, 3, 1, flame_range = 1)
qdel(src)
+/obj/item/weapon/rcd/preloaded
+ matter = 100
+
/obj/item/weapon/rcd/combat
name = "combat RCD"
max_matter = 500
diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm
new file mode 100644
index 00000000000..0655c0b4b8b
--- /dev/null
+++ b/code/game/objects/items/weapons/RCL.dm
@@ -0,0 +1,149 @@
+/obj/item/weapon/twohanded/rcl
+ name = "rapid cable layer (RCL)"
+ desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rcl-0"
+ item_state = "rcl-0"
+ opacity = 0
+ force = 5 //Plastic is soft
+ throwforce = 5
+ throw_speed = 1
+ throw_range = 7
+ w_class = WEIGHT_CLASS_NORMAL
+ origin_tech = "engineering=4;materials=4"
+ var/max_amount = 90
+ var/active = 0
+ var/obj/structure/cable/last = null
+ var/obj/item/stack/cable_coil/loaded = null
+
+/obj/item/weapon/twohanded/rcl/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if(!loaded)
+ if(user.drop_item())
+ loaded = W
+ loaded.forceMove(src)
+ loaded.max_amount = max_amount //We store a lot.
+ else
+ to_chat(user, "[user.get_active_hand()] is stuck to your hand! ")
+ return
+ else
+ if(loaded.amount < max_amount)
+ var/amount = min(loaded.amount + C.amount, max_amount)
+ C.use(amount - loaded.amount)
+ loaded.amount = amount
+ else
+ return
+ update_icon()
+ to_chat(user, "You add the cables to the [src]. It now contains [loaded.amount]. ")
+ else if(isscrewdriver(W))
+ if(!loaded)
+ return
+ to_chat(user, "You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires. ")
+ while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
+ var/diff = loaded.amount % 30
+ if(diff)
+ loaded.use(diff)
+ new /obj/item/stack/cable_coil(user.loc, diff)
+ else
+ loaded.use(30)
+ new /obj/item/stack/cable_coil(user.loc, 30)
+ loaded.max_amount = initial(loaded.max_amount)
+ loaded.forceMove(user.loc)
+ user.put_in_hands(loaded)
+ loaded = null
+ update_icon()
+ else
+ ..()
+
+/obj/item/weapon/twohanded/rcl/examine(mob/user)
+ ..()
+ if(loaded)
+ to_chat(user, "It contains [loaded.amount]/[max_amount] cables. ")
+
+/obj/item/weapon/twohanded/rcl/Destroy()
+ QDEL_NULL(loaded)
+ last = null
+ active = 0
+ return ..()
+
+/obj/item/weapon/twohanded/rcl/update_icon()
+ if(!loaded)
+ icon_state = "rcl-0"
+ item_state = "rcl-0"
+ return
+ switch(loaded.amount)
+ if(61 to INFINITY)
+ icon_state = "rcl-30"
+ item_state = "rcl"
+ if(31 to 60)
+ icon_state = "rcl-20"
+ item_state = "rcl"
+ if(1 to 30)
+ icon_state = "rcl-10"
+ item_state = "rcl"
+ else
+ icon_state = "rcl-0"
+ item_state = "rcl-0"
+
+/obj/item/weapon/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
+ update_icon()
+ if(!loaded || !loaded.amount)
+ if(loud)
+ to_chat(user, "The last of the cables unreel from [src]. ")
+ if(loaded)
+ qdel(loaded)
+ loaded = null
+ unwield(user)
+ active = wielded
+ return 1
+ return 0
+
+/obj/item/weapon/twohanded/rcl/dropped(mob/wearer)
+ ..()
+ active = 0
+ last = null
+
+/obj/item/weapon/twohanded/rcl/attack_self(mob/user)
+ ..()
+ active = wielded
+ if(!active)
+ last = null
+ else if(!last)
+ for(var/obj/structure/cable/C in get_turf(user))
+ if(C.d1 == 0 || C.d2 == 0)
+ last = C
+ break
+
+/obj/item/weapon/twohanded/rcl/on_mob_move(direct, mob/user)
+ if(active)
+ trigger(user)
+
+/obj/item/weapon/twohanded/rcl/proc/trigger(mob/user)
+ if(is_empty(user, 0))
+ to_chat(user, "\The [src] is empty! ")
+ return
+ if(last)
+ if(get_dist(last, user) == 1) //hacky, but it works
+ var/turf/T = get_turf(user)
+ if(!isturf(T) || T.intact || !T.can_have_cabling())
+ last = null
+ return
+ if(get_dir(last, user) == last.d2)
+ //Did we just walk backwards? Well, that's the one direction we CAN'T complete a stub.
+ last = null
+ return
+ loaded.cable_join(last, user)
+ if(is_empty(user))
+ return //If we've run out, display message and exit
+ else
+ last = null
+ last = loaded.place_turf(get_turf(loc), user, turn(user.dir, 180))
+ is_empty(user) //If we've run out, display message
+
+/obj/item/weapon/twohanded/rcl/pre_loaded/New() //Comes preloaded with cable, for testing stuff
+ ..()
+ loaded = new()
+ loaded.max_amount = max_amount
+ loaded.amount = max_amount
+ update_icon()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index 7cbe5783a9a..ddeefa002b0 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -6,14 +6,14 @@ RSF
/obj/item/weapon/rsf
name = "\improper Rapid-Service-Fabricator"
desc = "A device used to rapidly deploy service items."
- icon = 'icons/obj/items.dmi'
- icon_state = "rcd"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rsf"
opacity = 0
density = 0
anchored = 0.0
var/matter = 0
var/mode = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/rsf/New()
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
@@ -69,7 +69,7 @@ RSF
if(istype(A, /obj/structure/table) && matter >= 1)
to_chat(user, "Dispensing Dosh...")
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
- new /obj/item/weapon/spacecash/c10( A.loc )
+ new /obj/item/stack/spacecash/c10( A.loc )
if(isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
@@ -83,7 +83,7 @@ RSF
if(istype(A, /turf/simulated/floor) && matter >= 1)
to_chat(user, "Dispensing Dosh...")
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
- new /obj/item/weapon/spacecash/c10( A )
+ new /obj/item/stack/spacecash/c10( A )
if(isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
@@ -231,4 +231,4 @@ RSF
matter--
to_chat(user, "The RSF now holds [matter]/30 fabrication-units.")
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm
index 922f4004714..49258c05c4e 100644
--- a/code/game/objects/items/weapons/alien_specific.dm
+++ b/code/game/objects/items/weapons/alien_specific.dm
@@ -12,8 +12,8 @@
throwforce_on = 5
throw_speed = 1
throw_range = 5
- w_class = 2
- w_class_on = 2
+ w_class = WEIGHT_CLASS_SMALL
+ w_class_on = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "slashed", "gored", "sliced", "torn", "ripped", "butchered", "cut")
attack_verb_on = list()
diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm
index 8a15bc7f517..229a025a18f 100644
--- a/code/game/objects/items/weapons/bee_briefcase.dm
+++ b/code/game/objects/items/weapons/bee_briefcase.dm
@@ -11,13 +11,17 @@
force = 10
throw_speed = 2
throw_range = 4
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/bees_left = 10
var/list/blood_list = list()
var/sound_file = 'sound/misc/briefcase_bees.ogg'
var/next_sound = 0
+/obj/item/weapon/bee_briefcase/Destroy()
+ blood_list.Cut()
+ return ..()
+
/obj/item/weapon/bee_briefcase/examine(mob/user)
..()
if(loc == user)
@@ -46,13 +50,10 @@
to_chat(user, "The buzzing inside the briefcase swells momentarily, then returns to normal. Guess it was too cramped... ")
S.reagents.clear_reagents()
S.update_icon()
- else if(istype(I, /obj/item/weapon/plantspray))
- var/obj/item/weapon/plantspray/PS = I
- user.drop_item(PS)
- bees_left = max(0, (bees_left - PS.pest_kill_str))
- to_chat(user, "You spray [PS] into \the [src].")
+ else if(istype(I, /obj/item/weapon/reagent_containers/spray/pestspray))
+ bees_left = max(0, (bees_left - 6))
+ to_chat(user, "You spray [I] into [src].")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- qdel(PS)
/obj/item/weapon/bee_briefcase/attack_self(mob/user as mob)
if(!bees_left)
@@ -73,6 +74,6 @@
//Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee
for(var/bee = min(5, bees_left), bee > 0, bee--)
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
- B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
+ B.master_and_friends = blood_list.Copy() //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.forceMove(get_turf(user)) //RELEASE THE BEES!
bees_left -= 5
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index d1721c5c247..826cd386f3c 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -15,7 +15,7 @@
name = "card"
desc = "A card."
icon = 'icons/obj/card.dmi'
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/associated_account_number = 0
var/list/files = list( )
@@ -397,6 +397,7 @@
"medical",
"HoS",
"research",
+ "cargo",
"engineering",
"CMO",
"RD",
@@ -605,6 +606,12 @@
name = "Prisoner #13-007"
registered_name = "Prisoner #13-007"
+/obj/item/weapon/card/id/prisoner/random
+/obj/item/weapon/card/id/prisoner/random/New()
+ var/random_number = "#[rand(0, 99)]-[rand(0, 999)]"
+ name = "Prisoner [random_number]"
+ registered_name = name
+
/obj/item/weapon/card/id/salvage_captain
name = "Captain's ID"
registered_name = "Captain"
@@ -714,6 +721,18 @@
desc = "A modified ID card given only to those people who have devoted their lives to the better interests of Nanotrasen. It sparkles blue."
icon_state = "lifetimeid"
+/obj/item/weapon/card/id/ert
+ name = "ERT ID"
+ icon_state = "ERT_empty"
+
+/obj/item/weapon/card/id/ert/commander
+ icon_state = "ERT_leader"
+/obj/item/weapon/card/id/ert/security
+ icon_state = "ERT_security"
+/obj/item/weapon/card/id/ert/engineering
+ icon_state = "ERT_engineering"
+/obj/item/weapon/card/id/ert/medic
+ icon_state = "ERT_medical"
// Decals
/obj/item/weapon/id_decal
name = "identification card decal"
@@ -757,7 +776,7 @@
override_name = 1
/proc/get_station_card_skins()
- return list("data","id","gold","silver","security","medical","research","engineering","HoS","CMO","RD","CE","clown","mime","rainbow","prisoner")
+ return list("data","id","gold","silver","security","medical","research","cargo","engineering","HoS","CMO","RD","CE","clown","mime","rainbow","prisoner")
/proc/get_centcom_card_skins()
return list("centcom","centcom_old","nanotrasen","ERT_leader","ERT_empty","ERT_security","ERT_engineering","ERT_medical","ERT_janitorial","deathsquad","commander","syndie","TDred","TDgreen")
@@ -769,6 +788,8 @@
switch(skin)
if("id")
return "Standard"
+ if("cargo")
+ return "Supply"
if("HoS")
return "Head of Security"
if("CMO")
diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm
index 3608d7861f3..507b19d9f7a 100644
--- a/code/game/objects/items/weapons/cash.dm
+++ b/code/game/objects/items/weapons/cash.dm
@@ -1,125 +1,59 @@
-var/global/list/moneytypes=list(
- /obj/item/weapon/spacecash/c1000 = 1000,
- /obj/item/weapon/spacecash/c500 = 500,
- /obj/item/weapon/spacecash/c200 = 200,
- /obj/item/weapon/spacecash/c100 = 100,
- /obj/item/weapon/spacecash/c50 = 50,
- /obj/item/weapon/spacecash/c20 = 20,
- /obj/item/weapon/spacecash/c10 = 10,
- /obj/item/weapon/spacecash = 1,
-)
-
-/obj/item/weapon/spacecash
- name = "credit chip"
+/obj/item/stack/spacecash
+ name = "1 Credit"
desc = "Money money money."
- gender = PLURAL
- icon = 'icons/obj/money.dmi'
- icon_state = "cash1"
- opacity = 0
- density = 0
- anchored = 0.0
- force = 1.0
- throwforce = 1.0
+ icon = 'icons/goonstation/objects/money.dmi'
+ icon_state = "cashgreen"
+ hitsound = "swing_hit"
+ force = 1
+ throwforce = 1
throw_speed = 1
- throw_range = 2
- w_class = 1
+ throw_range = 7
+ w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
- var/access = list()
- access = access_crate_cash
- var/worth = 1 // Per chip
- var/amount = 1 // number of chips
- var/stack_color = "#4E054F"
+ singular_name = "credit"
+ max_amount = 1000000
+ merge_type = /obj/item/stack/spacecash
-/obj/item/weapon/spacecash/New(var/new_loc,var/new_amount=1)
- loc = new_loc
- name = "[worth] credit chip"
- amount = new_amount
+/obj/item/stack/spacecash/New(loc, amt = null)
+ ..()
update_icon()
-/obj/item/weapon/spacecash/examine(mob/user)
- if(amount>1)
- to_chat(user, "[bicon(src)] This is a stack of [amount] [src]s.")
+/obj/item/stack/spacecash/update_icon()
+ ..()
+ name = "[amount == max_amount ? "1000000" : amount] Credit[amount > 1 ? "s" : ""]"
+ if(amount >= 1 && amount < 10)
+ icon_state = "cashgreen"
+ else if(amount >= 10 && amount < 50)
+ icon_state = "spacecash"
+ else if(amount >= 50 && amount < 500)
+ icon_state = "cashblue"
+ else if(amount >= 500 && amount < 1000)
+ icon_state = "cashindi"
+ else if(amount >= 1000 && amount < 1000000)
+ icon_state = "cashpurp"
else
- to_chat(user, "[bicon(src)] This is \a [src]s.")
- to_chat(user, "It's worth [worth*amount] credits.")
+ icon_state = "cashrbow"
-/obj/item/weapon/spacecash/update_icon()
- icon_state = "cash[worth]"
- // Up to 100 items per stack.
- pixel_x=rand(-7,7)
- pixel_y=rand(-14,14)
+/obj/item/stack/spacecash/c10
+ amount = 10
-/obj/item/weapon/spacecash/proc/collect_from(var/obj/item/weapon/spacecash/cash)
- if(cash.worth == src.worth)
- var/taking = min(100-src.amount,cash.amount)
- cash.amount -= taking
- src.amount += taking
- if(cash.amount <= 0)
- qdel(cash)
- return taking
- return 0
+/obj/item/stack/spacecash/c20
+ amount = 20
-/obj/item/weapon/spacecash/afterattack(atom/A as mob|obj, mob/user as mob)
- if(istype(A, /turf) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack))
- var/turf/T = get_turf(A)
- var/collected = 0
- for(var/obj/item/weapon/spacecash/cash in T)
- if(cash.worth == src.worth)
- collected += collect_from(cash)
- if(collected)
- update_icon()
- to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash. ")
- else if(istype(A,/obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/cash = A
- var/collected = src.collect_from(cash)
- if(collected)
- update_icon()
- to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash. ")
+/obj/item/stack/spacecash/c50
+ amount = 50
+/obj/item/stack/spacecash/c100
+ amount = 100
-/obj/item/weapon/spacecash/proc/get_total()
- return worth * amount
+/obj/item/stack/spacecash/c200
+ amount = 200
-/obj/item/weapon/spacecash/c10
- icon_state = "cash10"
- worth = 10
+/obj/item/stack/spacecash/c500
+ amount = 500
-/obj/item/weapon/spacecash/c20
- icon_state = "cash10"
- worth = 20
+/obj/item/stack/spacecash/c1000
+ amount = 1000
-/obj/item/weapon/spacecash/c50
- icon_state = "cash10"
- worth = 50
-
-/obj/item/weapon/spacecash/c100
- icon_state = "cash100"
- worth = 100
-
-/obj/item/weapon/spacecash/c200
- icon_state = "cash200"
- worth = 200
-
-/obj/item/weapon/spacecash/c500
- icon_state = "cash500"
- worth = 500
-
-/obj/item/weapon/spacecash/c1000
- icon_state = "cash1000"
- worth = 1000
-
-/proc/dispense_cash(var/amount, var/loc)
- for(var/cashtype in moneytypes)
- var/slice = moneytypes[cashtype]
- var/dispense_count = Floor(amount/slice)
- amount = amount % slice
- while(dispense_count>0)
- var/dispense_this_time = min(dispense_count,100)
- if(dispense_this_time > 0)
- new cashtype(loc,dispense_this_time)
- dispense_count -= dispense_this_time
-
-/proc/count_cash(var/list/cash)
- . = 0
- for(var/obj/item/weapon/spacecash/C in cash)
- . += C.get_total()
\ No newline at end of file
+/obj/item/stack/spacecash/c1000000
+ amount = 1000000
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm
index 6e57028472e..250aff951fd 100644
--- a/code/game/objects/items/weapons/caution.dm
+++ b/code/game/objects/items/weapons/caution.dm
@@ -7,7 +7,7 @@
throwforce = 3.0
throw_speed = 1
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
proximity_sign
@@ -22,7 +22,7 @@
return
if(armed)
armed = 0
- to_chat(user, "\blue You disarm \the [src].")
+ to_chat(user, "You disarm \the [src]. ")
return
timing = !timing
if(timing)
@@ -30,7 +30,7 @@
else
armed = 0
timepassed = 0
- to_chat(H, "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]")
+ to_chat(H, "You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."] ")
process()
if(!timing)
diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm
index 71e09a3cf0d..ef1e2c91498 100644
--- a/code/game/objects/items/weapons/chrono_eraser.dm
+++ b/code/game/objects/items/weapons/chrono_eraser.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronobackpack"
item_state = "backpack"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun)
@@ -46,7 +46,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronogun"
item_state = "chronogun"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
flags = NODROP
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
can_charge = 0
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index 8449e17a9db..766fe92c1ee 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -20,7 +20,7 @@ LIGHTERS ARE IN LIGHTERS.DM
throw_speed = 0.5
item_state = "cigoff"
slot_flags = SLOT_EARS|SLOT_MASK
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
body_parts_covered = null
attack_verb = list("burnt", "singed")
var/lit = 0
@@ -42,11 +42,12 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/New()
..()
- flags |= NOREACT // so it doesn't react until you light it
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 30
+ reagents.set_reacting(FALSE) // so it doesn't react until you light it
/obj/item/clothing/mask/cigarette/Destroy()
- qdel(reagents)
+ QDEL_NULL(reagents)
+ processing_objects -= src
return ..()
/obj/item/clothing/mask/cigarette/attack(var/mob/living/M, var/mob/living/user, def_zone)
@@ -92,6 +93,17 @@ LIGHTERS ARE IN LIGHTERS.DM
else if(istype(W, /obj/item/device/assembly/igniter))
light("[user] fiddles with [W], and manages to light their [name]. ")
+ else if(istype(W, /obj/item/weapon/gun/magic/wand/fireball))
+ var/obj/item/weapon/gun/magic/wand/fireball/F = W
+ if(F.charges)
+ if(prob(50) || user.mind.assigned_role == "Wizard")
+ light("Holy shit, did [user] just manage to light their [name] with [W], with only moderate eyebrow singing? ")
+ else
+ to_chat(user, "Unsure which end of the wand is which, [user] fails to light [name] with [W]. ")
+ explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
+ F.charges--
+
+
//can't think of any other way to update the overlays :<
user.update_inv_wear_mask()
user.update_inv_l_hand()
@@ -135,7 +147,7 @@ LIGHTERS ARE IN LIGHTERS.DM
M.unEquip(src, 1)
qdel(src)
return
- flags &= ~NOREACT // allowing reagents to react after being lit
+ reagents.set_reacting(TRUE)
reagents.handle_reactions()
icon_state = icon_on
item_state = icon_on
@@ -205,9 +217,9 @@ LIGHTERS ARE IN LIGHTERS.DM
var/random_reagent = pick("fuel","saltpetre","synaptizine","green_vomit","potass_iodide","msg","lexorin","mannitol","spaceacillin","cryoxadone","holywater","tea","egg","haloperidol","mutagen","omnizine","carpet","aranesp","cryostylane","chocolate","bilk","cheese","rum","blood","charcoal","coffee","ectoplasm","space_drugs","milk","mutadone","antihol","teporone","insulin","salbutamol","toxin")
reagents.add_reagent(random_reagent, 10)
-/obj/item/clothing/mask/cigarette/joint
- name = "joint"
- desc = "A roll of ambrosium vulgaris wrapped in a thin paper. Dude."
+/obj/item/clothing/mask/cigarette/rollie
+ name = "rollie"
+ desc = "A roll of dried plant matter wrapped in thin paper."
icon_state = "spliffoff"
icon_on = "spliffon"
icon_off = "spliffoff"
@@ -217,35 +229,21 @@ LIGHTERS ARE IN LIGHTERS.DM
smoketime = 180
chem_volume = 50
-/obj/item/clothing/mask/cigarette/joint/New()
+/obj/item/clothing/mask/cigarette/rollie/New()
..()
- var/list/jointnames = list("joint","doobie","spliff","blunt")
- name = pick(jointnames)
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
-/obj/item/clothing/mask/cigarette/joint/deus
- desc = "A roll of ambrosium deus wrapped in a thin paper. Dude."
/obj/item/weapon/cigbutt/roach
name = "roach"
- desc = "A manky old roach."
+ desc = "A manky old roach, or for non-stoners, a used rollup."
icon_state = "roach"
/obj/item/weapon/cigbutt/roach/New()
..()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
-
-/obj/item/clothing/mask/cigarette/handroll
- name = "hand-rolled cigarette"
- desc = "A roll of tobacco and nicotine, freshly rolled by hand."
- icon_state = "hr_cigoff"
- item_state = "hr_cigoff"
- icon_on = "hr_cigon" //Note - these are in masks.dmi not in cigarette.dmi
- icon_off = "hr_cigoff"
- type_butt = /obj/item/weapon/cigbutt
- chem_volume = 50
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
////////////
// CIGARS //
@@ -287,7 +285,7 @@ LIGHTERS ARE IN LIGHTERS.DM
desc = "A manky old cigarette butt."
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "cigbutt"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 1
/obj/item/weapon/cigbutt/New()
@@ -386,51 +384,30 @@ LIGHTERS ARE IN LIGHTERS.DM
///////////
//ROLLING//
///////////
-obj/item/weapon/rollingpaper
+/obj/item/weapon/rollingpaper
name = "rolling paper"
desc = "A thin piece of paper used to make fine smokeables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig_paper"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
-
-obj/item/weapon/rollingpaperpack
- name = "rolling paper pack"
- desc = "A pack of Nanotrasen brand rolling papers."
- icon = 'icons/obj/cigarettes.dmi'
- icon_state = "cig_paper_pack"
- w_class = 1
- var/papers = 25
-
-obj/item/weapon/rollingpaperpack/attack_self(mob/user)
- if(papers > 1)
- var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper()
- user.put_in_inactive_hand(P)
- to_chat(user, "You take a paper out of the pack.")
- papers --
- else
- var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper()
- user.put_in_inactive_hand(P)
- to_chat(user, "You take the last paper out of the pack, and throw the pack away.")
- qdel(src)
-
-/obj/item/weapon/rollingpaperpack/MouseDrop(atom/over_object)
- var/mob/M = usr
- if(M.restrained() || M.stat)
+/obj/item/weapon/rollingpaper/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
return
-
- if(over_object == M)
- M.put_in_hands(src)
-
- else if(istype(over_object, /obj/screen))
- switch(over_object.name)
- if("r_hand")
- M.unEquip(src)
- M.put_in_r_hand(src)
- if("l_hand")
- M.unEquip(src)
- M.put_in_l_hand(src)
-
-/obj/item/weapon/rollingpaperpack/examine(mob/user)
- ..(user)
- to_chat(user, "There are [src.papers] left")
+ if(istype(target, /obj/item/weapon/reagent_containers/food/snacks/grown))
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/O = target
+ if(O.dry)
+ user.unEquip(target, 1)
+ user.unEquip(src, 1)
+ var/obj/item/clothing/mask/cigarette/rollie/R = new /obj/item/clothing/mask/cigarette/rollie(user.loc)
+ R.chem_volume = target.reagents.total_volume
+ target.reagents.trans_to(R, R.chem_volume)
+ user.put_in_active_hand(R)
+ to_chat(user, "You roll the [target.name] into a rolling paper. ")
+ R.desc = "Dried [target.name] rolled up in a thin piece of paper."
+ qdel(target)
+ qdel(src)
+ else
+ to_chat(user, "You need to dry this first! ")
+ else
+ ..()
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index aea1ebd3e1b..bb69ffaee50 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -5,26 +5,6 @@
* Bike Horns
*/
-/*
- * Banana Peals
- */
-
-/obj/item/weapon/bananapeel
- name = "banana peel"
- desc = "A peel from a banana."
- icon = 'icons/obj/items.dmi'
- icon_state = "banana_peel"
- item_state = "banana_peel"
- w_class = 1
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
- if(istype(AM, /mob/living/carbon))
- var/mob/living/carbon/M = AM
- M.slip("banana peel", 4, 2)
-
/*
* Soap
*/
@@ -33,7 +13,7 @@
var/mob/living/carbon/M = AM
M.slip("soap", 4, 2)
-/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity)
+/obj/item/weapon/soap/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
//I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
@@ -57,11 +37,14 @@
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
+ if(istype(target, /turf/simulated))
+ var/turf/simulated/T = target
+ T.dirt = 0
return
/obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob)
if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" )
- user.visible_message("\red \the [user] washes \the [target]'s mouth out with [src.name]!")
+ user.visible_message("\the [user] washes \the [target]'s mouth out with [src.name]! ")
return
..()
@@ -77,7 +60,7 @@
item_state = "bike_horn"
hitsound = null
throwforce = 3
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 15
attack_verb = list("HONKED")
@@ -129,4 +112,4 @@
var/mob/living/carbon/human/H = M
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
continue
- M.emote("flip")
\ No newline at end of file
+ M.emote("flip")
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index e60a68f42d6..d480f8f4010 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -3,7 +3,7 @@
desc = "A generic brand of lipstick."
icon = 'icons/obj/items.dmi'
icon_state = "lipstick"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/colour = "red"
var/open = 0
@@ -86,7 +86,9 @@
icon = 'icons/obj/items.dmi'
icon_state = "razor"
flags = CONDUCT
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
+ usesound = 'sound/items/Welder2.ogg'
+ toolspeed = 1
/obj/item/weapon/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
if(ishuman(M))
@@ -106,24 +108,24 @@
if(H == user) //shaving yourself
user.visible_message("[user] starts to shave their facial hair with \the [src]. ", \
"You take a moment shave your facial hair with \the [src]. ")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
user.visible_message("[user] shaves his facial hair clean with the [src]. ", \
"You finish shaving with the [src]. Fast and clean! ")
C.f_style = "Shaved"
H.update_fhair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(src.loc, usesound, 20, 1)
else
var/turf/user_loc = user.loc
var/turf/H_loc = H.loc
user.visible_message("[user] tries to shave [H]'s facial hair with \the [src]. ", \
"You start shaving [H]'s facial hair. ")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("[user] shaves off [H]'s facial hair with \the [src]. ", \
"You shave [H]'s facial hair clean off. ")
C.f_style = "Shaved"
H.update_fhair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(src.loc, usesound, 20, 1)
if(user.zone_sel.selecting == "head")
if(!get_location_accessible(H, "head"))
to_chat(user, "The headgear is in the way. ")
@@ -134,28 +136,31 @@
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "There is not enough hair left to shave... ")
return
+ if(M.get_species() == "Skrell")
+ to_chat(user, "Your razor isn't going to cut through tentacles. ")
+ return
if(H == user) //shaving yourself
user.visible_message("[user] starts to shave their head with \the [src]. ", \
"You start to shave your head with \the [src]. ")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
user.visible_message("[user] shaves his head with the [src]. ", \
"You finish shaving with the [src]. ")
C.h_style = "Skinhead"
H.update_hair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
+ playsound(src.loc, usesound, 40, 1)
else
var/turf/user_loc = user.loc
var/turf/H_loc = H.loc
user.visible_message("[user] tries to shave [H]'s head with \the [src]! ", \
"You start shaving [H]'s head. ")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("[user] shaves [H]'s head bald with \the [src]! ", \
"You shave [H]'s head bald. ")
C.h_style = "Skinhead"
H.update_hair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
+ playsound(src.loc, usesound, 40, 1)
else
..()
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm
index 055faa03a8c..0f5671f8e1a 100644
--- a/code/game/objects/items/weapons/courtroom.dm
+++ b/code/game/objects/items/weapons/courtroom.dm
@@ -9,7 +9,7 @@
icon_state = "gavelhammer"
force = 5.0
throwforce = 6.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("bashed", "battered", "judged", "whacked")
burn_state = FLAMMABLE
@@ -25,7 +25,7 @@
icon_state = "gavelblock"
force = 2.0
throwforce = 2.0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
@@ -33,4 +33,4 @@
playsound(loc, 'sound/items/gavel.ogg', 100, 1)
user.visible_message("[user] strikes \the [src] with \the [I]. ")
else
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index eda6d74b296..b7f337e6155 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -9,7 +9,7 @@
slot_flags = SLOT_BACK
force = 5
throwforce = 6
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
origin_tech = "biotech=4"
actions_types = list(/datum/action/item_action/toggle_paddles)
species_fit = list("Vox")
@@ -172,12 +172,8 @@
if(on)
var/M = get(paddles, /mob)
remove_paddles(M)
- if(paddles)
- qdel(paddles)
- paddles = null
- if(bcell)
- qdel(bcell)
- bcell = null
+ QDEL_NULL(paddles)
+ QDEL_NULL(bcell)
return ..()
/obj/item/weapon/defibrillator/proc/deductcharge(var/chrgdeductamt)
@@ -210,7 +206,7 @@
desc = "A belt-equipped defibrillator that can be rapidly deployed."
icon_state = "defibcompact"
item_state = "defibcompact"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BELT
origin_tech = "biotech=4"
@@ -255,7 +251,8 @@
item_state = "defibpaddles"
force = 0
throwforce = 6
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
+ toolspeed = 1
var/revivecost = 1000
var/cooldown = 0
@@ -333,8 +330,8 @@
H.updatehealth() //forces health update before next life tick
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
- if(!H.heart_attack && (prob(10) || defib.combat)) // Your heart explodes.
- H.heart_attack = 1
+ if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
+ H.set_heartattack(TRUE)
add_logs(user, M, "stunned", object="defibrillator")
defib.deductcharge(revivecost)
cooldown = 1
@@ -346,7 +343,7 @@
user.visible_message("[user] begins to place [src] on [M.name]'s chest. ", "You begin to place [src] on [M.name]'s chest. ")
busy = 1
update_icon()
- if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
+ if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("[user] places [src] on [M.name]'s chest. ", "You place [src] on [M.name]'s chest. ")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
@@ -362,7 +359,7 @@
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
var/total_burn = 0
var/total_brute = 0
- if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
+ if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
for(var/obj/item/carried_item in H.contents)
if(istype(carried_item, /obj/item/clothing/suit/space))
if(!defib.combat)
@@ -371,7 +368,7 @@
busy = 0
update_icon()
return
- if(H.heart_attack)
+ if(H.undergoing_cardiac_arrest())
if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart
user.visible_message("[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity. ")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
@@ -379,7 +376,7 @@
update_icon()
return
else
- H.heart_attack = 0
+ H.set_heartattack(FALSE)
user.visible_message("[defib] pings: Cardiac arrhythmia corrected. ")
M.visible_message("[M]'s body convulses a bit.")
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
@@ -396,7 +393,7 @@
M.visible_message("[M]'s body convulses a bit.")
playsound(get_turf(src), "bodyfall", 50, 1)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
- for(var/obj/item/organ/external/O in H.organs)
+ for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
@@ -424,6 +421,7 @@
else if(ghost)
user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed. ")
to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)")
+ window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("[defib] buzzes: Resuscitation failed. ")
@@ -448,12 +446,13 @@
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
force = 0
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
var/revivecost = 1000
var/cooldown = 0
var/busy = 0
var/safety = 1
flags = NODROP
+ toolspeed = 1
/obj/item/weapon/borg_defib/attack(mob/M, mob/user)
var/tobehealed
@@ -475,8 +474,8 @@
H.adjustStaminaLoss(50)
H.Weaken(5)
H.updatehealth() //forces health update before next life tick
- if(!H.heart_attack && prob(10)) // Your heart explodes.
- H.heart_attack = 1
+ if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
+ H.set_heartattack(TRUE)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
add_logs(user, M, "stunned", object="defibrillator")
@@ -494,7 +493,7 @@
user.visible_message("[user] begins to place [src] on [M.name]'s chest. ", "You begin to place [src] on [M.name]'s chest. ")
busy = 1
update_icon()
- if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
+ if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("[user] places [src] on [M.name]'s chest. ", "You place [src] on [M.name]'s chest. ")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
@@ -510,13 +509,13 @@
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
var/total_burn = 0
var/total_brute = 0
- if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
+ if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
if(H.stat == 2)
var/health = H.health
M.visible_message("[M]'s body convulses a bit.")
playsound(get_turf(src), "bodyfall", 50, 1)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
- for(var/obj/item/organ/external/O in H.organs)
+ for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
@@ -546,6 +545,7 @@
else if(ghost)
user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed. ")
to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)")
+ window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("[user] buzzes: Resuscitation failed. ")
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index 5714f5e4310..7871f19e91a 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -29,7 +29,7 @@
desc = "A die with six sides. Basic and servicable."
icon = 'icons/obj/dice.dmi'
icon_state = "d6"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/sides = 6
var/result = null
var/list/special_faces = list() //entries should match up to sides var if used
@@ -111,10 +111,10 @@
/obj/item/weapon/dice/attack_self(mob/user as mob)
diceroll(user)
-/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user as mob)
+/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
if(!..())
return
- diceroll(user)
+ diceroll(thrower)
/obj/item/weapon/dice/proc/diceroll(mob/user)
result = rand(1, sides)
@@ -133,7 +133,7 @@
user.visible_message("[user] has thrown [src]. It lands on [result]. [comment] ", \
"You throw [src]. It lands on [result]. [comment] ", \
"You hear [src] rolling, it sounds like a [fake_result]. ")
- else if(src.throwing == 0) //Dice was thrown and is coming to rest
+ else if(!throwing) //Dice was thrown and is coming to rest
visible_message("[src] rolls to a stop, landing on [result]. [comment] ")
/obj/item/weapon/dice/d20/e20/diceroll(mob/user as mob, thrown)
diff --git a/code/game/objects/items/weapons/disks.dm b/code/game/objects/items/weapons/disks.dm
index 1458dab9945..58f590dc629 100644
--- a/code/game/objects/items/weapons/disks.dm
+++ b/code/game/objects/items/weapons/disks.dm
@@ -1,3 +1,5 @@
/obj/item/weapon/disk
- name = "disk"
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/module.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ item_state = "card-id"
+ icon_state = "datadisk0"
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 45aabc2c073..b583b3e2c25 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -5,10 +5,10 @@
icon_state = "dnainjector"
item_state = "dnainjector"
var/block = 0
- var/datum/dna2/record/buf=null
+ var/datum/dna2/record/buf = null
throw_speed = 3
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "biotech=1"
var/damage_coeff = 1
@@ -26,6 +26,10 @@
buf.dna.ResetSE()
SetValue(value)
+/obj/item/weapon/dnainjector/Destroy()
+ QDEL_NULL(buf)
+ return ..()
+
/obj/item/weapon/dnainjector/proc/GetRealBlock(var/selblock)
if(selblock==0)
return block
@@ -115,8 +119,8 @@
if(!user.IsAdvancedToolUser())
return 0
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey]) ")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.ckey]) ")
+ M.create_attack_log("Has been injected with [name] by [user.name] ([user.ckey]) ")
+ user.create_attack_log("Used the [name] to inject [M.name] ([M.ckey]) ")
log_attack("[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])")
if(!iscarbon(user))
@@ -128,17 +132,17 @@
if(block)
if(GetState() && block == MONKEYBLOCK && ishuman(M))
- message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] (MONKEY) ")
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
- log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] (MONKEY) ")
else
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name]")
else
if(GetState(MONKEYBLOCK) && ishuman(M))
- message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] (MONKEY) ")
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
- log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
+ log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] (MONKEY) ")
else
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name]")
diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm
index 24c977ddb2d..e691fce0961 100644
--- a/code/game/objects/items/weapons/dnascrambler.dm
+++ b/code/game/objects/items/weapons/dnascrambler.dm
@@ -22,16 +22,22 @@
if(src.used)
return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.flags & NO_DNA)
+ to_chat(user, "You failed to inject [M], as they have no DNA to scramble, nor flesh to inject. ")
+ return
+
if(M == user)
- user.visible_message("[user.name] injects \himself with [src]! ")
+ user.visible_message("[user] injects \himself with [src]! ")
src.injected(user,user)
else
- user.visible_message("[user.name] is trying to inject [M.name] with [src]! ")
+ user.visible_message("[user] is trying to inject [M] with [src]! ")
if(do_mob(user,M,30))
- user.visible_message("[user.name] injects [M.name] with [src]. ")
+ user.visible_message("[user] injects [M] with [src]. ")
src.injected(M, user)
else
- to_chat(user, "\red You failed to inject [M.name].")
+ to_chat(user, "You failed to inject [M]. ")
proc/injected(var/mob/living/carbon/target, var/mob/living/carbon/user)
scramble(1, target, 100)
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 3269aefde0e..13a9186058e 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -7,6 +7,7 @@
det_time = 10
display_timer = 0
origin_tech = "syndicate=2"
+ toolspeed = 1
var/atom/target = null
var/image_overlay = null
var/obj/item/device/assembly_holder/nadeassembly = null
@@ -17,10 +18,9 @@
..()
/obj/item/weapon/grenade/plastic/Destroy()
- qdel(nadeassembly)
- nadeassembly = null
+ QDEL_NULL(nadeassembly)
target = null
- ..()
+ return ..()
/obj/item/weapon/grenade/plastic/attackby(obj/item/I, mob/user, params)
if(!nadeassembly && istype(I, /obj/item/device/assembly_holder))
@@ -36,7 +36,7 @@
update_icon()
return
if(nadeassembly && istype(I, /obj/item/weapon/wirecutters))
- playsound(src, 'sound/items/Wirecutter.ogg', 20, 1)
+ playsound(src, I.usesound, 20, 1)
nadeassembly.loc = get_turf(src)
nadeassembly.master = null
nadeassembly = null
@@ -73,7 +73,7 @@
return
to_chat(user, "You start planting the [src]. The timer is set to [det_time]... ")
- if(do_after(user, 50, target = AM))
+ if(do_after(user, 50 * toolspeed, target = AM))
if(!user.unEquip(src))
return
src.target = AM
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 5fc704b7618..42874e05cf4 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -7,7 +7,7 @@
hitsound = 'sound/weapons/smash.ogg'
flags = CONDUCT
throwforce = 10
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
throw_range = 7
force = 10
@@ -29,7 +29,7 @@
hitsound = null //it is much lighter, after all.
flags = null //doesn't CONDUCT
throwforce = 2
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 3.0
materials = list()
max_water = 30
@@ -40,7 +40,7 @@
to_chat(usr, "[bicon(src)] [src.name] contains:")
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "\blue [R.volume] units of [R.name]")
+ to_chat(user, "[R.volume] units of [R.name] ")
/obj/item/weapon/extinguisher/New()
@@ -80,8 +80,7 @@
//TODO; Add support for reagents in water.
if(target.loc == user)//No more spraying yourself when putting your extinguisher away
return
- var/Refill = AttemptRefill(target, user)
- if(Refill)
+ if(AttemptRefill(target, user))
return
if(!safety)
if(src.reagents.total_volume < 1)
@@ -164,4 +163,4 @@
if(W.loc == my_target) break
sleep(2)
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 71dafff99ff..9adb05f15a7 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -11,7 +11,7 @@
throwforce = 10.0
throw_speed = 1
throw_range = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=500)
origin_tech = "combat=1;plasmatech=1"
var/status = 0
@@ -25,15 +25,10 @@
/obj/item/weapon/flamethrower/Destroy()
- if(weldtool)
- qdel(weldtool)
- weldtool = null
- if(igniter)
- qdel(igniter)
- igniter = null
- if(ptank)
- qdel(ptank)
- ptank = null
+ QDEL_NULL(weldtool)
+ QDEL_NULL(igniter)
+ QDEL_NULL(ptank)
+ previousturf = null
return ..()
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index a48bc19d512..be96e29f97a 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -8,11 +8,15 @@
name = "fiber wire"
desc = "A length of razor-thin wire with an elegant wooden handle on either end. You suspect you'd have to be behind the target to use this weapon effectively."
icon_state = "garrot_wrap"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/mob/living/carbon/human/strangling
var/improvised = 0
var/garrote_time
+/obj/item/weapon/twohanded/garrote/Destroy()
+ strangling = null
+ return ..()
+
/obj/item/weapon/twohanded/garrote/update_icon()
if(strangling) // If we're strangling someone we want our icon to stay wielded
icon_state = "garrot_unwrap"
@@ -70,7 +74,7 @@
to_chat(user, "You cannot use [src] on [M] from that angle! ")
return
- if(improvised && ((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))) // Improvised garrotes are blocked by mouth-covering items.
+ if(improvised && ((M.head && (M.head.flags_cover & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags_cover & MASKCOVERSMOUTH)))) // Improvised garrotes are blocked by mouth-covering items.
to_chat(user, "[M]'s neck is blocked by something they're wearing! ")
if(strangling)
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index d503ca04a8f..4e558f7b64e 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -31,7 +31,7 @@
user.put_in_active_hand(gift)
src.gift.add_fingerprint(user)
else
- to_chat(user, "\blue The gift was empty!")
+ to_chat(user, "The gift was empty! ")
qdel(src)
return
@@ -42,16 +42,16 @@
/obj/effect/spresent/relaymove(mob/user as mob)
if(user.stat)
return
- to_chat(user, "\blue You cant move.")
+ to_chat(user, "You cant move. ")
/obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if(!istype(W, /obj/item/weapon/wirecutters))
- to_chat(user, "\blue I need wirecutters for that.")
+ to_chat(user, "I need wirecutters for that. ")
return
- to_chat(user, "\blue You cut open the present.")
+ to_chat(user, "You cut open the present. ")
for(var/mob/M in src) //Should only be one but whatever.
M.loc = src.loc
@@ -71,7 +71,7 @@
/obj/item/weapon/pen/invisible,
/obj/item/weapon/lipstick/random,
/obj/item/weapon/grenade/smokebomb,
- /obj/item/weapon/corncob,
+ /obj/item/weapon/grown/corncob,
/obj/item/weapon/contraband/poster,
/obj/item/weapon/bikehorn,
/obj/item/weapon/beach_ball,
@@ -85,8 +85,8 @@
/obj/random/mech,
/obj/item/toy/spinningtoy,
/obj/item/toy/sword,
- /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
- /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/device/paicard,
/obj/item/device/violin,
/obj/item/device/guitar,
diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm
index 189b4eb77c0..6c672193bb6 100644
--- a/code/game/objects/items/weapons/grenades/bananade.dm
+++ b/code/game/objects/items/weapons/grenades/bananade.dm
@@ -4,12 +4,12 @@ var/turf/T
/obj/item/weapon/grenade/bananade
name = "bananade"
desc = "A yellow grenade."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/grenade.dmi'
icon_state = "banana"
item_state = "flashbang"
var/deliveryamt = 8
- var/spawner_type = /obj/item/weapon/bananapeel
+ var/spawner_type = /obj/item/weapon/grown/bananapeel
/obj/item/weapon/grenade/bananade/prime()
if(spawner_type && deliveryamt)
@@ -38,7 +38,7 @@ var/turf/T
/obj/item/weapon/grenade/bananade/casing/attackby(var/obj/item/I, mob/user as mob, params)
- if(istype(I, /obj/item/weapon/bananapeel))
+ if(istype(I, /obj/item/weapon/grown/bananapeel))
if(fillamt < 9)
to_chat(usr, "You add another banana peel to the assembly. ")
fillamt += 1
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index c49b2341f29..4221528e100 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -9,8 +9,9 @@
item_state = "flashbang"
var/bomb_state = "chembomb"
var/payload_name = null // used for spawned grenades
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 2
+ var/prime_sound = 'sound/items/Screwdriver2.ogg'
var/stage = EMPTY
var/list/beakers = list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
@@ -25,6 +26,10 @@
payload_name += " " // formatting, ignore me
update_icon()
+/obj/item/weapon/grenade/chem_grenade/Destroy()
+ QDEL_NULL(nadeassembly)
+ QDEL_LIST(beakers)
+ return ..()
/obj/item/weapon/grenade/chem_grenade/examine(mob/user)
..(user)
@@ -124,7 +129,7 @@
if(stage == WIRED)
if(beakers.len)
to_chat(user, "You lock the assembly. ")
- playsound(loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ playsound(loc, prime_sound, 25, -3)
stage = READY
update_icon()
var/contained = ""
@@ -265,7 +270,7 @@
has_reagents = 1
if(!has_reagents)
- playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1)
+ playsound(loc, usesound, 50, 1)
return
if(nadeassembly)
@@ -347,7 +352,7 @@
if(E.reagents.total_volume) has_reagents = 1
if(!has_reagents)
- playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1)
+ playsound(loc, prime_sound, 50, 1)
return
playsound(loc, 'sound/effects/bamf.ogg', 50, 1)
@@ -534,4 +539,4 @@
#undef EMPTY
#undef WIRED
-#undef READY
\ No newline at end of file
+#undef READY
diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm
index 1ce46b44957..0d24bd80a95 100644
--- a/code/game/objects/items/weapons/grenades/clowngrenade.dm
+++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm
@@ -3,7 +3,7 @@
desc = "HONK! brand Bananas. In a special applicator for rapid slipping of wide areas."
icon_state = "banana"
item_state = "flashbang"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 2.0
var/stage = 0
var/state = 0
@@ -23,7 +23,7 @@
for(var/direction in alldirs)
for(i = 0; i < 2; i++)
number++
- var/obj/item/weapon/bananapeel/traitorpeel/peel = new /obj/item/weapon/bananapeel/traitorpeel(get_turf(src.loc))
+ var/obj/item/weapon/grown/bananapeel/traitorpeel/peel = new /obj/item/weapon/grown/bananapeel/traitorpeel(get_turf(src.loc))
/* var/direction = pick(alldirs)
var/spaces = pick(1;150, 2)
var/a = 0
@@ -35,7 +35,7 @@
step(peel,direction)
else
step(peel,direction)
- new /obj/item/weapon/bananapeel/traitorpeel(get_turf(src.loc))
+ new /obj/item/weapon/grown/bananapeel/traitorpeel(get_turf(src.loc))
qdel(src)
return
/*
@@ -46,40 +46,32 @@
return
if(locate(/obj/structure/window) in T)
return
- new /obj/item/weapon/bananapeel/traitorpeel(T)
+ new /obj/item/weapon/grown/bananapeel/traitorpeel(T)
*/
-/obj/item/weapon/bananapeel/traitorpeel
- name = "banana peel"
- desc = "A peel from a banana."
- icon = 'icons/obj/items.dmi'
- icon_state = "banana_peel"
- item_state = "banana_peel"
- w_class = 1
- throwforce = 0
- throw_speed = 4
- throw_range = 20
+/obj/item/weapon/grown/bananapeel/traitorpeel
- Crossed(AM as mob|obj)
- var/burned = rand(2,5)
- if(istype(AM, /mob/living/carbon))
- var/mob/living/carbon/M = AM
- if(ishuman(M))
- if(isobj(M:shoes))
- if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP))
- return
- else
- to_chat(M, "\red Your feet feel like they're on fire!")
- M.take_overall_damage(0, max(0, (burned - 2)))
- if(!istype(M, /mob/living/carbon/slime) && !isrobot(M))
- M.slip("banana peel!", 0, 7, 4)
- M.take_organ_damage(2) // Was 5 -- TLE
- M.take_overall_damage(0, burned)
+/obj/item/weapon/grown/bananapeel/traitorpeel/Crossed(AM as mob|obj)
+ var/burned = rand(2,5)
+ if(istype(AM, /mob/living/carbon))
+ var/mob/living/carbon/M = AM
+ if(ishuman(M))
+ if(isobj(M:shoes))
+ if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP))
+ return
+ else
+ to_chat(M, "Your feet feel like they're on fire! ")
+ M.take_overall_damage(0, max(0, (burned - 2)))
- throw_impact(atom/hit_atom)
- var/burned = rand(1,3)
- if(istype(hit_atom ,/mob/living))
- var/mob/living/M = hit_atom
- M.take_organ_damage(0, burned)
- return ..()
\ No newline at end of file
+ if(!istype(M, /mob/living/carbon/slime) && !isrobot(M))
+ M.slip("banana peel!", 0, 7, 4)
+ M.take_organ_damage(2) // Was 5 -- TLE
+ M.take_overall_damage(0, burned)
+
+/obj/item/weapon/grown/bananapeel/traitorpeel/throw_impact(atom/hit_atom)
+ var/burned = rand(1,3)
+ if(istype(hit_atom ,/mob/living))
+ var/mob/living/M = hit_atom
+ M.take_organ_damage(0, burned)
+ return ..()
diff --git a/code/game/objects/items/weapons/grenades/clusterbuster.dm b/code/game/objects/items/weapons/grenades/clusterbuster.dm
index 851c625b765..e238e3bda25 100644
--- a/code/game/objects/items/weapons/grenades/clusterbuster.dm
+++ b/code/game/objects/items/weapons/grenades/clusterbuster.dm
@@ -170,7 +170,7 @@
/obj/item/weapon/grenade/clusterbuster/honk
name = "Mega Honk Grenade"
- payload = /obj/item/weapon/bananapeel
+ payload = /obj/item/weapon/grown/bananapeel
/obj/item/weapon/grenade/clusterbuster/honk_evil
name = "Evil Mega Honk Grenade"
diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm
index 65fab5cbbe0..12dd3b7585e 100644
--- a/code/game/objects/items/weapons/grenades/emgrenade.dm
+++ b/code/game/objects/items/weapons/grenades/emgrenade.dm
@@ -1,12 +1,11 @@
/obj/item/weapon/grenade/empgrenade
- name = "classic emp grenade"
+ name = "classic EMP grenade"
+ desc = "It is designed to wreak havoc on electronic systems."
icon_state = "emp"
item_state = "emp"
origin_tech = "materials=2;magnets=3"
- prime()
- ..()
- if(empulse(src, 4, 10))
- qdel(src)
- return
-
+/obj/item/weapon/grenade/empgrenade/prime()
+ update_mob()
+ empulse(src, 4, 10)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 4241c9c5c0c..3b82b972663 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -12,7 +12,7 @@
for(var/mob/living/M in hearers(7, flashbang_turf))
bang(get_turf(M), M)
- for(var/obj/effect/blob/B in hear(8,flashbang_turf)) //Blob damage here
+ for(var/obj/structure/blob/B in hear(8,flashbang_turf)) //Blob damage here
var/damage = round(30/(get_dist(B,get_turf(src))+1))
B.health -= damage
B.update_icon()
diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm
index 745afd967ee..13b0f0b8140 100644
--- a/code/game/objects/items/weapons/grenades/ghettobomb.dm
+++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm
@@ -17,7 +17,7 @@
/obj/item/weapon/grenade/iedcasing
name = "improvised explosive assembly"
desc = "An igniter stuffed into an aluminum shell."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/grenade.dmi'
icon_state = "improvised_grenade"
item_state = "flashbang"
@@ -67,7 +67,7 @@
/obj/item/weapon/grenade/iedcasing/filled
name = "improvised firebomb"
desc = "A weak, improvised incendiary device."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/grenade.dmi'
icon_state = "improvised_grenade"
item_state = "flashbang"
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index af855e63016..88abd66913f 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/grenade
name = "grenade"
desc = "A hand held grenade, with an adjustable timer."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/grenade.dmi'
icon_state = "grenade"
item_state = "flashbang"
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index b5838839cba..f010bb977c0 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -14,8 +14,7 @@
src.smoke.attach(src)
Destroy()
- qdel(smoke)
- smoke = null
+ QDEL_NULL(smoke)
return ..()
prime()
@@ -30,7 +29,7 @@
sleep(10)
src.smoke.start()
- for(var/obj/effect/blob/B in view(8,src))
+ for(var/obj/structure/blob/B in view(8,src))
var/damage = round(30/(get_dist(B,src)+1))
B.health -= damage
B.update_icon()
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
index e93437fbe76..fe3cb3a0c12 100644
--- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
@@ -20,6 +20,7 @@
for(var/i=1, i<=deliveryamt, i++)
var/atom/movable/x = new spawner_type
+ x.admin_spawned = admin_spawned
x.loc = T
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index d7e4b3b7b23..e802916de27 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -7,7 +7,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 2
throw_range = 5
materials = list(MAT_METAL=500)
@@ -62,6 +62,15 @@
target.update_handcuffed()
return
+/obj/item/weapon/restraints/handcuffs/sinew
+ name = "sinew restraints"
+ desc = "A pair of restraints fashioned from long strands of flesh."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "sinewcuff"
+ item_state = "sinewcuff"
+ breakouttime = 300 //Deciseconds = 30s
+ cuffsound = 'sound/weapons/cablecuff.ogg'
+
/obj/item/weapon/restraints/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
@@ -121,7 +130,7 @@
to_chat(user, "You need at least six metal sheets to make good enough weights! ")
return
to_chat(user, "You begin to apply [I] to [src]... ")
- if(do_after(user, 35, target = src))
+ if(do_after(user, 35 * M.toolspeed, target = src))
var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola
M.use(6)
user.put_in_hands(S)
diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm
index dac93f9cb04..47547ec543a 100644
--- a/code/game/objects/items/weapons/holosign.dm
+++ b/code/game/objects/items/weapons/holosign.dm
@@ -5,7 +5,7 @@
icon_state = "signmaker"
item_state = "electronic"
force = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 0
throw_speed = 3
throw_range = 7
@@ -13,6 +13,10 @@
var/list/signs = list()
var/max_signs = 20
+/obj/item/weapon/holosign_creator/Destroy()
+ QDEL_LIST(signs)
+ return ..()
+
/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
if(flag)
var/turf/T = get_turf(target)
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index be74349f8ca..c4c4175d2fa 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -3,11 +3,11 @@
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
icon_state = "nullrod"
item_state = "nullrod"
- force = 18
+ force = 15
throw_speed = 3
throw_range = 4
throwforce = 10
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/reskinned = FALSE
var/reskin_selectable = TRUE //set to FALSE if a subtype is meant to not normally be available as a reskin option (fluff ones will get re-added through their list)
var/list/fluff_transformations = list() //does it have any special transformations only accessible to it? Should only be subtypes of /obj/item/weapon/nullrod
@@ -71,7 +71,7 @@
item_state = "disintegrate"
desc = "This hand of yours glows with an awesome power!"
flags = ABSTRACT | NODROP
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
attack_verb = list("punched", "cross countered", "pummeled")
@@ -81,7 +81,7 @@
icon_state = "godstaff-red"
item_state = "godstaff-red"
desc = "It has a mysterious, protective aura."
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
force = 5
slot_flags = SLOT_BACK
block_chance = 50
@@ -96,7 +96,7 @@
icon_state = "claymore"
item_state = "claymore"
desc = "A weapon fit for a crusade!"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK|SLOT_BELT
block_chance = 30
sharp = 1
@@ -183,13 +183,13 @@
icon_state = "scythe0"
item_state = "scythe0"
desc = "Ask not for whom the bell tolls..."
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
armour_penetration = 35
slot_flags = SLOT_BACK
sharp = 1
edge = 1
attack_verb = list("chopped", "sliced", "cut", "reaped")
- hitsound = 'sound/weapons/bladeslice.ogg'
+ hitsound = 'sound/weapons/rapierhit.ogg'
/obj/item/weapon/nullrod/scythe/vibro
name = "high frequency blade"
@@ -198,13 +198,21 @@
desc = "Bad references are the DNA of the soul."
attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
+/obj/item/weapon/nullrod/scythe/spellblade
+ icon_state = "spellblade"
+ item_state = "spellblade"
+ icon = 'icons/obj/guns/magic.dmi'
+ name = "dormant spellblade"
+ desc = "The blade grants the wielder nearly limitless power...if they can figure out how to turn it on, that is."
+ hitsound = 'sound/weapons/rapierhit.ogg'
+
/obj/item/weapon/nullrod/scythe/talking
name = "possessed blade"
icon_state = "talking_sword"
item_state = "talking_sword"
desc = "When the station falls into chaos, it's nice to have a friend by your side."
attack_verb = list("chopped", "sliced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
+ hitsound = 'sound/weapons/rapierhit.ogg'
var/possessed = FALSE
/obj/item/weapon/nullrod/scythe/talking/attack_self(mob/living/user)
@@ -247,7 +255,7 @@
item_state = "hammeron"
desc = "This war hammer cost the chaplain fourty thousand space dollars."
slot_flags = SLOT_BELT
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
attack_verb = list("smashed", "bashed", "hammered", "crunched")
/obj/item/weapon/nullrod/chainsaw
@@ -255,7 +263,7 @@
desc = "Good? Bad? You're the guy with the chainsaw hand."
icon_state = "chainsaw1"
item_state = "mounted_chainsaw"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
flags = NODROP | ABSTRACT
sharp = 1
edge = 1
@@ -275,13 +283,17 @@
/obj/item/weapon/nullrod/whip
name = "holy whip"
- desc = "What a terrible night to be on Space Station 13."
+ desc = "What a terrible night to be in spess"
icon_state = "chain"
item_state = "chain"
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed")
hitsound = 'sound/weapons/slash.ogg'
+/obj/item/weapon/nullrod/whip/New()
+ ..()
+ desc = "What a terrible night to be on the [station_name()]."
+
/obj/item/weapon/nullrod/whip/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity)
return
@@ -310,7 +322,7 @@
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
sharp = 1
edge = 1
@@ -320,7 +332,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "carpplushie"
item_state = "carp_plushie"
- force = 15
+ force = 13
attack_verb = list("bitten", "eaten", "fin slapped")
hitsound = 'sound/weapons/bite.ogg'
var/used_blessing = FALSE
@@ -337,8 +349,8 @@
/obj/item/weapon/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking
name = "monk's staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, now used to harass the clown."
- w_class = 4
- force = 15
+ w_class = WEIGHT_CLASS_BULKY
+ force = 13
block_chance = 40
slot_flags = SLOT_BACK
sharp = 0
@@ -353,7 +365,7 @@
name = "arrhythmic knife"
icon_state = "crysknife"
item_state = "crysknife"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
sharp = 1
edge = 1
@@ -377,7 +389,7 @@
name = "unholy pitchfork"
icon_state = "pitchfork0"
item_state = "pitchfork0"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
desc = "Holding this makes you look absolutely devilish."
attack_verb = list("poked", "impaled", "pierced", "jabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
@@ -453,6 +465,51 @@
if(prob(10))
to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers! ")
+/obj/item/weapon/nullrod/salt
+ name = "Holy Salt"
+ icon = 'icons/obj/food/containers.dmi'
+ icon_state = "saltshakersmall"
+ desc = "While commonly used to repel some ghosts, it appears others are downright attracted to it."
+ force = 0
+ throwforce = 0
+ var/ghostcall_CD = 0
+
+
+/obj/item/weapon/nullrod/salt/attack_self(mob/user)
+
+ if(!user.mind || user.mind.assigned_role != "Chaplain")
+ to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src]. ")
+ return
+
+ if(!(ghostcall_CD > world.time))
+ ghostcall_CD = world.time + 3000 //deciseconds..5 minutes
+ user.visible_message("[user] kneels and begins to utter a prayer to [ticker.Bible_deity_name] while drawing a circle with salt! ", \
+ "You kneel and begin a prayer to [ticker.Bible_deity_name] while drawing a circle! ")
+ notify_ghosts("The Chaplain is calling ghosts to [get_area(src)] with [name]!", source = src)
+ else
+ to_chat(user, "You need to wait before using [src] again. ")
+ return
+
+
+/obj/item/weapon/nullrod/rosary/bread
+ name = "prayer bread"
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "baguette"
+ desc = "a staple of worshipers of the Silentfather, this holy mime artifact has an odd effect on clowns."
+
+/obj/item/weapon/nullrod/rosary/bread/process()
+ if(ishuman(loc))
+ var/mob/living/carbon/human/holder = loc
+ //would like to make the holder mime if they have it in on thier person in general
+ if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will
+ for(var/mob/living/carbon/human/H in range(5))
+ if(H.mind.assigned_role == "Clown")
+ H.Silence(10)
+ animate_fade_grayscale(H,20)
+ if(prob(10))
+ to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your honk! ")
+
+
/obj/item/weapon/nullrod/missionary_staff
name = "holy staff"
desc = "It has a mysterious, protective aura."
@@ -461,7 +518,7 @@
reskin_selectable = FALSE
icon_state = "godstaff-red"
item_state = "godstaff-red"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
force = 5
slot_flags = SLOT_BACK
block_chance = 50
@@ -539,7 +596,7 @@
to_chat(missionary, "Your faith is strong, but their mind is already slaved to someone else's ideals. Perhaps an inquisition would reveal more... ")
faith -= 25 //same faith cost as losing sight of them mid-conversion, but did you just find someone who can lead you to a fellow traitor?
return
- if(isloyal(target))
+ if(ismindshielded(target))
if(prob(20)) //loyalty implants typically overpower this, but you CAN get lucky and convert still (20% chance of success)
faith -= 125 //yes, this puts it negative. it's gonna take longer to recharge if you manage to convert a one of these people to balance the new power you gained through them
to_chat(missionary, "Through sheer willpower, you overcome their closed mind and rally [target] to your cause! You may need a bit longer than usual before your faith is fully recharged, and they won't remain loyal to you for long ... ")
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 66b4b228b64..8109e8e8b86 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -48,7 +48,7 @@
for(var/X in actions)
var/datum/action/A = X
A.Grant(source)
- if(istype(source, /mob/living/carbon/human))
+ if(ishuman(source))
var/mob/living/carbon/human/H = source
H.sec_hud_set_implants()
@@ -66,7 +66,7 @@
var/datum/action/A = X
A.Grant(source)
- if(istype(source, /mob/living/carbon/human))
+ if(ishuman(source))
var/mob/living/carbon/human/H = source
H.sec_hud_set_implants()
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
new file mode 100644
index 00000000000..4985576e66c
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -0,0 +1,46 @@
+/obj/item/weapon/implant/abductor
+ name = "recall implant"
+ desc = "Returns you to the mothership."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "implant"
+ activated = 1
+ origin_tech = "materials=2;biotech=7;magnets=4;bluespace=4;abductor=5"
+ var/obj/machinery/abductor/pad/home
+ var/cooldown = 30
+ var/total_cooldown = 30
+
+/obj/item/weapon/implant/abductor/activate()
+ if(cooldown == total_cooldown)
+ home.Retrieve(imp_in,1)
+ cooldown = 0
+ processing_objects.Add(src)
+ else
+ to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again! ")
+
+/obj/item/weapon/implant/abductor/process()
+ if(cooldown < total_cooldown)
+ cooldown++
+ if(cooldown == total_cooldown)
+ processing_objects.Remove(src)
+
+/obj/item/weapon/implant/abductor/implant(mob/source, mob/user)
+ if(..())
+ var/obj/machinery/abductor/console/console
+ if(ishuman(source))
+ var/mob/living/carbon/human/H = source
+ if(H.get_species() == "Abductor")
+ console = get_team_console(H.mind.abductor.team)
+ home = console.pad
+
+ if(!home)
+ console = get_team_console(pick(1, 2, 3, 4))
+ home = console.pad
+ return 1
+
+/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
+ var/obj/machinery/abductor/console/console
+ for(var/obj/machinery/abductor/console/c in abductor_equipment)
+ if(c.team == team)
+ console = c
+ break
+ return console
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
index db4f25e1be2..da9560122ad 100644
--- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm
+++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
@@ -3,6 +3,7 @@
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
var/mobname = "Will Robinson"
activated = 0
+ var/static/list/stealth_areas = typecacheof(list(/area/syndicate_station, /area/syndicate_mothership, /area/shuttle/syndicate_elite))
/obj/item/weapon/implant/death_alarm/get_data()
var/dat = {"Implant Specifications:
@@ -33,26 +34,26 @@
/obj/item/weapon/implant/death_alarm/activate(var/cause)
var/mob/M = imp_in
var/area/t = get_area(M)
+
+ var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
+ a.follow_target = M
+
switch(cause)
if("death")
- var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
- if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
+ if(is_type_in_typecache(t, stealth_areas))
//give the syndies a bit of stealth
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm")
else
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm")
- qdel(a)
qdel(src)
if("emp")
- var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
var/name = prob(50) ? t.name : pick(teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm")
- qdel(a)
else
- var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm")
- qdel(a)
qdel(src)
+
+ qdel(a)
/obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
activate("emp") //let's shout that this dude is dead
diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm
index a6efb21661f..a76b373e6b7 100644
--- a/code/game/objects/items/weapons/implants/implant_mindshield.dm
+++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm
@@ -1,10 +1,10 @@
-/obj/item/weapon/implant/loyalty
+/obj/item/weapon/implant/mindshield
name = "mindshield implant"
desc = "Stops people messing with your mind."
origin_tech = "materials=2;biotech=4;programming=4"
activated = 0
-/obj/item/weapon/implant/loyalty/get_data()
+/obj/item/weapon/implant/mindshield/get_data()
var/dat = {"Implant Specifications:
Name: Nanotrasen Employee Management Implant
Life: Ten years.
@@ -17,7 +17,7 @@
return dat
-/obj/item/weapon/implant/loyalty/implant(mob/target)
+/obj/item/weapon/implant/mindshield/implant(mob/target)
if(..())
if(target.mind in ticker.mode.head_revolutionaries || is_shadow_or_thrall(target))
target.visible_message("[target] seems to resist the implant! ", "You feel the corporate tendrils of Nanotrasen try to invade your mind! ")
@@ -33,7 +33,7 @@
return 1
return 0
-/obj/item/weapon/implant/loyalty/removed(mob/target, var/silent = 0)
+/obj/item/weapon/implant/mindshield/removed(mob/target, var/silent = 0)
if(..())
if(target.stat != DEAD && !silent)
to_chat(target, "You feel a sense of liberation as Nanotrasen's grip on your mind fades away. ")
@@ -41,19 +41,19 @@
return 0
-/obj/item/weapon/implanter/loyalty
+/obj/item/weapon/implanter/mindshield
name = "implanter (mindshield)"
-/obj/item/weapon/implanter/loyalty/New()
- imp = new /obj/item/weapon/implant/loyalty(src)
+/obj/item/weapon/implanter/mindshield/New()
+ imp = new /obj/item/weapon/implant/mindshield(src)
..()
update_icon()
-/obj/item/weapon/implantcase/loyalty
+/obj/item/weapon/implantcase/mindshield
name = "implant case - 'mindshield'"
desc = "A glass case containing a mindshield implant."
-/obj/item/weapon/implantcase/loyalty/New()
- imp = new /obj/item/weapon/implant/loyalty(src)
+/obj/item/weapon/implantcase/mindshield/New()
+ imp = new /obj/item/weapon/implant/mindshield(src)
..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm
index 454c08f9df1..acbed742159 100644
--- a/code/game/objects/items/weapons/implants/implant_storage.dm
+++ b/code/game/objects/items/weapons/implants/implant_storage.dm
@@ -1,9 +1,9 @@
/obj/item/weapon/storage/hidden/implant
name = "bluespace pocket"
storage_slots = 2
- max_w_class = 3
- max_combined_w_class = 6
- w_class = 4
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = WEIGHT_CLASS_GIGANTIC
+ w_class = WEIGHT_CLASS_BULKY
cant_hold = list(/obj/item/weapon/disk/nuclear)
silent = 1
@@ -49,9 +49,13 @@
return ..()
+/obj/item/weapon/implant/storage/proc/get_contents() //Used for swiftly returning a list of the implant's contents i.e. for checking a theft objective's completion.
+ if(storage && storage.contents)
+ return storage.contents
+
/obj/item/weapon/implanter/storage
name = "implanter (storage)"
/obj/item/weapon/implanter/storage/New()
imp = new /obj/item/weapon/implant/storage(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm
index bb80d50845d..47b993b6007 100644
--- a/code/game/objects/items/weapons/implants/implant_traitor.dm
+++ b/code/game/objects/items/weapons/implants/implant_traitor.dm
@@ -38,7 +38,7 @@
removed(M)
qdel(src)
return -1
- if(isloyal(H))
+ if(ismindshielded(H))
H.visible_message("[H] seems to resist the implant! ", "You feel a strange sensation in your head that quickly dissipates. ")
removed(M)
qdel(src)
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 41354136648..b35fecf77b1 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -6,7 +6,7 @@
item_state = "implantcase"
throw_speed = 2
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=2"
materials = list(MAT_GLASS=500)
var/obj/item/weapon/implant/imp = null
@@ -98,4 +98,4 @@
/obj/item/weapon/implantcase/death_alarm/New()
imp = new /obj/item/weapon/implant/death_alarm(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 141f9b14f89..53183e21d63 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -11,7 +11,7 @@
var/ready = 1
var/malfunction = 0
- var/list/obj/item/weapon/implant/loyalty/implant_list = list()
+ var/list/obj/item/weapon/implant/mindshield/implant_list = list()
var/max_implants = 5
var/injection_cooldown = 600
var/replenish_cooldown = 6000
@@ -122,9 +122,9 @@
if(!istype(M, /mob/living/carbon))
return
if(!implant_list.len) return
- for(var/obj/item/weapon/implant/loyalty/imp in implant_list)
+ for(var/obj/item/weapon/implant/mindshield/imp in implant_list)
if(!imp) continue
- if(istype(imp, /obj/item/weapon/implant/loyalty))
+ if(istype(imp, /obj/item/weapon/implant/mindshield))
M.visible_message("[M] has been implanted by the [src.name]. ")
if(imp.implant(M))
@@ -135,7 +135,7 @@
/obj/machinery/implantchair/add_implants()
for(var/i=0, i[user] is attemping to implant [M]. ")
var/turf/T = get_turf(M)
- if(T && (M == user || do_after(user, 50, target = M)))
+ if(T && (M == user || do_after(user, 50 * toolspeed, target = M)))
if(user && M && (get_turf(M) == T) && src && imp)
if(imp.implant(M, user))
if(M == user)
@@ -85,4 +86,4 @@
/obj/item/weapon/implanter/death_alarm/New()
imp = new /obj/item/weapon/implant/death_alarm(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm
index cd988d6310e..2e427638fd1 100644
--- a/code/game/objects/items/weapons/implants/implantpad.dm
+++ b/code/game/objects/items/weapons/implants/implantpad.dm
@@ -8,7 +8,7 @@
item_state = "electronic"
throw_speed = 3
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/obj/item/weapon/implantcase/case = null
/obj/item/weapon/implantpad/Destroy()
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 183f07bb21c..c2bb92d4f89 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -18,7 +18,7 @@
*/
/obj/item/weapon/kitchen/utensil
force = 5.0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 0.0
throw_speed = 3
throw_range = 5
@@ -91,7 +91,7 @@
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
flags = CONDUCT
force = 10
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg'
throw_speed = 3
@@ -122,7 +122,7 @@
desc = "The unearthly energies that once powered this blade are now dormant."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/kitchen/knife/butcher
name = "butcher's cleaver"
@@ -132,7 +132,7 @@
force = 15
throwforce = 8
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/kitchen/knife/butcher/meatcleaver
name = "Meat Cleaver"
@@ -152,6 +152,17 @@
origin_tech = "materials=2;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+/obj/item/weapon/kitchen/knife/carrotshiv
+ name = "carrot shiv"
+ icon_state = "carrotshiv"
+ item_state = "carrotshiv"
+ desc = "Unlike other carrots, you should probably keep this far away from your eyes."
+ force = 8
+ throwforce = 12 //fuck git
+ materials = list()
+ origin_tech = "biotech=3;combat=2"
+ attack_verb = list("shanked", "shivved")
+
/*
* Rolling Pins
*/
@@ -164,7 +175,7 @@
throwforce = 10.0
throw_speed = 3
throw_range = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
/* Trays moved to /obj/item/weapon/storage/bag */
@@ -181,7 +192,7 @@
throwforce = 5
throw_speed = 3
throw_range = 3
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
/obj/item/weapon/kitchen/mould/bear
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
index 7e62a14250b..4592ff67cc2 100644
--- a/code/game/objects/items/weapons/legcuffs.dm
+++ b/code/game/objects/items/weapons/legcuffs.dm
@@ -6,7 +6,7 @@
icon_state = "handcuff"
flags = CONDUCT
throwforce = 0
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "materials=1"
slowdown = 7
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
@@ -27,12 +27,8 @@
icon_state = "[initial(icon_state)][armed]"
/obj/item/weapon/restraints/legcuffs/beartrap/Destroy()
- if(IED)
- qdel(IED)
- IED = null
- if(sig)
- qdel(sig)
- sig = null
+ QDEL_NULL(IED)
+ QDEL_NULL(sig)
return ..()
/obj/item/weapon/restraints/legcuffs/beartrap/suicide_act(mob/user)
@@ -200,7 +196,7 @@
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
icon_state = "ebola"
hitsound = 'sound/weapons/tase.ogg'
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
breakouttime = 60
/obj/item/weapon/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
@@ -208,4 +204,4 @@
var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
B.Crossed(hit_atom)
qdel(src)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index 307ec829072..6525351fd67 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -9,7 +9,7 @@
item_state = "lighter-g"
var/icon_on = "lighter-g-on"
var/icon_off = "lighter-g"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 4
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -35,7 +35,7 @@
if(user.r_hand == src || user.l_hand == src || isrobot(user))
if(!lit)
lit = 1
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
icon_state = icon_on
item_state = icon_on
if(istype(src, /obj/item/weapon/lighter/zippo) )
@@ -59,7 +59,7 @@
processing_objects.Add(src)
else
lit = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
icon_state = icon_off
item_state = icon_off
if(istype(src, /obj/item/weapon/lighter/zippo) )
@@ -147,7 +147,7 @@
icon_state = "match_unlit"
var/lit = 0
var/smoketime = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1"
attack_verb = list("burnt", "singed")
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 5e262ce4afa..e0c4ec435fa 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -2,12 +2,14 @@
var/active = 0
var/force_on = 30 //force when active
var/throwforce_on = 20
- w_class = 2
- var/w_class_on = 4
+ w_class = WEIGHT_CLASS_SMALL
+ var/w_class_on = WEIGHT_CLASS_BULKY
var/icon_state_on = "axe1"
var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
no_embed = 1 // Physically impossible for energy weapons to embed themselves into people, this should fix that. -- Dave
hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave
+ usesound = 'sound/weapons/blade1.ogg'
+ toolspeed = 1
/obj/item/weapon/melee/energy/suicide_act(mob/user)
user.visible_message(pick("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku. ", \
@@ -59,8 +61,8 @@
throwforce_on = 30
throw_speed = 3
throw_range = 5
- w_class = 3
- w_class_on = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ w_class_on = WEIGHT_CLASS_HUGE
hitsound = "swing_hit"
flags = CONDUCT
armour_penetration = 100
@@ -107,7 +109,7 @@
if(R.cell)
var/obj/item/weapon/stock_parts/cell/C = R.cell
if(active && !(C.use(hitcost)))
- attack_self()
+ attack_self(R)
to_chat(R, "It's out of charge! ")
return
..()
@@ -127,7 +129,7 @@
icon_state_on = "esaw_1"
hitcost = 75 //Costs more than a standard cyborg esword
item_color = null
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/melee/energy/sword/cyborg/saw/New()
..()
@@ -205,7 +207,7 @@
throwforce = 1//Throwing or dropping the item deletes it.
throw_speed = 3
throw_range = 1
- w_class = 4//So you can't hide it in your pocket or some such.
+ w_class = WEIGHT_CLASS_BULKY //So you can't hide it in your pocket or some such.
armour_penetration = 50
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/datum/effect/system/spark_spread/spark_system
@@ -221,4 +223,4 @@
qdel(src)
/obj/item/weapon/melee/energy/blade/attack_self(mob/user)
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index f4b7946d0ca..6f0de4720e3 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -10,7 +10,7 @@
slot_flags = SLOT_BELT
force = 10
throwforce = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "combat=4"
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
hitsound = 'sound/weapons/slash.ogg' //pls replace
@@ -28,14 +28,14 @@
flags = CONDUCT
force = 15
throwforce = 10
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
block_chance = 50
armour_penetration = 75
sharp = 1
edge = 1
origin_tech = "combat=5"
attack_verb = list("lunged at", "stabbed")
- hitsound = 'sound/weapons/slash.ogg'
+ hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(MAT_METAL = 1000)
/obj/item/weapon/melee/rapier/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
@@ -50,7 +50,7 @@
item_state = "icepick"
force = 15
throwforce = 10
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("stabbed", "jabbed", "iced,")
/obj/item/weapon/melee/candy_sword
@@ -60,5 +60,5 @@
item_state = "candy_sword"
force = 10
throwforce = 7
- w_class = 3
- attack_verb = list("slashed", "stabbed", "sliced", "caned")
\ No newline at end of file
+ w_class = WEIGHT_CLASS_NORMAL
+ attack_verb = list("slashed", "stabbed", "sliced", "caned")
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
index ffd021aae4b..cd86a04a377 100644
--- a/code/game/objects/items/weapons/misc.dm
+++ b/code/game/objects/items/weapons/misc.dm
@@ -30,7 +30,7 @@
flags = CONDUCT
force = 5.0
throwforce = 7.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed", "Vaudevilled")
@@ -43,7 +43,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "c_tube"
throwforce = 1
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 4
throw_range = 5
@@ -65,7 +65,7 @@
var/data = ""
var/base_url = "http://svn.slurm.us/public/spacestation13/misc/game_kit"
item_state = "sheet-metal"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
*/
/obj/item/weapon/gift
@@ -76,7 +76,7 @@
var/size = 3.0
var/obj/item/gift = null
item_state = "gift"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/weapon/kidanglobe
name = "Kidan homeworld globe"
@@ -134,7 +134,7 @@
throwforce = 2
throw_speed = 1
throw_range = 4
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("called", "rang")
hitsound = 'sound/weapons/ring.ogg'
var/cooldown = 0
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 06bb11dd59e..59db57459b9 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -9,7 +9,7 @@
throwforce = 5.0
throw_speed = 3
throw_range = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
burn_state = FLAMMABLE
var/mopping = 0
@@ -18,6 +18,7 @@
var/mopspeed = 30
/obj/item/weapon/mop/New()
+ ..()
create_reagents(mopcap)
janitorial_equipment += src
@@ -28,6 +29,7 @@
/obj/item/weapon/mop/proc/clean(turf/simulated/A)
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
A.clean_blood()
+ A.dirt = 0
for(var/obj/effect/O in A)
if(is_cleanable(O))
qdel(O)
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 67d4f078264..dc5c4d048b5 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -7,7 +7,7 @@
icon_state = "paint_neutral"
item_state = "paintcan"
materials = list(MAT_METAL=200)
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
burn_state = FLAMMABLE
burntime = 5
amount_per_transfer_from_this = 5
@@ -63,4 +63,4 @@
/obj/item/weapon/reagent_containers/glass/paint/remover
name = "paint remover bucket"
- list_reagents = list("paint_remover" = 70)
\ No newline at end of file
+ list_reagents = list("paint_remover" = 70)
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 78a974240de..116391803bd 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/pneumatic_cannon
name = "pneumatic cannon"
desc = "A gas-powered cannon that can fire any object loaded into it."
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 8 //Very heavy
attack_verb = list("bludgeoned", "smashed", "beaten")
icon = 'icons/obj/pneumaticCannon.dmi'
@@ -17,12 +17,8 @@
var/pressureSetting = 1 //How powerful the cannon is - higher pressure = more gas but more powerful throws
/obj/item/weapon/pneumatic_cannon/Destroy()
- if(tank)
- qdel(tank)
- tank = null
- for(var/obj/item/I in loadedItems)
- qdel(I)
- loadedItems.Cut()
+ QDEL_NULL(tank)
+ QDEL_LIST(loadedItems)
return ..()
/obj/item/weapon/pneumatic_cannon/examine(mob/user)
@@ -136,7 +132,7 @@
name = "improvised pneumatic cannon"
desc = "A gas-powered, object-firing cannon made out of common parts."
force = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
maxWeightClass = 7
gasPerThrow = 5
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 92bb7ac4c07..de5d788a9f3 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -5,19 +5,37 @@
icon_state = "cell"
item_state = "cell"
origin_tech = "powerstorage=1"
- force = 5.0
- throwforce = 5.0
- throw_speed = 3
+ force = 5
+ throwforce = 5
+ throw_speed = 2
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/charge = 0 // note %age conveted to actual charge in New
- var/maxcharge = 10000
- rating = 1
+ var/maxcharge = 1000
materials = list(MAT_METAL=700, MAT_GLASS=50)
var/rigged = 0 // true if rigged to explode
+ var/chargerate = 100 //how much power is given every tick in a recharger
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
- var/chargerate = 1000 //how much power is given every tick in a recharger
var/self_recharge = 0 //does it self recharge, over time, or not?
+ var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
+
+/obj/item/weapon/stock_parts/cell/New()
+ ..()
+ processing_objects.Add(src)
+ charge = maxcharge
+ updateicon()
+
+/obj/item/weapon/stock_parts/cell/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/item/weapon/stock_parts/cell/on_varedit(modified_var)
+ if(modified_var == "self_recharge")
+ if(self_recharge)
+ processing_objects.Add(src)
+ else
+ processing_objects.Remove(src)
+ ..()
/obj/item/weapon/stock_parts/cell/suicide_act(mob/user)
to_chat(viewers(user), "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide. ")
@@ -29,13 +47,23 @@
else
return PROCESS_KILL
+/obj/item/weapon/stock_parts/cell/proc/updateicon()
+ overlays.Cut()
+ if(grown_battery)
+ overlays += image('icons/obj/power.dmi', "grown_wires")
+ if(charge < 0.01)
+ return
+ else if(charge/maxcharge >=0.995)
+ overlays += image('icons/obj/power.dmi', "cell-o2")
+ else
+ overlays += image('icons/obj/power.dmi', "cell-o1")
+
/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = null
- maxcharge = 5000
- rating = 2
+ maxcharge = 500
materials = list(MAT_GLASS=40)
+ rating = 2
/obj/item/weapon/stock_parts/cell/crap/empty/New()
..()
@@ -44,9 +72,9 @@
/obj/item/weapon/stock_parts/cell/secborg
name = "\improper Security borg rechargable D battery"
origin_tech = null
- maxcharge = 6000 //6000 max charge / 1000 charge per shot = six shots
- rating = 2.5
+ maxcharge = 600 //600 max charge / 100 charge per shot = six shots
materials = list(MAT_GLASS=40)
+ rating = 2.5
/obj/item/weapon/stock_parts/cell/secborg/empty/New()
..()
@@ -56,11 +84,18 @@
name = "high-capacity power cell"
origin_tech = "powerstorage=2"
icon_state = "hcell"
- maxcharge = 15000
- rating = 3
+ maxcharge = 10000
materials = list(MAT_GLASS=60)
+ rating = 3
chargerate = 1500
+/obj/item/weapon/stock_parts/cell/high/plus
+ name = "high-capacity power cell+"
+ desc = "Where did these come from?"
+ icon_state = "h+cell"
+ maxcharge = 15000
+ chargerate = 2250
+
/obj/item/weapon/stock_parts/cell/high/empty/New()
..()
charge = 0
@@ -70,7 +105,7 @@
origin_tech = "powerstorage=5"
icon_state = "scell"
maxcharge = 20000
- materials = list(MAT_GLASS=70)
+ materials = list(MAT_GLASS=300)
rating = 4
chargerate = 2000
@@ -83,8 +118,8 @@
origin_tech = "powerstorage=6"
icon_state = "hpcell"
maxcharge = 30000
+ materials = list(MAT_GLASS=400)
rating = 5
- materials = list(MAT_GLASS=80)
chargerate = 3000
/obj/item/weapon/stock_parts/cell/hyper/empty/New()
@@ -96,7 +131,7 @@
origin_tech = "powerstorage=7"
icon_state = "bscell"
maxcharge = 40000
- materials = list(MAT_GLASS=80)
+ materials = list(MAT_GLASS=600)
rating = 6
chargerate = 4000
@@ -109,8 +144,8 @@
icon_state = "icell"
origin_tech = null
maxcharge = 30000
+ materials = list(MAT_GLASS=1000)
rating = 6
- materials = list(MAT_GLASS=80)
chargerate = 30000
/obj/item/weapon/stock_parts/cell/infinite/use()
@@ -119,14 +154,15 @@
/obj/item/weapon/stock_parts/cell/potato
name = "potato battery"
desc = "A rechargable starch based power cell."
- origin_tech = "powerstorage=1"
- icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
- icon_state = "potato_cell" //"potato_battery"
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "potato"
+ origin_tech = "powerstorage=1;biotech=1"
charge = 100
- maxcharge = 3000
- rating = 1
+ maxcharge = 300
materials = list()
+ rating = 1
minor_fault = 1
+ grown_battery = TRUE //it has the overlays for wires
/obj/item/weapon/stock_parts/cell/high/slime
name = "charged slime core"
@@ -139,17 +175,17 @@
/obj/item/weapon/stock_parts/cell/pulse //200 pulse shots
name = "pulse rifle power cell"
- maxcharge = 400000
+ maxcharge = 40000
rating = 3
chargerate = 1500
-/obj/item/weapon/stock_parts/cell/pulse/carbine
+/obj/item/weapon/stock_parts/cell/pulse/carbine //25 pulse shots
name = "pulse carbine power cell"
- maxcharge = 40000
+ maxcharge = 5000
-/obj/item/weapon/stock_parts/cell/pulse/pistol
+/obj/item/weapon/stock_parts/cell/pulse/pistol //10 pulse shots
name = "pulse pistol power cell"
- maxcharge = 16000
+ maxcharge = 2000
/obj/item/weapon/stock_parts/cell/ninja
name = "spider-clan power cell"
@@ -161,7 +197,7 @@
/obj/item/weapon/stock_parts/cell/emproof
name = "\improper EMP-proof cell"
desc = "An EMP-proof cell."
- maxcharge = 5000
+ maxcharge = 500
rating = 2
/obj/item/weapon/stock_parts/cell/emproof/empty/New()
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index eefd3b7d0f6..218fe47ed6b 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -8,7 +8,7 @@
force = 12
throwforce = 10
throw_range = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "combat=5;powerstorage=3;syndicate=3"
var/click_delay = 1.5
var/fisto_setting = 1
@@ -17,9 +17,7 @@
/obj/item/weapon/melee/powerfist/Destroy()
- if(tank)
- qdel(tank)
- tank = null
+ QDEL_NULL(tank)
return ..()
/obj/item/weapon/melee/powerfist/examine(mob/user)
@@ -46,7 +44,7 @@
fisto_setting = 3
if(3)
fisto_setting = 1
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting]. ")
else if(istype(W, /obj/item/weapon/screwdriver))
if(tank)
@@ -87,7 +85,7 @@
target.apply_damage(force * fisto_setting, BRUTE)
target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]! ", \
"You cry out in pain as [user]'s punch flings you backwards! ")
- new/obj/effect/kinetic_blast(target.loc)
+ new /obj/effect/overlay/temp/kinetic_blast(target.loc)
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index e966f5500e5..5571640f08f 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -6,9 +6,10 @@
force = 5
sharp = 1
edge = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("slices", "cuts", "stabs", "jabs")
+ toolspeed = 1
/obj/item/weapon/scissors/barber
name = "Barber's Scissors"
@@ -16,6 +17,7 @@
icon_state = "bscissor"
item_state = "scissor"
attack_verb = list("beautifully sliced", "artistically cut", "smoothly stabbed", "quickly jabbed")
+ toolspeed = 0.75
/obj/item/weapon/scissors/attack(mob/living/carbon/M as mob, mob/user as mob)
if(user.a_intent != "help")
@@ -78,8 +80,8 @@
species_hair = hair_styles_list
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
user.visible_message("[user] starts cutting [M]'s hair! ", "You start cutting [M]'s hair! ") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo)
- playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1)
- if(do_after(user, 50, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
+ playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
+ if(do_after(user, 50 * toolspeed, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
if(!(M in view(1))) //Adjacency test
user.visible_message("[user] stops cutting [M]'s hair. ", "You stop cutting [M]'s hair. ")
return
@@ -111,9 +113,9 @@
if(!is_cutting)
is_cutting = 1
user.visible_message("[user] starts cutting [M]'s hair! ", "You start cutting [M]'s hair! ")
- playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1)
- if(do_after(user, 50, target = H))
- playsound(loc, "sound/weapons/bladeslice.ogg", 50, 1, -1)
+ playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
+ if(do_after(user, 50 * toolspeed, target = H))
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat! ", "You stop cutting [M]'s hair and slice their throat! ") //Just a little off the top.
H.AdjustLoseBreath(10) //30 Oxy damage over time
H.apply_damage(18, BRUTE, "head", sharp =1, edge =1, used_weapon = "scissors")
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 0b45cd4a42e..254b936ed46 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
var/uses = 4.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
item_state = "paper"
throw_speed = 4
throw_range = 20
@@ -96,4 +96,4 @@
user.loc = pick(L)
smoke.start()
- src.uses -= 1
\ No newline at end of file
+ src.uses -= 1
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 4e5de260926..554347224eb 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -7,7 +7,7 @@
sharp = 1
edge = 1
desc = "Could probably be used as ... a throwing weapon?"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
force = 5.0
throwforce = 10.0
item_state = "shard-glass"
@@ -35,6 +35,24 @@
else
..()
+/obj/item/weapon/shard/afterattack(atom/movable/AM, mob/user, proximity)
+ if(!proximity || !(src in user))
+ return
+ if(isturf(AM))
+ return
+ if(istype(AM, /obj/item/weapon/storage))
+ return
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!H.gloves)
+ var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
+ if(affecting.status & ORGAN_ROBOT)
+ return
+ to_chat(H, "[src] cuts into your hand! ")
+ if(affecting.take_damage(force*0.5))
+ H.UpdateDamageIcon()
+ H.updatehealth()
+
/obj/item/weapon/shard/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
@@ -53,7 +71,7 @@
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
- if(M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping!
+ if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
return
to_chat(M, "You step on \the [src]! ")
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
@@ -94,4 +112,4 @@
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 479cb278e91..d801ec7d460 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -19,7 +19,7 @@
throwforce = 5
throw_speed = 2
throw_range = 3
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_GLASS=7500, MAT_METAL=1000)
origin_tech = "materials=2"
attack_verb = list("shoved", "bashed")
@@ -58,7 +58,7 @@
throwforce = 3
throw_speed = 3
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=4;magnets=3;syndicate=4"
attack_verb = list("shoved", "bashed")
var/active = 0
@@ -80,14 +80,14 @@
force = 10
throwforce = 8
throw_speed = 2
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
playsound(user, 'sound/weapons/saberon.ogg', 35, 1)
to_chat(user, "[src] is now active. ")
else
force = 3
throwforce = 3
throw_speed = 3
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1)
to_chat(user, "[src] can now be concealed. ")
if(istype(user,/mob/living/carbon/human))
@@ -107,7 +107,7 @@
throwforce = 3
throw_speed = 3
throw_range = 4
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/active = 0
/obj/item/weapon/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
@@ -124,14 +124,14 @@
force = 8
throwforce = 5
throw_speed = 2
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
to_chat(user, "You extend \the [src]. ")
else
force = 3
throwforce = 3
throw_speed = 3
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
slot_flags = null
to_chat(user, "[src] can now be concealed. ")
if(istype(user,/mob/living/carbon/human))
diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm
index fa68b09135e..006ad92dcf5 100644
--- a/code/game/objects/items/weapons/signs.dm
+++ b/code/game/objects/items/weapons/signs.dm
@@ -4,7 +4,7 @@
name = "blank picket sign"
desc = "It's blank"
force = 5
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed","smacked")
burn_state = FLAMMABLE
@@ -42,4 +42,4 @@
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/cardboard = 2)
time = 80
- category = CAT_MISC
\ No newline at end of file
+ category = CAT_MISC
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index f21c0581888..e4183b5bafd 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -4,7 +4,7 @@
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "soap"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -53,4 +53,4 @@
/obj/item/weapon/soap/syndie
desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster."
icon_state = "soapsyndie"
- cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes
\ No newline at end of file
+ cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes
diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm
index 19c771873ce..b9d1896f70c 100644
--- a/code/game/objects/items/weapons/staff.dm
+++ b/code/game/objects/items/weapons/staff.dm
@@ -7,7 +7,7 @@
throwforce = 5.0
throw_speed = 1
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
armour_penetration = 100
attack_verb = list("bludgeoned", "whacked", "disciplined")
burn_state = FLAMMABLE
@@ -73,4 +73,4 @@
throwforce = 5.0
throw_speed = 1
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
index e6e58196108..3615d6848c2 100644
--- a/code/game/objects/items/weapons/stock_parts.dm
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -5,19 +5,21 @@
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "RPED"
item_state = "RPED"
- w_class = 5
- can_hold = list("/obj/item/weapon/stock_parts")
+ w_class = WEIGHT_CLASS_HUGE
+ can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 50
use_to_pickup = 1
allow_quick_gather = 1
allow_quick_empty = 1
collection_mode = 1
display_contents_with_number = 1
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 100
var/works_from_distance = 0
var/primary_sound = 'sound/items/rped.ogg'
var/alt_sound = null
+ toolspeed = 1
+ usesound = 'sound/items/rped.ogg'
/obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T as obj, mob/living/carbon/human/user as mob, flag, params)
if(flag)
@@ -34,13 +36,15 @@
name = "bluespace rapid part exchange device"
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
icon_state = "BS_RPED"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
storage_slots = 400
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 800
works_from_distance = 1
primary_sound = 'sound/items/PSHOOM.ogg'
alt_sound = 'sound/items/PSHOOM_2.ogg'
+ usesound = 'sound/items/PSHOOM.ogg'
+ toolspeed = 0.5
/obj/item/weapon/storage/part_replacer/proc/play_rped_sound()
//Plays the sound for RPED exchanging or installing parts.
@@ -59,11 +63,14 @@
desc = "What?"
gender = PLURAL
icon = 'icons/obj/stock_parts.dmi'
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/rating = 1
- New()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
+
+/obj/item/weapon/stock_parts/New()
+ src.pixel_x = rand(-5.0, 5)
+ src.pixel_y = rand(-5.0, 5)
//Rank 1
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index c664ca9fff9..6a5f9b80ae3 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -10,9 +10,9 @@
item_state = "backpack"
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK //ERROOOOO
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 21
storage_slots = 21
burn_state = FLAMMABLE
@@ -35,7 +35,7 @@
desc = "A backpack that opens into a localized pocket of Blue Space."
origin_tech = "bluespace=4"
icon_state = "holdingpack"
- max_w_class = 5
+ max_w_class = WEIGHT_CLASS_HUGE
max_combined_w_class = 35
burn_state = FIRE_PROOF
@@ -45,13 +45,13 @@
attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(crit_fail)
- to_chat(user, "\red The Bluespace generator isn't working.")
+ to_chat(user, "The Bluespace generator isn't working. ")
return
else if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No")
if(response == "Yes")
user.visible_message("[user] grins as \he begins to put a Bag of Holding into a Bag of Holding! ", "You begin to put the Bag of Holding into the Bag of Holding! ")
- if(do_after(user,30,target=src))
+ if(do_after(user, 30, target=src))
investigate_log("has become a singularity. Caused by [user.key]","singulo")
user.visible_message("[user] erupts in evil laughter as \he puts the Bag of Holding into another Bag of Holding! ", "You can't help but laugh wildly as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you. "," You hear the sound of scientific evil brewing! ")
qdel(W)
@@ -68,10 +68,10 @@
proc/failcheck(mob/user as mob)
if(prob(src.reliability)) return 1 //No failure
if(prob(src.reliability))
- to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure
+ to_chat(user, "The Bluespace portal resists your attempt to add another item. ")//light failure
else
- to_chat(user, "\red The Bluespace generator malfunctions!")
+ to_chat(user, "The Bluespace generator malfunctions! ")
for(var/obj/O in src.contents) //it broke, delete what was in it
qdel(O)
crit_fail = 1
@@ -88,8 +88,8 @@
desc = "Space Santa uses this to deliver toys to all the nice children in space on Christmas! Wow, it's pretty big!"
icon_state = "giftbag0"
item_state = "giftbag"
- w_class = 4
- max_w_class = 3
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 400 // can store a ton of shit!
/obj/item/weapon/storage/backpack/cultpack
@@ -189,7 +189,7 @@
/obj/item/weapon/storage/backpack/satchel_norm
name = "satchel"
desc = "A deluxe NT Satchel, made of the highest quality leather."
- icon_state = "satchel"
+ icon_state = "satchel-norm"
/obj/item/weapon/storage/backpack/satchel_eng
name = "industrial satchel"
@@ -243,7 +243,7 @@
name = "smuggler's satchel"
desc = "A very slim satchel that can easily fit into tight spaces."
icon_state = "satchel-flat"
- w_class = 3 //Can fit in backpacks itself.
+ w_class = WEIGHT_CLASS_NORMAL //Can fit in backpacks itself.
max_combined_w_class = 15
level = 1
cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks
@@ -447,4 +447,4 @@
/obj/item/weapon/storage/backpack/ert/janitor
name = "emergency response team janitor backpack"
desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team."
- icon_state = "ert_janitor"
\ No newline at end of file
+ icon_state = "ert_janitor"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index ef0cdfc329b..0cff8d89ea4 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -33,11 +33,11 @@
icon_state = "trashbag"
item_state = "trashbag"
- w_class = 1
- max_w_class = 2
+ w_class = WEIGHT_CLASS_TINY
+ max_w_class = WEIGHT_CLASS_SMALL
storage_slots = 30
can_hold = list() // any
- cant_hold = list("/obj/item/weapon/disk/nuclear")
+ cant_hold = list(/obj/item/weapon/disk/nuclear)
/obj/item/weapon/storage/bag/trash/suicide_act(mob/user)
user.visible_message("[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting! ")
@@ -46,16 +46,16 @@
/obj/item/weapon/storage/bag/trash/update_icon()
if(contents.len == 0)
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
icon_state = "[initial(icon_state)]"
else if(contents.len < 12)
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
icon_state = "[initial(icon_state)]1"
else if(contents.len < 21)
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
icon_state = "[initial(icon_state)]2"
else
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
icon_state = "[initial(icon_state)]3"
/obj/item/weapon/storage/bag/trash/cyborg
@@ -88,17 +88,17 @@
item_state = "plasticbag"
slot_flags = SLOT_HEAD|SLOT_BELT
throwforce = 0
- w_class = 4
- max_w_class = 2
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_SMALL
storage_slots = 7
display_contents_with_number = 0 //or else this will lead to stupid behavior.
can_hold = list() // any
- cant_hold = list("/obj/item/weapon/disk/nuclear")
+ cant_hold = list(/obj/item/weapon/disk/nuclear)
/obj/item/weapon/storage/bag/plasticbag/mob_can_equip(M as mob, slot)
if(slot==slot_head && contents.len)
- to_chat(M, "\red You need to empty the bag first!")
+ to_chat(M, "You need to empty the bag first! ")
return 0
return ..()
@@ -132,11 +132,11 @@
icon = 'icons/obj/mining.dmi'
icon_state = "satchel"
slot_flags = SLOT_BELT | SLOT_POCKET
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
storage_slots = 50
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
- max_w_class = 3
- can_hold = list("/obj/item/weapon/ore")
+ max_w_class = WEIGHT_CLASS_NORMAL
+ can_hold = list(/obj/item/weapon/ore)
/obj/item/weapon/storage/bag/ore/cyborg
name = "cyborg mining satchel"
@@ -159,52 +159,34 @@
// -----------------------------
/obj/item/weapon/storage/bag/plants
- icon = 'icons/obj/hydroponics.dmi'
+ name = "plant bag"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "plantbag"
- name = "Plant Bag"
- storage_slots = 50; //the number of plant pieces it can carry.
- max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class
- max_w_class = 3
- w_class = 1
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown", "/obj/item/stack/tile/grass","/obj/item/stack/medical/ointment/aloe","/obj/item/stack/medical/bruise_pack/comfrey", "/obj/item/weapon/reagent_containers/honeycomb")
+ storage_slots = 100 //the number of plant pieces it can carry.
+ max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class
+ max_w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_TINY
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/food/snacks/ash_flora)
burn_state = FLAMMABLE
/obj/item/weapon/storage/bag/plants/portaseeder
name = "portable seed extractor"
desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
icon_state = "portaseeder"
+ origin_tech = "biotech=3;engineering=2"
/obj/item/weapon/storage/bag/plants/portaseeder/verb/dissolve_contents()
set name = "Activate Seed Extraction"
set category = "Object"
set desc = "Activate to convert your plants into plantable seeds."
- if(usr.stat || !usr.canmove || usr.restrained())
+
+ if(usr.incapacitated())
return
for(var/obj/item/O in contents)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown))
-
- var/datum/seed/new_seed_type
- if(istype(O, /obj/item/weapon/grown))
- var/obj/item/weapon/grown/F = O
- new_seed_type = plant_controller.seeds[F.plantname]
- else
- var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
- new_seed_type = plant_controller.seeds[F.plantname]
-
- if(new_seed_type)
- var/obj/item/seeds/seeds = new(O.loc, O)
- seeds.seed_type = new_seed_type.name
- seeds.update_seed()
- qdel(O)
-
- if(istype(O, /obj/item/stack/tile/grass))
- var/obj/item/stack/tile/grass/S = O
- S.use(1)
- new /obj/item/seeds/grassseed(O.loc, O)
-
+ seedify(O, 1)
for(var/mob/M in range(1))
if(M.s_active == src)
- src.close(M)
+ close(M)
// -----------------------------
@@ -220,7 +202,7 @@
desc = "A patented Nanotrasen storage system designed for any kind of mineral sheet."
var/capacity = 300; //the number of sheets it can carry.
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allow_quick_empty = 1 // this function is superceded
New()
@@ -238,7 +220,7 @@
current += S.amount
if(capacity == current)//If it's full, you're done
if(!stop_messages)
- to_chat(usr, "\red The snatcher is full.")
+ to_chat(usr, "The snatcher is full. ")
return 0
return 1
@@ -361,10 +343,9 @@
desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front."
storage_slots = 50; //the number of cash pieces it can carry.
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class
- max_w_class = 3
- w_class = 1
-
- can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash")
+ max_w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_TINY
+ can_hold = list(/obj/item/weapon/coin,/obj/item/stack/spacecash)
// -----------------------------
// Book bag
@@ -378,9 +359,9 @@
display_contents_with_number = 0 //This would look really stupid otherwise
storage_slots = 7
max_combined_w_class = 21
- max_w_class = 3
- w_class = 4 //Bigger than a book because physics
- can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook")
+ max_w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY //Bigger than a book because physics
+ can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/bible, /obj/item/weapon/tome, /obj/item/weapon/spellbook)
burn_state = FLAMMABLE
/*
@@ -395,7 +376,7 @@
throwforce = 10.0
throw_speed = 3
throw_range = 5
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
materials = list(MAT_METAL=3000)
@@ -470,9 +451,9 @@
sleep(rand(2,4))
if( droppedSomething )
if( foundtable )
- user.visible_message("\blue [user] unloads their service tray.")
+ user.visible_message("[user] unloads their service tray. ")
else
- user.visible_message("\blue [user] drops all the items on their tray.")
+ user.visible_message("[user] drops all the items on their tray. ")
return ..()
@@ -488,8 +469,8 @@
desc = "A bag for storing pills, patches, and bottles."
storage_slots = 50
max_combined_w_class = 200
- w_class = 1
- can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle")
+ w_class = WEIGHT_CLASS_TINY
+ can_hold = list(/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
burn_state = FLAMMABLE
/*
* Biowaste bag (mostly for xenobiologists)
@@ -502,6 +483,6 @@
desc = "A bag for the safe transportation and disposal of biowaste and other biological materials."
storage_slots = 25
max_combined_w_class = 200
- w_class = 1
- can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector")
+ w_class = WEIGHT_CLASS_TINY
+ can_hold = list(/obj/item/slime_extract,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/blood,/obj/item/weapon/reagent_containers/hypospray/autoinjector)
burn_state = FLAMMABLE
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 904fb667932..dd1af4c6ea4 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -48,19 +48,18 @@
item_state = "utility"
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/crowbar",
- "/obj/item/weapon/screwdriver",
- "/obj/item/weapon/weldingtool",
- "/obj/item/weapon/wirecutters",
- "/obj/item/weapon/wrench",
- "/obj/item/device/multitool",
- "/obj/item/device/flashlight",
- "/obj/item/stack/cable_coil",
- "/obj/item/device/t_scanner",
- "/obj/item/device/analyzer",
- "/obj/item/taperoll/engineering",
- "/obj/item/weapon/extinguisher/mini")
-
+ /obj/item/weapon/crowbar,
+ /obj/item/weapon/screwdriver,
+ /obj/item/weapon/weldingtool,
+ /obj/item/weapon/wirecutters,
+ /obj/item/weapon/wrench,
+ /obj/item/device/multitool,
+ /obj/item/device/flashlight,
+ /obj/item/stack/cable_coil,
+ /obj/item/device/t_scanner,
+ /obj/item/device/analyzer,
+ /obj/item/taperoll/engineering,
+ /obj/item/weapon/extinguisher/mini)
/obj/item/weapon/storage/belt/utility/full/New()
..()
@@ -69,7 +68,7 @@
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
- new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
+ new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE))
update_icon()
/obj/item/weapon/storage/belt/utility/full/multitool/New()
@@ -88,7 +87,23 @@
new /obj/item/weapon/extinguisher/mini(src)
update_icon()
+/obj/item/weapon/storage/belt/utility/chief
+ name = "Chief Engineer's toolbelt"
+ desc = "Holds tools, looks snazzy"
+ icon_state = "utilitybelt_ce"
+ item_state = "utility_ce"
+/obj/item/weapon/storage/belt/utility/chief/full/New()
+ ..()
+ new /obj/item/weapon/screwdriver/power(src)
+ new /obj/item/weapon/crowbar/power(src)
+ new /obj/item/weapon/weldingtool/experimental(src)//This can be changed if this is too much
+ new /obj/item/device/multitool(src)
+ new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE))
+ new /obj/item/weapon/extinguisher/mini(src)
+ new /obj/item/device/analyzer(src)
+ update_icon()
+ //much roomier now that we've managed to remove two tools
/obj/item/weapon/storage/belt/medical
use_to_pickup = 1 //Allow medical belt to pick up medicine
@@ -98,24 +113,24 @@
item_state = "medical"
use_item_overlays = 1
can_hold = list(
- "/obj/item/device/healthanalyzer",
- "/obj/item/weapon/dnainjector",
- "/obj/item/weapon/reagent_containers/dropper",
- "/obj/item/weapon/reagent_containers/glass/beaker",
- "/obj/item/weapon/reagent_containers/glass/bottle",
- "/obj/item/weapon/reagent_containers/food/pill",
- "/obj/item/weapon/reagent_containers/syringe",
- "/obj/item/weapon/reagent_containers/glass/dispenser",
- "/obj/item/weapon/lighter/zippo",
- "/obj/item/weapon/storage/fancy/cigarettes",
- "/obj/item/weapon/storage/pill_bottle",
- "/obj/item/stack/medical",
- "/obj/item/device/flashlight/pen",
- "/obj/item/clothing/mask/surgical",
- "/obj/item/clothing/gloves/color/latex",
- "/obj/item/weapon/reagent_containers/hypospray/autoinjector",
- "/obj/item/device/rad_laser",
- "/obj/item/device/sensor_device"
+ /obj/item/device/healthanalyzer,
+ /obj/item/weapon/dnainjector,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/reagent_containers/glass/beaker,
+ /obj/item/weapon/reagent_containers/glass/bottle,
+ /obj/item/weapon/reagent_containers/food/pill,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/lighter/zippo,
+ /obj/item/weapon/storage/fancy/cigarettes,
+ /obj/item/weapon/storage/pill_bottle,
+ /obj/item/stack/medical,
+ /obj/item/device/flashlight/pen,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/clothing/gloves/color/latex,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector,
+ /obj/item/device/rad_laser,
+ /obj/item/device/sensor_device,
+ /obj/item/weapon/wrench/medical,
)
/obj/item/weapon/storage/belt/medical/response_team
@@ -139,22 +154,19 @@
item_state = "botany"
use_item_overlays = 1
can_hold = list(
- "/obj/item/device/analyzer/plant_analyzer",
- "/obj/item/weapon/minihoe",
- "/obj/item/weapon/hatchet",
- "/obj/item/weapon/reagent_containers/glass/bottle",
- "/obj/item/weapon/plantspray",
-// "/obj/item/weapon/reagent_containers/syringe",
-// "/obj/item/weapon/reagent_containers/glass/beaker",
- "/obj/item/weapon/lighter/zippo",
- "/obj/item/weapon/storage/fancy/cigarettes",
- "obj/item/weapon/rollingpaperpack",
- "/obj/item/weapon/shovel/spade",
- "/obj/item/device/flashlight/pen",
- "/obj/item/seeds",
- "/obj/item/weapon/wirecutters",
- "/obj/item/weapon/wrench",
- "/obj/item/weapon/disk/botany",
+ /obj/item/device/plant_analyzer,
+ /obj/item/weapon/cultivator,
+ /obj/item/weapon/hatchet,
+ /obj/item/weapon/reagent_containers/glass/bottle,
+// /obj/item/weapon/reagent_containers/syringe,
+// /obj/item/weapon/reagent_containers/glass/beaker,
+ /obj/item/weapon/lighter/zippo,
+ /obj/item/weapon/storage/fancy/cigarettes,
+ /obj/item/weapon/shovel/spade,
+ /obj/item/device/flashlight/pen,
+ /obj/item/seeds,
+ /obj/item/weapon/wirecutters,
+ /obj/item/weapon/wrench,
)
@@ -164,25 +176,25 @@
icon_state = "securitybelt"
item_state = "security"//Could likely use a better one.
storage_slots = 5
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/grenade/flashbang",
- "/obj/item/weapon/grenade/chem_grenade/teargas",
- "/obj/item/weapon/reagent_containers/spray/pepper",
- "/obj/item/weapon/restraints/handcuffs",
- "/obj/item/device/flash",
- "/obj/item/clothing/glasses",
- "/obj/item/ammo_casing/shotgun",
- "/obj/item/ammo_box",
- "/obj/item/weapon/reagent_containers/food/snacks/donut",
- "/obj/item/weapon/kitchen/knife/combat",
- "/obj/item/weapon/melee/baton",
- "/obj/item/weapon/melee/classic_baton",
- "/obj/item/device/flashlight/seclite",
- "/obj/item/taperoll/police",
- "/obj/item/weapon/melee/classic_baton/telescopic",
- "/obj/item/weapon/restraints/legcuffs/bola")
+ /obj/item/weapon/grenade/flashbang,
+ /obj/item/weapon/grenade/chem_grenade/teargas,
+ /obj/item/weapon/reagent_containers/spray/pepper,
+ /obj/item/weapon/restraints/handcuffs,
+ /obj/item/device/flash,
+ /obj/item/clothing/glasses,
+ /obj/item/ammo_casing/shotgun,
+ /obj/item/ammo_box,
+ /obj/item/weapon/reagent_containers/food/snacks/donut,
+ /obj/item/weapon/kitchen/knife/combat,
+ /obj/item/weapon/melee/baton,
+ /obj/item/weapon/melee/classic_baton,
+ /obj/item/device/flashlight/seclite,
+ /obj/item/taperoll/police,
+ /obj/item/weapon/melee/classic_baton/telescopic,
+ /obj/item/weapon/restraints/legcuffs/bola)
/obj/item/weapon/storage/belt/security/sec/New()
..()
@@ -236,6 +248,24 @@
desc = "A syndicate belt designed to be used by boarding parties. Its style is modelled after the hardsuits they wear."
icon_state = "militarybelt"
item_state = "military"
+ max_w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/weapon/storage/belt/military/abductor
+ name = "agent belt"
+ desc = "A belt used by abductor agents."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "belt"
+ item_state = "security"
+
+/obj/item/weapon/storage/belt/military/abductor/full/New()
+ ..()
+ new /obj/item/weapon/screwdriver/abductor(src)
+ new /obj/item/weapon/wrench/abductor(src)
+ new /obj/item/weapon/weldingtool/abductor(src)
+ new /obj/item/weapon/crowbar/abductor(src)
+ new /obj/item/weapon/wirecutters/abductor(src)
+ new /obj/item/device/multitool/abductor(src)
+ new /obj/item/stack/cable_coil(src, 30, COLOR_WHITE)
/obj/item/weapon/storage/belt/military/assault
name = "assault belt"
@@ -250,15 +280,15 @@
icon_state = "janibelt"
item_state = "janibelt"
storage_slots = 6
- max_w_class = 4 // Set to this so the light replacer can fit.
+ max_w_class = WEIGHT_CLASS_BULKY // Set to this so the light replacer can fit.
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/grenade/chem_grenade/cleaner",
- "/obj/item/device/lightreplacer",
- "/obj/item/device/flashlight",
- "/obj/item/weapon/reagent_containers/spray",
- "/obj/item/weapon/soap",
- "/obj/item/weapon/holosign_creator"
+ /obj/item/weapon/grenade/chem_grenade/cleaner,
+ /obj/item/device/lightreplacer,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/reagent_containers/spray,
+ /obj/item/weapon/soap,
+ /obj/item/weapon/holosign_creator
)
/obj/item/weapon/storage/belt/janitor/full/New()
@@ -276,11 +306,11 @@
desc = "For the mining master, holds your lazarus capsules."
icon_state = "lazarusbelt"
item_state = "lazbelt"
- w_class = 4
- max_w_class = 1
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_TINY
max_combined_w_class = 6
storage_slots = 6
- can_hold = list("/obj/item/device/mobcapsule")
+ can_hold = list(/obj/item/device/mobcapsule)
/obj/item/weapon/storage/belt/lazarus/New()
..()
@@ -309,7 +339,7 @@
item_state = "bandolier"
storage_slots = 8
can_hold = list(
- "/obj/item/ammo_casing/shotgun"
+ /obj/item/ammo_casing/shotgun
)
/obj/item/weapon/storage/belt/bandolier/New()
@@ -349,10 +379,10 @@
icon_state = "holster"
item_state = "holster"
storage_slots = 1
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
can_hold = list(
- "/obj/item/weapon/gun/projectile/automatic/pistol",
- "/obj/item/weapon/gun/projectile/revolver/detective"
+ /obj/item/weapon/gun/projectile/automatic/pistol,
+ /obj/item/weapon/gun/projectile/revolver/detective
)
/obj/item/weapon/storage/belt/wands
@@ -363,7 +393,7 @@
storage_slots = 6
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/gun/magic/wand"
+ /obj/item/weapon/gun/magic/wand
)
/obj/item/weapon/storage/belt/wands/full/New()
@@ -387,7 +417,7 @@
icon_state = "fannypack_leather"
item_state = "fannypack_leather"
storage_slots = 3
- max_w_class = 2
+ max_w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/storage/belt/fannypack/black
name = "black fannypack"
@@ -445,9 +475,9 @@
icon_state = "sheath"
item_state = "sheath"
storage_slots = 1
- w_class = 4
- max_w_class = 4
- can_hold = list("/obj/item/weapon/melee/rapier")
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_BULKY
+ can_hold = list(/obj/item/weapon/melee/rapier)
/obj/item/weapon/storage/belt/rapier/update_icon()
icon_state = "[initial(icon_state)]"
@@ -476,8 +506,8 @@
icon_state = "holdingbelt"
item_state = "holdingbelt"
storage_slots = 14
- w_class = 4
- max_w_class = 2
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_SMALL
max_combined_w_class = 21 // = 14 * 1.5, not 14 * 2. This is deliberate
origin_tech = "bluespace=4"
can_hold = list()
@@ -485,10 +515,10 @@
proc/failcheck(mob/user as mob)
if(prob(src.reliability)) return 1 //No failure
if(prob(src.reliability))
- to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure
+ to_chat(user, "The Bluespace portal resists your attempt to add another item. ")//light failure
else
- to_chat(user, "\red The Bluespace generator malfunctions!")
+ to_chat(user, "The Bluespace generator malfunctions! ")
for(var/obj/O in src.contents) //it broke, delete what was in it
qdel(O)
crit_fail = 1
@@ -500,13 +530,13 @@
icon_state = "securitybelt"
item_state = "security"
storage_slots = 6
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 18
origin_tech = "bluespace=4;syndicate=2"
allow_quick_empty = 1
can_hold = list(
- "/obj/item/weapon/grenade/smokebomb",
- "/obj/item/weapon/restraints/legcuffs/bola"
+ /obj/item/weapon/grenade/smokebomb,
+ /obj/item/weapon/restraints/legcuffs/bola
)
flags = NODROP
@@ -554,48 +584,6 @@
if(H.s_active && H.s_active == src)
H.s_active.show_to(H)
-
-/* DEPRECATED DUE TO SUPERHERO CODE AND NODROP
- // As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear...
- // Of course, it could be worse. It could spawn a singularity!
-/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag)
- if(!flag)
- return
- if(istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet))
- return
- to_chat(user, "Planting explosives...")
- user.visible_message("[user.name] is fiddling with their toolbelt.")
- if(ismob(target))
- user.attack_log += "\[[time_stamp()]\] [user.real_name] tried planting [name] on [target:real_name] ([target:ckey]) "
- log_attack(" [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey]) ")
- user.visible_message("\red [user.name] is trying to strap a belt to [target.name]!")
-
-
- if(do_after(user, 50, target = target) && in_range(user, target))
- user.drop_item()
- target = target
- loc = null
- var/location
- if(isturf(target)) location = target
- if(ismob(target))
- target:attack_log += "\[[time_stamp()]\] Had the [name] planted on them by [user.real_name] ([user.ckey]) "
- user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
- target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2")
- to_chat(user, "You sacrifice your belt for the sake of justice. Timer counting down from 15.")
- spawn(150)
- if(target)
- if(ismob(target) || isobj(target))
- location = target.loc // These things can move
- explosion(location, -1, -1, 2, 3)
- if(istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
- else target.ex_act(1)
- if(isobj(target))
- if(target)
- qdel(target)
- if(src)
- qdel(src)
-*/
-
/obj/item/weapon/storage/belt/bluespace/attack(mob/M as mob, mob/user as mob, def_zone)
return
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm
index 5a21ff0dc81..17bf8fcac8e 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/bible.dm
@@ -4,7 +4,7 @@
icon_state ="bible"
throw_speed = 1
throw_range = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
burn_state = FLAMMABLE
var/mob/affecting = null
var/deity_name = "Christ"
@@ -23,16 +23,16 @@
..()
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
+ new /obj/item/stack/spacecash(src)
+ new /obj/item/stack/spacecash(src)
+ new /obj/item/stack/spacecash(src)
//BS12 EDIT
// All cult functionality moved to Null Rod
/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/heal_amt = 10
- for(var/obj/item/organ/external/affecting in H.organs)
+ for(var/obj/item/organ/external/affecting in H.bodyparts)
if(affecting.heal_damage(heal_amt, heal_amt))
H.UpdateDamageIcon()
return
@@ -44,8 +44,8 @@
chaplain = 1
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey]) ")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey]) ")
+ M.create_attack_log("Has been attacked with [src.name] by [user.name] ([user.ckey]) ")
+ user.create_attack_log("Used the [src.name] to attack [M.name] ([M.ckey]) ")
log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) ")
if(!iscarbon(user))
@@ -54,15 +54,15 @@
M.LAssailant = user
if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- to_chat(user, "\red You don't have the dexterity to do this!")
+ to_chat(user, "You don't have the dexterity to do this! ")
return
if(!chaplain)
- to_chat(user, "\red The book sizzles in your hands.")
+ to_chat(user, "The book sizzles in your hands. ")
user.take_organ_damage(0,10)
return
if((CLUMSY in user.mutations) && prob(50))
- to_chat(user, "\red The [src] slips out of your hand and hits your head.")
+ to_chat(user, "The [src] slips out of your hand and hits your head. ")
user.take_organ_damage(10)
user.Paralyse(20)
return
@@ -72,19 +72,19 @@
if(M.stat !=2)
/*if((M.mind in ticker.mode.cult) && (prob(20)))
- to_chat(M, "\red The power of [src.deity_name] clears your mind of heresy!")
- to_chat(user, "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!")
+ to_chat(M, "The power of [src.deity_name] clears your mind of heresy! ")
+ to_chat(user, "You see how [M]'s eyes become clear, the cult no longer holds control over him! ")
ticker.mode.remove_cultist(M.mind)*/
if((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))
O.show_message(text("[] heals [] with the power of [src.deity_name]! ", user, M), 1)
- to_chat(M, "\red May the power of [src.deity_name] compel you to be healed!")
+ to_chat(M, "May the power of [src.deity_name] compel you to be healed! ")
playsound(src.loc, "punch", 25, 1, -1)
else
if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet))
M.adjustBrainLoss(10)
- to_chat(M, "\red You feel dumber.")
+ to_chat(M, "You feel dumber. ")
for(var/mob/O in viewers(M, null))
O.show_message(text("[] beats [] over the head with []! ", user, M, src), 1)
playsound(src.loc, "punch", 25, 1, -1)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index bfdc3a80727..594028e4f1f 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -137,21 +137,77 @@
new /obj/item/weapon/dnainjector/m2h(src)
new /obj/item/weapon/dnainjector/m2h(src)
-/obj/item/weapon/storage/box/gauge
- name = "box of 12 gauge slugs"
- desc = "It has a picture of a gun and several warning symbols on the front."
- materials = list(MAT_METAL=28000)
+/obj/item/weapon/storage/box/slug
+ name = "Ammunition Box (Slug)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "slugbox"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
+/obj/item/weapon/storage/box/slug/New()
+ ..()
+ for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun(src)
+
+/obj/item/weapon/storage/box/buck
+ name = "Ammunition Box (Buckshot)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "buckshotbox"
+
+/obj/item/weapon/storage/box/buck/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/buckshot(src)
+
+/obj/item/weapon/storage/box/dragonsbreath
+ name = "Ammunition Box (Dragonsbreath)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "dragonsbreathbox"
+
+/obj/item/weapon/storage/box/dragonsbreath/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(src)
+
+/obj/item/weapon/storage/box/stun
+ name = "Ammunition Box (Stun shells)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "stunbox"
+
+/obj/item/weapon/storage/box/stun/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/stunslug(src)
+
+/obj/item/weapon/storage/box/beanbag
+ name = "Ammunition Box (Beanbag shells)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "beanbagbox"
+
+/obj/item/weapon/storage/box/beanbag/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/beanbag(src)
+
+/obj/item/weapon/storage/box/rubbershot
+ name = "Ammunition Box (Rubbershot shells)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "rubbershotbox"
+
+/obj/item/weapon/storage/box/rubbershot/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/rubbershot(src)
+
+/obj/item/weapon/storage/box/tranquilizer
+ name = "Ammunition Box (Tranquilizer darts)"
+ desc = "A small box capable of holding seven shotgun shells."
+ icon_state = "tranqbox"
+
+/obj/item/weapon/storage/box/tranquilizer/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/tranquilizer(src)
+
/obj/item/weapon/storage/box/flashbangs
name = "box of flashbangs (WARNING)"
desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use. "
@@ -390,71 +446,48 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "monkeycubebox"
storage_slots = 7
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube")
- New()
- ..()
- for(var/i = 1; i <= 5; i++)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
-/obj/item/weapon/storage/box/farwacubes
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube)
+ var/monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube
+
+/obj/item/weapon/storage/box/monkeycubes/New()
+ ..()
+ for(var/i in 1 to 5)
+ new monkey_cube_type(src)
+
+/obj/item/weapon/storage/box/monkeycubes/farwacubes
name = "farwa cube box"
desc = "Drymate brand farwa cubes. Just add water!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "monkeycubebox"
- storage_slots = 7
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube")
- New()
- ..()
- for(var/i = 1; i <= 5; i++)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube(src)
+ monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube
-/obj/item/weapon/storage/box/stokcubes
+/obj/item/weapon/storage/box/monkeycubes/stokcubes
name = "stok cube box"
desc = "Drymate brand stok cubes. Just add water!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "monkeycubebox"
- storage_slots = 7
- can_hold = list("/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube")
- New()
- ..()
- for(var/i = 1; i <= 5; i++)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube(src)
+ monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube
-/obj/item/weapon/storage/box/neaeracubes
+/obj/item/weapon/storage/box/monkeycubes/neaeracubes
name = "neaera cube box"
desc = "Drymate brand neaera cubes. Just add water!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "monkeycubebox"
- storage_slots = 7
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube")
- New()
- ..()
- for(var/i = 1; i <= 5; i++)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src)
+ monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube
-
-/obj/item/weapon/storage/box/wolpincubes
+/obj/item/weapon/storage/box/monkeycubes/wolpincubes
name = "wolpin cube box"
desc = "Drymate brand wolpin cubes. Just add water!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "monkeycubebox"
- storage_slots = 7
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube")
- New()
- ..()
- for(var/i = 1; i <= 5; i++)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube(src)
-
+ monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube
/obj/item/weapon/storage/box/permits
name = "box of construction permits"
desc = "A box for containing construction permits, used to officially declare built rooms as additions to the station."
icon_state = "id"
-/obj/item/weapon/storage/box/permits/New() //There's only a few, so blueprints are still useful beyond setting every room's name to PRIMARY FART STORAGE
+/obj/item/weapon/storage/box/permits/New()
..()
new /obj/item/areaeditor/permit(src)
new /obj/item/areaeditor/permit(src)
new /obj/item/areaeditor/permit(src)
+ new /obj/item/areaeditor/permit(src)
+ new /obj/item/areaeditor/permit(src)
+ new /obj/item/areaeditor/permit(src)
+ new /obj/item/areaeditor/permit(src)
/obj/item/weapon/storage/box/ids
@@ -588,7 +621,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "spbox"
storage_slots = 8
- can_hold = list("/obj/item/toy/snappop")
+ can_hold = list(/obj/item/toy/snappop)
New()
..()
for(var/i=1; i <= storage_slots; i++)
@@ -601,8 +634,10 @@
icon_state = "matchbox"
item_state = "zippo"
storage_slots = 10
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
+ max_w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
+ can_hold = list(/obj/item/weapon/match)
New()
..()
@@ -648,7 +683,7 @@
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots=21
- can_hold = list("/obj/item/weapon/light/tube", "/obj/item/weapon/light/bulb")
+ can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
max_combined_w_class = 21
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
@@ -775,4 +810,4 @@
#undef NANOTRASEN
#undef SYNDI
#undef HEART
-#undef SMILE
\ No newline at end of file
+#undef SMILE
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 7f2a91054c1..89122d1a337 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -8,12 +8,12 @@
force = 8.0
throw_speed = 2
throw_range = 4
- w_class = 4
- max_w_class = 3
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
burn_state = FLAMMABLE
burntime = 20
/obj/item/weapon/storage/briefcase/New()
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 1d8990875a4..d8de4ee7c53 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -48,7 +48,7 @@
icon_type = "donut"
name = "donut box"
storage_slots = 6
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/donut")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut)
/obj/item/weapon/storage/fancy/donut_box/New()
@@ -66,7 +66,7 @@
icon_type = "egg"
name = "egg box"
storage_slots = 12
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/egg")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg)
/obj/item/weapon/storage/fancy/egg_box/New()
..()
@@ -115,11 +115,11 @@
desc = "A box of crayons for all your rune drawing needs."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonbox"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
storage_slots = 6
icon_type = "crayon"
can_hold = list(
- "/obj/item/toy/crayon"
+ /obj/item/toy/crayon
)
/obj/item/weapon/storage/fancy/crayons/New()
@@ -158,17 +158,17 @@
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cigpacket"
item_state = "cigpacket"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 2
slot_flags = SLOT_BELT
storage_slots = 6
max_combined_w_class = 6
- can_hold = list("/obj/item/clothing/mask/cigarette",
- "/obj/item/weapon/lighter",
- "/obj/item/weapon/match")
- cant_hold = list("/obj/item/clothing/mask/cigarette/cigar",
- "/obj/item/clothing/mask/cigarette/pipe",
- "/obj/item/weapon/lighter/zippo")
+ can_hold = list(/obj/item/clothing/mask/cigarette,
+ /obj/item/weapon/lighter,
+ /obj/item/weapon/match)
+ cant_hold = list(/obj/item/clothing/mask/cigarette/cigar,
+ /obj/item/clothing/mask/cigarette/pipe,
+ /obj/item/weapon/lighter/zippo)
icon_type = "cigarette"
var/list/unlaced_cigarettes = list() // Cigarettes that haven't received reagents yet
var/default_reagents = list("nicotine" = 15) // List of reagents to pre-generate for each cigarette
@@ -176,8 +176,8 @@
/obj/item/weapon/storage/fancy/cigarettes/New()
..()
- flags |= NOREACT
create_reagents(30 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
+ reagents.set_reacting(FALSE)
for(var/i = 1 to storage_slots)
var/obj/item/clothing/mask/cigarette/C = new cigarette_type(src)
unlaced_cigarettes += C
@@ -186,7 +186,7 @@
/obj/item/weapon/storage/fancy/cigarettes/Destroy()
- qdel(reagents)
+ QDEL_NULL(reagents)
return ..()
@@ -315,6 +315,26 @@
item_state = "cigpacket"
cigarette_type = /obj/item/clothing/mask/cigarette/random
+/obj/item/weapon/storage/fancy/rollingpapers
+ name = "rolling paper pack"
+ desc = "A pack of NanoTrasen brand rolling papers."
+ w_class = WEIGHT_CLASS_TINY
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_state = "cig_paper_pack"
+ storage_slots = 10
+ icon_type = "rolling paper"
+ can_hold = list(/obj/item/weapon/rollingpaper)
+
+/obj/item/weapon/storage/fancy/rollingpapers/New()
+ ..()
+ for(var/i in 1 to storage_slots)
+ new /obj/item/weapon/rollingpaper(src)
+
+/obj/item/weapon/storage/fancy/rollingpapers/update_icon()
+ overlays.Cut()
+ if(!contents.len)
+ overlays += "[icon_state]_empty"
+
/*
* Vial Box
*/
@@ -325,7 +345,7 @@
icon_type = "vial"
name = "vial storage box"
storage_slots = 6
- can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial")
+ can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
/obj/item/weapon/storage/fancy/vials/New()
@@ -340,8 +360,8 @@
icon = 'icons/obj/vialbox.dmi'
icon_state = "vialbox0"
item_state = "syringe_kit"
- max_w_class = 3
- can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial")
+ max_w_class = WEIGHT_CLASS_NORMAL
+ can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
storage_slots = 6
req_access = list(access_virology)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 67d44c53b2d..8794c09014b 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -155,7 +155,7 @@
name = "first-aid kit"
icon_state = "bezerk"
desc = "I hope you've got insurance."
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
treatment_oxy = "perfluorodecalin"
treatment_brute = "styptic_powder"
treatment_fire = "silver_sulfadiazine"
@@ -181,11 +181,11 @@
name = "field surgery kit"
icon_state = "duffel-med"
desc = "A kit for surgery in the field."
- max_w_class = 4
+ max_w_class = WEIGHT_CLASS_BULKY
max_combined_w_class = 21
storage_slots = 10
- can_hold = list("/obj/item/roller","/obj/item/weapon/bonesetter","/obj/item/weapon/bonegel", "/obj/item/weapon/scalpel", "/obj/item/weapon/hemostat",
- "/obj/item/weapon/cautery", "/obj/item/weapon/retractor", "/obj/item/weapon/FixOVein", "/obj/item/weapon/surgicaldrill", "/obj/item/weapon/circular_saw")
+ can_hold = list(/obj/item/roller,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel, /obj/item/weapon/scalpel, /obj/item/weapon/hemostat,
+ /obj/item/weapon/cautery, /obj/item/weapon/retractor, /obj/item/weapon/FixOVein, /obj/item/weapon/surgicaldrill, /obj/item/weapon/circular_saw)
/obj/item/weapon/storage/firstaid/surgery/New()
..()
@@ -209,8 +209,8 @@
icon_state = "pill_canister"
icon = 'icons/obj/chemical.dmi'
item_state = "contsolid"
- w_class = 2
- can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/dice","/obj/item/weapon/paper")
+ w_class = WEIGHT_CLASS_SMALL
+ can_hold = list(/obj/item/weapon/reagent_containers/food/pill, /obj/item/weapon/dice, /obj/item/weapon/paper)
allow_quick_gather = 1
use_to_pickup = 1
storage_slots = 14
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 448395df3e4..2f4a3b2e5ac 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -5,8 +5,8 @@
desc = "A locked box."
icon_state = "lockbox+l"
item_state = "syringe_kit"
- w_class = 4
- max_w_class = 3
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
storage_slots = 4
req_access = list(access_armory)
@@ -76,20 +76,20 @@
/obj/item/weapon/storage/lockbox/large
name = "Large lockbox"
desc = "A large lockbox"
- max_w_class = 4
+ max_w_class = WEIGHT_CLASS_BULKY
max_combined_w_class = 4 //The sum of the w_classes of all the items in this storage item.
storage_slots = 1
-/obj/item/weapon/storage/lockbox/loyalty
+/obj/item/weapon/storage/lockbox/mindshield
name = "Lockbox (Mindshield Implants)"
req_access = list(access_security)
-/obj/item/weapon/storage/lockbox/loyalty/New()
+/obj/item/weapon/storage/lockbox/mindshield/New()
..()
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implanter/loyalty(src)
+ new /obj/item/weapon/implantcase/mindshield(src)
+ new /obj/item/weapon/implantcase/mindshield(src)
+ new /obj/item/weapon/implantcase/mindshield(src)
+ new /obj/item/weapon/implanter/mindshield(src)
/obj/item/weapon/storage/lockbox/clusterbang
name = "lockbox (clusterbang)"
@@ -105,8 +105,8 @@
desc = "A locked box used to store medals of honor."
icon_state = "medalbox+l"
item_state = "syringe_kit"
- w_class = 3
- max_w_class = 2
+ w_class = WEIGHT_CLASS_NORMAL
+ max_w_class = WEIGHT_CLASS_SMALL
max_combined_w_class = 20
storage_slots = 12
req_access = list(access_captain)
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index e848eec1aca..7619fd953d7 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -23,8 +23,8 @@
var/l_hacking = 0
var/emagged = 0
var/open = 0
- w_class = 3
- max_w_class = 2
+ w_class = WEIGHT_CLASS_NORMAL
+ max_w_class = WEIGHT_CLASS_SMALL
max_combined_w_class = 14
/obj/item/weapon/storage/secure/examine(mob/user)
@@ -37,7 +37,7 @@
emag_act(user, W)
if(istype(W, /obj/item/weapon/screwdriver))
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
open = !open
user.show_message("You [open ? "open" : "close"] the service panel. ", 1)
return
@@ -45,18 +45,18 @@
if((istype(W, /obj/item/device/multitool)) && (open == 1) && (!l_hacking))
user.show_message("Now attempting to reset internal memory, please hold. ", 1)
l_hacking = 1
- if(do_after(usr, 100, target = src))
+ if(do_after(usr, 100 * W.toolspeed, target = src))
if(prob(40))
l_setshort = 1
l_set = 0
- user.show_message("Internal memory reset. Please give it a few seconds to reinitialize. ", 1)
+ user.show_message("Internal memory reset. Please give it a few seconds to reinitialize. ", 1)
sleep(80)
l_setshort = 0
l_hacking = 0
else
user.show_message("Unable to reset internal memory. ", 1)
l_hacking = 0
- else
+ else
l_hacking = 0
return
//At this point you have exhausted all the special things to do when locked
@@ -180,8 +180,8 @@
force = 8
throw_speed = 2
throw_range = 4
- w_class = 4
- max_w_class = 3
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
@@ -212,9 +212,9 @@
force = 15
/obj/item/weapon/storage/secure/briefcase/syndie/New()
- ..()
+ ..()
for(var/i = 0, i < storage_slots - 2, i++)
- handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
+ handle_item_insertion(new /obj/item/stack/spacecash/c1000, 1)
// -----------------------------
// Secure Safe
@@ -228,11 +228,11 @@
icon_locking = "safeb"
icon_sparking = "safespark"
force = 8
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
max_w_class = 8
anchored = 1
density = 0
- cant_hold = list("/obj/item/weapon/storage/secure/briefcase")
+ cant_hold = list(/obj/item/weapon/storage/secure/briefcase)
/obj/item/weapon/storage/secure/safe/New()
..()
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 40f56f7000f..21ea7c33993 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -8,11 +8,11 @@
/obj/item/weapon/storage
name = "storage"
icon = 'icons/obj/storage.dmi'
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/silent = 0 // No message on putting items in
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
- var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set)
+ var/max_w_class = WEIGHT_CLASS_SMALL //Max size of objects that this object can store (in effect only if can_hold isn't set)
var/max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
var/storage_slots = 7 //The number of storage slots in this container.
var/obj/screen/storage/boxes = null
@@ -242,27 +242,19 @@
return 0 //Storage item is full
if(can_hold.len)
- var/ok = 0
- for(var/A in can_hold)
- if(istype(W, text2path(A) ))
- ok = 1
- break
- if(!ok)
+ if(!is_type_in_typecache(W, can_hold))
if(!stop_messages)
- if(istype(W, /obj/item/weapon/hand_labeler))
- return 0
to_chat(usr, "[src] cannot hold [W]. ")
return 0
- for(var/A in cant_hold) //Check for specific items which this container can't hold.
- if(istype(W, text2path(A) ))
- if(!stop_messages)
- to_chat(usr, "[src] cannot hold [W]. ")
- return 0
+ if(is_type_in_typecache(W, cant_hold)) //Check for specific items which this container can't hold.
+ if(!stop_messages)
+ to_chat(usr, "[src] cannot hold [W]. ")
+ return 0
if(W.w_class > max_w_class)
if(!stop_messages)
- to_chat(usr, "[W] is too big for this [src]. ")
+ to_chat(usr, "[W] is too big for [src]. ")
return 0
var/sum_w_class = W.w_class
@@ -298,7 +290,7 @@
usr.update_icons() //update our overlays
if(silent)
prevent_warning = 1
- W.loc = src
+ W.forceMove(src)
W.on_enter_storage(src)
if(usr)
if(usr.client && usr.s_active != src)
@@ -312,7 +304,7 @@
to_chat(usr, "You put the [W] into [src]. ")
else if(M in range(1)) //If someone is standing close enough, they can tell what it is...
M.show_message("[usr] puts [W] into [src]. ")
- else if(W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
+ else if(W && W.w_class >= WEIGHT_CLASS_NORMAL) //Otherwise they can only see large or normal items from a distance...
M.show_message("[usr] puts [W] into [src]. ")
src.orient2hud(usr)
@@ -344,9 +336,9 @@
else
W.layer = initial(W.layer)
W.plane = initial(W.plane)
- W.loc = new_location
+ W.forceMove(new_location)
else
- W.loc = get_turf(src)
+ W.forceMove(get_turf(src))
if(usr)
src.orient2hud(usr)
@@ -370,7 +362,7 @@
..()
if(isrobot(user))
- to_chat(user, "\blue You're a robot. No.")
+ to_chat(user, "You're a robot. No. ")
return 1//Robots can't interact with storage items.
if(!can_be_inserted(W))
@@ -432,6 +424,8 @@
remove_from_storage(I, T)
/obj/item/weapon/storage/New()
+ can_hold = typecacheof(can_hold)
+ cant_hold = typecacheof(cant_hold)
if(allow_quick_empty)
verbs += /obj/item/weapon/storage/verb/quick_empty
@@ -455,14 +449,13 @@
src.closer.layer = 20
src.closer.plane = HUD_PLANE
orient2hud()
- return
/obj/item/weapon/storage/Destroy()
for(var/obj/O in contents)
O.mouse_opacity = initial(O.mouse_opacity)
- qdel(boxes)
- qdel(closer)
+ QDEL_NULL(boxes)
+ QDEL_NULL(closer)
return ..()
/obj/item/weapon/storage/emp_act(severity)
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index fd44bacbf53..3c7bcee7ab4 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -9,47 +9,41 @@
throwforce = 10.0
throw_speed = 2
throw_range = 7
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL = 500)
origin_tech = "combat=1"
attack_verb = list("robusted")
- hitsound = "sound/weapons/smash.ogg"
-
- New()
- ..()
- if(src.type == /obj/item/weapon/storage/toolbox)
- to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]")
- qdel(src)
+ hitsound = 'sound/weapons/smash.ogg'
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
icon_state = "red"
item_state = "toolbox_red"
- New()
- ..()
- new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/weldingtool/mini(src)
- new /obj/item/weapon/extinguisher/mini(src)
- if(prob(50))
- new /obj/item/device/flashlight(src)
- else
- new /obj/item/device/flashlight/flare(src)
- new /obj/item/device/radio(src)
+/obj/item/weapon/storage/toolbox/emergency/New()
+ ..()
+ new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/weapon/weldingtool/mini(src)
+ new /obj/item/weapon/extinguisher/mini(src)
+ if(prob(50))
+ new /obj/item/device/flashlight(src)
+ else
+ new /obj/item/device/flashlight/flare(src)
+ new /obj/item/device/radio(src)
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
icon_state = "blue"
item_state = "toolbox_blue"
- New()
- ..()
- new /obj/item/weapon/screwdriver(src)
- new /obj/item/weapon/wrench(src)
- new /obj/item/weapon/weldingtool(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/device/analyzer(src)
- new /obj/item/weapon/wirecutters(src)
+/obj/item/weapon/storage/toolbox/mechanical/New()
+ ..()
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/device/analyzer(src)
+ new /obj/item/weapon/wirecutters(src)
/obj/item/weapon/storage/toolbox/mechanical/greytide
flags = NODROP
@@ -59,19 +53,19 @@
icon_state = "yellow"
item_state = "toolbox_yellow"
- New()
- ..()
- var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
- new /obj/item/weapon/screwdriver(src)
- new /obj/item/weapon/wirecutters(src)
- new /obj/item/device/t_scanner(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/stack/cable_coil(src,30,color)
- new /obj/item/stack/cable_coil(src,30,color)
- if(prob(5))
- new /obj/item/clothing/gloves/color/yellow(src)
- else
- new /obj/item/stack/cable_coil(src,30,color)
+/obj/item/weapon/storage/toolbox/electrical/New()
+ ..()
+ var/pickedcolor = pick(COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_PINK, COLOR_ORANGE, COLOR_CYAN, COLOR_WHITE)
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/t_scanner(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
+ if(prob(5))
+ new /obj/item/clothing/gloves/color/yellow(src)
+ else
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
/obj/item/weapon/storage/toolbox/syndicate
name = "suspicious looking toolbox"
@@ -82,12 +76,47 @@
force = 15.0
throwforce = 18.0
- New()
- ..()
- new /obj/item/weapon/screwdriver(src, "red")
- new /obj/item/weapon/wrench(src)
- new /obj/item/weapon/weldingtool/largetank(src)
- new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/wirecutters(src, "red")
- new /obj/item/device/multitool(src)
- new /obj/item/clothing/gloves/combat(src)
\ No newline at end of file
+/obj/item/weapon/storage/toolbox/syndicate/New()
+ ..()
+ new /obj/item/weapon/screwdriver(src, "red")
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool/largetank(src)
+ new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/weapon/wirecutters(src, "red")
+ new /obj/item/device/multitool(src)
+ new /obj/item/clothing/gloves/combat(src)
+
+/obj/item/weapon/storage/toolbox/drone
+ name = "mechanical toolbox"
+ icon_state = "blue"
+ item_state = "toolbox_blue"
+
+/obj/item/weapon/storage/toolbox/drone/New()
+ ..()
+ var/pickedcolor = pick(pick(COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_PINK, COLOR_ORANGE, COLOR_CYAN, COLOR_WHITE))
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
+ new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/multitool(src)
+
+/obj/item/weapon/storage/toolbox/brass
+ name = "brass box"
+ desc = "A huge brass box with several indentations in its surface."
+ icon_state = "brassbox"
+ item_state = null
+ w_class = WEIGHT_CLASS_HUGE
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = 28
+ storage_slots = 28
+ attack_verb = list("robusted", "crushed", "smashed")
+
+/obj/item/weapon/storage/toolbox/brass/prefilled/New()
+ ..()
+ new /obj/item/weapon/screwdriver/brass(src)
+ new /obj/item/weapon/wirecutters/brass(src)
+ new /obj/item/weapon/wrench/brass(src)
+ new /obj/item/weapon/crowbar/brass(src)
+ new /obj/item/weapon/weldingtool/experimental/brass(src)
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index e3f21a93d30..d721cb46271 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -1,86 +1,85 @@
/obj/item/weapon/storage/box/syndicate/
New()
..()
- switch(pickweight(list("bloodyspai" = 1, "stealth" = 1, "bond" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
+ switch(pickweight(list("bloodyspai" = 1, "thief" = 1, "bond" = 1, "sabotage" = 1, "payday" = 1, "implant" = 1, "hacker" = 1, "darklord" = 1, "gadgets" = 1)))
if("bloodyspai")
- new /obj/item/clothing/under/chameleon(src)
+ new /obj/item/weapon/twohanded/garrote(src)
+ new /obj/item/weapon/pinpointer/advpinpointer(src)
new /obj/item/clothing/mask/gas/voice(src)
+ new /obj/item/clothing/under/chameleon(src)
new /obj/item/weapon/card/id/syndicate(src)
- new /obj/item/weapon/card/id/syndicate(src)
- new /obj/item/clothing/shoes/syndigaloshes(src)
+ new /obj/item/weapon/storage/box/syndie_kit/emp(src)
new /obj/item/device/camera_bug(src)
return
- if("stealth")
+ if("thief")
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(src)
- new /obj/item/weapon/pen/sleepy(src)
new /obj/item/device/chameleon(src)
+ new /obj/item/clothing/gloves/color/black/thief(src)
+ new /obj/item/weapon/card/id/syndicate(src)
return
if("bond")
new /obj/item/weapon/gun/projectile/automatic/pistol(src)
new /obj/item/weapon/suppressor(src)
- new /obj/item/ammo_box/magazine/m10mm(src)
- new /obj/item/ammo_box/magazine/m10mm(src)
- new /obj/item/clothing/under/chameleon(src)
- new /obj/item/weapon/card/id/syndicate(src)
-
- if("screwed")
- new /obj/item/device/radio/beacon/syndicate/bomb(src)
- new /obj/item/weapon/grenade/syndieminibomb(src)
- new /obj/item/device/powersink(src)
- new /obj/item/clothing/suit/space/syndicate/black/red(src)
- new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
+ new /obj/item/ammo_box/magazine/m10mm/hp(src)
+ new /obj/item/device/encryptionkey/syndicate(src)
+ new /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate(src)
+ new /obj/item/weapon/implanter/krav_maga(src)
+ new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/alliescocktail(src)
return
- if("guns")
+ if("sabotage")
+ new /obj/item/device/powersink(src)
+ new /obj/item/weapon/grenade/syndieminibomb(src)
+ new /obj/item/weapon/card/emag(src)
+ new /obj/item/weapon/grenade/clusterbuster/n2o(src)
+ new /obj/item/weapon/storage/box/syndie_kit/space(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
+ new /obj/item/weapon/rcd/preloaded(src)
+ return
+
+ if("payday")
new /obj/item/weapon/gun/projectile/revolver(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/weapon/card/emag(src)
- new /obj/item/weapon/grenade/plastic/c4(src)
+ new /obj/item/weapon/grenade/plastic/x4(src)
+ new /obj/item/weapon/card/id/syndicate(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
- new /obj/item/clothing/under/suit_jacket/really_black(src)
- return
-
- if("murder")
- new /obj/item/weapon/melee/energy/sword/saber(src)
- new /obj/item/clothing/glasses/thermal/syndi(src)
- new /obj/item/weapon/card/emag(src)
- new /obj/item/clothing/shoes/syndigaloshes(src)
return
if("implant")
- new /obj/item/weapon/implanter/freedom(src)
new /obj/item/weapon/implanter/uplink(src)
- new /obj/item/weapon/implanter/emp(src)
new /obj/item/weapon/implanter/adrenalin(src)
- new /obj/item/weapon/implanter/explosive(src)
new /obj/item/weapon/implanter/storage(src)
+ new /obj/item/weapon/implanter/freedom(src)
return
if("hacker")
new /obj/item/weapon/aiModule/syndicate(src)
- new /obj/item/weapon/card/emag(src)
new /obj/item/device/encryptionkey/binary(src)
new /obj/item/weapon/aiModule/toyAI(src)
return
- if("lordsingulo")
- new /obj/item/device/radio/beacon/syndicate(src)
- new /obj/item/clothing/suit/space/syndicate/black/red(src)
- new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
- new /obj/item/weapon/card/emag(src)
- return
-
if("darklord")
- new /obj/item/weapon/melee/energy/sword/saber(src)
- new /obj/item/weapon/melee/energy/sword/saber(src)
+ new /obj/item/weapon/melee/energy/sword/saber/red(src)
+ new /obj/item/weapon/melee/energy/sword/saber/red(src)
new /obj/item/weapon/dnainjector/telemut/darkbundle(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/weapon/card/id/syndicate(src)
return
+ if("gadgets")
+ new /obj/item/clothing/gloves/color/yellow/power(src)
+ new /obj/item/weapon/pen/sleepy(src)
+ new /obj/item/clothing/glasses/thermal/syndi(src)
+ new /obj/item/device/flashlight/emp(src)
+ new /obj/item/clothing/shoes/syndigaloshes(src)
+ new /obj/item/weapon/stamp/chameleon(src)
+ new /obj/item/device/multitool/ai_detect(src)
+ return
+
/obj/item/weapon/storage/box/syndie_kit
name = "Box"
desc = "A sleek, sturdy box"
@@ -88,8 +87,8 @@
/obj/item/weapon/storage/box/syndie_kit/space
name = "Boxed Space Suit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/syndicate/black/red", "/obj/item/clothing/head/helmet/space/syndicate/black/red")
- max_w_class = 3
+ can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red)
+ max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/box/syndie_kit/space/New()
..()
@@ -99,34 +98,34 @@
/obj/item/weapon/storage/box/syndie_kit/hardsuit
name = "Boxed Blood Red Suit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/rig/syndi", "/obj/item/clothing/head/helmet/space/rig/syndi")
- max_w_class = 3
+ can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi)
+ max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/box/syndie_kit/hardsuit/New()
..()
- new /obj/item/clothing/suit/space/rig/syndi(src)
- new /obj/item/clothing/head/helmet/space/rig/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/syndi(src)
return
/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit
name = "Boxed Elite Syndicate Hardsuit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/rig/syndi/elite", "/obj/item/clothing/head/helmet/space/rig/syndi/elite")
- max_w_class = 3
+ can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi/elite, /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite)
+ max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit/New()
..()
- new /obj/item/clothing/suit/space/rig/syndi/elite(src)
- new /obj/item/clothing/head/helmet/space/rig/syndi/elite(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite(src)
/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit
name = "Boxed Shielded Syndicate Hardsuit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/rig/shielded/syndi", "/obj/item/clothing/head/helmet/space/rig/shielded/syndi")
- max_w_class = 4
+ can_hold = list(/obj/item/clothing/suit/space/hardsuit/shielded/syndi, /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi)
+ max_w_class = WEIGHT_CLASS_BULKY
/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New()
..()
- new /obj/item/clothing/suit/space/rig/shielded/syndi(src)
- new /obj/item/clothing/head/helmet/space/rig/shielded/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/shielded/syndi(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi(src)
/obj/item/weapon/storage/box/syndie_kit/conversion
name = "box (CK)"
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 5bc1ae65e84..667b2ca7605 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -4,28 +4,28 @@
storage_slots = 10
icon = 'icons/obj/wallets.dmi'
icon_state = "wallet"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
burn_state = FLAMMABLE
can_hold = list(
- "/obj/item/weapon/spacecash",
- "/obj/item/weapon/card",
- "/obj/item/clothing/mask/cigarette",
- "/obj/item/device/flashlight/pen",
- "/obj/item/seeds",
- "/obj/item/stack/medical",
- "/obj/item/toy/crayon",
- "/obj/item/weapon/coin",
- "/obj/item/weapon/dice",
- "/obj/item/weapon/disk",
- "/obj/item/weapon/implanter",
- "/obj/item/weapon/lighter",
- "/obj/item/weapon/match",
- "/obj/item/weapon/paper",
- "/obj/item/weapon/pen",
- "/obj/item/weapon/photo",
- "/obj/item/weapon/reagent_containers/dropper",
- "/obj/item/weapon/screwdriver",
- "/obj/item/weapon/stamp")
+ /obj/item/stack/spacecash,
+ /obj/item/weapon/card,
+ /obj/item/clothing/mask/cigarette,
+ /obj/item/device/flashlight/pen,
+ /obj/item/seeds,
+ /obj/item/stack/medical,
+ /obj/item/toy/crayon,
+ /obj/item/weapon/coin,
+ /obj/item/weapon/dice,
+ /obj/item/weapon/disk,
+ /obj/item/weapon/implanter,
+ /obj/item/weapon/lighter,
+ /obj/item/weapon/match,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/screwdriver,
+ /obj/item/weapon/stamp)
slot_flags = SLOT_ID
var/obj/item/weapon/card/id/front_id = null
@@ -76,18 +76,18 @@
/obj/item/weapon/storage/wallet/random/New()
..()
- var/item1_type = pick(/obj/item/weapon/spacecash,
- /obj/item/weapon/spacecash/c10,
- /obj/item/weapon/spacecash/c100,
- /obj/item/weapon/spacecash/c500,
- /obj/item/weapon/spacecash/c1000)
+ var/item1_type = pick(/obj/item/stack/spacecash,
+ /obj/item/stack/spacecash/c10,
+ /obj/item/stack/spacecash/c100,
+ /obj/item/stack/spacecash/c500,
+ /obj/item/stack/spacecash/c1000)
var/item2_type
if(prob(50))
- item2_type = pick(/obj/item/weapon/spacecash,
- /obj/item/weapon/spacecash/c10,
- /obj/item/weapon/spacecash/c100,
- /obj/item/weapon/spacecash/c500,
- /obj/item/weapon/spacecash/c1000)
+ item2_type = pick(/obj/item/stack/spacecash,
+ /obj/item/stack/spacecash/c10,
+ /obj/item/stack/spacecash/c100,
+ /obj/item/stack/spacecash/c500,
+ /obj/item/stack/spacecash/c1000)
var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron )
spawn(2)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 61d8d4fef91..ca91b988442 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -2,17 +2,18 @@
name = "stunbaton"
desc = "A stun baton for incapacitating people with."
icon_state = "stunbaton"
+ var/base_icon = "stunbaton"
item_state = "baton"
slot_flags = SLOT_BELT
force = 10
throwforce = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "combat=2"
attack_verb = list("beaten")
var/stunforce = 7
var/status = 0
var/obj/item/weapon/stock_parts/cell/high/bcell = null
- var/hitcost = 1500
+ var/hitcost = 1000
/obj/item/weapon/melee/baton/suicide_act(mob/user)
user.visible_message("[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide. ")
@@ -24,16 +25,9 @@
return
/obj/item/weapon/melee/baton/Destroy()
- if(bcell)
- qdel(bcell)
- bcell = null
+ QDEL_NULL(bcell)
return ..()
-/obj/item/weapon/melee/baton/CheckParts(list/parts_list)
- ..()
- bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
- update_icon()
-
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
..()
bcell = new(src)
@@ -53,11 +47,11 @@
/obj/item/weapon/melee/baton/update_icon()
if(status)
- icon_state = "[initial(name)]_active"
+ icon_state = "[base_icon]_active"
else if(!bcell)
- icon_state = "[initial(name)]_nocell"
+ icon_state = "[base_icon]_nocell"
else
- icon_state = "[initial(name)]"
+ icon_state = "[base_icon]"
/obj/item/weapon/melee/baton/examine(mob/user)
..(user)
@@ -189,19 +183,29 @@
return 1
..()
-
-//secborg stun baton module
-/obj/item/weapon/melee/baton/loaded/robot
- hitcost = 1000
-
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/weapon/melee/baton/cattleprod
name = "stunprod"
desc = "An improvised stun baton."
icon_state = "stunprod_nocell"
+ base_icon = "stunprod"
item_state = "prod"
+ w_class = WEIGHT_CLASS_NORMAL
force = 3
throwforce = 5
stunforce = 5
- hitcost = 3750
- slot_flags = null
+ hitcost = 2000
+ slot_flags = SLOT_BACK
+ var/obj/item/device/assembly/igniter/sparkler = null
+
+/obj/item/weapon/melee/baton/cattleprod/New()
+ ..()
+ sparkler = new(src)
+
+/obj/item/weapon/melee/baton/cattleprod/Destroy()
+ QDEL_NULL(sparkler)
+ return ..()
+
+/obj/item/weapon/melee/baton/cattleprod/baton_stun()
+ if(sparkler.activate())
+ ..()
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index 786b980d38f..e55b2451347 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -25,7 +25,7 @@
item_state = "classic_baton"
slot_flags = SLOT_BELT
force = 12 //9 hit crit
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/cooldown = 0
var/on = 1
@@ -90,7 +90,7 @@
icon_state = "telebaton_0"
item_state = null
slot_flags = SLOT_BELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
needs_permit = 0
force = 0
on = 0
@@ -101,7 +101,7 @@
to_chat(user, "You extend the baton. ")
icon_state = "telebaton_1"
item_state = "nullrod"
- w_class = 4 //doesnt fit in backpack when its on for balance
+ w_class = WEIGHT_CLASS_BULKY //doesnt fit in backpack when its on for balance
force = 10 //stunbaton damage
attack_verb = list("smacked", "struck", "cracked", "beaten")
else
@@ -109,7 +109,7 @@
icon_state = "telebaton_0"
item_state = null //no sprite for concealment even when in hand
slot_flags = SLOT_BELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 0 //not so robust now
attack_verb = list("hit", "poked")
if(istype(user,/mob/living/carbon/human))
diff --git a/code/game/objects/items/weapons/syndie_uplink.dm b/code/game/objects/items/weapons/syndie_uplink.dm
index 3dd9a230ad1..0515dd41dd3 100644
--- a/code/game/objects/items/weapons/syndie_uplink.dm
+++ b/code/game/objects/items/weapons/syndie_uplink.dm
@@ -10,7 +10,7 @@
var/mob/currentUser = null
var/obj/item/device/radio/origradio = null
flags = CONDUCT | ONBELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
item_state = "radio"
throw_speed = 4
throw_range = 20
@@ -31,8 +31,8 @@
slot_flags = SLOT_BELT
item_state = "radio"
throwforce = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 4
throw_range = 20
materials = list(MAT_METAL=100)
- origin_tech = "magnets=1"
\ No newline at end of file
+ origin_tech = "magnets=1"
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index c9c9497cb71..eef5475bdcd 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -4,7 +4,7 @@
name = "Jetpack (Empty)"
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
icon_state = "jetpack"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
item_state = "jetpack"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
var/datum/effect/system/ion_trail_follow/ion_trail
@@ -19,8 +19,7 @@
ion_trail.set_up(src)
/obj/item/weapon/tank/jetpack/Destroy()
- qdel(ion_trail)
- ion_trail = null
+ QDEL_NULL(ion_trail)
return ..()
/obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype)
@@ -82,7 +81,7 @@
var/datum/gas_mixture/removed = air_contents.remove(num)
if(removed.total_moles() < 0.005)
- turn_off()
+ turn_off()
return 0
var/turf/T = get_turf(user)
@@ -117,7 +116,7 @@
item_state = "jetpack-mini"
volume = 40
throw_range = 8
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/tank/jetpack/oxygenblack
name = "Jetpack (Oxygen)"
@@ -175,4 +174,4 @@
var/turf/T = get_turf(user)
T.assume_air(removed)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 122643238ec..4778a53c28b 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -126,7 +126,7 @@
icon_state = "emergency"
flags = CONDUCT
slot_flags = SLOT_BELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 4.0
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011)
@@ -184,7 +184,6 @@
name = "vox specialized nitrogen tank"
desc = "A high-tech nitrogen tank designed specifically for Vox."
icon_state = "emergency_vox"
- item_state = "emergency_vox"
volume = 25
/obj/item/weapon/tank/emergency_oxygen/vox/New()
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index a61a3cea5ce..3b99936b0a8 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -7,7 +7,7 @@
flags = CONDUCT
slot_flags = SLOT_BACK
hitsound = 'sound/weapons/smash.ogg'
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
pressure_resistance = ONE_ATMOSPHERE*5
@@ -33,9 +33,7 @@
return
/obj/item/weapon/tank/Destroy()
- if(air_contents)
- qdel(air_contents)
- air_contents = null
+ QDEL_NULL(air_contents)
processing_objects.Remove(src)
@@ -45,7 +43,7 @@
/obj/item/weapon/tank/ui_action_click(mob/user)
toggle_internals(user)
-/obj/item/weapon/tank/proc/toggle_internals(mob/user)
+/obj/item/weapon/tank/proc/toggle_internals(mob/user, silent = FALSE)
var/mob/living/carbon/C = user
if(!istype(C))
return 0
@@ -65,13 +63,16 @@
if(can_open_valve)
if(C.internal)
- to_chat(C, "You switch your internals to [src]. ")
+ if(!silent)
+ to_chat(C, "You switch your internals to [src]. ")
else
- to_chat(C, "You open \the [src] valve. ")
+ if(!silent)
+ to_chat(C, "You open \the [src] valve. ")
C.internal = src
C.update_internals_hud_icon(1)
else
- to_chat(C, "You are not wearing a suitable mask or helmet. ")
+ if(!silent)
+ to_chat(C, "You are not wearing a suitable mask or helmet. ")
return 0
C.update_action_buttons_icon()
@@ -244,7 +245,7 @@
if(!istype(loc,/obj/item/device/transfer_valve))
message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast] (JMP )")
log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast] at [x], [y], [z]")
-// to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa")
+// to_chat(world, "[x],[y] tank is exploding: [pressure] kPa ")
//Give the gas a chance to build up more pressure through reacting
air_contents.react()
air_contents.react()
@@ -253,7 +254,7 @@
var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
var/turf/epicenter = get_turf(loc)
-// to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]")
+// to_chat(world, "Exploding Pressure: [pressure] kPa, intensity: [range] ")
explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
if(istype(loc,/obj/item/device/transfer_valve))
@@ -262,7 +263,7 @@
qdel(src)
else if(pressure > TANK_RUPTURE_PRESSURE)
-// to_chat(world, "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]")
+// to_chat(world, "[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity] ")
if(integrity <= 0)
var/turf/simulated/T = get_turf(src)
if(!T)
@@ -274,7 +275,7 @@
integrity--
else if(pressure > TANK_LEAK_PRESSURE)
-// to_chat(world, "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]")
+// to_chat(world, "[x],[y] tank is leaking: [pressure] kPa, integrity [integrity] ")
if(integrity <= 0)
var/turf/simulated/T = get_turf(src)
if(!T)
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 9068460ae80..5229a59fe5f 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/watertank.dmi'
icon_state = "waterbackpack"
item_state = "waterbackpack"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
slowdown = 1
actions_types = list(/datum/action/item_action/toggle_mister)
@@ -69,8 +69,7 @@
/obj/item/weapon/watertank/Destroy()
if(on)
remove_noz()
- qdel(noz)
- noz = null
+ QDEL_NULL(noz)
return ..()
/obj/item/weapon/watertank/attack_hand(mob/user as mob)
@@ -113,7 +112,7 @@
icon = 'icons/obj/watertank.dmi'
icon_state = "mister"
item_state = "mister"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
volume = 500
@@ -221,7 +220,7 @@
power = 8
precision = 1
cooling_power = 5
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
flags = NODROP //Necessary to ensure that the nozzle and tank never seperate
var/obj/item/weapon/watertank/tank
var/nozzle_mode = 0
@@ -301,7 +300,7 @@
if(!Adj|| !istype(target, /turf))
return
if(metal_synthesis_cooldown < 5)
- var/obj/effect/effect/foam/F = new /obj/effect/effect/foam(get_turf(target), 1)
+ var/obj/structure/foam/F = new /obj/structure/foam(get_turf(target), 1)
F.amount = 0
metal_synthesis_cooldown++
spawn(100)
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 067bacaef4b..05486c9d85f 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -3,7 +3,7 @@
desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "taperoll"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
amount = 10
max_amount = 10
@@ -76,7 +76,7 @@
desc = "A piece of sticky tape."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "tape"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
layer = 4
anchored = 1 //it's sticky, no you cant move it
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 87309c5927c..dafda733396 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -17,7 +17,7 @@
var/broadcasting = null
var/listening = 1.0
flags = CONDUCT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
throw_speed = 4
throw_range = 20
@@ -98,7 +98,7 @@ Frequency:
icon_state = "hand_tele"
item_state = "electronic"
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=10000)
diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm
index 0bc1b23f6d6..dfaa52ba396 100644
--- a/code/game/objects/items/weapons/teleprod.dm
+++ b/code/game/objects/items/weapons/teleprod.dm
@@ -2,6 +2,7 @@
name = "teleprod"
desc = "A prod with a bluespace crystal on the end. The crystal doesn't look too fun to touch."
icon_state = "teleprod_nocell"
+ base_icon = "teleprod"
item_state = "teleprod"
origin_tech = "combat=2;bluespace=4;materials=3"
@@ -15,4 +16,4 @@
deductcharge(hitcost)
do_teleport(user, get_turf(user), 50)//honk honk
else if(iscarbon(M) && !M.anchored)
- do_teleport(M, get_turf(M), 15)
\ No newline at end of file
+ do_teleport(M, get_turf(M), 15)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 176108b8f08..3460699fbe4 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -12,77 +12,149 @@
* Revolver Conversion Kit
*/
-/*
- * Wrench
- */
+//Wrench
/obj/item/weapon/wrench
name = "wrench"
desc = "A wrench with common uses. Can be found in your hand."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/tools.dmi'
icon_state = "wrench"
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 5.0
- throwforce = 7.0
- w_class = 2
+ force = 5
+ throwforce = 7
+ usesound = 'sound/items/Ratchet.ogg'
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=150)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ toolspeed = 1
+/obj/item/weapon/wrench/suicide_act(mob/user)
+ user.visible_message("[user] is beating themselves to death with [src]! It looks like they're trying to commit suicide! ")
+ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+ return (BRUTELOSS)
-/*
- * Screwdriver
- */
+/obj/item/weapon/wrench/cyborg
+ name = "automatic wrench"
+ desc = "An advanced robotic wrench. Can be found in construction cyborgs."
+ toolspeed = 0.5
+
+/obj/item/weapon/wrench/brass
+ name = "brass wrench"
+ desc = "A brass wrench. It's faintly warm to the touch."
+ icon_state = "wrench_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/wrench/abductor
+ name = "alien wrench"
+ desc = "A polarized wrench. It causes anything placed between the jaws to turn."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "wrench"
+ usesound = 'sound/effects/EMPulse.ogg'
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=5;abductor=3"
+
+/obj/item/weapon/wrench/power
+ name = "hand drill"
+ desc = "A simple powered drill with a bolt bit."
+ icon_state = "drill_bolt"
+ item_state = "drill"
+ usesound = 'sound/items/drill_use.ogg'
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25)
+ origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
+ force = 8 //might or might not be too high, subject to change
+ throwforce = 8
+ attack_verb = list("drilled", "screwed", "jabbed")
+ toolspeed = 0.25
+
+/obj/item/weapon/wrench/power/attack_self(mob/user)
+ playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/power/s_drill = new /obj/item/weapon/screwdriver/power
+ to_chat(user, "You attach the screwdriver bit to [src]. ")
+ qdel(src)
+ user.put_in_active_hand(s_drill)
+
+/obj/item/weapon/wrench/power/suicide_act(mob/user)
+ user.visible_message("[user] is pressing [src] against their head! It looks like they're trying to commit suicide!")
+ return (BRUTELOSS)
+
+/obj/item/weapon/wrench/medical
+ name = "medical wrench"
+ desc = "A medical wrench with common (medical?) uses. Can be found in your hand."
+ icon_state = "wrench_medical"
+ force = 2 //MEDICAL
+ throwforce = 4
+ origin_tech = "materials=1;engineering=1;biotech=3"
+ attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
+
+/obj/item/weapon/wrench/medical/suicide_act(mob/user)
+ user.visible_message("[user] is praying to the medical wrench to take their soul. It looks like they're trying to commit suicide! ")
+ // TODO Make them glow with the power of the M E D I C A L W R E N C H
+ // during their ascension
+
+ // Stun stops them from wandering off
+ user.Stun(5)
+ playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1)
+
+ // Let the sound effect finish playing
+ sleep(20)
+
+ if(!user)
+ return
+
+ for(var/obj/item/W in user)
+ user.unEquip(W)
+
+ var/obj/item/weapon/wrench/medical/W = new /obj/item/weapon/wrench/medical(loc)
+ W.add_fingerprint(user)
+ W.desc += " For some reason, it reminds you of [user.name]."
+
+ if(!user)
+ return
+
+ user.dust()
+ return OXYLOSS
+
+//Screwdriver
/obj/item/weapon/screwdriver
name = "screwdriver"
desc = "You can be totally screwy with this."
- icon = 'icons/obj/items.dmi'
- icon_state = "screwdriver"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = null
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 5.0
- w_class = 1
- throwforce = 5.0
+ force = 5
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 5
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=75)
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
+ usesound = 'sound/items/Screwdriver.ogg'
+ toolspeed = 1
- suicide_act(mob/user)
- to_chat(viewers(user), pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide. ", \
- "[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide. "))
- return(BRUTELOSS)
+/obj/item/weapon/screwdriver/nuke
+ name = "screwdriver"
+ desc = "A screwdriver with an ultra thin tip."
+ icon_state = "screwdriver_nuke"
+ toolspeed = 0.5
-/obj/item/weapon/screwdriver/New()
- switch(pick("red","blue","purple","brown","green","cyan","yellow"))
- if("red")
- icon_state = "screwdriver2"
- item_state = "screwdriver"
- if("blue")
- icon_state = "screwdriver"
- item_state = "screwdriver_blue"
- if("purple")
- icon_state = "screwdriver3"
- item_state = "screwdriver_purple"
- if("brown")
- icon_state = "screwdriver4"
- item_state = "screwdriver_brown"
- if("green")
- icon_state = "screwdriver5"
- item_state = "screwdriver_green"
- if("cyan")
- icon_state = "screwdriver6"
- item_state = "screwdriver_cyan"
- if("yellow")
- icon_state = "screwdriver7"
- item_state = "screwdriver_yellow"
+/obj/item/weapon/screwdriver/suicide_act(mob/user)
+ user.visible_message("[user] is stabbing [src] into their [pick("temple", "heart")]! It looks like they're trying to commit suicide! ")
+ return(BRUTELOSS)
- if(prob(75))
+/obj/item/weapon/screwdriver/New(loc, var/param_color = null)
+ ..()
+ if(!icon_state)
+ if(!param_color)
+ param_color = pick("red","blue","pink","brown","green","cyan","yellow")
+ icon_state = "screwdriver_[param_color]"
+
+ if (prob(75))
src.pixel_y = rand(0, 16)
- return
-/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M) || user.a_intent == I_HELP)
return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
@@ -91,92 +163,186 @@
M = user
return eyestab(M,user)
-/*
- * Wirecutters
- */
+/obj/item/weapon/screwdriver/brass
+ name = "brass screwdriver"
+ desc = "A screwdriver made of brass. The handle feels freezing cold."
+ icon_state = "screwdriver_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/screwdriver/abductor
+ name = "alien screwdriver"
+ desc = "An ultrasonic screwdriver."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "screwdriver"
+ usesound = 'sound/items/PSHOOM.ogg'
+ toolspeed = 0.1
+
+/obj/item/weapon/screwdriver/power
+ name = "hand drill"
+ desc = "A simple hand drill with a screwdriver bit attached."
+ icon_state = "drill_screw"
+ item_state = "drill"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25)
+ origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
+ force = 8 //might or might not be too high, subject to change
+ throwforce = 8
+ throw_speed = 2
+ throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
+ attack_verb = list("drilled", "screwed", "jabbed","whacked")
+ hitsound = 'sound/items/drill_hit.ogg'
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.25
+
+/obj/item/weapon/screwdriver/power/suicide_act(mob/user)
+ user.visible_message("[user] is putting [src] to their temple. It looks like they're trying to commit suicide! ")
+ return(BRUTELOSS)
+
+/obj/item/weapon/screwdriver/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1)
+ var/obj/item/weapon/wrench/power/b_drill = new /obj/item/weapon/wrench/power
+ to_chat(user, "You attach the bolt driver bit to [src]. ")
+ qdel(src)
+ user.put_in_active_hand(b_drill)
+
+/obj/item/weapon/screwdriver/cyborg
+ name = "powered screwdriver"
+ desc = "An electrical screwdriver, designed to be both precise and quick."
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.5
+
+//Wirecutters
/obj/item/weapon/wirecutters
name = "wirecutters"
desc = "This cuts wires."
- icon = 'icons/obj/items.dmi'
- icon_state = "cutters"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = null
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 6.0
+ force = 6
throw_speed = 3
throw_range = 7
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=80)
origin_tech = "materials=1;engineering=1"
attack_verb = list("pinched", "nipped")
- hitsound = "sound/items/Wirecutter.ogg"
+ hitsound = 'sound/items/Wirecutter.ogg'
+ usesound = 'sound/items/Wirecutter.ogg'
sharp = 1
edge = 1
+ toolspeed = 1
-/obj/item/weapon/wirecutters/New(loc, var/param_color = null)
+/obj/item/weapon/wirecutters/New(loc, param_color = null)
..()
- if((!param_color && prob(50)) || param_color == "yellow")
- icon_state = "cutters-y"
- item_state = "cutters_yellow"
+ if(!icon_state)
+ if(!param_color)
+ param_color = pick("yellow", "red")
+ icon_state = "cutters_[param_color]"
-/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
- if(istype(C) && C.handcuffed)
- if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
- usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
- "You cut \the [C]'s restraints with \the [src]!",\
- "You hear cable being cut.")
- C.handcuffed = null
- if(C.buckled && C.buckled.buckle_requires_restraints)
- C.buckled.unbuckle_mob()
- C.update_handcuffed()
- return
+/obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user)
+ if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
+ user.visible_message("[user] cuts [C]'s restraints with [src]! ")
+ qdel(C.handcuffed)
+ C.handcuffed = null
+ if(C.buckled && C.buckled.buckle_requires_restraints)
+ C.buckled.unbuckle_mob(C)
+ C.update_handcuffed()
+ return
else
..()
-/*
- * Welding Tool
- */
+/obj/item/weapon/wirecutters/suicide_act(mob/user)
+ user.visible_message("[user] is cutting at their arteries with [src]! It looks like they're trying to commit suicide! ")
+ playsound(loc, usesound, 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/wirecutters/brass
+ name = "brass wirecutters"
+ desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
+ icon_state = "cutters_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/wirecutters/abductor
+ name = "alien wirecutters"
+ desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cutters"
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=4;abductor=3"
+
+/obj/item/weapon/wirecutters/cyborg
+ name = "wirecutters"
+ desc = "This cuts wires."
+ toolspeed = 0.5
+
+/obj/item/weapon/wirecutters/power
+ name = "jaws of life"
+ desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
+ icon_state = "jaws_cutter"
+ item_state = "jawsoflife"
+ origin_tech = "materials=2;engineering=2"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25)
+ usesound = 'sound/items/jaws_cut.ogg'
+ toolspeed = 0.25
+
+/obj/item/weapon/wirecutters/power/suicide_act(mob/user)
+ user.visible_message("[user] is wrapping \the [src] around their neck. It looks like they're trying to rip their head off! ")
+ playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
+ if(head)
+ head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
+ playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/wirecutters/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ var/obj/item/weapon/crowbar/power/pryjaws = new /obj/item/weapon/crowbar/power
+ to_chat(user, "You attach the pry jaws to [src]. ")
+ qdel(src)
+ user.put_in_active_hand(pryjaws)
+
+//Welding Tool
/obj/item/weapon/weldingtool
name = "welding tool"
- icon = 'icons/obj/items.dmi'
+ desc = "A standard edition welder provided by Nanotrasen."
+ icon = 'icons/obj/tools.dmi'
icon_state = "welder"
item_state = "welder"
flags = CONDUCT
slot_flags = SLOT_BELT
-
- //Amount of OUCH when it's thrown
force = 3
throwforce = 5
throw_speed = 3
throw_range = 5
- w_class = 2
-
- //Cost to make in the autolathe
+ hitsound = "swing_hit"
+ usesound = 'sound/items/Welder.ogg'
+ var/acti_sound = 'sound/items/WelderActivate.ogg'
+ var/deac_sound = 'sound/items/WelderDeactivate.ogg'
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=70, MAT_GLASS=30)
-
- //R&D tech level
- origin_tech = "engineering=1"
-
- //Welding tool specific stuff
+ origin_tech = "engineering=1;plasmatech=1"
+ toolspeed = 1
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
var/can_off_process = 0
var/light_intensity = 2 //how powerful the emitted light is when used.
+ var/nextrefueltick = 0
/obj/item/weapon/weldingtool/New()
..()
create_reagents(max_fuel)
reagents.add_reagent("fuel", max_fuel)
update_icon()
- return
/obj/item/weapon/weldingtool/examine(mob/user)
if(..(user, 0))
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
/obj/item/weapon/weldingtool/suicide_act(mob/user)
- user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide.. ")
+ user.visible_message("[user] welds their every orifice closed! It looks like they're trying to commit suicide! ")
return (FIRELOSS)
/obj/item/weapon/weldingtool/proc/update_torch()
@@ -196,14 +362,6 @@
else
icon_state = "[initial(icon_state)][ratio]"
update_torch()
- return
-
-/obj/item/weapon/weldingtool/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- flamethrower_screwdriver(I, user)
- if(istype(I, /obj/item/stack/rods))
- flamethrower_rods(I, user)
- ..()
/obj/item/weapon/weldingtool/process()
switch(welding)
@@ -231,10 +389,18 @@
if(isturf(location))
location.hotspot_expose(700, 5)
-/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
+/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
+ if(isscrewdriver(I))
+ flamethrower_screwdriver(I, user)
+ else if(istype(I, /obj/item/stack/rods))
+ flamethrower_rods(I, user)
+ else
+ ..()
+
+/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
+ var/obj/item/organ/external/S = H.bodyparts_by_name[user.zone_sel.selecting]
if(!S)
return
@@ -252,7 +418,7 @@
if(!do_mob(user, H, 10))
return 1
if(remove_fuel(1,null))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, usesound, 50, 1)
S.heal_damage(15,0,0,1)
user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src]. ")
else if(S.open != 2)
@@ -266,33 +432,28 @@
else
return ..()
-/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
- if(!proximity) return
- if(istype(O, /obj/structure/reagent_dispensers/fueltank) && in_range(src, O))
- if(!welding)
- O.reagents.trans_to(src, max_fuel)
- to_chat(user, "[src] refueled. ")
- playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
- update_icon()
- return
- else
- message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
- log_game("[key_name(user)] triggered a fueltank explosion.")
- to_chat(user, "That was stupid of you. ")
- O.ex_act()
- return
+/obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity)
+ if(!proximity)
+ return
if(welding)
remove_fuel(1)
var/turf/location = get_turf(user)
location.hotspot_expose(700, 50, 1)
+ if(get_fuel() <= 0)
+ set_light(0)
if(isliving(O))
var/mob/living/L = O
- L.IgniteMob()
+ if(L.IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
+ log_game("[key_name(user)] set [key_name(L)] on fire")
/obj/item/weapon/weldingtool/attack_self(mob/user)
- toggle(user)
+ switched_on(user)
+ if(welding)
+ set_light(light_intensity)
+
update_icon()
//Returns the amount of fuel in the welder
@@ -300,19 +461,19 @@
return reagents.get_reagent_amount("fuel")
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
-/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/living/M = null)
+/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
if(!welding || !check_fuel())
- return 0
+ return FALSE
if(get_fuel() >= amount)
reagents.remove_reagent("fuel", amount)
check_fuel()
if(M)
M.flash_eyes(light_intensity)
- return 1
+ return TRUE
else
if(M)
- to_chat(M, "\blue You need more welding fuel to complete this task.")
- return 0
+ to_chat(M, "You need more welding fuel to complete this task. ")
+ return FALSE
//Returns whether or not the welding tool is currently on.
/obj/item/weapon/weldingtool/proc/isOn()
@@ -321,19 +482,18 @@
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
/obj/item/weapon/weldingtool/proc/check_fuel(mob/user)
if(get_fuel() <= 0 && welding)
- toggle(user, 1)
+ switched_on(user)
update_icon()
//mob icon update
if(ismob(loc))
var/mob/M = loc
M.update_inv_r_hand(0)
M.update_inv_l_hand(0)
-
return 0
return 1
-//Toggles the welder off and on
-/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0)
+//Switches the welder on
+/obj/item/weapon/weldingtool/proc/switched_on(mob/user)
if(!status)
to_chat(user, "[src] can't be turned on while unsecured! ")
return
@@ -341,23 +501,30 @@
if(welding)
if(get_fuel() >= 1)
to_chat(user, "You switch [src] on. ")
+ playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
update_icon()
- processing_objects |= src
+ processing_objects.Add(src)
else
to_chat(user, "You need more fuel! ")
- welding = 0
+ switched_off(user)
else
- if(!message)
+ if(user)
to_chat(user, "You switch [src] off. ")
- else
- visible_message("[src] shuts off! ")
- force = 3
- damtype = "brute"
- hitsound = "swing_hit"
- update_icon()
+ playsound(loc, deac_sound, 50, 1)
+ switched_off(user)
+
+//Switches the welder off
+/obj/item/weapon/weldingtool/proc/switched_off(mob/user)
+ welding = 0
+ set_light(0)
+
+ force = 3
+ damtype = "brute"
+ hitsound = "swing_hit"
+ update_icon()
/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
if(welding)
@@ -384,7 +551,6 @@
user.put_in_hands(F)
else
to_chat(user, "You need one rod to start building a flamethrower! ")
- return
/obj/item/weapon/weldingtool/largetank
name = "Industrial Welding Tool"
@@ -392,9 +558,12 @@
icon_state = "indwelder"
max_fuel = 40
materials = list(MAT_METAL=70, MAT_GLASS=60)
- origin_tech = "engineering=2"
+ origin_tech = "engineering=2;plasmatech=2"
/obj/item/weapon/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ toolspeed = 0.5
/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver()
return
@@ -404,22 +573,37 @@
desc = "A miniature welder used during emergencies."
icon_state = "miniwelder"
max_fuel = 10
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=30, MAT_GLASS=10)
change_icons = 0
/obj/item/weapon/weldingtool/mini/flamethrower_screwdriver()
return
+/obj/item/weapon/weldingtool/abductor
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ light_intensity = 0
+ change_icons = 0
+ origin_tech = "plasmatech=5;engineering=5;abductor=3"
+ can_off_process = 1
+
+/obj/item/weapon/weldingtool/abductor/process()
+ if(get_fuel() <= max_fuel)
+ reagents.add_reagent("fuel", 1)
+ ..()
+
/obj/item/weapon/weldingtool/hugetank
name = "Upgraded Welding Tool"
- desc = "An upgraded welder based of the industrial welder."
+ desc = "An upgraded welder based off the industrial welder."
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
- w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=3"
+ origin_tech = "engineering=3;plasmatech=2"
/obj/item/weapon/weldingtool/experimental
name = "Experimental Welding Tool"
@@ -427,78 +611,128 @@
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
- w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=4;plasmatech=3"
- var/last_gen = 0
+ origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4"
change_icons = 0
can_off_process = 1
light_intensity = 1
+ toolspeed = 0.5
+ var/last_gen = 0
-/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()
- if(!welding && !last_gen)
- last_gen = 1
- reagents.add_reagent("fuel",1)
- spawn(10)
- last_gen = 0
+/obj/item/weapon/weldingtool/experimental/brass
+ name = "brass welding tool"
+ desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
+ icon_state = "brasswelder"
+ item_state = "brasswelder"
-/obj/item/weapon/weldingtool/experimental/process()
+obj/item/weapon/weldingtool/experimental/process()
..()
- if(reagents.total_volume < max_fuel)
- fuel_gen()
-
-/*
- * Crowbar
- */
+ if(get_fuel() < max_fuel && nextrefueltick < world.time)
+ nextrefueltick = world.time + 10
+ reagents.add_reagent("fuel", 1)
+//Crowbar
/obj/item/weapon/crowbar
name = "pocket crowbar"
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
+ item_state = "crowbar"
+ usesound = 'sound/items/Crowbar.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 5.0
- throwforce = 7.0
+ force = 5
+ throwforce = 7
item_state = "crowbar"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
- origin_tech = "engineering=1"
+ origin_tech = "engineering=1;combat=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
+ toolspeed = 1
/obj/item/weapon/crowbar/red
- icon = 'icons/obj/items.dmi'
- icon_state = "red_crowbar"
+ icon_state = "crowbar_red"
item_state = "crowbar_red"
+ force = 8
+
+/obj/item/weapon/crowbar/brass
+ name = "brass crowbar"
+ desc = "A brass crowbar. It feels faintly warm to the touch."
+ icon_state = "crowbar_brass"
+ item_state = "crowbar_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/crowbar/abductor
+ name = "alien crowbar"
+ desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
+ icon = 'icons/obj/abductor.dmi'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ icon_state = "crowbar"
+ toolspeed = 0.1
+ origin_tech = "combat=4;engineering=4;abductor=3"
/obj/item/weapon/crowbar/large
name = "crowbar"
- desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
+ desc = "It's a big crowbar. It doesn't fit in your pockets, because its too big."
force = 12
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
materials = list(MAT_METAL=70)
icon_state = "crowbar_large"
+ item_state = "crowbar_large"
+ toolspeed = 0.5
+/obj/item/weapon/crowbar/cyborg
+ name = "hydraulic crowbar"
+ desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 10
+ toolspeed = 0.5
+
+/obj/item/weapon/crowbar/power
+ name = "jaws of life"
+ desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head."
+ icon_state = "jaws_pry"
+ item_state = "jawsoflife"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_DIAMOND=25)
+ origin_tech = "materials=2;engineering=2"
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 15
+ toolspeed = 0.25
+ var/airlock_open_time = 100 // Time required to open powered airlocks
+
+/obj/item/weapon/crowbar/power/suicide_act(mob/user)
+ user.visible_message("[user] is putting their head in [src], it looks like they're trying to commit suicide! ")
+ playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/crowbar/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/power/cutjaws = new /obj/item/weapon/wirecutters/power
+ to_chat(user, "You attach the cutting jaws to [src]. ")
+ qdel(src)
+ user.put_in_active_hand(cutjaws)
+
+// Conversion kit
/obj/item/weapon/conversion_kit
name = "\improper Revolver Conversion Kit"
- desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure"
+ desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure."
icon = 'icons/obj/weapons.dmi'
icon_state = "kit"
flags = CONDUCT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=2"
var/open = 0
- New()
- ..()
- update_icon()
-
+/obj/item/weapon/conversion_kit/New()
+ ..()
update_icon()
- icon_state = "[initial(icon_state)]_[open]"
- attack_self(mob/user as mob)
- open = !open
- to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
- update_icon()
+/obj/item/weapon/conversion_kit/update_icon()
+ icon_state = "[initial(icon_state)]_[open]"
+
+/obj/item/weapon/conversion_kit/attack_self(mob/user)
+ open = !open
+ to_chat(user, "You [open ? "open" : "close"] the conversion kit. ")
+ update_icon()
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 8e9424c4997..a79ddf37341 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -109,7 +109,7 @@
///////////OFFHAND///////////////
/obj/item/weapon/twohanded/offhand
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
icon_state = "offhand"
name = "offhand"
flags = ABSTRACT
@@ -123,7 +123,7 @@
///////////Two hand required objects///////////////
//This is for objects that require two hands to even pick up
/obj/item/weapon/twohanded/required/
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
/obj/item/weapon/twohanded/required/attack_self()
return
@@ -163,12 +163,13 @@
throwforce = 15
sharp = 1
edge = 1
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 5
force_wielded = 24
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
+ usesound = 'sound/items/Crowbar.ogg'
/obj/item/weapon/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "fireaxe[wielded]"
@@ -198,7 +199,7 @@
throwforce = 5.0
throw_speed = 1
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force_unwielded = 3
force_wielded = 34
wieldsound = 'sound/weapons/saberon.ogg'
@@ -227,7 +228,7 @@
return
..()
if((CLUMSY in user.mutations) && (wielded) &&prob(40))
- to_chat(user, "\red You twirl around a bit before losing your balance and impaling yourself on the [src].")
+ to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on the [src]. ")
user.take_organ_damage(20,25)
return
if((wielded) && prob(50))
@@ -285,7 +286,7 @@
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
force = 10
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 10
force_wielded = 18
@@ -431,7 +432,8 @@
icon_state = "gchainsaw_off"
flags = CONDUCT
force = 13
- w_class = 5
+ var/force_on = 21
+ w_class = WEIGHT_CLASS_HUGE
throwforce = 13
throw_speed = 2
throw_range = 4
@@ -449,8 +451,8 @@
to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
if(on)
playsound(loc, 'sound/weapons/chainsawstart.ogg', 50, 1)
- force = on ? 21 : 13
- throwforce = on ? 21 : 13
+ force = on ? force_on : initial(force)
+ throwforce = on ? force_on : initial(force)
icon_state = "gchainsaw_[on ? "on" : "off"]"
if(hitsound == "swing_hit")
@@ -469,6 +471,14 @@
name = "OOOH BABY"
desc = "VRRRRRRR!!! "
armour_penetration = 100
+ force_on = 30
+
+/obj/item/weapon/twohanded/required/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ if(attack_type == PROJECTILE_ATTACK)
+ owner.visible_message("Ranged attacks just make [owner] angrier! ")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg','sound/weapons/bulletflyby2.ogg','sound/weapons/bulletflyby3.ogg'), 75, 1)
+ return 1
+ return 0
///CHAINSAW///
@@ -480,7 +490,7 @@
throwforce = 15
throw_speed = 1
throw_range = 5
- w_class = 4 // can't fit in backpacks
+ w_class = WEIGHT_CLASS_BULKY // can't fit in backpacks
force_unwielded = 15 //still pretty robust
force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body!
wieldsound = 'sound/weapons/chainsawstart.ogg'
@@ -535,7 +545,7 @@
force_wielded = 20
throwforce = 15
throw_range = 1
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
var/charged = 5
origin_tech = "combat=5;bluespace=4"
@@ -600,7 +610,7 @@
force_wielded = 25
throwforce = 30
throw_range = 7
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
//var/charged = 5
origin_tech = "combat=5;powerstorage=5"
@@ -648,7 +658,7 @@
force_wielded = 30
throwforce = 15
throw_range = 1
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
var/charged = 5
origin_tech = "combat=5;bluespace=4"
@@ -709,7 +719,7 @@
throwforce = 15
sharp = 1
edge = 1
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
armour_penetration = 20
slot_flags = SLOT_BACK
force_unwielded = 5
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index a6a53b03606..34c4cd6c6d0 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -10,7 +10,7 @@
throwforce = 10.0
throw_speed = 1
throw_range = 7
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
var/charges = 0 //how many restocking "charges" the refill has
@@ -82,3 +82,7 @@
machine_name = "CritterCare"
icon_state = "refill_pet"
charges = 31// of 94
+
+/obj/item/weapon/vending_refill/chinese
+ machine_name = "MrChangs"
+ charges = 8// of 24
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index b9c946c6210..95317b7f0a6 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -5,7 +5,7 @@
icon_state = "toyhammer"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 7
throw_range = 15
attack_verb = list("banned")
@@ -23,18 +23,14 @@
slot_flags = SLOT_BELT
force = 2
throwforce = 1
- sharp = 1
- edge = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
+ hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- suicide_act(mob/user)
- to_chat(viewers(user), "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide. ")
- return(BRUTELOSS)
-
-/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
+/obj/item/weapon/sord/suicide_act(mob/user)
+ user.visible_message("[user] is trying to impale themself with [src]! It might be a suicide attempt if it weren't so shitty. ", \
+ "You try to impale yourself with [src], but it's USELESS... ")
+ return SHAME
/obj/item/weapon/claymore
name = "claymore"
@@ -48,7 +44,7 @@
throwforce = 10
sharp = 1
edge = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
@@ -72,7 +68,7 @@
throwforce = 10
sharp = 1
edge = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
@@ -93,7 +89,7 @@
item_state = "harpoon"
force = 20
throwforce = 15
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("jabbed","stabbed","ripped")
obj/item/weapon/wirerod
@@ -104,11 +100,11 @@ obj/item/weapon/wirerod
flags = CONDUCT
force = 9
throwforce = 10
- w_class = 3
- materials = list(MAT_METAL=1000)
+ w_class = WEIGHT_CLASS_NORMAL
+ materials = list(MAT_METAL=1150, MAT_GLASS=75)
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
-obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
+obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params)
..()
if(istype(I, /obj/item/weapon/shard))
var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
@@ -122,7 +118,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
qdel(I)
qdel(src)
- else if(istype(I, /obj/item/weapon/wirecutters))
+ else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags & NODROP))
var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
if(!remove_item_from_storage(user))
@@ -130,7 +126,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
user.unEquip(I)
user.put_in_hands(P)
- to_chat(user, "You fasten the wirecutters to the top of the rod with the cable, prongs outward. ")
+ to_chat(user, "You fasten [I] to the top of the rod with the cable. ")
qdel(I)
qdel(src)
@@ -142,4 +138,67 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
icon_state = "kidanspear"
item_state = "kidanspear"
force = 10
- throwforce = 15
\ No newline at end of file
+ throwforce = 15
+
+/obj/item/weapon/melee/baseball_bat
+ name = "baseball bat"
+ desc = "There ain't a skull in the league that can withstand a swatter."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "baseball_bat"
+ item_state = "baseball_bat"
+ force = 10
+ throwforce = 12
+ attack_verb = list("beat", "smacked")
+ w_class = WEIGHT_CLASS_HUGE
+ var/homerun_ready = 0
+ var/homerun_able = 0
+
+/obj/item/weapon/melee/baseball_bat/homerun
+ name = "home run bat"
+ desc = "This thing looks dangerous... Dangerously good at baseball, that is."
+ homerun_able = 1
+
+/obj/item/weapon/melee/baseball_bat/attack_self(mob/user)
+ if(!homerun_able)
+ ..()
+ return
+ if(homerun_ready)
+ to_chat(user, "You're already ready to do a home run! ")
+ ..()
+ return
+ to_chat(user, "You begin gathering strength... ")
+ playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1)
+ if(do_after(user, 90, target = src))
+ to_chat(user, "You gather power! Time for a home run! ")
+ homerun_ready = 1
+ ..()
+
+/obj/item/weapon/melee/baseball_bat/attack(mob/living/target, mob/living/user)
+ . = ..()
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
+ if(homerun_ready)
+ user.visible_message("It's a home run! ")
+ target.throw_at(throw_target, rand(8,10), 14, user)
+ target.ex_act(2)
+ playsound(get_turf(src), 'sound/weapons/HOMERUN.ogg', 100, 1)
+ homerun_ready = 0
+ return
+ else
+ target.throw_at(throw_target, rand(1,2), 7, user)
+
+/obj/item/weapon/melee/baseball_bat/ablative
+ name = "metal baseball bat"
+ desc = "This bat is made of highly reflective, highly armored material."
+ icon_state = "baseball_bat_metal"
+ item_state = "baseball_bat_metal"
+ force = 12
+ throwforce = 15
+
+/obj/item/weapon/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers
+ var/picksound = rand(1,2)
+ var/turf = get_turf(src)
+ if(picksound == 1)
+ playsound(turf, 'sound/weapons/effects/batreflect1.ogg', 50, 1)
+ if(picksound == 2)
+ playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, 1)
+ return 1
diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm
index d19c411899f..b268540f92a 100644
--- a/code/game/objects/items/weapons/whetstone.dm
+++ b/code/game/objects/items/weapons/whetstone.dm
@@ -3,7 +3,8 @@
icon = 'icons/obj/kitchen.dmi'
icon_state = "whetstone"
desc = "A block of stone used to sharpen things."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
+ usesound = 'sound/items/Screwdriver.ogg'
var/used = 0
var/increment = 4
var/max = 30
@@ -43,7 +44,7 @@
I.force = Clamp(I.force + increment, 0, max)
I.throwforce = Clamp(I.throwforce + increment, 0, max)
I.name = "[prefix] [I.name]"
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), usesound, 50, 1)
name = "worn out [name]"
desc = "[desc] At least, it used to."
used = 1
@@ -54,7 +55,7 @@
var/datum/unarmed_attack/attack = H.species.unarmed
if(istype(attack, /datum/unarmed_attack/claws))
H.visible_message("[H] sharpens \his claws on the [src]! ", "You sharpen your claws on the [src]. ")
- playsound(get_turf(H), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(H), usesound, 50, 1)
/obj/item/weapon/whetstone/super
name = "super whetstone block"
@@ -62,4 +63,4 @@
increment = 200
max = 200
prefix = "super-sharpened"
- requires_sharpness = 0
\ No newline at end of file
+ requires_sharpness = 0
diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm
index 4d2e539042f..0f1e261699b 100644
--- a/code/game/objects/items/weapons/wires.dm
+++ b/code/game/objects/items/weapons/wires.dm
@@ -28,9 +28,9 @@
/obj/item/weapon/wire/attack_self(mob/user as mob)
if(src.laying)
src.laying = 0
- to_chat(user, "\blue You're done laying wire!")
+ to_chat(user, "You're done laying wire! ")
else
- to_chat(user, "\blue You are not using this to lay wire...")
+ to_chat(user, "You are not using this to lay wire... ")
return
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 9a75e9e3950..844c1828200 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -61,8 +61,6 @@
nanomanager.close_uis(src)
return ..()
-/obj/item/proc/is_used_on(obj/O, mob/user)
-
/obj/proc/process()
set waitfor = 0
processing_objects.Remove(src)
@@ -318,4 +316,7 @@ a {
for(var/obj/item/Item in contents) //Empty out the contents
Item.forceMove(new_loc)
if(burn)
- Item.fire_act() //Set them on fire, too
\ No newline at end of file
+ Item.fire_act() //Set them on fire, too
+
+/obj/proc/on_mob_move(dir, mob/user)
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 70b3e3c1d67..91b232c051a 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -71,11 +71,11 @@
for(var/obj/O in range(0, src))
if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing.
- to_chat(user, "\red You cannot climb [src], as it is blocked by \a [O]!")
+ to_chat(user, "You cannot climb [src], as it is blocked by \a [O]! ")
return
for(var/turf/T in range(0, src))
if(T.density == 1)
- to_chat(user, "\red You cannot climb [src], as it is blocked by \a [T]!")
+ to_chat(user, "You cannot climb [src], as it is blocked by \a [T]! ")
return
var/turf/T = src.loc
if(!T || !istype(T)) return
@@ -85,7 +85,7 @@
usr.visible_message("[user] starts climbing onto \the [src]! ")
climber = user
- if(!do_after(user,50, target = src))
+ if(!do_after(user, 50, target = src))
climber = null
return
@@ -111,14 +111,14 @@
if(M.lying) return //No spamming this on people.
M.Weaken(5)
- to_chat(M, "\red You topple as \the [src] moves under you!")
+ to_chat(M, "You topple as \the [src] moves under you! ")
if(prob(25))
var/damage = rand(15,30)
var/mob/living/carbon/human/H = M
if(!istype(H))
- to_chat(H, "\red You land heavily!")
+ to_chat(H, "You land heavily! ")
M.adjustBruteLoss(damage)
return
@@ -137,12 +137,12 @@
affecting = H.get_organ("head")
if(affecting)
- to_chat(M, "\red You land heavily on your [affecting.name]!")
+ to_chat(M, "You land heavily on your [affecting.name]! ")
affecting.take_damage(damage, 0)
if(affecting.parent)
affecting.parent.add_autopsy_data("Misadventure", damage)
else
- to_chat(H, "\red You land heavily!")
+ to_chat(H, "You land heavily! ")
H.adjustBruteLoss(damage)
H.UpdateDamageIcon()
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 045f58d577d..9636e1407b6 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -19,6 +19,9 @@
burntime = 15
var/obj/item/weapon/canvas/painting = null
+/obj/structure/easel/Destroy()
+ QDEL_NULL(painting)
+ return ..()
//Adding canvases
/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 10f09401ba5..3190a69177d 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -14,7 +14,7 @@ LINEN BINS
throwforce = 1
throw_speed = 1
throw_range = 2
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
item_color = "white"
burn_state = FLAMMABLE
slot_flags = SLOT_BACK
@@ -204,7 +204,7 @@ LINEN BINS
sheets.Add(I)
amount++
to_chat(user, "You put [I] in [src]. ")
- else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
+ else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
user.drop_item()
I.loc = src
hidden = I
@@ -255,4 +255,4 @@ LINEN BINS
if(hidden)
hidden.loc = loc
- hidden = null
\ No newline at end of file
+ hidden = null
diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm
index 3c68792fece..0a30a914063 100644
--- a/code/game/objects/structures/coathanger.dm
+++ b/code/game/objects/structures/coathanger.dm
@@ -28,7 +28,7 @@
to_chat(user, "You cannot hang [W] on [src] ")
return ..()
-/obj/structure/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/coatrack/CanPass(atom/movable/mover, turf/target, height=0)
var/can_hang = 0
for(var/T in allowed)
if(istype(mover,T))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 26908f69180..6db9a26fd8d 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -13,15 +13,16 @@
var/lastbang
var/cutting_tool = /obj/item/weapon/weldingtool
var/sound = 'sound/machines/click.ogg'
- var/cutting_sound = 'sound/items/Welder.ogg'
+ var/cutting_sound
var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients.
var/material_drop = /obj/item/stack/sheet/metal
+ var/material_drop_amount = 2
/obj/structure/closet/New()
..()
spawn(1)
if(!opened) // if closed, any item at the crate's loc is put in the contents
- for(var/obj/item/I in src.loc)
+ for(var/obj/item/I in loc)
if(I.density || I.anchored || I == src) continue
I.forceMove(src)
@@ -33,12 +34,12 @@
/obj/structure/closet/alter_health()
return get_turf(src)
-/obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0 || wall_mounted)) return 1
+/obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0 || wall_mounted) return 1
return (!density)
/obj/structure/closet/proc/can_open()
- if(src.welded)
+ if(welded)
return 0
return 1
@@ -49,70 +50,55 @@
return 1
/obj/structure/closet/proc/dump_contents()
- //Cham Projector Exception
- for(var/obj/effect/dummy/chameleon/AD in src)
- AD.forceMove(loc)
-
- for(var/obj/I in src)
- I.forceMove(loc)
-
- for(var/mob/M in src)
- moveMob(M, loc)
-
-/obj/structure/closet/proc/moveMob(var/mob/M, var/atom/destination)
- loc.Exited(M)
- M.loc = destination
- M.reset_perspective(destination)
- if(isturf(loc))
- loc.Entered(M, src, ignoreRest = 1)
- else
- loc.Entered(M, src)
- for(var/atom/movable/AM in loc)
- if(istype(AM, /obj/item))
- continue
- AM.Crossed(M)
+ var/turf/T = get_turf(src)
+ for(var/atom/movable/AM in src)
+ AM.forceMove(T)
+ if(throwing) // you keep some momentum when getting out of a thrown closet
+ step(AM, dir)
+ if(throwing)
+ throwing.finalize(FALSE)
/obj/structure/closet/proc/open()
- if(src.opened)
+ if(opened)
return 0
- if(!src.can_open())
+ if(!can_open())
return 0
- src.dump_contents()
+ dump_contents()
- src.icon_state = src.icon_opened
- src.opened = 1
+ icon_state = icon_opened
+ opened = 1
if(sound)
- playsound(src.loc, src.sound, 15, 1, -3)
+ playsound(loc, sound, 15, 1, -3)
else
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 0
return 1
/obj/structure/closet/proc/close()
- if(!src.opened)
+ if(!opened)
return 0
- if(!src.can_close())
+ if(!can_close())
return 0
var/itemcount = 0
//Cham Projector Exception
- for(var/obj/effect/dummy/chameleon/AD in src.loc)
+ for(var/obj/effect/dummy/chameleon/AD in loc)
if(itemcount >= storage_capacity)
break
AD.forceMove(src)
itemcount++
- for(var/obj/item/I in src.loc)
+ for(var/obj/item/I in loc)
if(itemcount >= storage_capacity)
break
if(!I.anchored)
I.forceMove(src)
itemcount++
- for(var/mob/M in src.loc)
+ for(var/mob/M in loc)
if(itemcount >= storage_capacity)
break
if(istype (M, /mob/dead/observer))
@@ -120,40 +106,40 @@
if(M.buckled)
continue
- moveMob(M, src)
+ M.forceMove(src)
itemcount++
- src.icon_state = src.icon_closed
- src.opened = 0
+ icon_state = icon_closed
+ opened = 0
if(sound)
- playsound(src.loc, src.sound, 15, 1, -3)
+ playsound(loc, sound, 15, 1, -3)
else
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 1
return 1
-/obj/structure/closet/proc/toggle(mob/user as mob)
- if(!(src.opened ? src.close() : src.open()))
+/obj/structure/closet/proc/toggle(mob/user)
+ if(!(opened ? close() : open()))
to_chat(user, "It won't budge! ")
// this should probably use dump_contents()
/obj/structure/closet/ex_act(severity)
switch(severity)
if(1)
- for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion
- A.forceMove(src.loc)
+ for(var/atom/movable/A in src)//pulls everything out of the locker and hits it with an explosion
+ A.forceMove(loc)
A.ex_act(severity++)
qdel(src)
if(2)
if(prob(50))
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
A.ex_act(severity++)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
if(3)
if(prob(5))
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
A.ex_act(severity++)
new /obj/item/stack/sheet/metal(loc)
@@ -164,32 +150,32 @@
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
health -= Proj.damage
if(health <= 0)
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
qdel(src)
-/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
+/obj/structure/closet/attack_animal(mob/living/simple_animal/user)
if(user.environment_smash)
user.do_attack_animation(src)
- visible_message("\red [user] destroys the [src]. ")
- for(var/atom/movable/A as mob|obj in src)
+ visible_message("[user] destroys the [src]. ")
+ for(var/atom/movable/A in src)
A.forceMove(loc)
qdel(src)
// this should probably use dump_contents()
/obj/structure/closet/blob_act()
if(prob(75))
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
qdel(src)
-/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/rcs) && !src.opened)
+/obj/structure/closet/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/rcs) && !opened)
if(user in contents) //to prevent self-teleporting.
return
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
- if(!is_level_reachable(src.z))
+ if(!is_level_reachable(z))
to_chat(user, "The rapid-crate-sender can't locate any telepads! ")
return
if(E.mode == 0)
@@ -207,10 +193,10 @@
L[tmpname] = R
var/desc = input("Please select a telepad.", "RCS") in L
E.pad = L[desc]
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "\blue Teleporting [src.name]...")
+ playsound(E.loc, E.usesound, 50, 1)
+ to_chat(user, "Teleporting [name]... ")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -229,10 +215,10 @@
E.rand_x = rand(50,200)
E.rand_y = rand(50,200)
var/L = locate(E.rand_x, E.rand_y, 6)
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "\blue Teleporting [src.name]...")
+ playsound(E.loc, E.usesound, 50, 1)
+ to_chat(user, "Teleporting [name]... ")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50, E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -251,9 +237,9 @@
to_chat(user, "Out of charges. ")
return
- if(src.opened)
+ if(opened)
if(istype(W, /obj/item/weapon/grab))
- src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
+ MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
if(istype(W,/obj/item/tk_grab))
return 0
if(istype(W, cutting_tool))
@@ -262,21 +248,22 @@
if(!WT.remove_fuel(0, user))
return
to_chat(user, "You begin cutting \the [src] apart... ")
- playsound(loc, cutting_sound, 40, 1)
- if(do_after(user, 40, 1, target = src))
+ playsound(loc, cutting_sound ? cutting_sound : WT.usesound, 40, 1)
+ if(do_after(user, 40 * WT.toolspeed, 1, target = src))
if(!opened || !WT.isOn())
return
- playsound(loc, cutting_sound, 50, 1)
+ playsound(loc, cutting_sound ? cutting_sound : WT.usesound, 50, 1)
visible_message("[user] slices apart \the [src]. ",
"You cut \the [src] apart with \the [WT]. ",
"You hear welding. ")
var/turf/T = get_turf(src)
- new material_drop(T)
+ new material_drop(T, material_drop_amount)
qdel(src)
return
if(isrobot(user))
return
- if(!usr.drop_item())
+ if(!user.drop_item()) //couldn't drop the item
+ to_chat(user, "\The [W] is stuck to your hand, you cannot put it in \the [src]! ")
return
if(W)
W.forceMove(loc)
@@ -290,14 +277,14 @@
if(!WT.remove_fuel(0,user))
to_chat(user, "You need more welding fuel to complete this task. ")
return
- src.welded = !src.welded
- src.update_icon()
+ welded = !welded
+ update_icon()
for(var/mob/M in viewers(src))
M.show_message("[src] has been [welded?"welded shut":"unwelded"] by [user.name]. ", 3, "You hear welding.", 2)
else
- src.attack_hand(user)
+ attack_hand(user)
-/obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/user)
..()
if(istype(O, /obj/screen)) //fix for HUD elements making their way into the world -Pete
return
@@ -311,24 +298,24 @@
return
if(!istype(user.loc, /turf)) // are you in a container/closet/pod/etc?
return
- if(!src.opened)
+ if(!opened)
return
if(istype(O, /obj/structure/closet))
return
- step_towards(O, src.loc)
+ step_towards(O, loc)
if(user != O)
user.visible_message("[user] stuffs [O] into [src]! ", "You stuff [O] into [src]! ")
- src.add_fingerprint(user)
+ add_fingerprint(user)
/obj/structure/closet/attack_ai(mob/user)
- if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) //Robots can open/close it, but not the AI
+ if(isrobot(user) && Adjacent(user)) //Robots can open/close it, but not the AI
attack_hand(user)
-/obj/structure/closet/relaymove(mob/user as mob)
- if(user.stat || !isturf(src.loc))
+/obj/structure/closet/relaymove(mob/user)
+ if(user.stat || !isturf(loc))
return
- if(!src.open())
+ if(!open())
to_chat(user, "It won't budge! ")
if(!lastbang)
lastbang = 1
@@ -337,14 +324,18 @@
spawn(30)
lastbang = 0
-/obj/structure/closet/attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- src.toggle(user)
+/obj/structure/closet/attack_hand(mob/user)
+ add_fingerprint(user)
+ toggle(user)
+
+/obj/structure/closet/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ toggle(user)
// tk grab then use on self
-/obj/structure/closet/attack_self_tk(mob/user as mob)
- src.add_fingerprint(user)
- if(!src.toggle())
+/obj/structure/closet/attack_self_tk(mob/user)
+ add_fingerprint(user)
+ if(!toggle())
to_chat(usr, "It won't budge! ")
/obj/structure/closet/verb/verb_toggleopen()
@@ -352,12 +343,12 @@
set category = null
set name = "Toggle Open"
- if(!usr.canmove || usr.stat || usr.restrained())
+ if(usr.incapacitated())
return
if(ishuman(usr))
- src.add_fingerprint(usr)
- src.toggle(usr)
+ add_fingerprint(usr)
+ toggle(usr)
else
to_chat(usr, "This mob type can't use this verb. ")
@@ -413,8 +404,8 @@
to_chat(usr, "You successfully break out! ")
for(var/mob/O in viewers(L.loc))
O.show_message("\the [usr] successfully broke out of \the [src]! ", 1)
- if(istype(src.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
- var/obj/structure/bigDelivery/BD = src.loc
+ if(istype(loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
+ var/obj/structure/bigDelivery/BD = loc
BD.attack_hand(usr)
open()
@@ -425,4 +416,4 @@
/obj/structure/closet/get_remote_view_fullscreens(mob/user)
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
- user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
+ user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index e859c0348f1..89aef25f24f 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -1,6 +1,7 @@
/obj/structure/closet/cardboard
name = "large cardboard box"
desc = "Just a box..."
+ icon = 'icons/obj/cardboard_boxes.dmi'
icon_state = "cardboard"
icon_opened = "cardboard_open"
icon_closed = "cardboard"
@@ -43,7 +44,7 @@
/mob/living/proc/do_alert_animation(atom/A)
var/image/I
- I = image('icons/obj/closet.dmi', A, "cardboard_special", A.layer+1)
+ I = image('icons/obj/cardboard_boxes.dmi', A, "cardboard_special", A.layer+1)
var/list/viewing = list()
for(var/mob/M in viewers(A))
if(M.client)
@@ -52,6 +53,7 @@
I.alpha = 0
animate(I, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING)
+
/obj/structure/closet/cardboard/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(src.opened)
if(istype(W, /obj/item/weapon/weldingtool))
@@ -62,3 +64,25 @@
for(var/mob/M in viewers(src))
M.show_message("\The [src] has been cut apart by [user] with \the [WC]. ", 3, "You hear cutting.", 2)
qdel(src)
+ return
+ if(istype(W, /obj/item/weapon/pen))
+ var/decalselection = input("Please select a decal") as null|anything in list("Atmospherics", "Bartender", "Barber", "Blueshield", "Brig Physician", "Captain",
+ "Cargo", "Chief Engineer", "Chaplain", "Chef", "Chemist", "Civilian", "Clown", "CMO", "Coroner", "Detective", "Engineering", "Genetics", "HOP",
+ "HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Mechanic", "Medical", "Mime", "Mining", "NT Representative", "Paramedic", "Pod Pilot",
+ "Prisoner", "Research Director", "Security", "Syndicate", "Therapist", "Virology", "Warden", "Xenobiology")
+ if(!decalselection)
+ return
+ if(user.incapacitated())
+ to_chat(user, "You're in no condition to perform this action.")
+ return
+ if(W != user.get_active_hand())
+ to_chat(user, "You must be holding the pen to perform this action.")
+ return
+ if(! Adjacent(user))
+ to_chat(user, "You have moved too far away from the cardboard box.")
+ return
+ decalselection = replacetext(decalselection, " ", "_")
+ decalselection = lowertext(decalselection)
+ icon_opened = ("cardboard_open_"+decalselection)
+ icon_closed = ("cardboard_"+decalselection)
+ update_icon() // a proc declared in the closets parent file used to update opened/closed sprites on normal closets
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 715d16f9ebd..aeb8101fc75 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -23,9 +23,9 @@
if(isrobot(user) || src.locked)
if(istype(O, /obj/item/device/multitool))
- to_chat(user, "\red Resetting circuitry...")
+ to_chat(user, "Resetting circuitry... ")
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
src.locked = 0
to_chat(user, " You disable the locking modules. ")
update_icon()
@@ -43,7 +43,7 @@
user.do_attack_animation(src)
playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
if(W.force < 15)
- to_chat(user, "\blue The cabinet's protective glass glances off the hit.")
+ to_chat(user, "The cabinet's protective glass glances off the hit. ")
else
src.hitstaken++
if(src.hitstaken == 4)
@@ -56,12 +56,12 @@
if(istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
- to_chat(user, "\red Unwield the axe first.")
+ to_chat(user, "Unwield the axe first. ")
return
fireaxe = O
user.drop_item(O)
src.contents += O
- to_chat(user, "\blue You place the fire axe back in the [src.name].")
+ to_chat(user, "You place the fire axe back in the [src.name]. ")
update_icon()
else
if(src.smashed)
@@ -84,12 +84,12 @@
spawn(10) update_icon()
return
else
- to_chat(user, "\red Resetting circuitry...")
+ to_chat(user, "Resetting circuitry... ")
sleep(50)
src.locked = 1
- to_chat(user, "\blue You re-enable the locking modules.")
+ to_chat(user, "You re-enable the locking modules. ")
playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
src.locked = 1
to_chat(user, " You re-enable the locking modules. ")
return
@@ -112,13 +112,13 @@
hasaxe = 1
if(src.locked)
- to_chat(user, "\red The cabinet won't budge!")
+ to_chat(user, "The cabinet won't budge! ")
return
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)
fireaxe = null
- to_chat(user, "\blue You take the fire axe from the [name].")
+ to_chat(user, "You take the fire axe from the [name]. ")
src.add_fingerprint(user)
update_icon()
else
@@ -145,7 +145,7 @@
attack_tk(mob/user as mob)
if(localopened && fireaxe)
fireaxe.forceMove(loc)
- to_chat(user, "\blue You telekinetically remove the fire axe.")
+ to_chat(user, "You telekinetically remove the fire axe. ")
fireaxe = null
update_icon()
return
@@ -157,9 +157,9 @@
if(isrobot(usr) || src.locked || src.smashed)
if(src.locked)
- to_chat(usr, "\red The cabinet won't budge!")
+ to_chat(usr, "The cabinet won't budge! ")
else if(src.smashed)
- to_chat(usr, "\blue The protective glass is broken!")
+ to_chat(usr, "The protective glass is broken! ")
return
localopened = !localopened
@@ -176,23 +176,23 @@
if(fireaxe)
usr.put_in_hands(fireaxe)
fireaxe = null
- to_chat(usr, "\blue You take the Fire axe from the [name].")
+ to_chat(usr, "You take the Fire axe from the [name]. ")
else
- to_chat(usr, "\blue The [src.name] is empty.")
+ to_chat(usr, "The [src.name] is empty. ")
else
- to_chat(usr, "\blue The [src.name] is closed.")
+ to_chat(usr, "The [src.name] is closed. ")
update_icon()
attack_ai(mob/user as mob)
if(src.smashed)
- to_chat(user, "\red The security of the cabinet is compromised.")
+ to_chat(user, "The security of the cabinet is compromised. ")
return
else
locked = !locked
if(locked)
- to_chat(user, "\red Cabinet locked.")
+ to_chat(user, "Cabinet locked. ")
else
- to_chat(user, "\blue Cabinet unlocked.")
+ to_chat(user, "Cabinet unlocked. ")
update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
var/hasaxe = 0
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index a008e3843e9..b0e7c0e00cb 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -1,4 +1,5 @@
/obj/structure/closet/secure_closet/freezer
+ desc = "It's a card-locked refrigerative storage unit. This one is lead-lined."
/obj/structure/closet/secure_closet/freezer/update_icon()
if(broken)
@@ -87,11 +88,14 @@
icon_off = "fridge1"
req_access = list(access_heads_vault)
-
- New()
- ..()
- dispense_cash(6700, src)
-
+/obj/structure/closet/secure_closet/freezer/money/New()
+ ..()
+ for(var/i in 1 to 3)
+ new /obj/item/stack/spacecash/c1000(src)
+ for(var/i in 1 to 5)
+ new /obj/item/stack/spacecash/c500(src)
+ for(var/i in 1 to 6)
+ new /obj/item/stack/spacecash/c200(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index c18fd1a9b74..a5c125a8b35 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -9,18 +9,18 @@
icon_off = "hydrosecureoff"
- New()
- ..()
- switch(rand(1,2))
- if(1)
- new /obj/item/clothing/suit/apron(src)
- if(2)
- new /obj/item/clothing/suit/apron/overalls(src)
- new /obj/item/weapon/storage/bag/plants/portaseeder(src)
- new /obj/item/clothing/under/rank/hydroponics(src)
- new /obj/item/device/analyzer/plant_analyzer(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/device/radio/headset/headset_service(src)
- new /obj/item/clothing/mask/bandana/botany(src)
- new /obj/item/weapon/minihoe(src)
- new /obj/item/weapon/hatchet(src)
\ No newline at end of file
+/obj/structure/closet/secure_closet/hydroponics/New()
+ ..()
+ switch(rand(1,2))
+ if(1)
+ new /obj/item/clothing/suit/apron(src)
+ if(2)
+ new /obj/item/clothing/suit/apron/overalls(src)
+ new /obj/item/weapon/storage/bag/plants/portaseeder(src)
+ new /obj/item/clothing/under/rank/hydroponics(src)
+ new /obj/item/device/plant_analyzer(src)
+ new /obj/item/device/radio/headset/headset_service(src)
+ new /obj/item/clothing/mask/bandana/botany(src)
+ new /obj/item/weapon/cultivator(src)
+ new /obj/item/weapon/hatchet(src)
+ new /obj/item/weapon/storage/box/disks_plantgene(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm b/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm
index 936201cf75f..11cfc6a7dd5 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm
@@ -18,7 +18,7 @@
new /obj/item/weapon/bikehorn(src)
new /obj/item/weapon/reagent_containers/spray/waterflower(src)
new /obj/item/toy/crayon/rainbow(src)
- new /obj/item/seeds/bananaseed(src)
+ new /obj/item/seeds/banana(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 7eab1e6de85..e6d21e79244 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -62,7 +62,7 @@
if(W) W.forceMove(loc)
else if(istype(W, /obj/item/weapon/card/id))
if(src.broken)
- to_chat(user, "\red It appears to be broken.")
+ to_chat(user, "It appears to be broken. ")
return
var/obj/item/weapon/card/id/I = W
if(!I || !I.registered_name) return
@@ -82,8 +82,8 @@
src.registered_name = I.registered_name
src.desc = "Owned by [I.registered_name]."
else
- to_chat(user, "\red Access Denied")
+ to_chat(user, "Access Denied ")
else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
emag_act(user)
else
- to_chat(user, "\red Access Denied")
+ to_chat(user, "Access Denied ")
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index db589c027e6..19dc1622ffe 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -19,14 +19,14 @@
/obj/structure/closet/secure_closet/can_open()
if(!..())
return 0
- if(src.locked)
+ if(locked)
return 0
return ..()
/obj/structure/closet/secure_closet/close()
if(..())
if(broken)
- icon_state = src.icon_off
+ icon_state = icon_off
return 1
else
return 0
@@ -36,29 +36,29 @@
O.emp_act(severity)
if(!broken)
if(prob(50/severity))
- src.locked = !src.locked
- src.update_icon()
+ locked = !locked
+ update_icon()
if(prob(20/severity) && !opened)
if(!locked)
open()
else
- src.req_access = list()
- src.req_access += pick(get_all_accesses())
+ req_access = list()
+ req_access += pick(get_all_accesses())
..()
-/obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob)
- if(src.opened)
+/obj/structure/closet/secure_closet/proc/togglelock(mob/user)
+ if(opened)
to_chat(user, "Close the locker first. ")
return
- if(src.broken)
+ if(broken)
to_chat(user, "The locker appears to be broken. ")
return
if(user.loc == src)
to_chat(user, "You can't reach the lock from inside. ")
return
- if(src.allowed(user))
- src.locked = !src.locked
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ if(allowed(user))
+ locked = !locked
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded )))
to_chat(O, "The locker has been [locked ? null : "un"]locked by [user]. ")
@@ -66,19 +66,21 @@
else
to_chat(user, "Access Denied ")
-/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/rcs))
return ..()
- if(src.opened)
+ if(opened)
if(istype(W, /obj/item/weapon/grab))
- if(src.large)
- src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
+ if(large)
+ MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
else
to_chat(user, "The locker is too small to stuff [W:affecting] into! ")
if(isrobot(user))
return
- user.drop_item()
+ if(!user.drop_item()) //couldn't drop the item
+ to_chat(user, "\The [W] is stuck to your hand, you cannot put it in \the [src]! ")
+ return
if(W)
W.forceMove(loc)
else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
@@ -88,7 +90,7 @@
else
togglelock(user)
-/obj/structure/closet/secure_closet/emag_act(user as mob)
+/obj/structure/closet/secure_closet/emag_act(mob/user)
if(!broken)
broken = 1
locked = 0
@@ -97,24 +99,24 @@
flick(icon_broken, src)
to_chat(user, "You unlock \the [src]. ")
-/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- if(src.locked)
- src.togglelock(user)
+/obj/structure/closet/secure_closet/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(locked)
+ togglelock(user)
else
- src.toggle(user)
+ toggle(user)
/obj/structure/closet/secure_closet/verb/verb_togglelock()
set src in oview(1) // One square distance
set category = "Object"
set name = "Toggle Lock"
- if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
+ if(usr.incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
return
if(ishuman(usr))
- src.add_fingerprint(usr)
- src.togglelock(usr)
+ add_fingerprint(usr)
+ togglelock(usr)
else
to_chat(usr, "This mob type can't use this verb. ")
@@ -167,10 +169,10 @@
locked = 0
welded = 0
update_icon()
- to_chat(usr, "\red You successfully break out!")
+ to_chat(usr, "You successfully break out! ")
for(var/mob/O in viewers(L.loc))
O.show_message("\the [usr] successfully broke out of \the [src]! ", 1)
- if(istype(src.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
- var/obj/structure/bigDelivery/BD = src.loc
+ if(istype(loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
+ var/obj/structure/bigDelivery/BD = loc
BD.attack_hand(usr)
open()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index fce3cd376e2..76b69edc28c 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -15,7 +15,6 @@
else
new /obj/item/weapon/storage/backpack/satchel_cap(src)
new /obj/item/weapon/book/manual/faxes(src)
- new /obj/item/clothing/head/crown/fancy(src)
new /obj/item/weapon/storage/backpack/duffel/captain(src)
new /obj/item/clothing/suit/captunic(src)
new /obj/item/clothing/suit/captunic/capjacket(src)
@@ -113,7 +112,7 @@
new /obj/item/clothing/head/HoS(src)
new /obj/item/clothing/head/HoS/beret(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
- new /obj/item/weapon/storage/lockbox/loyalty(src)
+ new /obj/item/weapon/storage/lockbox/mindshield(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/clothing/mask/gas/sechailer/hos(src)
new /obj/item/weapon/shield/riot/tele(src)
@@ -377,8 +376,10 @@
New()
..()
- new /obj/item/clothing/under/color/orange/prison( src )
- new /obj/item/clothing/shoes/orange( src )
+ new /obj/item/clothing/under/color/orange/prison(src)
+ new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/weapon/card/id/prisoner/random(src)
+ new /obj/item/device/radio/headset(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index c330ad11a01..0692c90ec6d 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -57,10 +57,9 @@
qdel(src)
/obj/structure/closet/statue/dump_contents()
-
- if(istype(src.loc, /mob/living/simple_animal/hostile/statue))
- var/mob/living/simple_animal/hostile/statue/S = src.loc
- src.loc = S.loc
+ if(istype(loc, /mob/living/simple_animal/hostile/statue))
+ var/mob/living/simple_animal/hostile/statue/S = loc
+ forceMove(S.loc)
if(S.mind)
for(var/mob/M in contents)
S.mind.transfer_to(M)
@@ -68,21 +67,16 @@
break
qdel(S)
-
- for(var/obj/O in src)
- O.loc = src.loc
-
for(var/mob/living/M in src)
M.forceMove(loc)
M.disabilities -= MUTE
M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
+ ..()
/obj/structure/closet/statue/open()
return
-
-
/obj/structure/closet/statue/open()
return
@@ -120,7 +114,7 @@
/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
health -= I.force
- visible_message("\red [user] strikes [src] with [I].")
+ visible_message("[user] strikes [src] with [I]. ")
check_health()
/obj/structure/closet/statue/MouseDrop_T()
@@ -142,20 +136,5 @@
if(user)
user.dust()
dump_contents()
- visible_message("\red [src] shatters!. ")
+ visible_message("[src] shatters!. ")
qdel(src)
-
-
-/obj/structure/statue
- name = "statue"
- desc = "An incredibly lifelike marble carving"
- icon = 'icons/obj/statue.dmi'
- icon_state = "human_male"
- density = 1
- anchored = 1
-
-obj/structure/statue/angel
- icon_state = "angelseen"
-
-obj/structure/statue/corgi
- icon_state = "corgi"
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index e4aa901436e..26bd0d88759 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -23,9 +23,9 @@
/obj/structure/closet/syndicate/suits/New()
..()
- new /obj/item/clothing/head/helmet/space/rig/syndi(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/syndi(src)
new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/clothing/suit/space/rig/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi(src)
new /obj/item/weapon/tank/jetpack/oxygen/harness(src)
/obj/structure/closet/syndicate/nuclear
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index bf74c11ee84..07a738a8c94 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -3,7 +3,7 @@
/obj/structure/closet/crate
name = "crate"
desc = "A rectangular steel crate."
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/crates.dmi'
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"
@@ -80,7 +80,7 @@
src.opened = 0
return 1
-/obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/closet/crate/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/rcs) && !src.opened)
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
@@ -102,10 +102,10 @@
L[tmpname] = R
var/desc = input("Please select a telepad.", "RCS") in L
E.pad = L[desc]
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "\blue Teleporting [src.name]...")
+ playsound(E.loc, E.usesound, 50, 1)
+ to_chat(user, "Teleporting [src.name]... ")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -120,10 +120,10 @@
E.rand_x = rand(50,200)
E.rand_y = rand(50,200)
var/L = locate(E.rand_x, E.rand_y, 6)
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "\blue Teleporting [src.name]...")
+ playsound(E.loc, E.usesound, 50, 1)
+ to_chat(user, "Teleporting [src.name]... ")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -166,7 +166,7 @@
else if(istype(W, /obj/item/weapon/wirecutters))
if(rigged)
to_chat(user, "You cut away the wiring. ")
- playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
rigged = 0
return
else return attack_hand(user)
@@ -191,7 +191,7 @@
else
return
-/obj/structure/closet/crate/attack_hand(mob/user as mob)
+/obj/structure/closet/crate/attack_hand(mob/user)
if(manifest)
to_chat(user, "You tear the manifest off of the crate. ")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1)
@@ -250,7 +250,7 @@
/obj/structure/closet/crate/secure/can_open()
return !locked
-/obj/structure/closet/crate/secure/proc/togglelock(mob/user as mob)
+/obj/structure/closet/crate/secure/proc/togglelock(mob/user)
if(src.opened)
to_chat(user, "Close the crate first. ")
return
@@ -280,7 +280,7 @@
else
to_chat(usr, "This mob type can't use this verb. ")
-/obj/structure/closet/crate/secure/attack_hand(mob/user as mob)
+/obj/structure/closet/crate/secure/attack_hand(mob/user)
if(manifest)
to_chat(user, "You tear the manifest off of the crate. ")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1)
@@ -296,7 +296,7 @@
src.toggle(user)
-/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W, mob/user, params)
if(is_type_in_list(W, list(/obj/item/stack/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/wirecutters,/obj/item/weapon/rcs)))
return ..()
if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)))
@@ -307,7 +307,7 @@
return
return ..()
-/obj/structure/closet/crate/secure/emag_act(user as mob)
+/obj/structure/closet/crate/secure/emag_act(mob/user)
if(locked)
overlays += sparks
spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface*
@@ -490,7 +490,6 @@
/obj/structure/closet/crate/large
name = "large crate"
desc = "A hefty metal crate."
- icon = 'icons/obj/storage.dmi'
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
@@ -515,7 +514,6 @@
/obj/structure/closet/crate/secure/large
name = "large crate"
desc = "A hefty metal crate with an electronic locking system."
- icon = 'icons/obj/storage.dmi'
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
@@ -568,9 +566,42 @@
new /obj/item/weapon/wirecutters(src)
new /obj/item/weapon/shovel/spade(src)
new /obj/item/weapon/shovel/spade(src)
- new /obj/item/weapon/storage/box/botanydisk(src)
- new /obj/item/weapon/storage/box/botanydisk(src)
new /obj/item/weapon/storage/box/beakers(src)
new /obj/item/weapon/storage/box/beakers(src)
new /obj/item/weapon/hand_labeler(src)
new /obj/item/weapon/hand_labeler(src)
+
+/obj/structure/closet/crate/sci
+ name = "science crate"
+ desc = "A science crate."
+ icon_state = "scicrate"
+ icon_opened = "scicrateopen"
+ icon_closed = "scicrate"
+
+/obj/structure/closet/crate/secure/scisec
+ name = "secure science crate"
+ desc = "A crate with a lock on it, painted in the scheme of the station's scientists."
+ icon_state = "scisecurecrate"
+ icon_opened = "scisecurecrateopen"
+ icon_closed = "scisecurecrate"
+
+/obj/structure/closet/crate/engineering
+ name = "engineering crate"
+ desc = "An engineering crate."
+ icon_state = "engicrate"
+ icon_opened = "engicrateopen"
+ icon_closed = "engicrate"
+
+/obj/structure/closet/crate/secure/engineering
+ name = "secure engineering crate"
+ desc = "A crate with a lock on it, painted in the scheme of the station's engineers."
+ icon_state = "engisecurecrate"
+ icon_opened = "engisecurecrateopen"
+ icon_closed = "engisecurecrate"
+
+/obj/structure/closet/crate/engineering/electrical
+ name = "electrical engineering crate"
+ desc = "An electrical engineering crate."
+ icon_state = "electricalcrate"
+ icon_opened = "electricalcrateopen"
+ icon_closed = "electricalcrate"
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index d19600989be..4fe6715a05a 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -1,8 +1,8 @@
/obj/structure/largecrate
name = "large crate"
desc = "A hefty wooden crate."
- icon = 'icons/obj/storage.dmi'
- icon_state = "densecrate"
+ icon = 'icons/obj/crates.dmi'
+ icon_state = "largecrate"
density = 1
var/obj/item/weapon/paper/manifest/manifest
@@ -49,7 +49,6 @@
return attack_hand(user)
/obj/structure/largecrate/mule
- icon_state = "mulecrate"
/obj/structure/largecrate/lisa
icon_state = "lisacrate"
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index 9d7bbc96e1b..104fac7fd69 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -27,7 +27,7 @@
..()
/obj/structure/curtain/proc/toggle()
- opacity = !opacity
+ set_opacity(!opacity)
if(opacity)
icon_state = "closed"
layer = SHOWER_CLOSED_LAYER
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 30e7031db2f..72638ff0943 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -22,6 +22,11 @@ var/global/list/captain_display_cases = list()
var/obj/item/device/assembly/prox_sensor/sensor = null
var/state = DISPLAYCASE_FRAME_CIRCUIT
+/obj/structure/displaycase_frame/Destroy()
+ QDEL_NULL(circuit)
+ QDEL_NULL(sensor)
+ return ..()
+
/obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
var/pstate = state
var/turf/T = get_turf(src)
@@ -33,14 +38,14 @@ var/global/list/captain_display_cases = list()
circuit.forceMove(src)
state++
to_chat(user, "You add the airlock electronics to the frame. ")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src),W.usesound, 50, 1)
if(istype(W, /obj/item/weapon/crowbar))
new /obj/machinery/constructable_frame/machine_frame(T)
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(T)
G.amount = 5
qdel(src)
to_chat(user, "You pry the glass out of the frame. ")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
return
if(DISPLAYCASE_FRAME_SCREWDRIVER)
@@ -54,7 +59,7 @@ var/global/list/captain_display_cases = list()
C.req_one_access = null
if(isprox(sensor))
C.burglar_alarm = 1
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(src)
return
if(istype(W, /obj/item/weapon/crowbar))
@@ -65,13 +70,13 @@ var/global/list/captain_display_cases = list()
sensor = null
state--
to_chat(user, "You pry the electronics out of the frame. ")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
if(isprox(W) && !isprox(sensor))
user.drop_item()
sensor = W
sensor.forceMove(src)
to_chat(user, "You add the proximity sensor to the frame. ")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
if(pstate != state)
pstate = state
@@ -116,8 +121,7 @@ var/global/list/captain_display_cases = list()
/obj/structure/displaycase/Destroy()
dump()
- qdel(circuit)
- circuit = null
+ QDEL_NULL(circuit)
return ..()
/obj/structure/displaycase/captains_laser/Destroy()
@@ -227,7 +231,7 @@ var/global/list/captain_display_cases = list()
"You pry \the [src] apart.", \
"You hear something pop.")
var/turf/T = get_turf(src)
- playsound(T, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(T, W.usesound, 50, 1)
dump()
var/obj/item/weapon/airlock_electronics/C = circuit
if(!C)
@@ -252,6 +256,9 @@ var/global/list/captain_display_cases = list()
new /obj/machinery/constructable_frame/machine_frame(T)
qdel(src)
return
+ if(W.flags & ABSTRACT)
+ to_chat(user, "You can't put this into the case. ")
+ return
if(user.a_intent == I_HARM)
if(locked && !destroyed)
src.health -= W.force
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 9dddd902740..b8ab485512a 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -1,4 +1,4 @@
-obj/structure/door_assembly
+/obj/structure/door_assembly
icon = 'icons/obj/doors/door_assembly.dmi'
name = "Airlock Assembly"
@@ -13,120 +13,114 @@ obj/structure/door_assembly
var/glass_type = "/glass"
var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. Text = mineral plating is installed instead.
var/created_name = null
+ var/heat_proof_finished = 0 //whether to heat-proof the finished airlock
- New()
- update_state()
+/obj/structure/door_assembly/New()
+ update_state()
-obj/structure/door_assembly/door_assembly_com
+/obj/structure/door_assembly/Destroy()
+ QDEL_NULL(electronics)
+ return ..()
+
+/obj/structure/door_assembly/door_assembly_com
base_icon_state = "com"
base_name = "Command Airlock"
glass_type = "/glass_command"
airlock_type = "/command"
-obj/structure/door_assembly/door_assembly_sec
+/obj/structure/door_assembly/door_assembly_sec
base_icon_state = "sec"
base_name = "Security Airlock"
glass_type = "/glass_security"
airlock_type = "/security"
-obj/structure/door_assembly/door_assembly_eng
+/obj/structure/door_assembly/door_assembly_eng
base_icon_state = "eng"
base_name = "Engineering Airlock"
glass_type = "/glass_engineering"
airlock_type = "/engineering"
-obj/structure/door_assembly/door_assembly_min
+/obj/structure/door_assembly/door_assembly_min
base_icon_state = "min"
base_name = "Mining Airlock"
glass_type = "/glass_mining"
airlock_type = "/mining"
-obj/structure/door_assembly/door_assembly_atmo
+/obj/structure/door_assembly/door_assembly_atmo
base_icon_state = "atmo"
base_name = "Atmospherics Airlock"
glass_type = "/glass_atmos"
airlock_type = "/atmos"
-obj/structure/door_assembly/door_assembly_research
+/obj/structure/door_assembly/door_assembly_research
base_icon_state = "res"
base_name = "Research Airlock"
glass_type = "/glass_research"
airlock_type = "/research"
-obj/structure/door_assembly/door_assembly_science
+/obj/structure/door_assembly/door_assembly_science
base_icon_state = "sci"
base_name = "Science Airlock"
glass_type = "/glass_science"
airlock_type = "/science"
-obj/structure/door_assembly/door_assembly_med
+/obj/structure/door_assembly/door_assembly_med
base_icon_state = "med"
base_name = "Medical Airlock"
glass_type = "/glass_medical"
airlock_type = "/medical"
-obj/structure/door_assembly/door_assembly_mai
+/obj/structure/door_assembly/door_assembly_mai
base_icon_state = "mai"
base_name = "Maintenance Airlock"
airlock_type = "/maintenance"
glass = -1
-obj/structure/door_assembly/door_assembly_ext
+/obj/structure/door_assembly/door_assembly_ext
base_icon_state = "ext"
base_name = "External Airlock"
airlock_type = "/external"
glass = -1
-obj/structure/door_assembly/door_assembly_fre
+/obj/structure/door_assembly/door_assembly_fre
base_icon_state = "fre"
base_name = "Freezer Airlock"
airlock_type = "/freezer"
glass = -1
-obj/structure/door_assembly/door_assembly_hatch
+/obj/structure/door_assembly/door_assembly_hatch
base_icon_state = "hatch"
base_name = "Airtight Hatch"
airlock_type = "/hatch"
glass = -1
-obj/structure/door_assembly/door_assembly_mhatch
+/obj/structure/door_assembly/door_assembly_mhatch
base_icon_state = "mhatch"
base_name = "Maintenance Hatch"
airlock_type = "/maintenance_hatch"
glass = -1
-obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
+/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
base_icon_state = "highsec"
base_name = "High Security Airlock"
airlock_type = "/highsecurity"
glass = -1
-obj/structure/door_assembly/door_assembly_shuttle
+/obj/structure/door_assembly/door_assembly_shuttle
base_icon_state = "shuttle"
- base_name = "shuttle airlock"
+ base_name = "Shuttle Airlock"
airlock_type = "/shuttle"
glass = -1
-obj/structure/door_assembly/multi_tile
+/obj/structure/door_assembly/multi_tile
icon = 'icons/obj/doors/door_assembly2x1.dmi'
dir = EAST
var/width = 1
-/*Temporary until we get sprites.
- glass_type = "/multi_tile/glass"
- airlock_type = "/multi_tile/maint"
- glass = 1*/
base_icon_state = "g" //Remember to delete this line when reverting "glass" var to 1.
airlock_type = "/multi_tile/glass"
glass = -1 //To prevent bugs in deconstruction process.
-
-/obj/structure/door_assembly/door_assembly_cult
- base_name = "cult airlock assembly"
- icon = 'icons/obj/doors/Doorcult.dmi'
- base_icon_state ="construction"
- airlock_type = "/cult"
-
-obj/structure/door_assembly/multi_tile/New()
+/obj/structure/door_assembly/multi_tile/New()
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
bound_height = world.icon_size
@@ -135,7 +129,7 @@ obj/structure/door_assembly/multi_tile/New()
bound_height = width * world.icon_size
update_state()
-obj/structure/door_assembly/multi_tile/Move()
+/obj/structure/door_assembly/multi_tile/Move()
. = ..()
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
@@ -151,7 +145,6 @@ obj/structure/door_assembly/multi_tile/Move()
airlock_type = "/cult"
glass = -1
-
/obj/structure/door_assembly/door_assembly_cultruned
icon = 'icons/obj/doors/Doorcultruned.dmi'
base_icon_state = "construction"
@@ -159,7 +152,6 @@ obj/structure/door_assembly/multi_tile/Move()
airlock_type = "/cult/runed"
glass = -1
-
/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/pen))
var/t = copytext(stripped_input(user, "Enter the name for the door.", src.name, src.created_name),1,MAX_NAME_LEN)
@@ -171,73 +163,78 @@ obj/structure/door_assembly/multi_tile/Move()
if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
if(istext(glass))
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- to_chat(user, "\blue You welded the [glass] plating off!")
+ to_chat(user, "You welded the [glass] plating off! ")
var/M = text2path("/obj/item/stack/sheet/mineral/[glass]")
new M(src.loc, 2)
glass = 0
else if(glass == 1)
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- to_chat(user, "\blue You welded the glass panel out!")
- new /obj/item/stack/sheet/rglass(src.loc)
+ to_chat(user, "You welded the glass panel out! ")
+ if(heat_proof_finished)
+ new /obj/item/stack/sheet/rglass(get_turf(src))
+ heat_proof_finished = 0
+ else
+ new /obj/item/stack/sheet/glass(get_turf(src))
glass = 0
else if(!anchored)
- user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
- if(do_after(user, 40, target = src))
+ user.visible_message("[user] disassembles the airlock assembly.", "You start to disassemble the airlock assembly.")
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- to_chat(user, "\blue You dissasembled the airlock assembly!")
+ to_chat(user, "You dissasembled the airlock assembly! ")
new /obj/item/stack/sheet/metal(src.loc, 4)
qdel(src)
else
- to_chat(user, "\blue You need more welding fuel.")
+ to_chat(user, "You need more welding fuel. ")
return
else if(istype(W, /obj/item/weapon/wrench) && state == 0)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.")
else
user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
- to_chat(user, "\blue You [anchored? "un" : ""]secured the airlock assembly!")
+ to_chat(user, "You [anchored ? "un" : ""]secured the airlock assembly! ")
anchored = !anchored
else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored )
var/obj/item/stack/cable_coil/coil = W
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * coil.toolspeed, target = src))
if(!src) return
coil.use(1)
src.state = 1
- to_chat(user, "\blue You wire the Airlock!")
+ to_chat(user, "You wire the Airlock! ")
else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 )
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
- to_chat(user, "\blue You cut the airlock wires.!")
- new/obj/item/stack/cable_coil(src.loc, 1)
+ to_chat(user, "You cut the airlock's wires! ")
+ if(state == 1)
+ new/obj/item/stack/cable_coil(src.loc, 1)
src.state = 0
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W:icon_state != "door_electronics_smoked")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
user.drop_item()
W.loc = src
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
- to_chat(user, "\blue You installed the airlock electronics!")
+ to_chat(user, "You installed the airlock electronics! ")
src.state = 2
src.name = "Near finished Airlock Assembly"
src.electronics = W
@@ -245,12 +242,12 @@ obj/structure/door_assembly/multi_tile/Move()
W.loc = src.loc
else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to install electronics into the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
- to_chat(user, "\blue You removed the airlock electronics!")
+ to_chat(user, "You removed the airlock electronics! ")
src.state = 1
src.name = "Wired Airlock Assembly"
var/obj/item/weapon/airlock_electronics/ae
@@ -265,30 +262,34 @@ obj/structure/door_assembly/multi_tile/Move()
var/obj/item/stack/sheet/S = W
if(S)
if(S.amount>=1)
- if(istype(S, /obj/item/stack/sheet/rglass))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ if(istype(S, /obj/item/stack/sheet/rglass) || istype(S, /obj/item/stack/sheet/glass))
+ playsound(src.loc, S.usesound, 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
- if(do_after(user, 40, target = src))
- to_chat(user, "\blue You installed reinforced glass windows into the airlock assembly!")
+ if(do_after(user, 40 * S.toolspeed, target = src))
+ if(S.type == /obj/item/stack/sheet/rglass)
+ to_chat(user, "You install reinforced glass windows into the airlock assembly. ")
+ heat_proof_finished = 1 //reinforced glass makes the airlock heat-proof
+ else
+ to_chat(user, "You install regular glass windows into the airlock assembly. ")
S.use(1)
glass = 1
else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype)
var/M = S.sheettype
if(S.amount>=2)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, S.usesound, 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
- if(do_after(user, 40, target = src))
- to_chat(user, "\blue You installed [M] plating into the airlock assembly!")
+ if(do_after(user, 40 * S.toolspeed, target = src))
+ to_chat(user, "You installed [M] plating into the airlock assembly! ")
S.use(2)
glass = "[M]"
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- to_chat(user, "\blue Now finishing the airlock.")
+ playsound(src.loc, W.usesound, 100, 1)
+ to_chat(user, "Now finishing the airlock. ")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
- to_chat(user, "\blue You finish the airlock!")
+ to_chat(user, "You finish the airlock! ")
var/path
if(istext(glass))
path = text2path("/obj/machinery/door/airlock/[glass]")
@@ -297,8 +298,10 @@ obj/structure/door_assembly/multi_tile/Move()
else
path = text2path("/obj/machinery/door/airlock[airlock_type]")
var/obj/machinery/door/airlock/door = new path(src.loc)
+ door.setDir(dir)
door.assembly_type = type
door.electronics = src.electronics
+ door.heat_proof = heat_proof_finished
if(src.electronics.one_access)
door.req_access = null
door.req_one_access = src.electronics.conf_access
@@ -325,4 +328,4 @@ obj/structure/door_assembly/multi_tile/Move()
name = "Wired "
if(2)
name = "Near Finished "
- name += "[glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly"
\ No newline at end of file
+ name += "[heat_proof_finished ? "Heat-Proofed " : ""][glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly"
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index cc09bfb1f8a..6d35a6aee21 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -5,11 +5,13 @@
icon_state = "dresser"
density = 1
anchored = 1
+ burn_state = FLAMMABLE
+ burntime = 25
/obj/structure/dresser/attack_hand(mob/user as mob)
if(!Adjacent(user))//no tele-grooming
return
- if(ishuman(user))
+ if(ishuman(user) && anchored)
var/mob/living/carbon/human/H = user
var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks")
@@ -51,4 +53,40 @@
H.socks = new_socks
add_fingerprint(H)
- H.update_body()
\ No newline at end of file
+ H.update_body()
+
+/obj/structure/dresser/attackby(obj/item/weapon/W, mob/living/user, params)
+ add_fingerprint(user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ if(iswrench(W))
+ if(anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] is loosening [src]'s bolts.", \
+ "You are loosening [src]'s bolts... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!loc || !anchored)
+ return
+ user.visible_message("[user] loosened [src]'s bolts!", \
+ "You loosen [src]'s bolts! ")
+ anchored = 0
+ else
+ if(!isfloorturf(loc))
+ user.visible_message("A floor must be present to secure [src]! ")
+ return
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] is securing [src]'s bolts...", \
+ "You are securing [src]'s bolts... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!loc || anchored)
+ return
+ user.visible_message("[user] has secured [src]'s bolts.", \
+ "You have secured [src]'s bolts. ")
+ anchored = 1
+ else
+ if(iscrowbar(W) && !anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] is attempting to dismantle [src].", \
+ "You begin to dismantle [src]... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ new /obj/item/stack/sheet/wood (loc, 30)
+ qdel(src)
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 7719f9b547d..2995bda23c3 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -24,7 +24,7 @@
/obj/structure/stool/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
var/obj/structure/stool/bed/chair/C = new /obj/structure/stool/bed/chair(loc)
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
C.dir = dir
part.loc = loc
part.master = null
diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm
index 742664b68b0..56cb984de8a 100644
--- a/code/game/objects/structures/engicart.dm
+++ b/code/game/objects/structures/engicart.dm
@@ -14,6 +14,17 @@
var/obj/item/weapon/storage/toolbox/emergency/myredtoolbox = null
var/obj/item/taperoll/engineering/myengitape = null
+/obj/structure/engineeringcart/Destroy()
+ QDEL_NULL(myglass)
+ QDEL_NULL(mymetal)
+ QDEL_NULL(myplasteel)
+ QDEL_NULL(myflashlight)
+ QDEL_NULL(mybluetoolbox)
+ QDEL_NULL(myyellowtoolbox)
+ QDEL_NULL(myredtoolbox)
+ QDEL_NULL(myengitape)
+ return ..()
+
/obj/structure/engineeringcart/proc/put_in_cart(obj/item/I, mob/user)
user.drop_item()
I.loc = src
@@ -81,14 +92,14 @@
to_chat(user, fail_msg)
else if(istype(I, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. ", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters. ", \
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index e5a89aa1fad..df4731d1a9b 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -8,6 +8,9 @@
var/obj/item/weapon/extinguisher/has_extinguisher = new/obj/item/weapon/extinguisher
var/opened = 0
+/obj/structure/extinguisher_cabinet/Destroy()
+ QDEL_NULL(has_extinguisher)
+ return ..()
/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params)
if(isrobot(user) || isalien(user))
@@ -30,9 +33,9 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
+ var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(user.hand)
- temp = H.organs_by_name["l_hand"]
+ temp = H.bodyparts_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(user, "You try to move your [temp.name], but cannot!")
return
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index a10d5add7fb..0acab425d3d 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -25,7 +25,7 @@
/turf/simulated/wall/rust,
/turf/simulated/wall/r_wall/rust)
smooth = SMOOTH_TRUE
-
+
/obj/structure/falsewall/New(loc)
..()
air_update_turf(1)
@@ -38,7 +38,14 @@
/obj/structure/falsewall/CanAtmosPass(turf/T)
return !density
+/obj/structure/falsewall/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ toggle(user)
+
/obj/structure/falsewall/attack_hand(mob/user)
+ toggle(user)
+
+/obj/structure/falsewall/proc/toggle(mob/user)
if(opening)
return
@@ -119,11 +126,11 @@
new /obj/structure/girder/displaced(loc)
if(mineral == "metal")
if(istype(src, /obj/structure/falsewall/reinforced))
- new /obj/item/stack/sheet/plasteel(loc)
- new /obj/item/stack/sheet/plasteel(loc)
+ new /obj/item/stack/sheet/plasteel(loc, 2)
else
- new /obj/item/stack/sheet/metal(loc)
- new /obj/item/stack/sheet/metal(loc)
+ new /obj/item/stack/sheet/metal(loc, 2)
+ else if(mineral == "wood")
+ new/obj/item/stack/sheet/wood(loc, 2)
else
var/P = text2path("/obj/item/stack/sheet/mineral/[mineral]")
new P(loc)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 11a0bae8849..c93a481189d 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -36,6 +36,14 @@
..()
icon_state = "tree_[rand(1, 6)]"
+/obj/structure/flora/tree/palm
+ icon = 'icons/misc/beach2.dmi'
+ icon_state = "palm1"
+
+/obj/structure/flora/tree/palm/New()
+ ..()
+ icon_state = pick("palm1","palm2")
+ pixel_x = 0
//grass
/obj/structure/flora/grass
@@ -201,7 +209,7 @@
icon_state = "plant-1"
anchored = 0
layer = 5
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
force = 10
throwforce = 13
throw_speed = 2
@@ -306,12 +314,12 @@
if(istype(I, /obj/item/weapon/hatchet) && !stump)
if(indestructable)
//this bush marks the edge of the map, you can't destroy it
- to_chat(user, "\red You flail away at the undergrowth, but it's too thick here.")
+ to_chat(user, "You flail away at the undergrowth, but it's too thick here. ")
else
- user.visible_message("[user] begins clearing away [src].","\red You begin clearing away [src]. ")
+ user.visible_message("[user] begins clearing away [src].","You begin clearing away [src]. ")
spawn(rand(15,30))
if(get_dist(user,src) < 2)
- to_chat(user, "\blue You clear away [src].")
+ to_chat(user, "You clear away [src]. ")
var/obj/item/stack/sheet/wood/W = new(src.loc)
W.amount = rand(3,15)
if(prob(50))
@@ -325,4 +333,4 @@
else
qdel(src)
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm
index de103cc5d57..614f4dc27aa 100644
--- a/code/game/objects/structures/foodcart.dm
+++ b/code/game/objects/structures/foodcart.dm
@@ -56,14 +56,14 @@
to_chat(user, fail_msg)
else if(istype(I, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. ", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters. ", \
diff --git a/code/game/objects/structures/fullwindow.dm b/code/game/objects/structures/fullwindow.dm
index ac6e57a4135..48b2268d8cc 100644
--- a/code/game/objects/structures/fullwindow.dm
+++ b/code/game/objects/structures/fullwindow.dm
@@ -6,7 +6,7 @@
/obj/structure/window/full/CheckExit(atom/movable/O as mob|obj, target as turf)
return 1
-/obj/structure/window/full/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/window/full/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
return 0
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 6051bbebef6..c8877b320ff 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -1,17 +1,36 @@
/obj/structure/girder
+ name = "girder"
icon_state = "girder"
anchored = 1
density = 1
- layer = TURF_LAYER + 0.9
- var/state = 0
+ layer = BELOW_OBJ_LAYER
+ var/state = GIRDER_NORMAL
+ var/girderpasschance = 20 // percentage chance that a projectile passes through the girder.
var/health = 200
+ var/can_displace = TRUE //If the girder can be moved around by crowbarring it
var/metalUsed = 2 //used to determine amount returned in deconstruction
+ var/can_deconstruct = TRUE
+
+/obj/structure/girder/examine(mob/user)
+ . = ..()
+ switch(state)
+ if(GIRDER_REINF)
+ to_chat(user, "The support struts are screwed in place. ")
+ if(GIRDER_REINF_STRUTS)
+ to_chat(user, "The support struts are unscrewed and the inner grille is intact. ")
+ if(GIRDER_NORMAL)
+ if(can_displace)
+ to_chat(user, "The bolts are lodged in place. ")
+ if(GIRDER_DISPLACED)
+ to_chat(user, "The bolts are loosened , but the screws are holding [src] together. ")
+ if(GIRDER_DISASSEMBLED)
+ to_chat(user, "[src] is disassembled! You probably shouldn't be able to see this examine message. ")
/obj/structure/girder/proc/refundMetal(metalAmount) //refunds metal used in construction when deconstructed
for(var/i=0;i < metalAmount;i++)
new /obj/item/stack/sheet/metal(get_turf(src))
-/obj/structure/girder/attack_animal(var/mob/living/simple_animal/M)
+/obj/structure/girder/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
if(M.environment_smash >= 1)
@@ -23,166 +42,338 @@
take_damage(rand(25, 75))
return
-/obj/structure/girder/proc/take_damage(var/amount)
+/obj/structure/girder/proc/take_damage(amount)
health -= amount
if(health <= 0)
new /obj/item/stack/sheet/metal(get_turf(src))
qdel(src)
-/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/wrench) && state == 0)
- if(anchored && !istype(src,/obj/structure/girder/displaced))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- to_chat(user, "\blue Now disassembling the girder")
- if(do_after(user,40, target = src))
- if(!src) return
- to_chat(user, "\blue You dissasembled the girder!")
- refundMetal(metalUsed)
+/obj/structure/girder/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ if(isscrewdriver(W))
+ if(state == GIRDER_DISPLACED)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] disassembles the girder. ", \
+ "You start to disassemble the girder... ", "You hear clanking and banging noises.")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(state != GIRDER_DISPLACED)
+ return
+ state = GIRDER_DISASSEMBLED
+ to_chat(user, "You disassemble the girder. ")
+ var/obj/item/stack/sheet/metal/M = new(loc, 2)
+ M.add_fingerprint(user)
qdel(src)
- else if(!anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- to_chat(user, "\blue Now securing the girder")
- if(do_after(user, 40, target = src))
- to_chat(user, "\blue You secured the girder!")
- new/obj/structure/girder( src.loc )
+ else if(state == GIRDER_REINF)
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You start unsecuring support struts... ")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(state != GIRDER_REINF)
+ return
+ to_chat(user, "You unsecure the support struts. ")
+ state = GIRDER_REINF_STRUTS
+ else if(state == GIRDER_REINF_STRUTS)
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You start securing support struts... ")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(state != GIRDER_REINF_STRUTS)
+ return
+ to_chat(user, "You secure the support struts. ")
+ state = GIRDER_REINF
+
+ else if(iswrench(W))
+ if(state == GIRDER_NORMAL)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] disassembles the girder. ", \
+ "You start to disassemble the girder... ", "You hear clanking and banging noises.")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(state != GIRDER_NORMAL)
+ return
+ state = GIRDER_DISASSEMBLED
+ to_chat(user, "You disassemble the girder. ")
+ var/obj/item/stack/sheet/metal/M = new(loc, 2)
+ M.add_fingerprint(user)
+ qdel(src)
+ else if(state == GIRDER_DISPLACED)
+ if(!isfloorturf(loc))
+ to_chat(user, "A floor must be present to secure the girder! ")
+ return
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You start securing the girder... ")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ to_chat(user, "You secure the girder. ")
+ var/obj/structure/girder/G = new(loc)
+ transfer_fingerprints_to(G)
qdel(src)
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
- to_chat(user, "\blue Now slicing apart the girder")
- if(do_after(user,30, target = src))
- if(!src) return
- to_chat(user, "\blue You slice apart the girder!")
+ to_chat(user, "You start slicing apart the girder... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!src)
+ return
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You slice apart the girder. ")
refundMetal(metalUsed)
qdel(src)
else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill))
- to_chat(user, "\blue You drill through the girder!")
+ to_chat(user, "You drill through the girder! ")
refundMetal(metalUsed)
qdel(src)
else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
- playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 100, 1)
- to_chat(user, "You Disintegrate the girder! ")
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You disintegrate the girder! ")
refundMetal(metalUsed)
qdel(src)
- else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- to_chat(user, "\blue Now unsecuring support struts")
- if(do_after(user,40, target = src))
- if(!src) return
- to_chat(user, "\blue You unsecured the support struts!")
- state = 1
-
- else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- to_chat(user, "\blue Now removing support struts")
- if(do_after(user,40, target = src))
- if(!src) return
- to_chat(user, "\blue You removed the support struts!")
- new/obj/structure/girder( src.loc )
+ else if(iswirecutter(W) && state == GIRDER_REINF_STRUTS)
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You start removing the inner grille... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!src)
+ return
+ to_chat(user, "You remove the inner grille. ")
+ new /obj/item/stack/sheet/plasteel(get_turf(src))
+ var/obj/structure/girder/G = new (loc)
+ transfer_fingerprints_to(G)
qdel(src)
- else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored )
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
- to_chat(user, "\blue Now dislodging the girder")
- if(do_after(user, 40, target = src))
- if(!src) return
- to_chat(user, "\blue You dislodged the girder!")
- new/obj/structure/girder/displaced( src.loc )
- qdel(src)
-
- else if(istype(W, /obj/item/stack/sheet))
-
- var/obj/item/stack/sheet/S = W
- switch(S.type)
-
- if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg)
- if(!anchored)
- if(S.amount < 2) return
- S.use(2)
- to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.")
- new /obj/structure/falsewall (src.loc)
- qdel(src)
- else
- if(S.amount < 2) return ..()
- to_chat(user, "\blue Now adding plating...")
- if(do_after(user,40, target = src))
- if(!src || !S || S.amount < 2) return
- S.use(2)
- to_chat(user, "\blue You added the plating!")
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(/turf/simulated/wall)
- for(var/turf/simulated/wall/X in Tsrc.loc)
- if(X) X.add_hiddenprint(usr)
- qdel(src)
- return
-
- if(/obj/item/stack/sheet/plasteel)
- if(!anchored)
- if(S.amount < 2) return
- S.use(2)
- to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.")
- new /obj/structure/falsewall/reinforced (src.loc)
- qdel(src)
- else
- if(src.icon_state == "reinforced") //I cant believe someone would actually write this line of code...
- if(S.amount < 1) return ..()
- to_chat(user, "\blue Now finalising reinforced wall.")
- if(do_after(user, 50, target = src))
- if(!src || !S || S.amount < 1) return
- S.use(1)
- to_chat(user, "\blue Wall fully reinforced!")
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(/turf/simulated/wall/r_wall)
- for(var/turf/simulated/wall/r_wall/X in Tsrc.loc)
- if(X) X.add_hiddenprint(usr)
- qdel(src)
- return
- else
- if(S.amount < 1) return ..()
- to_chat(user, "\blue Now reinforcing girders")
- if(do_after(user,60, target = src))
- if(!src || !S || S.amount < 1) return
- S.use(1)
- to_chat(user, "\blue Girders reinforced!")
- new/obj/structure/girder/reinforced( src.loc )
- qdel(src)
- return
-
- if(S.sheettype)
- var/M = S.sheettype
- if(!anchored)
- if(S.amount < 2) return
- S.use(2)
- to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.")
- var/F = text2path("/obj/structure/falsewall/[M]")
- new F (src.loc)
+ else if(iscrowbar(W))
+ if(state == GIRDER_NORMAL && can_displace)
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You start dislodging the girder... ")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ to_chat(user, "You dislodge the girder. ")
+ var/obj/structure/girder/displaced/D = new (loc)
+ transfer_fingerprints_to(D)
qdel(src)
- else
- if(S.amount < 2) return ..()
- to_chat(user, "\blue Now adding plating...")
- if(do_after(user,40, target = src))
- if(!src || !S || S.amount < 2) return
+
+ else if(istype(W, /obj/item/stack))
+ if(iswallturf(loc))
+ to_chat(user, "There is already a wall present! ")
+ return
+ if(!isfloorturf(loc))
+ to_chat(user, "A floor must be present to build a false wall! ")
+ return
+ if (locate(/obj/structure/falsewall) in loc.contents)
+ to_chat(user, "There is already a false wall present! ")
+ return
+ if(istype(W, /obj/item/stack/sheet/runed_metal))
+ to_chat(user, "You can't seem to make the metal bend.. ")
+ return
+
+ if(istype(W,/obj/item/stack/rods))
+ var/obj/item/stack/rods/S = W
+ if(state == GIRDER_DISPLACED)
+ if(S.get_amount() < 2)
+ to_chat(user, "You need at least two rods to create a false wall! ")
+ return
+ to_chat(user, "You start building a reinforced false wall... ")
+ if(do_after(user, 20, target = src))
+ if(!loc || !S || S.get_amount() < 2)
+ return
S.use(2)
- to_chat(user, "\blue You added the plating!")
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]"))
- for(var/turf/simulated/wall/mineral/X in Tsrc.loc)
- if(X) X.add_hiddenprint(usr)
+ to_chat(user, "You create a false wall. Push on it to open or close the passage. ")
+ var/obj/structure/falsewall/iron/FW = new (loc)
+ transfer_fingerprints_to(FW)
+ qdel(src)
+ else
+ if(S.get_amount() < 5)
+ to_chat(user, "You need at least five rods to add plating! ")
+ return
+ to_chat(user, "You start adding plating... ")
+ if (do_after(user, 40, target = src))
+ if(!loc || !S || S.get_amount() < 5)
+ return
+ S.use(5)
+ to_chat(user, "You add the plating. ")
+ var/turf/T = get_turf(src)
+ T.ChangeTurf(/turf/simulated/wall/mineral/iron)
+ transfer_fingerprints_to(T)
qdel(src)
return
- add_hiddenprint(usr)
+ if(!istype(W,/obj/item/stack/sheet))
+ return
+
+ var/obj/item/stack/sheet/S = W
+
+ if(istype(S, /obj/item/stack/sheet/wood))
+ if(state == GIRDER_DISPLACED)
+ if(S.get_amount() < 2)
+ to_chat(user, "You need two planks of wood to create a false wall! ")
+ return
+ to_chat(user, "You start building a false wall... ")
+ if(do_after(user, 20, target = src))
+ if(!loc || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You create a false wall. Push on it to open or close the passage. ")
+ var/obj/structure/falsewall/wood/falsewood = new(loc)
+ transfer_fingerprints_to(falsewood)
+ qdel(src)
+ else
+ if(S.get_amount() < 2)
+ to_chat(user, "You need two planks of wood to finish a wall! ")
+ return
+ to_chat(user, "You start adding plating... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!src || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You add the plating. ")
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(/turf/simulated/wall/mineral/wood)
+ for(var/turf/simulated/wall/mineral/wood/X in Tsrc.loc)
+ if(X)
+ X.add_hiddenprint(usr)
+ qdel(src)
+ return
+
+ else if(istype(S, /obj/item/stack/sheet/metal))
+ if(state == GIRDER_DISPLACED)
+ if(S.get_amount() < 2)
+ to_chat(user, "You need two sheets of metal to create a false wall! ")
+ return
+ to_chat(user, "You start building a false wall... ")
+ if(do_after(user, 20, target = src))
+ if(!loc || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You create a false wall. Push on it to open or close the passage. ")
+ var/obj/structure/falsewall/F = new(loc)
+ transfer_fingerprints_to(F)
+ qdel(src)
+ else
+ if(S.get_amount() < 2)
+ to_chat(user, "You need two sheets of metal to finish a wall! ")
+ return
+ to_chat(user, "You start adding plating... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!src || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You add the plating. ")
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(/turf/simulated/wall)
+ for(var/turf/simulated/wall/X in Tsrc.loc)
+ if(X)
+ X.add_hiddenprint(usr)
+ qdel(src)
+ return
+
+ if(istype(S, /obj/item/stack/sheet/plasteel))
+ if(state == GIRDER_DISPLACED)
+ if(S.get_amount() < 2)
+ to_chat(user, "You need at least two sheets to create a false wall! ")
+ return
+ to_chat(user, "You start building a reinforced false wall... ")
+ if(do_after(user, 20, target = src))
+ if(!loc || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You create a reinforced false wall. Push on it to open or close the passage. ")
+ var/obj/structure/falsewall/reinforced/FW = new (loc)
+ transfer_fingerprints_to(FW)
+ qdel(src)
+ else
+ if(state == GIRDER_REINF)
+ if(S.get_amount() < 1)
+ return
+ to_chat(user, "You start finalizing the reinforced wall... ")
+ if(do_after(user, 50, target = src))
+ if(!src || !S || S.get_amount() < 1)
+ return
+ S.use(1)
+ to_chat(user, "You fully reinforce the wall. ")
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(/turf/simulated/wall/r_wall)
+ for(var/turf/simulated/wall/r_wall/X in Tsrc.loc)
+ if(X)
+ X.add_hiddenprint(usr)
+ qdel(src)
+ return
+ else
+ if(S.get_amount() < 1)
+ return
+ to_chat(user, "You start reinforcing the girder... ")
+ if(do_after(user,60, target = src))
+ if(!src || !S || S.get_amount() < 1)
+ return
+ S.use(1)
+ to_chat(user, "You reinforce the girder. ")
+ var/obj/structure/girder/reinforced/R = new (loc)
+ transfer_fingerprints_to(R)
+ qdel(src)
+ return
+
+ if(S.sheettype)
+ var/M = S.sheettype
+ if(state == GIRDER_DISPLACED)
+ if(S.get_amount() < 2)
+ to_chat(user, "You need at least two sheets to create a false wall! ")
+ return
+ if(do_after(user, 20, target = src))
+ if(!loc || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You create a false wall. Push on it to open or close the passage. ")
+ var/F = text2path("/obj/structure/falsewall/[M]")
+ var/obj/structure/FW = new F (loc)
+ transfer_fingerprints_to(FW)
+ qdel(src)
+ else
+ if(S.get_amount() < 2)
+ to_chat(user, "You need at least two sheets to add plating! ")
+ return
+ to_chat(user, "You start adding plating... ")
+ if(do_after(user,40, target = src))
+ if(!src || !S || S.get_amount() < 2)
+ return
+ S.use(2)
+ to_chat(user, "You add the plating. ")
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]"))
+ for(var/turf/simulated/wall/mineral/X in Tsrc.loc)
+ if(X)
+ X.add_hiddenprint(usr)
+ qdel(src)
+ return
+
+ add_hiddenprint(user)
else if(istype(W, /obj/item/pipe))
var/obj/item/pipe/P = W
if(P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
- user.drop_item()
+ if(!user.drop_item())
+ return
P.loc = src.loc
- to_chat(user, "\blue You fit the pipe into the [src]!")
+ to_chat(user, "You fit the pipe into \the [src]. ")
else
- ..()
+ return ..()
+
+/obj/structure/girder/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0)
+ return 1
+ if(istype(mover) && mover.checkpass(PASSGRILLE))
+ return prob(girderpasschance)
+ else
+ if(istype(mover, /obj/item/projectile))
+ return prob(girderpasschance)
+ else
+ return 0
+
+/obj/structure/girder/CanAStarPass(ID, dir, caller)
+ . = !density
+ if(ismovableatom(caller))
+ var/atom/movable/mover = caller
+ . = . || mover.checkpass(PASSGRILLE)
+
+/obj/structure/girder/proc/deconstruct(disassembled = TRUE)
+ if(can_deconstruct)
+ var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
+ new remains(loc)
+ qdel(src)
/obj/structure/girder/blob_act()
if(prob(40))
@@ -190,12 +381,12 @@
/obj/structure/girder/narsie_act()
if(prob(25))
- new /obj/structure/cultgirder(loc)
+ new /obj/structure/girder/cult(loc)
qdel(src)
-/obj/structure/girder/bullet_act(var/obj/item/projectile/Proj)
+/obj/structure/girder/bullet_act(obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam/pulse))
- src.ex_act(2)
+ ex_act(2)
else
take_damage(Proj.damage)
..()
@@ -203,16 +394,16 @@
/obj/structure/girder/ex_act(severity)
switch(severity)
- if(1.0)
+ if(1)
qdel(src)
return
- if(2.0)
+ if(2)
if(prob(75))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
qdel(src)
return
- if(3.0)
+ if(3)
if(prob(40))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
@@ -222,69 +413,97 @@
return
/obj/structure/girder/displaced
+ name = "displaced girder"
icon_state = "displaced"
anchored = 0
- health = 50
+ state = GIRDER_DISPLACED
+ girderpasschance = 25
+ health = 120
/obj/structure/girder/reinforced
+ name = "reinforced girder"
icon_state = "reinforced"
- state = 2
- health = 500
+ state = GIRDER_REINF
+ girderpasschance = 0
+ health = 350
-/obj/structure/cultgirder
- icon= 'icons/obj/cult.dmi'
+/obj/structure/girder/cult
+ name = "runed girder"
+ desc = "Framework made of a strange and shockingly cold metal. It doesn't seem to have any bolts."
+ icon = 'icons/obj/cult.dmi'
icon_state= "cultgirder"
- anchored = 1
- density = 1
- var/health = 250
+ can_displace = FALSE
+ metalUsed = 1
-/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- to_chat(user, "\blue Now disassembling the girder")
- if(do_after(user,40, target = src))
- to_chat(user, "\blue You dissasembled the girder!")
- dismantle()
+/obj/structure/girder/cult/refundMetal(metalAmount)
+ for(var/i=0;i < metalAmount;i++)
+ new /obj/item/stack/sheet/runed_metal(get_turf(src))
+
+/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ if(istype(W, /obj/item/weapon/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
+ user.visible_message("[user] strikes [src] with [W]! ", "You demolish [src]. ")
+ refundMetal(metalUsed)
+ qdel(src)
+
+ else if(iswelder(W))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0,user))
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "You start slicing apart the girder... ")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!WT.isOn())
+ return
+ to_chat(user, "You slice apart the girder. ")
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 1
+ transfer_fingerprints_to(R)
+ qdel(src)
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
- to_chat(user, "\blue Now slicing apart the girder")
- if(do_after(user,30, target = src))
- to_chat(user, "\blue You slice apart the girder!")
- dismantle()
+ to_chat(user, "You start slicing apart the girder... ")
+ if(do_after(user, 40* W.toolspeed, target = src))
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "You slice apart the girder. ")
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 1
+ transfer_fingerprints_to(R)
+ qdel(src)
- else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill))
- to_chat(user, "\blue You drill through the girder!")
- dismantle()
+ else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
+ var/obj/item/weapon/pickaxe/drill/jackhammer/D = W
+ to_chat(user, "Your jackhammer smashes through the girder! ")
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 1
+ transfer_fingerprints_to(R)
+ D.playDigSound()
+ qdel(src)
-/obj/structure/cultgirder/proc/dismantle()
- new /obj/effect/decal/remains/human(get_turf(src))
- qdel(src)
+ else if(istype(W, /obj/item/stack/sheet/runed_metal))
+ var/obj/item/stack/sheet/runed_metal/R = W
+ if(R.get_amount() < 1)
+ to_chat(user, "You need at least one sheet of runed metal to construct a runed wall! ")
+ return 0
+ user.visible_message("[user] begins laying runed metal on [src]... ", "You begin constructing a runed wall... ")
+ if(do_after(user, 50, target = src))
+ if(R.get_amount() < 1 || !R)
+ return
+ user.visible_message("[user] plates [src] with runed metal. ", "You construct a runed wall. ")
+ R.use(1)
+ var/turf/T = get_turf(src)
+ T.ChangeTurf(/turf/simulated/wall/cult)
+ qdel(src)
-/obj/structure/cultgirder/blob_act()
- if(prob(40))
- dismantle()
-
-/obj/structure/cultgirder/bullet_act(var/obj/item/projectile/Proj) //No beam check- How else will you destroy the cult girder with silver bullets?????
- health -= Proj.damage
- ..()
+/obj/structure/girder/cult/take_damage(amount)
+ health -= amount
if(health <= 0)
- dismantle()
+ new /obj/item/stack/sheet/runed_metal(get_turf(src))
+ qdel(src)
+
+/obj/structure/girder/cult/narsie_act()
return
-/obj/structure/cultgirder/ex_act(severity)
- switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
- if(prob(30))
- new /obj/effect/decal/remains/human(loc)
- qdel(src)
- return
- if(3.0)
- if(prob(5))
- new /obj/effect/decal/remains/human(loc)
- qdel(src)
- return
- else
- return
\ No newline at end of file
+/obj/structure/girder/cult/deconstruct(disassembled = TRUE)
+ if(can_deconstruct)
+ new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
+ qdel(src)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 4cb2b20f99e..c1b4984c158 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -7,11 +7,16 @@
anchored = 1
flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE
- layer = 2.9
- var/health = 10
- var/destroyed = 0
+ layer = BELOW_OBJ_LAYER
level = 3
-
+ var/health = 10
+ var/broken = 0
+ var/can_deconstruct = TRUE
+ var/rods_type = /obj/item/stack/rods
+ var/rods_amount = 2
+ var/rods_broken = 1
+ var/grille_type = null
+ var/broken_type = /obj/structure/grille/broken
/obj/structure/grille/fence/
var/width = 3
@@ -26,7 +31,6 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
-
/obj/structure/grille/fence/east_west
//width=80
//height=42
@@ -38,19 +42,23 @@
icon='icons/fence-ns.dmi'
/obj/structure/grille/ex_act(severity)
- qdel(src)
+ switch(severity)
+ if(1)
+ qdel(src)
+ else
+ take_damage(rand(5,10), BRUTE, 0)
/obj/structure/grille/blob_act()
- qdel(src)
+ if(!broken)
+ obj_break()
/obj/structure/grille/Bumped(atom/user)
- if(ismob(user)) shock(user, 70)
+ if(ismob(user))
+ shock(user, 70)
-
-/obj/structure/grille/attack_hand(mob/living/user as mob)
+/obj/structure/grille/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
user.visible_message("[user] kicks [src]. ", \
"You kick [src]. ", \
"You hear twisting metal.")
@@ -58,26 +66,23 @@
if(shock(user, 70))
return
if(HULK in user.mutations)
- health -= 5
+ take_damage(5)
else
- health -= 1
- healthcheck()
+ take_damage(rand(1,2))
-/obj/structure/grille/attack_alien(mob/living/user as mob)
- if(istype(user, /mob/living/carbon/alien/larva)) return
+/obj/structure/grille/attack_alien(mob/living/user)
+ if(istype(user, /mob/living/carbon/alien/larva))
+ return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
user.visible_message("[user] mangles [src]. ", \
"You mangle [src]. ", \
"You hear twisting metal.")
if(!shock(user, 70))
- health -= 5
- healthcheck()
- return
+ take_damage(5)
-/obj/structure/grille/attack_slime(mob/living/user as mob)
+/obj/structure/grille/attack_slime(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
var/mob/living/carbon/slime/S = user
@@ -89,12 +94,11 @@
"You smash against [src]. ", \
"You hear twisting metal.")
- health -= rand(2,3)
- healthcheck()
- return
+ take_damage(rand(1,2))
-/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M as mob)
- if(M.melee_damage_upper == 0) return
+/obj/structure/grille/attack_animal(mob/living/simple_animal/M)
+ if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
+ return
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
@@ -102,18 +106,15 @@
"You smash against [src]. ", \
"You hear twisting metal.")
- health -= M.melee_damage_upper
- healthcheck()
- return
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
/obj/structure/grille/mech_melee_attack(obj/mecha/M)
if(..())
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- health -= M.force * 0.5
- healthcheck()
+ take_damage(M.force * 0.5, M.damtype)
-/obj/structure/grille/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/structure/grille/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0)
+ return 1
if(istype(mover) && mover.checkpass(PASSGRILLE))
return 1
else
@@ -128,118 +129,144 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
-/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj)
- return
- ..()
- if((Proj.damage_type != STAMINA)) //Grilles can't be exhausted to death
- src.health -= Proj.damage*0.3
- healthcheck()
- return
+/obj/structure/grille/bullet_act(obj/item/projectile/Proj)
+ . = ..()
+ take_damage(Proj.damage*0.3, Proj.damage_type)
-/obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/grille/attackby(obj/item/weapon/W, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
+ add_fingerprint(user)
if(iswirecutter(W))
if(!shock(user, 100))
- playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
- if(!destroyed)
- new /obj/item/stack/rods(loc, 2)
- else
- new /obj/item/stack/rods(loc)
- qdel(src)
+ playsound(loc, W.usesound, 100, 1)
+ deconstruct()
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
anchored = !anchored
- user.visible_message("[user] [anchored ? "fastens" : "unfastens"] the grille. ", \
- "You have [anchored ? "fastened the grille to" : "unfastened the grill from"] the floor. ")
+ user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src]. ", \
+ "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor. ")
+ return
+ else if(istype(W, /obj/item/stack/rods) && broken)
+ var/obj/item/stack/rods/R = W
+ if(!shock(user, 90))
+ user.visible_message("[user] rebuilds the broken grille. ", \
+ "You rebuild the broken grille. ")
+ new grille_type(loc)
+ R.use(1)
+ qdel(src)
return
//window placing begin
- else if( istype(W,/obj/item/stack/sheet/rglass) || istype(W,/obj/item/stack/sheet/glass) || istype(W,/obj/item/stack/sheet/plasmaglass) || istype(W,/obj/item/stack/sheet/plasmarglass) )
- var/dir_to_set = 1
- if(loc == user.loc)
- dir_to_set = user.dir
- else
- if( ( x == user.x ) || (y == user.y) ) //Only supposed to work for cardinal directions.
- if( x == user.x )
- if( y > user.y )
- dir_to_set = 2
- else
- dir_to_set = 1
- else if( y == user.y )
- if( x > user.x )
- dir_to_set = 8
- else
- dir_to_set = 4
- else
- to_chat(user, "You can't reach. ")
- return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
- for(var/obj/structure/window/WINDOW in loc)
- if(WINDOW.dir == dir_to_set)
- to_chat(user, "There is already a window facing this way there. ")
+ else if(istype(W,/obj/item/stack/sheet/rglass) || istype(W,/obj/item/stack/sheet/glass) || istype(W,/obj/item/stack/sheet/plasmaglass) || istype(W,/obj/item/stack/sheet/plasmarglass))
+ if(!broken)
+ var/obj/item/stack/ST = W
+ if (ST.get_amount() < 1)
+ to_chat(user, "You need at least one sheet of glass for that! ")
return
- to_chat(user, "You start placing the window. ")
- if(do_after(user,20, target = src))
- if(!src) return //Grille destroyed while waiting
+ var/dir_to_set = NORTH
+ if(!anchored)
+ to_chat(user, "[src] needs to be fastened to the floor first! ")
+ return
+ if(loc == user.loc)
+ dir_to_set = user.dir
+ else
+ if((x == user.x) || (y == user.y)) //Only supposed to work for cardinal directions.
+ if(x == user.x)
+ if(y > user.y)
+ dir_to_set = SOUTH
+ else
+ dir_to_set = NORTH
+ else if(y == user.y)
+ if(x > user.x)
+ dir_to_set = WEST
+ else
+ dir_to_set = EAST
+ else
+ to_chat(user, "You can't reach. ")
+ return //Only works for cardinal direcitons, diagonals aren't supposed to work like this.
for(var/obj/structure/window/WINDOW in loc)
- if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
+ if(WINDOW.dir == dir_to_set)
to_chat(user, "There is already a window facing this way there. ")
return
- var/obj/structure/window/WD
- if(istype(W,/obj/item/stack/sheet/rglass))
- WD = new/obj/structure/window/reinforced(loc) //reinforced window
- else if(istype(W,/obj/item/stack/sheet/glass))
- WD = new/obj/structure/window/basic(loc) //normal window
- else if(istype(W,/obj/item/stack/sheet/plasmaglass))
- WD = new/obj/structure/window/plasmabasic(loc) //basic plasma window
- else
- WD = new/obj/structure/window/plasmareinforced(loc) //reinforced plasma window
- WD.dir = dir_to_set
- WD.ini_dir = dir_to_set
- WD.anchored = 0
- WD.state = 0
- var/obj/item/stack/ST = W
- ST.use(1)
- to_chat(user, "You place the [WD] on [src]. ")
- WD.update_icon()
- return
+ to_chat(user, "You start placing the window... ")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ if(!loc || !anchored) //Grille destroyed or unanchored while waiting
+ return
+ for(var/obj/structure/window/WINDOW in loc)
+ if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
+ to_chat(user, "There is already a window facing this way there. ")
+ return
+ var/obj/structure/window/WD
+ if(istype(W,/obj/item/stack/sheet/rglass))
+ WD = new/obj/structure/window/reinforced(loc) //reinforced window
+ else if(istype(W,/obj/item/stack/sheet/glass))
+ WD = new/obj/structure/window/basic(loc) //normal window
+ else if(istype(W,/obj/item/stack/sheet/plasmaglass))
+ WD = new/obj/structure/window/plasmabasic(loc) //basic plasma window
+ else
+ WD = new/obj/structure/window/plasmareinforced(loc) //reinforced plasma window
+ WD.setDir(dir_to_set)
+ WD.ini_dir = dir_to_set
+ WD.anchored = 0
+ WD.state = 0
+ ST.use(1)
+ to_chat(user, "You place the [WD] on [src]. ")
+ WD.update_icon()
+ return
//window placing end
+ else if(istype(W, /obj/item/weapon/shard) || !shock(user, 70))
+ return attacked_by(W, user)
- else if(istype(W, /obj/item/weapon/shard))
- health -= W.force * 0.1
- else if(!shock(user, 70))
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- switch(W.damtype)
- if("fire")
- health -= W.force
- if("brute")
- health -= W.force * 0.1
- healthcheck()
- ..()
- return
+/obj/structure/grille/proc/attacked_by(obj/item/I, mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+ if(!(I.flags&NOBLUDGEON))
+ if(I.force)
+ visible_message("[user] has hit [src] with [I]! ")
+ take_damage(I.force * 0.3, I.damtype)
+/obj/structure/grille/proc/deconstruct(disassembled = TRUE)
+ if(!loc) //if already qdel'd somehow, we do nothing
+ return
+ if(can_deconstruct)
+ var/obj/R = new rods_type(loc, rods_amount)
+ transfer_fingerprints_to(R)
+ qdel(src)
-/obj/structure/grille/proc/healthcheck()
+/obj/structure/grille/proc/obj_break()
+ if(!broken && can_deconstruct)
+ new broken_type(loc)
+ var/obj/R = new rods_type(loc, rods_broken)
+ transfer_fingerprints_to(R)
+ qdel(src)
+
+/obj/structure/grille/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
+ switch(damage_type)
+ if(BURN)
+ if(sound_effect)
+ playsound(loc, 'sound/items/welder.ogg', 80, 1)
+ if(BRUTE)
+ if(sound_effect)
+ if(damage)
+ playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ else
+ return
+ health -= damage
if(health <= 0)
- if(!destroyed)
- icon_state = "brokengrille"
- density = 0
- destroyed = 1
- new /obj/item/stack/rods(loc)
-
+ if(!broken)
+ obj_break()
else
if(health <= -6)
- new /obj/item/stack/rods(loc)
- qdel(src)
- return
- return
+ deconstruct()
// shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise
-/obj/structure/grille/proc/shock(mob/user as mob, prb)
- if(!anchored || destroyed) // deanchored/destroyed grilles are never connected
+/obj/structure/grille/proc/shock(mob/user, prb)
+ if(!anchored || broken) // unanchored/broken grilles are never connected
return 0
if(!prob(prb))
return 0
@@ -258,8 +285,35 @@
return 0
/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(!destroyed)
+ if(!broken)
if(exposed_temperature > T0C + 1500)
- health -= 1
- healthcheck()
+ take_damage(1)
..()
+
+/obj/structure/grille/hitby(atom/movable/AM)
+ ..()
+ var/tforce = 0
+ if(ismob(AM))
+ tforce = 5
+ else if(isobj(AM))
+ if(prob(50))
+ var/obj/O = AM
+ tforce = max(0, O.throwforce * 0.5)
+ else if(anchored && !broken)
+ var/turf/T = get_turf(src)
+ var/obj/structure/cable/C = T.get_cable_node()
+ if(C)
+ playsound(loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
+ tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
+ C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock.
+ take_damage(tforce)
+
+/obj/structure/grille/broken // Pre-broken grilles for map placement
+ icon_state = "brokengrille"
+ density = 0
+ health = 0
+ broken = 1
+ rods_amount = 1
+ rods_broken = 0
+ grille_type = /obj/structure/grille
+ broken_type = null
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index aee81bdf7f8..14f1357af87 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -3,11 +3,11 @@
desc = "A folded membrane which rapidly expands into a large cubical shape on activation."
icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_wall"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/inflatable/attack_self(mob/user)
playsound(loc, 'sound/items/zip.ogg', 75, 1)
- to_chat(user, "\blue You inflate [src].")
+ to_chat(user, "You inflate [src]. ")
var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc)
src.transfer_fingerprints_to(R)
R.add_fingerprint(user)
@@ -33,7 +33,7 @@
air_update_turf(1)
return ..()
-/obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0)
return 0
/obj/structure/inflatable/CanAtmosPass(turf/T)
@@ -150,7 +150,7 @@
/obj/item/inflatable/door/attack_self(mob/user)
playsound(loc, 'sound/items/zip.ogg', 75, 1)
- to_chat(user, "\blue You inflate [src].")
+ to_chat(user, "You inflate [src]. ")
var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc)
src.transfer_fingerprints_to(R)
R.add_fingerprint(user)
@@ -178,9 +178,7 @@
/obj/structure/inflatable/door/attack_hand(mob/user as mob)
return TryToSwitchState(user)
-/obj/structure/inflatable/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group)
- return state
+/obj/structure/inflatable/door/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover, /obj/effect/beam))
return !opacity
return !density
@@ -281,7 +279,7 @@
icon_state = "inf_box"
item_state = "syringe_kit"
max_combined_w_class = 21
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/briefcase/inflatable/New()
..()
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index c5abbad1c96..f4ee54ad893 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -19,12 +19,16 @@
/obj/structure/janitorialcart/New()
+ ..()
create_reagents(100)
janitorial_equipment += src
-
/obj/structure/janitorialcart/Destroy()
janitorial_equipment -= src
+ QDEL_NULL(mybag)
+ QDEL_NULL(mymop)
+ QDEL_NULL(myspray)
+ QDEL_NULL(myreplacer)
return ..()
/obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user)
@@ -85,20 +89,20 @@
to_chat(user, "[src] can't hold any more signs. ")
else if(istype(I, /obj/item/weapon/crowbar))
user.visible_message("[user] begins to empty the contents of [src]. ")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * I.toolspeed, target = src))
to_chat(usr, "You empty the contents of [src]'s bucket onto the floor. ")
reagents.reaction(src.loc)
src.reagents.clear_reagents()
else if(istype(I, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. ", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters. ", \
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index d14b4bbda21..043177551ff 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -43,8 +43,8 @@
/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
if(istype(G, /obj/item/weapon/crowbar))
if(!buckled_mob)
- playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, G.usesound, 100, 1)
+ if(do_after(user, 20 * G.toolspeed, target = src))
to_chat(user, "You pry the spikes out of the frame. ")
new /obj/item/stack/rods(loc, 4)
new /obj/structure/kitchenspike_frame(loc)
@@ -79,7 +79,7 @@
if(victim.buckled)
return 0
var/mob/living/H = victim
- playsound(loc, "sound/effects/splat.ogg", 25, 1)
+ playsound(loc, 'sound/effects/splat.ogg', 25, 1)
H.forceMove(loc)
H.emote("scream")
if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index 133a3d15b39..53805b45886 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -76,7 +76,7 @@
return attack_hand(user)
/obj/structure/ladder/dive_point/buoy
- name = "diving point bouy"
+ name = "diving point buoy"
desc = "A buoy marking the location of an underwater dive area."
icon = 'icons/misc/beach.dmi'
icon_state = "buoy"
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index d661fb60b9e..56a60bc651d 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -69,10 +69,10 @@
if(src.destroyed)
return
else
- to_chat(usr, text("\blue You kick the lab cage."))
+ to_chat(usr, text("You kick the lab cage. "))
for(var/mob/O in oviewers())
if((O.client && !( O.blinded )))
- to_chat(O, text("\red [] kicks the lab cage.", usr))
+ to_chat(O, text("[] kicks the lab cage. ", usr))
src.health -= 2
healthcheck()
return
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index bfb607585b0..003daa76645 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -50,7 +50,6 @@
return
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob, params)
-
if(istype(C, /obj/item/stack/tile/plasteel) || istype(C, /obj/item/stack/rods))
var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
@@ -58,11 +57,10 @@
if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
- to_chat(user, "\blue Slicing lattice joints ...")
- new /obj/item/stack/rods(src.loc)
- qdel(src)
+ to_chat(user, "Slicing lattice joints... ")
+ new /obj/item/stack/rods(src.loc)
+ qdel(src)
- return
/obj/structure/lattice/proc/updateOverlays()
//if(!(istype(src.loc, /turf/space)))
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index b9af7b2d032..43d08cccee9 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -1,8 +1,6 @@
-//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its
-//machineryness
-
+//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its machineryness
/obj/structure/mineral_door
- name = "mineral door"
+ name = "metal door"
density = 1
anchored = 1
opacity = 1
@@ -10,16 +8,21 @@
icon = 'icons/obj/doors/mineral_doors.dmi'
icon_state = "metal"
- var/mineralType = "metal"
+ var/initial_state
var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0
+ var/close_delay = -1 //-1 if does not auto close.
+
var/hardness = 1
- var/oreAmount = 7
+ var/sheetType = /obj/item/stack/sheet/metal
+ var/sheetAmount = 7
+ var/openSound = 'sound/effects/stonedoor_openclose.ogg'
+ var/closeSound = 'sound/effects/stonedoor_openclose.ogg'
+ var/damageSound = null
/obj/structure/mineral_door/New(location)
..()
- icon_state = mineralType
- name = "[mineralType] door"
+ initial_state = icon_state
/obj/structure/mineral_door/initialize()
..()
@@ -39,32 +42,38 @@
..()
if(!state)
return TryToSwitchState(user)
- return
-/obj/structure/mineral_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
+/obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral
if(isAI(user)) //so the AI can't open it
return
- else if(isrobot(user)) //but cyborgs can
- if(get_dist(user,src) <= 1) //not remotely though
- return TryToSwitchState(user)
+ else if(isrobot(user) && Adjacent(user)) //but cyborgs can, but not remotely
+ return TryToSwitchState(user)
-/obj/structure/mineral_door/attack_hand(mob/user as mob)
+/obj/structure/mineral_door/attack_hand(mob/user)
return TryToSwitchState(user)
-/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
+/obj/structure/mineral_door/attack_animal(mob/user)
+ return TryToSwitchState(user)
+
+/obj/structure/mineral_door/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ SwitchState()
+
+/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target, height = 0)
if(istype(mover, /obj/effect/beam))
return !opacity
return !density
-/obj/structure/mineral_door/CanAtmosPass()
+/obj/structure/mineral_door/CanAtmosPass(turf/T)
return !density
/obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
- if(isSwitchingStates) return
- if(ismob(user))
- var/mob/M = user
- if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
+ if(isSwitchingStates)
+ return
+ if(isliving(user))
+ var/mob/living/M = user
+ if(world.time - user.last_bumped <= 60)
+ return //NOTE do we really need that?
if(M.client)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -83,211 +92,175 @@
/obj/structure/mineral_door/proc/Open()
isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]opening",src)
+ playsound(loc, openSound, 100, 1)
+ flick("[initial_state]opening",src)
sleep(10)
density = 0
opacity = 0
state = 1
+ air_update_turf(1)
update_icon()
isSwitchingStates = 0
- air_update_turf(1)
+
+ if(close_delay != -1)
+ spawn(close_delay)
+ Close()
/obj/structure/mineral_door/proc/Close()
+ if(isSwitchingStates || state != 1)
+ return
+ var/turf/T = get_turf(src)
+ for(var/mob/living/L in T)
+ return
isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]closing",src)
+ playsound(loc, closeSound, 100, 1)
+ flick("[initial_state]closing",src)
sleep(10)
density = 1
opacity = 1
state = 0
+ air_update_turf(1)
update_icon()
isSwitchingStates = 0
- air_update_turf(1)
/obj/structure/mineral_door/update_icon()
if(state)
- icon_state = "[mineralType]open"
+ icon_state = "[initial_state]open"
else
- icon_state = mineralType
+ icon_state = initial_state
-/obj/structure/mineral_door/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/pickaxe))
+/obj/structure/mineral_door/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/digTool = W
- to_chat(user, "You start digging the [name].")
- if(do_after(user,digTool.digspeed*hardness, target = src) && src)
- to_chat(user, "You finished digging.")
- Dismantle()
- else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
- hardness -= W.force/100
- to_chat(user, "You hit the [name] with your [W.name]!")
- CheckHardness()
- else
+ to_chat(user, "You start digging \the [src]. ")
+ if(do_after(user, digTool.digspeed * hardness, target = src) && src)
+ to_chat(user, "You finished digging. ")
+ deconstruct(TRUE)
+ else if(user.a_intent != I_HARM)
attack_hand(user)
- return
+ else
+ attacked_by(W, user)
+
+/obj/structure/mineral_door/proc/attacked_by(obj/item/I, mob/user)
+ if(I.damtype != STAMINA)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+ visible_message("[user] hits \the [src] with \the [I]. ")
+ if(damageSound)
+ playsound(loc, damageSound, 100, 1)
+ else
+ playsound(loc, I.hitsound, 100, 1)
+ hardness -= I.force / 100
+ CheckHardness()
/obj/structure/mineral_door/proc/CheckHardness()
if(hardness <= 0)
- Dismantle(1)
+ deconstruct(FALSE)
-/obj/structure/mineral_door/proc/Dismantle(devastated = 0)
- if(!devastated)
- if(mineralType == "metal")
- var/ore = /obj/item/stack/sheet/metal
- for(var/i = 1, i <= oreAmount, i++)
- new ore(get_turf(src))
+/obj/structure/mineral_door/proc/deconstruct(disassembled = TRUE)
+ var/turf/T = get_turf(src)
+ if(sheetType)
+ if(disassembled)
+ new sheetType(T, sheetAmount)
else
- var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- for(var/i = 1, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- if(mineralType == "metal")
- var/ore = /obj/item/stack/sheet/metal
- for(var/i = 3, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- for(var/i = 3, i <= oreAmount, i++)
- new ore(get_turf(src))
+ new sheetType(T, max(sheetAmount - 2, 1))
qdel(src)
/obj/structure/mineral_door/ex_act(severity = 1)
switch(severity)
if(1)
- Dismantle(1)
+ deconstruct(FALSE)
if(2)
if(prob(20))
- Dismantle(1)
+ deconstruct(FALSE)
else
hardness--
CheckHardness()
if(3)
hardness -= 0.1
CheckHardness()
- return
/obj/structure/mineral_door/iron
- mineralType = "metal"
hardness = 3
/obj/structure/mineral_door/silver
- mineralType = "silver"
+ name = "silver door"
+ icon_state = "silver"
+ sheetType = /obj/item/stack/sheet/mineral/silver
hardness = 3
/obj/structure/mineral_door/gold
- mineralType = "gold"
+ name = "gold door"
+ icon_state = "gold"
+ sheetType = /obj/item/stack/sheet/mineral/gold
/obj/structure/mineral_door/uranium
- mineralType = "uranium"
+ name = "uranium door"
+ icon_state = "uranium"
+ sheetType = /obj/item/stack/sheet/mineral/uranium
hardness = 3
light_range = 2
/obj/structure/mineral_door/sandstone
- mineralType = "sandstone"
+ name = "sandstone door"
+ icon_state = "sandstone"
+ sheetType = /obj/item/stack/sheet/mineral/sandstone
hardness = 0.5
/obj/structure/mineral_door/transparent
opacity = 0
- Close()
- ..()
- opacity = 0
+/obj/structure/mineral_door/transparent/Close()
+ ..()
+ set_opacity(0)
/obj/structure/mineral_door/transparent/plasma
- mineralType = "plasma"
+ name = "plasma door"
+ icon_state = "plasma"
+ sheetType = /obj/item/stack/sheet/mineral/plasma
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(is_hot(W))
- message_admins("Plasma mineral door ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP )",0,1)
- log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])")
- TemperatureAct(100)
- ..()
+/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user)
+ if(is_hot(W))
+ message_admins("Plasma mineral door ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP )", 0, 1)
+ log_game("Plasma mineral door ignited by [key_name(user)] in ([x], [y], [z])")
+ TemperatureAct(100)
+ else
+ return ..()
- temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- TemperatureAct(exposed_temperature)
+/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ TemperatureAct(exposed_temperature)
- proc/TemperatureAct(temperature)
- atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500)
- hardness = 0
- CheckHardness()
+/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct(temperature)
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500)
+ deconstruct(FALSE)
/obj/structure/mineral_door/transparent/diamond
- mineralType = "diamond"
+ name = "diamond door"
+ icon_state = "diamond"
+ sheetType = /obj/item/stack/sheet/mineral/diamond
hardness = 10
/obj/structure/mineral_door/wood
- mineralType = "wood"
+ name = "wood door"
+ icon_state = "wood"
+ openSound = 'sound/effects/doorcreaky.ogg'
+ closeSound = 'sound/effects/doorcreaky.ogg'
+ sheetType = /obj/item/stack/sheet/wood
hardness = 1
burn_state = FLAMMABLE
burntime = 30
- Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/doorcreaky.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/doorcreaky.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
-
- Dismantle(devastated = 0)
- if(!devastated)
- for(var/i = 1, i <= oreAmount, i++)
- new/obj/item/stack/sheet/wood(get_turf(src))
- qdel(src)
-
/obj/structure/mineral_door/resin
- mineralType = "resin"
+ name = "resin door"
+ icon_state = "resin"
hardness = 1.5
- var/close_delay = 100
+ close_delay = 100
+ openSound = 'sound/effects/attackblob.ogg'
+ closeSound = 'sound/effects/attackblob.ogg'
+ damageSound = 'sound/effects/attackblob.ogg'
+ sheetType = null
- TryToSwitchState(atom/user)
- if(isalien(user))
- return ..()
-
- Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- spawn(close_delay)
- if(!isSwitchingStates && state == 1)
- Close()
-
- Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
-
- Dismantle(devastated = 0)
- qdel(src)
-
- CheckHardness()
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- ..()
+/obj/structure/mineral_door/resin/TryToSwitchState(atom/user)
+ if(isalien(user))
+ return ..()
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
index 3e9fba93105..910981974d0 100644
--- a/code/game/objects/structures/misc.dm
+++ b/code/game/objects/structures/misc.dm
@@ -57,3 +57,67 @@
return
else
to_chat(user, "FĆAL �Rr�R : ŧer nt recgnized, c-cntr-r䣧-ç äcked.")
+
+/obj/structure/respawner
+ name = "\improper Long-Distance Cloning Machine"
+ desc = "Top-of-the-line Nanotrasen technology allows for cloning of crew members from off-station upon bluespace request."
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "borgcharger1(old)"
+ anchored = 1
+ density = 1
+
+/obj/structure/respawner/attack_ghost(mob/dead/observer/user as mob)
+ var/response = alert(user, "Are you sure you want to spawn like this?\n(If you do this, you won't be able to be cloned!)","Respawn?","Yes","No")
+ if(response == "Yes")
+ user.forceMove(get_turf(src))
+ log_admin("[key_name(user)] was incarnated by a respawner machine.")
+ message_admins("[key_name_admin(user)] was incarnated by a respawner machine.")
+ user.incarnate_ghost()
+
+/obj/structure/ghost_beacon
+ name = "ethereal beacon"
+ desc = "A structure that draws ethereal attention when active. Use an empty hand to activate."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "anomaly_crystal"
+ anchored = 1
+ density = 1
+ var/active = FALSE
+ var/ghost_alert_delay = 30 SECONDS
+ var/last_ghost_alert
+ var/alert_title = "Ethereal Beacon Active!"
+ var/atom/attack_atom
+
+
+/obj/structure/ghost_beacon/initialize()
+ . = ..()
+ last_ghost_alert = world.time
+ attack_atom = src
+ if(active)
+ processing_objects.Add(src)
+
+/obj/structure/ghost_beacon/Destroy()
+ if(active)
+ processing_objects.Remove(src)
+ attack_atom = null
+ return ..()
+
+/obj/structure/ghost_beacon/attack_ghost(mob/dead/observer/user)
+ if(user.can_advanced_admin_interact())
+ attack_hand(user)
+ else if(attack_atom != src)
+ attack_atom.attack_ghost(user)
+
+/obj/structure/ghost_beacon/attack_hand(mob/user)
+ if(!is_admin(user))
+ return
+ to_chat(user, "You [active ? "disable" : "enable"] \the [src]. ")
+ if(active)
+ processing_objects.Remove(src)
+ else
+ processing_objects.Add(src)
+ active = !active
+
+/obj/structure/ghost_beacon/process()
+ if(last_ghost_alert + ghost_alert_delay < world.time)
+ notify_ghosts("[src] active in [get_area(src)].", 'sound/effects/ghost2.ogg', title = alert_title, source = attack_atom, action = (attack_atom == src ? NOTIFY_JUMP : NOTIFY_ATTACK))
+ last_ghost_alert = world.time
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index 49175dfa9e3..3a1ee8490db 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -8,6 +8,7 @@
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
/obj/structure/mopbucket/New()
+ ..()
create_reagents(100)
janitorial_equipment += src
@@ -27,10 +28,10 @@
if(istype(W, /obj/item/weapon/mop))
if(src.reagents.total_volume >= 2)
src.reagents.trans_to(W, 2)
- to_chat(user, "\blue You wet the mop")
+ to_chat(user, "You wet the mop ")
playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
if(src.reagents.total_volume < 1)
- to_chat(user, "\blue Out of water!")
+ to_chat(user, "Out of water! ")
return
/obj/structure/mopbucket/ex_act(severity)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 2a22ffd563c..596673ba0c7 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -27,6 +27,7 @@
"The tray contains a body that might be responsive."
)
anchored = 1.0
+ var/open_sound = 'sound/items/Deconstruct.ogg'
/obj/structure/morgue/initialize()
. = ..()
@@ -100,11 +101,11 @@
for(var/atom/movable/A as mob|obj in connected.loc)
if(!( A.anchored ))
A.forceMove(src)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
qdel(connected)
connected = null
else
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
connected = new /obj/structure/m_tray( loc )
step(connected, dir)
connected.layer = OBJ_LAYER
@@ -159,9 +160,7 @@
return
/obj/structure/morgue/Destroy()
- if(connected)
- qdel(connected)
- connected = null
+ QDEL_NULL(connected)
return ..()
/obj/structure/morgue/container_resist(var/mob/living/L)
@@ -184,14 +183,14 @@
*/
/obj/structure/m_tray
name = "morgue tray"
- desc = "Apply corpse before closing."
+ desc = "Apply corpse before closing. May float away in no-gravity."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "morguet"
density = 1
layer = 2.0
var/obj/structure/morgue/connected = null
anchored = 1.0
- throwpass = 1
+ pass_flags = LETPASSTHROW
/obj/structure/m_tray/attack_hand(mob/user as mob)
@@ -217,7 +216,7 @@
if(user != O)
for(var/mob/B in viewers(user, 3))
if((B.client && !( B.blinded )))
- to_chat(B, text("\red [] stuffs [] into []!", user, O, src))
+ to_chat(B, text("[] stuffs [] into []! ", user, O, src))
return
/obj/structure/m_tray/Destroy()
@@ -258,6 +257,7 @@
var/cremating = 0
var/id = 1
var/locked = 0
+ var/open_sound = 'sound/items/Deconstruct.ogg'
/obj/structure/crematorium/proc/update()
if(connected)
@@ -299,17 +299,17 @@
/obj/structure/crematorium/attack_hand(mob/user as mob)
if(cremating)
- to_chat(usr, "\red It's locked.")
+ to_chat(usr, "It's locked. ")
return
if((connected) && (locked == 0))
for(var/atom/movable/A as mob|obj in connected.loc)
if(!( A.anchored ))
A.forceMove(src)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
qdel(connected)
connected = null
else if(locked == 0)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
connected = new /obj/structure/c_tray( loc )
step(connected, SOUTH)
connected.layer = OBJ_LAYER
@@ -382,8 +382,8 @@
if(M.stat!=2)
M.emote("scream")
if(istype(user))
- M.attack_log += "\[[time_stamp()]\] Has been cremated by [user.name] ([user.ckey]) "
- user.attack_log +="\[[time_stamp()]\] Cremated [M.name] ([M.ckey]) "
+ M.create_attack_log("Has been cremated by [user.name] ([user.ckey]) ")
+ user.create_attack_log("Cremated [M.name] ([M.ckey]) ")
log_attack("[user.name] ([user.ckey]) cremated [M.name] ([M.ckey])")
M.death(1)
if(!M || !isnull(M.gcDestroyed))
@@ -403,9 +403,7 @@
return
/obj/structure/crematorium/Destroy()
- if(connected)
- qdel(connected)
- connected = null
+ QDEL_NULL(connected)
return ..()
/obj/structure/crematorium/container_resist(var/mob/living/L)
@@ -434,7 +432,7 @@
layer = 2.0
var/obj/structure/crematorium/connected = null
anchored = 1.0
- throwpass = 1
+ pass_flags = LETPASSTHROW
/obj/structure/c_tray/attack_hand(mob/user as mob)
if(connected)
@@ -460,7 +458,7 @@
if(user != O)
for(var/mob/B in viewers(user, 3))
if((B.client && !( B.blinded )))
- to_chat(B, text("\red [] stuffs [] into []!", user, O, src))
+ to_chat(B, text("[] stuffs [] into []! ", user, O, src))
//Foreach goto(99)
return
@@ -470,15 +468,31 @@
connected = null
return ..()
-/obj/machinery/crema_switch/attack_hand(mob/user as mob)
- if(allowed(usr))
+// Crematorium switch
+/obj/machinery/crema_switch
+ desc = "Burn baby burn!"
+ name = "crematorium igniter"
+ icon = 'icons/obj/power.dmi'
+ icon_state = "crema_switch"
+ anchored = 1.0
+ req_access = list(access_crematorium)
+ var/on = 0
+ var/area/area = null
+ var/otherarea = null
+ var/id = 1
+
+/obj/machinery/crema_switch/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ return attack_hand(user)
+
+/obj/machinery/crema_switch/attack_hand(mob/user)
+ if(allowed(usr) || user.can_advanced_admin_interact())
for(var/obj/structure/crematorium/C in world)
if(C.id == id)
if(!C.cremating)
C.cremate(user)
else
- to_chat(usr, "\red Access denied.")
- return
+ to_chat(usr, "Access denied. ")
/mob/proc/update_morgue()
if(stat == DEAD)
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index f1d9b6ac578..db917ca5588 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -138,10 +138,10 @@
return data
/datum/song/Topic(href, href_list)
- if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained())
+ if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || usr.incapacitated())
usr << browse(null, "window=instrument")
usr.unset_machine()
- return
+ return 1
instrumentObj.add_fingerprint(usr)
@@ -168,6 +168,8 @@
//split into lines
spawn()
lines = splittext(t, "\n")
+ if(lines.len == 0)
+ return 1
if(copytext(lines[1],1,6) == "BPM: ")
tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6)))
lines.Cut(1,2)
@@ -279,8 +281,7 @@
icon_state = "piano"
/obj/structure/piano/Destroy()
- qdel(song)
- song = null
+ QDEL_NULL(song)
return ..()
/obj/structure/piano/initialize()
@@ -291,7 +292,7 @@
ui_interact(user)
/obj/structure/piano/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(!user || !anchored)
+ if(!isliving(user) || user.incapacitated() || !anchored)
return
song.ui_interact(user, ui_key, ui, force_open)
@@ -305,18 +306,18 @@
/obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
to_chat(user, " You begin to tighten \the [src] to the floor... ")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. Now it can be played again. ", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
to_chat(user, " You begin to loosen \the [src]'s casters... ")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * O.toolspeed, target = src))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]. Now it can be pulled somewhere else. ", \
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index bfb5d584965..3f4eea3dbf4 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -40,7 +40,7 @@
name = "sign"
desc = ""
icon = 'icons/obj/decals.dmi'
- w_class = 3 //big
+ w_class = WEIGHT_CLASS_NORMAL
burn_state = FLAMMABLE
var/sign_state = ""
@@ -225,4 +225,3 @@
name = "\improper Escape Arm"
desc = "A direction sign, pointing out which way escape shuttle dock is."
icon_state = "direction_evac"
-
diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm
index 25fe7f4a134..253f93dc7ae 100644
--- a/code/game/objects/structures/spirit_board.dm
+++ b/code/game/objects/structures/spirit_board.dm
@@ -55,11 +55,10 @@
//lighting check
var/light_amount = 0
var/turf/T = get_turf(src)
- var/atom/movable/lighting_overlay/LO = locate(/atom/movable/lighting_overlay) in T
- if(LO)
- light_amount = LO.get_clamped_lum(0.5)*10
+ if(T)
+ light_amount = T.get_lumcount(0.5) * 10
else
- light_amount = 10
+ light_amount = 10
if(light_amount > 2)
to_chat(M, "It's too bright here to use [src.name]! ")
diff --git a/code/game/objects/structures/statue.dm b/code/game/objects/structures/statue.dm
deleted file mode 100644
index 094ca2d5774..00000000000
--- a/code/game/objects/structures/statue.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/obj/structure/snowman
- name = "snowman"
- desc = "Seems someone made a snowman here."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "snowman"
- anchored = 1
- density = 1
-
-/obj/structure/kidanstatue
- name = "Obsidian Kidan warrior statue"
- desc = "A beautifully carved and menacing statue of a Kidan warrior made out of obsidian. It looks very heavy."
- icon = 'icons/obj/decorations.dmi'
- icon_state = "kidanstatue"
- anchored = 1
- density = 1
-
-/obj/structure/chickenstatue
- name = "Bronze Chickenman Statue"
- desc = "An antique and oriental-looking statue of a Chickenman made of bronze."
- icon = 'icons/obj/decorations.dmi'
- icon_state = "chickenstatue"
- anchored = 1
- density = 1
-
-
-/obj/structure/clownstatue
- name = "Bananium Clown Statue"
- desc = "A golden statue made of bananium, commemorating the coronation of King Squiggles the Eighth."
- icon = 'icons/obj/decorations.dmi'
- icon_state = "clownstatue"
- anchored = 1
- density = 1
\ No newline at end of file
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
new file mode 100644
index 00000000000..6e1ba7eb742
--- /dev/null
+++ b/code/game/objects/structures/statues.dm
@@ -0,0 +1,372 @@
+/obj/structure/statue
+ name = "statue"
+ desc = "Placeholder. Yell at Firecage if you SOMEHOW see this."
+ icon = 'icons/obj/statue.dmi'
+ icon_state = ""
+ density = 1
+ anchored = 0
+ var/hardness = 1
+ var/oreAmount = 5
+ var/material_drop_type = /obj/item/stack/sheet/metal
+
+/obj/structure/statue/attackby(obj/item/weapon/W, mob/living/user, params)
+ add_fingerprint(user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ if(iswrench(W))
+ if(anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] is loosening the [name]'s bolts.", \
+ "You are loosening the [name]'s bolts... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!loc || !anchored)
+ return
+ user.visible_message("[user] loosened the [name]'s bolts!", \
+ "You loosen the [name]'s bolts! ")
+ anchored = 0
+ else
+ if(!isfloorturf(loc))
+ user.visible_message("A floor must be present to secure the [name]! ")
+ return
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] is securing the [name]'s bolts...", \
+ "You are securing the [name]'s bolts... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!loc || anchored)
+ return
+ user.visible_message("[user] has secured the [name]'s bolts.", \
+ "You have secured the [name]'s bolts. ")
+ anchored = 1
+
+ else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
+ playsound(src, W.usesound, 100, 1)
+ user.visible_message("[user] is slicing apart the [name]...", \
+ "You are slicing apart the [name]... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!loc)
+ return
+ user.visible_message("[user] slices apart the [name].", \
+ "You slice apart the [name]. ")
+ Dismantle(TRUE)
+
+ else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
+ var/obj/item/weapon/pickaxe/drill/jackhammer/D = W
+ if(!loc)
+ return
+ user.visible_message("[user] destroys the [name]!", \
+ "You destroy the [name]. ")
+ D.playDigSound()
+ qdel(src)
+
+ else if(iswelder(W) && !anchored)
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0, user))
+ playsound(loc, W.usesound, 40, 1)
+ user.visible_message("[user] is slicing apart the [name].", \
+ "You are slicing apart the [name]... ")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ if(!loc)
+ return
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] slices apart the [name].", \
+ "You slice apart the [name]! ")
+ Dismantle(TRUE)
+ else
+ hardness -= W.force/100
+ ..()
+ CheckHardness()
+ return ..()
+
+/obj/structure/statue/attack_hand(mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ add_fingerprint(user)
+ user.visible_message("[user] rubs some dust off from the [name]'s surface.", \
+ "You rub some dust off from the [name]'s surface. ")
+
+/obj/structure/statue/CanAtmosPass()
+ return !density
+
+/obj/structure/statue/bullet_act(obj/item/projectile/Proj)
+ hardness -= Proj.damage
+ ..()
+ CheckHardness()
+
+/obj/structure/statue/proc/CheckHardness()
+ if(hardness <= 0)
+ Dismantle(TRUE)
+
+/obj/structure/statue/proc/Dismantle(disassembled = TRUE)
+ if(material_drop_type)
+ var/drop_amt = oreAmount
+ if(!disassembled)
+ drop_amt -= 2
+ if(drop_amt > 0)
+ new material_drop_type(get_turf(src), drop_amt)
+ qdel(src)
+
+/obj/structure/statue/ex_act(severity = 1)
+ switch(severity)
+ if(1)
+ Dismantle(TRUE)
+ if(2)
+ if(prob(20))
+ Dismantle(TRUE)
+ else
+ hardness--
+ CheckHardness()
+ if(3)
+ hardness -= 0.1
+ CheckHardness()
+
+/obj/structure/statue/uranium
+ hardness = 3
+ light_range = 2
+ material_drop_type = /obj/item/stack/sheet/mineral/uranium
+ var/last_event = 0
+ var/active = null
+
+/obj/structure/statue/uranium/nuke
+ name = "statue of a nuclear fission explosive"
+ desc = "This is a grand statue of a Nuclear Explosive. It has a sickening green colour."
+ icon_state = "nuke"
+
+/obj/structure/statue/uranium/eng
+ name = "statue of an engineer"
+ desc = "This statue has a sickening green colour."
+ icon_state = "eng"
+
+/obj/structure/statue/uranium/attackby(obj/item/weapon/W, mob/user, params)
+ radiate()
+ ..()
+
+/obj/structure/statue/uranium/Bumped(atom/user)
+ radiate()
+ ..()
+
+/obj/structure/statue/uranium/attack_hand(mob/user)
+ radiate()
+ ..()
+
+/obj/structure/statue/uranium/proc/radiate()
+ if(!active)
+ if(world.time > last_event+15)
+ active = 1
+ for(var/mob/living/L in range(3,src))
+ L.apply_effect(12,IRRADIATE,0)
+ last_event = world.time
+ active = null
+
+/obj/structure/statue/plasma
+ hardness = 2
+ material_drop_type = /obj/item/stack/sheet/mineral/plasma
+ desc = "This statue is suitably made from plasma."
+
+/obj/structure/statue/plasma/scientist
+ name = "statue of a scientist"
+ icon_state = "sci"
+
+/obj/structure/statue/plasma/xeno
+ name = "statue of a xenomorph"
+ icon_state = "xeno"
+
+/obj/structure/statue/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ PlasmaBurn(exposed_temperature)
+
+/obj/structure/statue/plasma/bullet_act(obj/item/projectile/Proj)
+ var/burn = FALSE
+ if(istype(Proj,/obj/item/projectile/beam))
+ PlasmaBurn(2500)
+ burn = TRUE
+ else if(istype(Proj,/obj/item/projectile/ion))
+ PlasmaBurn(500)
+ burn = TRUE
+ if(burn)
+ if(Proj.firer)
+ message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])")
+ else
+ message_admins("Plasma statue ignited by [Proj]. No known firer.(? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.")
+ ..()
+
+/obj/structure/statue/plasma/attackby(obj/item/weapon/W, mob/user, params)
+ if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
+ message_admins("Plasma statue ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])")
+ ignite(is_hot(W))
+ return
+ ..()
+
+/obj/structure/statue/plasma/proc/PlasmaBurn()
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 160)
+ Dismantle(FALSE)
+
+/obj/structure/statue/plasma/proc/ignite(exposed_temperature)
+ if(exposed_temperature > 300)
+ PlasmaBurn()
+
+/obj/structure/statue/gold
+ hardness = 3
+ material_drop_type = /obj/item/stack/sheet/mineral/gold
+ desc = "This is a highly valuable statue made from gold."
+
+/obj/structure/statue/gold/hos
+ name = "statue of the head of security"
+ icon_state = "hos"
+
+/obj/structure/statue/gold/hop
+ name = "statue of the head of personnel"
+ icon_state = "hop"
+
+/obj/structure/statue/gold/cmo
+ name = "statue of the chief medical officer"
+ icon_state = "cmo"
+
+/obj/structure/statue/gold/ce
+ name = "statue of the chief engineer"
+ icon_state = "ce"
+
+/obj/structure/statue/gold/rd
+ name = "statue of the research director"
+ icon_state = "rd"
+
+/obj/structure/statue/silver
+ hardness = 3
+ material_drop_type = /obj/item/stack/sheet/mineral/silver
+ desc = "This is a valuable statue made from silver."
+
+/obj/structure/statue/silver/md
+ name = "statue of a medical doctor"
+ icon_state = "md"
+
+/obj/structure/statue/silver/janitor
+ name = "statue of a janitor"
+ icon_state = "jani"
+
+/obj/structure/statue/silver/sec
+ name = "statue of a security officer"
+ icon_state = "sec"
+
+/obj/structure/statue/silver/secborg
+ name = "statue of a security cyborg"
+ icon_state = "secborg"
+
+/obj/structure/statue/silver/medborg
+ name = "statue of a medical cyborg"
+ icon_state = "medborg"
+
+/obj/structure/statue/diamond
+ hardness = 10
+ material_drop_type = /obj/item/stack/sheet/mineral/diamond
+ desc = "This is a very expensive diamond statue"
+
+/obj/structure/statue/diamond/captain
+ name = "statue of THE captain."
+ icon_state = "cap"
+
+/obj/structure/statue/diamond/ai1
+ name = "statue of the AI hologram."
+ icon_state = "ai1"
+
+/obj/structure/statue/diamond/ai2
+ name = "statue of the AI core."
+ icon_state = "ai2"
+
+/obj/structure/statue/bananium
+ hardness = 3
+ material_drop_type = /obj/item/stack/sheet/mineral/bananium
+ desc = "A bananium statue with a small engraving:'HOOOOOOONK'."
+ var/spam_flag = 0
+
+/obj/structure/statue/bananium/clown
+ name = "statue of a clown"
+ icon_state = "clown"
+
+/obj/structure/statue/bananium/Bumped(atom/user)
+ honk()
+ ..()
+
+/obj/structure/statue/bananium/attackby(obj/item/weapon/W, mob/user, params)
+ honk()
+ ..()
+
+/obj/structure/statue/bananium/attack_hand(mob/user)
+ honk()
+ ..()
+
+/obj/structure/statue/bananium/proc/honk()
+ if(!spam_flag)
+ spam_flag = 1
+ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
+ spawn(20)
+ spam_flag = 0
+
+/obj/structure/statue/sandstone
+ hardness = 0.5
+ material_drop_type = /obj/item/stack/sheet/mineral/sandstone
+
+/obj/structure/statue/sandstone/assistant
+ name = "statue of an assistant"
+ desc = "A cheap statue of sandstone for a greyshirt."
+ icon_state = "assist"
+
+/obj/structure/statue/sandstone/venus //call me when we add marble i guess
+ name = "statue of a pure maiden"
+ desc = "An ancient marble statue. The subject is depicted with a floor-length braid and is wielding a toolbox. By Jove, it's easily the most gorgeous depiction of a woman you've ever seen. The artist must truly be a master of his craft. Shame about the broken arm, though."
+ icon = 'icons/obj/statuelarge.dmi'
+ icon_state = "venus"
+
+/*
+/obj/structure/statue/snow
+ hardness = 0.5
+ material_drop_type = /obj/item/stack/sheet/mineral/snow
+
+/obj/structure/statue/snow/snowman
+ name = "snowman"
+ desc = "Several lumps of snow put together to form a snowman."
+ icon_state = "snowman"
+*/
+
+/obj/structure/statue/tranquillite
+ hardness = 0.5
+ material_drop_type = /obj/item/stack/sheet/mineral/tranquillite
+ desc = "..."
+
+/obj/structure/statue/tranquillite/mime
+ name = "statue of a mime"
+ icon_state = "mime"
+
+/obj/structure/statue/tranquillite/mime/AltClick(mob/user)//has 4 dirs
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now! ")
+ return
+ if(!Adjacent(user))
+ return
+ if(anchored)
+ to_chat(user, "It is fastened to the floor!")
+ return
+ setDir(turn(dir, 90))
+////////////////////////////////
+/obj/structure/snowman
+ name = "snowman"
+ desc = "Seems someone made a snowman here."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "snowman"
+ anchored = 1
+ density = 1
+
+/obj/structure/kidanstatue
+ name = "Obsidian Kidan warrior statue"
+ desc = "A beautifully carved and menacing statue of a Kidan warrior made out of obsidian. It looks very heavy."
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = "kidanstatue"
+ anchored = 1
+ density = 1
+
+/obj/structure/chickenstatue
+ name = "Bronze Chickenman Statue"
+ desc = "An antique and oriental-looking statue of a Chickenman made of bronze."
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = "chickenstatue"
+ anchored = 1
+ density = 1
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index c5a3b2f15ba..56c6861e4fc 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -15,6 +15,7 @@
buckle_lying = 1
burn_state = FLAMMABLE
burntime = 30
+ buildstackamount = 2
var/movable = 0 // For mobility checks
/obj/structure/stool/bed/MouseDrop(atom/over_object)
@@ -24,23 +25,38 @@
name = "psych bed"
desc = "For prime comfort during psychiatric evaluations."
icon_state = "psychbed"
+ buildstackamount = 5
can_buckle = 1
buckle_lying = 1
+/obj/structure/stool/bed/dogbed
+ name = "dog bed"
+ icon_state = "dogbed"
+ desc = "A comfy-looking dog bed. You can even strap your pet in, in case the gravity turns off."
+ anchored = 0
+ buildstackamount = 10
+ buildstacktype = /obj/item/stack/sheet/wood
+
+/obj/structure/stool/bed/dogbed/ian
+ name = "Ian's bed"
+ desc = "Ian's bed! Looks comfy."
+ anchored = 1
+
/obj/structure/stool/bed/alien
name = "resting contraption"
- desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
+ desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?"
icon_state = "abed"
/obj/structure/stool/bed/proc/handle_rotation()
return
-/obj/structure/stool/bed/attack_animal(var/mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever
- if(M.environment_smash)
- new /obj/item/stack/sheet/metal(src.loc)
+/obj/structure/stool/bed/attack_animal(mob/living/simple_animal/user)
+ if(user.environment_smash)
+ user.do_attack_animation(src)
+ visible_message("[user] smashes [src] apart! ")
+ new buildstacktype(loc, buildstackamount)
qdel(src)
-
/*
* Roller beds
*/
@@ -56,7 +72,7 @@
if(buckled_mob)
user_unbuckle_mob(user)
else
- user.visible_message("[user] collapses \the [src.name]. ", "You collapse \the [src.name]. ")
+ user.visible_message("[user] collapses \the [name]. ", "You collapse \the [name]. ")
new/obj/item/roller(get_turf(src))
qdel(src)
return
@@ -72,14 +88,12 @@
M.pixel_x = M.get_standard_pixel_x_offset(M.lying)
M.pixel_y = M.get_standard_pixel_y_offset(M.lying)
-
/obj/item/roller
name = "roller bed"
desc = "A collapsed roller bed that can be carried around."
icon = 'icons/obj/rollerbed.dmi'
icon_state = "folded"
- w_class = 4 // Can't be put in backpacks.
-
+ w_class = WEIGHT_CLASS_BULKY // Can't be put in backpacks.
/obj/item/roller/attack_self(mob/user)
var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc)
@@ -90,8 +104,8 @@
if(istype(W, /obj/item/roller_holder))
var/obj/item/roller_holder/RH = W
if(!RH.held)
- user.visible_message("[user] collects \the [src.name]. ", "You collect \the [src.name]. ")
- src.forceMove(RH)
+ user.visible_message("[user] collects \the [name]. ", "You collect \the [name]. ")
+ forceMove(RH)
RH.held = src
/obj/structure/stool/bed/roller/MouseDrop(over_object, src_location, over_location)
@@ -101,13 +115,11 @@
return
if(buckled_mob)
return 0
- usr.visible_message("[usr] collapses \the [src.name]. ", "You collapse \the [src.name]. ")
+ usr.visible_message("[usr] collapses \the [name]. ", "You collapse \the [name]. ")
new/obj/item/roller(get_turf(src))
qdel(src)
return
-
-
/obj/item/roller_holder
name = "roller bed rack"
desc = "A rack for carrying a collapsed roller bed."
@@ -128,4 +140,4 @@
var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc)
R.add_fingerprint(user)
qdel(held)
- held = null
\ No newline at end of file
+ held = null
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index e2e287052ff..2b8cdd9e3ba 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -4,6 +4,7 @@
icon_state = "chair"
buckle_lying = 0 //you sit in a chair, not lay
burn_state = FIRE_PROOF
+ buildstackamount = 1
var/propelled = 0 // Check for fire-extinguisher-driven chairs
@@ -32,7 +33,7 @@
return
user.drop_item()
var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
E.dir = dir
E.part = SK
SK.loc = E
@@ -60,19 +61,16 @@
set src in oview(1)
if(config.ghost_interaction)
- src.dir = turn(src.dir, 90)
+ setDir(turn(dir, 90))
handle_rotation()
return
- else
- if(!usr || !isturf(usr.loc))
- return
- if(usr.stat || usr.restrained())
- return
- src.dir = turn(src.dir, 90)
- handle_rotation()
+ if(usr.incapacitated())
return
+ setDir(turn(dir, 90))
+ handle_rotation()
+
/obj/structure/stool/bed/chair/AltClick(mob/user)
if(user.incapacitated())
to_chat(user, "You can't do that right now! ")
@@ -85,6 +83,8 @@
/obj/structure/stool/bed/chair/wood
burn_state = FLAMMABLE
burntime = 20
+ buildstackamount = 3
+ buildstacktype = /obj/item/stack/sheet/wood
// TODO: Special ash subtype that looks like charred chair legs
/obj/structure/stool/bed/chair/wood/narsie_act()
@@ -100,16 +100,6 @@
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
-/obj/structure/stool/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- qdel(src)
- else
- ..()
-
/obj/structure/stool/bed/chair/comfy
name = "comfy chair"
desc = "It looks comfy."
@@ -117,6 +107,7 @@
color = rgb(255,255,255)
burn_state = FLAMMABLE
burntime = 30
+ buildstackamount = 2
var/image/armrest = null
/obj/structure/stool/bed/chair/comfy/New()
@@ -161,15 +152,7 @@
/obj/structure/stool/bed/chair/office
anchored = 0
movable = 1
-
-/obj/structure/stool/bed/chair/comfy/attackby(obj/item/weapon/W, mob/user, params)
- if(iswrench(W))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- new /obj/item/stack/sheet/metal(get_turf(src))
- new /obj/item/stack/sheet/metal(get_turf(src))
- qdel(src)
- else
- ..()
+ buildstackamount = 5
/obj/structure/stool/bed/chair/office/Bump(atom/A)
..()
@@ -199,11 +182,13 @@
/obj/structure/stool/bed/chair/barber
icon_state = "barber_chair"
+ buildstackamount = 1
/obj/structure/stool/bed/chair/sofa
name = "old ratty sofa"
icon_state = "sofamiddle"
anchored = 1
+ buildstackamount = 1
/obj/structure/stool/bed/chair/sofa/left
icon_state = "sofaend_left"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index da69c025bb8..6000b361aa5 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -4,6 +4,8 @@
icon = 'icons/obj/objects.dmi'
icon_state = "stool"
anchored = 1.0
+ var/buildstackamount = 1
+ var/buildstacktype = /obj/item/stack/sheet/metal
/obj/structure/stool/ex_act(severity)
switch(severity)
@@ -12,27 +14,26 @@
return
if(2.0)
if(prob(70))
- new /obj/item/stack/sheet/metal(src.loc)
+ new buildstacktype(loc, buildstackamount)
qdel(src)
return
if(3.0)
if(prob(50))
- new /obj/item/stack/sheet/metal(src.loc)
+ new buildstacktype(loc, buildstackamount)
qdel(src)
return
return
/obj/structure/stool/blob_act()
if(prob(75))
- new /obj/item/stack/sheet/metal(src.loc)
+ new buildstacktype(loc, buildstackamount)
qdel(src)
/obj/structure/stool/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- new /obj/item/stack/sheet/metal(src.loc)
+ playsound(loc, W.usesound, 50, 1)
+ new buildstacktype(loc, buildstackamount)
qdel(src)
- return
/obj/structure/stool/MouseDrop(atom/over_object, src_location, over_location, src_control, over_control, params, skip_fucking_stool_shit = 0)
if(skip_fucking_stool_shit)
@@ -42,7 +43,7 @@
if(H==usr && !H.restrained() && !H.stat && in_range(src, over_object))
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
S.origin = src
- src.loc = S
+ loc = S
H.put_in_hands(S)
H.visible_message("[H] grabs [src] from the floor! ", "You grab [src] from the floor! ")
@@ -53,7 +54,7 @@
icon_state = "stool"
force = 10
throwforce = 10
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
var/obj/structure/stool/origin = null
/obj/item/weapon/stool/attack_self(mob/user as mob)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 54540ab008b..b32f47520e4 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -1,6 +1,7 @@
/obj/structure/stool/bed/chair/wheelchair
name = "wheelchair"
desc = "You sit in this. Either by will or force."
+ icon = 'icons/obj/objects.dmi'
icon_state = "wheelchair"
anchored = 0
movable = 1
@@ -9,7 +10,7 @@
/obj/structure/stool/bed/chair/wheelchair/handle_rotation()
overlays = null
- var/image/O = image(icon = 'icons/obj/objects.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir)
+ var/image/O = image(icon = icon, icon_state = "[icon_state]_overlay", layer = FLY_LAYER, dir = src.dir)
overlays += O
if(buckled_mob)
buckled_mob.dir = dir
@@ -152,10 +153,3 @@
else
. = 1
-
-/obj/structure/stool/bed/chair/wheelchair/bike/handle_rotation()
- overlays = null
- var/image/O = image(icon = 'icons/vehicles/motorcycle.dmi', icon_state = "motorcycle_overlay_4d", layer = FLY_LAYER, dir = src.dir)
- overlays += O
- if(buckled_mob)
- buckled_mob.dir = dir
\ No newline at end of file
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index ae9e6b41d05..55181579699 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -18,7 +18,7 @@
density = 1
anchored = 1.0
layer = 2.8
- throwpass = 1 //You can throw objects over this, despite it's density.")
+ pass_flags = LETPASSTHROW
climbable = 1
var/parts = /obj/item/weapon/table_parts
@@ -126,8 +126,9 @@
/obj/structure/table/attack_tk() // no telehulk sorry
return
-/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height == 0)
+ return 1
if(istype(mover,/obj/item/projectile))
return (check_cover(mover,target))
if(ismob(mover))
@@ -136,6 +137,8 @@
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
+ if(mover.throwing)
+ return 1
if(locate(/obj/structure/table) in get_turf(mover))
return 1
if(flipped)
@@ -227,9 +230,9 @@
if(istype(W, /obj/item/weapon/wrench))
user.visible_message("[user] is disassembling \a [src]. ", "You start disassembling \the [src]. ")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 50, target = src))
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 50, 1)
destroy()
return
@@ -240,10 +243,10 @@
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
- playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
playsound(src.loc, "sparks", 50, 1)
for(var/mob/O in viewers(user, 4))
- O.show_message("\blue The [src] was sliced apart by [user]!", 1, "\red You hear [src] coming apart.", 2)
+ O.show_message("The [src] was sliced apart by [user]! ", 1, "You hear [src] coming apart. ", 2)
destroy()
return
@@ -421,10 +424,10 @@
var/obj/item/stack/sheet/glass/G = I
if(G.amount >= 2)
to_chat(user, "You start to add the glass to \the [src]. ")
- if(do_after(user, 10, target = src))
+ if(do_after(user, 10 * G.toolspeed, target = src))
G.use(2)
to_chat(user, "You add the glass to \the [src]. ")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), G.usesound, 50, 1)
new /obj/structure/table/glass(loc)
qdel(src)
else
@@ -433,9 +436,9 @@
if(iswrench(I))
to_chat(user, "You start to deconstruct \the [src]. ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- if(do_after(user, 10, target = src))
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
+ playsound(src.loc, I.usesound, 75, 1)
+ if(do_after(user, 10 * I.toolspeed, target = src))
+ playsound(src.loc, I.usesound, 75, 1)
to_chat(user, "You dismantle \the [src]. ")
new /obj/item/stack/sheet/metal(loc)
new /obj/item/stack/sheet/metal(loc)
@@ -494,18 +497,18 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
if(src.status == 2)
- to_chat(user, "\blue Now weakening the reinforced table")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ to_chat(user, "Now weakening the reinforced table ")
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 50 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- to_chat(user, "\blue Table weakened")
+ to_chat(user, "Table weakened ")
src.status = 1
else
- to_chat(user, "\blue Now strengthening the reinforced table")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ to_chat(user, "Now strengthening the reinforced table ")
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 50 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- to_chat(user, "\blue Table strengthened")
+ to_chat(user, "Table strengthened ")
src.status = 2
return
return
@@ -526,7 +529,7 @@
icon_state = "rack"
density = 1
anchored = 1.0
- throwpass = 1 //You can throw objects over this, despite it's density.
+ pass_flags = LETPASSTHROW
var/parts = /obj/item/weapon/rack_parts
var/health = 5
@@ -557,12 +560,14 @@
qdel(src)
return
-/obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
+/obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!|
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
+ if(mover.throwing)
+ return 1
else
return 0
@@ -586,7 +591,7 @@
/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
new /obj/item/weapon/rack_parts( src.loc )
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
qdel(src)
return
if(isrobot(user))
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 8d0962857f5..fb176ce9dba 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -10,18 +10,16 @@
var/list/oxytanks = list() //sorry for the similar var names
var/list/platanks = list()
-
/obj/structure/dispenser/oxygen
plasmatanks = 0
/obj/structure/dispenser/plasma
oxygentanks = 0
-
/obj/structure/dispenser/New()
+ ..()
update_icon()
-
/obj/structure/dispenser/update_icon()
overlays.Cut()
switch(oxygentanks)
@@ -31,40 +29,51 @@
if(1 to 4) overlays += "plasma-[plasmatanks]"
if(5 to INFINITY) overlays += "plasma-5"
+/obj/structure/dispenser/attack_hand(mob/user)
+ if(..())
+ return 1
+ add_fingerprint(user)
+ ui_interact(user)
-/obj/structure/dispenser/attack_hand(mob/user as mob)
+/obj/structure/dispenser/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/structure/dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
user.set_machine(src)
- var/dat = "[src] "
- dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "Dispense " : "empty"] "
- dat += "Plasma tanks: [plasmatanks] - [plasmatanks ? "Dispense " : "empty"]"
- user << browse(dat, "window=dispenser")
- onclose(user, "dispenser")
- return
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "tank_dispenser.tmpl", name, 275, 100, state = state)
+ ui.open()
+/obj/structure/dispenser/ui_data(user)
+ var/list/data = list()
+ data["o_tanks"] = oxygentanks
+ data["p_tanks"] = plasmatanks
+ return data
-/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/structure/dispenser/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
if(oxygentanks < 10)
user.drop_item()
- I.loc = src
+ I.forceMove(src)
oxytanks.Add(I)
oxygentanks++
+ update_icon()
to_chat(user, "You put [I] in [src]. ")
else
to_chat(user, "[src] is full. ")
- updateUsrDialog()
- return
+ nanomanager.update_uis(src)
if(istype(I, /obj/item/weapon/tank/plasma))
if(plasmatanks < 10)
user.drop_item()
- I.loc = src
+ I.forceMove(src)
platanks.Add(I)
plasmatanks++
+ update_icon()
to_chat(user, "You put [I] in [src]. ")
else
to_chat(user, "[src] is full. ")
- updateUsrDialog()
- return
+ nanomanager.update_uis(src)
if(istype(I, /obj/item/weapon/wrench))
if(anchored)
to_chat(user, "You lean down and unwrench [src]. ")
@@ -72,11 +81,11 @@
else
to_chat(user, "You wrench [src] into place. ")
anchored = 1
- return
/obj/structure/dispenser/Topic(href, href_list)
- if(usr.stat || usr.restrained())
- return
+ if(..())
+ return 1
+
if(Adjacent(usr))
usr.set_machine(src)
if(href_list["oxygen"])
@@ -105,7 +114,7 @@
update_icon()
add_fingerprint(usr)
updateUsrDialog()
+ nanomanager.update_uis(src)
else
- usr << browse(null, "window=dispenser")
- return
- return
\ No newline at end of file
+ nanomanager.close_user_uis(usr,src)
+ return 1
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 504b2abfa80..a51f58e5ec6 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -8,45 +8,48 @@
flags = CONDUCT
var/obj/item/target/pinned_target // the current pinned target
- Move()
- ..()
- // Move the pinned target along with the stake
- if(pinned_target in view(3, src))
- pinned_target.loc = loc
+/obj/structure/target_stake/Destroy()
+ QDEL_NULL(pinned_target)
+ return ..()
- else // Sanity check: if the pinned target can't be found in immediate view
- pinned_target = null
- density = 1
+/obj/structure/target_stake/Move()
+ ..()
+ // Move the pinned target along with the stake
+ if(pinned_target in view(3, src))
+ pinned_target.loc = loc
- attackby(obj/item/W as obj, mob/user as mob, params)
- // Putting objects on the stake. Most importantly, targets
- if(pinned_target)
- return // get rid of that pinned target first!
+ else // Sanity check: if the pinned target can't be found in immediate view
+ pinned_target = null
+ density = 1
- if(istype(W, /obj/item/target))
- density = 0
- W.density = 1
- user.drop_item(src)
- W.loc = loc
- W.layer = 3.1
- pinned_target = W
- to_chat(user, "You slide the target into the stake.")
- return
+/obj/structure/target_stake/attackby(obj/item/W, mob/user, params)
+ // Putting objects on the stake. Most importantly, targets
+ if(pinned_target)
+ return // get rid of that pinned target first!
- attack_hand(mob/user as mob)
- // taking pinned targets off!
- if(pinned_target)
- density = 1
- pinned_target.density = 0
- pinned_target.layer = OBJ_LAYER
+ if(istype(W, /obj/item/target))
+ density = 0
+ W.density = 1
+ user.drop_item(src)
+ W.loc = loc
+ W.layer = 3.1
+ pinned_target = W
+ to_chat(user, "You slide the target into the stake.")
- pinned_target.loc = user.loc
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(pinned_target)
- to_chat(user, "You take the target out of the stake.")
- else
- pinned_target.loc = get_turf(user)
+/obj/structure/target_stake/attack_hand(mob/user)
+ // taking pinned targets off!
+ if(pinned_target)
+ density = 1
+ pinned_target.density = 0
+ pinned_target.layer = OBJ_LAYER
+
+ pinned_target.loc = user.loc
+ if(ishuman(user))
+ if(!user.get_active_hand())
+ user.put_in_hands(pinned_target)
to_chat(user, "You take the target out of the stake.")
+ else
+ pinned_target.loc = get_turf(user)
+ to_chat(user, "You take the target out of the stake.")
- pinned_target = null
\ No newline at end of file
+ pinned_target = null
\ No newline at end of file
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index fda770705d0..6a06109277b 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -22,7 +22,6 @@
/obj/structure/transit_tube_pod/Destroy()
for(var/atom/movable/AM in contents)
AM.forceMove(get_turf(src))
-
return ..()
/obj/structure/transit_tube_pod/Process_Spacemove()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index bbbecf6695d..a43406eb3c7 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -14,9 +14,13 @@
/obj/structure/toilet/New()
+ ..()
open = round(rand(0, 1))
update_icon()
+/obj/structure/toilet/Destroy()
+ swirlie = null
+ return ..()
/obj/structure/toilet/attack_hand(mob/living/user)
if(swirlie)
@@ -52,7 +56,7 @@
if(istype(I, /obj/item/weapon/crowbar))
to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]... ")
playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * I.toolspeed, target = src))
user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]! ", "You hear grinding porcelain. ")
cistern = !cistern
update_icon()
@@ -102,10 +106,10 @@
to_chat(user, "You need a tighter grip! ")
if(cistern)
- if(I.w_class > 3)
+ if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user, "[I] does not fit! ")
return
- if(w_items + I.w_class > 5)
+ if(w_items + I.w_class > WEIGHT_CLASS_HUGE)
to_chat(user, "The cistern is full! ")
return
if(!user.drop_item())
@@ -388,9 +392,9 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
+ var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(user.hand)
- temp = H.organs_by_name["l_hand"]
+ temp = H.bodyparts_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(user, "You try to move your [temp.name], but cannot!")
return
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 4e41daef289..0c273e7f1fa 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -34,6 +34,7 @@ obj/structure/windoor_assembly/New(dir=NORTH)
obj/structure/windoor_assembly/Destroy()
density = 0
+ QDEL_NULL(electronics)
air_update_turf(1)
return ..()
@@ -45,11 +46,10 @@ obj/structure/windoor_assembly/Destroy()
/obj/structure/windoor_assembly/update_icon()
icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]"
-/obj/structure/windoor_assembly/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/windoor_assembly/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
- if(air_group) return 0
return !density
else
return 1
@@ -78,9 +78,9 @@ obj/structure/windoor_assembly/Destroy()
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
user.visible_message("[user] dissassembles the windoor assembly. ", "You start to dissassemble the windoor assembly. ")
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "You dissasembled the windoor assembly! ")
var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
@@ -98,10 +98,10 @@ obj/structure/windoor_assembly/Destroy()
if(WD.dir == src.dir)
to_chat(user, "There is already a windoor in that location. ")
return
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || src.anchored)
return
for(var/obj/machinery/door/window/WD in src.loc)
@@ -117,10 +117,10 @@ obj/structure/windoor_assembly/Destroy()
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
else if(istype(W, /obj/item/weapon/wrench) && anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !src.anchored)
return
to_chat(user, "You've unsecured the windoor assembly! ")
@@ -138,9 +138,10 @@ obj/structure/windoor_assembly/Destroy()
return
to_chat(user, "You start to reinforce the windoor with plasteel. ")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * P.toolspeed, target = src))
if(!src || secure)
return
+ playsound(loc, P.usesound, 100, 1)
P.use(2)
to_chat(user, "You reinforce the windoor. ")
@@ -154,12 +155,13 @@ obj/structure/windoor_assembly/Destroy()
else if(istype(W, /obj/item/stack/cable_coil) && anchored)
user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !src.anchored || src.state != "01")
return
var/obj/item/stack/cable_coil/CC = W
CC.use(1)
to_chat(user, "You wire the windoor! ")
+ playsound(loc, CC.usesound, 100, 1)
src.state = "02"
if(src.secure)
src.name = "secure wired windoor assembly"
@@ -172,10 +174,10 @@ obj/structure/windoor_assembly/Destroy()
//Removing wire from the assembly. Step 5 undone.
if(istype(W, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || src.state != "02")
return
@@ -189,12 +191,12 @@ obj/structure/windoor_assembly/Destroy()
//Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
user.drop_item()
W.loc = src
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || src.electronics)
W.loc = src.loc
return
@@ -209,10 +211,10 @@ obj/structure/windoor_assembly/Destroy()
if(!electronics)
return
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !electronics)
return
to_chat(user, "You've removed the airlock electronics! ")
@@ -239,10 +241,10 @@ obj/structure/windoor_assembly/Destroy()
to_chat(usr, "The assembly is missing electronics. ")
return
usr << browse(null, "window=windoor_access")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(src.loc && src.electronics)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 22331e4f484..9da30e5fe82 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -90,7 +90,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
return !density
return 1
-/obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
if(dir == SOUTHWEST || dir == SOUTHEAST || dir == NORTHWEST || dir == NORTHEAST)
@@ -108,13 +108,16 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
return 1
-/obj/structure/window/hitby(AM as mob|obj)
+/obj/structure/window/hitby(atom/movable/AM)
..()
var/tforce = 0
- if(isobj(AM))
- var/obj/item/I = AM
- tforce = I.throwforce
- if(reinf) tforce *= 0.25
+ if(ismob(AM))
+ tforce = 10
+ else if(isobj(AM))
+ var/obj/O = AM
+ tforce = O.throwforce
+ if(reinf)
+ tforce *= 0.25
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
health = max(0, health - tforce)
if(health <= 7 && !reinf)
@@ -122,7 +125,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
update_nearby_icons()
step(src, get_dir(AM, src))
if(health <= 0)
- destroy()
+ destroy()
/obj/structure/window/attack_hand(mob/user as mob)
@@ -133,8 +136,8 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
else if(user.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
- user.visible_message("\red [user.name] bangs against the [src.name]!", \
- "\red You bang against the [src.name]!", \
+ user.visible_message("[user.name] bangs against the [src.name]! ", \
+ "You bang against the [src.name]! ", \
"You hear a banging sound.")
else
user.changeNext_move(CLICK_CD_MELEE)
@@ -212,24 +215,24 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
if(istype(W, /obj/item/weapon/screwdriver))
if(reinf && state >= 1)
state = 3 - state
- playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (state == 1 ? "You have unfastened the window from the frame. " : "You have fastened the window to the frame. "))
else if(reinf && state == 0)
anchored = !anchored
update_nearby_icons()
- playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (anchored ? "You have fastened the frame to the floor. " : "You have unfastened the frame from the floor. "))
else if(!reinf)
anchored = !anchored
update_nearby_icons()
- playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (anchored ? "You have fastened the window to the floor. " : "You have unfastened the window. "))
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
state = 1 - state
- playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (state ? "You have pried the window into the frame. " : "You have pried the window out of the frame. "))
else if(istype(W, /obj/item/weapon/wrench) && !anchored && health > 7) //Disassemble deconstructed window into parts
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
for(var/i=0;iThe game hasn't started yet! ")
return
if(ticker.current_state == 1)
- to_chat(usr, "\red The round hasn't started yet!")
+ to_chat(usr, "The round hasn't started yet! ")
return
if(send_emergency_team)
- to_chat(usr, "\red Central Command has already dispatched an emergency response team!")
+ to_chat(usr, "Central Command has already dispatched an emergency response team! ")
return
if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes")
@@ -40,7 +43,7 @@ var/ert_request_answered = 0
return
if(send_emergency_team)
- to_chat(usr, "\red Central Command has already dispatched an emergency response team!")
+ to_chat(usr, "Central Command has already dispatched an emergency response team! ")
return
var/ert_type = pick_ert_type()
@@ -93,7 +96,7 @@ var/ert_request_answered = 0
if(response_team_members.len > 6)
to_chat(src, "The emergency response team is already full!")
return 0
-
+
return 1
/proc/trigger_armed_response_team(var/datum/response_team/response_team_type)
@@ -101,12 +104,12 @@ var/ert_request_answered = 0
active_team = response_team_type
send_emergency_team = 1
- var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1)
+ var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT])
if(!ert_candidates.len)
active_team.cannot_send_team()
send_emergency_team = 0
return 0
-
+
// Respawnable players get first dibs
for(var/mob/dead/observer/M in ert_candidates)
if((M in respawnable_list) && M.JoinResponseTeam())
@@ -115,7 +118,7 @@ var/ert_request_answered = 0
for(var/mob/dead/observer/M in (ert_candidates - respawnable_list))
if(M.JoinResponseTeam())
response_team_members |= M
-
+
if(!response_team_members.len)
active_team.cannot_send_team()
send_emergency_team = 0
@@ -125,14 +128,14 @@ var/ert_request_answered = 0
for(var/mob/M in response_team_members)
if(index > emergencyresponseteamspawn.len)
index = 1
-
+
var/client/C = M.client
var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
new_commando.mind.key = M.key
new_commando.key = M.key
new_commando.update_icons()
index++
-
+
send_emergency_team = 0
active_team.announce_team()
return 1
@@ -157,6 +160,8 @@ var/ert_request_answered = 0
M.set_species("Human",1)
M.dna.ready_dna(M)
+ M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ERT.
+ M.overeatduration = 0
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
@@ -170,8 +175,8 @@ var/ert_request_answered = 0
head_organ.b_hair = color2B(hair_c)
M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
- head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
+ head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]"
M.name = M.real_name
@@ -187,6 +192,7 @@ var/ert_request_answered = 0
M.mind.special_role = SPECIAL_ROLE_ERT
if(!(M.mind in ticker.minds))
ticker.minds += M.mind //Adds them to regular mind list.
+ ticker.mode.ert += M.mind
M.forceMove(spawn_location)
active_team.equip_officer(class, M)
@@ -200,6 +206,11 @@ var/ert_request_answered = 0
var/medical_slots = 3
var/security_slots = 3
+ var/command_outfit
+ var/engineering_outfit
+ var/medical_outfit
+ var/security_outfit
+
/datum/response_team/proc/get_slot_list()
var/list/slots_available = list()
if(command_slots)
@@ -226,83 +237,21 @@ var/ert_request_answered = 0
return 0
/datum/response_team/proc/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear)
-
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
- L.imp_in = M
- L.implanted = 1
- M.sec_hud_set_implants()
-
switch(officer_type)
if("Engineer")
engineer_slots -= 1
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
-
- var/obj/item/weapon/card/id/W = new(src)
- W.assignment = "Emergency Response Team Member"
- W.registered_name = M.real_name
- W.name = "[M.real_name]'s ID Card (Emergency Response Team Engineer)"
- W.icon_state = "ERT_engineering"
- W.access = get_centcom_access(W.assignment)
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/device/pda/heads/pda = new(src)
- pda.owner = M.real_name
- pda.ownjob = "Emergency Response Team Member"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- pda.icon_state = "pda-engineer"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+ M.equipOutfit(engineering_outfit)
+ M.job = "ERT Engineering"
if("Security")
security_slots -= 1
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_belt)
-
- var/obj/item/weapon/card/id/W = new(src)
- W.assignment = "Emergency Response Team Member"
- W.registered_name = M.real_name
- W.name = "[M.real_name]'s ID Card (Emergency Response Team Officer)"
- W.icon_state = "ERT_security"
- W.access = get_centcom_access(W.assignment)
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/device/pda/heads/pda = new(src)
- pda.owner = M.real_name
- pda.ownjob = "Emergency Response Team Member"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- pda.icon_state = "pda-security"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+ M.equipOutfit(security_outfit)
+ M.job = "ERT Security"
if("Medic")
medical_slots -= 1
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/medical(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack)
-
- var/obj/item/weapon/card/id/W = new(src)
- W.assignment = "Emergency Response Team Member"
- W.registered_name = M.real_name
- W.name = "[M.real_name]'s ID Card (Emergency Response Team Medic)"
- W.icon_state = "ERT_medical"
- W.access = get_centcom_access(W.assignment)
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/device/pda/heads/pda = new(src)
- pda.owner = M.real_name
- pda.ownjob = "Emergency Response Team Member"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- pda.icon_state = "pda-medical"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
-
+ M.equipOutfit(medical_outfit)
+ M.job = "ERT Medical"
if("Commander")
command_slots = 0
@@ -312,269 +261,356 @@ var/ert_request_answered = 0
M.name = M.real_name
M.age = rand(35,45)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack)
-
- var/obj/item/weapon/card/id/W = new(src)
- W.assignment = "Emergency Response Team Leader"
- W.registered_name = M.real_name
- W.name = "[M.real_name]'s ID Card (Emergency Response Team Leader)"
- W.icon_state = "ERT_leader"
- W.access = get_centcom_access(W.assignment)
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/device/pda/heads/pda = new(src)
- pda.owner = M.real_name
- pda.ownjob = "Emergency Response Team Leader"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
+ M.equipOutfit(command_outfit)
+ M.job = "ERT Commander"
/datum/response_team/proc/cannot_send_team()
- command_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
+ event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
/datum/response_team/proc/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are sending a team of highly trained assistants to aid(?) you. Standby.", "ERT En-Route")
+ event_announcement.Announce("Attention, [station_name()]. We are sending a team of highly trained assistants to aid(?) you. Standby.", "ERT En-Route")
// -- AMBER TEAM --
/datum/response_team/amber
+ engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/amber
+ security_outfit = /datum/outfit/job/centcom/response_team/security/amber
+ medical_outfit = /datum/outfit/job/centcom/response_team/medic/amber
+ command_outfit = /datum/outfit/job/centcom/response_team/commander/amber
/datum/response_team/amber/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are sending a code AMBER light Emergency Response Team. Standby.", "ERT En-Route")
-
-/datum/response_team/amber/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
- ..()
-
- switch(officer_type)
- if("Engineer")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/sheet/glass(M, amount=50), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/sheet/metal(M, amount=50), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
-
- if("Security")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/security(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/security(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/laser(M), slot_r_hand)
-
- if("Medic")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/medical(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_belt)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/medical(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/brute(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
-
- if("Commander")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/command(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/command(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
+ event_announcement.Announce("Attention, [station_name()]. We are sending a code AMBER light Emergency Response Team. Standby.", "ERT En-Route")
// -- RED TEAM --
/datum/response_team/red
+ engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/red
+ security_outfit = /datum/outfit/job/centcom/response_team/security/red
+ medical_outfit = /datum/outfit/job/centcom/response_team/medic/red
+ command_outfit = /datum/outfit/job/centcom/response_team/commander/red
/datum/response_team/red/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are sending a code RED Emergency Response Team. Standby.", "ERT En-Route")
-
-/datum/response_team/red/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
- ..()
-
- switch(officer_type)
- if("Engineer")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_in_backpack)
- var/obj/item/weapon/rcd/R = new /obj/item/weapon/rcd(src)
- R.matter = 100
- M.equip_to_slot_or_del(R, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/device/t_scanner/extended_range(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
-
- if("Security")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/security(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
- if(prob(50))
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/teargas(M), slot_in_backpack)
- else
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/ionrifle/carbine(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasercannon(M), slot_r_hand)
-
- if("Medic")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/toxin(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
-
- if("Commander")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
-
-
- M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
+ event_announcement.Announce("Attention, [station_name()]. We are sending a code RED Emergency Response Team. Standby.", "ERT En-Route")
// -- GAMMA TEAM --
/datum/response_team/gamma
+ engineering_outfit = /datum/outfit/job/centcom/response_team/engineer/gamma
+ security_outfit = /datum/outfit/job/centcom/response_team/security/gamma
+ medical_outfit = /datum/outfit/job/centcom/response_team/medic/gamma
+ command_outfit = /datum/outfit/job/centcom/response_team/commander/gamma
/datum/response_team/gamma/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are sending a code GAMMA elite Emergency Response Team. Standby.", "ERT En-Route")
+ event_announcement.Announce("Attention, [station_name()]. We are sending a code GAMMA elite Emergency Response Team. Standby.", "ERT En-Route")
-/datum/response_team/gamma/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
- ..()
+/datum/outfit/job/centcom/response_team
+ name = "Response team"
+ var/rt_assignment = "Emergency Response Team Member"
+ var/rt_job = "This is a bug"
+ allow_backbag_choice = FALSE
+ allow_loadout = FALSE
+ pda = /obj/item/device/pda/heads/ert
+ id = /obj/item/weapon/card/id/ert
+ l_ear = /obj/item/device/radio/headset/ert/alt
- switch(officer_type)
- if("Engineer")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses)
+ implants = list(/obj/item/weapon/implant/mindshield)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+/datum/outfit/job/centcom/response_team/pre_equip()
+ . = ..()
+ backpack_contents.Insert(1, /obj/item/weapon/storage/box/responseteam)
+ backpack_contents[/obj/item/weapon/storage/box/responseteam] = 1
- M.equip_to_slot_or_del(new /obj/item/device/t_scanner/extended_range(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
+/datum/outfit/job/centcom/response_team/imprint_idcard(mob/living/carbon/human/H)
+ var/obj/item/weapon/card/id/W = H.wear_id
+ if(!istype(W))
+ return
+ W.assignment = rt_assignment
+ W.rank = W.assignment
+ W.age = H.age
+ W.sex = capitalize(H.gender)
+ W.registered_name = H.real_name
+ W.name = "[H.real_name]'s ID Card ([rt_job])"
+ W.access = get_centcom_access(W.assignment)
+ W.photo = get_id_photo(H)
- if("Security")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_glasses)
+/datum/outfit/job/centcom/response_team/imprint_pda(mob/living/carbon/human/H)
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = rt_assignment
+ PDA.ownrank = rt_assignment
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/security(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
- if(prob(50))
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/teargas(M), slot_in_backpack)
- else
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/ionrifle/carbine(M), slot_in_backpack)
+/datum/outfit/job/centcom/response_team/commander
+ name = "RT Commander"
+ rt_assignment = "Emergency Response Team Leader"
+ rt_job = "Emergency Response Team Leader"
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/carbine(M), slot_r_hand)
+ uniform = /obj/item/clothing/under/rank/centcom_officer
+ back = /obj/item/weapon/storage/backpack/ert/commander
- if("Medic")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses)
+ id = /obj/item/weapon/card/id/ert/commander
- M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt)
+ l_pocket = /obj/item/weapon/pinpointer
+ r_pocket = /obj/item/weapon/melee/classic_baton/telescopic
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+/datum/outfit/job/centcom/response_team/commander/amber
+ name = "RT Commander (Amber)"
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/color/black
+ suit = /obj/item/clothing/suit/armor/vest/ert/command
+ glasses = /obj/item/clothing/glasses/sunglasses
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
+ belt = /obj/item/weapon/gun/energy/gun
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/medbeam(M), slot_r_hand)
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/ert/command = 1,
+ /obj/item/clothing/mask/gas/sechailer = 1,
+ /obj/item/weapon/restraints/handcuffs = 1,
+ /obj/item/weapon/storage/lockbox/mindshield = 1
+ )
- if("Commander")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_glasses)
+/datum/outfit/job/centcom/response_team/commander/red
+ name = "RT Commander (Red)"
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/combat
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/commander
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt)
+ belt = /obj/item/weapon/gun/energy/gun/nuclear
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
+ /obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/weapon/restraints/handcuffs = 1,
+ /obj/item/weapon/storage/lockbox/mindshield = 1
+ )
- M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
+/datum/outfit/job/centcom/response_team/commander/gamma
+ name = "RT Commander (Gamma)"
+ shoes = /obj/item/clothing/shoes/combat/swat
+ gloves = /obj/item/clothing/gloves/combat
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/commander
+ glasses = /obj/item/clothing/glasses/hud/security/night
+ belt = /obj/item/weapon/gun/energy/gun/nuclear
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
+ /obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/weapon/restraints/handcuffs = 1,
+ /obj/item/weapon/storage/lockbox/mindshield = 1,
+ /obj/item/weapon/gun/energy/pulse/pistol = 1
+ )
+
+/datum/outfit/job/centcom/response_team/security
+ name = "RT Security"
+ rt_job = "Emergency Response Team Officer"
+ uniform = /obj/item/clothing/under/rank/security
+ back = /obj/item/weapon/storage/backpack/ert/security
+ belt = /obj/item/weapon/storage/belt/security/response_team
+ pda = /obj/item/device/pda/heads/ert/security
+ id = /obj/item/weapon/card/id/ert/security
+ var/has_grenades = FALSE
+
+/datum/outfit/job/centcom/response_team/security/pre_equip()
+ . = ..()
+ if(has_grenades)
+ var/grenadebox = /obj/item/weapon/storage/box/flashbangs
+ if(prob(50))
+ grenadebox = /obj/item/weapon/storage/box/teargas
+ backpack_contents.Insert(1, grenadebox)
+ backpack_contents[grenadebox] = 1
+
+/datum/outfit/job/centcom/response_team/security/amber
+ name = "RT Security (Amber)"
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/color/black
+ suit = /obj/item/clothing/suit/armor/vest/ert/security
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+
+ r_hand = /obj/item/weapon/gun/energy/laser
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/ert/security = 1,
+ /obj/item/clothing/mask/gas/sechailer = 1,
+ /obj/item/weapon/storage/box/zipties = 1
+ )
+
+/datum/outfit/job/centcom/response_team/security/red
+ name = "RT Security (Red)"
+ has_grenades = TRUE
+
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/color/black
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/security
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+
+ r_hand = /obj/item/weapon/gun/energy/lasercannon
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1,
+ /obj/item/clothing/mask/gas/sechailer = 1,
+ /obj/item/weapon/storage/box/handcuffs = 1,
+ /obj/item/weapon/gun/energy/ionrifle/carbine = 1
+ )
+
+/datum/outfit/job/centcom/response_team/security/gamma
+ name = "RT Security (Gamma)"
+ has_grenades = TRUE
+ shoes = /obj/item/clothing/shoes/combat/swat
+ gloves = /obj/item/clothing/gloves/combat
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/security
+ suit_store = /obj/item/weapon/gun/energy/gun/nuclear
+ glasses = /obj/item/clothing/glasses/hud/security/night
+
+ r_hand = /obj/item/weapon/gun/energy/pulse/carbine
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1,
+ /obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/weapon/storage/box/handcuffs = 1,
+ /obj/item/weapon/gun/energy/ionrifle/carbine = 1
+ )
+
+/datum/outfit/job/centcom/response_team/engineer
+ name = "RT Engineer"
+ rt_job = "Emergency Response Team Engineer"
+ back = /obj/item/weapon/storage/backpack/ert/engineer
+ uniform = /obj/item/clothing/under/rank/engineer
+
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ pda = /obj/item/device/pda/heads/ert/engineering
+ id = /obj/item/weapon/card/id/ert/engineering
+
+/datum/outfit/job/centcom/response_team/engineer/amber
+ name = "RT Engineer (Amber)"
+ shoes = /obj/item/clothing/shoes/magboots
+ gloves = /obj/item/clothing/gloves/color/yellow
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer
+ suit_store = /obj/item/weapon/tank/emergency_oxygen/engi
+ glasses = /obj/item/clothing/glasses/meson
+
+ l_pocket = /obj/item/device/t_scanner
+ r_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1,
+ /obj/item/clothing/mask/gas = 1,
+ /obj/item/stack/sheet/glass/fifty = 1,
+ /obj/item/stack/sheet/metal/fifty = 1
+ )
+
+/datum/outfit/job/centcom/response_team/engineer/red
+ name = "RT Engineer (Red)"
+ shoes = /obj/item/clothing/shoes/magboots
+ gloves = /obj/item/clothing/gloves/color/yellow
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer
+ suit_store = /obj/item/weapon/tank/emergency_oxygen/engi
+ glasses = /obj/item/clothing/glasses/meson
+
+ l_pocket = /obj/item/device/t_scanner/extended_range
+ r_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1,
+ /obj/item/clothing/mask/gas = 1,
+ /obj/item/weapon/rcd/preloaded = 1,
+ /obj/item/weapon/rcd_ammo = 3,
+ /obj/item/weapon/gun/energy/gun = 1
+ )
+
+/datum/outfit/job/centcom/response_team/engineer/gamma
+ name = "RT Engineer (Gamma)"
+ shoes = /obj/item/clothing/shoes/magboots/advance
+ gloves = /obj/item/clothing/gloves/color/yellow
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer
+ suit_store = /obj/item/weapon/tank/emergency_oxygen/double/full
+ glasses = /obj/item/clothing/glasses/meson/night
+
+ l_pocket = /obj/item/device/t_scanner/extended_range
+ r_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1,
+ /obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/weapon/rcd/combat = 1,
+ /obj/item/weapon/rcd_ammo/large = 3,
+ /obj/item/weapon/gun/energy/pulse/pistol = 1
+ )
+
+/datum/outfit/job/centcom/response_team/medic
+ name = "RT Medic"
+ rt_job = "Emergency Response Team Medic"
+ uniform = /obj/item/clothing/under/rank/medical
+ back = /obj/item/weapon/storage/backpack/ert/medical
+ pda = /obj/item/device/pda/heads/ert/medical
+ id = /obj/item/weapon/card/id/ert/medic
+
+ l_pocket = /obj/item/weapon/reagent_containers/hypospray/CMO
+ r_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+
+/datum/outfit/job/centcom/response_team/medic/amber
+ name = "RT Medic (Amber)"
+
+ shoes = /obj/item/clothing/shoes/white
+ gloves = /obj/item/clothing/gloves/color/latex
+ suit = /obj/item/clothing/suit/armor/vest/ert/medical
+ glasses = /obj/item/clothing/glasses/hud/health
+
+ belt = /obj/item/weapon/storage/belt/medical/response_team
+
+ l_pocket = /obj/item/weapon/reagent_containers/hypospray/CMO
+ r_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/ert/medical = 1,
+ /obj/item/clothing/mask/surgical = 1,
+ /obj/item/weapon/storage/firstaid/o2 = 1,
+ /obj/item/weapon/storage/firstaid/brute = 1,
+ /obj/item/weapon/storage/firstaid/adv = 1,
+ )
+
+/datum/outfit/job/centcom/response_team/medic/red
+ name = "RT Medic (Red)"
+ shoes = /obj/item/clothing/shoes/white
+ gloves = /obj/item/clothing/gloves/color/latex/nitrile
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/medical
+ glasses = /obj/item/clothing/glasses/hud/health/health_advanced
+
+ belt = /obj/item/weapon/defibrillator/compact/loaded
+
+
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1,
+ /obj/item/clothing/mask/surgical = 1,
+ /obj/item/weapon/storage/firstaid/o2 = 1,
+ /obj/item/weapon/storage/firstaid/toxin = 1,
+ /obj/item/weapon/storage/firstaid/adv = 1,
+ /obj/item/weapon/storage/firstaid/surgery = 1,
+ /obj/item/weapon/gun/energy/gun = 1
+ )
+
+/datum/outfit/job/centcom/response_team/medic/gamma
+ name = "RT Medic (Gamma)"
+ shoes = /obj/item/clothing/shoes/combat/swat
+ gloves = /obj/item/clothing/gloves/combat
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/medical
+ glasses = /obj/item/clothing/glasses/hud/health/night
+
+ belt = /obj/item/weapon/defibrillator/compact/loaded
+
+ l_pocket = /obj/item/weapon/reagent_containers/hypospray/combat/nanites
+
+ r_hand = /obj/item/weapon/gun/medbeam
+ backpack_contents = list(
+ /obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1,
+ /obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/weapon/storage/firstaid/surgery = 1,
+ /obj/item/weapon/gun/energy/pulse/pistol = 1
+ )
/obj/item/device/radio/centcom
name = "centcomm bounced radio"
diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm
index 820103eb2d4..3072fd2a264 100644
--- a/code/game/shuttle_engines.dm
+++ b/code/game/shuttle_engines.dm
@@ -16,8 +16,8 @@
opacity = 0
anchored = 1
- CanPass(atom/movable/mover, turf/target, height, air_group)
- if(!height || air_group) return 0
+ CanPass(atom/movable/mover, turf/target, height)
+ if(!height) return 0
else return ..()
CanAtmosPass(turf/T)
diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm
index 48d150dfb85..20dea8de7b0 100644
--- a/code/game/smoothwall.dm
+++ b/code/game/smoothwall.dm
@@ -83,7 +83,7 @@
// JESUS WHY
for(var/direction in cardinal)
- for(var/obj/effect/glowshroom/shroom in get_step(src,direction))
+ for(var/obj/structure/glowshroom/shroom in get_step(src,direction))
if(!shroom.floor) //shrooms drop to the floor
shroom.floor = 1
shroom.icon_state = "glowshroomf"
diff --git a/code/game/sound.dm b/code/game/sound.dm
index ed5f0d15b4c..14269acb81f 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -12,6 +12,9 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur
var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
var/list/computer_ambience = list('sound/goonstation/machines/ambicomp1.ogg', 'sound/goonstation/machines/ambicomp2.ogg', 'sound/goonstation/machines/ambicomp3.ogg')
var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg')
+var/list/terminal_type = list('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg',
+ 'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg',
+ 'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg')
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch)
@@ -137,4 +140,6 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect
soundin = pick(computer_ambience)
if("ricochet")
soundin = pick(ricochet)
+ if("terminal_type")
+ soundin = pick(terminal_type)
return soundin
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index b8a6635225a..0476df52ceb 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -41,13 +41,11 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
builtin_tile = new floor_tile
/turf/simulated/floor/Destroy()
- if(builtin_tile)
- qdel(builtin_tile)
- builtin_tile = null
+ QDEL_NULL(builtin_tile)
return ..()
-//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0)
// if((istype(mover, /obj/machinery/vehicle) && !(src.burnt)))
// if(!( locate(/obj/machinery/mass_driver, src) ))
// return 0
@@ -138,24 +136,11 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
return 1
if(..())
return 1
- if(intact && istype(C, /obj/item/weapon/crowbar))
- if(broken || burnt)
- broken = 0
- burnt = 0
- to_chat(user, "You remove the broken plating. ")
- else
- if(istype(src, /turf/simulated/floor/wood))
- to_chat(user, "You forcefully pry off the planks, destroying them in the process. ")
- else if(!builtin_tile)
- to_chat(user, "You are unable to pry up \the [src] with a crowbar. ")
- return 1
- else
- to_chat(user, "You remove \the [builtin_tile.singular_name]. ")
- builtin_tile.loc = src
- builtin_tile = null //deassociate tile, it no longer belongs to this turf
- make_plating()
- playsound(src, 'sound/items/Crowbar.ogg', 80, 1)
+ if(intact && iscrowbar(C))
+ pry_tile(C, user)
return 1
+ if(intact && istype(C, /obj/item/stack/tile))
+ try_replace_tile(C, user, params)
if(istype(C, /obj/item/pipe))
var/obj/item/pipe/P = C
if(P.pipe_type != -1) // ANY PIPE
@@ -181,6 +166,37 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
return 1
return 0
+/turf/simulated/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ if(T.turf_type == type)
+ return
+ var/obj/item/weapon/crowbar/CB
+ if(iscrowbar(user.get_inactive_hand()))
+ CB = user.get_inactive_hand()
+ if(!CB)
+ return
+ var/turf/simulated/floor/plating/P = pry_tile(CB, user, TRUE)
+ if(!istype(P))
+ return
+ P.attackby(T, user, params)
+
+/turf/simulated/floor/proc/pry_tile(obj/item/C, mob/user, silent = FALSE)
+ playsound(src, C.usesound, 80, 1)
+ return remove_tile(user, silent)
+
+/turf/simulated/floor/proc/remove_tile(mob/user, silent = FALSE, make_tile = TRUE)
+ if(broken || burnt)
+ broken = 0
+ burnt = 0
+ if(user && !silent)
+ to_chat(user, "You remove the broken plating. ")
+ else
+ if(user && !silent)
+ to_chat(user, "You remove the floor tile. ")
+ if(builtin_tile && make_tile)
+ builtin_tile.forceMove(src)
+ builtin_tile = null
+ return make_plating()
+
/turf/simulated/floor/singularity_pull(S, current_size)
if(current_size == STAGE_THREE)
if(prob(30))
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index a328769d8dc..94dc68b51f2 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -11,15 +11,48 @@
/turf/simulated/floor/wood/attackby(obj/item/C, mob/user, params)
if(..())
return
- if(istype(C, /obj/item/weapon/screwdriver))
- if(broken || burnt)
- return
- to_chat(user, "You unscrew the planks. ")
- new floor_tile(src)
- make_plating()
- playsound(src, 'sound/items/Screwdriver.ogg', 80, 1)
+ if(isscrewdriver(C))
+ pry_tile(C, user)
return
+/turf/simulated/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ if(T.turf_type == type)
+ return
+ var/obj/item/weapon/tool
+ if(isscrewdriver(user.get_inactive_hand()))
+ tool = user.get_inactive_hand()
+ if(!tool && iscrowbar(user.get_inactive_hand()))
+ tool = user.get_inactive_hand()
+ if(!tool)
+ return
+ var/turf/simulated/floor/plating/P = pry_tile(tool, user, TRUE)
+ if(!istype(P))
+ return
+ P.attackby(T, user, params)
+
+/turf/simulated/floor/wood/pry_tile(obj/item/C, mob/user, silent = FALSE)
+ var/is_screwdriver = isscrewdriver(C)
+ playsound(src, C.usesound, 80, 1)
+ return remove_tile(user, silent, make_tile = is_screwdriver)
+
+/turf/simulated/floor/wood/remove_tile(mob/user, silent = FALSE, make_tile = TRUE)
+ if(broken || burnt)
+ broken = 0
+ burnt = 0
+ if(user && !silent)
+ to_chat(user, "You remove the broken planks. ")
+ else
+ if(make_tile)
+ if(user && !silent)
+ to_chat(user, "You unscrew the planks. ")
+ if(builtin_tile)
+ builtin_tile.forceMove(src)
+ builtin_tile = null
+ else
+ if(user && !silent)
+ to_chat(user, "You forcefully pry off the planks, destroying them in the process. ")
+ return make_plating()
+
/turf/simulated/floor/grass
name = "grass patch"
icon_state = "grass1"
@@ -43,8 +76,36 @@
new /obj/item/weapon/ore/glass(src)
new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass
to_chat(user, "You shovel the grass. ")
+ playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
make_plating()
+// NEEDS TO BE UPDATED
+/turf/simulated/floor/basalt //By your powers combined, I am captain planet
+ name = "volcanic floor"
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "basalt0"
+ oxygen = 14
+ nitrogen = 23
+ temperature = 300
+
+/turf/simulated/floor/basalt/attackby(obj/item/W, mob/user, params)
+ if(..())
+ return
+ if(istype(W, /obj/item/weapon/shovel))
+ new /obj/item/weapon/ore/glass/basalt(src)
+ new /obj/item/weapon/ore/glass/basalt(src)
+ user.visible_message("[user] digs up [src]. ", "You uproot [src]. ")
+ playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
+ make_plating()
+
+/turf/simulated/floor/basalt/New()
+ ..()
+ if(prob(15))
+ icon_state = "basalt[rand(0, 12)]"
+ switch(icon_state)
+ if("basalt1", "basalt2", "basalt3")
+ set_light(1, 1)
+
/turf/simulated/floor/carpet
name = "Carpet"
icon = 'icons/turf/floors/carpet.dmi'
diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm
index 9ef70522ec4..eb15d3f9e63 100644
--- a/code/game/turfs/simulated/floor/mineral.dm
+++ b/code/game/turfs/simulated/floor/mineral.dm
@@ -1,10 +1,18 @@
+/* In this file:
+ *
+ * Plasma floor
+ * Gold floor
+ * Silver floor
+ * Bananium floor
+ * Diamond floor
+ * Uranium floor
+ */
+
/turf/simulated/floor/mineral
name = "mineral floor"
icon_state = ""
var/list/icons = list()
-
-
/turf/simulated/floor/mineral/New()
..()
broken_states = list("[initial(icon_state)]_dam")
@@ -13,9 +21,155 @@
if(!..())
return 0
if(!broken && !burnt)
- if( !(icon_state in icons) )
+ if(!(icon_state in icons))
icon_state = initial(icon_state)
+//PLASMA
+/turf/simulated/floor/mineral/plasma
+ name = "plasma floor"
+ icon_state = "plasma"
+ floor_tile = /obj/item/stack/tile/mineral/plasma
+ icons = list("plasma","plasma_dam")
+
+/turf/simulated/floor/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ PlasmaBurn()
+
+/turf/simulated/floor/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params)
+ if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
+ message_admins("Plasma flooring was ignited by [key_name_admin(user)](? ) (FLW ) in ([x],[y],[z] - JMP )",0,1)
+ log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])")
+ ignite(is_hot(W))
+ return
+ ..()
+
+/turf/simulated/floor/mineral/plasma/proc/PlasmaBurn()
+ make_plating()
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 20)
+
+/turf/simulated/floor/mineral/plasma/proc/ignite(exposed_temperature)
+ if(exposed_temperature > 300)
+ PlasmaBurn()
+
+//GOLD
+/turf/simulated/floor/mineral/gold
+ name = "gold floor"
+ icon_state = "gold"
+ floor_tile = /obj/item/stack/tile/mineral/gold
+ icons = list("gold","gold_dam")
+
+/turf/simulated/floor/mineral/gold/fancy
+ icon_state = "goldfancy"
+ floor_tile = /obj/item/stack/tile/mineral/gold/fancy
+ icons = list("goldfancy","goldfancy_dam")
+
+//SILVER
+/turf/simulated/floor/mineral/silver
+ name = "silver floor"
+ icon_state = "silver"
+ floor_tile = /obj/item/stack/tile/mineral/silver
+ icons = list("silver","silver_dam")
+
+/turf/simulated/floor/mineral/silver/fancy
+ icon_state = "silverfancy"
+ floor_tile = /obj/item/stack/tile/mineral/silver/fancy
+ icons = list("silverfancy","silverfancy_dam")
+
+//BANANIUM
+/turf/simulated/floor/mineral/bananium
+ name = "bananium floor"
+ icon_state = "bananium"
+ floor_tile = /obj/item/stack/tile/mineral/bananium
+ icons = list("bananium","bananium_dam")
+ var/spam_flag = 0
+
+/turf/simulated/floor/mineral/bananium/Entered(mob/living/M)
+ .=..()
+ if(!.)
+ if(istype(M))
+ squeek()
+
+/turf/simulated/floor/mineral/bananium/attackby(obj/item/weapon/W, mob/user, params)
+ .=..()
+ if(!.)
+ honk()
+
+/turf/simulated/floor/mineral/bananium/attack_hand(mob/user)
+ .=..()
+ if(!.)
+ honk()
+
+/turf/simulated/floor/mineral/bananium/proc/honk()
+ if(!spam_flag)
+ spam_flag = 1
+ playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
+ spawn(20)
+ spam_flag = 0
+
+/turf/simulated/floor/mineral/bananium/proc/squeek()
+ if(!spam_flag)
+ spam_flag = 1
+ playsound(src, "clownstep", 50, 1)
+ spawn(10)
+ spam_flag = 0
+
+/turf/simulated/floor/mineral/bananium/airless
+ oxygen = 0.01
+ nitrogen = 0.01
+ temperature = TCMB
+
+//TRANQUILLITE
+/turf/simulated/floor/mineral/tranquillite
+ name = "silent floor"
+ icon_state = "tranquillite"
+ floor_tile = /obj/item/stack/tile/mineral/tranquillite
+ shoe_running_volume = 0
+ shoe_walking_volume = 0
+
+//DIAMOND
+/turf/simulated/floor/mineral/diamond
+ name = "diamond floor"
+ icon_state = "diamond"
+ floor_tile = /obj/item/stack/tile/mineral/diamond
+ icons = list("diamond","diamond_dam")
+
+//URANIUM
+/turf/simulated/floor/mineral/uranium
+ name = "uranium floor"
+ icon_state = "uranium"
+ floor_tile = /obj/item/stack/tile/mineral/uranium
+ icons = list("uranium","uranium_dam")
+ var/last_event = 0
+ var/active = null
+
+/turf/simulated/floor/mineral/uranium/Entered(mob/AM)
+ .=..()
+ if(!.)
+ if(istype(AM))
+ radiate()
+
+/turf/simulated/floor/mineral/uranium/attackby(obj/item/weapon/W, mob/user, params)
+ .=..()
+ if(!.)
+ radiate()
+
+/turf/simulated/floor/mineral/uranium/attack_hand(mob/user)
+ .=..()
+ if(!.)
+ radiate()
+
+/turf/simulated/floor/mineral/uranium/proc/radiate()
+ if(!active)
+ if(world.time > last_event+15)
+ active = 1
+ for(var/mob/living/L in range(3,src))
+ L.apply_effect(1,IRRADIATE,0)
+ for(var/turf/simulated/floor/mineral/uranium/T in orange(1,src))
+ T.radiate()
+ last_event = world.time
+ active = 0
+ return
+
// ALIEN ALLOY
/turf/simulated/floor/mineral/abductor
name = "alien floor"
@@ -36,7 +190,6 @@
/turf/simulated/floor/mineral/abductor/make_plating()
return ChangeTurf(/turf/simulated/floor/plating/abductor2)
-
/turf/simulated/floor/plating/abductor2
name = "alien plating"
icon_state = "alienplating"
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 1a307361341..f46d81584d7 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -51,6 +51,7 @@
/turf/simulated/floor/beach/water
name = "water"
icon_state = "water"
+ mouse_opacity = 0
/turf/simulated/floor/beach/water/New()
..()
@@ -66,10 +67,3 @@
/turf/simulated/floor/noslip/MakeSlippery()
return
-
-/turf/simulated/floor/silent
- name = "silent floor"
- icon_state = "silent"
- floor_tile = /obj/item/stack/tile/silent
- shoe_running_volume = 0
- shoe_walking_volume = 0
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index f5aa6198467..cbb5647f283 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -10,6 +10,16 @@
if(!broken && !burnt)
icon_state = icon_regular_floor
+/turf/simulated/floor/plasteel/airless
+ name = "airless floor"
+ oxygen = 0.01
+ nitrogen = 0.01
+ temperature = TCMB
+
+/turf/simulated/floor/plasteel/airless/New()
+ ..()
+ name = "floor"
+
/turf/simulated/floor/plasteel/goonplaque
icon_state = "plaque"
name = "Commemorative Plaque"
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index c6b51a05067..1e9d019ac59 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -35,10 +35,10 @@
return 1
else
to_chat(user, "You begin reinforcing the floor... ")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * C.toolspeed, target = src))
if(R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine))
ChangeTurf(/turf/simulated/floor/engine)
- playsound(src, 'sound/items/Deconstruct.ogg', 80, 1)
+ playsound(src, C.usesound, 80, 1)
R.use(2)
to_chat(user, "You reinforce the floor. ")
return 1
@@ -59,7 +59,7 @@
if( welder.isOn() && (broken || burnt) )
if(welder.remove_fuel(0,user))
to_chat(user, "You fix some dents on the broken plating. ")
- playsound(src, 'sound/items/Welder.ogg', 80, 1)
+ playsound(src, welder.usesound, 80, 1)
icon_state = icon_plating
burnt = 0
broken = 0
@@ -76,16 +76,11 @@
..()
name = "plating"
-/turf/simulated/floor/plating/airless/catwalk
- icon = 'icons/turf/catwalks.dmi'
- icon_state = "Floor3"
- name = "catwalk"
- desc = "Cats really don't like these things."
-
/turf/simulated/floor/engine
name = "reinforced floor"
icon_state = "engine"
thermal_conductivity = 0.025
+ var/insulated
heat_capacity = 325000
floor_tile = /obj/item/stack/rods
@@ -100,18 +95,28 @@
..()
return //unplateable
-/turf/simulated/floor/engine/attackby(obj/item/weapon/C as obj, mob/user as mob, params)
+/turf/simulated/floor/engine/attackby(obj/item/C as obj, mob/user as mob, params)
if(!C || !user)
return
if(istype(C, /obj/item/weapon/wrench))
to_chat(user, "You begin removing rods... ")
- playsound(src, 'sound/items/Ratchet.ogg', 80, 1)
- if(do_after(user, 30, target = src))
+ playsound(src, C.usesound, 80, 1)
+ if(do_after(user, 30 * C.toolspeed, target = src))
if(!istype(src, /turf/simulated/floor/engine))
return
new /obj/item/stack/rods(src, 2)
ChangeTurf(/turf/simulated/floor/plating)
return
+ if(istype(C, /obj/item/stack/sheet/plasteel) && !insulated) //Insulating the floor
+ to_chat(user, "You begin insulating [src]... ")
+ if(do_after(user, 40, target = src) && !insulated) //You finish insulating the insulated insulated insulated insulated insulated insulated insulated insulated vacuum floor
+ to_chat(user, "You finish insulating [src]. ")
+ var/obj/item/stack/sheet/plasteel/W = C
+ W.use(1)
+ thermal_conductivity = 0
+ insulated = 1
+ name = "insulated " + name
+ return
/turf/simulated/floor/engine/ex_act(severity,target)
switch(severity)
@@ -167,7 +172,17 @@
nitrogen = 0
temperature = TCMB
+/turf/simulated/floor/engine/insulated
+ name = "insulated reinforced floor"
+ icon_state = "engine"
+ insulated = 1
+ thermal_conductivity = 0
+/turf/simulated/floor/engine/insulated/vacuum
+ name = "insulated vacuum floor"
+ icon_state = "engine"
+ oxygen = 0
+ nitrogen = 0
/turf/simulated/floor/plating/ironsand/New()
..()
@@ -228,8 +243,8 @@
if(istype(C, /obj/item/stack/rods))
return 1
else if(istype(C, /obj/item/stack/tile))
- return 1
-
+ return 1
+
if(..())
return 1
@@ -242,7 +257,7 @@
if(istype(T, /turf/simulated/floor/plating/airless/catwalk))
var/turf/simulated/floor/plating/airless/catwalk/CW=T
CW.update_icon(0)
- playsound(src, 'sound/items/Screwdriver.ogg', 80, 1)
+ playsound(src, C.usesound, 80, 1)
/turf/simulated/floor/plating/metalfoam
name = "foamed metal plating"
@@ -294,16 +309,6 @@
/turf/simulated/floor/plating/metalfoam/proc/smash()
ChangeTurf(/turf/space)
-/turf/simulated/floor/plasteel/airless
- name = "airless floor"
- oxygen = 0.01
- nitrogen = 0.01
- temperature = TCMB
-
-/turf/simulated/floor/plasteel/airless/New()
- ..()
- name = "floor"
-
/turf/simulated/floor/plating/abductor
name = "alien floor"
icon_state = "alienpod1"
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index cb7cd8be813..aac7d370e21 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -25,6 +25,8 @@
var/engraving, engraving_quality //engraving on the wall
var/sheet_type = /obj/item/stack/sheet/metal
+ var/sheet_amount = 2
+ var/girder_type = /obj/structure/girder
var/obj/item/stack/sheet/builtin_sheet = null
canSmoothWith = list(
@@ -139,13 +141,11 @@
ChangeTurf(/turf/simulated/floor/plating)
/turf/simulated/wall/proc/break_wall()
- builtin_sheet.amount = 2
- builtin_sheet.loc = src
- return (new /obj/structure/girder(src))
+ new sheet_type(src, sheet_amount)
+ return new girder_type(src)
/turf/simulated/wall/proc/devastate_wall()
- builtin_sheet.amount = 2
- builtin_sheet.loc = src
+ new sheet_type(src, sheet_amount)
new /obj/item/stack/sheet/metal(src)
/turf/simulated/wall/ex_act(severity)
@@ -225,7 +225,7 @@
take_damage(rand(25, 75))
return
- to_chat(M, "\blue You push the wall but nothing happens!")
+ to_chat(M, "You push the wall but nothing happens! ")
return
/turf/simulated/wall/attack_hand(mob/user as mob)
@@ -272,7 +272,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "You burn away the fungi with \the [WT]. ")
- playsound(src, 'sound/items/Welder.ogg', 10, 1)
+ playsound(src, WT.usesound, 10, 1)
for(var/obj/effect/overlay/wall_rot/WR in src)
qdel(WR)
rotting = 0
@@ -300,7 +300,7 @@
EB.spark_system.start()
to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites! ")
playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src, EB.usesound, 50, 1)
thermitemelt(user)
return
@@ -317,16 +317,16 @@
if(WT.remove_fuel(0,user))
if(response == "Repair")
to_chat(user, "You start repairing the damage to [src]. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn())
+ playsound(src, WT.usesound, 100, 1)
+ if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You finish repairing the damage to [src]. ")
take_damage(-damage)
else if(response == "Dismantle")
to_chat(user, "You begin slicing through the outer plating. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 100, target = src) && WT && WT.isOn())
+ if(do_after(user, 100 * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You remove the outer plating. ")
dismantle_wall()
@@ -341,9 +341,9 @@
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
to_chat(user, "You begin slicing through the outer plating. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 * W.toolspeed : 60 * W.toolspeed, target = src))
to_chat(user, "You remove the outer plating. ")
dismantle_wall()
visible_message("[user] slices apart \the [src]! ","You hear metal being sliced apart. ")
@@ -353,7 +353,7 @@
to_chat(user, "You begin to drill though the wall. ")
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 480 * W.toolspeed : 240 * W.toolspeed, target = src)) // Diamond pickaxe has 0.25 toolspeed, so 120/60
to_chat(user, "Your drill tears though the last of the reinforced plating. ")
dismantle_wall()
visible_message("[user] drills through \the [src]! ","You hear the grinding of metal. ")
@@ -362,8 +362,8 @@
to_chat(user, "You begin to disintegrates the wall. ")
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 60 : 30, target = src))
- to_chat(user, "Your jackhammer disintegrate the reinforced plating. ")
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 600 * W.toolspeed : 300 * W.toolspeed, target = src)) // Jackhammer has 0.1 toolspeed, so 60/30
+ to_chat(user, "Your sonic jackhammer disintegrate the reinforced plating. ")
dismantle_wall()
visible_message("[user] disintegrates \the [src]! ","You hear the grinding of metal. ")
@@ -374,10 +374,10 @@
to_chat(user, "You stab \the [EB] into the wall and begin to slice it apart. ")
playsound(src, "sparks", 50, 1)
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 140 : 70, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 140 * EB.toolspeed : 70 * EB.toolspeed, target = src))
EB.spark_system.start()
playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src, EB.usesound, 50, 1)
dismantle_wall(1)
visible_message("[user] slices apart \the [src]! ","You hear metal being sliced apart and sparks flying. ")
@@ -398,12 +398,12 @@
playsound(get_turf(src), 'sound/weapons/circsawhit.ogg', 50, 1)
user.visible_message( \
"[user] starts drilling a hole in \the [src].", \
- "\blue You start drilling a hole in \the [src].", \
+ "You start drilling a hole in \the [src]. ", \
"You hear ratchet.")
- if(do_after(user, 80, target = src))
+ if(do_after(user, 80 * W.toolspeed, target = src))
user.visible_message( \
"[user] drills a hole in \the [src] and pushes \a [P] into the void", \
- "\blue You have finished drilling in \the [src] and push the [P] into the void.", \
+ "You have finished drilling in \the [src] and push the [P] into the void. ", \
"You hear ratchet.")
user.drop_item()
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 914cb8973c8..76323f3e2e1 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -101,9 +101,8 @@
..()
/turf/simulated/wall/mineral/plasma/proc/PlasmaBurn(temperature)
- spawn(2)
- new /obj/structure/girder(src)
- src.ChangeTurf(/turf/simulated/floor)
+ new girder_type(src)
+ ChangeTurf(/turf/simulated/floor)
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 400)
/turf/simulated/wall/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)//Doesn't fucking work because walls don't interact with air :(
@@ -145,6 +144,7 @@
icon = 'icons/turf/walls/iron_wall.dmi'
icon_state = "iron"
sheet_type = /obj/item/stack/rods
+ sheet_amount = 5
canSmoothWith = list(/turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron)
/turf/simulated/wall/mineral/abductor
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index da77242a276..d0b0a3c8960 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -1,11 +1,14 @@
/turf/simulated/wall/cult
- name = "wall"
- desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick"
+ name = "runed metal wall"
+ desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound."
icon = 'icons/turf/walls/cult_wall.dmi'
icon_state = "cult"
builtin_sheet = null
canSmoothWith = null
smooth = SMOOTH_FALSE
+ sheet_type = /obj/item/stack/sheet/runed_metal
+ sheet_amount = 1
+ girder_type = /obj/structure/girder/cult
/turf/simulated/wall/cult/New()
..()
@@ -17,17 +20,18 @@
name = "runed stone wall"
desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound."
+/turf/simulated/wall/cult/artificer/break_wall()
+ new /obj/effect/overlay/temp/cult/turf(get_turf(src))
+ return null //excuse me we want no runed metal here
+
+/turf/simulated/wall/cult/artificer/devastate_wall()
+ new /obj/effect/overlay/temp/cult/turf(get_turf(src))
/turf/simulated/wall/cult/narsie_act()
return
-/turf/simulated/wall/cult/break_wall()
- new /obj/effect/decal/cleanable/blood(src)
- return (new /obj/structure/cultgirder(src))
-
/turf/simulated/wall/cult/devastate_wall()
- new /obj/effect/decal/cleanable/blood(src)
- new /obj/effect/decal/remains/human(src)
+ new sheet_type(get_turf(src), sheet_amount)
/turf/simulated/wall/rust
name = "rusted wall"
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 49cfa1ace0f..e462a1d77f8 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -1,6 +1,6 @@
/turf/simulated/wall/r_wall
name = "reinforced wall"
- desc = "A huge chunk of reinforced metal used to seperate rooms."
+ desc = "A huge chunk of reinforced metal used to separate rooms."
icon = 'icons/turf/walls/reinforced_wall.dmi'
icon_state = "r_wall"
opacity = 1
@@ -10,39 +10,59 @@
max_temperature = 6000
hardness = 10
sheet_type = /obj/item/stack/sheet/plasteel
-
- var/d_state = 0
+ sheet_amount = 1
+ girder_type = /obj/structure/girder/reinforced
+ var/d_state = RWALL_INTACT
var/can_be_reinforced = 1
-/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params)
+/turf/simulated/wall/r_wall/examine(mob/user)
+ ..()
+ switch(d_state)
+ if(RWALL_INTACT)
+ to_chat(user, "The outer grille is fully intact. ")
+ if(RWALL_SUPPORT_LINES)
+ to_chat(user, "The outer grille has been cut, and the support lines are screwed securely to the outer cover. ")
+ if(RWALL_COVER)
+ to_chat(user, "The support lines have been unscrewed , and the metal cover is welded firmly in place. ")
+ if(RWALL_CUT_COVER)
+ to_chat(user, "The metal cover has been sliced through , and is connected loosely to the girder. ")
+ if(RWALL_BOLTS)
+ to_chat(user, "The outer cover has been pried away , and the bolts anchoring the support rods are wrenched in place. ")
+ if(RWALL_SUPPORT_RODS)
+ to_chat(user, "The bolts anchoring the support rods have been loosened , but are still welded firmly to the girder. ")
+ if(RWALL_SHEATH)
+ to_chat(user, "The support rods have been sliced through , and the outer sheath is connected loosely to the girder. ")
+
+/turf/simulated/wall/r_wall/attackby(obj/item/W, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
if(!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this! ")
return
//get the user's location
- if( !istype(user.loc, /turf) ) return //can't do this stuff whilst inside objects and such
+ if(!isturf(user.loc))
+ return //can't do this stuff whilst inside objects and such
if(rotting)
- if(istype(W, /obj/item/weapon/weldingtool) )
+ if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
+ if(WT.remove_fuel(0,user))
to_chat(user, "You burn away the fungi with \the [WT]. ")
- playsound(src, 'sound/items/Welder.ogg', 10, 1)
+ playsound(src, WT.usesound, 10, 1)
for(var/obj/effect/overlay/wall_rot/WR in src)
qdel(WR)
rotting = 0
return
else if(!is_sharp(W) && W.force >= 10 || W.force >= 20)
to_chat(user, "\The [src] crumbles away under the force of your [W.name]. ")
- src.dismantle_wall()
+ dismantle_wall()
return
//THERMITE related stuff. Calls src.thermitemelt() which handles melting simulated walls and the relevant effects
- if( thermite )
- if( istype(W, /obj/item/weapon/weldingtool) )
+ if(thermite)
+ if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
- if( WT.remove_fuel(0,user) )
+ if(WT.remove_fuel(0,user))
thermitemelt(user)
return
@@ -50,13 +70,13 @@
thermitemelt(user)
return
- else if( istype(W, /obj/item/weapon/melee/energy/blade) )
+ else if(istype(W, /obj/item/weapon/melee/energy/blade))
var/obj/item/weapon/melee/energy/blade/EB = W
EB.spark_system.start()
to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites! ")
playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src, EB.usesound, 50, 1)
thermitemelt(user)
return
@@ -65,12 +85,12 @@
to_chat(user, "This wall is too thick to slice through. You will need to find a different path. ")
return
- if(damage && istype(W, /obj/item/weapon/weldingtool))
+ if(damage && iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "You start repairing the damage to [src]. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn())
+ playsound(src, WT.usesound, 100, 1)
+ if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You finish repairing the damage to [src]. ")
take_damage(-damage)
return
@@ -81,46 +101,47 @@
//DECONSTRUCTION
switch(d_state)
- if(0)
- if(istype(W, /obj/item/weapon/wirecutters))
- playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
- d_state = 1
+ if(RWALL_INTACT)
+ if(iswirecutter(W))
+ playsound(src, W.usesound, 100, 1)
+ d_state = RWALL_SUPPORT_LINES
update_icon()
new /obj/item/stack/rods(src)
to_chat(user, "You cut the outer grille. ")
return
- if(1)
- if(istype(W, /obj/item/weapon/screwdriver))
- to_chat(user, "You begin removing the support lines. ")
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ if(RWALL_SUPPORT_LINES)
+ if(isscrewdriver(W))
+ to_chat(user, "You begin unsecuring the support lines... ")
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40, target = src) && d_state == 1)
- d_state = 2
+ if(do_after(user, 40 * W.toolspeed, target = src) && d_state == RWALL_SUPPORT_LINES)
+ d_state = RWALL_COVER
update_icon()
- to_chat(user, "You remove the support lines. ")
+ to_chat(user, "You unsecure the support lines. ")
return
//REPAIRING (replacing the outer grille for cosmetic damage)
else if(istype(W, /obj/item/stack/rods))
var/obj/item/stack/O = W
if(O.use(1))
- d_state = 0
+ d_state = RWALL_INTACT
+ update_icon()
+ icon_state = "r_wall"
update_icon()
- src.icon_state = "r_wall"
to_chat(user, "You replace the outer grille. ")
else
to_chat(user, "You don't have enough rods for that! ")
- if(2)
- if(istype(W, /obj/item/weapon/weldingtool))
+ if(RWALL_COVER)
+ if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
- to_chat(user, "You begin slicing through the metal cover. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ to_chat(user, "You begin slicing through the metal cover... ")
+ playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 60, target = src) && d_state == 2)
- d_state = 3
+ if(do_after(user, 60 * WT.toolspeed, target = src) && d_state == RWALL_COVER)
+ d_state = RWALL_CUT_COVER
update_icon()
to_chat(user, "You press firmly on the cover, dislodging it. ")
@@ -129,70 +150,112 @@
return
if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
- to_chat(user, "You begin slicing through the metal cover. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ to_chat(user, "You begin slicing through the metal cover... ")
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40, target = src) && d_state == 2)
- d_state = 3
+ if(do_after(user, 40 * W.toolspeed, target = src) && d_state == RWALL_COVER)
+ d_state = RWALL_CUT_COVER
update_icon()
to_chat(user, "You press firmly on the cover, dislodging it. ")
return
- if(3)
- if(istype(W, /obj/item/weapon/crowbar))
- to_chat(user, "You struggle to pry off the cover. ")
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ if(isscrewdriver(W))
+ to_chat(user, "You begin securing the support lines... ")
+ playsound(src, W.usesound, 100, 1)
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!istype(src, /turf/simulated/wall/r_wall) || !W || d_state != RWALL_COVER)
+ return 1
+ d_state = RWALL_SUPPORT_LINES
+ update_icon()
+ to_chat(user, "The support lines have been secured. ")
+ return 1
- if(do_after(user, 100, target = src) && d_state == 3)
- d_state = 4
+ if(RWALL_CUT_COVER)
+ if(iscrowbar(W))
+ to_chat(user, "You struggle to pry off the cover... ")
+ playsound(src, W.usesound, 100, 1)
+
+ if(do_after(user, 100 * W.toolspeed, target = src) && d_state == RWALL_CUT_COVER)
+ d_state = RWALL_BOLTS
update_icon()
to_chat(user, "You pry off the cover. ")
return
- if(4)
- if(istype(W, /obj/item/weapon/wrench))
- to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame. ")
- playsound(src, 'sound/items/Ratchet.ogg', 100, 1)
+ if(iswelder(W))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0,user))
+ to_chat(user, "You begin welding the metal cover back to the frame... ")
+ playsound(src, WT.usesound, 100, 1)
+ if(do_after(user, 60*WT.toolspeed, target = src))
+ if(!istype(src, /turf/simulated/wall/r_wall) || !WT || !WT.isOn() || d_state != RWALL_CUT_COVER)
+ return 1
+ d_state = RWALL_COVER
+ update_icon()
+ to_chat(user, "The metal cover has been welded securely to the frame. ")
+ return 1
- if(do_after(user, 40, target = src) && d_state == 4)
- d_state = 5
+ if(RWALL_BOLTS)
+ if(iswrench(W))
+ to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame... ")
+ playsound(src, W.usesound, 100, 1)
+
+ if(do_after(user, 40 * W.toolspeed, target = src) && d_state == RWALL_BOLTS)
+ d_state = RWALL_SUPPORT_RODS
update_icon()
to_chat(user, "You remove the bolts anchoring the support rods. ")
return
- if(5)
- if(istype(W, /obj/item/weapon/weldingtool))
+ if(iscrowbar(W))
+ to_chat(user, "You start to pry the cover back into place... ")
+ playsound(src, W.usesound, 100, 1)
+ if(do_after(user, 20*W.toolspeed, target = src))
+ if(!istype(src, /turf/simulated/wall/r_wall) || !W || d_state != RWALL_BOLTS)
+ return 1
+ d_state = RWALL_CUT_COVER
+ update_icon()
+ to_chat(user, "The metal cover has been pried back into place. ")
+ return 1
+
+ if(RWALL_SUPPORT_RODS)
+ if(iswelder(W))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
- to_chat(user, "You begin slicing through the support rods. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ to_chat(user, "You begin slicing through the support rods... ")
+ playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 100, target = src) && d_state == 5)
- d_state = 6
+ if(do_after(user, 100 * WT.toolspeed, target = src) && d_state == RWALL_SUPPORT_RODS)
+ d_state = RWALL_SHEATH
update_icon()
- new /obj/item/stack/rods(src)
- to_chat(user, "The support rods drop out as you cut them loose from the frame. ")
else
to_chat(user, "You need more welding fuel to complete this task. ")
return
if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
- to_chat(user, "You begin slicing through the support rods. ")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ to_chat(user, "You begin slicing through the support rods... ")
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 70, target = src) && d_state == 5)
- d_state = 6
+ if(do_after(user, 70 * W.toolspeed, target = src) && d_state == RWALL_SUPPORT_RODS)
+ d_state = RWALL_SHEATH
update_icon()
- new /obj/item/stack/rods( src )
- to_chat(user, "The support rods drop out as you cut them loose from the frame. ")
return
- if(6)
- if(istype(W, /obj/item/weapon/crowbar))
- to_chat(user, "You struggle to pry off the outer sheath. ")
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ if(iswrench(W))
+ to_chat(user, "You start tightening the bolts which secure the support rods to their frame... ")
+ playsound(src, W.usesound, 100, 1)
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!istype(src, /turf/simulated/wall/r_wall) || !W || d_state != RWALL_SUPPORT_RODS)
+ return 1
+ d_state = RWALL_BOLTS
+ update_icon()
+ to_chat(user, "You tighten the bolts anchoring the support rods. ")
+ return 1
- if(do_after(user, 100, target = src) && d_state == 6)
+ if(RWALL_SHEATH)
+ if(iscrowbar(W))
+ to_chat(user, "You struggle to pry off the outer sheath... ")
+ playsound(src, W.usesound, 100, 1)
+
+ if(do_after(user, 100 * W.toolspeed, target = src) && d_state == RWALL_SHEATH)
to_chat(user, "You pry off the outer sheath. ")
dismantle_wall()
return
@@ -201,16 +264,16 @@
//DRILLING
if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill))
- to_chat(user, "You begin to drill though the wall. ")
+ to_chat(user, "You begin to drill though the wall... ")
- if(do_after(user, 200, target = src))
+ if(do_after(user, 800 * W.toolspeed, target = src)) // Diamond drill has 0.25 toolspeed, so 200
to_chat(user, "Your drill tears through the last of the reinforced plating. ")
dismantle_wall()
if(istype(W,/obj/item/weapon/pickaxe/drill/jackhammer))
- to_chat(user, "You begin to disintegrate the wall. ")
+ to_chat(user, "You begin to disintegrate the wall... ")
- if(do_after(user, 100, target = src))
+ if(do_after(user, 1000 * W.toolspeed, target = src)) // Jackhammer has 0.1 toolspeed, so 100
to_chat(user, "Your sonic jackhammer disintegrates the reinforced plating. ")
dismantle_wall()
@@ -218,14 +281,14 @@
else if(istype(W, /obj/item/stack/sheet/metal) && d_state)
var/obj/item/stack/sheet/metal/MS = W
- to_chat(user, "You begin patching-up the wall with \a [MS]. ")
+ to_chat(user, "You begin patching-up the wall with \a [MS]... ")
- if(do_after(user, max(20 * d_state, 100), target = src) && d_state)
+ if(do_after(user, max(20 * d_state, 100) * MS.toolspeed, target = src) && d_state)
if(!MS.use(1))
to_chat(user, "You don't have enough metal for that! ")
return
- d_state = 0
+ d_state = RWALL_INTACT
update_icon()
smooth_icon_neighbors(src)
to_chat(user, "You repair the last of the damage. ")
@@ -236,13 +299,13 @@
if(!can_be_reinforced)
to_chat(user, "The wall is already coated! ")
return
- to_chat(user, "You begin adding an additional layer of coating to the wall with \a [MS]. ")
+ to_chat(user, "You begin adding an additional layer of coating to the wall with \a [MS]... ")
- if(do_after(user, 40, target = src) && !d_state)
+ if(do_after(user, 40 * MS.toolspeed, target = src) && !d_state)
if(!MS.use(2))
to_chat(user, "You don't have enough plasteel for that! ")
return
- to_chat(user, "You add an additional layer of coating to the wall! ")
+ to_chat(user, "You add an additional layer of coating to the wall. ")
ChangeTurf(/turf/simulated/wall/r_wall/coated)
update_icon()
smooth_icon_neighbors(src)
@@ -266,13 +329,13 @@
playsound(get_turf(src), 'sound/weapons/circsawhit.ogg', 50, 1)
user.visible_message( \
- "[user] starts drilling a hole in \the [src].", \
- "\blue You start drilling a hole in \the [src]. This is going to take a while.", \
+ "[user] starts drilling a hole in \the [src]...", \
+ "You start drilling a hole in \the [src]. This is going to take a while. ", \
"You hear ratchet.")
- if(do_after(user, 160, target = src))
+ if(do_after(user, 160 * V.toolspeed, target = src))
user.visible_message( \
- "[user] drills a hole in \the [src] and pushes \a [P] into the void", \
- "\blue You have finished drilling in \the [src] and push the [P] into the void.", \
+ "[user] drills a hole in \the [src] and pushes \a [P] into the void.", \
+ "You have finished drilling in \the [src] and push the [P] into the void. ", \
"You hear ratchet.")
user.drop_item()
@@ -314,3 +377,6 @@
smooth = SMOOTH_TRUE
icon_state = ""
+/turf/simulated/wall/r_wall/devastate_wall()
+ new sheet_type(src, sheet_amount)
+ new /obj/item/stack/sheet/metal(src, 2)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index da667768341..90454f9952b 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -31,6 +31,8 @@
..()
var/datum/space_level/S = space_manager.get_zlev(z)
S.remove_from_transit(src)
+ if(light_sources) // Turn off starlight, if present
+ set_light(0)
/turf/space/AfterChange(ignore_air, keep_cabling = FALSE)
..()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index fa67573307c..a5e4190d6ea 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -4,6 +4,7 @@
luminosity = 1
var/intact = 1
+ var/turf/baseturf = /turf/space
var/slowdown = 0 //negative for faster, positive for slower
//Properties for open tiles (/floor)
@@ -23,8 +24,6 @@
var/PathNode/PNode = null //associated PathNode in the A* algorithm
- var/dynamic_lighting = 1
-
flags = 0
var/image/obscured //camerachunks
@@ -160,10 +159,11 @@
return src
var/old_opacity = opacity
var/old_dynamic_lighting = dynamic_lighting
- var/list/old_affecting_lights = affecting_lights
+ var/old_affecting_lights = affecting_lights
var/old_lighting_overlay = lighting_overlay
var/old_blueprint_data = blueprint_data
var/old_obscured = obscured
+ var/old_corners = corners
BeforeChange()
if(air_master)
@@ -177,16 +177,19 @@
for(var/turf/space/S in range(W,1))
S.update_starlight()
- lighting_overlay = old_lighting_overlay
+ recalc_atom_opacity()
- affecting_lights = old_affecting_lights
- if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting))
- reconsider_lights()
- if(dynamic_lighting != old_dynamic_lighting)
- if(dynamic_lighting)
- lighting_build_overlays()
- else
- lighting_clear_overlays()
+ if(lighting_overlays_initialised)
+ lighting_overlay = old_lighting_overlay
+ affecting_lights = old_affecting_lights
+ corners = old_corners
+ if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting))
+ reconsider_lights()
+ if(dynamic_lighting != old_dynamic_lighting)
+ if(dynamic_lighting)
+ lighting_build_overlay()
+ else
+ lighting_clear_overlay()
obscured = old_obscured
@@ -383,20 +386,25 @@
if(ticker)
cameranet.updateVisibility(src)
-/turf/proc/get_lumcount() //Gets the lighting level of a given turf.
- if(lighting_overlay)
- return lighting_overlay.get_clamped_lum()
- return 1
-
-/turf/attackby(obj/item/C, mob/user, params)
- if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/coil = C
- for(var/obj/structure/cable/LC in src)
- if((LC.d1==0)||(LC.d2==0))
- LC.attackby(C,user)
- return
- coil.place_turf(src, user)
- return 1
+/turf/attackby(obj/item/I, mob/user, params)
+ if(can_lay_cable())
+ if(istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = I
+ for(var/obj/structure/cable/LC in src)
+ if(LC.d1 == 0 || LC.d2==0)
+ LC.attackby(C,user)
+ return
+ C.place_turf(src, user)
+ return 1
+ else if(istype(I, /obj/item/weapon/twohanded/rcl))
+ var/obj/item/weapon/twohanded/rcl/R = I
+ if(R.loaded)
+ for(var/obj/structure/cable/LC in src)
+ if(LC.d1 == 0 || LC.d2==0)
+ LC.attackby(R, user)
+ return
+ R.loaded.place_turf(src, user)
+ R.is_empty(user)
return 0
diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm
index 970467c2ced..104c0996f0d 100644
--- a/code/game/turfs/unsimulated/beach.dm
+++ b/code/game/turfs/unsimulated/beach.dm
@@ -2,7 +2,8 @@
name = "Beach"
icon = 'icons/misc/beach.dmi'
var/water_overlay_image = null
-
+ mouse_opacity = 0
+
/turf/unsimulated/beach/New()
..()
if(water_overlay_image)
@@ -11,7 +12,8 @@
/turf/unsimulated/beach/sand
name = "Sand"
icon_state = "desert"
-
+ mouse_opacity = 1
+
/turf/unsimulated/beach/sand/New() //adds some aesthetic randomness to the beach sand
icon_state = pick("desert", "desert0", "desert1", "desert2", "desert3", "desert4")
..()
@@ -59,8 +61,7 @@
water_overlay = new(src)
/turf/unsimulated/beach/water/drop/Destroy()
- qdel(water_overlay)
- water_overlay = null
+ QDEL_NULL(water_overlay)
return ..()
/obj/effect/effect/beach_drop_overlay
@@ -99,4 +100,5 @@
icon_state = "desert7"
density = 1
opacity = 1
- explosion_block = 2
\ No newline at end of file
+ explosion_block = 2
+ mouse_opacity = 1
diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm
index 42a8b133a24..82f8c1390b5 100644
--- a/code/game/turfs/unsimulated/walls.dm
+++ b/code/game/turfs/unsimulated/walls.dm
@@ -16,10 +16,10 @@
icon = 'icons/obj/doors/Doorele.dmi'
icon_state = "door_closed"
-turf/unsimulated/wall/splashscreen
+/turf/unsimulated/wall/splashscreen
name = "Space Station 13"
- icon = 'icons/misc/fullscreen.dmi'
- icon_state = "title"
+ icon = 'config/title_screens/images/blank.png'
+ icon_state = ""
layer = FLY_LAYER
/turf/unsimulated/wall/other
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 38abe4b5fd0..28393927f20 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -79,8 +79,24 @@ var/global/admin_ooc_colour = "#b82e00"
else
display_name = holder.fakekey
+ if(!config.disable_ooc_emoji)
+ msg = "[msg] "
+
+ msg = apply_formatting(msg)
+
to_chat(C, "OOC: [display_name]: [msg] ")
+/proc/apply_formatting(message)
+ var/static/regex/italics = new("(?$1")
+ message = strikethrough.Replace(message, "$1 ")
+ message = escape.Replace(message, "$1")//jesus christ, regex
+
+ return message
+
/proc/toggle_ooc()
config.ooc_allowed = ( !config.ooc_allowed )
if(config.ooc_allowed)
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 31c8c322596..481fc73631a 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -77,6 +77,10 @@
if(held_item)
var/damagetype = held_item.suicide_act(src)
if(damagetype)
+ if(damagetype & SHAME)
+ adjustStaminaLoss(200)
+ suiciding = 0
+ return
do_suicide(damagetype, held_item)
return
@@ -162,7 +166,7 @@
card.removePersonality()
var/turf/T = get_turf_or_move(card.loc)
for(var/mob/M in viewers(T))
- M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2)
+ M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\" ", 3, "[src] bleeps electronically. ", 2)
death(0, 1)
else
to_chat(src, "Aborting suicide attempt.")
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 4e822710cd0..dd8123b2876 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -77,9 +77,9 @@
for(var/client/C in admins)
if(check_rights(R_ADMIN, 0, C.mob))
- if(C.holder.fakekey && !check_rights(R_ADMIN, 0)) //Mentors/Mods can't see stealthmins
+ if(C.holder.fakekey && !check_rights(R_ADMIN, 0)) //Mentors can't see stealthmins
continue
-
+
if(C.holder.big_brother && !check_rights(R_PERMISSIONS, 0)) // normal admins can't see BB
continue
@@ -126,5 +126,5 @@
modmsg += "\t[C] is a [C.holder.rank]\n"
num_mods_online++
- msg = "Current Admins ([num_admins_online]): \n" + msg + "\nCurrent Mods/Mentors ([num_mods_online]): \n" + modmsg
+ msg = "Current Admins ([num_admins_online]): \n" + msg + "\nCurrent Mentors ([num_mods_online]): \n" + modmsg
to_chat(src, msg)
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 577d5d5de46..f04f36a7bcc 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -127,7 +127,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
var/sql = "INSERT INTO [format_table_name("ban")] (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
- to_chat(usr, "\blue Ban saved to database.")
+ to_chat(usr, "Ban saved to database. ")
message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
if(announceinirc)
@@ -201,17 +201,17 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
ban_number++;
if(ban_number == 0)
- to_chat(usr, "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.")
+ to_chat(usr, "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin. ")
return
if(ban_number > 1)
- to_chat(usr, "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.")
+ to_chat(usr, "Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin. ")
return
if(istext(ban_id))
ban_id = text2num(ban_id)
if(!isnum(ban_id))
- to_chat(usr, "\red Database update failed due to a ban ID mismatch. Contact the database admin.")
+ to_chat(usr, "Database update failed due to a ban ID mismatch. Contact the database admin. ")
return
DB_ban_unban_by_id(ban_id)
@@ -302,11 +302,11 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
ban_number++;
if(ban_number == 0)
- to_chat(usr, "\red Database update failed due to a ban id not being present in the database.")
+ to_chat(usr, "Database update failed due to a ban id not being present in the database. ")
return
if(ban_number > 1)
- to_chat(usr, "\red Database update failed due to multiple bans having the same ID. Contact the database admin.")
+ to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin. ")
return
if(!src.owner || !istype(src.owner, /client))
@@ -343,7 +343,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
establish_db_connection()
if(!dbcon.IsConnected())
- to_chat(usr, "\red Failed to establish database connection")
+ to_chat(usr, "Failed to establish database connection ")
return
var/output = ""
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index 3d7b11390eb..6c8d642510a 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -15,7 +15,7 @@ world/IsBanned(key,address,computer_id)
//Guest Checking
if(!guests_allowed && IsGuestKey(key))
log_access("Failed Login: [key] [computer_id] [address] - Guests not allowed")
- // message_admins("\blue Failed Login: [key] - Guests not allowed")
+ // message_admins("Failed Login: [key] - Guests not allowed ")
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a BYOND account.")
//check if the IP address is a known Tor node
diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm
index 9ba4ca4eeee..2e8fa4ba04b 100644
--- a/code/modules/admin/NewBan.dm
+++ b/code/modules/admin/NewBan.dm
@@ -172,7 +172,6 @@ var/savefile/Banlist
/datum/admins/proc/unbanpanel()
var/count = 0
var/dat
- //var/dat = "Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total"
Banlist.cd = "/base"
for(var/A in Banlist.dir)
count++
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 88a0c7708f0..6853baf0755 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -614,6 +614,19 @@ var/global/nologevent = 0
message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1)
feedback_add_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/admins/proc/toggleemoji()
+ set category = "Server"
+ set desc = "Toggle OOC Emoji"
+ set name = "Toggle OOC Emoji"
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ config.disable_ooc_emoji = !(config.disable_ooc_emoji)
+ log_admin("[key_name(usr)] toggled OOC Emoji.")
+ message_admins("[key_name_admin(usr)] toggled OOC Emoji.", 1)
+ feedback_add_details("admin_verb", "TEMOJ")
+
/datum/admins/proc/startnow()
set category = "Server"
set desc="Start the round RIGHT NOW"
@@ -794,7 +807,8 @@ var/global/nologevent = 0
var/turf/T = get_turf(usr.loc)
T.ChangeTurf(chosen)
else
- new chosen(usr.loc)
+ var/atom/A = new chosen(usr.loc)
+ A.admin_spawned = TRUE
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
feedback_add_details("admin_verb","SA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -830,8 +844,8 @@ var/global/nologevent = 0
to_chat(world, "Guests may no longer enter the game. ")
else
to_chat(world, "Guests may now enter the game. ")
- log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.")
- message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1)
+ log_admin("[key_name(usr)] toggled guests game entering [guests_allowed ? "" : "dis"]allowed.")
+ message_admins("[key_name_admin(usr)] toggled guests game entering [guests_allowed ? "" : "dis"]allowed. ", 1)
feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/output_ai_laws()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index c56b3c7404f..d6a5ede9ed8 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -2,7 +2,9 @@
var/list/admin_verbs_default = list(
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
- /client/proc/cmd_mentor_check_new_players
+ /client/proc/toggleadminhelpsound, /*toggles whether we hear bwoinks*/
+ /client/proc/cmd_mentor_check_new_players,
+ /client/proc/cmd_mentor_check_player_exp /* shows players by playtime */
)
var/list/admin_verbs_admin = list(
/client/proc/check_antagonists, /*shows all antags*/
@@ -48,6 +50,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/togglelooc, /*toggles looc on/off for everyone*/
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
/datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
+ /datum/admins/proc/toggleemoji, /*toggles using emoji in ooc for everyone*/
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
/datum/admins/proc/PlayerNotes,
@@ -74,8 +77,8 @@ var/list/admin_verbs_admin = list(
/client/proc/debug_variables,
/client/proc/show_snpc_verbs,
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
- /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */
- /client/proc/toggle_mentor_chat
+ /client/proc/toggle_mentor_chat,
+ /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -86,7 +89,8 @@ var/list/admin_verbs_sounds = list(
/client/proc/play_local_sound,
/client/proc/play_sound,
/client/proc/play_server_sound,
- /client/proc/play_intercomm_sound
+ /client/proc/play_intercomm_sound,
+ /client/proc/stop_global_admin_sounds
)
var/list/admin_verbs_event = list(
/client/proc/object_talk,
@@ -109,7 +113,8 @@ var/list/admin_verbs_event = list(
/client/proc/response_team, // Response Teams admin verb
/client/proc/cmd_admin_create_centcom_report,
/client/proc/fax_panel,
- /client/proc/event_manager_panel
+ /client/proc/event_manager_panel,
+ /client/proc/modify_goals
)
var/list/admin_verbs_spawn = list(
@@ -152,7 +157,7 @@ var/list/admin_verbs_debug = list(
/client/proc/enable_debug_verbs,
/client/proc/toggledebuglogs,
/client/proc/qdel_toggle,
- /client/proc/gc_dump_hdl,
+ /client/proc/cmd_display_del_log,
/client/proc/debugNatureMapGenerator,
/client/proc/check_bomb_impacts,
/client/proc/test_movable_UI,
@@ -163,7 +168,9 @@ var/list/admin_verbs_debug = list(
/client/proc/map_template_upload,
/client/proc/view_runtimes,
/client/proc/admin_serialize,
- /client/proc/admin_deserialize
+ /client/proc/admin_deserialize,
+ /client/proc/jump_to_ruin,
+ /client/proc/toggle_medal_disable
)
var/list/admin_verbs_possess = list(
/proc/possess,
@@ -195,7 +202,8 @@ var/list/admin_verbs_mod = list(
var/list/admin_verbs_mentor = list(
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
- /client/proc/cmd_admin_pm_by_key_panel /*admin-pm list by key*/
+ /client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
+ /client/proc/cmd_mentor_say /* mentor say*/
// cmd_mentor_say is added/removed by the toggle_mentor_chat verb
)
var/list/admin_verbs_proccall = list(
@@ -210,6 +218,10 @@ var/list/admin_verbs_snpc = list(
/client/proc/hide_snpc_verbs
)
+/client/proc/on_holder_add()
+ if(chatOutput && chatOutput.loaded)
+ chatOutput.loadAdmin()
+
/client/proc/add_admin_verbs()
if(holder)
verbs += admin_verbs_default
@@ -543,7 +555,7 @@ var/list/admin_verbs_snpc = list(
var/turf/epicenter = mob.loc
var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb")
- var/choice = input("What size explosion would you like to produce?") in choices
+ var/choice = input("What size explosion would you like to produce?") as null|anything in choices
switch(choice)
if(null)
return 0
@@ -622,7 +634,7 @@ var/list/admin_verbs_snpc = list(
for(var/mob/V in hearers(O))
V.show_message(message, 2)
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
- message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
+ message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound ")
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/togglebuildmodeself()
@@ -670,7 +682,7 @@ var/list/admin_verbs_snpc = list(
to_chat(usr, "Disabled air processing. ")
feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] used 'kill air'.")
- message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1)
+ message_admins("[key_name_admin(usr)] used 'kill air'. ", 1)
/client/proc/deadmin_self()
set name = "De-admin self"
@@ -962,20 +974,33 @@ var/list/admin_verbs_snpc = list(
set name = "Show SNPC Verbs"
set category = "Admin"
- if(!holder)
+ if(!check_rights(R_ADMIN))
return
verbs += admin_verbs_snpc
verbs -= /client/proc/show_snpc_verbs
- to_chat(src, "SNPC verbs on. ")
+ to_chat(src, "SNPC verbs have been toggled on. ")
/client/proc/hide_snpc_verbs()
set name = "Hide SNPC Verbs"
set category = "Admin"
- if(!holder)
+ if(!check_rights(R_ADMIN))
return
verbs -= admin_verbs_snpc
verbs += /client/proc/show_snpc_verbs
- to_chat(src, "SNPC verbs off. ")
+ to_chat(src, "SNPC verbs have been toggled off. ")
+
+/client/proc/toggle_advanced_interaction()
+ set name = "Toggle Advanced Admin Interaction"
+ set category = "Admin"
+ set desc = "Allows you to interact with atoms such as buttons and doors, on top of regular machinery interaction."
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ advanced_admin_interaction = !advanced_admin_interaction
+
+ log_admin("[key_name(usr)] has [advanced_admin_interaction ? "activated" : "deactivated"] their advanced admin interaction.")
+ message_admins("[key_name_admin(usr)] has [advanced_admin_interaction ? "activated" : "deactivated"] their advanced admin interaction.")
diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm
index f95d5094446..3dffd403caf 100644
--- a/code/modules/admin/banjob.dm
+++ b/code/modules/admin/banjob.dm
@@ -140,3 +140,43 @@ DEBUG
jobban_savebanfile()
return 1
return 0
+
+/mob/verb/displayjobbans()
+ set category = "OOC"
+ set name = "Display Current Jobbans"
+ set desc = "Displays all of your current jobbans."
+
+ if(!client || !ckey)
+ return
+ if(config.ban_legacy_system)
+ //using the legacy .txt ban system
+ to_chat(src, "The server is using the legacy ban system. Ask an administrator for help!")
+
+ else
+ //using the SQL ban system
+ var/is_actually_banned = FALSE
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT bantime, bantype, reason, job, duration, expiration_time, a_ckey FROM [format_table_name("ban")] WHERE ckey like '[ckey]' AND ((bantype like 'JOB_TEMPBAN' AND expiration_time > Now()) OR (bantype like 'JOB_PERMABAN')) AND isnull(unbanned) ORDER BY bantime DESC LIMIT 100")
+ select_query.Execute()
+
+ while(select_query.NextRow())
+
+ var/bantime = select_query.item[1]
+ var/bantype = select_query.item[2]
+ var/reason = select_query.item[3]
+ var/job = select_query.item[4]
+ var/duration = select_query.item[5]
+ var/expiration = select_query.item[6]
+ var/ackey = select_query.item[7]
+
+ if(bantype == "JOB_PERMABAN")
+ to_chat(src, "[bantype]: [job] - REASON: [reason], by [ackey]; [bantime] ")
+ else if(bantype == "JOB_TEMPBAN")
+ to_chat(src, "[bantype]: [job] - REASON: [reason], by [ackey]; [bantime]; [duration]; expires [expiration] ")
+
+ is_actually_banned = TRUE
+
+ if(is_actually_banned)
+ if(config.banappeals)
+ to_chat(src, "You can appeal the bans at: [config.banappeals] ")
+ else
+ to_chat(src, "You have no active jobbans! ")
diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm
index 3acc106b907..f246357e472 100644
--- a/code/modules/admin/buildmode.dm
+++ b/code/modules/admin/buildmode.dm
@@ -95,6 +95,7 @@
cl.images -= I
cl = null
qdel(I)
+ return ..()
/obj/effect/buildmode_line
var/image/I
@@ -122,8 +123,7 @@
if(istype(cl))
cl.images -= I
cl = null
- qdel(I)
- I = null
+ QDEL_NULL(I)
return ..()
/datum/click_intercept
@@ -138,8 +138,8 @@
holder.screen += buttons
/datum/click_intercept/Destroy()
- for(var/button in buttons)
- qdel(button)
+ QDEL_LIST(buttons)
+ return ..()
/datum/click_intercept/proc/create_buttons()
@@ -191,7 +191,7 @@
Reset()
areaimage.loc = null
qdel(areaimage)
- ..()
+ return ..()
/datum/click_intercept/buildmode/create_buttons()
buttons += new /obj/screen/buildmode/mode(src)
@@ -447,7 +447,7 @@
new/obj/machinery/door/airlock(get_turf(object))
else if(istype(object,/turf) && ctrl_click && left_click)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
- WIN.set_dir(build_dir)
+ WIN.setDir(build_dir)
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
if(ADV_BUILDMODE)
@@ -458,7 +458,7 @@
T.ChangeTurf(objholder)
else
var/obj/A = new objholder (get_turf(object))
- A.set_dir(build_dir)
+ A.setDir(build_dir)
log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [build_dir]")
else if(right_click)
if(isobj(object))
@@ -547,7 +547,7 @@
T.ChangeTurf(objholder)
else
var/obj/A = new objholder(T)
- A.set_dir(build_dir)
+ A.setDir(build_dir)
deselect_region()
return
diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm
index 9baa17b73ad..1239bfd993a 100644
--- a/code/modules/admin/create_poll.dm
+++ b/code/modules/admin/create_poll.dm
@@ -1,162 +1,202 @@
/client/proc/create_poll()
set name = "Create Server Poll"
set category = "Server"
- if(!check_rights(R_PERMISSIONS))
+ if(!check_rights(R_SERVER))
return
if(!dbcon.IsConnected())
to_chat(src, "Failed to establish database connection. ")
return
- var/returned = create_poll_function()
- if(returned)
- var/DBQuery/query_check_option = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE pollid = [returned]")
- if(!query_check_option.Execute())
- var/err = query_check_option.ErrorMsg()
- log_game("SQL ERROR obtaining id from poll_option table. Error : \[[err]\]\n")
- return
- if(query_check_option.NextRow())
- var/DBQuery/query_log_get = dbcon.NewQuery("SELECT polltype, question, adminonly FROM [format_table_name("poll_question")] WHERE id = [returned]")
- if(!query_log_get.Execute())
- var/err = query_log_get.ErrorMsg()
- log_game("SQL ERROR obtaining polltype, question, adminonly from poll_question table. Error : \[[err]\]\n")
- return
- if(query_log_get.NextRow())
- var/polltype = query_log_get.item[1]
- var/question = query_log_get.item[2]
- var/adminonly = query_log_get.item[3]
- log_admin("[key_name(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]")
- message_admins("[key_name_admin(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] Question: [question]")
- else
- to_chat(src, "Poll question created without any options, poll will be deleted.")
- var/DBQuery/query_del_poll = dbcon.NewQuery("DELETE FROM [format_table_name("poll_question")] WHERE id = [returned]")
- if(!query_del_poll.Execute())
- var/err = query_del_poll.ErrorMsg()
- log_game("SQL ERROR deleting poll question [returned]. Error : \[[err]\]\n")
- return
+ create_poll_window()
-/client/proc/create_poll_function()
- if(!check_rights(R_PERMISSIONS))
+/client/proc/create_poll_window(var/errormessage = "")
+ if(!check_rights(R_SERVER))
+ return
+ var/output={"
+
+
+
+
+
+ Create Player Poll
+ [errormessage]
+
+
+"}
+ src << browse(output, "window=createplayerpoll;size=950x500")
+
+/client/proc/create_poll_function(href_list)
+ if(!check_rights(R_SERVER))
+ return
+ var/polltype = href_list["createpoll"]
+ if(polltype != POLLTYPE_OPTION && polltype != POLLTYPE_TEXT && polltype != POLLTYPE_RATING && polltype != POLLTYPE_MULTI)
+ create_poll_window("Invalid poll type ")
return
- var/polltype = input("Choose poll type.","Poll Type") in list("Single Option","Text Reply","Rating","Multiple Choice")
var/choice_amount = 0
- switch(polltype)
- if("Single Option")
- polltype = POLLTYPE_OPTION
- if("Text Reply")
- polltype = POLLTYPE_TEXT
- if("Rating")
- polltype = POLLTYPE_RATING
- if("Multiple Choice")
- polltype = POLLTYPE_MULTI
- choice_amount = input("How many choices should be allowed?","Select choice amount") as num|null
- if(!choice_amount)
- return
- var/starttime = SQLtime()
- var/endtime = input("Set end time for poll as format YYYY-MM-DD HH:MM:SS. All times in server time. HH:MM:SS is optional and 24-hour. Must be later than starting time for obvious reasons.", "Set end time", SQLtime()) as text
- if(!endtime)
- return
- endtime = sanitizeSQL(endtime)
- var/DBQuery/query_validate_time = dbcon.NewQuery("SELECT STR_TO_DATE('[endtime]','%Y-%c-%d %T')")
- if(!query_validate_time.Execute())
- var/err = query_validate_time.ErrorMsg()
- log_game("SQL ERROR validating endtime. Error : \[[err]\]\n")
- return
- if(query_validate_time.NextRow())
- endtime = query_validate_time.item[1]
- if(!endtime)
- to_chat(src, "Datetime entered is invalid.")
+ if(polltype == POLLTYPE_MULTI)
+ choice_amount = text2num(href_list["choiceamount"])
+ if(!isnum(choice_amount) || choice_amount < 1)
+ create_poll_window("Invalid choice amount. Must be at least 1. ")
return
- var/DBQuery/query_time_later = dbcon.NewQuery("SELECT TIMESTAMP('[endtime]') < NOW()")
- if(!query_time_later.Execute())
- var/err = query_time_later.ErrorMsg()
- log_game("SQL ERROR comparing endtime to NOW(). Error : \[[err]\]\n")
+ var/poll_len = text2num(href_list["createpollduration"])
+ if(!isnum(poll_len) || poll_len < 1)
+ create_poll_window("Invalid poll duration. Must be at least 1. ")
return
- if(query_time_later.NextRow())
- var/checklate = text2num(query_time_later.item[1])
- if(checklate)
- to_chat(src, "Datetime entered is not later than current server time.")
- return
- var/adminonly
- switch(alert("Admin only poll?",,"Yes","No","Cancel"))
- if("Yes")
- adminonly = 1
- if("No")
- adminonly = 0
- else
- return
+ var/adminonly = text2num(href_list["createpolladminonly"]) ? 1 : 0
var/sql_ckey = sanitizeSQL(ckey)
- var/question = input("Write your question","Question") as message|null
+ var/question = href_list["createpollquestion"]
if(!question)
+ create_poll_window("Question cannot be blank. ")
return
question = sanitizeSQL(question)
- var/DBQuery/query_polladd_question = dbcon.NewQuery("INSERT INTO [format_table_name("poll_question")] (polltype, starttime, endtime, question, adminonly, multiplechoiceoptions, createdby_ckey, createdby_ip) VALUES ('[polltype]', '[starttime]', '[endtime]', '[question]', '[adminonly]', '[choice_amount]', '[sql_ckey]', '[address]')")
- if(!query_polladd_question.Execute())
- var/err = query_polladd_question.ErrorMsg()
+
+ var/starttime
+ var/endtime
+ var/DBQuery/query = dbcon.NewQuery("SELECT Now() AS starttime, ADDDATE(Now(), INTERVAL [poll_len] DAY) AS endtime")
+ query.Execute()
+ while(query.NextRow())
+ starttime = query.item[1]
+ endtime = query.item[2]
+
+ var/pollquery = "INSERT INTO [format_table_name("poll_question")] (polltype, starttime, endtime, question, adminonly, multiplechoiceoptions, createdby_ckey, createdby_ip) VALUES ('[polltype]', '[starttime]', '[endtime]', '[question]', '[adminonly]', '[choice_amount]', '[sql_ckey]', '[address]')"
+ var/idquery = "SELECT id FROM [format_table_name("poll_question")] WHERE question = '[question]' AND starttime = '[starttime]' AND endtime = '[endtime]' AND createdby_ckey = '[sql_ckey]' AND createdby_ip = '[address]'"
+ var/list/option_queries = list()
+ if(polltype == POLLTYPE_MULTI || polltype == POLLTYPE_RATING || polltype == POLLTYPE_OPTION)
+ var/numoptions = text2num(href_list["createpollnumoptions"])
+ if(!numoptions)
+ create_poll_window("Invalid number of options ")
+ return
+ for(var/I in 1 to numoptions)
+ var/option = href_list["createpolloption[I]option"]
+ if(!option)
+ create_poll_window("Invalid option name for option [I] ")
+ return
+ option = sanitizeSQL(option)
+ var/percentagecalc = 0
+ if(text2num(href_list["createpolloption[I]percentagecalc"]))
+ percentagecalc = 1
+ var/minval = 0
+ var/maxval = 0
+ var/descmin = ""
+ var/descmid = ""
+ var/descmax = ""
+ if(polltype == POLLTYPE_RATING)
+ minval = text2num(href_list["createpolloption[I]minval"])
+ if(!minval)
+ create_poll_window("Invalid minimum value for option [I] ")
+ return
+ maxval = text2num(href_list["createpolloption[I]maxval"])
+ if(!maxval)
+ create_poll_window("Invalid maximum value for option [I] ")
+ return
+ if(minval >= maxval)
+ create_poll_window("Minimum rating value can't be more than maximum rating value ")
+ return
+ descmin = href_list["createpolloption[I]descmin"]
+ if(descmin)
+ descmin = sanitizeSQL(descmin)
+ descmid = href_list["createpolloption[I]descmid"]
+ if(descmid)
+ descmid = sanitizeSQL(descmid)
+ descmax = href_list["createpolloption[I]descmax"]
+ if(descmax)
+ descmax = sanitizeSQL(descmax)
+ option_queries += "INSERT INTO [format_table_name("poll_option")] (pollid, text, percentagecalc, minval, maxval, descmin, descmid, descmax) VALUES ('{POLLID}', '[option]', '[percentagecalc]', '[minval]', '[maxval]', '[descmin]', '[descmid]', '[descmax]')"
+
+ query = dbcon.NewQuery(pollquery)
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ create_poll_window("An SQL error has occured while creating your poll ")
log_game("SQL ERROR adding new poll question to table. Error : \[[err]\]\n")
return
- if(polltype == POLLTYPE_TEXT)
- log_admin("[key_name(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]")
- message_admins("[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] Question: [question]")
- return
var/pollid = 0
- var/DBQuery/query_get_id = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE question = '[question]' AND starttime = '[starttime]' AND endtime = '[endtime]' AND createdby_ckey = '[sql_ckey]' AND createdby_ip = '[address]'")
- if(!query_get_id.Execute())
- var/err = query_get_id.ErrorMsg()
+ query = dbcon.NewQuery(idquery)
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ create_poll_window("An SQL error has occured while creating your poll ")
log_game("SQL ERROR obtaining id from poll_question table. Error : \[[err]\]\n")
return
- if(query_get_id.NextRow())
- pollid = query_get_id.item[1]
- var/add_option = 1
- while(add_option)
- var/option = input("Write your option",POLLTYPE_OPTION) as message|null
- if(!option)
- return pollid
- option = sanitizeSQL(option)
- var/percentagecalc
- switch(alert("Calculate option results as percentage?",,"Yes","No","Cancel"))
- if("Yes")
- percentagecalc = 1
- if("No")
- percentagecalc = 0
- else
- return pollid
- var/minval = 0
- var/maxval = 0
- var/descmin = ""
- var/descmid = ""
- var/descmax = ""
- if(polltype == POLLTYPE_RATING)
- minval = input("Set minimum rating value.","Minimum rating") as num|null
- if(!minval)
- return pollid
- maxval = input("Set maximum rating value.","Maximum rating") as num|null
- if(!maxval)
- return pollid
- if(minval >= maxval)
- to_chat(src, "Minimum rating value can't be more than maximum rating value")
- return pollid
- descmin = input("Optional: Set description for minimum rating","Minimum rating description") as message|null
- if(descmin)
- descmin = sanitizeSQL(descmin)
- else if(descmin == null)
- return pollid
- descmid = input("Optional: Set description for median rating","Median rating description") as message|null
- if(descmid)
- descmid = sanitizeSQL(descmid)
- else if(descmid == null)
- return pollid
- descmax = input("Optional: Set description for maximum rating","Maximum rating description") as message|null
- if(descmax)
- descmax = sanitizeSQL(descmax)
- else if(descmax == null)
- return pollid
- var/DBQuery/query_polladd_option = dbcon.NewQuery("INSERT INTO [format_table_name("poll_option")] (pollid, text, percentagecalc, minval, maxval, descmin, descmid, descmax) VALUES ('[pollid]', '[option]', '[percentagecalc]', '[minval]', '[maxval]', '[descmin]', '[descmid]', '[descmax]')")
- if(!query_polladd_option.Execute())
- var/err = query_polladd_option.ErrorMsg()
- log_game("SQL ERROR adding new poll option to table. Error : \[[err]\]\n")
- return pollid
- switch(alert(" ",,"Add option","Finish"))
- if("Add option")
- add_option = 1
- if("Finish")
- add_option = 0
+ if(query.NextRow())
+ pollid = text2num(query.item[1])
+ for(var/querytext in option_queries)
+ query = dbcon.NewQuery(replacetext(idquery, "{POLLID}", pollid))
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ create_poll_window("An SQL error has occured while creating your poll ")
+ log_game("SQL ERROR obtaining id from poll_question table. Error : \[[err]\]\n")
+ return
+ create_poll_window("Your poll has been successfully created ")
return pollid
\ No newline at end of file
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 7ee714090cc..de22d5ea098 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -32,6 +32,7 @@ var/list/admin_datums = list()
if(istype(C))
owner = C
owner.holder = src
+ owner.on_holder_add()
owner.add_admin_verbs() //TODO
owner.verbs -= /client/proc/readmin
admins |= C
diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm
index f1232cd4e78..ccacefc219b 100644
--- a/code/modules/admin/permissionverbs/permissionedit.dm
+++ b/code/modules/admin/permissionverbs/permissionedit.dm
@@ -63,7 +63,7 @@
establish_db_connection()
if(!dbcon.IsConnected())
- to_chat(usr, "\red Failed to establish database connection")
+ to_chat(usr, "Failed to establish database connection ")
return
if(!adm_ckey || !new_rank)
@@ -91,14 +91,14 @@
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');")
log_query.Execute()
- to_chat(usr, "\blue New admin added.")
+ to_chat(usr, "New admin added. ")
else
if(!isnull(admin_id) && isnum(admin_id))
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE id = [admin_id]")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');")
log_query.Execute()
- to_chat(usr, "\blue Admin rank changed.")
+ to_chat(usr, "Admin rank changed. ")
/datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission)
if(config.admin_legacy_system)
@@ -112,7 +112,7 @@
establish_db_connection()
if(!dbcon.IsConnected())
- to_chat(usr, "\red Failed to establish database connection")
+ to_chat(usr, "Failed to establish database connection ")
return
if(!adm_ckey || !new_permission)
@@ -146,13 +146,13 @@
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');")
log_query.Execute()
- to_chat(usr, "\blue Permission removed.")
+ to_chat(usr, "Permission removed. ")
else //This admin doesn't have this permission, so we are adding it.
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')")
log_query.Execute()
- to_chat(usr, "\blue Permission added.")
+ to_chat(usr, "Permission added. ")
/datum/admins/proc/updateranktodb(ckey,newrank)
establish_db_connection()
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 2e76bcea6a2..0be92ce25af 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -393,8 +393,11 @@
logout_status = " (snpc) "
else
logout_status = M.client ? "" : " (logged out) "
+ var/dname = M.real_name
+ if(!dname)
+ dname = M
- return {"[M.real_name] [caption] [logout_status][M.stat == 2 ? " (DEAD) " : ""]
+ return {"[dname] [caption] [logout_status][M.stat == 2 ? " (DEAD) " : ""]
PM [close ? " " : ""]"}
/datum/admins/proc/check_antagonists()
@@ -424,7 +427,7 @@
else
dat += "Nuclear Operative not found! "
dat += "
Nuclear Disk(s) "
- for(var/obj/item/weapon/disk/nuclear/N in world)
+ for(var/obj/item/weapon/disk/nuclear/N in poi_list)
dat += "[N.name], "
var/atom/disk_loc = N.loc
while(!istype(disk_loc, /turf))
@@ -489,6 +492,11 @@
if(ticker.mode.cult.len)
dat += check_role_table("Cultists", ticker.mode.cult, 0)
+ dat += " use Cult Mindspeak "
+ if(GAMEMODE_IS_CULT)
+ var/datum/game_mode/cult/cult_round = ticker.mode
+ if(!cult_round.narsie_condition_cleared)
+ dat += "complete objective (debug) "
if(ticker.mode.traitors.len)
dat += check_role_table("Traitors", ticker.mode.traitors)
@@ -523,6 +531,17 @@
if(ticker.mode.greyshirts.len)
dat += check_role_table("Greyshirts", ticker.mode.greyshirts)
+ if(ts_spiderlist.len)
+ var/list/spider_minds = list()
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/S in ts_spiderlist)
+ if(S.ckey)
+ spider_minds += S.mind
+ if(spider_minds.len)
+ dat += check_role_table("Terror Spiders", spider_minds)
+
+ if(ticker.mode.ert.len)
+ dat += check_role_table("ERT", ticker.mode.ert)
+
dat += ""
usr << browse(dat, "window=roundstatus;size=400x500")
else
diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm
index 338993af58c..7b237db72e5 100644
--- a/code/modules/admin/sql_notes.dm
+++ b/code/modules/admin/sql_notes.dm
@@ -8,7 +8,7 @@
var/new_ckey = ckey(input(usr,"Who would you like to add a note for?","Enter a ckey",null) as text|null)
if(!new_ckey)
return
- new_ckey = sanitizeSQL(new_ckey)
+ new_ckey = ckey(new_ckey)
var/DBQuery/query_find_ckey = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'")
if(!query_find_ckey.Execute())
var/err = query_find_ckey.ErrorMsg()
@@ -19,7 +19,7 @@
return
else
target_ckey = new_ckey
- var/target_sql_ckey = sanitizeSQL(target_ckey)
+ var/target_sql_ckey = ckey(target_ckey)
if(!notetext)
notetext = input(usr,"Write your note","Add Note") as message|null
if(!notetext)
@@ -31,6 +31,8 @@
adminckey = usr.ckey
if(!adminckey)
return
+ else if(usr && (usr.ckey == ckey(adminckey))) // Don't ckeyize special note sources
+ adminckey = ckey(adminckey)
var/admin_sql_ckey = sanitizeSQL(adminckey)
if(!server)
if(config && config.server_name)
@@ -86,7 +88,7 @@
return
note_id = text2num(note_id)
var/target_ckey
- var/sql_ckey = sanitizeSQL(usr.ckey)
+ var/sql_ckey = usr.ckey
var/DBQuery/query_find_note_edit = dbcon.NewQuery("SELECT ckey, notetext, adminckey FROM [format_table_name("notes")] WHERE id = [note_id]")
if(!query_find_note_edit.Execute())
var/err = query_find_note_edit.ErrorMsg()
@@ -128,7 +130,7 @@
if(!linkless)
output = navbar
if(target_ckey)
- var/target_sql_ckey = sanitizeSQL(target_ckey)
+ var/target_sql_ckey = ckey(target_ckey)
var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT id, timestamp, notetext, adminckey, last_editor, server FROM [format_table_name("notes")] WHERE ckey = '[target_sql_ckey]' ORDER BY timestamp")
if(!query_get_notes.Execute())
var/err = query_get_notes.ErrorMsg()
@@ -179,7 +181,7 @@
usr << browse(output, "window=show_notes;size=900x500")
/proc/show_player_info_irc(var/key as text)
- var/target_sql_ckey = sanitizeSQL(key)
+ var/target_sql_ckey = ckey(key)
var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT timestamp, notetext, adminckey, server FROM [format_table_name("notes")] WHERE ckey = '[target_sql_ckey]' ORDER BY timestamp")
if(!query_get_notes.Execute())
var/err = query_get_notes.ErrorMsg()
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 1efb3567828..605c4acd1f3 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -34,35 +34,35 @@
if("1")
log_admin("[key_name(usr)] has spawned a traitor.")
if(!src.makeTraitors())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("2")
log_admin("[key_name(usr)] has spawned a changeling.")
if(!src.makeChanglings())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("3")
log_admin("[key_name(usr)] has spawned revolutionaries.")
if(!src.makeRevs())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("4")
log_admin("[key_name(usr)] has spawned a cultists.")
if(!src.makeCult())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("5")
log_admin("[key_name(usr)] has spawned a wizard.")
if(!src.makeWizard())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("6")
log_admin("[key_name(usr)] has spawned vampires.")
if(!src.makeVampires())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("7")
log_admin("[key_name(usr)] has spawned vox raiders.")
if(!src.makeVoxRaiders())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
if("8")
log_admin("[key_name(usr)] has spawned an abductor team.")
if(!src.makeAbductorTeam())
- to_chat(usr, "\red Unfortunately there weren't enough candidates available.")
+ to_chat(usr, "Unfortunately there weren't enough candidates available. ")
else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"])
var/adminckey = href_list["dbsearchadmin"]
@@ -298,7 +298,7 @@
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
- message_admins("\blue [key_name_admin(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
+ message_admins("[key_name_admin(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"]. ", 1)
href_list["secretsadmin"] = "check_antagonist"
else if(href_list["simplemake"])
@@ -315,7 +315,7 @@
if("Yes") delmob = 1
log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
- message_admins("\blue [key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1)
+ message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob] ", 1)
switch(href_list["simplemake"])
if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob, 1 )
@@ -398,7 +398,7 @@
log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
- message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1)
+ message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration] ", 1)
Banlist.cd = "/base/[banfolder]"
to_chat(Banlist["reason"], reason)
to_chat(Banlist["temp"], temp)
@@ -434,8 +434,8 @@
feedback_inc("ban_appearance_unban", 1)
DB_ban_unban(M.ckey, BANTYPE_APPEARANCE)
appearance_unban(M)
- message_admins("\blue [key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1)
- to_chat(M, "\red[usr.client.ckey] has removed your appearance ban. ")
+ message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban ", 1)
+ to_chat(M, "[usr.client.ckey] has removed your appearance ban. ")
else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel"))
if("Yes")
@@ -448,14 +448,14 @@
DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason)
appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
add_note(M.ckey, "Appearance banned - [reason]", null, usr.ckey, 0)
- message_admins("\blue [key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1)
- to_chat(M, "\redYou have been appearance banned by [usr.client.ckey]. ")
+ message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)] ", 1)
+ to_chat(M, "You have been appearance banned by [usr.client.ckey]. ")
to_chat(M, "The reason is: [reason] ")
- to_chat(M, "\red Appearance ban can be lifted only upon request.")
+ to_chat(M, "Appearance ban can be lifted only upon request. ")
if(config.banappeals)
- to_chat(M, "\red To try to resolve this matter head to [config.banappeals]")
+ to_chat(M, "To try to resolve this matter head to [config.banappeals] ")
else
- to_chat(M, "\red No ban appeals URL has been set.")
+ to_chat(M, "No ban appeals URL has been set. ")
if("No")
return
@@ -790,7 +790,7 @@
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
if("Yes")
if(config.ban_legacy_system)
- to_chat(usr, "\red Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.")
+ to_chat(usr, "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban. ")
return
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(!mins)
@@ -812,10 +812,10 @@
else
msg += ", [job]"
add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0)
- message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1)
- to_chat(M, "\redYou have been jobbanned by [usr.client.ckey] from: [msg]. ")
+ message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes ", 1)
+ to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg]. ")
to_chat(M, "The reason is: [reason] ")
- to_chat(M, "\red This jobban will be lifted in [mins] minutes.")
+ to_chat(M, "This jobban will be lifted in [mins] minutes. ")
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
if("No")
@@ -832,10 +832,10 @@
if(!msg) msg = job
else msg += ", [job]"
add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0)
- message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1)
- to_chat(M, "\redYou have been jobbanned by [usr.client.ckey] from: [msg]. ")
+ message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] ", 1)
+ to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg]. ")
to_chat(M, "The reason is: [reason] ")
- to_chat(M, "\red Jobban can be lifted only upon request.")
+ to_chat(M, "Jobban can be lifted only upon request. ")
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
if("Cancel")
@@ -865,8 +865,8 @@
else
continue
if(msg)
- message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1)
- to_chat(M, "\redYou have been un-jobbanned by [usr.client.ckey] from [msg]. ")
+ message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg] ", 1)
+ to_chat(M, "You have been un-jobbanned by [usr.client.ckey] from [msg]. ")
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
return 0 //we didn't do anything!
@@ -876,9 +876,9 @@
if(ismob(M))
if(!check_if_greater_rights_than(M.client))
return
- to_chat(M, "\red You have been kicked from the server")
+ to_chat(M, "You have been kicked from the server ")
log_admin("[key_name(usr)] booted [key_name(M)].")
- message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1)
+ message_admins("[key_name_admin(usr)] booted [key_name_admin(M)]. ", 1)
//M.client = null
del(M.client)
@@ -933,7 +933,7 @@
if(t)
if((alert("Do you want to unjobban [t]?","Unjobban confirmation", "Yes", "No") == "Yes") && t) //No more misclicks! Unless you do it twice.
log_admin("[key_name(usr)] removed [t]")
- message_admins("\blue [key_name_admin(usr)] removed [t]", 1)
+ message_admins("[key_name_admin(usr)] removed [t] ", 1)
jobban_remove(t)
href_list["ban"] = 1 // lets it fall through and refresh
var/t_split = splittext(t, " - ")
@@ -960,17 +960,17 @@
return
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.")
- to_chat(M, "\redYou have been banned by [usr.client.ckey].\nReason: [reason]. ")
- to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.")
+ to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason]. ")
+ to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes. ")
feedback_inc("ban_tmp",1)
DB_ban_record(BANTYPE_TEMP, M, mins, reason)
feedback_inc("ban_tmp_mins",mins)
if(config.banappeals)
- to_chat(M, "\red To try to resolve this matter head to [config.banappeals]")
+ to_chat(M, "To try to resolve this matter head to [config.banappeals] ")
else
- to_chat(M, "\red No ban appeals URL has been set.")
+ to_chat(M, "No ban appeals URL has been set. ")
log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
- message_admins("\blue [key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
+ message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes. ")
del(M.client)
//qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
@@ -984,15 +984,15 @@
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP)
if("No")
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0)
- to_chat(M, "\redYou have been banned by [usr.client.ckey].\nReason: [reason]. ")
- to_chat(M, "\red This is a permanent ban.")
+ to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason]. ")
+ to_chat(M, "This is a permanent ban. ")
if(config.banappeals)
- to_chat(M, "\red To try to resolve this matter head to [config.banappeals]")
+ to_chat(M, "To try to resolve this matter head to [config.banappeals] ")
else
- to_chat(M, "\red No ban appeals URL has been set.")
+ to_chat(M, "No ban appeals URL has been set. ")
ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.")
log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
- message_admins("\blue[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
+ message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban. ")
feedback_inc("ban_perma",1)
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
@@ -1094,7 +1094,7 @@
return alert(usr, "The game has already started.", null, null, null, null)
master_mode = href_list["c_mode2"]
log_admin("[key_name(usr)] set the mode as [master_mode].")
- message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1)
+ message_admins("[key_name_admin(usr)] set the mode as [master_mode]. ", 1)
to_chat(world, "The mode is now: [master_mode] ")
Game() // updates the main game menu
world.save_mode(master_mode)
@@ -1109,7 +1109,7 @@
return alert(usr, "The game mode has to be secret!", null, null, null, null)
secret_force_mode = href_list["f_secret2"]
log_admin("[key_name(usr)] set the forced secret mode as [secret_force_mode].")
- message_admins("\blue [key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1)
+ message_admins("[key_name_admin(usr)] set the forced secret mode as [secret_force_mode]. ", 1)
Game() // updates the main game menu
.(href, list("f_secret"=1))
@@ -1124,7 +1124,7 @@
return
log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]")
- message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1)
+ message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)] ", 1)
H.monkeyize()
@@ -1140,7 +1140,7 @@
return
log_admin("[key_name(usr)] attempting to corgize [key_name(H)]")
- message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1)
+ message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)] ", 1)
H.corgize()
else if(href_list["makePAI"])
@@ -1164,7 +1164,7 @@
name = painame
log_admin("[key_name(usr)] attempting to pAIze [key_name(H)]")
- message_admins("\blue [key_name_admin(usr)] attempting to pAIze [key_name_admin(H)]", 1)
+ message_admins("[key_name_admin(usr)] attempting to pAIze [key_name_admin(H)] ", 1)
H.paize(name)
else if(href_list["forcespeech"])
@@ -1179,7 +1179,7 @@
M.say(speech)
speech = sanitize(speech) // Nah, we don't trust them
log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]")
- message_admins("\blue [key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]")
+ message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech] ")
else if(href_list["sendtoprison"])
if(!check_rights(R_ADMIN)) return
@@ -1223,9 +1223,9 @@
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
- to_chat(M, "\red You have been sent to the prison station!")
+ to_chat(M, "You have been sent to the prison station! ")
log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.")
- message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1)
+ message_admins("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station. ", 1)
else if(href_list["sendbacktolobby"])
if(!check_rights(R_ADMIN))
@@ -1278,7 +1278,7 @@
sleep(5)
M.loc = pick(tdome1)
spawn(50)
- to_chat(M, "\blue You have been sent to the Thunderdome.")
+ to_chat(M, "You have been sent to the Thunderdome. ")
log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 1)", 1)
@@ -1308,7 +1308,7 @@
sleep(5)
M.loc = pick(tdome2)
spawn(50)
- to_chat(M, "\blue You have been sent to the Thunderdome.")
+ to_chat(M, "You have been sent to the Thunderdome. ")
log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 2)", 1)
@@ -1330,7 +1330,7 @@
sleep(5)
M.loc = pick(tdomeadmin)
spawn(50)
- to_chat(M, "\blue You have been sent to the Thunderdome.")
+ to_chat(M, "You have been sent to the Thunderdome. ")
log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Admin.)", 1)
@@ -1364,7 +1364,7 @@
sleep(5)
M.loc = pick(tdomeobserve)
spawn(50)
- to_chat(M, "\blue You have been sent to the Thunderdome.")
+ to_chat(M, "You have been sent to the Thunderdome. ")
log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1)
@@ -1386,7 +1386,7 @@
sleep(5)
M.loc = pick(aroomwarp)
spawn(50)
- to_chat(M, "\blue You have been sent to the Admin Room! .")
+ to_chat(M, "You have been sent to the Admin Room! . ")
log_admin("[key_name(usr)] has sent [key_name(M)] to the Admin Room")
message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the Admin Room", 1)
@@ -1400,7 +1400,7 @@
return
L.revive()
- message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!", 1)
+ message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]! ", 1)
log_admin("[key_name(usr)] healed / revived [key_name(L)]")
else if(href_list["makeai"])
@@ -1414,7 +1414,7 @@
if(alert(usr, "Confirm make ai?",, "Yes", "No") != "Yes")
return
- message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1)
+ message_admins("Admin [key_name_admin(usr)] AIized [key_name_admin(H)]! ", 1)
log_admin("[key_name(usr)] AIized [key_name(H)]")
var/mob/living/silicon/ai/ai_character = H.AIize()
ai_character.moveToAILandmark()
@@ -1533,6 +1533,51 @@
else if(href_list["check_antagonist"])
check_antagonists()
+ else if(href_list["take_question"])
+ var/mob/M = locateUID(href_list["take_question"])
+ var/is_mhelp = href_list["is_mhelp"]
+ if(ismob(M))
+ var/helptype = "ADMINHELP"
+ if(is_mhelp)
+ helptype = "MENTORHELP"
+ var/take_msg = "[helptype] : [key_name(usr.client)] is attending to [key_name(M)]'s question. "
+ for(var/client/X in admins)
+ if(check_rights(R_ADMIN, 0, X.mob))
+ to_chat(X, take_msg)
+ else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
+ to_chat(X, take_msg)
+ to_chat(M, "Your question is being attended to by [key_name(usr.client)]. Thanks for your patience! ")
+ else
+ to_chat(usr, "Unable to locate mob. ")
+
+ else if(href_list["cult_nextobj"])
+ if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes")
+ return
+
+ if(!GAMEMODE_IS_CULT)
+ alert("Couldn't locate cult mode datum! This shouldn't ever happen, tell a coder!")
+ return
+
+ var/datum/game_mode/cult/cult_round = ticker.mode
+ cult_round.bypass_phase()
+ message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.")
+ log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.")
+
+ else if(href_list["cult_mindspeak"])
+ var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [ticker.mode.cultdat.entity_name]", "Voice of [ticker.mode.cultdat.entity_name]", "")
+ if(!input)
+ return
+
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (H.current)
+ to_chat(H.current, "[ticker.mode.cultdat.entity_name] murmurs, [input] ")
+
+ for(var/mob/dead/observer/O in player_list)
+ to_chat(O, "[ticker.mode.cultdat.entity_name] murmurs, [input] ")
+
+ message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [ticker.mode.cultdat.entity_name].")
+ log_admin("[key_name(usr)] Voice of [ticker.mode.cultdat.entity_name]: [input]")
+
else if(href_list["adminplayerobservecoodjump"])
if(!check_rights(R_ADMIN)) return
@@ -1574,7 +1619,7 @@
log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
message_admins("[key_name_admin(H)] got their cookie, spawned by [key_name_admin(src.owner)]")
feedback_inc("admin_cookies_spawned",1)
- to_chat(H, "\blue Your prayers have been answered!! You received the best cookie !")
+ to_chat(H, "Your prayers have been answered!! You received the best cookie ! ")
else if(href_list["BlueSpaceArtillery"])
if(!check_rights(R_ADMIN|R_EVENT)) return
@@ -1682,6 +1727,124 @@
to_chat(src.owner, "You sent a [eviltype] fax to [H]")
log_admin("[key_name(src.owner)] sent [key_name(H)] a [eviltype] fax")
message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a [eviltype] fax")
+ else if(href_list["Bless"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/mob/living/M = locateUID(href_list["Bless"])
+ if(!istype(M))
+ to_chat(usr, "This can only be used on instances of type /mob/living")
+ return
+ var/btypes = list("To Arrivals", "Moderate Heal")
+ var/mob/living/carbon/human/H
+ if(ishuman(M))
+ H = M
+ btypes += "Heal Over Time"
+ btypes += "Permanent Regeneration"
+ btypes += "Super Powers"
+ var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
+ if(!(blessing in btypes))
+ return
+ var/logmsg = null
+ switch(blessing)
+ if("To Arrivals")
+ M.forceMove(pick(latejoin))
+ to_chat(M, "You are abruptly pulled through space! ")
+ logmsg = "a teleport to arrivals."
+ if("Moderate Heal")
+ M.adjustBruteLoss(-25)
+ M.adjustFireLoss(-25)
+ M.adjustToxLoss(-25)
+ M.adjustOxyLoss(-25)
+ to_chat(M,"You feel invigorated! ")
+ logmsg = "a moderate heal."
+ if("Heal Over Time")
+ H.reagents.add_reagent("salglu_solution", 30)
+ H.reagents.add_reagent("salbutamol", 20)
+ H.reagents.add_reagent("spaceacillin", 20)
+ logmsg = "a heal over time."
+ if("Permanent Regeneration")
+ H.dna.SetSEState(REGENERATEBLOCK, 1)
+ genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED)
+ H.update_mutations()
+ logmsg = "permanent regeneration."
+ if("Super Powers")
+ var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
+ for(var/gene in default_genes)
+ H.dna.SetSEState(gene, 1)
+ genemutcheck(H, gene, null, MUTCHK_FORCED)
+ H.update_mutations()
+ logmsg = "superpowers."
+ if(logmsg)
+ log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]")
+ message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]")
+ else if(href_list["Smite"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/mob/living/M = locateUID(href_list["Smite"])
+ var/mob/living/carbon/human/H
+ if(!istype(M))
+ to_chat(usr, "This can only be used on instances of type /mob/living")
+ return
+ var/ptypes = list("Lightning bolt", "Fire Death", "Gib")
+ if(ishuman(M))
+ H = M
+ ptypes += "Brain Damage"
+ ptypes += "Honk Tumor"
+ ptypes += "Cluwne"
+ ptypes += "Mutagen Cookie"
+ ptypes += "Hellwater Cookie"
+ var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
+ if(!(punishment in ptypes))
+ return
+ var/logmsg = null
+ switch(punishment)
+ if("Lightning bolt")
+ M.electrocute_act(5, "Lightning Bolt", safety=1)
+ playsound(get_turf(M), 'sound/magic/LightningShock.ogg', 50, 1, -1)
+ M.adjustFireLoss(75)
+ M.Weaken(5)
+ to_chat(M, "The gods have punished you for your sins! ")
+ logmsg = "a lightning bolt."
+ if("Brain Damage")
+ H.adjustBrainLoss(75)
+ logmsg = "75 brain damage."
+ if("Fire Death")
+ to_chat(M,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting? ")
+ var/turf/simulated/T = get_turf(M)
+ new /obj/effect/hotspot(T)
+ M.adjustFireLoss(150)
+ logmsg = "a firey death."
+ if("Honk Tumor")
+ if(!H.get_int_organ(/obj/item/organ/internal/honktumor))
+ var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor
+ to_chat(H, "Life seems funnier, somehow. ")
+ organ.insert(H)
+ logmsg = "a honk tumor."
+ if("Cluwne")
+ H.makeCluwne()
+ logmsg = "cluwned."
+ if("Mutagen Cookie")
+ var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
+ evilcookie.reagents.add_reagent("mutagen", 10)
+ evilcookie.desc = "It has a faint green glow."
+ evilcookie.bitesize = 100
+ H.drop_l_hand()
+ H.equip_to_slot_or_del(evilcookie, slot_l_hand)
+ logmsg = "a mutagen cookie."
+ if("Hellwater Cookie")
+ var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
+ evilcookie.reagents.add_reagent("hell_water", 25)
+ evilcookie.desc = "Sulphur-flavored."
+ evilcookie.bitesize = 100
+ H.drop_l_hand()
+ H.equip_to_slot_or_del(evilcookie, slot_l_hand)
+ logmsg = "a hellwater cookie."
+ if("Gib")
+ logmsg = "gibbed."
+ M.gib(FALSE)
+ if(logmsg)
+ log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a smiting: [logmsg]")
+ message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a smiting: [logmsg]")
else if(href_list["FaxReplyTemplate"])
if(!check_rights(R_ADMIN))
return
@@ -1823,7 +1986,7 @@
usr << browse(data, "window=[B.name]")
else
- to_chat(usr, "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]")
+ to_chat(usr, "The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type] ")
else if(href_list["AdminFaxViewPage"])
if(!check_rights(R_ADMIN))
@@ -1955,14 +2118,14 @@
if(destination != "All Departments")
if(!fax.receivefax(P))
- to_chat(src.owner, "\red Message transmission failed.")
+ to_chat(src.owner, "Message transmission failed. ")
return
else
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
if(is_station_level(F.z))
spawn(0)
if(!F.receivefax(P))
- to_chat(src.owner, "\red Message transmission to [F.department] failed.")
+ to_chat(src.owner, "Message transmission to [F.department] failed. ")
var/datum/fax/admin/A = new /datum/fax/admin()
A.name = P.name
@@ -1977,7 +2140,7 @@
A.sent_by = usr
A.sent_at = world.time
- to_chat(src.owner, "\blue Message transmitted successfully.")
+ to_chat(src.owner, "Message transmitted successfully. ")
if(notify == "Yes")
var/mob/living/carbon/human/H = sender
if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
@@ -2003,7 +2166,7 @@
if(!M)
to_chat(usr, "ERROR: Mob not found.")
return
- cmd_show_exp_panel(M.client)
+ cmd_mentor_show_exp_panel(M.client)
else if(href_list["jumpto"])
if(!check_rights(R_ADMIN)) return
@@ -2145,6 +2308,7 @@
else
var/atom/O = new path(target)
if(O)
+ O.admin_spawned = TRUE
O.dir = obj_dir
if(obj_name)
O.name = obj_name
@@ -2276,30 +2440,30 @@
feedback_add_details("admin_secrets_fun_used","Grav")
if(gravity_is_on)
log_admin("[key_name(usr)] toggled gravity on.", 1)
- message_admins("\blue [key_name_admin(usr)] toggled gravity on.", 1)
- command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
+ message_admins("[key_name_admin(usr)] toggled gravity on. ", 1)
+ event_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
else
log_admin("[key_name(usr)] toggled gravity off.", 1)
- message_admins("\blue [key_name_admin(usr)] toggled gravity off.", 1)
- command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
+ message_admins("[key_name_admin(usr)] toggled gravity off. ", 1)
+ event_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
if("power")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","P")
log_admin("[key_name(usr)] made all areas powered", 1)
- message_admins("\blue [key_name_admin(usr)] made all areas powered", 1)
+ message_admins("[key_name_admin(usr)] made all areas powered ", 1)
power_restore()
if("unpower")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","UP")
log_admin("[key_name(usr)] made all areas unpowered", 1)
- message_admins("\blue [key_name_admin(usr)] made all areas unpowered", 1)
+ message_admins("[key_name_admin(usr)] made all areas unpowered ", 1)
power_failure()
if("quickpower")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","QP")
log_admin("[key_name(usr)] made all SMESs powered", 1)
- message_admins("\blue [key_name_admin(usr)] made all SMESs powered", 1)
+ message_admins("[key_name_admin(usr)] made all SMESs powered ", 1)
power_restore_quick()
if("prisonwarp")
if(!ticker)
@@ -2307,7 +2471,7 @@
return
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","PW")
- message_admins("\blue [key_name_admin(usr)] teleported all players to the prison station.", 1)
+ message_admins("[key_name_admin(usr)] teleported all players to the prison station. ", 1)
for(var/mob/living/carbon/human/H in mob_list)
var/turf/loc = find_loc(H)
var/security = 0
@@ -2374,7 +2538,7 @@
A.mind.objectives += new_objective
ticker.mode.greet_traitor(A.mind)
ticker.mode.finalize_traitor(A.mind)
- message_admins("\blue [key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1)
+ message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective] ", 1)
log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
if("togglebombcap")
@@ -2414,20 +2578,20 @@
var/Message = rand(1,4)
switch(Message)
if(1)
- M.show_message(text("\blue You shudder as if cold..."), 1)
+ M.show_message(text("You shudder as if cold... "), 1)
if(2)
- M.show_message(text("\blue You feel something gliding across your back..."), 1)
+ M.show_message(text("You feel something gliding across your back... "), 1)
if(3)
- M.show_message(text("\blue Your eyes twitch, you feel like something you can't see is here..."), 1)
+ M.show_message(text("Your eyes twitch, you feel like something you can't see is here... "), 1)
if(4)
- M.show_message(text("\blue You notice something moving out of the corner of your eye, but nothing is there..."), 1)
+ M.show_message(text("You notice something moving out of the corner of your eye, but nothing is there... "), 1)
for(var/obj/W in orange(5,M))
if(prob(25) && !W.anchored)
step_rand(W)
sleep(rand(100,1000))
for(var/mob/M in player_list)
if(M.stat != 2)
- M.show_message(text("\blue The chilling wind suddenly stops..."), 1)
+ M.show_message(text("The chilling wind suddenly stops... "), 1)
/* if("shockwave")
ok = 1
to_chat(world, "ALERT: STATION STRESS CRITICAL ")
@@ -2553,7 +2717,7 @@
if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
- command_announcement.Announce("Centcomm airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg')
+ event_announcement.Announce("Centcomm airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg')
if("onlyone")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","OO")
@@ -2611,22 +2775,22 @@
message_admins("[key_name_admin(usr)] tried starting a Thunderdome match, but no ghosts signed up. ")
if("securitylevel0")
set_security_level(0)
- message_admins("\blue [key_name_admin(usr)] change security level to Green.", 1)
+ message_admins("[key_name_admin(usr)] change security level to Green. ", 1)
if("securitylevel1")
set_security_level(1)
- message_admins("\blue [key_name_admin(usr)] change security level to Blue.", 1)
+ message_admins("[key_name_admin(usr)] change security level to Blue. ", 1)
if("securitylevel2")
set_security_level(2)
- message_admins("\blue [key_name_admin(usr)] change security level to Red.", 1)
+ message_admins("[key_name_admin(usr)] change security level to Red. ", 1)
if("securitylevel3")
set_security_level(3)
- message_admins("\blue [key_name_admin(usr)] change security level to Gamma.", 1)
+ message_admins("[key_name_admin(usr)] change security level to Gamma. ", 1)
if("securitylevel4")
set_security_level(4)
- message_admins("\blue [key_name_admin(usr)] change security level to Epsilon.", 1)
+ message_admins("[key_name_admin(usr)] change security level to Epsilon. ", 1)
if("securitylevel5")
set_security_level(5)
- message_admins("\blue [key_name_admin(usr)] change security level to Delta.", 1)
+ message_admins("[key_name_admin(usr)] change security level to Delta. ", 1)
if("moveminingshuttle")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","ShM")
@@ -2990,6 +3154,80 @@
else
error_viewer.showTo(usr, null, href_list["viewruntime_linear"])
+ else if(href_list["add_station_goal"])
+ if(!check_rights(R_EVENT))
+ return
+ var/list/type_choices = typesof(/datum/station_goal)
+ var/picked = input("Choose goal type") in type_choices|null
+ if(!picked)
+ return
+ var/datum/station_goal/G = new picked()
+ if(picked == /datum/station_goal)
+ var/newname = input("Enter goal name:") as text|null
+ if(!newname)
+ return
+ G.name = newname
+ var/description = input("Enter [command_name()] message contents:") as message|null
+ if(!description)
+ return
+ G.report_message = description
+ message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.")
+ ticker.mode.station_goals += G
+ modify_goals()
+
+ // Library stuff
+ else if(href_list["library_book_id"])
+ var/isbn = sanitizeSQL(href_list["library_book_id"])
+
+ if(href_list["view_library_book"])
+ var/DBQuery/query_view_book = dbcon.NewQuery("SELECT content, title FROM [format_table_name("library")] WHERE id=[isbn]")
+ if(!query_view_book.Execute())
+ var/err = query_view_book.ErrorMsg()
+ log_game("SQL ERROR viewing book. Error : \[[err]\]\n")
+ return
+
+ var/content = ""
+ var/title = ""
+ while(query_view_book.NextRow())
+ content = query_view_book.item[1]
+ title = html_encode(query_view_book.item[2])
+
+ var/dat = ""
+ dat += "[html_encode(html_to_pencode(content))]"
+ dat += " "
+
+ var/datum/browser/popup = new(usr, "admin_view_book", "[title]", 700, 400)
+ popup.set_content(dat)
+ popup.open(0)
+
+ log_admin("[key_name(usr)] has viewed the book [isbn].")
+ message_admins("[key_name_admin(usr)] has viewed the book [isbn].")
+ return
+
+ else if(href_list["unflag_library_book"])
+ var/DBQuery/query_unflag_book = dbcon.NewQuery("UPDATE [format_table_name("library")] SET flagged = 0 WHERE id=[isbn]")
+ if(!query_unflag_book.Execute())
+ var/err = query_unflag_book.ErrorMsg()
+ log_game("SQL ERROR unflagging book. Error : \[[err]\]\n")
+ return
+
+ log_admin("[key_name(usr)] has unflagged the book [isbn].")
+ message_admins("[key_name_admin(usr)] has unflagged the book [isbn].")
+
+ else if(href_list["delete_library_book"])
+ var/DBQuery/query_delbook = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[isbn]")
+ if(!query_delbook.Execute())
+ var/err = query_delbook.ErrorMsg()
+ log_game("SQL ERROR deleting book. Error : \[[err]\]\n")
+ return
+
+ log_admin("[key_name(usr)] has deleted the book [isbn].")
+ message_admins("[key_name_admin(usr)] has deleted the book [isbn].")
+
+ // Refresh the page
+ src.view_flagged_books()
+
+
/proc/admin_jump_link(var/atom/target)
if(!target) return
// The way admin jump links handle their src is weirdly inconsistent...
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index c17671995ff..bf6575b6659 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -109,16 +109,17 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
switch(selected_type)
if("Mentorhelp")
- msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(mob)]) (CA ) (REJT ) [ai_found ? " (CL )" : ""]: [msg] "
+ msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(mob)]) (CA ) (REJT ) [ai_found ? " (CL )" : ""] (TAKE ) : [msg] "
for(var/client/X in mentorholders + modholders + adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
to_chat(X, msg)
if("Adminhelp")
- msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(mob)]) (CA ) (REJT ) [ai_found ? " (CL )" : ""]: [msg] "
+ msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(mob)]) (CA ) (REJT ) [ai_found ? " (CL )" : ""] (TAKE ) : [msg] "
for(var/client/X in modholders + adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
+ window_flash(X)
to_chat(X, msg)
//show it to the person adminhelping too
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 63241ce43c5..9976c7d10b9 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -133,6 +133,7 @@
if(holder && !C.holder)
recieve_message = "-- Click the [recieve_pm_type]'s name to reply -- \n"
if(C.adminhelped)
+ window_flash(C)
to_chat(C, recieve_message)
C.adminhelped = 0
@@ -149,17 +150,19 @@
adminhelp(reply) //sender has left, adminhelp instead
return
- recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)] : [msg] "
+
+ var/emoji_msg = "[msg] "
+ recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)] : [emoji_msg] "
to_chat(C, recieve_message)
- to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)] : [msg] ")
+ to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)] : [emoji_msg] ")
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
C.ckey_last_pm = ckey*/
//play the recieving admin the adminhelp sound (if they have them enabled)
- //non-admins shouldn't be able to disable this
- if(C.prefs.sound & SOUND_ADMINHELP)
+ //non-admins always hear the sound, as they cannot toggle it
+ if((!C.holder) || (C.prefs.sound & SOUND_ADMINHELP))
C << 'sound/effects/adminhelp.ogg'
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
@@ -172,13 +175,13 @@
switch(type)
if("Mentorhelp")
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
- to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg] ")
+ to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg] ")
if("Adminhelp")
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
- to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg] ")
+ to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg] ")
else
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
- to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg] ")
+ to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg] ")
/client/proc/cmd_admin_irc_pm()
if(prefs.muted & MUTE_ADMINHELP)
@@ -193,8 +196,8 @@
sanitize(msg)
if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends.
- to_chat(src, "\red Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting")
- to_chat(src, "\blue [msg]")
+ to_chat(src, "Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting ")
+ to_chat(src, "[msg] ")
return
send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]")
@@ -206,4 +209,4 @@
if(X == src)
continue
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
- to_chat(X, "PM: [key_name(src, X, 0)]->IRC-Admins: \blue [msg]")
+ to_chat(X, "PM: [key_name(src, X, 0)]->IRC-Admins: [msg] ")
diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm
index 350ed9a8737..68d3301b11e 100644
--- a/code/modules/admin/verbs/custom_event.dm
+++ b/code/modules/admin/verbs/custom_event.dm
@@ -10,11 +10,11 @@
var/input = input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null
if(!input || input == "")
custom_event_msg = null
- log_admin("[usr.key] has cleared the custom event text.")
+ log_admin("[key_name(usr)] has cleared the custom event text.")
message_admins("[key_name_admin(usr)] has cleared the custom event text.")
return
- log_admin("[usr.key] has changed the custom event text.")
+ log_admin("[key_name(usr)] has changed the custom event text.")
message_admins("[key_name_admin(usr)] has changed the custom event text.")
custom_event_msg = input
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 862eed1b986..28a0532bf13 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -296,7 +296,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M:Alienize()
feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into an alien.")
- message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1)
+ message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien. ", 1)
else
alert("Invalid mob")
@@ -316,7 +316,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M:slimeize()
feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into a slime.")
- message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a slime.", 1)
+ message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime. ", 1)
else
alert("Invalid mob")
@@ -336,7 +336,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(S)
S.create(M)
log_admin("[key_name(src)] has turned [M.key] into a Superhero.")
- message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a Superhero.", 1)
+ message_admins("[key_name_admin(usr)] made [key_name(M)] into a Superhero. ", 1)
else
alert("Invalid mob")
@@ -424,7 +424,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
alert("Invalid mob")
feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(src)] has granted [M.key] full access.")
- message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1)
+ message_admins("[key_name_admin(usr)] has granted [M.key] full access. ", 1)
/client/proc/cmd_assume_direct_control(var/mob/M in mob_list)
set category = "Admin"
@@ -440,7 +440,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
else
var/mob/dead/observer/ghost = new/mob/dead/observer(M,1)
ghost.ckey = M.ckey
- message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1)
+ message_admins("[key_name_admin(usr)] assumed direct control of [M]. ", 1)
log_admin("[key_name(usr)] assumed direct control of [M].")
var/mob/adminmob = src.mob
M.ckey = src.ckey
@@ -574,67 +574,35 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
alert("Invalid mob")
return
- //log_admin("[key_name(src)] has alienized [M.key].")
- var/list/dresspacks = list(
+ var/list/choices = list(
"strip",
"as job...",
- "Engineer RIG",
- "CE RIG",
- "Mining RIG",
- "Syndi RIG",
- "Wizard RIG",
- "Medical RIG",
- "Atmos RIG",
- "standard space gear",
- "tournament standard red",
- "tournament standard green",
- "tournament gangster",
- "tournament chef",
- "tournament janitor",
- "pirate",
- "space pirate",
- "soviet tourist",
- "soviet soldier",
- "soviet admiral",
- "tunnel clown",
- "mime assassin",
- "survivor",
- "greytide",
- "greytide leader",
- "greytide xeno",
- "masked killer",
- "singuloth knight",
- "dark lord",
- "assassin",
- "spy",
- "vox",
- "death commando",
- "syndicate agent",
- "syndicate operative",
- "syndicate bomber",
- "syndicate strike team",
- "syndicate officer",
- "chrono legionnaire",
- "blue wizard",
- "red wizard",
- "marisa wizard",
- "emergency response team member",
- "emergency response team leader",
- "nt vip guest",
- "nt navy officer", // now in jobs list
- "nt navy captain",
- "nt special ops officer", // now in jobs list
- "nt special ops formal",
- )
+ "emergency response team member",
+ "emergency response team leader"
+ )
+
+ var/admin_outfits = subtypesof(/datum/outfit/admin)
+ for(var/type in admin_outfits)
+ var/datum/outfit/O = type
+ var/name = initial(O.name)
+ if(name != "Naked")
+ choices[initial(O.name)] = type
+
var/dostrip = 0
switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel"))
if("Yes")
dostrip = 1
if("Cancel")
return
- var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
+
+ var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in choices
if(isnull(dresscode))
return
+
+ var/datum/outfit/O
+ if(!(dresscode in list("strip", "as job...", "emergency response team member", "emergency response team leader")))
+ O = choices[dresscode]
+
var/datum/job/jobdatum
if(dresscode == "as job...")
var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
@@ -648,6 +616,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(istype(I, /obj/item/organ))
continue
qdel(I)
+
+
switch(dresscode)
if("strip")
//do nothing
@@ -657,495 +627,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(jobdatum)
dresscode = "[jobdatum.title]"
jobdatum.equip(M)
- equip_special_id(M,jobdatum.get_access(),jobdatum.title, jobdatum.idtype)
-
- if("standard space gear")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
- M.equip_to_slot_or_del(J, slot_back)
- J.turn_on()
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- J.Topic(null, list("stat" = 1))
- equip_special_id(M,get_all_accesses(), "Space Explorer", /obj/item/weapon/card/id)
-
- if("Engineer RIG", "CE RIG", "Mining RIG", "Syndi RIG", "Wizard RIG", "Medical RIG", "Atmos RIG")
- if(dresscode=="Engineer RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig(M), slot_head)
- else if(dresscode=="CE RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/elite(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/elite(M), slot_head)
- else if(dresscode=="Mining RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/mining(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/mining(M), slot_head)
- else if(dresscode=="Syndi RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
- else if(dresscode=="Wizard RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/wizard(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/wizard(M), slot_head)
- else if(dresscode=="Medical RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/medical(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/medical(M), slot_head)
- else if(dresscode=="Atmos RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/atmos(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head)
- var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
- M.equip_to_slot_or_del(J, slot_back)
- J.turn_on()
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- equip_special_id(M,get_all_accesses(), "RIG Tester", /obj/item/weapon/card/id)
- J.Topic(null, list("stat" = 1))
-
- if("tournament standard red", "tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
- if(dresscode=="tournament standard red")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
- else
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
-
- if("tournament gangster") //gangster are supposed to fight each other. --rastaf0
- M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
-
- if("tournament chef") //Steven Seagal FTW
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store)
-
- if("tournament janitor")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- var/obj/item/weapon/storage/backpack/backpack = new(M)
- for(var/obj/item/I in backpack)
- qdel(I)
- M.equip_to_slot_or_del(backpack, slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand)
- var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
- bucket.reagents.add_reagent("water", 70)
- M.equip_to_slot_or_del(bucket, slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
-
- if("pirate")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id)
-
- if("space pirate") // not spaceworthy, just has fancier coat.
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id)
-
- if("tunnel clown")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/chaplain_hoodie(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
- equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
- M.equip_to_slot_or_del(fire_axe, slot_r_hand)
-
-
- if("mime assassin")
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back)
- if(M.gender == FEMALE)
- M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask)
- else
- M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- var/obj/item/device/pda/mime/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Mime"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
- equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
-
- if("survivor")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id)
- for(var/obj/item/carried_item in M.contents)
- if(!istype(carried_item, /obj/item/weapon/implant))
- carried_item.add_blood(M)
-
- if("greytide")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id)
-
- if("greytide leader")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id)
-
- if("greytide xeno")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id)
-
- if("masked killer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
- M.equip_to_slot_or_del(fire_axe, slot_r_hand)
- for(var/obj/item/carried_item in M.contents)
- if(!istype(carried_item, /obj/item/weapon/implant))
- carried_item.add_blood(M)//Oh yes, there will be blood...
-
- if("dark lord")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
- var/obj/item/clothing/suit/hooded/chaplain_hoodie/robe = new /obj/item/clothing/suit/hooded/chaplain_hoodie(M)
- robe.name = "dark lord robes"
- robe.hood.name = "dark lord hood"
- M.equip_to_slot_or_del(robe, slot_wear_suit)
- equip_special_id(M,get_all_accesses(), "Dark Lord", /obj/item/weapon/card/id/syndicate, "syndie")
-
- if("assassin")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
- for(var/obj/item/briefcase_item in sec_briefcase)
- qdel(briefcase_item)
- for(var/i=3, i>0, i--)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/c4, 1)
- // briefcase must be unlocked by setting the code.
- M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
- var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
- DUST.implant(M)
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Reaper"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
- equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate, "syndie")
-
- if("spy")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/chameleon(M), slot_glasses)
- var/obj/item/clothing/gloves/combat/G = new /obj/item/clothing/gloves/combat(src)
- G.name = "black gloves"
- M.equip_to_slot_or_del(G, slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store)
- var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
- DUST.implant(M)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack)
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Spy"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_belt)
- equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
-
-
- if("vox")
- if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear!
- M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie")
- else
- M.equip_vox_raider()
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand)
- M.regenerate_icons()
-
- if("death commando")
- M.equip_death_commando()
-
- if("syndicate agent")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Agent", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
- U.hidden_uplink.uplink_owner="[M.key]"
- U.hidden_uplink.uses = 20
- M.equip_to_slot_or_del(U, slot_r_store)
-
- if("syndicate bomber")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie")
-
- if("syndicate operative")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
- R.set_frequency(SYND_FREQ)
- M.equip_to_slot_or_del(R, slot_l_ear)
- var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
- U.hidden_uplink.uplink_owner="[M.key]"
- U.hidden_uplink.uses = 20
- M.equip_to_slot_or_del(U, slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
- equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Operative", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(M)
- E.implant(M)
-
- if("syndicate strike team")
- M.equip_syndicate_commando()
-
- if("syndicate officer")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(M), slot_head)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
- R.set_frequency(SYND_FREQ)
- M.equip_to_slot_or_del(R, slot_l_ear)
- var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
- U.hidden_uplink.uplink_owner="[M.key]"
- U.hidden_uplink.uses = 50
- M.equip_to_slot_or_del(U, slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses() + get_syndicate_access("Syndicate Commando"), "Syndicate Officer", /obj/item/weapon/card/id/syndicate, "commander")
- var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
- DUST.implant(M)
-
- if("nt vip guest")
- M.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head)
- M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
- M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda)
- equip_special_id(M,get_centcom_access("VIP Guest"), "VIP Guest", /obj/item/weapon/card/id/centcom)
-
- if("nt navy officer")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
- M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda)
- M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
- L.imp_in = M
- L.implanted = 1
- M.sec_hud_set_implants()
- equip_special_id(M,get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer", /obj/item/weapon/card/id/centcom)
-
- if("nt navy captain")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
- M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda)
- M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
- L.imp_in = M
- L.implanted = 1
- M.sec_hud_set_implants()
- equip_special_id(M,get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain", /obj/item/weapon/card/id/centcom)
if("emergency response team member", "emergency response team leader")
var/datum/response_team/equip_team = null
@@ -1173,189 +654,17 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
else
to_chat(src, "Invalid ERT Loadout selected")
- if("nt special ops officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) // job has /obj/item/clothing/head/beret/centcom/officer/navy
- M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_wear_pda)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
- // The following items are unique to this outfit - the special ops officer job does not spawn with them.
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/loyalty(M), slot_in_backpack)
- if("nt special ops formal")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // special
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack)
-
- var/obj/item/device/pda/centcom/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Special Operations Officer"
- pda.icon_state = "pda-syndi"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
-
- M.equip_or_collect(pda, slot_wear_pda)
- M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
-
- if("singuloth knight")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/singuloth(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/cyber(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/singuloth(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/claymore/ceremonial(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/knighthammer(M), slot_back)
- equip_special_id(M,get_all_accesses(), "Singuloth Knight", /obj/item/weapon/card/id)
-
- if("blue wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
-
- if("red wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
-
- if("marisa wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
-
- if("soviet tourist")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id)
-
- if("soviet soldier")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id)
-
- if("soviet admiral")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander")
- //W.icon_state = "commander"
-
- if("chrono legionnaire")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/chronos(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/chrono_eraser(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
- equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Chrono Legionnaire", /obj/item/weapon/card/id/syndicate, "syndie")
+ else // outfit datum
+ if(O)
+ M.equipOutfit(O, FALSE)
M.regenerate_icons()
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
- message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
+ message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]. ", 1)
return
-/client/proc/equip_special_id(var/mob/living/carbon/human/H, var/list/theaccess = null, var/jobtext, var/obj/item/weapon/card/id/id_type = /obj/item/weapon/card/id, var/special_icon = null)
- if(!check_rights(R_EVENT))
- return
-
- var/obj/item/weapon/card/id/W = new id_type(H)
- if(special_icon)
- W.icon_state = special_icon
- W.name = "[H.real_name]'s ID Card ([jobtext])"
- W.access = theaccess
- W.assignment = "[jobtext]"
- W.registered_name = H.real_name
- H.equip_to_slot_or_del(W, slot_wear_id)
/client/proc/startSinglo()
set category = "Debug"
@@ -1474,3 +783,57 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
error_cache.showTo(usr)
+
+/client/proc/jump_to_ruin()
+ set category = "Debug"
+ set name = "Jump to Ruin"
+ set desc = "Displays a list of all placed ruins to teleport to."
+
+ if(!check_rights(R_DEBUG))
+ return
+
+ var/list/names = list()
+ for(var/i in ruin_landmarks)
+ var/obj/effect/landmark/ruin/ruin_landmark = i
+ var/datum/map_template/ruin/template = ruin_landmark.ruin_template
+
+ var/count = 1
+ var/name = template.name
+ var/original_name = name
+
+ while(name in names)
+ count++
+ name = "[original_name] ([count])"
+
+ names[name] = ruin_landmark
+
+ var/ruinname = input("Select ruin", "Jump to Ruin") as null|anything in names
+
+ var/obj/effect/landmark/ruin/landmark = names[ruinname]
+
+ if(istype(landmark))
+ var/datum/map_template/ruin/template = landmark.ruin_template
+ admin_forcemove(usr, get_turf(landmark))
+
+ to_chat(usr, "[template.name] ")
+ to_chat(usr, "[template.description] ")
+
+ log_admin("[key_name(usr)] jumped to ruin [ruinname]")
+ if(!isobserver(usr))
+ message_admins("[key_name_admin(usr)] jumped to ruin [ruinname]", 1)
+
+ feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/toggle_medal_disable()
+ set category = "Debug"
+ set name = "Toggle Medal Disable"
+ set desc = "Toggles the safety lock on trying to contact the medal hub."
+
+ if(!check_rights(R_DEBUG))
+ return
+
+ global.medals_enabled = !global.medals_enabled
+
+ message_admins("[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout. ")
+ feedback_add_details("admin_verb","TMH") // If...
+ log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.")
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 30f97569c3b..8b8a2b58a52 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -15,7 +15,7 @@
if(T.active_hotspot)
burning = 1
- to_chat(usr, "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]")
+ to_chat(usr, "@[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("BURNING "):(null)] ")
for(var/datum/gas/trace_gas in GM.trace_gases)
to_chat(usr, "[trace_gas.type]: [trace_gas.moles]")
diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm
index 6ebd6b1256a..523fe5cb302 100644
--- a/code/modules/admin/verbs/freeze.dm
+++ b/code/modules/admin/verbs/freeze.dm
@@ -45,7 +45,7 @@ var/global/list/frozen_mob_list = list()
/mob/living/proc/admin_unFreeze(var/client/admin)
if(istype(admin))
to_chat(src, "You have been unfrozen by [key_name(admin)] ")
- message_admins("\blue [key_name_admin(admin)] unfroze [key_name_admin(src)]")
+ message_admins("[key_name_admin(admin)] unfroze [key_name_admin(src)] ")
log_admin("[key_name(admin)] unfroze [key_name(src)]")
anchored = 0
@@ -106,10 +106,10 @@ var/global/list/frozen_mob_list = list()
if(M.occupant)
M.removeVerb(/obj/mecha/verb/eject)
to_chat(M.occupant, "You have been frozen by [key] ")
- message_admins("\blue [key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]")
+ message_admins("[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name] ")
log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]")
else
- message_admins("\blue [key_name_admin(usr)] froze an empty [M.name]")
+ message_admins("[key_name_admin(usr)] froze an empty [M.name] ")
log_admin("[key_name(usr)] froze an empty [M.name]")
else if(M.can_move == 0)
M.can_move = 1
@@ -117,8 +117,8 @@ var/global/list/frozen_mob_list = list()
if(M.occupant)
M.addVerb(/obj/mecha/verb/eject)
to_chat(M.occupant, "You have been unfrozen by [key] ")
- message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
+ message_admins("[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name] ")
log_admin("[key_name(usr)] unfroze [M.occupant.name]/[M.occupant.ckey] in a [M.name]")
else
- message_admins("\blue [key_name_admin(usr)] unfroze an empty [M.name]")
+ message_admins("[key_name_admin(usr)] unfroze an empty [M.name] ")
log_admin("[key_name(usr)] unfroze an empty [M.name]")
diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm
index 480ff434a30..cecf04b93aa 100644
--- a/code/modules/admin/verbs/honksquad.dm
+++ b/code/modules/admin/verbs/honksquad.dm
@@ -62,14 +62,14 @@ var/global/sent_honksquad = 0
new_honksquad.update_internals_hud_icon(1)
//So they don't forget their code or mission.
- new_honksquad.mind.store_memory("Mission: \red [input].")
+ new_honksquad.mind.store_memory("Mission: [input]. ")
- to_chat(new_honksquad, "\blue You are a HONKsquad. [!honk_leader_selected?"commando":"LEADER "] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill. \nYour current mission is: [input] ")
+ to_chat(new_honksquad, "You are a HONKsquad. [!honk_leader_selected ? "commando" : "LEADER "] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill.\nYour current mission is: [input] ")
honksquad_number--
- message_admins("\blue [key_name_admin(usr)] has spawned a HONKsquad.", 1)
+ message_admins("[key_name_admin(usr)] has spawned a HONKsquad. ", 1)
log_admin("[key_name(usr)] used Spawn HONKsquad.")
return 1
diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
index 86a899ab847..4e691979507 100644
--- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm
+++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
@@ -122,8 +122,8 @@ var/global/sent_syndicate_infiltration_team = 0
syndimgmtmob.update_internals_hud_icon(1)
syndimgmtmob.faction += "syndicate"
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
- syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/elite, slot_wear_suit)
- syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/elite, slot_head)
+ syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
+ syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite, slot_head)
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate, slot_wear_mask)
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
opshud.join_hud(syndimgmtmob.mind.current)
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index bfc4f7a8887..5a53b0201b3 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -30,6 +30,12 @@ var/intercom_range_display_status = 0
src.pixel_x = -224
src.pixel_y = -224
+/obj/effect/debugging/mapfix_marker
+ name = "map fix marker"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "mapfixmarker"
+ desc = "I am a mappers mistake."
+
/obj/effect/debugging/marker
icon = 'icons/turf/areas.dmi'
icon_state = "yellow"
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index c416f224cf9..c7b2d6d537e 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -137,32 +137,38 @@
for(var/mob/M in mob_list)
if( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
+ M.on_varedit(variable)
else if(istype(O, /obj))
for(var/obj/A in world)
if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
+ A.on_varedit(variable)
else if(istype(O, /turf))
for(var/turf/A in world)
if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
+ A.on_varedit(variable)
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
if(M.type == O.type)
M.vars[variable] = O.vars[variable]
+ M.on_varedit(variable)
else if(istype(O, /obj))
for(var/obj/A in world)
if(A.type == O.type)
A.vars[variable] = O.vars[variable]
+ A.on_varedit(variable)
else if(istype(O, /turf))
for(var/turf/A in world)
if(A.type == O.type)
A.vars[variable] = O.vars[variable]
+ A.on_varedit(variable)
if("edit referenced object")
return .(O.vars[variable])
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 0be55889bc2..8cce4c5a761 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -131,7 +131,7 @@ var/list/forbidden_varedit_object_types = list(
L[var_value] = mod_list_add_ass() //haha
if("No")
L += var_value
-
+
/client/proc/mod_list(var/list/L)
if(!check_rights(R_VAREDIT)) return
@@ -440,6 +440,7 @@ var/list/forbidden_varedit_object_types = list(
if(var_as_text == null)
var_as_text = "[O.vars[variable]]"
+ O.on_varedit(variable)
log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_as_text]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_as_text]")
message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [var_as_text]", 1)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index e71c6981d97..8d201d6ee8a 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -35,6 +35,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
+ log_admin("[key_name(owner)] tried making Traitors with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Traitors with One-Click-Antag")
+
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_TRAITOR in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_TRAITOR))
@@ -69,6 +72,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
+ log_admin("[key_name(owner)] tried making Changelings with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Changelings with One-Click-Antag")
+
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_CHANGELING in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_CHANGELING))
@@ -101,6 +107,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
+ log_admin("[key_name(owner)] tried making Revolutionaries with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Revolutionaries with One-Click-Antag")
+
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_REV in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_REV))
@@ -127,6 +136,9 @@ client/proc/one_click_antag()
var/list/candidates = pollCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", "wizard")
+ log_admin("[key_name(owner)] tried making a Wizard with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making a Wizard with One-Click-Antag")
+
if(candidates.len)
var/mob/dead/observer/selected = pick(candidates)
candidates -= selected
@@ -146,6 +158,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
+ log_admin("[key_name(owner)] tried making a Cult with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making a Cult with One-Click-Antag")
+
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_CULTIST in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_CULTIST))
@@ -177,6 +192,9 @@ client/proc/one_click_antag()
var/mob/theghost = null
var/time_passed = world.time
+ log_admin("[key_name(owner)] tried making a Nuke Op Team with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making a Nuke Op Team with One-Click-Antag")
+
for(var/mob/G in respawnable_list)
if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special))
if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate"))
@@ -265,10 +283,18 @@ client/proc/one_click_antag()
//Abductors
/datum/admins/proc/makeAbductorTeam()
new /datum/event/abductor
+
+ log_admin("[key_name(owner)] tried making Abductors with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Abductors with One-Click-Antag")
+
return 1
/datum/admins/proc/makeAliens()
var/datum/event/alien_infestation/E = new /datum/event/alien_infestation
+
+ log_admin("[key_name(owner)] tried making Aliens with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Aliens with One-Click-Antag")
+
E.spawncount = 3
// TODO The fact we have to do this rather than just have events start
// when we ask them to, is bad.
@@ -289,6 +315,9 @@ client/proc/one_click_antag()
if(prob(10))
input = "Save Runtime and any other cute things on the station."
+ log_admin("[key_name(owner)] tried making a Death Squad with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making a Death Squad with One-Click-Antag")
+
var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned.
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
@@ -337,7 +366,7 @@ client/proc/one_click_antag()
//So they don't forget their code or mission.
- to_chat(new_syndicate_commando, "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER "] in the service of the Syndicate. \nYour current mission is: [input] ")
+ to_chat(new_syndicate_commando, "You are an Elite Syndicate. [!syndicate_leader_selected ? "commando" : "LEADER "] in the service of the Syndicate. \nYour current mission is: [input] ")
numagents--
if(numagents >= 6)
@@ -400,6 +429,9 @@ client/proc/one_click_antag()
var/leader_chosen = 0 //when the leader is chosen. The last person spawned.
+ log_admin("[key_name(owner)] tried making Vox Raiders with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Vox Raiders with One-Click-Antag")
+
//Generates a list of candidates from active ghosts.
for(var/mob/G in respawnable_list)
if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special))
@@ -444,8 +476,8 @@ client/proc/one_click_antag()
new_vox.key = theghost.key
ticker.mode.traitors += new_vox.mind
- to_chat(new_vox, "\blue You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: [input] ")
- to_chat(new_vox, "\red Don't forget to turn on your nitrogen internals!")
+ to_chat(new_vox, "You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: [input] ")
+ to_chat(new_vox, "Don't forget to turn on your nitrogen internals! ")
raiders--
if(raiders > max_raiders)
@@ -480,13 +512,12 @@ client/proc/one_click_antag()
new_vox.update_dna()
new_vox.update_eyes()
- for(var/obj/item/organ/external/limb in new_vox.organs)
+ for(var/obj/item/organ/external/limb in new_vox.bodyparts)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
//Now apply cortical stack.
var/obj/item/weapon/implant/cortical/I = new(new_vox)
- I.imp_in = new_vox
- I.implanted = 1
+ I.implant(new_vox)
cortical_stacks += I
new_vox.equip_vox_raider()
@@ -503,6 +534,9 @@ client/proc/one_click_antag()
var/list/mob/living/carbon/human/candidates = list()
var/mob/living/carbon/human/H = null
+ log_admin("[key_name(owner)] tried making Vampires with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Vampires with One-Click-Antag")
+
for(var/mob/living/carbon/human/applicant in player_list)
if(ROLE_VAMPIRE in applicant.client.prefs.be_special)
if(player_old_enough_antag(applicant.client,ROLE_VAMPIRE))
@@ -534,6 +568,9 @@ client/proc/one_click_antag()
var/mob/theghost = null
var/time_passed = world.time
+ log_admin("[key_name(owner)] tried making Thunderdome Teams with One-Click-Antag")
+ message_admins("[key_name_admin(owner)] tried making Thunderdone Teams with One-Click-Antag")
+
//Generates a list of candidates from active ghosts.
for(var/mob/G in respawnable_list)
spawn(0)
@@ -603,4 +640,4 @@ client/proc/one_click_antag()
to_chat(newMember, "You are a member of the RED Thunderdome team! Gear up and help your team destroy the green team!")
else
return 0
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 907fcb92913..9bfe544cef5 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -49,7 +49,7 @@
W.assignment = "Highlander"
W.registered_name = H.real_name
H.equip_to_slot_or_del(W, slot_wear_id)
- H.species.equip(H)
+ H.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm
index a88270077d6..750d0d89b93 100644
--- a/code/modules/admin/verbs/onlyoneteam.dm
+++ b/code/modules/admin/verbs/onlyoneteam.dm
@@ -55,7 +55,7 @@
H.equip_to_slot_or_del(W, slot_wear_id)
team_toggle = !team_toggle
- H.species.equip(H)
+ H.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used DODGEBAWWWWWWWL! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 957070eae8e..69093944f67 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -1,5 +1,18 @@
var/list/sounds_cache = list()
+/client/proc/stop_global_admin_sounds()
+ set category = "Event"
+ set name = "Stop Global Admin Sounds"
+ if(!check_rights(R_SOUNDS))
+ return
+
+ var/sound/awful_sound = sound(null, repeat = 0, wait = 0, channel = 777)
+
+ log_admin("[key_name(src)] stopped admin sounds.")
+ message_admins("[key_name_admin(src)] stopped admin sounds.", 1)
+ for(var/mob/M in player_list)
+ M << awful_sound
+
/client/proc/play_sound(S as sound)
set category = "Event"
set name = "Play Global Sound"
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 486b95f5a1b..4560c7affa9 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -7,13 +7,13 @@
if(usr.client)
if(usr.client.prefs.muted & MUTE_PRAY)
- to_chat(usr, "\red You cannot pray (muted).")
+ to_chat(usr, "You cannot pray (muted). ")
return
if(client.handle_spam_prevention(msg, MUTE_PRAY, OOC_COOLDOWN))
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "\blue [bicon(cross)] PRAY: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(src)]) (CA ) (SC ): [msg]"
+ msg = "[bicon(cross)] PRAY: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(src)]) (CA ) (SC ) (BLESS ) (SMITE ): [msg] "
for(var/client/X in admins)
if(check_rights(R_EVENT,0,X.mob))
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 79ee34fb635..af865f7f5c8 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -39,9 +39,9 @@
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
spawn(50)
- to_chat(M, "\red You have been sent to the prison station!")
+ to_chat(M, "You have been sent to the prison station! ")
log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.")
- message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1)
+ message_admins("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station. ", 1)
feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list)
@@ -61,10 +61,10 @@
if(usr)
if(usr.client)
if(usr.client.holder)
- to_chat(M, "\bold You hear a voice in your head... \italic [msg]")
+ to_chat(M, "old You hear a voice in your head... [msg] ")
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
- message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1)
+ message_admins("SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg] ", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_mentor_check_new_players() //Allows mentors / admins to determine who the newer players are.
@@ -88,7 +88,10 @@
missing_ages = 1
continue
if(C.player_age < age)
- msg += "[key_name_admin(C)]: account is [C.player_age] days old "
+ if(check_rights(R_ADMIN, 0))
+ msg += "[key_name_admin(C.mob)]: [C.player_age] days old "
+ else
+ msg += "[key_name_mentor(C.mob)]: [C.player_age] days old "
if(missing_ages)
to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present")
@@ -112,7 +115,7 @@
return
to_chat(world, "[msg]")
log_admin("GlobalNarrate: [key_name(usr)] : [msg]")
- message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)]: [msg] ", 1)
+ message_admins("GlobalNarrate: [key_name_admin(usr)]: [msg] ", 1)
feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE
@@ -135,7 +138,7 @@
to_chat(M, msg)
log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]")
- message_admins("\blue \bold DirectNarrate: [key_name_admin(usr)] to ([key_name_admin(M)]): [msg] ", 1)
+ message_admins("DirectNarrate: [key_name_admin(usr)] to ([key_name_admin(M)]): [msg] ", 1)
feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_godmode(mob/M as mob in mob_list)
@@ -146,7 +149,7 @@
return
M.status_flags ^= GODMODE
- to_chat(usr, "\blue Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]")
+ to_chat(usr, "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"] ")
log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]")
message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1)
@@ -330,7 +333,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_xeno.key = G_found.key
to_chat(new_xeno, "You have been fully respawned. Enjoy the game.")
- message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
+ message_admins("[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno. ", 1)
return //all done. The ghost is auto-deleted
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
@@ -434,7 +437,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
- message_admins("\blue [key_name_admin(usr)] has respawned [key_name_admin(G_found)] as [new_character.real_name].", 1)
+ message_admins("[key_name_admin(usr)] has respawned [key_name_admin(G_found)] as [new_character.real_name]. ", 1)
to_chat(new_character, "You have been fully respawned. Enjoy the game.")
@@ -470,7 +473,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else return 0
new_xeno.ckey = ckey
- message_admins("\blue [key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste].", 1)
+ message_admins("[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste]. ", 1)
return 1
@@ -534,65 +537,52 @@ Traitors and the like can also be revived with the previous role mostly intact.
M.revive()
log_admin("[key_name(usr)] healed / revived [key_name(M)]")
- message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!", 1)
+ message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]! ", 1)
feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_create_centcom_report()
set category = "Event"
set name = "Create Communications Report"
- var/list/MsgType = list("Centcom Report","Enemy Communications")
+
if(!check_rights(R_SERVER|R_EVENT))
return
+//the stuff on the list is |"report type" = "report title"|, if that makes any sense
+ var/list/MsgType = list("Central Command Report" = "Nanotrasen Update",
+ "Syndicate Communique" = "Syndicate Message",
+ "Space Wizard Federation Message" = "Sorcerous Message",
+ "Enemy Communications" = "Unknown Message",
+ "Custom" = "Cryptic Message")
+
+ var/list/MsgSound = list("Beep" = 'sound/misc/notice2.ogg',
+ "Enemy Communications Intercepted" = 'sound/AI/intercept2.ogg',
+ "New Command Report Created" = 'sound/AI/commandreport.ogg')
+
var/type = input(usr, "Pick a type of report to send", "Report Type", "") as anything in MsgType
- var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null
- var/customname = input(usr, "Pick a title for the report.", "Title") as text|null
+
+ if(type == "Custom")
+ type = input(usr, "What would you like the report type to be?", "Report Type", "Encrypted Transmission") as text|null
+
+ var/customname = input(usr, "Pick a title for the report.", "Title", MsgType[type]) as text|null
+ if(!customname)
+ return
+ var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What's the message?") as message|null
if(!input)
return
- if(type == "Enemy Communications")
- if(!customname)
- customname = type
+ switch(alert("Should this be announced to the general population?",,"Yes","No", "Cancel"))
+ if("Yes")
+ var/beepsound = input(usr, "What sound should the announcement make?", "Announcement Sound", "") as anything in MsgSound
- var/from = input(usr, "What kind of report? Example: Syndicate Communique", "From") as text|null
- if(!from)
- from = "Syndicate Communique"
- switch(alert("Should this be announced to the general population?",,"Yes","No"))
- if("Yes")
- communications_announcement.Announce(input, customname, , , , from);
- if("No")
- to_chat(world, "\red [from] available at all communications consoles.")
+ command_announcement.Announce(input, customname, MsgSound[beepsound], , , type)
+ print_command_report(input, "[command_name()] Update")
+ else if("No")
+ //same thing as the blob stuff - it's not public, so it's classified, dammit
+ command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', from = "[command_name()] Update")
+ print_command_report(input, "Classified [command_name()] Update")
+ else
+ return
- for(var/obj/machinery/computer/communications/C in machines)
- if(! (C.stat & (BROKEN|NOPOWER) ) )
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
- P.name = "[from]"
- P.info = input
- P.update_icon()
- C.messagetitle.Add("[from]")
- C.messagetext.Add(P.info)
-
-
- if(type == "Centcom Report")
- if(!customname)
- customname = "Nanotrasen Update"
-
- switch(alert("Should this be announced to the general population?",,"Yes","No"))
- if("Yes")
- command_announcement.Announce(input, customname);
- if("No")
- to_chat(world, "\red New Nanotrasen Update available at all communication consoles.")
-
- for(var/obj/machinery/computer/communications/C in machines)
- if(! (C.stat & (BROKEN|NOPOWER) ) )
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
- P.name = "'[command_name()] Update.'"
- P.info = input
- P.update_icon()
- C.messagetitle.Add("[command_name()] Update")
- C.messagetext.Add(P.info)
-
-// world << sound('sound/AI/commandreport.ogg')
log_admin("[key_name(src)] has created a communications report: [input]")
message_admins("[key_name_admin(src)] has created a communications report", 1)
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -718,7 +708,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
mob.gib()
log_admin("[key_name(usr)] used gibself.")
- message_admins("\blue [key_name_admin(usr)] used gibself.", 1)
+ message_admins("[key_name_admin(usr)] used gibself. ", 1)
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_check_contents(mob/living/M as mob in mob_list)
@@ -747,7 +737,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
view = world.view
log_admin("[key_name(usr)] changed their view range to [view].")
- //message_admins("\blue [key_name_admin(usr)] changed their view range to [view].", 1) //why? removed by order of XSI
+ //message_admins("[key_name_admin(usr)] changed their view range to [view]. ", 1) //why? removed by order of XSI
feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -845,7 +835,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1)
if(notifyplayers == "Yes")
- to_chat(world, "\blue Admin [usr.key] has forced the players to have completely random identities!")
+ to_chat(world, "Admin [usr.key] has forced the players to have completely random identities! ")
to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet .")
@@ -892,7 +882,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] blanked all telecomms scripts.")
feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
/client/proc/toggle_ert_calling()
set category = "Event"
set name = "Toggle ERT"
@@ -903,11 +892,31 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(ticker.mode.ert_disabled)
ticker.mode.ert_disabled = 0
- to_chat(usr, "\blue ERT has been Enabled .")
+ to_chat(usr, "ERT has been Enabled . ")
log_admin("Admin [key_name(src)] has enabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1)
else
ticker.mode.ert_disabled = 1
- to_chat(usr, "\red ERT has been Disabled .")
+ to_chat(usr, "ERT has been Disabled . ")
log_admin("Admin [key_name(src)] has disabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1)
+
+/client/proc/modify_goals()
+ set category = "Event"
+ set name = "Modify Station Goals"
+
+ if(!check_rights(R_EVENT))
+ return
+
+ holder.modify_goals()
+
+/datum/admins/proc/modify_goals()
+ if(!ticker || !ticker.mode)
+ to_chat(usr, "This verb can only be used if the round has started. ")
+ return
+
+ var/dat = ""
+ for(var/datum/station_goal/S in ticker.mode.station_goals)
+ dat += "[S.name] - Announce | Remove "
+ dat += "Add New Goal "
+ usr << browse(dat, "window=goals;size=400x400")
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index f6de49de939..83e8d617210 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -68,10 +68,10 @@ var/global/sent_strike_team = 0
//So they don't forget their code or mission.
if(nuke_code)
- new_commando.mind.store_memory("Nuke Code: \red [nuke_code].")
- new_commando.mind.store_memory("Mission: \red [input].")
+ new_commando.mind.store_memory("Nuke Code: [nuke_code]. ")
+ new_commando.mind.store_memory("Mission: [input]. ")
- to_chat(new_commando, "\blue You are a Special Ops. [!leader_selected?"commando":"LEADER "] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: [input] ")
+ to_chat(new_commando, "You are a Special Ops. [!leader_selected ? "commando" : "LEADER "] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: [input] ")
commando_number--
@@ -92,7 +92,7 @@ var/global/sent_strike_team = 0
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
- message_admins("\blue [key_name_admin(usr)] has spawned a CentComm strike squad.", 1)
+ message_admins("[key_name_admin(usr)] has spawned a CentComm strike squad. ", 1)
log_admin("[key_name(usr)] used Spawn Death Squad.")
return 1
@@ -157,10 +157,8 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(src), slot_r_hand)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)//Here you go Deuryn
- L.imp_in = src
- L.implanted = 1
- sec_hud_set_implants()
+ var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(src)
+ L.implant(src)
var/obj/item/weapon/card/id/W = new(src)
W.name = "[real_name]'s ID Card"
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 33512a3fe10..da6d981a890 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -75,10 +75,10 @@ var/global/sent_syndicate_strike_team = 0
//So they don't forget their code or mission.
if(nuke_code)
- new_syndicate_commando.mind.store_memory("Nuke Code: \red [nuke_code].")
- new_syndicate_commando.mind.store_memory("Mission: \red [input].")
+ new_syndicate_commando.mind.store_memory("Nuke Code: [nuke_code] .")
+ new_syndicate_commando.mind.store_memory("Mission: [input] .")
- to_chat(new_syndicate_commando, "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER "] in the service of the Syndicate. \nYour current mission is: [input] ")
+ to_chat(new_syndicate_commando, "You are an Elite Syndicate. [!syndicate_leader_selected ? "commando" : "LEADER "] in the service of the Syndicate. \nYour current mission is: [input] ")
new_syndicate_commando.faction += "syndicate"
syndicate_commando_number--
@@ -87,7 +87,7 @@ var/global/sent_syndicate_strike_team = 0
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
- message_admins("\blue [key_name_admin(usr)] has spawned a Syndicate strike squad.", 1)
+ message_admins("[key_name_admin(usr)] has spawned a Syndicate strike squad. ", 1)
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm
index cabf767b620..316adf935b0 100644
--- a/code/modules/admin/verbs/ticklag.dm
+++ b/code/modules/admin/verbs/ticklag.dm
@@ -15,10 +15,7 @@
world.tick_lag = newtick
feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- switch(alert("Enable Tick Compensation?","Tick Comp is currently: [config.Tickcomp]","Yes","No"))
- if("Yes") config.Tickcomp = 1
- else config.Tickcomp = 0
else
- to_chat(src, "\red Error: ticklag(): Invalid world.ticklag value. No changes made.")
+ to_chat(src, "Error: ticklag(): Invalid world.ticklag value. No changes made. ")
diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm
index 6c95873a7da..0da0dfc42f6 100644
--- a/code/modules/admin/verbs/tripAI.dm
+++ b/code/modules/admin/verbs/tripAI.dm
@@ -14,9 +14,9 @@
if(ticker.triai)
ticker.triai = 0
to_chat(usr, "Only one AI will be spawned at round start.")
- message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1)
+ message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start. ", 1)
else
ticker.triai = 1
to_chat(usr, "There will be an AI Triumvirate at round start.")
- message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1)
+ message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start. ", 1)
return
diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm
index 9878a4b5e5e..cd09ebe4427 100644
--- a/code/modules/alarm/alarm_handler.dm
+++ b/code/modules/alarm/alarm_handler.dm
@@ -47,6 +47,11 @@
existing.clear(source)
return check_alarm_cleared(existing)
+/datum/alarm_handler/proc/has_major_alarms()
+ if(alarms && alarms.len)
+ return 1
+ return 0
+
/datum/alarm_handler/proc/major_alarms()
return alarms
diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm
index 3c68c7142f4..b043eb934c9 100644
--- a/code/modules/arcade/arcade_base.dm
+++ b/code/modules/arcade/arcade_base.dm
@@ -61,7 +61,7 @@
/obj/machinery/arcade/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/screwdriver) && anchored)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
update_icon()
@@ -72,8 +72,8 @@
if(pay_with_card(C))
tokens += 1
return
- else if(istype(O, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/C = O
+ else if(istype(O, /obj/item/stack/spacecash))
+ var/obj/item/stack/spacecash/C = O
if(pay_with_cash(C, user))
tokens += 1
return
@@ -83,16 +83,12 @@
/obj/machinery/arcade/update_icon()
return
-/obj/machinery/arcade/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, var/mob/user)
- if(cashmoney.get_total() < token_price)
+/obj/machinery/arcade/proc/pay_with_cash(obj/item/stack/spacecash/cashmoney, mob/user)
+ if(cashmoney.amount < token_price)
to_chat(user, "[bicon(cashmoney)] That is not enough money. ")
return 0
visible_message("[usr] inserts a credit chip into [src]. ")
- var/left = cashmoney.get_total() - token_price
- user.unEquip(cashmoney)
- qdel(cashmoney)
- if(left)
- dispense_cash(left, src.loc, user)
+ cashmoney.use(token_price)
return 1
/obj/machinery/arcade/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/mob/user)
diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm
index d3457696268..6af1ca30f36 100644
--- a/code/modules/arcade/arcade_prize.dm
+++ b/code/modules/arcade/arcade_prize.dm
@@ -67,7 +67,7 @@
throwforce = 0
throw_speed = 1
throw_range = 1
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
max_amount = 9999 //Dang that's a lot of tickets
/obj/item/stack/tickets/New(var/loc, var/amount=null)
@@ -86,4 +86,4 @@
else if(amount >= 4)
icon_state = "tickets_2"
else
- icon_state = "tickets_1"
\ No newline at end of file
+ icon_state = "tickets_1"
diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm
index 97055664cdb..dc0b47cd4b0 100644
--- a/code/modules/arcade/mob_hunt/battle_computer.dm
+++ b/code/modules/arcade/mob_hunt/battle_computer.dm
@@ -51,8 +51,7 @@
mob_hunt_server.red_terminal = null
if(mob_hunt_server.blue_terminal == src)
mob_hunt_server.blue_terminal = null
- if(avatar)
- qdel(avatar)
+ QDEL_NULL(avatar)
return ..()
/obj/machinery/computer/mob_battle_terminal/attackby(obj/item/O, mob/user)
diff --git a/code/modules/arcade/mob_hunt/mob_avatar.dm b/code/modules/arcade/mob_hunt/mob_avatar.dm
index 8717d5eb2a5..4603622da2a 100644
--- a/code/modules/arcade/mob_hunt/mob_avatar.dm
+++ b/code/modules/arcade/mob_hunt/mob_avatar.dm
@@ -42,9 +42,9 @@
attempt_capture(P, -20) //attempting a melee capture reduces the mob's effective run_chance by 20% to balance the risk of triggering a trap mob
return 1
-/obj/effect/nanomob/hitby(obj/item/O)
- if(istype(O, /obj/item/device/pda))
- var/obj/item/device/pda/P = O
+/obj/effect/nanomob/hitby(atom/movable/AM)
+ if(istype(AM, /obj/item/device/pda))
+ var/obj/item/device/pda/P = AM
attempt_capture(P) //attempting a ranged capture does not affect the mob's effective run_chance but does prevent you from being shocked by a trap mob
return 1
diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm
index 16aea7ba55f..26393e8e370 100644
--- a/code/modules/arcade/mob_hunt/mob_cards.dm
+++ b/code/modules/arcade/mob_hunt/mob_cards.dm
@@ -7,7 +7,7 @@
icon_state = "trade_card"
force = 0
throwforce = 1
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/datum/mob_hunt/mob_data
/obj/item/weapon/nanomob_card/proc/update_info()
@@ -35,9 +35,9 @@
/obj/item/weapon/storage/box/nanomob_booster_pack
name = "Nano-Mob Hunter Trading Card Booster Pack"
desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
- can_hold = list("/obj/item/weapon/nanomob_card")
+ can_hold = list(/obj/item/weapon/nanomob_card)
/obj/item/weapon/storage/box/nanomob_booster_pack/New()
..()
for(var/i in 1 to 6)
- new /obj/item/weapon/nanomob_card/booster(src)
\ No newline at end of file
+ new /obj/item/weapon/nanomob_card/booster(src)
diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm
index e1636fa4e33..93ffbe7e419 100644
--- a/code/modules/arcade/prize_counter.dm
+++ b/code/modules/arcade/prize_counter.dm
@@ -41,7 +41,7 @@
to_chat(user, "\The [T] seems stuck to your hand! ")
return
if(istype(O, /obj/item/weapon/screwdriver) && anchored)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
update_icon()
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 84e10835215..8092d768ad0 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -4,12 +4,14 @@
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = ""
flags = CONDUCT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=100)
throwforce = 2
throw_speed = 3
throw_range = 10
origin_tech = "magnets=1"
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
var/bomb_name = "bomb" // used for naming bombs / mines
@@ -114,7 +116,7 @@
attach_assembly(var/obj/item/device/assembly/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
if(holder.attach(A,src,user))
- to_chat(user, "\blue You attach \the [A] to \the [src]!")
+ to_chat(user, "You attach \the [A] to \the [src]! ")
return 1
return 0
@@ -127,9 +129,9 @@
return
if(istype(W, /obj/item/weapon/screwdriver))
if(toggle_secure())
- to_chat(user, "\blue \The [src] is ready!")
+ to_chat(user, "\The [src] is ready! ")
else
- to_chat(user, "\blue \The [src] can now be attached!")
+ to_chat(user, "\The [src] can now be attached! ")
return
..()
return
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index f6019ace266..41a67a43560 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/tank.dmi'
item_state = "assembly"
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
throw_range = 4
flags = CONDUCT //Copied this from old code, so this may or may not be necessary
@@ -171,4 +171,4 @@
if(!T)
return
T.assume_air(removed)
- air_update_turf()
\ No newline at end of file
+ air_update_turf()
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index f4cafef9c97..f4a71a77ced 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -5,7 +5,7 @@
item_state = "assembly"
flags = CONDUCT
throwforce = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 10
@@ -100,7 +100,7 @@
a_left.hear_talk(M, msg)
if(a_right)
a_right.hear_talk(M, msg)
-
+
hear_message(mob/living/M as mob, msg)
if(a_left)
a_left.hear_message(M, msg)
@@ -140,15 +140,15 @@
attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/screwdriver))
if(!a_left || !a_right)
- to_chat(user, "\red BUG:Assembly part missing, please report this!")
+ to_chat(user, "BUG:Assembly part missing, please report this! ")
return
a_left.toggle_secure()
a_right.toggle_secure()
secured = !secured
if(secured)
- to_chat(user, "\blue \The [src] is ready!")
+ to_chat(user, "\The [src] is ready! ")
else
- to_chat(user, "\blue \The [src] can now be taken apart!")
+ to_chat(user, "\The [src] can now be taken apart! ")
update_icon()
return
else
@@ -160,7 +160,7 @@
src.add_fingerprint(user)
if(src.secured)
if(!a_left || !a_right)
- to_chat(user, "\red Assembly part missing!")
+ to_chat(user, "Assembly part missing! ")
return
if(istype(a_left,a_right.type))//If they are the same type it causes issues due to window code
switch(alert("Which side would you like to use?",,"Left","Right"))
@@ -210,8 +210,3 @@
qdel(src)
return
return
-
-
-
-
-
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index e6505e385ad..b1c76236853 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -12,8 +12,7 @@
sparks.attach(src)
/obj/item/device/assembly/igniter/Destroy()
- qdel(sparks)
- sparks = null
+ QDEL_NULL(sparks)
return ..()
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 7f9181ca937..3e0c8061ceb 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -16,8 +16,7 @@
/obj/item/device/assembly/infra/Destroy()
if(first)
- qdel(first)
- first = null
+ QDEL_NULL(first)
last = null
fire_location = null
return ..()
@@ -255,9 +254,7 @@
/obj/effect/beam/i_beam/Destroy()
if(master.first == src)
master.first = null
- if(next)
- qdel(next)
- next = null
+ QDEL_NULL(next)
if(previous)
previous.next = null
master.last = previous
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index e1078ed9caa..f3296cdabb0 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -19,7 +19,7 @@
describe()
if(timing)
- return "\blue The proximity sensor is arming."
+ return "The proximity sensor is arming. "
return "The proximity sensor is [scanning?"armed":"disarmed"]."
activate()
@@ -109,7 +109,7 @@
interact(mob/user as mob)//TODO: Change this to the wires thingy
if(!secured)
- user.show_message("\red The [name] is unsecured!")
+ user.show_message("The [name] is unsecured! ")
return 0
var/second = time % 60
var/minute = (time - second) / 60
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index 3aa24a2d014..aa8bc299e66 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -6,14 +6,12 @@
var/obj/item/clothing/head/helmet/part1 = null
var/obj/item/device/radio/electropack/part2 = null
var/status = 0
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
flags = CONDUCT
/obj/item/assembly/shock_kit/Destroy()
- qdel(part1)
- part1 = null
- qdel(part2)
- part2 = null
+ QDEL_NULL(part1)
+ QDEL_NULL(part2)
return ..()
/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 0ce52543909..9a76869d339 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -61,7 +61,7 @@
if(!flag1)
dat += {"
Send Signal
- Reciever is [receiving?"on":"off"]
+ Receiver is [receiving?"on":"off"]
"}
dat += {"
Frequency/Code for signaler:
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 179d7df2347..0587a806b2b 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -74,7 +74,7 @@
interact(mob/user as mob)//TODO: Have this use the wires
if(!secured)
- user.show_message("\red The [name] is unsecured!")
+ user.show_message("The [name] is unsecured! ")
return 0
var/second = time % 60
var/minute = (time - second) / 60
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index af9138724e6..ba0752dd28e 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -35,7 +35,7 @@
if(findtext(msg, recorded) && type == recorded_type)
pulse(0)
var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("[bicon(src)] \red beeps!")
+ T.visible_message("[bicon(src)] beeps! ")
activate()
return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way.
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
deleted file mode 100644
index 6b6eb863b45..00000000000
--- a/code/modules/awaymissions/bluespaceartillery.dm
+++ /dev/null
@@ -1,79 +0,0 @@
-/obj/machinery/computer/artillerycontrol
- name = "bluespace artillery control"
- icon_screen = "accelerator"
- icon_keyboard = "accelerator_key"
- icon_state = "computer-wires"
- req_access = list(access_cent_commander)
- var/last_fire = 0
- var/reload_cooldown = 180 // 3 minute cooldown
- var/area/targetarea
-
- light_color = LIGHT_COLOR_LIGHTBLUE
-
-/obj/machinery/computer/artillerycontrol/attack_ai(user as mob)
- to_chat(user, "Access denied. ")
- return
-
-/obj/machinery/computer/artillerycontrol/attack_hand(user as mob)
- ui_interact(user)
-
-/obj/machinery/computer/artillerycontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "bluespace_artillery.tmpl", "Bluespace Control", 400, 260)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/computer/artillerycontrol/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
- var/data[0]
-
- var/time_to_wait = round(reload_cooldown - ((world.time / 10) - last_fire), 1)
- var/mins = round(time_to_wait / 60)
- var/seconds = time_to_wait - (60*mins)
- data["reloadtime_mins"] = mins
- data["reloadtime_secs"] = (seconds < 10) ? "0[seconds]" : seconds
- if(targetarea)
- var/areaname = sanitize(targetarea.name)
- data["target"] = "Locked on to [areaname]"
- else
- data["target"] = "No Lock"
-
- return data
-
-/obj/machinery/computer/artillerycontrol/Topic(href, href_list)
- if(..())
- return 1
-
- if(href_list["area"])
- var/A
- A = input("Select the target area.", "Select Area", A) in ghostteleportlocs|null
- var/area/thearea = ghostteleportlocs[A]
- if(..() || !istype(thearea))
- return
-
- targetarea = thearea
-
- if(href_list["fire"])
- var/delta = (world.time / 10) - last_fire
- if(reload_cooldown > delta)
- return 1
-
- command_announcement.Announce("Bluespace artillery fire detected. Brace for impact.")
- message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1)
- var/list/L = list()
- for(var/turf/T in get_area_turfs(targetarea.type))
- L += T
- var/loc = pick(L)
- explosion(loc,2,5,11)
- last_fire = world.time / 10
-
- nanomanager.update_uis(src)
-
-/obj/structure/artilleryplaceholder
- name = "artillery"
- icon = 'icons/obj/machines/artillery.dmi'
- anchored = 1
- density = 1
-
-/obj/structure/artilleryplaceholder/decorative
- density = 0
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index b2864d1c7cc..be88df0c4e4 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -26,6 +26,8 @@
var/corpseidicon = null //For setting it to be a gold, silver, centcomm etc ID
var/timeofdeath = null
var/coffin = 0
+ var/brute_damage = 0
+ var/oxy_damage = 0
/obj/effect/landmark/corpse/initialize()
if(istype(src,/obj/effect/landmark/corpse/clown))
@@ -37,34 +39,36 @@
var/mob/living/carbon/human/human/M = new /mob/living/carbon/human/human (src.loc)
M.real_name = src.name
M.death(1) //Kills the new mob
+ M.adjustOxyLoss(oxy_damage)
+ M.adjustBruteLoss(brute_damage)
M.timeofdeath = timeofdeath
- if(src.mob_species)
- M.set_species(src.mob_species)
- if(src.corpseuniform)
- M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
- if(src.corpsesuit)
- M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
- if(src.corpseshoes)
- M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
- if(src.corpsegloves)
- M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
- if(src.corpseradio)
- M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
- if(src.corpseglasses)
- M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
- if(src.corpsemask)
- M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
- if(src.corpsehelmet)
- M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
- if(src.corpsebelt)
- M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
- if(src.corpsepocket1)
- M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
- if(src.corpsepocket2)
- M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
- if(src.corpseback)
- M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
- if(src.corpseid == 1)
+ if(mob_species)
+ M.set_species(mob_species)
+ if(corpseuniform)
+ M.equip_to_slot_or_del(new corpseuniform(M), slot_w_uniform)
+ if(corpsesuit)
+ M.equip_to_slot_or_del(new corpsesuit(M), slot_wear_suit)
+ if(corpseshoes)
+ M.equip_to_slot_or_del(new corpseshoes(M), slot_shoes)
+ if(corpsegloves)
+ M.equip_to_slot_or_del(new corpsegloves(M), slot_gloves)
+ if(corpseradio)
+ M.equip_to_slot_or_del(new corpseradio(M), slot_l_ear)
+ if(corpseglasses)
+ M.equip_to_slot_or_del(new corpseglasses(M), slot_glasses)
+ if(corpsemask)
+ M.equip_to_slot_or_del(new corpsemask(M), slot_wear_mask)
+ if(corpsehelmet)
+ M.equip_to_slot_or_del(new corpsehelmet(M), slot_head)
+ if(corpsebelt)
+ M.equip_to_slot_or_del(new corpsebelt(M), slot_belt)
+ if(corpsepocket1)
+ M.equip_to_slot_or_del(new corpsepocket1(M), slot_r_store)
+ if(corpsepocket2)
+ M.equip_to_slot_or_del(new corpsepocket2(M), slot_l_store)
+ if(corpseback)
+ M.equip_to_slot_or_del(new corpseback(M), slot_back)
+ if(corpseid == 1)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
var/datum/job/jobdatum
@@ -73,9 +77,9 @@
if(J.title == corpseidaccess)
jobdatum = J
break
- if(src.corpseidicon)
+ if(corpseidicon)
W.icon_state = corpseidicon
- if(src.corpseidaccess)
+ if(corpseidaccess)
if(jobdatum)
W.access = jobdatum.get_access()
else
@@ -84,18 +88,14 @@
W.assignment = corpseidjob
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
- if(src.coffin == 1)
+ if(coffin == 1)
var/obj/structure/closet/coffin/sarcophagus/sarc = locate(/obj/structure/closet/coffin/sarcophagus) in loc
if(sarc) M.loc = sarc
qdel(src)
-
-
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
-
-
-
-
+/obj/effect/landmark/corpse/damaged
+ brute_damage = 1000
/obj/effect/landmark/corpse/syndicatesoldier
name = "Syndicate Operative"
@@ -116,12 +116,12 @@
/obj/effect/landmark/corpse/syndicatecommando
name = "Syndicate Commando"
corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/space/rig/syndi
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/weapon/tank/jetpack/oxygen
corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
corpseid = 1
@@ -170,10 +170,10 @@
corpseidjob = "Station Engineer"
corpseidaccess = "Station Engineer"
-/obj/effect/landmark/corpse/engineer/rig
- corpsesuit = /obj/item/clothing/suit/space/rig
+/obj/effect/landmark/corpse/engineer/hardsuit
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit
corpsemask = /obj/item/clothing/mask/breath
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit
/obj/effect/landmark/corpse/clown
@@ -255,10 +255,10 @@
corpseidjob = "Shaft Miner"
corpseidaccess = "Shaft Miner"
-/obj/effect/landmark/corpse/miner/rig
- corpsesuit = /obj/item/clothing/suit/space/rig/mining
+/obj/effect/landmark/corpse/miner/hardsuit
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/mining
corpsemask = /obj/item/clothing/mask/breath
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig/mining
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/mining
/////////////////Officers//////////////////////
diff --git a/code/modules/awaymissions/map_rng.dm b/code/modules/awaymissions/map_rng.dm
index 147d41171c4..64350c99737 100644
--- a/code/modules/awaymissions/map_rng.dm
+++ b/code/modules/awaymissions/map_rng.dm
@@ -18,6 +18,11 @@
template_name = tname
if(template_name)
template = map_templates[template_name]
+ // Catches the interim-zone of worldstart and roundstart
+ // I want both the ticker to exist (so mapped-in maploaders don't trip this)
+ // but also not have started yet (since the zlevel system would handle this on its own otherwise)
+ if((ticker && ticker.current_state < GAME_STATE_PLAYING))
+ attempt_init()
/obj/effect/landmark/map_loader/initialize()
..()
diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
new file mode 100644
index 00000000000..52d8caa6f74
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
@@ -0,0 +1,257 @@
+/area/awaymission/UO71
+ name = "UO71"
+ icon_state = "away"
+ report_alerts = 0
+ tele_proof = 1
+
+
+/area/awaymission/UO71/plaza
+ name = "UO71 Plaza"
+ icon_state = "awaycontent1"
+ fire = 1
+
+/area/awaymission/UO71/centralhall
+ name = "UO71 Central"
+ icon_state = "awaycontent2"
+ fire = 1
+
+/area/awaymission/UO71/eng
+ name = "UO71 Engineering"
+ icon_state = "awaycontent3"
+ fire = 1
+
+/area/awaymission/UO71/mining
+ name = "UO71 Mining"
+ icon_state = "awaycontent4"
+ fire = 1
+
+/area/awaymission/UO71/science
+ name = "UO71 Science"
+ icon_state = "awaycontent5"
+ fire = 1
+
+/area/awaymission/UO71/medical
+ name = "UO71 Medical"
+ icon_state = "awaycontent6"
+ fire = 1
+
+/area/awaymission/UO71/gateway
+ name = "UO71 Gateway"
+ icon_state = "awaycontent7"
+ fire = 1
+
+/area/awaymission/UO71/outside
+ name = "UO71 Outside"
+ icon_state = "awaycontent8"
+
+/area/awaymission/UO71/bridge
+ name = "UO71 Bridge"
+ icon_state = "awaycontent21"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/queen
+ name = "UO71 Queen Lair"
+ icon_state = "awaycontent9"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/prince
+ name = "UO71 Prince Containment"
+ icon_state = "awaycontent10"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/mother
+ name = "UO71 Mother Containment"
+ icon_state = "awaycontent10"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/loot
+ name = "UO71 Loot Vault"
+ icon_state = "awaycontent11"
+ requires_power = 0
+ tele_proof = 1
+
+/obj/item/weapon/paper/terrorspiders1
+ name = "paper - 'Sealed Facility'"
+ info = {"SEALED FACILITY
+
+ This facility is sealed shut by order of Commander Marquez. Do not enter.
+ Terror spiders live here. We believe they are a weapon developed by the syndicate.
+ Any surviving personnel are to evacuate immediately via the gateway.
+ "}
+
+/obj/item/weapon/paper/terrorspiders2
+ name = "paper - 'The Trio of Terror'"
+ info = {"Status Report on the 'Terrors'
+
+ All the spiders are deadly. We know this much already. Within an hour of their appearance, they have killed several staff.
+ Three, however, bear particular mention, as they appear to be leading the spider hivemind.
+
+ The Mother is held in containment 1. Advise leaving her alone.
+ It is likely that the hundreds of tiny spiders swarming over her back would come to her defense if she was threatened.
+
+ The Prince is held in containment 2. He appears very aggressive, incredibly fast, strong, and durable. Extreme force and agility would be required to neutralize him.
+ It is likely the appearance of the prince was related to our initial aggression against the Queen. These things can THINK.
+
+ The Queen cannot be contained. She lives in the old bar, south of mining. She continues to breed dangerous spiders at an alarming rate.
+ Many of her offspring are already roaming the compound, traveling through the vents. Contact with the team sent to subdue her has been lost.
+
+
+ Based on the situation, Commander, I advise immediate evacuation through the gateway.
+ -Research Director Simons
+ "}
+
+
+/obj/item/weapon/paper/terrorspiders3
+ name = "paper - 'Final Report'"
+ info = {"FROM: Field Agent 0738
+ TO: Syndicate #873589
+ SUBJECT: Mission Success
+
+ I have seeded the Terror Queen egg in a dingy looking bar that bored engineers constructed near the mining tunnels.
+ No doubt she will grow soon.
+
+ I have also placed the Mother and Prince eggs nearby, injected with sedative. Hopefully the dimwitted NT scientists bring them back for study.
+ With any luck, the Queen will sense them telepathically, think NT is holding her children hostage, and attack.
+
+ I am going to extract out of the gateway before this all goes down.
+ I don't imagine the staff have very long to live once the Queen declares war on this place.
+ "}
+
+/obj/item/weapon/paper/terrorspiders4
+ name = "paper - 'Prescription for Jones, David'"
+ info = {"PRESCRIPTION FOR: David Jones
+ RANK: Miner
+ FOR: Haloperidol
+ REASON FOR TREATMENT: Hallucinations, Paranoia
+ CAUSE: Hallucinations caused by encounter with toxic spit of spider in the caves. Paranoia caused by disappearing staff and suspicions of syndicate infiltration.
+ TREATMENT PLAN: Take as needed. See Dr. Phloxi in one week if symptoms persist.
+ "}
+
+/obj/item/weapon/paper/terrorspiders5
+ name = "paper - 'A Study in Terror'"
+ info = {"Findings Overview
+
+ Gray Spiders Stealthy predators that ambush prey from vents. Otherwise weak.
+ Red Spiders Can kill anyone in melee, but slow.
+ Green Will lay eggs on dead bodies, breeding more spiders.
+ Black Even a single bite is enough to kill a humanoid, given time.
+ White Injects a parasitic agent. Deemed to pose too great an infection risk to study.
+ Purple Only seen guarding the nest of the Queen to the south. Appear to be territorial, and very dangerous.
+ Prince Held in containment 2. Appears to be a sort of super-warrior. Fast, strong, and thickly armored.
+ Mother Carries hordes of spiderlings on its back. Held in containment 1.
+ Queen Unable to contain. Present south of Cargo before contact was lost. Presumed ruler of the local hive.
+ "}
+
+/obj/item/weapon/paper/terrorspiders6
+ name = "paper - 'A Study in Venom'"
+ info = {"Initial Report - Black Widow Venom
+
+ Even a single bite kills within a few minutes. Immediate charcoal is necessary for the victim to survive.
+ The fascinating thing is that multiple bites actually cause rapid symptom onset. The victim quickly loses the ability to walk.
+ One test monkey went from perfect health to death in under 60 seconds - from 3 bites.
+ I am so very glad I'm not responsible for keeping these things contained."}
+
+/obj/item/weapon/paper/terrorspiders7
+ name = "paper - 'Security Orders'"
+ info = {"Directives for Officer James
+
+ 1. Find a way to lift the bridge lockdown.
+ 2. Kill any spiders you encounter.
+ 3. Once on the bridge, open a path to the Queen in the south, and find a way to kill her, ending the infestation.
+ Good luck, Officer.
+ "}
+
+/obj/item/weapon/paper/terrorspiders8
+ name = "paper - 'Last Words'"
+ info = {"The Last Words of Nurse Barnes
+
+ It is too much. First Phil, then those damn spiders bite Mary too. Heaven help us.
+ I'll be evacuating as soon as I've grabbed my supplies. I had to pay for those myself. Stupid budget cuts.
+ The new world they've found for us isn't that hospitable, but at least there are no deadly spid---
+ (the writing trails off, as if the writer was interrupted)
+ "}
+
+
+/obj/item/weapon/gun/energy/laser/awaymission_aeg
+ name = "Wireless Energy Gun"
+ desc = "An energy gun that recharges wirelessly during away missions. Does not work on the main station."
+ force = 10
+ origin_tech = null
+ selfcharge = 1
+ can_charge = 0
+ var/inawaymission = 1
+
+/obj/item/weapon/gun/energy/laser/awaymission_aeg/process()
+ var/turf/my_loc = get_turf(src)
+ if(is_away_level(my_loc.z))
+ if(inawaymission)
+ return ..()
+ if(ismob(loc))
+ to_chat(loc, "Your [src] activates, starting to draw power from a nearby wireless power source. ")
+ inawaymission = 1
+ else
+ if(inawaymission)
+ if(ismob(loc))
+ to_chat(loc, "Your [src] deactivates, as it is out of range from its power source. ")
+ power_supply.charge = 0
+ inawaymission = 0
+ update_icon()
+
+
+
+/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin
+ name = "beaker 'Black Terror Venom'"
+
+/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin/New()
+ ..()
+ reagents.add_reagent("terror_black_toxin", 50)
+ update_icon()
+
+
+/obj/machinery/computer/id_upgrader
+ name = "ID Upgrade Machine"
+ icon_state = "guest"
+ icon_screen = "pass"
+ var/list/access_to_give = list(access_away01)
+ var/beenused = 0
+ var/door_to_open = "UO71_Start"
+
+/obj/machinery/computer/id_upgrader/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/card/id))
+ var/obj/item/weapon/card/id/D = I
+ if(!access_to_give.len)
+ to_chat(user, "This machine appears to be configured incorrectly. ")
+ return
+ var/did_upgrade = 0
+ var/list/id_access = D.GetAccess()
+ for(var/this_access in access_to_give)
+ if(!(this_access in id_access))
+ // don't have it - add it
+ D.access |= this_access
+ did_upgrade = 1
+ if(did_upgrade)
+ to_chat(user, "An access type was added to your ID card. ")
+ if(beenused)
+ return
+ spawn(1)
+ beenused = 1
+ var/unlocked_something = 0
+ for(var/obj/machinery/door/poddoor/P in airlocks)
+ if(P.density && P.id_tag == door_to_open && P.z == z)
+ P.open()
+ unlocked_something = 1
+ if(unlocked_something)
+ to_chat(user, "Activating the machine has unlocked a way forward! ")
+ else
+ to_chat(user, "Your ID card already has all the access this machine can give. ")
+ . = 1
+
+
diff --git a/code/modules/awaymissions/mission_code/beach.dm b/code/modules/awaymissions/mission_code/beach.dm
index fd54ffaa7ee..7ae37e759c1 100644
--- a/code/modules/awaymissions/mission_code/beach.dm
+++ b/code/modules/awaymissions/mission_code/beach.dm
@@ -18,6 +18,7 @@
if(water_timer)
deltimer(water_timer)
water_timer = null
+ return ..()
/obj/effect/waterfall/proc/drip()
var/obj/effect/effect/water/W = new(loc)
diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm
index 06f36c5bf44..8f86980e276 100644
--- a/code/modules/awaymissions/mission_code/centcomAway.dm
+++ b/code/modules/awaymissions/mission_code/centcomAway.dm
@@ -3,9 +3,8 @@
/area/awaymission/centcomAway
name = "XCC-P5831"
icon_state = "away"
- requires_power = 0
report_alerts = 0
-
+
/area/awaymission/centcomAway/general
name = "XCC-P5831"
music = "music/ambigen3.ogg"
diff --git a/code/modules/awaymissions/mission_code/clownplanet.dm b/code/modules/awaymissions/mission_code/clownplanet.dm
index 359037ada0a..8d64d3074d2 100644
--- a/code/modules/awaymissions/mission_code/clownplanet.dm
+++ b/code/modules/awaymissions/mission_code/clownplanet.dm
@@ -4,10 +4,10 @@
name = "\improper Clown Planet"
icon_state = "honk"
luminosity = 1
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
requires_power = 0
report_alerts = 0
-
+
/area/awaymission/clownplanet/miningtown
name = "\improper Clown Planet - Bananium-o-Rama"
icon_state = "away1"
diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm
index d1e9a9555be..0cd06c5d6a7 100644
--- a/code/modules/awaymissions/mission_code/spacehotel.dm
+++ b/code/modules/awaymissions/mission_code/spacehotel.dm
@@ -92,8 +92,8 @@
icon = 'icons/obj/doors/Doorsand.dmi'
icon_state = "door_closed"
autoclose = 1
- var/doorOpen = 'sound/machines/airlock.ogg'
- var/doorClose = 'sound/machines/airlock.ogg'
+ var/doorOpen = 'sound/machines/airlock_open.ogg'
+ var/doorClose = 'sound/machines/airlock_close.ogg'
var/doorDeni = 'sound/machines/DeniedBeep.ogg'
var/id // the room number, eg 101
var/obj/item/weapon/card/hotel_card/card// room's key card
@@ -116,8 +116,7 @@
if(roomtimer)
deltimer(roomtimer)
roomtimer = null
- qdel(card)
- card = null
+ QDEL_NULL(card)
return ..()
/obj/machinery/door/unpowered/hotel_door/examine(mob/user)
@@ -220,9 +219,7 @@
vacant_rooms.Cut()
guests.Cut()
- if(radio)
- qdel(radio)
- radio = null
+ QDEL_NULL(radio)
return ..()
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index dd1afe83361..0a2eaeef1bf 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -83,9 +83,9 @@
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
- to_chat(user, "\red Your flesh rapidly mutates!")
+ to_chat(user, "Your flesh rapidly mutates! ")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids. ")
- to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.")
+ to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness. ")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species("Shadow")
user.regenerate_icons()
@@ -96,9 +96,9 @@
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
- to_chat(user, "\red Your flesh rapidly mutates!")
+ to_chat(user, "Your flesh rapidly mutates! ")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids. ")
- to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.")
+ to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness. ")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species("Shadow")
user.regenerate_icons()
@@ -109,9 +109,9 @@
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
- to_chat(user, "\red Your flesh rapidly mutates!")
+ to_chat(user, "Your flesh rapidly mutates! ")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids. ")
- to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.")
+ to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness. ")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species("Shadow")
user.regenerate_icons()
@@ -131,9 +131,9 @@
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
- to_chat(user, "\red Your flesh rapidly mutates!")
+ to_chat(user, "Your flesh rapidly mutates! ")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids. ")
- to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.")
+ to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness. ")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species("Shadow")
user.regenerate_icons()
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index b12ee063f2d..50b09d72788 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -13,13 +13,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
air_master.setup_allturfs(turfs)
log_debug("\tTook [stop_watch(subtimer)]s")
- subtimer = start_watch()
- log_debug("Initializing lighting")
- for(var/turf/T in turfs)
- if(T.dynamic_lighting)
- T.lighting_build_overlays()
- log_debug("\tTook [stop_watch(subtimer)]s")
-
subtimer = start_watch()
log_debug("Smoothing tiles")
for(var/turf/T in smoothTurfs)
@@ -77,6 +70,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
log_startup_progress(" No away missions found.")
return
+
/proc/createALLZlevels()
if(awaydestinations.len) //crude, but it saves another var!
return
@@ -205,7 +199,17 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
template = safepick(possible_ruins)
if(!template)
return 0
+ var/turf/central_turf = get_turf(src)
+ for(var/i in template.get_affected_turfs(central_turf, 1))
+ var/turf/T = i
+ for(var/mob/living/simple_animal/monster in T)
+ qdel(monster)
+ for(var/obj/structure/flora/ash/plant in T)
+ qdel(plant)
template.load(get_turf(src),centered = 1)
template.loaded++
+ var/datum/map_template/ruin = template
+ if(istype(ruin))
+ new /obj/effect/landmark/ruin(central_turf, ruin)
qdel(src)
return 1
diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm
index 06d60f3389f..73bbff2198f 100644
--- a/code/modules/awaymissions/zvis.dm
+++ b/code/modules/awaymissions/zvis.dm
@@ -1,7 +1,7 @@
/area/awaymission/upperlevel
name = "Open Space"
color = "#888"
- lighting_use_dynamic = 0
+ dynamic_lighting = 0
requires_power = 0
// Used by /turf/unsimulated/floor/upperlevel as a reference for where the other floor is
@@ -111,8 +111,7 @@
init(R)
/turf/unsimulated/floor/upperlevel/Destroy()
- qdel(sensor)
- sensor = null
+ QDEL_NULL(sensor)
return ..()
/turf/unsimulated/floor/upperlevel/proc/init(var/obj/effect/levelref/R)
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index e02a1a8d810..72534169e6d 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -225,6 +225,29 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
"boardui.js" = 'html/browser/boardui.js'
)
+/datum/asset/simple/headers
+ assets = list(
+ "alarm_green.gif" = 'icons/program_icons/alarm_green.gif',
+ "alarm_red.gif" = 'icons/program_icons/alarm_red.gif',
+ "batt_5.gif" = 'icons/program_icons/batt_5.gif',
+ "batt_20.gif" = 'icons/program_icons/batt_20.gif',
+ "batt_40.gif" = 'icons/program_icons/batt_40.gif',
+ "batt_60.gif" = 'icons/program_icons/batt_60.gif',
+ "batt_80.gif" = 'icons/program_icons/batt_80.gif',
+ "batt_100.gif" = 'icons/program_icons/batt_100.gif',
+ "charging.gif" = 'icons/program_icons/charging.gif',
+ "downloader_finished.gif" = 'icons/program_icons/downloader_finished.gif',
+ "downloader_running.gif" = 'icons/program_icons/downloader_running.gif',
+ "ntnrc_idle.gif" = 'icons/program_icons/ntnrc_idle.gif',
+ "ntnrc_new.gif" = 'icons/program_icons/ntnrc_new.gif',
+ "power_norm.gif" = 'icons/program_icons/power_norm.gif',
+ "power_warn.gif" = 'icons/program_icons/power_warn.gif',
+ "sig_high.gif" = 'icons/program_icons/sig_high.gif',
+ "sig_low.gif" = 'icons/program_icons/sig_low.gif',
+ "sig_lan.gif" = 'icons/program_icons/sig_lan.gif',
+ "sig_none.gif" = 'icons/program_icons/sig_none.gif',
+ )
+
/datum/asset/nanoui
var/list/common = list()
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index bb243c3e6aa..d547a9a582f 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -92,4 +92,10 @@
var/datum/chatOutput/chatOutput
// Donator stuff.
- var/donator_level = DONATOR_LEVEL_NONE
\ No newline at end of file
+ var/donator_level = DONATOR_LEVEL_NONE
+
+ // If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
+ var/advanced_admin_interaction = FALSE
+
+ // Has the client been varedited by an admin?
+ var/var_edited = FALSE
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 6e1fe9126fd..00402f2deb6 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -8,7 +8,7 @@
#define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 10MB //Boosted this thing. What's the worst that can happen?
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
//I would just like the code ready should it ever need to be used.
-#define SUGGESTED_CLIENT_VERSION 510 // only integers (e.g: 510, 511) useful here. Does not properly handle minor versions (e.g: 510.58, 511.848)
+#define SUGGESTED_CLIENT_VERSION 511 // only integers (e.g: 510, 511) useful here. Does not properly handle minor versions (e.g: 510.58, 511.848)
/*
When somebody clicks a link in game, this Topic is called first.
@@ -97,122 +97,154 @@
if(config && config.log_hrefs && href_logfile)
to_chat(href_logfile, "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href] ")
- switch(href_list["karmashop"])
- if("tab")
- karma_tab = text2num(href_list["tab"])
- karmashopmenu()
+ if(href_list["karmashop"])
+ if(config.disable_karma)
return
- if("shop")
- if(href_list["KarmaBuy"])
- var/karma=verify_karma()
- switch(href_list["KarmaBuy"])
- if("1")
- if(karma <5)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Barber",5)
- return
- if("2")
- if(karma <5)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Brig Physician",5)
- return
- if("3")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Nanotrasen Representative",30)
- return
- if("5")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Blueshield",30)
- return
- if("6")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Mechanic",30)
- return
- if("7")
- if(karma <45)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Magistrate",45)
- return
- if("9")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_job_unlock("Security Pod Pilot",30)
- return
- if(href_list["KarmaBuy2"])
- var/karma=verify_karma()
- switch(href_list["KarmaBuy2"])
- if("1")
- if(karma <15)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Machine",15)
- return
- if("2")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Kidan",30)
- return
- if("3")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Grey",30)
- return
- if("4")
- if(karma <45)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Vox",45)
- return
- if("5")
- if(karma <45)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Slime People",45)
- return
- if("6")
- if(karma <100)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Plasmaman",100)
- return
- if("7")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- DB_species_unlock("Drask",30)
- return
- if(href_list["KarmaRefund"])
- var/type = href_list["KarmaRefundType"]
- var/job = href_list["KarmaRefund"]
- var/cost = href_list["KarmaRefundCost"]
- karmarefund(type,job,cost)
+
+ switch(href_list["karmashop"])
+ if("tab")
+ karma_tab = text2num(href_list["tab"])
+ karmashopmenu()
return
+ if("shop")
+ if(href_list["KarmaBuy"])
+ var/karma=verify_karma()
+ switch(href_list["KarmaBuy"])
+ if("1")
+ if(karma <5)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Barber?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Barber",5)
+ return
+ if("2")
+ if(karma <5)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Brig Physician?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Brig Physician",5)
+ return
+ if("3")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Nanotrasen Representative?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Nanotrasen Representative",30)
+ return
+ if("5")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Blueshield?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Blueshield",30)
+ return
+ if("6")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Mechanic?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Mechanic",30)
+ return
+ if("7")
+ if(karma <45)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Magistrate?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Magistrate",45)
+ return
+ if("9")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Security Pod Pilot?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_job_unlock("Security Pod Pilot",30)
+ return
+ if(href_list["KarmaBuy2"])
+ var/karma=verify_karma()
+ switch(href_list["KarmaBuy2"])
+ if("1")
+ if(karma <15)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Machine People?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Machine",15)
+ return
+ if("2")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Kidan?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Kidan",30)
+ return
+ if("3")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Grey?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Grey",30)
+ return
+ if("4")
+ if(karma <45)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Vox?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Vox",45)
+ return
+ if("5")
+ if(karma <45)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Slime People?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Slime People",45)
+ return
+ if("6")
+ if(karma <100)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Plasmaman?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Plasmaman",100)
+ return
+ if("7")
+ if(karma <30)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ else
+ if(alert("Are you sure you want to unlock Drask?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ DB_species_unlock("Drask",30)
+ return
+ if(href_list["KarmaRefund"])
+ var/type = href_list["KarmaRefundType"]
+ var/job = href_list["KarmaRefund"]
+ var/cost = href_list["KarmaRefundCost"]
+ karmarefund(type,job,cost)
+ return
switch(href_list["_src_"])
if("holder") hsrc = holder
@@ -220,6 +252,73 @@
if("prefs") return prefs.process_link(usr,href_list)
if("vars") return view_var_Topic(href,href_list,hsrc)
+ //Polls and shit
+ if(href_list["showpoll"])
+ handle_player_polling()
+ return
+ if(href_list["createpollwindow"])
+ create_poll_window()
+ return
+ if(href_list["createpoll"])
+ create_poll_function(href_list)
+ return
+ if(href_list["pollid"])
+ var/pollid = href_list["pollid"]
+ if(istext(pollid))
+ pollid = text2num(pollid)
+ if(isnum(pollid))
+ poll_player(pollid)
+ return
+ if(href_list["pollresults"])
+ var/pollid = href_list["pollresults"]
+ if(istext(pollid))
+ pollid = text2num(pollid)
+ if(isnum(pollid))
+ poll_results(pollid)
+ if(href_list["votepollid"] && href_list["votetype"])
+ if(!can_vote())
+ return // No voting.
+ var/pollid = text2num(href_list["votepollid"])
+ var/votetype = href_list["votetype"]
+ switch(votetype)
+ if("OPTION")
+ var/optionid = text2num(href_list["voteoptionid"])
+ vote_on_poll(pollid, optionid)
+ if("TEXT")
+ var/replytext = href_list["replytext"]
+ log_text_poll_reply(pollid, replytext)
+ if("NUMVAL")
+ var/id_min = text2num(href_list["minid"])
+ var/id_max = text2num(href_list["maxid"])
+
+ if( (id_max - id_min) > 100 ) //Basic exploit prevention
+ to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.")
+ return
+
+ for(var/optionid = id_min; optionid <= id_max; optionid++)
+ if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to
+ var/rating
+ if(href_list["o[optionid]"] == "abstain")
+ rating = null
+ else
+ rating = text2num(href_list["o[optionid]"])
+ if(!isnum(rating))
+ return
+
+ vote_on_numval_poll(pollid, optionid, rating)
+ if("MULTICHOICE")
+ var/id_min = text2num(href_list["minoptionid"])
+ var/id_max = text2num(href_list["maxoptionid"])
+
+ if( (id_max - id_min) > 100 ) //Basic exploit prevention
+ to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.")
+ return
+
+ for(var/optionid = id_min; optionid <= id_max; optionid++)
+ if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected
+ vote_on_poll(pollid, optionid, 1)
+ src << browse(null, "window=playerpoll")
+ handle_player_polling()
switch(href_list["action"])
if("openLink")
@@ -233,6 +332,10 @@
return 0
return 1
+//Like for /atoms, but clients are their own snowflake FUCK
+/client/proc/setDir(newdir)
+ dir = newdir
+
/client/proc/handle_spam_prevention(var/message, var/mute_type, var/throttle = 0)
if(throttle)
if((last_message_time + throttle > world.time) && !check_rights(R_ADMIN, 0))
@@ -294,7 +397,7 @@
preload_rsc = pick(config.resource_urls)
else preload_rsc = 1 // If config.resource_urls is not set, preload like normal.
- to_chat(src, "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears.")
+ to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears. ")
clients += src
@@ -316,7 +419,6 @@
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
- . = ..() //calls mob.Login()
spawn() // Goonchat does some non-instant checks in start()
chatOutput.start()
@@ -331,6 +433,7 @@
world.update_status()
if(holder)
+ on_holder_add()
add_admin_verbs()
admin_memo_output("Show", 0, 1)
@@ -343,6 +446,8 @@
log_client_to_db(tdata)
+ . = ..() //calls mob.Login()
+
if(ckey in clientmessages)
for(var/message in clientmessages[ckey])
to_chat(src, message)
@@ -404,19 +509,22 @@
if(IsGuestKey(key))
return
+
establish_db_connection()
if(!dbcon.IsConnected())
return
+
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
query.Execute()
var/sql_id = 0
- player_age = 0 // New players won't have an entry so knowing we have a connection we set this to zero to be updated if their is a record.
+ player_age = 0 // New players won't have an entry so knowing we have a connection we set this to zero to be updated if there is a record.
while(query.NextRow())
sql_id = query.item[1]
player_age = text2num(query.item[2])
break
+
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ip = '[address]'")
query_ip.Execute()
related_accounts_ip = list()
@@ -424,6 +532,7 @@
if(ckey != query_ip.item[1])
related_accounts_ip.Add("[query_ip.item[1]]")
+
var/DBQuery/query_cid = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE computerid = '[computer_id]'")
query_cid.Execute()
related_accounts_cid = list()
@@ -431,6 +540,7 @@
if(ckey != query_cid.item[1])
related_accounts_cid.Add("[query_cid.item[1]]")
+
var/admin_rank = "Player"
if(holder)
admin_rank = holder.rank
@@ -439,15 +549,18 @@
if(check_randomizer(connectiontopic))
return
+
//Log all the alts
if(related_accounts_cid.len)
log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]")
+
var/watchreason = check_watchlist(ckey)
if(watchreason)
message_admins("Notice: [key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason] ")
send2irc(config.admin_notify_irc, "Watchlist - [key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]")
+
//Just the standard check to see if it's actually a number
if(sql_id)
if(istext(sql_id))
@@ -463,17 +576,24 @@
if(sql_id)
//Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables
var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]")
- query_update.Execute()
+ if(!query_update.Execute())
+ var/err = query_update.ErrorMsg()
+ log_game("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n")
+ message_admins("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n")
else
//New player!! Need to insert all the stuff
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
- query_insert.Execute()
+ if(!query_insert.Execute())
+ var/err = query_insert.ErrorMsg()
+ log_game("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n")
+ message_admins("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n")
//Logging player access
var/serverip = "[world.internet_address]:[world.port]"
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');")
query_accesslog.Execute()
+
#undef TOPIC_SPAM_DELAY
#undef UPLOAD_LIMIT
#undef MIN_CLIENT_VERSION
@@ -621,3 +741,9 @@
if(lang.flags & RESTRICTED)
message += " (RESTRICTED)"
to_chat(world, "[message]")
+
+/client/proc/colour_transition(var/list/colour_to = null, var/time = 10) //Call this with no parameters to reset to default.
+ animate(src, color=colour_to, time=time, easing=SINE_EASING)
+
+/client/proc/on_varedit()
+ var_edited = TRUE
diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm
index b86d5c44ed1..8353514fb37 100644
--- a/code/modules/client/preference/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference/loadout/loadout_accessories.dm
@@ -93,3 +93,54 @@
display_name = "stethoscope"
path = /obj/item/clothing/accessory/stethoscope
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Paramedic", "Brig Physician")
+
+/datum/gear/accessory/cowboyshirt
+ display_name = "cowboy shirt, black"
+ path = /obj/item/clothing/accessory/cowboyshirt
+
+/datum/gear/accessory/cowboyshirt/short_sleeved
+ display_name = "cowboy shirt, short sleeved black"
+ path = /obj/item/clothing/accessory/cowboyshirt/short_sleeved
+
+/datum/gear/accessory/cowboyshirt/white
+ display_name = "cowboy shirt, white"
+ path = /obj/item/clothing/accessory/cowboyshirt/white
+
+/datum/gear/accessory/cowboyshirt/white/short_sleeved
+ display_name = "cowboy shirt, short sleeved white"
+ path = /obj/item/clothing/accessory/cowboyshirt/white/short_sleeved
+
+/datum/gear/accessory/cowboyshirt/pink
+ display_name = "cowboy shirt, pink"
+ path = /obj/item/clothing/accessory/cowboyshirt/pink
+
+/datum/gear/accessory/cowboyshirt/pink/short_sleeved
+ display_name = "cowboy shirt, short sleeved pink"
+ path = /obj/item/clothing/accessory/cowboyshirt/pink/short_sleeved
+
+/datum/gear/accessory/cowboyshirt/red
+ display_name = "cowboy shirt, red"
+ path = /obj/item/clothing/accessory/cowboyshirt/red
+
+/datum/gear/accessory/cowboyshirt/red/short_sleeved
+ display_name = "cowboy shirt, short sleeved red"
+ path = /obj/item/clothing/accessory/cowboyshirt/red/short_sleeved
+
+/datum/gear/accessory/cowboyshirt/navy
+ display_name = "cowboy shirt, navy"
+ path = /obj/item/clothing/accessory/cowboyshirt/navy
+
+/datum/gear/accessory/cowboyshirt/navy/short_sleeved
+ display_name = "cowboy shirt, short sleeved navy"
+ path = /obj/item/clothing/accessory/cowboyshirt/navy/short_sleeved
+
+/datum/gear/accessory/locket
+ display_name = "gold locket"
+ path = /obj/item/clothing/accessory/necklace/locket
+
+/datum/gear/accessory/necklace
+ display_name = "simple necklace"
+ path = /obj/item/clothing/accessory/necklace
+
+
+
diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm
index 7e4ca4620d9..196f9f65ca0 100644
--- a/code/modules/client/preference/loadout/loadout_hat.dm
+++ b/code/modules/client/preference/loadout/loadout_hat.dm
@@ -94,9 +94,25 @@
path = /obj/item/clothing/head/soft/yellow
/datum/gear/hat/cowboyhat
- display_name = "cowboy hat"
+ display_name = "cowboy hat, brown"
path = /obj/item/clothing/head/cowboyhat
+/datum/gear/hat/cowboyhat/tan
+ display_name = "cowboy hat, tan"
+ path = /obj/item/clothing/head/cowboyhat/tan
+
+/datum/gear/hat/cowboyhat/black
+ display_name = "cowboy hat, black"
+ path = /obj/item/clothing/head/cowboyhat/black
+
+/datum/gear/hat/cowboyhat/white
+ display_name = "cowboy hat, white"
+ path = /obj/item/clothing/head/cowboyhat/white
+
+/datum/gear/hat/cowboyhat/pink
+ display_name = "cowboy hat, pink"
+ path = /obj/item/clothing/head/cowboyhat/pink
+
/datum/gear/hat/pr_beret
display_name = "beret, purple"
path = /obj/item/clothing/head/beret/purple_normal
@@ -118,6 +134,11 @@
path = /obj/item/clothing/head/beret/sci
allowed_roles = list("Research Director", "Scientist")
+/datum/gear/hat/med_beret
+ display_name = "medical beret"
+ path = /obj/item/clothing/head/beret/med
+ allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner")
+
/datum/gear/hat/surgicalcap_purple
display_name = "surgical cap, purple"
path = /obj/item/clothing/head/surgery/purple
diff --git a/code/modules/client/preference/loadout/loadout_racial.dm b/code/modules/client/preference/loadout/loadout_racial.dm
new file mode 100644
index 00000000000..f7d96011e5c
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_racial.dm
@@ -0,0 +1,40 @@
+/datum/gear/racial
+ sort_category = "Racial"
+ subtype_path = /datum/gear/racial
+ cost = 2
+
+
+/datum/gear/racial/tajciv
+ display_name = "embroidered veil"
+ description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
+ path = /obj/item/clothing/glasses/tajblind
+
+/datum/gear/racial/tajsec
+ display_name = "sleek veil"
+ description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built security HUD."
+ path = /obj/item/clothing/glasses/hud/security/tajblind
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent", "Magistrate")
+
+/datum/gear/racial/tajmed
+ display_name = "lightweight veil"
+ description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built medical HUD."
+ path = /obj/item/clothing/glasses/hud/health/tajblind
+ allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner")
+
+/datum/gear/racial/tajsci
+ display_name = "hi-tech veil"
+ description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
+ path = /obj/item/clothing/glasses/tajblind/sci
+ allowed_roles = list("Scientist", "Research Director", "Robotocist")
+
+/datum/gear/racial/tajeng
+ display_name = "industrial veil"
+ description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
+ path = /obj/item/clothing/glasses/tajblind/eng
+ allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
+
+/datum/gear/racial/tajcargo
+ display_name = "khaki veil"
+ description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
+ path = /obj/item/clothing/glasses/tajblind/cargo
+ allowed_roles = list("Quartermaster","Cargo Technician", "Miner")
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_shoes.dm b/code/modules/client/preference/loadout/loadout_shoes.dm
index ec32e30d661..f1c3ce23393 100644
--- a/code/modules/client/preference/loadout/loadout_shoes.dm
+++ b/code/modules/client/preference/loadout/loadout_shoes.dm
@@ -7,6 +7,14 @@
display_name = "sandals, wooden"
path = /obj/item/clothing/shoes/sandal
+/datum/gear/shoes/winterboots
+ display_name = "winter boots"
+ path = /obj/item/clothing/shoes/winterboots
+
+/datum/gear/shoes/workboots
+ display_name = "work boots"
+ path = /obj/item/clothing/shoes/workboots
+
/datum/gear/shoes/fancysandals
display_name = "sandals, fancy"
cost = 5
@@ -16,3 +24,23 @@
display_name = "dress shoes"
cost = 5
path = /obj/item/clothing/shoes/centcom
+
+/datum/gear/shoes/cowboyboots
+ display_name = "cowboy boots, brown"
+ cost = 1
+ path = /obj/item/clothing/shoes/cowboyboots
+
+/datum/gear/shoes/cowboyboots_black
+ display_name = "cowboy boots, black"
+ cost = 1
+ path = /obj/item/clothing/shoes/cowboyboots/black
+
+/datum/gear/shoes/cowboyboots/white
+ display_name = "cowboy boots, white"
+ cost = 1
+ path = /obj/item/clothing/shoes/cowboyboots/white
+
+/datum/gear/shoes/cowboyboots/pink
+ display_name = "cowboy boots, pink"
+ cost = 1
+ path = /obj/item/clothing/shoes/cowboyboots/pink
diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm
index 2ac4b3bb7e9..ae43a10ee89 100644
--- a/code/modules/client/preference/loadout/loadout_suit.dm
+++ b/code/modules/client/preference/loadout/loadout_suit.dm
@@ -29,7 +29,7 @@
/datum/gear/suit/coat/job/med
display_name = "winter coat, medical"
path = /obj/item/clothing/suit/hooded/wintercoat/medical
- allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician")
+ allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner")
/datum/gear/suit/coat/job/sci
display_name = "winter coat, science"
diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm
index 5e0d5b0510d..889dfaa1080 100644
--- a/code/modules/client/preference/loadout/loadout_uniform.dm
+++ b/code/modules/client/preference/loadout/loadout_uniform.dm
@@ -36,7 +36,7 @@
/datum/gear/uniform/skirt/job/atmos
display_name = "skirt, atmos"
path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
- allowed_roles = list("Chief Engineer","Atmospheric Technician")
+ allowed_roles = list("Chief Engineer","Life Support Specialist")
/datum/gear/uniform/skirt/job/eng
display_name = "skirt, engineer"
@@ -50,7 +50,7 @@
/datum/gear/uniform/skirt/job/cmo
display_name = "skirt, cmo"
- path = /obj/item/clothing/under/rank/chief_medical_officer
+ path = /obj/item/clothing/under/rank/chief_medical_officer/skirt
allowed_roles = list("Chief Medical Officer")
/datum/gear/uniform/skirt/job/chem
@@ -61,12 +61,17 @@
/datum/gear/uniform/skirt/job/viro
display_name = "skirt, virologist"
path = /obj/item/clothing/under/rank/virologist/skirt
- allowed_roles = list("Chief Medical Officer","Medical Doctor")
+ allowed_roles = list("Virologist")
/datum/gear/uniform/skirt/job/med
display_name = "skirt, medical"
path = /obj/item/clothing/under/rank/medical/skirt
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Brig Physician")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Coroner")
+
+/datum/gear/uniform/skirt/job/phys
+ display_name = "skirt, physician"
+ path = /obj/item/clothing/under/rank/security/brigphys/skirt
+ allowed_roles = list("Brig Physician")
/datum/gear/uniform/skirt/job/sci
display_name = "skirt, scientist"
@@ -98,15 +103,26 @@
path = /obj/item/clothing/under/rank/head_of_security/skirt
allowed_roles = list("Head of Security")
-/datum/gear/uniform/job/medical/scrubs
- subtype_path = /datum/gear/uniform/job/medical/scrubs
+/datum/gear/uniform/skirt/job/ntrep
+ display_name = "skirt, nt rep"
+ path = /obj/item/clothing/under/rank/ntrep/skirt
+ allowed_roles = list("Nanotrasen Representative")
-/datum/gear/uniform/job/medical/scrubs/purple
+/datum/gear/uniform/skirt/job/blueshield
+ display_name = "skirt, blueshield"
+ path = /obj/item/clothing/under/rank/blueshield/skirt
+ allowed_roles = list("Blueshield")
+
+
+/datum/gear/uniform/medical
+ subtype_path = /datum/gear/uniform/medical
+
+/datum/gear/uniform/medical/pscrubs
display_name = "medical scrubs, purple"
path = /obj/item/clothing/under/rank/medical/purple
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
-/datum/gear/uniform/job/medical/scrubs/green
+/datum/gear/uniform/medical/gscrubs
display_name = "medical scrubs, green"
path = /obj/item/clothing/under/rank/medical/green
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 09cef84894c..9e40914da9b 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -28,9 +28,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
)
/proc/player_old_enough_antag(client/C, role)
- if(available_in_days_antag(C, role) == 0)
- return 1 //Available in 0 days = available right now = player is old enough to play.
- return 0
+ if(available_in_days_antag(C, role))
+ return 0 //available_in_days>0 = still some days required = player not old enough
+ if(role_available_in_playtime(C, role))
+ return 0 //available_in_playtime>0 = still some more playtime required = they are not eligible
+ return 1
/proc/available_in_days_antag(client/C, role)
if(!C)
@@ -93,7 +95,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/show_ghostitem_attack = TRUE
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
+ var/windowflashing = TRUE
+ //ghostly preferences
+ var/ghost_anonsay = 0
//character preferences
var/real_name //our character's name
@@ -105,7 +110,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/underwear = "Nude" //underwear type
var/undershirt = "Nude" //undershirt type
var/socks = "Nude" //socks type
- var/backbag = 2 //backpack type
+ var/backbag = GBACKPACK //backpack type
var/ha_style = "None" //Head accessory style
var/r_headacc = 0 //Head accessory colour
var/g_headacc = 0 //Head accessory colour
@@ -144,6 +149,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/alt_head = "None" //Alt head style.
var/species = "Human"
var/language = "None" //Secondary language
+ var/autohiss_mode = AUTOHISS_OFF //Species autohiss level. OFF, BASIC, FULL.
var/body_accessory = null
@@ -172,7 +178,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/job_karma_low = 0
//Keeps track of preferrence for not getting any wanted jobs
- var/alternate_option = 0
+ var/alternate_option = 2
// maps each organ to either null(intact), "cyborg" or "amputated"
// will probably not be able to do this for head and torso ;)
@@ -256,6 +262,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(current_tab)
if(TAB_CHAR) // Character Settings
+ var/datum/species/S = all_species[species]
+ if(!istype(S)) //The species was invalid. Set the species to the default, fetch the datum for that species and generate a random character.
+ species = initial(species)
+ S = all_species[species]
+ random_character()
+
dat += ""
dat += ""
dat += "Name: "
@@ -265,9 +277,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += " "
dat += ""
dat += "Slot [slot_name] - "
- dat += "Load slot - "
- dat += "Save slot - "
- dat += "Reload slot "
+ dat += "Load slot - "
+ dat += "Save slot - "
+ dat += "Reload slot "
dat += " "
dat += "
"
dat += ""
@@ -276,19 +288,24 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "You are banned from using custom names and appearances. \
You can continue to adjust your characters, but you will be randomised once you join the game.\
"
- dat += "Gender: [gender == MALE ? "Male" : "Female"] "
+ dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : "Genderless")] "
+ dat += " "
dat += "Age: [age] "
dat += "Body: (®) "
dat += "Species: [species] "
if(species == "Vox")
dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"] "
+ if(species == "Grey")
+ dat += "Voice: [speciesprefs ? "Wingdings" : "Normal"] "
dat += "Secondary Language: [language] "
+ if(S.autohiss_basic_map)
+ dat += "Auto-accent: [autohiss_mode == AUTOHISS_FULL ? "Full" : (autohiss_mode == AUTOHISS_BASIC ? "Basic" : "Off")] "
dat += "Blood Type: [b_type] "
- if(species in list("Human", "Drask", "Vox"))
- dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"] "
+ if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
+ dat += "Skin Tone: [S.bodyflags & HAS_ICON_SKIN_TONE ? "[s_tone]" : "[-s_tone + 35]/220"] "
dat += "Disabilities: \[Set\] "
dat += "Nanotrasen Relation: [nanotrasen_relation] "
- dat += "Set Flavor Text "
+ dat += "Set Flavor Text "
if(lentext(flavor_text) <= 40)
if(!lentext(flavor_text)) dat += "\[...\] "
else dat += "[flavor_text] "
@@ -296,7 +313,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "Hair & Accessories "
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories.
var/headaccessoryname = "Head Accessory: "
if(species == "Unathi")
headaccessoryname = "Horns: "
@@ -304,15 +321,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "[ha_style] "
dat += "Color [color_square(r_headacc, g_headacc, b_headacc)] "
- if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
dat += "Head Markings: "
dat += "[m_styles["head"]] "
dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))] "
- if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos.
dat += "Body Markings: "
dat += "[m_styles["body"]] "
dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))] "
- if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
dat += "Tail Markings: "
dat += "[m_styles["tail"]] "
dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))] "
@@ -334,11 +351,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += " "
- if(species != "Machine")
+ if(!(S.flags & ALL_RPARTS))
dat += "Eyes: "
dat += "Color [color_square(r_eyes, g_eyes, b_eyes)] "
- if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
+ if((S.bodyflags & HAS_SKIN_COLOR) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
dat += "Body Color: "
dat += "Color [color_square(r_skin, g_skin, b_skin)] "
@@ -352,10 +369,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(jobban_isbanned(user, "Records"))
dat += "You are banned from using character records. "
else
- dat += "Character Records "
+ dat += "Character Records "
dat += "Limbs "
- if(species in list("Unathi")) //Species with alt heads.
+ if(S.bodyflags & HAS_ALT_HEADS) //Species with alt heads.
dat += "Alternate Head: "
dat += "[alt_head] "
dat += "Limbs and Parts: Adjust "
@@ -406,10 +423,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
else dat += " "
dat += "Clothing "
- dat += "Underwear: [underwear] "
- dat += "Undershirt: [undershirt] "
- dat += "Socks: [socks] "
- dat += "Backpack Type: [backbaglist[backbag]] "
+ if(S.clothing_flags & HAS_UNDERWEAR)
+ dat += "Underwear: [underwear] "
+ if(S.clothing_flags & HAS_UNDERSHIRT)
+ dat += "Undershirt: [undershirt] "
+ if(S.clothing_flags & HAS_SOCKS)
+ dat += "Socks: [socks] "
+ dat += "Backpack Type: [backbag] "
dat += "
"
@@ -418,6 +438,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "General Settings "
dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"] "
dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"] "
+ dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"] "
dat += "Custom UI settings: "
dat += " - UI Style: [UI_style] "
dat += " - Color: [UI_style_color] "
@@ -442,6 +463,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"] "
dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"] "
dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"] "
+ dat += "Deadchat anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"] "
dat += " "
dat += "Special Role Settings "
@@ -452,9 +474,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
for(var/i in special_roles)
if(jobban_isbanned(user, i))
dat += "Be [capitalize(i)]: \[BANNED] "
- else if(!player_old_enough_antag(user.client,i))
- var/available_in_days_antag = available_in_days_antag(user.client,i)
- dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS] "
+ else if(!player_old_enough_antag(user.client, i))
+ var/available_in_days_antag = available_in_days_antag(user.client, i)
+ var/role_available_in_playtime = get_exp_format(role_available_in_playtime(user.client, i))
+ if(available_in_days_antag)
+ dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS] "
+ else if(role_available_in_playtime)
+ dat += "Be [capitalize(i)]: \[IN [(role_available_in_playtime)]] "
+ else
+ dat += "Be [capitalize(i)]: \[ERROR] "
else
dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"] "
dat += "
"
@@ -548,7 +576,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
metadata["[tweak]"] = new_metadata
-/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790)
+/datum/preferences/proc/SetChoices(mob/user, limit = 13, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790)
if(!job_master)
return
@@ -650,7 +678,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
else
HTML += " \[No] "
if(job.alt_titles)
- HTML += "\[[GetPlayerAltTitle(job)]\] "
+ HTML += "\[[GetPlayerAltTitle(job)]\] "
HTML += ""
continue
/*
@@ -666,7 +694,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
HTML += "[prefLevelLabel] "
if(job.alt_titles)
- HTML += "\[[GetPlayerAltTitle(job)]\] "
+ HTML += "\[[GetPlayerAltTitle(job)]\] "
HTML += ""
@@ -780,7 +808,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
return
if(!isnum(desiredLvl))
- to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!")
+ to_chat(user, "UpdateJobPreference - desired level was not a number. Please notify coders! ")
ShowChoices(user)
return
@@ -798,70 +826,64 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
return 1
/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
- if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))
+ var/datum/species/S = all_species[species]
+ if(flag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT))
return "[species] cannot be fat. "
return "[label]: [disabilities & flag ? "Yes" : "No"] "
/datum/preferences/proc/SetDisabilities(mob/user)
var/HTML = ""
+ HTML += ""
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += ""
- HTML += {"
- Choose disabilities "}
- // END AUTOFIX
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += " "
HTML += {"
\[Done\]
\[Reset\]
"}
- // END AUTOFIX
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=disabil;size=350x300")
- return
+
+ var/datum/browser/popup = new(user, "disabil", "Choose Disabilities
", 350, 300)
+ popup.set_content(HTML)
+ popup.open(0)
/datum/preferences/proc/SetRecords(mob/user)
var/HTML = ""
HTML += ""
- HTML += "Set Character Records "
- HTML += "Medical Records "
+ HTML += "Medical Records "
if(lentext(med_record) <= 40)
HTML += "[med_record]"
else
HTML += "[copytext(med_record, 1, 37)]..."
- HTML += "Employment Records "
+ HTML += "Employment Records "
if(lentext(gen_record) <= 40)
HTML += "[gen_record]"
else
HTML += "[copytext(gen_record, 1, 37)]..."
- HTML += "Security Records "
+ HTML += "Security Records "
if(lentext(sec_record) <= 40)
HTML += "[sec_record] "
else
HTML += "[copytext(sec_record, 1, 37)]... "
- HTML += " "
- HTML += "\[Done\] "
+ HTML += "\[Done\] "
HTML += " "
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=records;size=350x300")
- return
+ var/datum/browser/popup = new(user, "records", "Character Records
", 350, 300)
+ popup.set_content(HTML)
+ popup.open(0)
/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
return player_alt_titles.Find(job.title) > 0 \
@@ -1023,6 +1045,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(!user) return
+ var/datum/species/S = all_species[species]
if(href_list["preference"] == "job")
switch(href_list["task"])
if("close")
@@ -1066,7 +1089,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("input")
var/dflag=text2num(href_list["disability"])
if(dflag >= 0)
- if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")))
+ if(!(dflag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT))) //If the disability isn't fatness, toggle it. If it IS fatness, check to see if the species can be fat before going ahead.
disabilities ^= text2num(href_list["disability"]) //MAGIC
SetDisabilities(user)
else
@@ -1152,7 +1175,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(href_list["task"])
if("random")
var/datum/robolimb/robohead
- if(species == "Machine")
+ if(S.flags & ALL_RPARTS)
var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
robohead = all_robolimbs[head_model]
switch(href_list["preference"])
@@ -1185,30 +1208,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("f_style")
f_style = random_facial_hair_style(gender, species, robohead)
if("headaccessory")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories.
r_headacc = rand(0,255)
g_headacc = rand(0,255)
b_headacc = rand(0,255)
if("ha_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories.
ha_style = random_head_accessory(species)
if("m_style_head")
- if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
if("m_head_colour")
- if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255))
if("m_style_body")
- if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings.
m_styles["body"] = random_marking_style("body", species)
if("m_body_colour")
- if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings.
m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255))
if("m_style_tail")
- if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
if("m_tail_colour")
- if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255))
if("underwear")
underwear = random_underwear(gender, species)
@@ -1224,15 +1247,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
g_eyes = rand(0,255)
b_eyes = rand(0,255)
if("s_tone")
- if(species in list("Human", "Drask", "Vox"))
+ if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
s_tone = random_skin_tone()
if("s_color")
- if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine"))
+ if(S.bodyflags & HAS_SKIN_COLOR)
r_skin = rand(0,255)
g_skin = rand(0,255)
b_skin = rand(0,255)
if("bag")
- backbag = rand(1,4)
+ backbag = pick(backbaglist)
/*if("skin_style")
h_style = random_skin_style(gender)*/
if("all")
@@ -1251,16 +1274,16 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("age")
var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null
if(new_age)
- age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
+ age = max(min(round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("species")
var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
var/prev_species = species
// var/whitelisted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
- for(var/S in whitelisted_species)
- if(is_alien_whitelisted(user,S))
- new_species += S
+ for(var/Spec in whitelisted_species)
+ if(is_alien_whitelisted(user,Spec))
+ new_species += Spec
// whitelisted = 1
// if(!whitelisted)
// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
@@ -1268,10 +1291,16 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
new_species += whitelisted_species
species = input("Please select a species", "Character Generation", null) in new_species
-
+ var/datum/species/NS = all_species[species]
+ if(!istype(NS)) //The species was invalid. Notify the user and fail out.
+ species = prev_species
+ to_chat(user, "Invalid species, please pick something else. ")
+ return
if(prev_species != species)
+ if(NS.has_gender && gender == PLURAL)
+ gender = pick(MALE,FEMALE)
var/datum/robolimb/robohead
- if(species == "Machine")
+ if(NS.flags & ALL_RPARTS)
var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
robohead = all_robolimbs[head_model]
//grab one of the valid hair styles for the newly chosen species
@@ -1280,7 +1309,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//grab one of the valid facial hair styles for the newly chosen species
f_style = random_facial_hair_style(gender, species, robohead)
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ if(NS.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories.
ha_style = random_head_accessory(species)
else
ha_style = "None" // No Vulp ears on Unathi
@@ -1288,58 +1317,61 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
g_headacc = 0
b_headacc = 0
- if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ if(NS.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
else
m_styles["head"] = "None"
m_colours["head"] = "#000000"
- if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ if(NS.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos.
m_styles["body"] = random_marking_style("body", species)
else
m_styles["body"] = "None"
m_colours["body"] = "#000000"
- if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ if(NS.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
else
m_styles["tail"] = "None"
m_colours["tail"] = "#000000"
// Don't wear another species' underwear!
- var/datum/sprite_accessory/S = underwear_list[underwear]
- if(!S || !(species in S.species_allowed))
+ var/datum/sprite_accessory/SA = underwear_list[underwear]
+ if(!SA || !(species in SA.species_allowed))
underwear = random_underwear(gender, species)
- S = undershirt_list[undershirt]
- if(!S || !(species in S.species_allowed))
+ SA = undershirt_list[undershirt]
+ if(!SA || !(species in SA.species_allowed))
undershirt = random_undershirt(gender, species)
- S = socks_list[socks]
- if(!S || !(species in S.species_allowed))
+ SA = socks_list[socks]
+ if(!SA || !(species in SA.species_allowed))
socks = random_socks(gender, species)
//reset skin tone and colour
- if(species in list("Human", "Drask", "Vox"))
+ if(NS.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
random_skin_tone(species)
else
s_tone = 0
- if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
+ if(!(NS.bodyflags & HAS_SKIN_COLOR))
r_skin = 0
g_skin = 0
b_skin = 0
alt_head = "None" //No alt heads on species that don't have them.
+ speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks.
body_accessory = null //no vulptail on humans damnit
//Reset prosthetics.
organ_data = list()
rlimb_data = list()
- if("speciesprefs")//oldvox code
- speciesprefs = !speciesprefs
+ if(!(NS.autohiss_basic_map))
+ autohiss_mode = AUTOHISS_OFF
+ if("speciesprefs")
+ speciesprefs = !speciesprefs //Starts 0, so if someone clicks the button up top there, this won't be 0 anymore. If they click it again, it'll go back to 0.
if("language")
// var/languages_available
var/list/new_languages = list("None")
@@ -1362,6 +1394,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
language = input("Please select a secondary language", "Character Generation", null) in new_languages
+ if("autohiss_mode")
+ if(S.autohiss_basic_map)
+ var/list/autohiss_choice = list("Off" = AUTOHISS_OFF, "Basic" = AUTOHISS_BASIC, "Full" = AUTOHISS_FULL)
+ var/new_autohiss_pref = input(user, "Choose your character's auto-accent level:", "Character Preference") as null|anything in autohiss_choice
+ autohiss_mode = autohiss_choice[new_autohiss_pref]
+
if("metadata")
var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null
if(new_metadata)
@@ -1373,7 +1411,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
b_type = new_b_type
if("hair")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag)
var/input = "Choose your character's hair colour:"
var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
if(new_hair)
@@ -1394,26 +1432,26 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("h_style")
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ var/datum/sprite_accessory/SA = hair_styles_list[hairstyle]
if(hairstyle == "Bald") //Just in case.
valid_hairstyles += hairstyle
continue
- if(species == "Machine") //Species that can use prosthetic heads.
+ if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads.
var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
head_model = "Morpheus Cyberkinetics"
else
head_model = rlimb_data["head"]
var/datum/robolimb/robohead = all_robolimbs[head_model]
- if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if((species in SA.species_allowed) && robohead.is_monitor && ((SA.models_allowed && (robohead.company in SA.models_allowed)) || !SA.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
- if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ if(!robohead.is_monitor && ("Human" in SA.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ if(species in SA.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
valid_hairstyles += hairstyle
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
@@ -1421,7 +1459,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
h_style = new_h_style
if("headaccessory")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
+ if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species with head accessories.
var/input = "Choose the colour of your your character's head accessory:"
var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
if(new_head_accessory)
@@ -1430,7 +1468,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
b_headacc = color2B(new_head_accessory)
if("ha_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
+ if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species with head accessories.
var/list/valid_head_accessory_styles = list()
for(var/head_accessory_style in head_accessory_styles_list)
var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
@@ -1446,7 +1484,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("alt_head")
if(organ_data["head"] == "cyborg")
return
- if(species in list("Unathi")) //Species with alt heads.
+ if(S.bodyflags & HAS_ALT_HEADS) //Species with alt heads.
var/list/valid_alt_heads = list()
valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option
for(var/alternate_head in alt_heads_list)
@@ -1466,7 +1504,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
m_styles["head"] = "None"
if("m_style_head")
- if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
var/list/valid_markings = list()
valid_markings["None"] = marking_styles_list["None"]
for(var/markingstyle in marking_styles_list)
@@ -1482,7 +1520,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(M.heads_allowed && !("All" in M.heads_allowed))
continue
- if(species == "Machine") //Species that can use prosthetic heads.
+ if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads.
var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
head_model = "Morpheus Cyberkinetics"
@@ -1502,14 +1540,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
m_styles["head"] = new_marking_style
if("m_head_colour")
- if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
var/input = "Choose the colour of your your character's head markings:"
var/new_markings = input(user, input, "Character Preference", m_colours["head"]) as color|null
if(new_markings)
m_colours["head"] = new_markings
if("m_style_body")
- if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos.
var/list/valid_markings = list()
valid_markings["None"] = marking_styles_list["None"]
for(var/markingstyle in marking_styles_list)
@@ -1526,14 +1564,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
m_styles["body"] = new_marking_style
if("m_body_colour")
- if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos.
var/input = "Choose the colour of your your character's body markings:"
var/new_markings = input(user, input, "Character Preference", m_colours["body"]) as color|null
if(new_markings)
m_colours["body"] = new_markings
if("m_style_tail")
- if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
var/list/valid_markings = list()
valid_markings["None"] = marking_styles_list["None"]
for(var/markingstyle in marking_styles_list)
@@ -1556,7 +1594,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
m_styles["tail"] = new_marking_style
if("m_tail_colour")
- if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
var/input = "Choose the colour of your your character's tail markings:"
var/new_markings = input(user, input, "Character Preference", m_colours["tail"]) as color|null
if(new_markings)
@@ -1581,7 +1619,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
if("facial")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag)
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
if(new_facial)
r_facial = color2R(new_facial)
@@ -1601,30 +1639,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("f_style")
var/list/valid_facial_hairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ var/datum/sprite_accessory/SA = facial_hair_styles_list[facialhairstyle]
if(facialhairstyle == "Shaved") //Just in case.
valid_facial_hairstyles += facialhairstyle
continue
- if(gender == MALE && S.gender == FEMALE)
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(species == "Machine") //Species that can use prosthetic heads.
+ if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads.
var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
head_model = "Morpheus Cyberkinetics"
else
head_model = rlimb_data["head"]
var/datum/robolimb/robohead = all_robolimbs[head_model]
- if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if((species in SA.species_allowed) && robohead.is_monitor && ((SA.models_allowed && (robohead.company in SA.models_allowed)) || !SA.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
- if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ if(!robohead.is_monitor && ("Human" in SA.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ if(species in SA.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
valid_facial_hairstyles += facialhairstyle
var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facial_hairstyles
@@ -1634,12 +1672,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("underwear")
var/list/valid_underwear = list()
for(var/underwear in underwear_list)
- var/datum/sprite_accessory/S = underwear_list[underwear]
- if(gender == MALE && S.gender == FEMALE)
+ var/datum/sprite_accessory/SA = underwear_list[underwear]
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(!(species in S.species_allowed))
+ if(!(species in SA.species_allowed))
continue
valid_underwear[underwear] = underwear_list[underwear]
var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in valid_underwear
@@ -1649,12 +1687,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("undershirt")
var/list/valid_undershirts = list()
for(var/undershirt in undershirt_list)
- var/datum/sprite_accessory/S = undershirt_list[undershirt]
- if(gender == MALE && S.gender == FEMALE)
+ var/datum/sprite_accessory/SA = undershirt_list[undershirt]
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(!(species in S.species_allowed))
+ if(!(species in SA.species_allowed))
continue
valid_undershirts[undershirt] = undershirt_list[undershirt]
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in valid_undershirts
@@ -1665,12 +1703,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("socks")
var/list/valid_sockstyles = list()
for(var/sockstyle in socks_list)
- var/datum/sprite_accessory/S = socks_list[sockstyle]
- if(gender == MALE && S.gender == FEMALE)
+ var/datum/sprite_accessory/SA = socks_list[sockstyle]
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(!(species in S.species_allowed))
+ if(!(species in SA.species_allowed))
continue
valid_sockstyles[sockstyle] = socks_list[sockstyle]
var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
@@ -1686,17 +1724,26 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
b_eyes = color2B(new_eyes)
if("s_tone")
- if(species == "Human" || species == "Drask")
+ if(S.bodyflags & HAS_SKIN_TONE)
var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null
if(new_s_tone)
s_tone = 35 - max(min(round(new_s_tone), 220), 1)
- else if(species == "Vox")
- var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null
- if(skin_c)
- s_tone = max(min(round(skin_c), 6), 1)
+ else if(S.bodyflags & HAS_ICON_SKIN_TONE)
+ var/const/MAX_LINE_ENTRIES = 4
+ var/prompt = "Choose your character's skin tone: 1-[S.icon_skin_tones.len]\n("
+ for(var/i = 1 to S.icon_skin_tones.len)
+ if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
+ prompt += "\n"
+ prompt += "[i] = [S.icon_skin_tones[i]]"
+ if(i != S.icon_skin_tones.len)
+ prompt += ", "
+ prompt += ")"
+ var/skin_c = input(user, prompt, "Character Preference") as num|null
+ if(isnum(skin_c))
+ s_tone = max(min(round(skin_c), S.icon_skin_tones.len), 1)
if("skin")
- if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
+ if((S.bodyflags & HAS_SKIN_COLOR) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
if(new_skin)
r_skin = color2R(new_skin)
@@ -1710,9 +1757,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ooccolor = new_ooccolor
if("bag")
- var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
+ var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
if(new_backbag)
- backbag = backbaglist.Find(new_backbag)
+ backbag = new_backbag
if("nt_relation")
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
@@ -1730,7 +1777,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("limbs")
var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
- if(species == "Machine")
+ if(S.flags & ALL_RPARTS)
valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs
if(!limb_name) return
@@ -1766,19 +1813,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
second_limb = "r_hand"
if("Left Foot")
limb = "l_foot"
- if(species != "Machine")
+ if(!(S.flags & ALL_RPARTS))
third_limb = "l_leg"
if("Right Foot")
limb = "r_foot"
- if(species != "Machine")
+ if(!(S.flags & ALL_RPARTS))
third_limb = "r_leg"
if("Left Hand")
limb = "l_hand"
- if(species != "Machine")
+ if(!(S.flags & ALL_RPARTS))
third_limb = "l_arm"
if("Right Hand")
limb = "r_hand"
- if(species != "Machine")
+ if(!(S.flags & ALL_RPARTS))
third_limb = "r_arm"
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
@@ -1834,7 +1881,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(subchoice)
choice = subchoice
if(limb in list("head", "chest", "groin"))
- if(species != "Machine")
+ if(!(S.flags & ALL_RPARTS))
return
if(limb == "head")
ha_style = "None"
@@ -1901,10 +1948,20 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
toggles ^= DONATOR_PUBLIC
if("gender")
- if(gender == MALE)
- gender = FEMALE
+ if(!S.has_gender)
+ var/newgender = input(user, "Choose Gender:") as null|anything in list("Male", "Female", "Genderless")
+ switch(newgender)
+ if("Male")
+ gender = MALE
+ if("Female")
+ gender = FEMALE
+ if("Genderless")
+ gender = PLURAL
else
- gender = MALE
+ if(gender == MALE)
+ gender = FEMALE
+ else
+ gender = MALE
underwear = random_underwear(gender)
if("hear_adminhelps")
@@ -1935,6 +1992,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("ghost_att_anim")
show_ghostitem_attack = !show_ghostitem_attack
+ if("winflash")
+ windowflashing = !windowflashing
+
if("UIcolor")
var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
if(!UI_style_color_new) return
@@ -1963,6 +2023,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("randomslot")
randomslot = !randomslot
+ if(isnewplayer(usr))
+ var/mob/new_player/N = usr
+ N.new_player_panel_proc()
if("hear_midis")
sound ^= SOUND_MIDI
@@ -1986,6 +2049,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("ghost_radio")
toggles ^= CHAT_GHOSTRADIO
+ if("ghost_anonsay")
+ ghost_anonsay = !ghost_anonsay
+
if("save")
save_preferences(user)
save_character(user)
@@ -2032,6 +2098,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.add_language(language)
+
character.real_name = real_name
character.dna.real_name = real_name
character.name = character.real_name
@@ -2080,15 +2147,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
for(var/name in organ_data)
var/status = organ_data[name]
- var/obj/item/organ/external/O = character.organs_by_name[name]
+ var/obj/item/organ/external/O = character.bodyparts_by_name[name]
if(O)
if(status == "amputated")
- character.organs_by_name[O.limb_name] = null
- character.organs -= O
- if(O.children) // This might need to become recursive.
- for(var/obj/item/organ/external/child in O.children)
- character.organs_by_name[child.limb_name] = null
- character.organs -= child
+ qdel(O.remove(character))
else if(status == "cyborg")
if(rlimb_data[name])
@@ -2132,12 +2194,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
- if(backbag > 4 || backbag < 1)
- backbag = 1 //Same as above
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
- if(character.gender in list(PLURAL, NEUTER))
+ if(S.has_gender && (character.gender in list(PLURAL, NEUTER)))
if(isliving(src)) //Ghosts get neuter by default
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
character.change_gender(MALE)
@@ -2146,35 +2206,31 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
character.dna.SetSEState(FATBLOCK,1,1)
- character.mutations += FAT
- character.mutations += OBESITY
character.overeatduration = 600
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
character.dna.SetSEState(GLASSESBLOCK,1,1)
- character.disabilities |= NEARSIGHTED
if(disabilities & DISABILITY_FLAG_EPILEPTIC)
character.dna.SetSEState(EPILEPSYBLOCK,1,1)
- character.disabilities |= EPILEPSY
if(disabilities & DISABILITY_FLAG_DEAF)
character.dna.SetSEState(DEAFBLOCK,1,1)
- character.disabilities |= DEAF
if(disabilities & DISABILITY_FLAG_BLIND)
character.dna.SetSEState(BLINDBLOCK,1,1)
- character.disabilities |= BLIND
+
+ if(disabilities & DISABILITY_FLAG_COLOURBLIND)
+ character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
if(disabilities & DISABILITY_FLAG_MUTE)
character.dna.SetSEState(MUTEBLOCK,1,1)
- character.disabilities |= MUTE
S.handle_dna(character)
if(character.dna.dirtySE)
character.dna.UpdateSE()
- domutcheck(character, null, MUTCHK_FORCED)
+ domutcheck(character, null, MUTCHK_FORCED) //'Activates' all the above disabilities.
character.dna.ready_dna(character, flatten_SE = 0)
character.sync_organ_dna(assimilate=1)
@@ -2188,29 +2244,29 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
/datum/preferences/proc/open_load_dialog(mob/user)
var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot")
+ var/list/slotnames[max_save_slots]
+
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ return
+ while(query.NextRow())
+ slotnames[text2num(query.item[1])] = query.item[2]
var/dat = ""
dat += ""
dat += "Select a character slot to load "
var/name
- for(var/i=1, i<=max_save_slots, i++)
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
- message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
- return
- while(query.NextRow())
- if(i==text2num(query.item[1]))
- name = query.item[2]
- if(!name) name = "Character[i]"
- if(i==default_slot)
+ for(var/i in 1 to max_save_slots)
+ name = slotnames[i] || "Character [i]"
+ if(i == default_slot)
name = "[name] "
dat += "[name] "
- name = null
dat += " "
- dat += "Close "
+ dat += "Close "
dat += " "
// user << browse(dat, "window=saves;size=300x390")
var/datum/browser/popup = new(user, "saves", "Character Saves
", 300, 390)
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index 581daf222d3..579699a9414 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -14,6 +14,8 @@
nanoui_fancy,
show_ghostitem_attack,
lastchangelog,
+ windowflashing,
+ ghost_anonsay,
exp
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
@@ -41,7 +43,9 @@
nanoui_fancy = text2num(query.item[11])
show_ghostitem_attack = text2num(query.item[12])
lastchangelog = query.item[13]
- exp = query.item[14]
+ windowflashing = text2num(query.item[14])
+ ghost_anonsay = text2num(query.item[15])
+ exp = query.item[16]
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -56,6 +60,8 @@
nanoui_fancy = sanitize_integer(nanoui_fancy, 0, 1, initial(nanoui_fancy))
show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack))
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
+ windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
+ ghost_anonsay = sanitize_integer(ghost_anonsay, 0, 1, initial(ghost_anonsay))
exp = sanitize_text(exp, initial(exp))
return 1
@@ -81,7 +87,9 @@
volume='[volume]',
nanoui_fancy='[nanoui_fancy]',
show_ghostitem_attack='[show_ghostitem_attack]',
- lastchangelog='[lastchangelog]'
+ lastchangelog='[lastchangelog]',
+ windowflashing='[windowflashing]',
+ ghost_anonsay='[ghost_anonsay]'
WHERE ckey='[C.ckey]'"}
)
@@ -167,7 +175,8 @@
speciesprefs,
socks,
body_accessory,
- gear
+ gear,
+ autohiss
FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"})
if(!query.Execute())
var/err = query.ErrorMsg()
@@ -216,7 +225,7 @@
b_eyes = text2num(query.item[35])
underwear = query.item[36]
undershirt = query.item[37]
- backbag = text2num(query.item[38])
+ backbag = query.item[38]
b_type = query.item[39]
@@ -260,17 +269,19 @@
socks = query.item[63]
body_accessory = query.item[64]
gear = params2list(query.item[65])
+ autohiss_mode = text2num(query.item[66])
//Sanitize
+ var/datum/species/SP = all_species[species]
metadata = sanitize_text(metadata, initial(metadata))
- real_name = reject_bad_name(real_name)
+ real_name = reject_bad_name(real_name, 1)
if(isnull(species)) species = "Human"
if(isnull(language)) language = "None"
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
if(isnull(speciesprefs)) speciesprefs = initial(speciesprefs)
if(!real_name) real_name = random_name(gender,species)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
- gender = sanitize_gender(gender)
+ gender = sanitize_gender(gender, FALSE, !SP.has_gender)
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
@@ -304,8 +315,9 @@
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
underwear = sanitize_text(underwear, initial(underwear))
undershirt = sanitize_text(undershirt, initial(undershirt))
- backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
+ backbag = sanitize_text(backbag, initial(backbag))
b_type = sanitize_text(b_type, initial(b_type))
+ autohiss_mode = sanitize_integer(autohiss_mode, 0, 2, initial(autohiss_mode))
alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option))
job_support_high = sanitize_integer(job_support_high, 0, 65535, initial(job_support_high))
@@ -418,7 +430,8 @@
speciesprefs='[speciesprefs]',
socks='[socks]',
body_accessory='[body_accessory]',
- gear='[gearlist]'
+ gear='[gearlist]',
+ autohiss='[autohiss_mode]'
WHERE ckey='[C.ckey]'
AND slot='[default_slot]'"}
)
@@ -458,7 +471,7 @@
gen_record,
player_alt_titles,
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs,
- socks, body_accessory, gear)
+ socks, body_accessory, gear, autohiss)
VALUES
('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]',
@@ -488,7 +501,7 @@
'[sanitizeSQL(gen_record)]',
'[playertitlelist]',
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]',
- '[socks]', '[body_accessory]', '[gearlist]')
+ '[socks]', '[body_accessory]', '[gearlist]', '[autohiss_mode]')
"}
)
@@ -500,21 +513,24 @@
return
return 1
-/*
-/datum/preferences/proc/random_character(client/C)
+/datum/preferences/proc/load_random_character_slot(client/C)
var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot")
+ var/list/saves = list()
+
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during random character slot picking. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during random character slot picking. Error : \[[err]\]\n")
+ return
while(query.NextRow())
- var/list/saves = list()
- for(var/i=1, i<=MAX_SAVE_SLOTS, i++)
- if(i==text2num(query.item[1]))
- saves += i
+ saves += text2num(query.item[1])
if(!saves.len)
load_character(C)
return 0
load_character(C,pick(saves))
- return 1*/
+ return 1
/datum/preferences/proc/SetChangelog(client/C,hash)
lastchangelog=hash
diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm
index 10f6c58982f..b922706fd61 100644
--- a/code/modules/client/preference/preferences_toggles.dm
+++ b/code/modules/client/preference/preferences_toggles.dm
@@ -36,8 +36,8 @@
to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers")
feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/verb/toggleadminhelpsound()
- set name = "Hear/Silence Adminhelps"
+/client/proc/toggleadminhelpsound()
+ set name = "Hear/Silence Admin Bwoinks"
set category = "Preferences"
set desc = "Toggle hearing a notification when admin PMs are recieved"
if(!holder) return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 078f83f506a..2142d336fac 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -2,7 +2,7 @@
name = "clothing"
burn_state = FLAMMABLE
var/list/species_restricted = null //Only these species can wear this kit.
- var/rig_restrict_helmet = 0 // Stops the user from equipping a rig helmet without attaching it to the suit first.
+ var/hardsuit_restrict_helmet = 0 // Stops the user from equipping a hardsuit helmet without attaching it to the suit first.
var/scan_reagents = 0 //Can the wearer see reagents while it's equipped?
/*
@@ -14,7 +14,7 @@
var/list/sprite_sheets_refit = null
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
-
+ var/alt_desc = null
var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 //but seperated to allow items to protect but not impair vision, like space helmets
@@ -24,6 +24,7 @@
var/toggle_message = null
var/alt_toggle_message = null
var/active_sound = null
+ var/toggle_sound = null
var/toggle_cooldown = null
var/cooldown = 0
var/species_disguise = null
@@ -57,7 +58,7 @@
wearable = 1
if(!wearable)
- to_chat(M, "\red Your species cannot wear [src].")
+ to_chat(M, "Your species cannot wear [src]. ")
return 0
return 1
@@ -84,7 +85,7 @@
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
name = "ears"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 2
slot_flags = SLOT_EARS
burn_state = FIRE_PROOF
@@ -127,7 +128,7 @@
/obj/item/clothing/ears/offear
name = "Other ear"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
icon = 'icons/mob/screen_gen.dmi'
icon_state = "block"
slot_flags = SLOT_EARS | SLOT_TWOEARS
@@ -144,8 +145,8 @@
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
- w_class = 2
- flags = GLASSESCOVERSEYES
+ w_class = WEIGHT_CLASS_SMALL
+ flags_cover = GLASSESCOVERSEYES
slot_flags = SLOT_EYES
materials = list(MAT_GLASS = 250)
var/vision_flags = 0
@@ -176,7 +177,7 @@ BLIND // can't see anything
/obj/item/clothing/gloves
name = "gloves"
gender = PLURAL //Carn: for grammarically correct text-parsing
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/clothing/gloves.dmi'
siemens_coefficient = 0.50
body_parts_covered = HANDS
@@ -193,13 +194,14 @@ BLIND // can't see anything
"Drask" = 'icons/mob/species/drask/gloves.dmi'
)
-/obj/item/clothing/gloves/proc/Touch()
- return
+// Called just before an attack_hand(), in mob/UnarmedAttack()
+/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
+ return 0 // return 1 to cancel attack_hand()
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wirecutters))
if(!clipped)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] snips the fingertips off [src]. ","You snip the fingertips off [src]. ")
clipped = 1
name = "mangled [name]"
@@ -248,7 +250,7 @@ BLIND // can't see anything
switch(sensor_mode)
if(0)
for(var/mob/V in viewers(user, 1))
- V.show_message("\red [user] disables [src.loc]'s remote sensing equipment.", 1)
+ V.show_message("[user] disables [src.loc]'s remote sensing equipment. ", 1)
if(1)
for(var/mob/V in viewers(user, 1))
V.show_message("[user] turns [src.loc]'s remote sensors to binary.", 1)
@@ -310,10 +312,11 @@ BLIND // can't see anything
if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again.
flags_inv |= HIDEFACE
if(flags != initial(flags))
- if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again.
- flags |= MASKCOVERSMOUTH
if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again.
flags |= AIRTIGHT
+ if(flags_cover != initial(flags_cover))
+ if(initial(flags_cover) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again.
+ flags_cover |= MASKCOVERSMOUTH
if(H.head == src && flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
user.unEquip(src)
@@ -336,8 +339,8 @@ BLIND // can't see anything
if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE).
This reveals the user's face since the bandana will now be going on their head.*/
- if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks.
- flags &= ~MASKCOVERSMOUTH
+ if(flags_cover & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks.
+ flags_cover &= ~MASKCOVERSMOUTH
if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face.
flags &= ~AIRTIGHT
if(user.wear_mask == src && initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face.
@@ -397,7 +400,7 @@ BLIND // can't see anything
if(istype(I, /obj/item/weapon/wirecutters))
if(can_cut_open)
if(!cut_open)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, I.usesound, 100, 1)
user.visible_message("[user] cuts open the toes of [src]. ","You cut open the toes of [src]. ")
cut_open = 1
icon_state = "[icon_state]_opentoe"
@@ -519,7 +522,8 @@ BLIND // can't see anything
name = "Space helmet"
icon_state = "space"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
+ flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
item_state = "s_helmet"
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50)
@@ -539,7 +543,7 @@ BLIND // can't see anything
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
icon_state = "space"
item_state = "s_suit"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
@@ -565,10 +569,11 @@ BLIND // can't see anything
permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
- species_fit = list("Vox")
+ species_fit = list("Vox", "Drask", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
- "Drask" = 'icons/mob/species/drask/uniform.dmi'
+ "Drask" = 'icons/mob/species/drask/uniform.dmi',
+ "Grey" = 'icons/mob/species/grey/uniform.dmi'
)
var/has_sensor = 1//For the crew computer 2 = unable to change mode
var/sensor_mode = 0
@@ -582,6 +587,10 @@ BLIND // can't see anything
var/rolled_down = 0
var/basecolor
+/obj/item/clothing/under/Destroy()
+ QDEL_LIST(accessories)
+ return ..()
+
/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A)
if(istype(A))
.=1
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 4fde338ba54..5c0c6dcb402 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -42,7 +42,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
- "Drask" = 'icons/mob/species/drask/eyes.dmi'
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/meson/night
@@ -75,6 +76,7 @@
icon_state = "cybereye-green"
item_state = "eyepatch"
flags = NODROP
+ flags_cover = null
prescription_upgradable = 0
/obj/item/clothing/glasses/science
@@ -123,7 +125,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
- "Drask" = 'icons/mob/species/drask/eyes.dmi'
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/eyepatch
@@ -167,6 +170,7 @@
icon_state = "cybereye-blue"
item_state = "eyepatch"
flags = NODROP
+ flags_cover = null
/obj/item/clothing/glasses/regular
name = "prescription glasses"
@@ -218,7 +222,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
- "Drask" = 'icons/mob/species/drask/eyes.dmi'
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/fake
@@ -232,8 +237,6 @@
name = "noir sunglasses"
desc = "Somehow these seem even more out-of-date than normal sunglasses."
actions_types = list(/datum/action/item_action/noir)
- var/noir_mode = 0
- color_view = MATRIX_GREYSCALE
/obj/item/clothing/glasses/sunglasses/noir/attack_self()
toggle_noir()
@@ -243,36 +246,8 @@
return 1
/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir()
- var/list/difference = difflist(usr.client.color, color_view)
-
- if(!noir_mode)
- if(color_view && usr.client && (!usr.client.color || difference))
- animate(usr.client, color = color_view, time = 10)
- noir_mode = 1
- else
- if(usr.client && usr.client.color && !difference)
- animate(usr.client, color = initial(usr.client.color), time = 10)
- noir_mode = 0
-
-/obj/item/clothing/glasses/sunglasses/noir/equipped(mob/user, slot)
- var/list/difference = difflist(user.client.color, color_view)
-
- if(slot == slot_glasses)
- if(noir_mode)
- if(color_view && user.client && (!user.client.color || difference.len))
- animate(user.client, color = color_view, time = 10)
- else
- if(user.client && user.client.color && !difference.len)
- animate(user.client, color = initial(user.client.color), time = 10)
- ..(user, slot)
-
-/obj/item/clothing/glasses/sunglasses/noir/dropped(mob/living/carbon/human/user)
- var/list/difference = difflist(user.client.color, color_view)
-
- if(istype(user) && user.glasses == src)
- if(user.client && user.client.color && !difference.len)
- animate(user.client, color = initial(user.client.color), time = 10)
- ..(user)
+ color_view = color_view ? null : MATRIX_GREYSCALE //Toggles between null and grayscale, with null being the default option.
+ usr.update_client_colour()
/obj/item/clothing/glasses/sunglasses/yeah
name = "agreeable glasses"
@@ -308,13 +283,14 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
- "Drask" = 'icons/mob/species/drask/eyes.dmi'
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/lasers
desc = "A peculiar set of sunglasses; they have various chips and other panels attached to the sides of the frames."
name = "high-tech sunglasses"
- flags = GLASSESCOVERSEYES | NODROP
+ flags = NODROP
/obj/item/clothing/glasses/sunglasses/lasers/equipped(mob/user, slot) //grant them laser eyes upon equipping it.
if(slot == slot_glasses)
@@ -333,7 +309,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
- "Drask" = 'icons/mob/species/drask/eyes.dmi'
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/welding/attack_self()
@@ -342,7 +319,7 @@
/obj/item/clothing/glasses/welding/proc/toggle()
if(up)
up = !up
- flags |= GLASSESCOVERSEYES
+ flags_cover |= GLASSESCOVERSEYES
flags_inv |= HIDEEYES
icon_state = initial(icon_state)
to_chat(usr, "You flip the [src] down to protect your eyes.")
@@ -350,15 +327,15 @@
tint = initial(tint) //better than istype
else
up = !up
- flags &= ~GLASSESCOVERSEYES
+ flags_cover &= ~GLASSESCOVERSEYES
flags_inv &= ~HIDEEYES
icon_state = "[initial(icon_state)]up"
to_chat(usr, "You push the [src] up out of your face.")
flash_protect = 0
tint = 0
var/mob/living/carbon/user = usr
- user.update_inv_glasses()
user.update_tint()
+ user.update_inv_glasses()
for(var/X in actions)
var/datum/action/A = X
@@ -406,7 +383,7 @@
emp_act(severity)
if(istype(src.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/M = src.loc
- to_chat(M, "\red The Optical Thermal Scanner overloads and blinds you!")
+ to_chat(M, "The Optical Thermal Scanner overloads and blinds you! ")
if(M.glasses == src)
M.EyeBlind(3)
M.EyeBlurry(5)
@@ -427,7 +404,7 @@
name = "Thermoncle"
desc = "A monocle thermal."
icon_state = "thermoncle"
- flags = null //doesn't protect eyes because it's a monocle, duh
+ flags_cover = null //doesn't protect eyes because it's a monocle, duh
/obj/item/clothing/glasses/thermal/eyepatch
name = "Optical Thermal Eyepatch"
@@ -498,3 +475,71 @@
name = "gar glasses"
icon_state = "gar"
item_state = "gar"
+
+/obj/item/clothing/glasses/godeye
+ name = "eye of god"
+ desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes."
+ icon_state = "godeye"
+ item_state = "godeye"
+ vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
+ darkness_view = 8
+ scan_reagents = 1
+ flags = NODROP
+ flags_cover = null
+ invis_view = SEE_INVISIBLE_MINIMUM
+
+/obj/item/clothing/glasses/godeye/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W, src) && W != src && W.loc == user)
+ if(W.icon_state == "godeye")
+ W.icon_state = "doublegodeye"
+ W.item_state = "doublegodeye"
+ W.desc = "A pair of strange eyes, said to have been torn from an omniscient creature that used to roam the wastes. There's no real reason to have two, but that isn't stopping you."
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.update_inv_wear_mask()
+ else
+ to_chat(user, "The eye winks at you and vanishes into the abyss, you feel really unlucky. ")
+ qdel(src)
+ ..()
+
+/obj/item/clothing/glasses/tajblind
+ name = "embroidered veil"
+ desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes."
+ icon_state = "tajblind"
+ item_state = "tajblind"
+ flags_cover = GLASSESCOVERSEYES
+ actions_types = list(/datum/action/item_action/toggle)
+ up = 0
+ tint = 0
+
+/obj/item/clothing/glasses/tajblind/eng
+ name = "industrial veil"
+ icon_state = "tajblind_engi"
+ item_state = "tajblind_engi"
+
+/obj/item/clothing/glasses/tajblind/sci
+ name = "hi-tech veil"
+ icon_state = "tajblind_sci"
+ item_state = "tajblind_sci"
+
+/obj/item/clothing/glasses/tajblind/cargo
+ name = "khaki veil"
+ icon_state = "tajblind_cargo"
+ item_state = "tajblind_cargo"
+
+/obj/item/clothing/glasses/tajblind/attack_self()
+ toggle_veil()
+
+/obj/item/clothing/glasses/proc/toggle_veil()
+ if(usr.canmove && !usr.incapacitated())
+ if(up)
+ up = !up
+ tint = initial(tint)
+ to_chat(usr, "You activate [src], allowing you to see.")
+ else
+ up = !up
+ tint = 3
+ to_chat(usr, "You deactivate [src], obscuring your vision.")
+ var/mob/living/carbon/user = usr
+ user.update_tint()
+ user.update_inv_glasses()
\ No newline at end of file
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 18d9b26361f..9eb2455622e 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -9,6 +9,7 @@
/obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot)
+ ..()
if(HUDType && slot == slot_glasses)
var/datum/atom_hud/H = huds[HUDType]
H.add_hud_to(user)
@@ -32,7 +33,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
- "Drask" = 'icons/mob/species/drask/eyes.dmi'
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/hud/health/health_advanced
@@ -112,6 +114,12 @@
flash_protect = 1
tint = 1
prescription_upgradable = 1
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/eyes.dmi',
+ "Drask" = 'icons/mob/species/drask/eyes.dmi',
+ "Grey" = 'icons/mob/species/grey/eyes.dmi'
+ )
/obj/item/clothing/glasses/hud/security/sunglasses/prescription
prescription = 1
@@ -133,4 +141,28 @@
item_state = "glasses"
darkness_view = 8
invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these
- prescription_upgradable = 0
\ No newline at end of file
+ prescription_upgradable = 0
+
+/obj/item/clothing/glasses/hud/security/tajblind
+ name = "sleek veil"
+ desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes. This one has an in-built security HUD."
+ icon_state = "tajblind_sec"
+ item_state = "tajblind_sec"
+ flags_cover = GLASSESCOVERSEYES
+ actions_types = list(/datum/action/item_action/toggle)
+ up = 0
+
+/obj/item/clothing/glasses/hud/security/tajblind/attack_self()
+ toggle_veil()
+
+/obj/item/clothing/glasses/hud/health/tajblind
+ name = "lightweight veil"
+ desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes. This one has an installed medical HUD."
+ icon_state = "tajblind_med"
+ item_state = "tajblind_med"
+ flags_cover = GLASSESCOVERSEYES
+ actions_types = list(/datum/action/item_action/toggle)
+ up = 0
+
+/obj/item/clothing/glasses/hud/health/tajblind/attack_self()
+ toggle_veil()
\ No newline at end of file
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 11503b40278..a3a38e3af58 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -78,7 +78,7 @@
if(istype(W, /obj/item/weapon/wirecutters))
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
to_chat(user, "You snip the fingertips off of [src]. ")
- playsound(user.loc,'sound/items/Wirecutter.ogg', rand(10,50), 1)
+ playsound(user.loc, W.usesound, rand(10,50), 1)
var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc)
if(pickpocket)
F.pickpocket = 1
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 2b932df2dc1..ee5022a1793 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -56,3 +56,72 @@
icon_state = "latex"
item_state = "lgloves"
flags = NODROP
+
+
+/obj/item/clothing/gloves/color/yellow/stun
+ name = "stun gloves"
+ desc = "Horrendous and awful. It smells like cancer. The fact it has wires attached to it is incidental."
+ var/obj/item/weapon/stock_parts/cell/cell = null
+ var/stun_strength = 5
+ var/stun_cost = 2000
+
+/obj/item/clothing/gloves/color/yellow/stun/New()
+ ..()
+ update_icon()
+
+/obj/item/clothing/gloves/color/yellow/stun/Destroy()
+ QDEL_NULL(cell)
+ return ..()
+
+/obj/item/clothing/gloves/color/yellow/stun/Touch(atom/A, proximity)
+ if(!ishuman(loc))
+ return FALSE //Only works while worn
+ if(!iscarbon(A))
+ return FALSE
+ if(!proximity)
+ return FALSE
+ if(cell)
+ var/mob/living/carbon/human/H = loc
+ if(H.a_intent == I_HARM)
+ var/mob/living/carbon/C = A
+ if(cell.use(stun_cost))
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(5, 0, loc)
+ s.start()
+ playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
+ H.do_attack_animation(C)
+ visible_message("[C] has been touched with [src] by [H]! ")
+ C.Stun(stun_strength)
+ C.Weaken(stun_strength)
+ C.apply_effect(STUTTER, stun_strength)
+ else
+ to_chat(H, "Not enough charge! ")
+ return TRUE
+ return FALSE
+
+/obj/item/clothing/gloves/color/yellow/stun/update_icon()
+ ..()
+ overlays.Cut()
+ overlays += "gloves_wire"
+ if(cell)
+ overlays += "gloves_cell"
+
+/obj/item/clothing/gloves/color/yellow/stun/attackby(obj/item/weapon/W, mob/living/user, params)
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
+ if(!cell)
+ if(!user.drop_item())
+ to_chat(user, "[W] is stuck to you! ")
+ return
+ W.forceMove(src)
+ cell = W
+ to_chat(user, "You attach [W] to [src]. ")
+ update_icon()
+ else
+ to_chat(user, "[src] already has a cell. ")
+
+ else if(iswirecutter(W))
+ if(cell)
+ to_chat(user, "You cut [cell] away from [src]. ")
+ cell.forceMove(get_turf(loc))
+ cell = null
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index bb47a6e9094..cbee11c290a 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -2,7 +2,8 @@
name = "helmet"
desc = "Standard Security gear. Protects the head from impacts."
icon_state = "helmetmaterials"
- flags = HEADCOVERSEYES | HEADBANGPROTECT
+ flags = HEADBANGPROTECT
+ flags_cover = HEADCOVERSEYES
item_state = "helmetmaterials"
armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
@@ -12,7 +13,7 @@
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
burn_state = FIRE_PROOF
- species_fit = list("Vox")
+ species_fit = list("Vox", "Drask")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Drask" = 'icons/mob/species/drask/helmet.dmi'
@@ -34,6 +35,8 @@
while(up)
playsound(src.loc, "[active_sound]", 100, 0, 4)
sleep(15)
+ if(toggle_sound)
+ playsound(src.loc, "[toggle_sound]", 100, 0, 4)
/obj/item/clothing/head/helmet/visor
@@ -71,20 +74,15 @@
icon_state = "swat"
item_state = "swat-alt"
armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/helmet.dmi',
- "Drask" = 'icons/mob/species/drask/helmet.dmi'
- )
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
desc = "It's a helmet specifically designed to protect against close range attacks."
icon_state = "riot"
item_state = "helmet"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | HEADBANGPROTECT
armor = list(melee = 41, bullet = 15, laser = 5, energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
/obj/item/clothing/head/helmet/riot/knight
@@ -92,7 +90,7 @@
desc = "A classic metal helmet."
icon_state = "knight_green"
item_state = "knight_green"
- flags = BLOCKHAIR|HEADCOVERSEYES|HEADCOVERSMOUTH
+ flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/helmet/justice
@@ -118,20 +116,15 @@
name = "\improper SWAT helmet"
desc = "They're often used by highly trained Swat Members."
icon_state = "swat"
- flags = HEADCOVERSEYES
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
+ flags = null
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi',
- "Drask" = 'icons/mob/species/drask/helmet.dmi'
- )
/obj/item/clothing/head/helmet/swat/syndicate
name = "blood-red helmet"
@@ -143,7 +136,7 @@
name = "\improper Thunderdome helmet"
desc = "'Let the battle commence!' "
icon_state = "thunderdome"
- flags = HEADCOVERSEYES
+ flags = null
item_state = "thunderdome"
armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
@@ -155,7 +148,7 @@
/obj/item/clothing/head/helmet/roman
name = "roman helmet"
desc = "An ancient helmet made of bronze and leather."
- flags = HEADCOVERSEYES
+ flags = null
armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0)
icon_state = "roman"
item_state = "roman"
@@ -171,15 +164,21 @@
name = "gladiator helmet"
desc = "Ave, Imperator, morituri te salutant."
icon_state = "gladiator"
- flags = HEADCOVERSEYES | BLOCKHAIR
+ flags = BLOCKHAIR
item_state = "gladiator"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+ toggle_message = "You attach the face shield to the"
+ alt_toggle_message = "You remove the face shield from the"
+ actions_types = list(/datum/action/item_action/toggle_helmet_mode)
+ can_toggle = 1
+ toggle_cooldown = 20
+ toggle_sound = 'sound/items/ZippoClose.ogg'
obj/item/clothing/head/helmet/redtaghelm
name = "red laser tag helmet"
desc = "They have chosen their own end."
icon_state = "redtaghelm"
- flags = HEADCOVERSEYES
+ flags = null
item_state = "redtaghelm"
armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
@@ -189,7 +188,7 @@ obj/item/clothing/head/helmet/bluetaghelm
name = "blue laser tag helmet"
desc = "They'll need more men."
icon_state = "bluetaghelm"
- flags = HEADCOVERSEYES
+ flags = null
item_state = "bluetaghelm"
armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
@@ -200,8 +199,12 @@ obj/item/clothing/head/blob
desc = "A collectible hat handed out at the latest Blob Family Reunion."
icon_state = "blobhat"
item_state = "blobhat"
- flags = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
+ )
/obj/item/clothing/head/helmet/riot/knight/blue
icon_state = "knight_blue"
@@ -220,7 +223,7 @@ obj/item/clothing/head/blob
desc = "Deus Vult."
icon_state = "knight_templar"
item_state = "knight_templar"
-
+ armor = list(melee = 20, bullet = 7, laser = 2, energy = 2, bomb = 2, bio = 2, rad = 0)
//Commander
/obj/item/clothing/head/helmet/ert/command
@@ -246,7 +249,7 @@ obj/item/clothing/head/blob
desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights."
icon_state = "erthelmet_med"
-//Medical
+//Janitorial
/obj/item/clothing/head/helmet/ert/janitor
name = "emergency response team janitor helmet"
desc = "A set of armor worn by janitorial members of the NanoTrasen Emergency Response Team. Has red and white highlights."
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 9eeb7136221..9c76701c2bb 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -43,14 +43,16 @@
name = "chaplain's hood"
desc = "It's hood that covers the head. It keeps you warm during the space winters."
icon_state = "chaplain_hood"
- flags = HEADCOVERSEYES | BLOCKHAIR
+ flags = BLOCKHAIR
+ flags_cover = HEADCOVERSEYES
//Chaplain
/obj/item/clothing/head/nun_hood
name = "nun hood"
desc = "Maximum piety in this star system."
icon_state = "nun_hood"
- flags = HEADCOVERSEYES | BLOCKHAIR
+ flags = BLOCKHAIR
+ flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/det_hat
name = "hat"
@@ -127,6 +129,11 @@
icon_state = "beret_sci"
//Medical
+/obj/item/clothing/head/beret/med
+ name = "medical beret"
+ desc = "A white beret with a green cross finely threaded into it. It has that sterile smell about it."
+ icon_state = "beret_med"
+
/obj/item/clothing/head/surgery
name = "surgical cap"
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs."
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 691394eb1b4..6d46eb7b061 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -60,7 +60,8 @@
name = "hastur's hood"
desc = "It's unspeakably stylish"
icon_state = "hasturhood"
- flags = HEADCOVERSEYES | BLOCKHAIR
+ flags = BLOCKHAIR
+ flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/nursehat
name = "nurse's hat"
@@ -80,16 +81,18 @@
desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?"
icon_state = "cueball"
item_state = "cueball"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/head/snowman
name = "snowman head"
desc = "A ball of white styrofoam. So festive."
icon_state = "snowman_h"
item_state = "snowman_h"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/head/that
name = "sturdy top-hat"
@@ -111,7 +114,8 @@
desc = "Fight for what's righteous!"
icon_state = "justicered"
item_state = "justicered"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = BLOCKHAIR
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/head/justice/blue
icon_state = "justiceblue"
@@ -181,9 +185,33 @@
/obj/item/clothing/head/cowboyhat
name = "cowboy hat"
icon_state = "cowboyhat"
- item_state = "fedora"
+ item_state = "cowboyhat"
+ desc = "For the Rancher in us all."
+
+/obj/item/clothing/head/cowboyhat/tan
+ name = "tan cowboy hat"
+ icon_state = "cowboyhat_tan"
+ item_state = "cowboyhat_tan"
desc = "There's a new sheriff in town. Pass the whiskey."
+/obj/item/clothing/head/cowboyhat/black
+ name = "black cowboy hat"
+ icon_state = "cowboyhat_black"
+ item_state = "cowboyhat_black"
+ desc = "This station ain't big enough for the two ah' us."
+
+/obj/item/clothing/head/cowboyhat/white
+ name = "white cowboy hat"
+ icon_state = "cowboyhat_white"
+ item_state = "cowboyhat_white"
+ desc = "Authentic Marshall hair case. Now ya can protect this here homestead. Navy Model not included."
+
+/obj/item/clothing/head/cowboyhat/pink
+ name = "cowgirl hat"
+ icon_state = "cowboyhat_pink"
+ item_state = "cowboyhat_pink"
+ desc = "For those buckle bunnies wanta' become a real buckaroo."
+
/obj/item/clothing/head/fedora
name = "fedora"
icon_state = "fedora"
@@ -352,7 +380,7 @@
throwforce = 3.0
throw_speed = 2
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
burn_state = FIRE_PROOF
@@ -361,6 +389,11 @@
desc = "A hat with bells, to add some merryness to the suit."
icon_state = "jester_hat"
+/obj/item/clothing/head/rice_hat
+ name = "rice hat"
+ desc = "Welcome to the rice fields, motherfucker."
+ icon_state = "rice_hat"
+
/obj/item/clothing/head/griffin
name = "griffon head"
desc = "Why not 'eagle head'? Who knows."
@@ -370,15 +403,12 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
actions_types = list(/datum/action/item_action/caw)
-/obj/item/clothing/head/griffin/super_hero
- flags = BLOCKHAIR|NODROP
-
/obj/item/clothing/head/griffin/attack_self()
caw()
/obj/item/clothing/head/griffin/proc/caw()
if(cooldown < world.time - 20) // A cooldown, to stop people being jerks
- playsound(src.loc, "sound/misc/caw.ogg", 50, 1)
+ playsound(src.loc, 'sound/misc/caw.ogg', 50, 1)
cooldown = world.time
@@ -417,4 +447,4 @@
/obj/item/clothing/head/crown/fancy
name = "magnificent crown"
desc = "A crown worn by only the highest emperors of the land."
- icon_state = "fancycrown"
\ No newline at end of file
+ icon_state = "fancycrown"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 67e4f697eff..aa5a81c2063 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -15,7 +15,7 @@
name = "welding helmet"
desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye."
icon_state = "welding"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
item_state = "welding"
materials = list(MAT_METAL=1750, MAT_GLASS=400)
flash_protect = 2
@@ -53,7 +53,7 @@
/obj/item/clothing/head/welding/proc/toggle()
if(up)
up = !up
- flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH)
+ flags_cover |= (HEADCOVERSEYES | HEADCOVERSMOUTH)
flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_state = initial(icon_state)
to_chat(usr, "You flip the [src] down to protect your eyes.")
@@ -61,15 +61,15 @@
tint = 2
else
up = !up
- flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
+ flags_cover &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_state = "[initial(icon_state)]up"
to_chat(usr, "You push the [src] up out of your face.")
flash_protect = 0
tint = 0
- var/mob/living/carbon/C = usr
- C.update_tint()
- usr.update_inv_head() //so our mob-overlays update
+ var/mob/living/carbon/user = usr
+ user.update_tint()
+ user.update_inv_head() //so our mob-overlays update
for(var/X in actions)
var/datum/action/A = X
@@ -84,7 +84,7 @@
name = "cake-hat"
desc = "It's tasty looking!"
icon_state = "cake0"
- flags = HEADCOVERSEYES
+ flags_cover = HEADCOVERSEYES
var/onfire = 0.0
var/status = 0
var/fire_resist = T0C+1300 //this is the max temp it can stand before you start to cook. although it might not burn away, you take damage
@@ -150,8 +150,9 @@
icon_state = "hardhat0_pumpkin"//Could stand to be renamed
item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 2 //luminosity when on
@@ -220,8 +221,8 @@
desc = "A helmet made out of a box."
icon_state = "cardborg_h"
item_state = "cardborg_h"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_disguise = "High-tech robot"
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 8727065fb5b..93d420f8ede 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -6,6 +6,10 @@
item_color = "cargo"
var/flipped = 0
actions_types = list(/datum/action/item_action/flip_cap)
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
/obj/item/clothing/head/soft/dropped()
icon_state = "[item_color]soft"
@@ -102,3 +106,15 @@
desc = "It's baseball hat in corpotate colours."
icon_state = "corpsoft"
item_color = "corp"
+
+/obj/item/clothing/head/soft/solgov
+ name = "Sol Federation marine cap"
+ desc = "A soft cap worn by marines of the Sol Federation."
+ icon_state = "solgovsoft"
+ item_color = "solgov"
+
+/obj/item/clothing/head/soft/solgov/command
+ name = "Sol Federation Lieutenant's cap"
+ desc = "A soft cap worn by marines of the Sol Federation. The insignia signifies the wearer bears the rank of a Lieutenant."
+ icon_state = "solgovcsoft"
+ item_color = "solgovc"
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index 25cdc259f92..59081cf3d00 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -5,7 +5,7 @@
item_state = "balaclava"
flags = BLOCKHAIR
flags_inv = HIDEFACE
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/adjust)
adjusted_flags = SLOT_HEAD
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
@@ -27,7 +27,7 @@
item_state = "luchag"
flags = BLOCKHAIR
flags_inv = HIDEFACE
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
@@ -47,4 +47,4 @@
name = "Rudos Mask"
desc = "Worn by robust fighters who are willing to do anything to win."
icon_state = "luchar"
- item_state = "luchar"
\ No newline at end of file
+ item_state = "luchar"
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 295ec84c4af..851c10db354 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -3,8 +3,9 @@
name = "breath mask"
icon_state = "breath"
item_state = "breath"
- flags = MASKCOVERSMOUTH | AIRTIGHT
- w_class = 2
+ flags = AIRTIGHT
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.10
permeability_coefficient = 0.50
actions_types = list(/datum/action/item_action/adjust)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index e539b2cae77..908397f990e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -2,20 +2,22 @@
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply."
icon_state = "gas_alt"
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
+ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
- w_class = 3
+ flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES
+ w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
burn_state = FIRE_PROOF
- species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
+ species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
- "Drask" = 'icons/mob/species/drask/mask.dmi'
+ "Drask" = 'icons/mob/species/drask/mask.dmi',
+ "Grey" = 'icons/mob/species/grey/mask.dmi'
)
// **** Welding gas mask ****
@@ -38,7 +40,7 @@
/obj/item/clothing/mask/gas/welding/proc/toggle()
if(up)
up = !src.up
- flags |= (MASKCOVERSEYES)
+ flags_cover |= (MASKCOVERSEYES)
flags_inv |= (HIDEEYES)
icon_state = initial(icon_state)
to_chat(usr, "You flip the [src] down to protect your eyes.")
@@ -46,13 +48,15 @@
tint = 2
else
up = !up
- flags &= ~(MASKCOVERSEYES)
+ flags_cover &= ~(MASKCOVERSEYES)
flags_inv &= ~(HIDEEYES)
icon_state = "[initial(icon_state)]up"
to_chat(usr, "You push the [src] up out of your face.")
flash_protect = 0
tint = 0
- usr.update_inv_wear_mask() //so our mob-overlays update
+ var/mob/living/carbon/user = usr
+ user.update_tint()
+ user.update_inv_wear_mask() //so our mob-overlays update
for(var/X in actions)
var/datum/action/A = X
@@ -63,9 +67,10 @@
name = "bane mask"
desc = "Only when the station is in flames, do you have my permission to robust."
icon_state = "bane_mask"
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
+ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
- w_class = 3
+ flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES
+ w_class = WEIGHT_CLASS_NORMAL
item_state = "bane_mask"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -95,7 +100,7 @@
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
icon_state = "clown"
item_state = "clown_hat"
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
+ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
burn_state = FLAMMABLE
/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
@@ -119,7 +124,7 @@
desc = "Some pranksters are truly magical."
icon_state = "wizzclown"
item_state = "wizzclown"
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
+ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
/obj/item/clothing/mask/gas/virusclown_hat
name = "clown wig and mask"
@@ -170,19 +175,18 @@
name = "owl mask"
desc = "Twoooo!"
icon_state = "owl"
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
burn_state = FLAMMABLE
actions_types = list(/datum/action/item_action/hoot)
/obj/item/clothing/mask/gas/owl_mask/super_hero
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP
+ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP
/obj/item/clothing/mask/gas/owl_mask/attack_self()
hoot()
/obj/item/clothing/mask/gas/owl_mask/proc/hoot()
if(cooldown < world.time - 35) // A cooldown, to stop people being jerks
- playsound(src.loc, "sound/misc/hoot.ogg", 50, 1)
+ playsound(src.loc, 'sound/misc/hoot.ogg', 50, 1)
cooldown = world.time
// ********************************************************************
@@ -379,26 +383,26 @@
if(istype(W, /obj/item/weapon/screwdriver))
switch(aggressiveness)
if(1)
- to_chat(user, "\blue You set the aggressiveness restrictor to the second position.")
+ to_chat(user, "You set the aggressiveness restrictor to the second position. ")
aggressiveness = 2
phrase = 7
if(2)
- to_chat(user, "\blue You set the aggressiveness restrictor to the third position.")
+ to_chat(user, "You set the aggressiveness restrictor to the third position. ")
aggressiveness = 3
phrase = 13
if(3)
- to_chat(user, "\blue You set the aggressiveness restrictor to the fourth position.")
+ to_chat(user, "You set the aggressiveness restrictor to the fourth position. ")
aggressiveness = 4
phrase = 1
if(4)
- to_chat(user, "\blue You set the aggressiveness restrictor to the first position.")
+ to_chat(user, "You set the aggressiveness restrictor to the first position. ")
aggressiveness = 1
phrase = 1
if(5)
- to_chat(user, "\red You adjust the restrictor but nothing happens, probably because its broken.")
+ to_chat(user, "You adjust the restrictor but nothing happens, probably because its broken. ")
else if(istype(W, /obj/item/weapon/wirecutters))
if(aggressiveness != 5)
- to_chat(user, "\red You broke it!")
+ to_chat(user, "You broke it! ")
aggressiveness = 5
else
..()
@@ -490,4 +494,3 @@
// ********************************************************************
-
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index ee0c5ec0fb7..d524d87e3d8 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -3,8 +3,8 @@
desc = "To stop that awful noise."
icon_state = "muzzle"
item_state = "muzzle"
- flags = MASKCOVERSMOUTH
- w_class = 2
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
put_on_delay = 20
var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove
@@ -24,14 +24,14 @@
name = "gag"
desc = "Stick this in their mouth to stop the noise."
icon_state = "gag"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
/obj/item/clothing/mask/muzzle/tapegag
name = "tape gag"
desc = "MHPMHHH!"
icon_state = "tapegag"
item_state = null
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
resist_time = 150
mute = 0
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
@@ -59,8 +59,8 @@
desc = "A sterile mask designed to help prevent the spread of diseases."
icon_state = "sterile"
item_state = "sterile"
- w_class = 1
- flags = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_TINY
+ flags_cover = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
@@ -108,8 +108,8 @@
desc = "A blue neck scarf."
icon_state = "blueneckscarf"
item_state = "blueneckscarf"
- flags = MASKCOVERSMOUTH
- w_class = 2
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
/obj/item/clothing/mask/redscarf
@@ -117,8 +117,8 @@
desc = "A red and white checkered neck scarf."
icon_state = "redwhite_scarf"
item_state = "redwhite_scarf"
- flags = MASKCOVERSMOUTH
- w_class = 2
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
/obj/item/clothing/mask/greenscarf
@@ -126,8 +126,8 @@
desc = "A green neck scarf."
icon_state = "green_scarf"
item_state = "green_scarf"
- flags = MASKCOVERSMOUTH
- w_class = 2
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
/obj/item/clothing/mask/ninjascarf
@@ -135,8 +135,8 @@
desc = "A stealthy, dark scarf."
icon_state = "ninja_scarf"
item_state = "ninja_scarf"
- flags = MASKCOVERSMOUTH
- w_class = 2
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
@@ -147,7 +147,7 @@
item_state = "pig"
flags = BLOCKHAIR
flags_inv = HIDEFACE
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/clothing/mask/horsehead
@@ -157,7 +157,7 @@
item_state = "horsehead"
flags = BLOCKHAIR
flags_inv = HIDEFACE
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/voicechange = 0
var/temporaryname = " the Horse"
var/originalname = ""
@@ -190,8 +190,8 @@
user.real_name = originalname
/obj/item/clothing/mask/face
- flags = MASKCOVERSMOUTH
flags_inv = HIDEFACE
+ flags_cover = MASKCOVERSMOUTH
/obj/item/clothing/mask/face/rat
name = "rat mask"
@@ -247,7 +247,7 @@
icon_state = "fawkes"
item_state = "fawkes"
flags_inv = HIDEFACE
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/clothing/mask/gas/clown_hat/pennywise
name = "Pennywise Mask"
@@ -255,15 +255,15 @@
icon_state = "pennywise_mask"
item_state = "pennywise_mask"
species_fit = list("Vox")
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
+ flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
// Bandanas
/obj/item/clothing/mask/bandana
name = "bandana"
desc = "A colorful bandana."
- flags = MASKCOVERSMOUTH
flags_inv = HIDEFACE
- w_class = 1
+ flags_cover = MASKCOVERSMOUTH
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_MASK
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
@@ -340,7 +340,8 @@
icon_override = 'icons/goonstation/mob/clothing/mask.dmi'
lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
- flags = NODROP
+ flags = NODROP | AIRTIGHT
+ flags_cover = MASKCOVERSMOUTH
/obj/item/clothing/mask/cursedclown/equipped(mob/user, slot)
..()
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 702c47d13ed..7a651881699 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -103,6 +103,16 @@
can_cut_open = 1
icon_state = "workboots"
+/obj/item/clothing/shoes/winterboots
+ name = "winter boots"
+ desc = "Boots lined with 'synthetic' animal fur."
+ can_cut_open = 1
+ icon_state = "winterboots"
+ cold_protection = FEET|LEGS
+ min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
+ heat_protection = FEET|LEGS
+ max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+
/obj/item/clothing/shoes/cult
name = "boots"
desc = "A pair of boots worn by the followers of Nar-Sie."
@@ -157,8 +167,6 @@
icon_state = "griffinboots"
item_state = "griffinboots"
-/obj/item/clothing/shoes/griffin/super_hero
- flags = NODROP
/obj/item/clothing/shoes/fluff/noble_boot
name = "noble boots"
@@ -167,27 +175,15 @@
item_color = "noble_boot"
item_state = "noble_boot"
-
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/shoe_silencer))
- silence_steps = 1
- shoe_sound = null
- user.unEquip(I)
- qdel(I)
- else . = ..()
-
-/obj/item/shoe_silencer
- name = "shoe rags"
- desc = "Looks sneaky."
- icon_state = "sheet-cloth"
-
-/datum/crafting_recipe/shoe_rags
- name = "Shoe Rags"
- result = /obj/item/shoe_silencer
- reqs = list(/obj/item/stack/tape_roll = 10)
- tools = list(/obj/item/weapon/wirecutters)
- time = 40
- category = CAT_MISC
+ if(istype(I, /obj/item/stack/tape_roll))
+ var/obj/item/stack/tape_roll/TR = I
+ if((!silence_steps || shoe_sound) && TR.use(4))
+ silence_steps = 1
+ shoe_sound = null
+ to_chat(user, "You tape the soles of [src] to silence their footsteps.")
+ else
+ return ..()
/obj/item/clothing/shoes/sandal/white
name = "White Sandals"
@@ -224,3 +220,27 @@
desc = "These boots were made for dancing."
icon_state = "bsing"
put_on_delay = 50
+
+/obj/item/clothing/shoes/cowboyboots
+ name = "cowboy boots"
+ desc = "A pair a' brown boots."
+ icon_state = "cowboyboots"
+ item_color = "cowboyboots"
+
+/obj/item/clothing/shoes/cowboyboots/black
+ name = "black cowboy boots"
+ desc = "A pair a' black rustlers' boots"
+ icon_state = "cowboyboots_black"
+ item_color = "cowboyboots_black"
+
+/obj/item/clothing/shoes/cowboyboots/white
+ name = "white cowboy boots"
+ desc = "For the rancher in us all."
+ icon_state = "cowboyboots_white"
+ item_color = "cowboyboots_white"
+
+/obj/item/clothing/shoes/cowboyboots/pink
+ name = "pink cowgirl boots"
+ desc = "For a Rustlin' tustlin' cowgirl."
+ icon_state = "cowboyboots_pink"
+ item_color = "cowboyboots_pink"
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index f8a18749644..69ecd6eca0e 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -31,17 +31,25 @@
//Unathi space gear. Huge and restrictive.
/obj/item/clothing/head/helmet/space/unathi
+ icon = 'icons/obj/clothing/species/unathi/hats.dmi'
species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi'
+ )
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
name = "NT breacher helmet"
- desc = "Hey! Watch it with that thing! It's a knock-off of a Unathi battle-helm, and that spike could put someone's eye out."
+ desc = "Hey! Watch it with that thing! It's a knock-off of an Unathi battle-helm, and that spike could put someone's eye out."
icon_state = "unathi_helm_cheap"
item_state = "unathi_helm_cheap"
item_color = "unathi_helm_cheap"
/obj/item/clothing/suit/space/unathi
+ icon = 'icons/obj/clothing/species/unathi/suits.dmi'
species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi'
+ )
/obj/item/clothing/suit/space/unathi/rig_cheap
name = "NT breacher chassis"
@@ -66,11 +74,12 @@
// Vox space gear (vaccuum suit, low pressure armour)
// Can't be equipped by any other species due to bone structure and vox cybernetics.
/obj/item/clothing/suit/space/vox
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
+ icon = 'icons/obj/clothing/species/vox/suits.dmi'
species_restricted = list("Vox", "Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
@@ -79,7 +88,9 @@
/obj/item/clothing/head/helmet/space/vox
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
- flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
+ flags = STOPSPRESSUREDMAGE
+ flags_cover = HEADCOVERSEYES
+ icon = 'icons/obj/clothing/species/vox/hats.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
@@ -137,6 +148,7 @@
/obj/item/clothing/under/vox
has_sensor = 0
+ icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
species_restricted = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
@@ -150,12 +162,17 @@
item_state = "vox-casual-1"
body_parts_covered = LEGS
-/obj/item/clothing/under/vox/vox_robes
+/obj/item/clothing/under/vox/vox_robes //This will be invisible on Armalis for lack of a proper sprite. They wear a carapace suit anyway, and this is more just to let them use IDs and such.
name = "alien robes"
desc = "Weird and flowing!"
icon_state = "vox-casual-2"
item_color = "vox-casual-2"
item_state = "vox-casual-2"
+ species_restricted = list("Vox","Vox Armalis")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/uniform.dmi',
+ "Vox Armalis" = 'icons/mob/species/armalis/suit.dmi'
+ )
/obj/item/clothing/gloves/color/yellow/vox
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
@@ -165,20 +182,22 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
item_color = "gloves-vox"
+ icon = 'icons/obj/clothing/species/vox/gloves.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/gloves.dmi',
)
-/obj/item/clothing/shoes/magboots/vox
+/obj/item/clothing/shoes/magboots/vox
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
name = "vox magclaws"
item_state = "boots-vox"
icon_state = "boots-vox"
-
+ icon = 'icons/obj/clothing/species/vox/shoes.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/feet.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/feet.dmi'
)
@@ -217,24 +236,3 @@
..(user)
if(magpulse)
to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped.
-
-
-/obj/item/clothing/suit/space/eva/vox
- name = "Vox EVA Suit"
- icon_state = "voxspace"
- item_state = "voxspace"
- species_restricted = list("Vox", "Vox Armalis")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi',
- "Vox Armalis" = 'icons/mob/species/armalis/suit.dmi',
- )
-
-/obj/item/clothing/head/helmet/space/eva/vox
- name = "Vox EVA Suit"
- icon_state = "voxspace"
- item_state = "voxspace"
- species_restricted = list("Vox","Vox Armalis")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi',
- "Vox Armalis" = 'icons/mob/species/armalis/head.dmi',
- )
diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm
index 7c74f77b054..f9801496f32 100644
--- a/code/modules/clothing/spacesuits/breaches.dm
+++ b/code/modules/clothing/spacesuits/breaches.dm
@@ -92,7 +92,7 @@ var/global/list/breach_burn_descriptors = list(
if(!breaches)
breaches = list()
- if(damage > 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really.
+ if(damage >= 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really.
if(!loc) return
var/turf/T = get_turf(src)
@@ -125,7 +125,7 @@ var/global/list/breach_burn_descriptors = list(
var/datum/breach/B = new()
breaches += B
- B.class = min(amount,5)
+ B.class = min(amount,(5 - max(damage - 20,0))) //We cap the check at 25, this line could overshoot without the calculation if it gets enough dammage in one shot.
B.damtype = damtype
B.update_descriptor()
@@ -175,10 +175,10 @@ var/global/list/breach_burn_descriptors = list(
//Handles repairs (and also upgrades).
/obj/item/clothing/suit/space/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/stack/sheet/mineral/plastic) || istype(W,/obj/item/stack/sheet/metal))
+ if(istype(W,/obj/item/stack/sheet/plastic) || istype(W,/obj/item/stack/sheet/metal))
if(istype(src.loc,/mob/living))
- to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?")
+ to_chat(user, "How do you intend to patch a hardsuit while someone is wearing it? ")
return
if(!damage || !burn_damage)
@@ -188,16 +188,16 @@ var/global/list/breach_burn_descriptors = list(
var/obj/item/stack/sheet/P = W
if(P.amount < 3)
P.use(P.amount)
- repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/mineral/plastic) ? P.amount : (P.amount*2) ), user)
+ repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/plastic) ? P.amount : (P.amount*2) ), user)
else
P.use(3)
- repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/mineral/plastic) ? 3 : 5), user)
+ repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/plastic) ? 3 : 5), user)
return
else if(istype(W, /obj/item/weapon/weldingtool))
if(istype(src.loc,/mob/living))
- to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?")
+ to_chat(user, "How do you intend to patch a hardsuit while someone is wearing it? ")
return
if(!damage || ! brute_damage)
@@ -206,7 +206,7 @@ var/global/list/breach_burn_descriptors = list(
var/obj/item/weapon/weldingtool/WT = W
if(!WT.remove_fuel(5))
- to_chat(user, "\red You need more welding fuel to repair this suit.")
+ to_chat(user, "You need more welding fuel to repair this suit. ")
return
repair_breaches(BRUTE, 3, user)
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index d5c4d5626bb..80257cda101 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -1,34 +1,35 @@
-/obj/item/clothing/head/helmet/space/rig/ert
+/obj/item/clothing/head/helmet/space/hardsuit/ert
name = "emergency response team helmet"
desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready."
- icon_state = "rig0-ert_commander"
+ icon_state = "hardsuit0-ert_commander"
item_state = "helm-command"
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
- rig_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
+ hardsuit_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
var/obj/machinery/camera/camera
+ var/has_camera = TRUE
strip_delay = 130
-/obj/item/clothing/head/helmet/space/rig/ert/attack_self(mob/user)
- if(camera)
+/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user)
+ if(camera || !has_camera)
..(user)
else
camera = new /obj/machinery/camera(src)
camera.network = list("ERT")
cameranet.removeCamera(camera)
camera.c_tag = user.name
- to_chat(user, "\blue User scanned as [camera.c_tag]. Camera activated.")
+ to_chat(user, "User scanned as [camera.c_tag]. Camera activated. ")
-/obj/item/clothing/head/helmet/space/rig/ert/examine(mob/user)
- if(..(user, 1))
+/obj/item/clothing/head/helmet/space/hardsuit/ert/examine(mob/user)
+ if(..(user, 1) && has_camera)
to_chat(user, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.")
-/obj/item/clothing/suit/space/rig/ert
+/obj/item/clothing/suit/space/hardsuit/ert
name = "emergency response team suit"
desc = "A suit worn by members of the Nanotrasen Emergency Response Team. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
@@ -38,86 +39,110 @@
strip_delay = 130
//Commander
-/obj/item/clothing/head/helmet/space/rig/ert/commander
+/obj/item/clothing/head/helmet/space/hardsuit/ert/commander
name = "emergency response team commander helmet"
desc = "A helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured and space ready."
- icon_state = "rig0-ert_commander"
+ icon_state = "hardsuit0-ert_commander"
item_state = "helm-command"
item_color = "ert_commander"
-/obj/item/clothing/suit/space/rig/ert/commander
+/obj/item/clothing/suit/space/hardsuit/ert/commander
name = "emergency response team commander suit"
desc = "A suit worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
//Security
-/obj/item/clothing/head/helmet/space/rig/ert/security
+/obj/item/clothing/head/helmet/space/hardsuit/ert/security
name = "emergency response team security helmet"
desc = "A helmet worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured and space ready."
- icon_state = "rig0-ert_security"
+ icon_state = "hardsuit0-ert_security"
item_state = "syndicate-helm-black-red"
item_color = "ert_security"
-/obj/item/clothing/suit/space/rig/ert/security
+/obj/item/clothing/suit/space/hardsuit/ert/security
name = "emergency response team security suit"
desc = "A suit worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_security"
item_state = "syndicate-black-red"
//Engineer
-/obj/item/clothing/head/helmet/space/rig/ert/engineer
+/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer
name = "emergency response team engineer helmet"
desc = "A helmet worn by engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured and space ready."
- icon_state = "rig0-ert_engineer"
+ icon_state = "hardsuit0-ert_engineer"
+ item_state = "helm-orange"
item_color = "ert_engineer"
-/obj/item/clothing/suit/space/rig/ert/engineer
+/obj/item/clothing/suit/space/hardsuit/ert/engineer
name = "emergency response team engineer suit"
desc = "A suit worn by the engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_engineer"
+ item_state = "suit-orange"
//Medical
-/obj/item/clothing/head/helmet/space/rig/ert/medical
+/obj/item/clothing/head/helmet/space/hardsuit/ert/medical
name = "emergency response team medical helmet"
desc = "A helmet worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready."
- icon_state = "rig0-ert_medical"
+ icon_state = "hardsuit0-ert_medical"
item_color = "ert_medical"
-/obj/item/clothing/suit/space/rig/ert/medical
+/obj/item/clothing/suit/space/hardsuit/ert/medical
name = "emergency response team medical suit"
desc = "A suit worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready."
icon_state = "ert_medical"
//Janitor
-/obj/item/clothing/head/helmet/space/rig/ert/janitor
+/obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
name = "emergency response team janitor helmet"
desc = "A helmet worn by janitorial members of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured and space ready."
- icon_state = "rig0-ert_janitor"
+ icon_state = "hardsuit0-ert_janitor"
item_color = "ert_janitor"
-/obj/item/clothing/suit/space/rig/ert/janitor
+/obj/item/clothing/suit/space/hardsuit/ert/janitor
name = "emergency response team janitor suit"
desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_janitor"
-/obj/item/clothing/head/helmet/space/rig/ert/paranormal
+//Paranormal
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
name = "paranormal response unit helmet"
desc = "A helmet worn by those who deal with paranormal threats for a living."
- icon_state = "rig0-ert_paranormal"
+ icon_state = "hardsuit0-ert_paranormal"
item_color = "ert_paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
sprite_sheets = null
+ actions_types = list()
+ has_camera = 0
-/obj/item/clothing/suit/space/rig/ert/paranormal
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal
name = "paranormal response team suit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
- icon_state = "knight_grey"
- item_state = "knight_grey"
+ icon_state = "hardsuit-paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
+ actions_types = list()
-
-/obj/item/clothing/suit/space/rig/ert/paranormal/New()
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/New()
..()
new /obj/item/weapon/nullrod(src)
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor
+ name = "inquisitor's helmet"
+ icon_state = "hardsuit0-inquisitor"
+ item_color = "inquisitor"
+
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+ name = "inquisitor's hardsuit"
+ icon_state = "hardsuit-inquisitor"
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker
+ name = "champion's helmet"
+ desc = "Peering into the eyes of the helmet is enough to seal damnation."
+ icon_state = "hardsuit0-berserker"
+ item_color = "berserker"
+
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker
+ name = "champion's hardsuit"
+ desc = "Voices echo from the hardsuit, driving the user insane."
+ icon_state = "hardsuit-berserker"
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/hardsuit.dm
similarity index 80%
rename from code/modules/clothing/spacesuits/rig.dm
rename to code/modules/clothing/spacesuits/hardsuit.dm
index 1c8bd73c47f..802f39ad361 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -1,15 +1,15 @@
-//Regular rig suits
-/obj/item/clothing/head/helmet/space/rig
+//Baseline hardsuits
+/obj/item/clothing/head/helmet/space/hardsuit
name = "hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
- icon_state = "rig0-engineering"
+ icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- rig_restrict_helmet = 1
+ hardsuit_restrict_helmet = 1
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight)
var/brightness_on = 4 //luminosity when on
var/on = 0
- item_color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite)
+ item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
actions_types = list(/datum/action/item_action/toggle_helmet_light)
//Species-specific stuff.
@@ -30,18 +30,18 @@
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi',
)
-/obj/item/clothing/head/helmet/space/rig/equip_to_best_slot(mob/M)
- if(rig_restrict_helmet)
- to_chat(M, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit) ") // Stop RIG helmet equipping
+/obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M)
+ if(hardsuit_restrict_helmet)
+ to_chat(M, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit) ") // Stop hardsuit helmet equipping
return 0
..()
-/obj/item/clothing/head/helmet/space/rig/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user)
toggle_light(user)
-/obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/proc/toggle_light(mob/user)
on = !on
- icon_state = "rig[on]-[item_color]"
+ icon_state = "hardsuit[on]-[item_color]"
if(on)
set_light(brightness_on)
@@ -56,14 +56,14 @@
var/datum/action/A = X
A.UpdateButtonIcon()
-/obj/item/clothing/head/helmet/space/rig/item_action_slot_check(slot)
+/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot)
if(slot == slot_head)
return 1
-/obj/item/clothing/suit/space/rig
+/obj/item/clothing/suit/space/hardsuit
name = "hardsuit"
desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit."
- icon_state = "rig-engineering"
+ icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
@@ -103,7 +103,7 @@
var/list/mounted_devices = null // Holder for the above device.
var/obj/item/active_device = null // Currently deployed device, if any.
-/obj/item/clothing/suit/space/rig/equipped(mob/M)
+/obj/item/clothing/suit/space/hardsuit/equipped(mob/M)
..()
var/mob/living/carbon/human/H = M
@@ -133,7 +133,7 @@
H.equip_to_slot(boots, slot_shoes)
boots.flags |= NODROP
-/obj/item/clothing/suit/space/rig/dropped()
+/obj/item/clothing/suit/space/hardsuit/dropped()
..()
var/mob/living/carbon/human/H
@@ -154,7 +154,7 @@
H.unEquip(boots)
boots.forceMove(src)
-/obj/item/clothing/suit/space/rig/verb/toggle_helmet()
+/obj/item/clothing/suit/space/hardsuit/verb/toggle_helmet()
set name = "Toggle Helmet"
set category = "Object"
set src in usr
@@ -189,7 +189,7 @@
to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world. ")
H.update_inv_head()
-/obj/item/clothing/suit/space/rig/attackby(obj/item/W, mob/user, params)
+/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/W, mob/user, params)
if(!isliving(user))
return
@@ -238,43 +238,43 @@
return ..()
..()
-
-/obj/item/clothing/suit/space/rig/proc/can_modify(mob/living/user)
+
+/obj/item/clothing/suit/space/hardsuit/proc/can_modify(mob/living/user)
if(isliving(loc))
to_chat(user, "You can not modify the hardsuit while it is being worn. ")
return 0
-
+
return 1
-//Engineering rig
-/obj/item/clothing/head/helmet/space/rig/engineering
+//Engineering hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/engineering
name = "engineering hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
- icon_state = "rig0-engineering"
+ icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
-/obj/item/clothing/suit/space/rig/engineering
+/obj/item/clothing/suit/space/hardsuit/engineering
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
- icon_state = "rig-engineering"
+ icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
-//Chief Engineer's rig
-/obj/item/clothing/head/helmet/space/rig/elite
+//Chief Engineer's hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/elite
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
- icon_state = "rig0-white"
+ icon_state = "hardsuit0-white"
item_state = "ce_helm"
item_color = "white"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-/obj/item/clothing/suit/space/rig/elite
- icon_state = "rig-white"
+/obj/item/clothing/suit/space/hardsuit/elite
+ icon_state = "hardsuit-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
@@ -282,18 +282,17 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
-//Mining rig
-/obj/item/clothing/head/helmet/space/rig/mining
+//Mining hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/mining
name = "mining hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating."
- icon_state = "rig0-mining"
+ icon_state = "hardsuit0-mining"
item_state = "mining_helm"
item_color = "mining"
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
-/obj/item/clothing/suit/space/rig/mining
- icon_state = "rig-mining"
+/obj/item/clothing/suit/space/hardsuit/mining
+ icon_state = "hardsuit-mining"
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
@@ -301,39 +300,43 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
-//Syndicate rig
-/obj/item/clothing/head/helmet/space/rig/syndi
+//Syndicate hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/syndi
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "rig1-syndi"
+ alt_desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 1
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
+ flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
+ visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE
-/obj/item/clothing/head/helmet/space/rig/syndi/update_icon()
- icon_state = "rig[on]-[item_color]"
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
+ icon_state = "hardsuit[on]-[item_color]"
-/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
on = !on
if(on)
to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor. ")
- name = "blood-red hardsuit helmet"
- desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
- cold_protection = HEAD
+ name = initial(name)
+ desc = initial(desc)
set_light(brightness_on)
+ flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
+ flags_cover |= HEADCOVERSEYES | HEADCOVERSMOUTH
+ flags_inv |= visor_flags_inv
+ cold_protection |= HEAD
else
to_chat(user, "You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight. ")
name = "blood-red hardsuit helmet (combat)"
- desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
- flags = BLOCKHAIR | THICKMATERIAL | NODROP
- flags_inv = HIDEEARS
- cold_protection = null
+ desc = alt_desc
set_light(0)
+ flags = BLOCKHAIR | THICKMATERIAL | NODROP
+ flags_cover &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
+ flags_inv &= ~visor_flags_inv
+ cold_protection &= ~HEAD
update_icon()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
@@ -343,22 +346,22 @@
var/datum/action/A = X
A.UpdateButtonIcon()
-/obj/item/clothing/suit/space/rig/syndi
+/obj/item/clothing/suit/space/hardsuit/syndi
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/on = 1
actions_types = list(/datum/action/item_action/toggle_hardsuit_mode)
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
-/obj/item/clothing/suit/space/rig/syndi/update_icon()
- icon_state = "rig[on]-[item_color]"
+/obj/item/clothing/suit/space/hardsuit/syndi/update_icon()
+ icon_state = "hardsuit[on]-[item_color]"
-/obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user)
+/obj/item/clothing/suit/space/hardsuit/syndi/attack_self(mob/user)
on = !on
if(on)
to_chat(user, "You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor. ")
@@ -387,17 +390,17 @@
A.UpdateButtonIcon()
//Elite Syndie suit
-/obj/item/clothing/head/helmet/space/rig/syndi/elite
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit helmet"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "rig0-syndielite"
+ icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
-/obj/item/clothing/head/helmet/space/rig/syndi/elite/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/attack_self(mob/user)
..()
if(on)
name = "elite syndicate hardsuit helmet"
@@ -406,17 +409,17 @@
name = "elite syndicate hardsuit helmet (combat)"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
-/obj/item/clothing/suit/space/rig/syndi/elite
+/obj/item/clothing/suit/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode."
- icon_state = "rig0-syndielite"
+ icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/syndi/elite/attack_self(mob/user)
+/obj/item/clothing/suit/space/hardsuit/syndi/elite/attack_self(mob/user)
..()
if(on)
name = "elite syndicate hardsuit"
@@ -425,11 +428,11 @@
name = "elite syndicate hardsuit (combat)"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
-//Wizard Rig
-/obj/item/clothing/head/helmet/space/rig/wizard
+//Wizard hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/wizard
name = "gem-encrusted hardsuit helmet"
desc = "A bizarre gem-encrusted helmet that radiates magical energies."
- icon_state = "rig0-wiz"
+ icon_state = "hardsuit0-wiz"
item_state = "wiz_helm"
item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
@@ -439,12 +442,12 @@
unacidable = 1
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/wizard
- icon_state = "rig-wiz"
+/obj/item/clothing/suit/space/hardsuit/wizard
+ icon_state = "hardsuit-wiz"
name = "gem-encrusted hardsuit"
desc = "A bizarre gem-encrusted suit that radiates magical energies."
item_state = "wiz_hardsuit"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
unacidable = 1
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank)
@@ -453,11 +456,11 @@
unacidable = 1
sprite_sheets = null
-//Medical Rig
-/obj/item/clothing/head/helmet/space/rig/medical
+//Medical hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/medical
name = "medical hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort, but does not protect the eyes from intense light."
- icon_state = "rig0-medical"
+ icon_state = "hardsuit0-medical"
item_state = "medical_helm"
item_color = "medical"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
@@ -465,8 +468,8 @@
flash_protect = 0
scan_reagents = 1 //Generally worn by the CMO, so they'd get utility off of seeing reagents
-/obj/item/clothing/suit/space/rig/medical
- icon_state = "rig-medical"
+/obj/item/clothing/suit/space/hardsuit/medical
+ icon_state = "hardsuit-medical"
name = "medical hardsuit"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
@@ -474,16 +477,16 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
-/obj/item/clothing/head/helmet/space/rig/security
+/obj/item/clothing/head/helmet/space/hardsuit/security
name = "security hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
- icon_state = "rig0-sec"
+ icon_state = "hardsuit0-sec"
item_state = "sec_helm"
item_color = "sec"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
-/obj/item/clothing/suit/space/rig/security
- icon_state = "rig-sec"
+/obj/item/clothing/suit/space/hardsuit/security
+ icon_state = "hardsuit-sec"
name = "security hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
@@ -491,20 +494,20 @@
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
-//Atmospherics Rig (BS12)
-/obj/item/clothing/head/helmet/space/rig/atmos
+//Atmospherics hardsuit (BS12)
+/obj/item/clothing/head/helmet/space/hardsuit/atmos
desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
name = "atmospherics hardsuit helmet"
- icon_state = "rig0-atmos"
+ icon_state = "hardsuit0-atmos"
item_state = "atmos_helm"
item_color = "atmos"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-/obj/item/clothing/suit/space/rig/atmos
+/obj/item/clothing/suit/space/hardsuit/atmos
desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
- icon_state = "rig-atmos"
+ icon_state = "hardsuit-atmos"
name = "atmos hardsuit"
item_state = "atmos_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
@@ -512,16 +515,16 @@
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
//Singuloth armor
-/obj/item/clothing/head/helmet/space/rig/singuloth
+/obj/item/clothing/head/helmet/space/hardsuit/singuloth
name = "singuloth knight's helmet"
desc = "This is an adamantium helmet from the chapter of the Singuloth Knights. It shines with a holy aura."
- icon_state = "rig0-singuloth"
+ icon_state = "hardsuit0-singuloth"
item_state = "singuloth_helm"
item_color = "singuloth"
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
-/obj/item/clothing/suit/space/rig/singuloth
- icon_state = "rig-singuloth"
+/obj/item/clothing/suit/space/hardsuit/singuloth
+ icon_state = "hardsuit-singuloth"
name = "singuloth knight's armor"
desc = "This is a ceremonial armor from the chapter of the Singuloth Knights. It's made of pure forged adamantium."
item_state = "singuloth_hardsuit"
@@ -529,17 +532,17 @@
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
-/obj/item/clothing/head/helmet/space/rig/security/hos
+/obj/item/clothing/head/helmet/space/hardsuit/security/hos
name = "head of security's hardsuit helmet"
desc = "a special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
- icon_state = "rig0-hos"
+ icon_state = "hardsuit0-hos"
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/security/hos
- icon_state = "rig-hos"
+/obj/item/clothing/suit/space/hardsuit/security/hos
+ icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
@@ -548,10 +551,10 @@
/////////////SHIELDED//////////////////////////////////
-/obj/item/clothing/suit/space/rig/shielded
+/obj/item/clothing/suit/space/hardsuit/shielded
name = "shielded hardsuit"
desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
- icon_state = "rig-hos"
+ icon_state = "hardsuit-hos"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
var/current_charges = 3
@@ -563,7 +566,7 @@
var/shield_on = "shield-old"
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
+/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
if(current_charges > 0)
var/datum/effect/system/spark_spread/s = new
s.set_up(2, 1, src)
@@ -580,11 +583,11 @@
return 0
-/obj/item/clothing/suit/space/rig/shielded/Destroy()
+/obj/item/clothing/suit/space/hardsuit/shielded/Destroy()
processing_objects.Remove(src)
return ..()
-/obj/item/clothing/suit/space/rig/shielded/process()
+/obj/item/clothing/suit/space/hardsuit/shielded/process()
if(world.time > recharge_cooldown && current_charges < max_charges)
current_charges = Clamp((current_charges + recharge_rate), 0, max_charges)
playsound(loc, 'sound/magic/Charge.ogg', 50, 1)
@@ -598,10 +601,10 @@
//////Syndicate Version
-/obj/item/clothing/suit/space/rig/shielded/syndi
+/obj/item/clothing/suit/space/hardsuit/shielded/syndi
name = "blood-red hardsuit"
desc = "An advanced hardsuit with built in energy shielding."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
@@ -616,10 +619,10 @@
"Drask" = 'icons/mob/species/drask/suit.dmi'
)
-/obj/item/clothing/head/helmet/space/rig/shielded/syndi
+/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
name = "blood-red hardsuit helmet"
desc = "An advanced hardsuit helmet with built in energy shielding."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
\ No newline at end of file
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 4d7e1011686..20d9809f2b2 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -10,10 +10,10 @@
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/helmet.dmi',
- "Drask" = 'icons/mob/species/drask/helmet.dmi'
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
)
-/obj/item/clothing/head/helmet/space/capspace/equipped(var/mob/living/carbon/human/user, var/slot)
+
+/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == slot_head)
if(user.species.name == "Vox")
if(flags & BLOCKHAIR)
@@ -27,17 +27,15 @@
desc = "A bulky, heavy-duty piece of exclusive Nanotrasen armor. YOU are in charge!"
icon_state = "caparmor"
item_state = "capspacesuit"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
allowed = list(/obj/item/weapon/tank, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi',
- "Drask" = 'icons/mob/species/drask/suit.dmi'
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
)
-
//Deathsquad space suit, not hardsuits because no flashlight!
/obj/item/clothing/head/helmet/space/deathsquad
name = "deathsquad helmet"
@@ -78,6 +76,7 @@
desc = "An armored beret commonly used by special operations officers."
icon_state = "beret_officer"
armor = list(melee = 65, bullet = 55, laser = 35, energy = 20, bomb = 30, bio = 30, rad = 30)
+ flags = HEADCOVERSEYES | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL //idfk
/obj/item/clothing/suit/space/deathsquad/officer
name = "officer jacket"
@@ -87,14 +86,15 @@
blood_overlay_type = "coat"
flags_inv = 0
slowdown = 0
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
//Space santa outfit suit
/obj/item/clothing/head/helmet/space/santahat
name = "Santa's hat"
desc = "Ho ho ho. Merrry X-mas!"
icon_state = "santahat"
- flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
+ flags = BLOCKHAIR | STOPSPRESSUREDMAGE
+ flags_cover = HEADCOVERSEYES
/obj/item/clothing/suit/space/santa
name = "Santa's suit"
@@ -106,7 +106,6 @@
flags_size = ONESIZEFITSALL
allowed = list(/obj/item) //for stuffing exta special presents
-
//Space pirate outfit
/obj/item/clothing/head/helmet/space/pirate
name = "pirate hat"
@@ -114,7 +113,8 @@
icon_state = "pirate"
item_state = "pirate"
armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
- flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
+ flags = BLOCKHAIR | STOPSPRESSUREDMAGE
+ flags_cover = HEADCOVERSEYES
strip_delay = 40
put_on_delay = 20
@@ -123,7 +123,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -136,12 +136,26 @@
desc = "A paramedic EVA helmet. Used in the recovery of bodies from space."
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
+ )
+ sprite_sheets_obj = list(
+ "Vox" = 'icons/obj/clothing/species/vox/hats.dmi'
+ )
/obj/item/clothing/suit/space/eva/paramedic
name = "Paramedic EVA suit"
icon_state = "paramedic-eva"
item_state = "paramedic-eva"
desc = "A paramedic EVA suit. Used in the recovery of bodies from space."
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+ sprite_sheets_obj = list(
+ "Vox" = 'icons/obj/clothing/species/vox/suits.dmi'
+ )
/obj/item/clothing/suit/space/eva
name = "EVA suit"
@@ -149,6 +163,20 @@
item_state = "s_suit"
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
+ species_restricted = list("exclude", "Diona", "Wryn")
+ species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin")
+ sprite_sheets = list(
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi',
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi',
+ )
+ sprite_sheets_obj = list(
+ "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi',
+ "Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi',
+ "Vox" = 'icons/obj/clothing/species/vox/suits.dmi',
+ "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi'
+ )
/obj/item/clothing/head/helmet/space/eva
name = "EVA helmet"
@@ -158,21 +186,41 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
+ species_restricted = list("exclude", "Diona", "Wryn")
+ species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin")
+ sprite_sheets = list(
+ "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi',
+ "Vox" = 'icons/mob/species/vox/helmet.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
+ )
+ sprite_sheets_obj = list(
+ "Vox" = 'icons/obj/clothing/species/vox/hats.dmi',
+ "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi'
+ )
//Mime's Hardsuit
/obj/item/clothing/head/helmet/space/eva/mime
name = "mime eva helmet"
// icon = 'spaceciv.dmi'
- desc = "An eva helmet specifically designed for the mime."
+ desc = ". . ."
icon_state = "spacemimehelmet"
item_state = "spacemimehelmet"
+ species_restricted = list("exclude","Diona","Vox","Wryn")
+ species_fit = null
+ sprite_sheets = null
+ sprite_sheets_obj = null
/obj/item/clothing/suit/space/eva/mime
name = "mime eva suit"
// icon = 'spaceciv.dmi'
- desc = "An EVA suit specifically designed for the mime."
+ desc = ". . ."
icon_state = "spacemime_suit"
item_state = "spacemime_items"
+ species_restricted = list("exclude","Diona","Vox","Wryn")
+ species_fit = null
+ sprite_sheets = null
+ sprite_sheets_obj = null
/obj/item/clothing/head/helmet/space/eva/clown
name = "clown eva helmet"
@@ -180,6 +228,10 @@
desc = "An EVA helmet specifically designed for the clown. SPESSHONK!"
icon_state = "clownhelmet"
item_state = "clownhelmet"
+ species_restricted = list("exclude","Diona","Vox","Wryn")
+ species_fit = null
+ sprite_sheets = null
+ sprite_sheets_obj = null
/obj/item/clothing/suit/space/eva/clown
name = "clown eva suit"
@@ -187,6 +239,10 @@
desc = "An EVA suit specifically designed for the clown. SPESSHONK!"
icon_state = "spaceclown_suit"
item_state = "spaceclown_items"
+ species_restricted = list("exclude","Diona","Vox","Wryn")
+ species_fit = null
+ sprite_sheets = null
+ sprite_sheets_obj = null
/obj/item/clothing/head/helmet/space/freedom
name = "eagle helmet"
@@ -207,4 +263,4 @@
armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
- strip_delay = 130
\ No newline at end of file
+ strip_delay = 130
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index de2cfc0eda5..4e43aaf61b4 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -10,19 +10,19 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
+ icon = 'icons/obj/clothing/species/plasmaman/suits.dmi'
species_restricted = list("Plasmaman")
+ sprite_sheets = list(
+ "Plasmaman" = 'icons/mob/species/plasmaman/suit.dmi'
+ )
flags = STOPSPRESSUREDMAGE
-
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish = 0
var/extinguish_cooldown = 10 SECONDS
- var/extinguishes_left = 10 // Yeah yeah, reagents, blah blah blah. This should be simple.
-
-/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
- ..(user)
- to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit. ")
+ var/max_extinguishes = 5
+ var/extinguishes_left = 5 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
var/mob/living/carbon/human/H=user
@@ -32,15 +32,49 @@
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
- to_chat(H, "Your suit automatically extinguishes the fire. ")
+ to_chat(user, "You hear a soft click and a hiss from your suit as it automatically extinguishes the fire. ")
+ if(!extinguishes_left)
+ to_chat(user, "Onboard auto-extinguisher depleted, refill with a cartridge. ")
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
H.ExtinguishMob()
+/obj/item/clothing/suit/space/eva/plasmaman/attackby(var/obj/item/A as obj, mob/user as mob, params)
+ ..()
+ if(istype(A, /obj/item/weapon/plasmensuit_cartridge)) //This suit can only be reloaded by the appropriate cartridges, and only if it's got no more extinguishes left.
+ if(!extinguishes_left)
+ extinguishes_left = max_extinguishes //Full replenishment from the cartridge.
+ to_chat(user, "You replenish \the [src] with the cartridge. ")
+ qdel(A)
+ else
+ to_chat(user, "The suit must be depleted before it can be refilled. ")
+
+/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
+ ..(user)
+ to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit. ")
+
+/obj/item/weapon/plasmensuit_cartridge //Can be used to refill Plasmaman suits when they run out of autoextinguishes.
+ name = "auto-extinguisher cartridge"
+ desc = "A tiny and light fibreglass-framed auto-extinguisher cartridge."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "miniFE0"
+ item_state = "miniFE"
+ hitsound = null //Ultralight and
+ flags = null //non-conductive
+ force = 0
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL //Fits in boxes.
+ materials = list()
+ attack_verb = list("tapped")
+
/obj/item/clothing/head/helmet/space/eva/plasmaman
name = "plasmaman helmet"
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
flags = STOPSPRESSUREDMAGE
+ icon = 'icons/obj/clothing/species/plasmaman/hats.dmi'
species_restricted = list("Plasmaman")
-
+ sprite_sheets = list(
+ "Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi'
+ )
icon_state = "plasmaman_helmet0"
item_state = "plasmaman_helmet0"
var/base_state = "plasmaman_helmet"
@@ -69,27 +103,18 @@
A.UpdateButtonIcon()
// ENGINEERING
-/obj/item/clothing/suit/space/eva/plasmaman/assistant
- name = "plasmaman assistant suit"
- icon_state = "plasmamanAssistant_suit"
-
-/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- name = "plasmaman assistant helmet"
- icon_state = "plasmamanAssistant_helmet0"
- base_state = "plasmamanAssistant_helmet"
-
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric suit"
icon_state = "plasmamanAtmos_suit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric helmet"
icon_state = "plasmamanAtmos_helmet0"
base_state = "plasmamanAtmos_helmet"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/eva/plasmaman/engineer
name = "plasmaman engineer suit"
@@ -105,16 +130,25 @@
/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer suit"
icon_state = "plasmaman_CE"
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
+
/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer helmet"
icon_state = "plasmaman_CE_helmet0"
base_state = "plasmaman_CE_helmet"
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
//SERVICE
+/obj/item/clothing/suit/space/eva/plasmaman/assistant
+ name = "plasmaman assistant suit"
+ icon_state = "plasmamanAssistant_suit"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
+ name = "plasmaman assistant helmet"
+ icon_state = "plasmamanAssistant_helmet0"
+ base_state = "plasmamanAssistant_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/botanist
name = "plasmaman botanist suit"
@@ -261,6 +295,16 @@
icon_state = "plasmaman_HoS_helmet0"
base_state = "plasmaman_HoS_helmet"
+//NT REP
+/obj/item/clothing/suit/space/eva/plasmaman/nt_rep
+ name = "plasmaman NT representative suit"
+ icon_state = "plasmaman_rep"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
+ name = "plasmaman NT representative helmet"
+ icon_state = "plasmaman_rep_helmet0"
+ base_state = "plasmaman_rep_helmet"
+
//SECURITY
/obj/item/clothing/suit/space/eva/plasmaman/security
@@ -301,6 +345,17 @@
icon_state = "plasmaman_Captain_helmet0"
base_state = "plasmaman_Captain_helmet"
+
+//IAA/LAWYER
+/obj/item/clothing/suit/space/eva/plasmaman/lawyer
+ name = "plasmaman lawyer suit"
+ icon_state = "plasmamanlawyer_suit"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
+ name = "plasmaman lawyer helmet"
+ icon_state = "plasmamanlawyer_helmet0"
+ base_state = "plasmamanlawyer_helmet"
+
//NUKEOPS
/obj/item/clothing/suit/space/eva/plasmaman/nuclear
diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm
index 16ddf2bdd69..925beda23cd 100644
--- a/code/modules/clothing/spacesuits/rig/modules/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm
@@ -119,7 +119,7 @@
gun.attack_self(holder.wearer)
return 1
- gun.process_fire(target,holder.wearer)
+ gun.afterattack(target,holder.wearer)
return 1
/obj/item/rig_module/mounted/egun
diff --git a/code/modules/clothing/spacesuits/rig/modules/handheld.dm b/code/modules/clothing/spacesuits/rig/modules/handheld.dm
new file mode 100644
index 00000000000..1a8a66a5fc4
--- /dev/null
+++ b/code/modules/clothing/spacesuits/rig/modules/handheld.dm
@@ -0,0 +1,50 @@
+
+/obj/item/rig_module/handheld
+ name = "mounted device"
+ desc = "Some kind of hardsuit extension."
+ usable = 0
+ selectable = 0
+ toggleable = 1
+ disruptive = 0
+ activate_string = "Deploy"
+ deactivate_string = "Retract"
+
+ var/device_type
+ var/obj/item/device
+
+/obj/item/rig_module/handheld/activate()
+ if(!..())
+ return
+
+ if(!holder.wearer.put_in_hands(device))
+ to_chat(holder.wearer, "You need a free hand to hold \the [device]. ")
+ active = 0
+ return
+
+ to_chat(holder.wearer, "You deploy \the [device]. ")
+
+
+/obj/item/rig_module/handheld/deactivate()
+ if(!..())
+ return
+ if(ismob(device.loc)) //Better check for the holder, instead of assuming the rigwearer has it.
+ var/mob/M = device.loc //Helps in case the code fails to keep the module in one place, this should still return it.
+ M.unEquip(device, 1)
+
+ device.loc = src
+ to_chat(holder.wearer, "You retract \the [device]. ")
+
+/obj/item/rig_module/handheld/New()
+ ..()
+ if(device_type)
+ device = new device_type(src)
+ device.flags |= NODROP //We don't want to drop it while it's active/inhand.
+ activate_string += " [device]"
+ deactivate_string += " [device]"
+
+/obj/item/rig_module/handheld/horn
+ name = "mounted bikehorn"
+ desc = "For tactical honking"
+ interface_name = "mounted bikehorn"
+ interface_desc = "Honks"
+ device_type = /obj/item/weapon/bikehorn
diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm
index e64084a0beb..b527a615c5d 100644
--- a/code/modules/clothing/spacesuits/rig/modules/modules.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm
@@ -13,6 +13,8 @@
desc = "It looks pretty sciency."
icon = 'icons/obj/rig_modules.dmi'
icon_state = "module"
+
+ toolspeed = 1
var/damage = 0
var/obj/item/weapon/rig/holder
@@ -73,7 +75,7 @@
to_chat(user, "You start mending the damaged portions of \the [src]...")
- if(!do_after(user,30, target = src) || !W || !src)
+ if(!do_after(user, 30 * W.toolspeed, target = src) || !W || !src)
return
var/obj/item/stack/nanopaste/paste = W
@@ -98,7 +100,7 @@
return
to_chat(user, "You start mending the damaged portions of \the [src]...")
- if(!do_after(user, 30, target = src) || !W || !src)
+ if(!do_after(user, 30 * W.toolspeed, target = src) || !W || !src)
return
damage = 1
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 46471966aa7..aa1e644e506 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -94,7 +94,9 @@
*/
/obj/item/rig_module/device/New()
..()
- if(device_type) device = new device_type(src)
+ if(device_type)
+ device = new device_type(src)
+ device.flags |= ABSTRACT //Abstract in the sense that it's not an item that stands alone, but rather is just there to let the module act like it.
/obj/item/rig_module/device/engage(atom/target)
if(!..() || !device)
@@ -417,13 +419,15 @@
interface_desc = "Leave your mark."
engage_string = "Toggle stamp type"
usable = 1
- var/iastamp
- var/deniedstamp
+ var/obj/iastamp //Theese were just vars, but any device would need to be an object
+ var/obj/deniedstamp //Stops assigning non-objects to theese vars, which probably would break quite a bit.
/obj/item/rig_module/device/stamp/New()
..()
iastamp = new /obj/item/weapon/stamp/law(src)
deniedstamp = new /obj/item/weapon/stamp/denied(src)
+ iastamp.flags |= ABSTRACT
+ deniedstamp.flags |= ABSTRACT
device = iastamp
/obj/item/rig_module/device/stamp/engage(atom/target)
@@ -488,4 +492,4 @@
W.update_icon()
/obj/item/rig_module/welding_tank/proc/get_fuel()
- return reagents.get_reagent_amount("fuel")
\ No newline at end of file
+ return reagents.get_reagent_amount("fuel")
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 2ebd01a9162..da181368cc5 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -14,7 +14,7 @@
slot_flags = SLOT_BACK
req_one_access = list()
req_access = list()
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
// These values are passed on to all component pieces.
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
@@ -42,7 +42,7 @@
//Component/device holders.
var/obj/item/weapon/tank/air_supply // Air tank, if any.
- var/obj/item/clothing/shoes/boots = null // Deployable boots, if any.
+ var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
var/obj/item/clothing/suit/space/new_rig/chest // Deployable chestpiece, if any.
var/obj/item/clothing/head/helmet/space/new_rig/helmet = null // Deployable helmet, if any.
var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any.
@@ -76,6 +76,7 @@
var/airtight = 1 //If set, will adjust AIRTIGHT and STOPSPRESSUREDMAGE flags on components. Otherwise it should leave them untouched.
var/emp_protection = 0
+ var/has_emergency_release = 1 //Allows suit to be removed from outside.
// Wiring! How exciting.
var/datum/wires/rig/wires
@@ -126,14 +127,17 @@
if(helm_type)
helmet = new helm_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_helmet
+ helmet.item_color="[initial(icon_state)]_sealed" //For the lightswitching to know the correct string to manipulate
if(boot_type)
boots = new boot_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_boots
+ boots.magboot_state="[initial(icon_state)]_sealed" //For the magboot (de)activation to know the correct string to manipulate
if(chest_type)
chest = new chest_type(src)
if(allowed)
chest.allowed = allowed
chest.slowdown = offline_slowdown
+ chest.holder = src
verbs |= /obj/item/weapon/rig/proc/toggle_chest
for(var/obj/item/piece in list(gloves,helmet,boots,chest))
@@ -161,10 +165,8 @@
M.unEquip(piece)
qdel(piece)
processing_objects -= src
- qdel(wires)
- wires = null
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(wires)
+ QDEL_NULL(spark_system)
return ..()
/obj/item/weapon/rig/proc/suit_is_deployed()
@@ -183,11 +185,15 @@
/obj/item/weapon/rig/proc/reset()
offline = 2
flags &= ~NODROP
+ if(helmet && helmet.on)
+ helmet.toggle_light(wearer)
+ if(boots && boots.magpulse)
+ boots.attack_self(wearer)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!piece) continue
piece.icon_state = "[initial(icon_state)]"
if(airtight)
- piece.flags &= ~(STOPSPRESSUREDMAGE|AIRTIGHT)
+ piece.flags &= ~(STOPSPRESSUREDMAGE | AIRTIGHT)
update_icon(1)
/obj/item/weapon/rig/proc/seal(mob/living/user)
@@ -254,6 +260,7 @@
switch(msg_type)
if("boots")
to_chat(wearer, "\The [correct_piece] seal around your feet. ")
+ correct_piece.icon_state = "[initial(icon_state)]_sealed0" //Solution to not need a sprite for off, on, and unused magboots.
if(user != wearer)
to_chat(user, "\The [correct_piece] has been sealed. ")
wearer.update_inv_shoes()
@@ -269,6 +276,7 @@
wearer.update_inv_wear_suit()
if("helmet")
to_chat(wearer, "\The [correct_piece] hisses closed. ")
+ correct_piece.icon_state = "[initial(icon_state)]_sealed0" //Solution to not need a sprite for off, on, and unused helmet light.
if(user != wearer)
to_chat(user, "\The [correct_piece] has been sealed. ")
wearer.update_inv_head()
@@ -383,10 +391,14 @@
sealing = FALSE
if(failed_to_seal)
- for(var/obj/item/piece in list(helmet, boots, gloves, chest))
+ for(var/obj/item/piece in list(gloves, chest))
if(!piece)
continue
piece.icon_state = "[initial(icon_state)]_sealed"
+ if(helmet)
+ helmet.icon_state = "[initial(icon_state)]_sealed[helmet.on]"
+ if(boots)
+ boots.icon_state = "[initial(icon_state)]_sealed[boots.magpulse]"
if(airtight)
update_component_sealed()
update_icon(1)
@@ -406,13 +418,15 @@
update_icon(1)
/obj/item/weapon/rig/proc/update_component_sealed()
+ if(istype(boots) && !(flags & NODROP) && boots.magpulse) //If we have (active) boots and unsealed the suit, we deactivate the magboots.
+ boots.attack_self(wearer)
+ if(istype(helmet) && !(flags & NODROP) && helmet.on) //If we have an (active) headlamp and unsealed the suit, we deactivate the headlamp.
+ helmet.toggle_light(wearer)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!(flags & NODROP))
- piece.flags &= ~STOPSPRESSUREDMAGE
- piece.flags &= ~AIRTIGHT
+ piece.flags &= ~(STOPSPRESSUREDMAGE | AIRTIGHT)
else
- piece.flags |= STOPSPRESSUREDMAGE
- piece.flags |= AIRTIGHT
+ piece.flags |= STOPSPRESSUREDMAGE | AIRTIGHT
/obj/item/weapon/rig/process()
// If we've lost any parts, grab them back.
@@ -424,7 +438,7 @@
M.unEquip(piece)
piece.forceMove(src)
- if(!istype(wearer) || loc != wearer || wearer.back != src || (!(flags & NODROP)) || !cell || cell.charge <= 0)
+ if(!istype(wearer) || loc != wearer || wearer.back != src || !(flags & NODROP) || !cell || cell.charge <= 0)
if(!cell || cell.charge <= 0)
if(electrified > 0)
electrified = 0
@@ -695,6 +709,8 @@
M.visible_message("[M] struggles into \the [src]. ", "You struggle into \the [src]. ")
wearer = M
wearer.wearing_rig = src
+ if(has_emergency_release)
+ M.verbs |= /obj/item/weapon/rig/proc/emergency_release
update_icon()
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/user, var/deploy_mode, var/force)
@@ -705,15 +721,15 @@
if(isliving(uneq_piece.loc))
var/mob/living/L = uneq_piece.loc
L.unEquip(uneq_piece, 1)
- uneq_piece.flags &= ~NODROP
uneq_piece.forceMove(src)
return 0
if(sealing || !cell || !cell.charge)
return 0
- if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
- return 0
+ if(!(deploy_mode == ONLY_RETRACT && force)) //This should be the case while stripping, stripping does trigger the if statement below.
+ if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
+ return 0
var/obj/item/check_slot
var/equip_to
@@ -752,23 +768,21 @@
if(to_strip)
to_strip.unEquip(use_obj, 1)
- use_obj.flags &= ~NODROP
use_obj.forceMove(src)
if(wearer)
to_chat(wearer, "Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
else if(deploy_mode != ONLY_RETRACT)
- if(check_slot && check_slot != use_obj)
- to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way. ")
+ if(check_slot)
+ if(check_slot != use_obj) //If use_obj is already in check_slot, silently bail. Otherwise, tell the user why the part didn't deploy.
+ to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way. ")
return
use_obj.forceMove(wearer)
- use_obj.flags &= ~NODROP
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
use_obj.forceMove(src)
else
if(wearer)
to_chat(wearer, "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly. ")
- use_obj.flags |= NODROP
if(piece == "helmet" && helmet)
helmet.update_light(wearer)
@@ -777,17 +791,17 @@
if(!wearer || !user)
return 0
- if(flags & NODROP)
- if(wearer.head && wearer.head != helmet)
+ if(flags & NODROP) //We need to check if we have the part, the person is wearing something in the parts slot, and if yes, are they the same.
+ if(helmet && wearer.head && wearer.head != helmet)
to_chat(user, "\The [wearer.head] is blocking \the [src] from deploying! ")
return 0
- if(wearer.gloves && wearer.gloves != gloves)
+ if(gloves && wearer.gloves && wearer.gloves != gloves)
to_chat(user, "\The [wearer.gloves] is preventing \the [src] from deploying! ")
return 0
- if(wearer.shoes && wearer.shoes != boots)
+ if(boots && wearer.shoes && wearer.shoes != boots)
to_chat(user, "\The [wearer.shoes] is preventing \the [src] from deploying! ")
return 0
- if(wearer.wear_suit && wearer.wear_suit != chest)
+ if(chest && wearer.wear_suit && wearer.wear_suit != chest)
to_chat(user, "\The [wearer.wear_suit] is preventing \the [src] from deploying! ")
return 0
@@ -797,6 +811,7 @@
/obj/item/weapon/rig/dropped(var/mob/user)
..()
+ user.verbs -= /obj/item/weapon/rig/proc/emergency_release
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, user, ONLY_RETRACT, 1)
if(wearer)
@@ -970,11 +985,6 @@
// AIs are a bit slower than regular and ignore move intent.
wearer_move_delay = world.time + ai_controlled_move_delay
- var/tickcomp = 0
- if(config.Tickcomp)
- tickcomp = ((1/(world.tick_lag))*1.3) - 1.3
- wearer_move_delay += tickcomp
-
if(wearer.buckled) //if we're buckled to something, tell it we moved.
return wearer.buckled.relaymove(wearer, direction)
@@ -996,6 +1006,38 @@
else
return null
+/obj/item/weapon/rig/proc/emergency_release()
+ set name = "Suit Emergency Release"
+ set desc = "Activate the suits emergency release system."
+ set category = "Object"
+ set src in oview(1)
+ var/obj/item/weapon/rig/T = get_rig()
+ return T.do_emergency_release(usr)
+
+/obj/item/weapon/rig/proc/do_emergency_release(var/mob/living/user)
+ if(!can_touch(user, wearer) || !has_emergency_release)
+ return can_touch(user,wearer)
+ usr.visible_message("[user] starts activating \the [src] emergency seals release! ")
+ if(!do_after(user, 240, target = wearer))
+ to_chat(user, "You need to focus on activating the emergency release. ")
+ return 0
+ usr.visible_message("[user] activated \the [src] emergency seals release! ")
+ malfunctioning += 1
+ malfunction_delay = 30
+ unseal(user)
+ return 1
+
+/obj/item/weapon/rig/proc/can_touch(var/mob/user, var/mob/wearer)
+ if(!user)
+ return 0
+ if(!wearer.Adjacent(user))
+ return 0
+ if(user.restrained())
+ to_chat(user, "You need your hands free for this. ")
+ return 0
+ if(user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
+ return 0
+ return 1
#undef ONLY_DEPLOY
#undef ONLY_RETRACT
#undef SEAL_DELAY
diff --git a/code/modules/clothing/spacesuits/rig/rig_armormod.dm b/code/modules/clothing/spacesuits/rig/rig_armormod.dm
new file mode 100644
index 00000000000..ec045c7da2d
--- /dev/null
+++ b/code/modules/clothing/spacesuits/rig/rig_armormod.dm
@@ -0,0 +1,21 @@
+/obj/item/clothing/suit/space/new_rig/calc_breach_damage()
+ ..()
+ holder.update_armor() //New dammage, new armormultiplikator.
+ return damage
+
+/obj/item/weapon/rig/proc/update_armor()
+ var/multi = 1 //Multiplicative modification to the armor, maybe add an additive later on
+ if(chest)
+ multi *= (100 - chest.damage) / 100 //If we have some breaches, lower the armor value.
+
+ //TODO check for other armor mods, likely modules, which need to be coded.
+
+ for(var/obj/item/piece in list(gloves, helmet, boots, chest))
+ if(!istype(piece)) //Do we have the piece
+ continue
+ if(islist(armor)) //Did we even give them some armor, if this is the case, the list should be initialized from New()
+ var/list/L = armor
+ for(var/armortype in L)
+ piece.armor[armortype] = L[armortype]*multi
+
+//Perfect place to also add something like shield modules, or any other hit_reaction modules check.
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index b89c59cf837..01793ef360d 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -80,7 +80,7 @@
var/obj/item/rig_module/mod = W
to_chat(user, "You begin installing \the [mod] into \the [src].")
- if(!do_after(user,40, target = src))
+ if(!do_after(user, 40 * W.toolspeed, target = src))
return
if(!user || !W)
return
@@ -141,7 +141,7 @@
if(user.r_hand && user.l_hand)
cell.forceMove(get_turf(user))
else
- cell.forceMove(user.put_in_hands(cell))
+ user.put_in_hands(cell)
cell = null
else
to_chat(user, "There is nothing loaded in that mount.")
diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
index dab4ad5ac35..ff3b80af1cb 100644
--- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
@@ -4,7 +4,7 @@
/obj/item/clothing/head/helmet/space/new_rig
name = "helmet"
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL
+ flags = BLOCKHAIR | THICKMATERIAL | NODROP
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEMASK
body_parts_covered = HEAD
heat_protection = HEAD
@@ -12,11 +12,12 @@
var/brightness_on = 4
var/on = 0
sprite_sheets = list(
- "Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi'
)
species_restricted = null
+ actions_types = list(/datum/action/item_action/toggle_helmet_light)
flash_protect = 2
@@ -28,13 +29,17 @@
toggle_light(user)
/obj/item/clothing/head/helmet/space/new_rig/proc/toggle_light(mob/user)
- on = !on
- icon_state = "rig[on]-[item_color]"
+ if(flags & AIRTIGHT) //Could also check for STOPSPRESSUREDMAGE, but one is enough, both get toggled when the seal gets toggled.
- if(on)
- set_light(brightness_on)
+ on = !on
+ icon_state = "[item_color][on]"
+
+ if(on)
+ set_light(brightness_on)
+ else
+ set_light(0)
else
- set_light(0)
+ to_chat(user, "You cannot turn the light on while the suit isn't sealed. ")
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -42,7 +47,7 @@
/obj/item/clothing/gloves/rig
name = "gauntlets"
- flags = THICKMATERIAL
+ flags = THICKMATERIAL | NODROP
body_parts_covered = HANDS
heat_protection = HANDS
cold_protection = HANDS
@@ -51,12 +56,19 @@
/obj/item/clothing/shoes/magboots/rig
name = "boots"
+ flags = NODROP
body_parts_covered = FEET
cold_protection = FEET
heat_protection = FEET
species_restricted = null
gender = PLURAL
+/obj/item/clothing/shoes/magboots/rig/attack_self(mob/user)
+ if(flags & AIRTIGHT) //Could also check for STOPSPRESSUREDMAGE, but one is enough, both get toggled when the seal gets toggled.
+ ..(user)
+ else
+ to_chat(user, "You cannot activate mag-pulse traction system while the suit is not sealed. ")
+
/obj/item/clothing/suit/space/new_rig
name = "chestpiece"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
@@ -64,14 +76,14 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT|HIDETAIL
- flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT
+ flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT | NODROP
slowdown = 0
- //will reach 10 breach damage after 25 laser carbine blasts, 3 revolver hits, or ~1 PTR hit. Completely immune to smg or sts hits.
- breach_threshold = 38
+ breach_threshold = 20
resilience = 0.2
can_breach = 1
+ var/obj/item/weapon/rig/holder
sprite_sheets = list(
- "Tajara" = 'icons/mob/species/tajaran/suit.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi'
)
diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
index 5214ea919f6..59ab809e130 100644
--- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
@@ -115,7 +115,7 @@
/obj/item/weapon/rig/verb/deploy_suit()
set name = "Deploy Hardsuit"
- set desc = "Deploys helmet, gloves and boots."
+ set desc = "Deploys helmet, gloves and boots all at once."
set category = "Hardsuit"
set src = usr.contents
@@ -136,8 +136,8 @@
deploy(wearer, usr)
/obj/item/weapon/rig/verb/toggle_seals_verb()
- set name = "Toggle Hardsuit"
- set desc = "Activates or deactivates your rig."
+ set name = "Toggle Hardsuit Seals"
+ set desc = "Seals or unseals your rig."
set category = "Hardsuit"
set src = usr.contents
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 8632b6cc472..27724fa0749 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -10,8 +10,9 @@
vision_restriction = 1
offline_vision_restriction = 2
- chest_type = /obj/item/clothing/suit/space/new_rig
+ chest_type = /obj/item/clothing/suit/space/new_rig/unathi
helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi
+ glove_type = /obj/item/clothing/gloves/rig/unathi
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
/obj/item/weapon/rig/unathi/fancy
@@ -23,10 +24,23 @@
vision_restriction = 0
/obj/item/clothing/head/helmet/space/new_rig/unathi
+ icon = 'icons/obj/clothing/species/unathi/hats.dmi'
species_restricted = list("Unathi")
/obj/item/clothing/suit/space/new_rig/unathi
+ icon = 'icons/obj/clothing/species/unathi/suits.dmi'
species_restricted = list("Unathi")
+/obj/item/clothing/gloves/rig/unathi
+ icon = 'icons/obj/clothing/species/unathi/gloves.dmi'
+ species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/gloves.dmi'
+ )
+
/obj/item/clothing/shoes/magboots/rig/unathi
- species_restricted = list("Unathi")
\ No newline at end of file
+ icon = 'icons/obj/clothing/species/unathi/shoes.dmi'
+ species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/feet.dmi'
+ )
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index 0bda9f9288a..2a38480dabc 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -112,7 +112,7 @@
name = "stealth suit control module"
suit_type = "stealth"
desc = "A highly advanced and expensive suit designed for covert operations."
- icon_state = "stealth_rig"
+ icon_state = "ninja_rig" //supposed to be "stealth_rig", but as it currently only has a semi-copied ninja rig sprite, we can just use them directly.
req_access = list(access_syndicate)
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 4b8f32f5a74..37aa5b776ba 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -12,7 +12,7 @@
icon_state = "syndicate"
item_state = "space_suit_syndicate"
desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -173,4 +173,4 @@ obj/item/clothing/suit/space/syndicate/black/red/strike
/obj/item/clothing/suit/space/syndicate/black/engie
name = "Black Engineering Space Suit"
icon_state = "syndicate-black-engie"
- item_state = "syndicate-black"
\ No newline at end of file
+ item_state = "syndicate-black"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 29cdc893cdc..7a2fa10db07 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -122,7 +122,7 @@
/obj/item/clothing/suit/armor/hos/alt
name = "armored trenchoat"
- desc = "A trenchcoat enchanced with a special lightweight kevlar. The epitome of tactical plainclothes."
+ desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes."
icon_state = "hostrench_open"
item_state = "hostrench_open"
flags_inv = 0
@@ -142,7 +142,7 @@
/obj/item/clothing/suit/armor/vest/warden
name = "Warden's armored jacket"
- desc = "An armoured jacket with silver rank pips and livery."
+ desc = "An armored jacket with silver rank pips and livery."
icon_state = "warden_jacket"
item_state = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
@@ -166,7 +166,7 @@
/obj/item/clothing/suit/armor/vest/capcarapace/alt
name = "captain's parade jacket"
- desc = "For when an armoured vest isn't fashionable enough."
+ desc = "For when an armored vest isn't fashionable enough."
icon_state = "capformal"
item_state = "capspacesuit"
@@ -209,6 +209,7 @@
icon_state = "knight_templar"
item_state = "knight_templar"
allowed = list(/obj/item/weapon/nullrod/claymore)
+ armor = list(melee = 25, bullet = 5, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/bulletproof
name = "Bulletproof Vest"
@@ -375,7 +376,7 @@
desc = "A suit that protects against some damage."
icon_state = "centcom"
item_state = "centcom"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
flags = THICKMATERIAL
@@ -392,7 +393,7 @@
icon_state = "heavy"
item_state = "swat_suit"
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.90
flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -411,13 +412,13 @@
/obj/item/clothing/suit/armor/tdome/red
name = "Red Thunderdome Armor"
- desc = "Armor worn by the red Thunderodome team"
+ desc = "Armor worn by the red Thunderdome team."
icon_state = "tdred"
item_state = "tdred"
/obj/item/clothing/suit/armor/tdome/green
name = "Green Thunderdome Armor"
- desc = "Armor worn by the green Thunderodome team"
+ desc = "Armor worn by the green Thunderdome team."
icon_state = "tdgreen"
item_state = "tdgreen"
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 4286064262f..49f8a8ea8d1 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -4,7 +4,8 @@
icon_state = "bio"
desc = "A hood that protects the head and face from biological comtaminants."
permeability_coefficient = 0.01
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
+ flags = BLOCKHAIR | THICKMATERIAL
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
burn_state = FIRE_PROOF
@@ -14,7 +15,7 @@
desc = "A suit that protects against biological contamination."
icon_state = "bio"
item_state = "bio_suit"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = THICKMATERIAL
@@ -92,4 +93,4 @@
strip_delay = 40
put_on_delay = 20
species_fit = null
- sprite_sheets = null
\ No newline at end of file
+ sprite_sheets = null
diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm
index 0683394ce9f..7e2307c96b4 100644
--- a/code/modules/clothing/suits/hood.dm
+++ b/code/modules/clothing/suits/hood.dm
@@ -10,7 +10,7 @@
..()
/obj/item/clothing/suit/hooded/Destroy()
- qdel(hood)
+ QDEL_NULL(hood)
return ..()
/obj/item/clothing/suit/hooded/proc/MakeHood()
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 886a98e4678..0ccdf7027d3 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -38,7 +38,7 @@
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
- allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer,/obj/item/weapon/minihoe)
+ allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 8097162ba28..2a5c1282cdc 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -9,9 +9,10 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/device/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
- species_fit = list("Vox")
+ species_fit = list("Vox","Grey")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Grey" = 'icons/mob/species/grey/suit.dmi'
)
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 37e8daad42b..8b6e4d2e0d3 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -106,7 +106,7 @@
icon_state = "judge"
item_state = "judge"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash)
+ allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/stack/spacecash)
flags_inv = HIDEJUMPSUIT
@@ -135,7 +135,7 @@
icon_state = "syndicate-black-red"
item_state = "syndicate-black-red"
desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
burn_state = FIRE_PROOF
@@ -421,7 +421,7 @@
/obj/item/clothing/suit/hooded/wintercoat/hydro
name = "hydroponics winter coat"
icon_state = "wintercoat_hydro"
- allowed = list(/obj/item/weapon/reagent_containers/spray, /obj/item/device/analyzer/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
+ allowed = list(/obj/item/weapon/reagent_containers/spray, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
hoodtype = /obj/item/clothing/head/winterhood/hydro
/obj/item/clothing/head/winterhood/hydro
@@ -457,6 +457,7 @@
icon_state = "black_hoodie"
item_state = "blueshieldcoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen)
hoodtype = /obj/item/clothing/head/hood
species_fit = list("Vox")
sprite_sheets = list(
@@ -526,6 +527,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
flags_size = ONESIZEFITSALL
strip_delay = 60
+ breakouttime = 3000
/obj/item/clothing/suit/ianshirt
name = "worn shirt"
@@ -712,7 +714,7 @@
desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician."
icon_state = "mercy_hoodie"
item_state = "mercy_hoodie"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_size = ONESIZEFITSALL
@@ -727,7 +729,8 @@
icon_state = "mercy_hood"
item_state = "mercy_hood"
permeability_coefficient = 0.01
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = BLOCKHAIR
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
@@ -773,6 +776,13 @@
adjust_flavour = null
burn_state = FIRE_PROOF
+/obj/item/clothing/suit/jacket/leather/overcoat
+ name = "leather overcoat"
+ desc = "That's a damn fine coat."
+ icon_state = "leathercoat"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+
/obj/item/clothing/suit/officercoat
name = "Clown Officer's Coat"
desc = "A classy clown officer's overcoat, also designed by Hugo Boss."
@@ -809,8 +819,6 @@
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite)
actions_types = list(/datum/action/item_action/toggle_wings)
-/obj/item/clothing/suit/toggle/owlwings/super_hero
- flags = NODROP
/obj/item/clothing/suit/toggle/owlwings/griffinwings
name = "griffon cloak"
@@ -818,9 +826,6 @@
icon_state = "griffin_wings"
item_state = "griffin_wings"
-/obj/item/clothing/suit/toggle/owlwings/griffinwings/super_hero
- flags = NODROP
-
/obj/item/clothing/suit/toggle/attack_self()
if(icon_state == initial(icon_state))
icon_state = icon_state + "_t"
@@ -943,4 +948,4 @@
linked_staff.faith += 5
if(linked_staff.faith >= 100) //if this charge puts the staff at or above full, notify the wearer
- to_chat(H, "Faith renewed; ready to convert new followers. ")
\ No newline at end of file
+ to_chat(H, "Faith renewed; ready to convert new followers. ")
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 82a468d2a63..5e73af7aa39 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -5,12 +5,11 @@
..()
pockets = new/obj/item/weapon/storage/internal(src)
pockets.storage_slots = 2 //two slots
- pockets.max_w_class = 2 //fit only pocket sized items
+ pockets.max_w_class = WEIGHT_CLASS_SMALL //fit only pocket sized items
pockets.max_combined_w_class = 4
/obj/item/clothing/suit/storage/Destroy()
- qdel(pockets)
- pockets = null
+ QDEL_NULL(pockets)
return ..()
/obj/item/clothing/suit/storage/attack_hand(mob/user as mob)
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 44a2f5b1c49..3d31af6230b 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -14,7 +14,7 @@
desc = "A suit that protects against fire and heat."
icon_state = "fire"
item_state = "fire_suit"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -43,7 +43,7 @@
desc = "A suit that protects against extreme fire and heat."
//icon_state = "thermal"
item_state = "ro_suit"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
slowdown = 1.5
/obj/item/clothing/suit/fire/atmos
@@ -64,9 +64,10 @@
name = "bomb hood"
desc = "Use in case of bomb."
icon_state = "bombsuit"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
+ flags = BLOCKHAIR | THICKMATERIAL
armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -74,13 +75,17 @@
strip_delay = 70
put_on_delay = 70
burn_state = FIRE_PROOF
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
/obj/item/clothing/suit/bomb_suit
name = "bomb suit"
desc = "A suit designed for safety when handling explosives."
icon_state = "bombsuit"
item_state = "bombsuit"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = THICKMATERIAL
@@ -99,17 +104,20 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
- hide_tail_by_species = list("Vox")
/obj/item/clothing/head/bomb_hood/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/suit/bomb_suit/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ species_fit = null
+ sprite_sheets = null
/*
* Radiation protection
@@ -118,18 +126,23 @@
name = "Radiation Hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
- flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
+ flags = BLOCKHAIR|THICKMATERIAL
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100)
strip_delay = 60
put_on_delay = 60
burn_state = FIRE_PROOF
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
/obj/item/clothing/suit/radiation
name = "Radiation suit"
desc = "A suit that protects against radiation. Label: Made with lead, do not eat insulation."
icon_state = "rad"
item_state = "rad_suit"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
flags = THICKMATERIAL
@@ -140,4 +153,8 @@
flags_inv = HIDEJUMPSUIT|HIDETAIL
strip_delay = 60
put_on_delay = 60
- burn_state = FIRE_PROOF
\ No newline at end of file
+ burn_state = FIRE_PROOF
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 9482ee7d080..5f358ac58f4 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -6,7 +6,7 @@
item_state = "" //no inhands
item_color = "bluetie"
slot_flags = SLOT_TIE
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/slot = "decor"
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
@@ -15,6 +15,12 @@
..()
inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[item_color? "[item_color]" : "[icon_state]"]")
+/obj/item/clothing/accessory/Destroy()
+ if(has_suit)
+ has_suit.accessories -= src
+ on_removed(null)
+ return ..()
+
//when user attached an accessory to S
/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob)
if(!istype(S))
@@ -37,7 +43,7 @@
to_chat(user, "You attach [src] to [has_suit]. ")
src.add_fingerprint(user)
-/obj/item/clothing/accessory/proc/on_removed(mob/user as mob)
+/obj/item/clothing/accessory/proc/on_removed(mob/user)
if(!has_suit)
return
has_suit.overlays -= inv_overlay
@@ -53,8 +59,9 @@
has_suit.armor[armor_type] -= armor[armor_type]
has_suit = null
- usr.put_in_hands(src)
- src.add_fingerprint(user)
+ if(user)
+ user.put_in_hands(src)
+ add_fingerprint(user)
/obj/item/clothing/accessory/attack(mob/living/carbon/human/H, mob/living/user)
// This code lets you put accessories on other people by attacking their sprite with the accessory
@@ -65,7 +72,7 @@
var/obj/item/clothing/under/U = H.w_uniform
if(istype(U))
user.visible_message("[user] is putting a [src.name] on [H]'s [U.name]! ", "You begin to put a [src.name] on [H]'s [U.name]... ")
- if(do_after(user,40,target=H) && H.w_uniform == U)
+ if(do_after(user, 40, target=H) && H.w_uniform == U)
user.visible_message("[user] puts a [src.name] on [H]'s [U.name]! ", "You finish putting a [src.name] on [H]'s [U.name]. ")
U.attackby(src, user)
else
@@ -243,7 +250,7 @@
to_chat(user, "Waving around a badge before swiping an ID would be pretty pointless.")
return
if(isliving(user))
- user.visible_message("\red [user] displays their NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.")
+ user.visible_message("[user] displays their Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security. ","You display your Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security. ")
/obj/item/clothing/accessory/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda))
@@ -268,16 +275,16 @@
/obj/item/clothing/accessory/holobadge/emag_act(user as mob)
if(emagged)
- to_chat(user, "\red [src] is already cracked.")
+ to_chat(user, "[src] is already cracked. ")
return
else
emagged = 1
- to_chat(user, "\red You swipe the card and crack the holobadge security checks.")
+ to_chat(user, "You swipe the card and crack the holobadge security checks. ")
return
/obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
- user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.")
+ user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently. ","You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law. ")
/obj/item/weapon/storage/box/holobadge
name = "holobadge box"
@@ -361,19 +368,193 @@
//However, these 3 don't have corgi versions of their sprites
/obj/item/clothing/accessory/stripedredscarf
name = "striped red scarf"
+ desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
icon_state = "stripedredscarf"
item_color = "stripedredscarf"
/obj/item/clothing/accessory/stripedgreenscarf
name = "striped green scarf"
+ desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
icon_state = "stripedgreenscarf"
item_color = "stripedgreenscarf"
/obj/item/clothing/accessory/stripedbluescarf
name = "striped blue scarf"
+ desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
icon_state = "stripedbluescarf"
item_color = "stripedbluescarf"
+//Necklaces
+/obj/item/clothing/accessory/necklace
+ name = "necklace"
+ desc = "A simple necklace."
+ icon_state = "necklace"
+ item_state = "necklace"
+ item_color = "necklace"
+ slot_flags = SLOT_MASK | SLOT_TIE
+
+/obj/item/clothing/accessory/necklace/locket
+ name = "gold locket"
+ desc = "A gold locket that seems to have space for a photo within."
+ icon_state = "locket"
+ item_state = "locket"
+ item_color = "locket"
+ slot_flags = SLOT_MASK | SLOT_TIE
+ var/base_icon
+ var/open
+ var/obj/item/held //Item inside locket.
+
+/obj/item/clothing/accessory/necklace/locket/Destroy()
+ QDEL_NULL(held)
+ return ..()
+
+
+/obj/item/clothing/accessory/necklace/locket/attack_self(mob/user as mob)
+ if(!base_icon)
+ base_icon = icon_state
+
+ if(!("[base_icon]_open" in icon_states(icon)))
+ to_chat(user, "[src] doesn't seem to open.")
+ return
+
+ open = !open
+ to_chat(user, "You flip [src] [open?"open":"closed"].")
+ if(open)
+ icon_state = "[base_icon]_open"
+ if(held)
+ to_chat(user, "[held] falls out!")
+ held.forceMove(get_turf(user))
+ held = null
+ else
+ icon_state = "[base_icon]"
+
+/obj/item/clothing/accessory/necklace/locket/attackby(var/obj/item/O as obj, mob/user as mob)
+ if(!open)
+ to_chat(user, "You have to open it first.")
+ return
+
+ if(istype(O,/obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) && !(istype(O, /obj/item/weapon/paper/talisman)))
+ if(held)
+ to_chat(usr, "[src] already has something inside it.")
+ else
+ to_chat(usr, "You slip [O] into [src].")
+ user.drop_item()
+ O.forceMove(src)
+ held = O
+ else
+ return ..()
+
+//Cowboy Shirts
+/obj/item/clothing/accessory/cowboyshirt
+ name = "black cowboy shirt"
+ desc = "For a real western look. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt"
+ item_state = "cowboyshirt"
+ item_color = "cowboyshirt"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/short_sleeved
+ name = "shortsleeved black cowboy shirt"
+ desc = "For when it's a hot day in the west. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_s"
+ item_state = "cowboyshirt_s"
+ item_color = "cowboyshirt_s"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/white
+ name = "white cowboy shirt"
+ desc = "For the rancher in us all. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_white"
+ item_state = "cowboyshirt_white"
+ item_color = "cowboyshirt_white"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/white/short_sleeved
+ name = "short sleeved white cowboy shirt"
+ desc = "Best for midday cattle tending. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_whites"
+ item_state = "cowboyshirt_whites"
+ item_color = "cowboyshirt_whites"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/pink
+ name = "pink cowboy shirt"
+ desc = "For only the manliest of men, or girliest of girls. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_pink"
+ item_state = "cowboyshirt_pink"
+ item_color = "cowboyshirt_pink"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/pink/short_sleeved
+ name = "short sleeved pink cowboy shirt"
+ desc = "For a real buckle bunny. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_pinks"
+ item_state = "cowboyshirt_pinks"
+ item_color = "cowboyshirt_pinks"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/navy
+ name = "navy cowboy shirt"
+ desc = "Now yer a real cowboy. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_navy"
+ item_state = "cowboyshirt_navy"
+ item_color = "cowboyshirt_navy"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/navy/short_sleeved
+ name = "short sleeved navy cowboy shirt"
+ desc = "Sometimes ya need to roll up your sleeves. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_navys"
+ item_state = "cowboyshirt_navys"
+ item_color = "cowboyshirt_navys"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/red
+ name = "red cowboy shirt"
+ desc = "It's high noon. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_red"
+ item_state = "cowboyshirt_red"
+ item_color = "cowboyshirt_red"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/accessory/cowboyshirt/red/short_sleeved
+ name = "short sleeved red cowboy shirt"
+ desc = "Life on the open range is quite dangeorus, you never know what to expect. Looks like it can clip on to a uniform."
+ icon_state = "cowboyshirt_reds"
+ item_state = "cowboyshirt_reds"
+ item_color = "cowboyshirt_reds"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
/obj/item/clothing/accessory/petcollar
name = "pet collar"
desc = "The latest fashion accessory for your favorite pets!"
@@ -383,9 +564,7 @@
var/obj/item/weapon/card/id/access_id
/obj/item/clothing/accessory/petcollar/Destroy()
- if(access_id)
- qdel(access_id)
- access_id = null
+ QDEL_NULL(access_id)
processing_objects -= src
return ..()
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index a30522768ed..4c53d9c3c8d 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -7,7 +7,11 @@
var/holster_allow = /obj/item/weapon/gun
var/obj/item/weapon/gun/holstered = null
actions_types = list(/datum/action/item_action/accessory/holster)
- w_class = 3 // so it doesn't fit in pockets
+ w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets
+
+/obj/item/clothing/accessory/holster/Destroy()
+ QDEL_NULL(holstered)
+ return ..()
//subtypes can override this to specify what can be holstered
/obj/item/clothing/accessory/holster/proc/can_holster(obj/item/weapon/gun/W)
@@ -57,7 +61,7 @@
to_chat(user, "You need an empty hand to draw the [holstered]! ")
else
if(user.a_intent == I_HARM)
- usr.visible_message("\red [user] draws the [holstered], ready to shoot! ", \
+ usr.visible_message("[user] draws the [holstered], ready to shoot! ", \
"You draw the [holstered], ready to shoot! ")
else
user.visible_message("[user] draws the [holstered], pointing it at the ground. ", \
@@ -136,4 +140,4 @@
name = "shoulder holster"
desc = "A handgun holster. Made of expensive leather."
icon_state = "holster"
- item_color = "holster_low"
\ No newline at end of file
+ item_color = "holster_low"
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index aea6cf139f3..a306864cbfc 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -7,13 +7,17 @@
var/slots = 3
var/obj/item/weapon/storage/internal/hold
actions_types = list(/datum/action/item_action/accessory/storage)
- w_class = 3 // so it doesn't fit in pockets
+ w_class = WEIGHT_CLASS_NORMAL // so it doesn't fit in pockets
/obj/item/clothing/accessory/storage/New()
..()
hold = new/obj/item/weapon/storage/internal(src)
hold.storage_slots = slots
+/obj/item/clothing/accessory/storage/Destroy()
+ QDEL_NULL(hold)
+ return ..()
+
/obj/item/clothing/accessory/storage/attack_hand(mob/user as mob)
if(has_suit) //if we are part of a suit
hold.open(user)
@@ -103,8 +107,7 @@
/obj/item/clothing/accessory/storage/knifeharness/New()
..()
hold.max_combined_w_class = 4
- hold.can_hold = list("/obj/item/weapon/hatchet/unathiknife",\
- "/obj/item/weapon/kitchen/knife")
+ hold.can_hold = list(/obj/item/weapon/hatchet/unathiknife, /obj/item/weapon/kitchen/knife)
new /obj/item/weapon/hatchet/unathiknife(hold)
- new /obj/item/weapon/hatchet/unathiknife(hold)
\ No newline at end of file
+ new /obj/item/weapon/hatchet/unathiknife(hold)
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index 8d7a92e3e8a..63f09efd3bf 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -25,14 +25,14 @@
attackby(obj/item/clothing/under/U as obj, mob/user as mob, params)
..()
if(istype(U, /obj/item/clothing/under/chameleon))
- to_chat(user, "\red Nothing happens.")
+ to_chat(user, "Nothing happens. ")
return
if(istype(U, /obj/item/clothing/under))
if(src.clothing_choices.Find(U))
- to_chat(user, "\red Pattern is already recognised by the suit.")
+ to_chat(user, "Pattern is already recognised by the suit. ")
return
src.clothing_choices += U
- to_chat(user, "\red Pattern absorbed by the suit.")
+ to_chat(user, "Pattern absorbed by the suit. ")
emp_act(severity)
@@ -56,7 +56,7 @@
set src in usr
if(icon_state == "psyche")
- to_chat(usr, "\red Your suit is malfunctioning")
+ to_chat(usr, "Your suit is malfunctioning ")
return
var/obj/item/clothing/under/A
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 68307875b1b..1ca94e9a4f3 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -72,6 +72,10 @@
/obj/item/clothing/under/rank/clown/hit_reaction()
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
+ if(ishuman(loc))
+ var/mob/living/carbon/human/H = loc
+ if(H.mind && H.mind.assigned_role == "Clown")
+ score_clownabuse++
return 0
/obj/item/clothing/under/rank/head_of_personnel
@@ -115,6 +119,14 @@
item_color = "internalaffairs"
flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/ntrep/skirt
+ desc = "A silky smooth black and gold representative uniform with blue markings."
+ name = "representative skirt"
+ icon_state = "ntrepf"
+ item_state = "ntrepf"
+ item_color = "ntrepf"
+ flags_size = ONESIZEFITSALL
+
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 31d36cdcb19..da905dd1e75 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -182,6 +182,16 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/security/brigphys/skirt
+ desc = "A skirted Brig Physician uniform. It has both security and medical protection."
+ name = "brig physician's jumpskirt"
+ icon_state = "brig_physf"
+ item_state = "brig_physf"
+ item_color = "brig_physf"
+ permeability_coefficient = 0.50
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
+
//Pod Pilot
/obj/item/clothing/under/rank/security/pod_pilot
desc = "Suit for your regular pod pilot."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 486d7d7c34e..41111585072 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -67,6 +67,27 @@
item_state = "gy_suit"
item_color = "vice"
+/obj/item/clothing/under/solgov
+ name = "Sol Federation marine uniform"
+ desc = "A comfortable and durable combat uniform worn by Sol Federation Marine Forces."
+ icon_state = "solgov"
+ item_state = "ro_suit"
+ item_color = "solgov"
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ displays_id = 0
+
+/obj/item/clothing/under/solgov/command
+ name = "Sol Federation Lieutenant's uniform"
+ desc = "A comfortable and durable combat uniform worn by Sol Federation Marine Forces. This one has additional insignia on its shoulders."
+ icon_state = "solgovc"
+ item_color = "solgovc"
+
+/obj/item/clothing/under/solgov/rep
+ name = "Sol Federation representative's uniform"
+ desc = "A formal uniform worn by the diplomatic representatives of the Sol Federation."
+ icon_state = "solgovr"
+ item_color = "solgovr"
+
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentComm Officers."
name = "\improper CentComm officer's jumpsuit"
@@ -132,13 +153,21 @@
item_color = "ert_uniform"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+/obj/item/clothing/under/rank/blueshield/skirt
+ name = "blueshield skirt"
+ desc = "A short, black and grey with blue markings skirted uniform. For the feminine Blueshield officers."
+ icon_state = "blueshieldf"
+ item_state = "blueshieldf"
+ item_color = "blueshieldf"
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
- w_class = 4//bulky item
+ w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -565,35 +594,43 @@
item_state = "bane"
item_color = "bane"
-/obj/item/clothing/under/vox_grey
+/obj/item/clothing/under/vox
+ name = "Ripped Jumpsuit"
+ desc = "A jumpsuit that looks like it's been shredded by some talons. Who could wear this now?"
+ icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
+ icon_state = "vgrey"
+ item_state = "vgrey"
+ item_color = "vgrey"
+
+/obj/item/clothing/under/vox/grey
name = "Grey Vox Jumpsuit"
desc = "An assistant's jumpsuit ripped to better fit a vox."
icon_state = "vgrey"
item_state = "vgrey"
item_color = "vgrey"
-/obj/item/clothing/under/vox_robotics
+/obj/item/clothing/under/vox/robotics
name = "Vox Robotics Jumpsuit"
desc = "A roboticist's jumpsuit ripped to better fit a vox."
icon_state = "vrobotics"
item_state = "vrobotics"
item_color = "vrobotics"
-/obj/item/clothing/under/vox_toxins
+/obj/item/clothing/under/vox/toxins
name = "Vox Toxins Jumpsuit"
desc = "A Toxin Researcher's jumpsuit ripped to better fit a vox."
icon_state = "vtoxinswhite"
item_state = "vtoxinswhite"
item_color = "vtoxinswhite"
-/obj/item/clothing/under/vox_atmos
+/obj/item/clothing/under/vox/atmos
name = "Vox Atmos Jumpsuit"
desc = "An Atmos Tech's jumpsuit ripped to better fit a vox."
icon_state = "vatmos"
item_state = "vatmos"
item_color = "vatmos"
-/obj/item/clothing/under/vox_engi
+/obj/item/clothing/under/vox/engi
name = "Vox Engineer Jumpsuit"
desc = "An Engineer's jumpsuit ripped to better fit a vox."
icon_state = "vengine"
@@ -601,7 +638,7 @@
item_color = "vengine"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
-/obj/item/clothing/under/vox_sec
+/obj/item/clothing/under/vox/sec
name = "Vox Security Jumpsuit"
desc = "A Security officer's jumpsuit ripped to better fit a vox."
icon_state = "vred"
@@ -609,7 +646,7 @@
item_color = "vred"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
-/obj/item/clothing/under/vox_chem
+/obj/item/clothing/under/vox/chem
name = "Vox Chemist Jumpsuit"
desc = "A Chemist's jumpsuit ripped to better fit a vox."
icon_state = "vchem"
@@ -700,18 +737,12 @@
icon_state = "owl"
item_color = "owl"
-/obj/item/clothing/under/owl/super_hero
- flags = NODROP
-
/obj/item/clothing/under/griffin
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
item_color = "griffin"
-/obj/item/clothing/under/griffin/super_hero
- flags = NODROP
-
/obj/item/clothing/under/noble_clothes
name = "noble clothes"
desc = "They fall just short of majestic."
@@ -732,7 +763,7 @@
..()
/obj/item/clothing/under/contortionist/dropped(mob/living/carbon/human/user)
- if(!user.get_int_organ(/obj/item/organ/internal/gland/ventcrawling))
+ if(!user.get_int_organ(/obj/item/organ/internal/heart/gland/ventcrawling))
user.ventcrawler = 0
..()
diff --git a/code/modules/computer3/NTOS.dm b/code/modules/computer3/NTOS.dm
deleted file mode 100644
index eed2163e0ac..00000000000
--- a/code/modules/computer3/NTOS.dm
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- The Big Bad NT Operating System
-*/
-
-/datum/file/program/ntos
- name = "Nanotrasen Operating System"
- extension = "prog"
- active_state = "ntos"
- var/obj/item/part/computer/storage/current // the drive being viewed, null for desktop/computer
- var/fileop = "runfile"
-
-/*
- Generate a basic list of files in the selected scope
-*/
-
-/datum/file/program/ntos/proc/list_files()
- if(!computer || !current) return null
- return current.files
-
-
-/datum/file/program/ntos/proc/filegrid(var/list/filelist)
- var/dat = ""
- var/i = 0
- for(var/datum/file/F in filelist)
- if(!F.hidden_file)
- i++
- if(i==1)
- dat += ""
- if(i>= 6)
- i = 0
- dat += " "
- continue
- dat += {"
-
-
-
- [F.name]
-
- "}
-
- dat += "
"
- return dat
-
-//
-// I am separating this from filegrid so that I don't have to
-// make metadata peripheral files
-//
-/datum/file/program/ntos/proc/desktop(var/peripheralop = "viewperipheral")
- var/dat = ""
- var/i = 0
- var/list/peripherals = list(computer.hdd,computer.floppy,computer.cardslot)
- for(var/obj/item/part/computer/C in peripherals)
- if(!istype(C)) continue
- i++
- if(i==1)
- dat += ""
- if(i>= 6)
- i = 0
- dat += " "
- continue
- dat += {"
-
-
- [bicon(C)]
- [C.name]
-
- "}
-
- dat += "
"
- return dat
-
-
-/datum/file/program/ntos/proc/window(var/title,var/buttonbar,var/content)
- return {"
-
-
[title]
-
[buttonbar]
-
[content]
-
"}
-
-/datum/file/program/ntos/proc/buttonbar(var/type = 0)
- switch(type)
- if(0) // FILE OPERATIONS
- return {""}
-
-/datum/file/program/ntos/interact()
- if(!interactable())
- return
- var/dat = {"
-
-
- Nanotrasen Operating System
-
-
-
- "}
-
-
- dat += generate_status_bar()
- var/list/files = list_files()
- if(current)
- dat +=window(current.name,buttonbar(),filegrid(files))
- else
- dat += desktop()
-
- dat += "
"
-
- usr << browse(dat, "window=\ref[computer];size=670x510")
- onclose(usr, "\ref[computer]")
-
- // STATUS BAR
- // Small 16x16 icons representing status of components, etc.
- // Currently only used by battery icon
- // TODO: Add more icons!
-/datum/file/program/ntos/proc/generate_status_bar()
- var/dat = ""
-
- // Battery level icon
- switch(computer.check_battery_status())
- if(-1)
- dat += " "
- if(0 to 5)
- dat += " "
- if(6 to 20)
- dat += " "
- if(21 to 40)
- dat += " "
- if(41 to 60)
- dat += " "
- if(61 to 80)
- dat += " "
- if(81 to 100)
- dat += " "
- dat += " "
- return dat
-
-/datum/file/program/ntos/Topic(href, list/href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if("viewperipheral" in href_list) // open drive, show status of peripheral
- var/obj/item/part/computer/C = locate(href_list["viewperipheral"])
- if(!istype(C) || (C.loc != src.computer))
- return
-
- if(istype(C,/obj/item/part/computer/storage))
- current = C
- interact()
- return
- // else ???
- if(istype(C,/obj/item/part/computer/cardslot))
- if(computer.cardslot.reader != null)
- computer.cardslot.remove()
- if(istype(C,/obj/item/part/computer/cardslot/dual))
- if(computer.cardslot.writer != null)
- computer.cardslot.remove(computer.cardslot.writer)
- if(computer.cardslot.reader != null)
- computer.cardslot.remove(computer.cardslot.reader)
- interact()
- return
-
- // distinct from close, this is the file dialog window
- if("winclose" in href_list)
- current = null
- interact()
- return
-
-#undef MAX_ROWS
-#undef MAX_COLUMNS
diff --git a/code/modules/computer3/bios.dm b/code/modules/computer3/bios.dm
deleted file mode 100644
index e8f1b1f8c4c..00000000000
--- a/code/modules/computer3/bios.dm
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- Okay so my last effort to have a central BIOS function was interesting
- but completely unmaintainable, I have scrapped it.
-
- The parts that were actually useful will be put here in functions instead.
- If we want a central bios function we can add one that just indexes them.
- That should at least allow sensible debugging.
-*/
-
-/obj/machinery/computer3
-
- /*
- interactable(user): performs all standard sanity checks
- Call in topic() and interact().
- */
- proc/interactable(var/mob/user)
- if( !src || !user || stat || user.stat || user.lying || user.blinded )
- return 0
- if(!program)
- return 0
-
- if(!istype(loc,/turf) || !istype(user.loc,/turf)) // todo handheld maybe
- return 0
-
- if(istype(user,/mob/living/silicon))
- if(!program.ai_allowed)
- to_chat(user, "\blue You are forbidden from accessing this program.")
- return 0
- else
- if(program.human_controls)
- if(!ishuman(user))
- to_chat(user, "\red Your body can't work the controls!")
- return 0
- if(user.restrained())
- to_chat(user, "\red You need a free hand!")
- return 0
-
- if(!in_range(src,user))
- // telekinesis check
- if(ishuman(user) && istype(user.get_active_hand(),/obj/item/tk_grab))
- if(program.human_controls)
- to_chat(user, "\red It's too complicated to work at a distance!")
- return 0
- add_fingerprint(user)
- user.set_machine(src)
- return 1
- return 0
-
- add_fingerprint(user)
- user.set_machine(src)
- return 1
-
- /*
- Deduplicates an item list and gives you range and direction.
- This is used for networking so you can determine which of several
- identically named objects you're referring to.
- */
- proc/format_atomlist(var/list/atoms)
- var/list/output = list()
- for(var/atom/A in atoms)
- var/title = "[A] (Range [get_dist(A,src)] meters, [dir2text(get_dir(src,A))])"
- output[title] = A
- return output
-
- /*
- This is used by the camera monitoring program to see if you're still in range
- */
- check_eye(var/mob/user as mob)
- if(!interactable(user) || user.machine != src)
- if(user.machine == src)
- user.unset_machine()
- return null
-
- var/datum/file/program/security/S = program
- if( !istype(S) || !S.current || !S.current.status || !camnet )
- if( user.machine == src )
- user.unset_machine()
- return null
-
- user.reset_perspective(S.current)
- return 1
-
- /*
- List all files, including removable disks and data cards
- (I don't know why but I don't want to rip data cards out.
- It just seems... interesting?)
- */
- proc/list_files(var/typekey = null)
- var/list/files = list()
- if(hdd)
- files += hdd.files
- if(floppy && floppy.inserted)
- files += floppy.inserted.files
- if(cardslot && istype(cardslot.reader,/obj/item/weapon/card/data))
- files += cardslot.reader:files
- if(!ispath(typekey))
- return files
-
- var/i = 1
- while(i<=files.len)
- if(istype(files[i],typekey))
- i++
- continue
- files.Cut(i,i+1)
- return files
-
- /*
- Crash the computer with an error.
- Todo: redo
- */
- proc/Crash(var/errorcode = PROG_CRASH)
- if(!src)
- return null
-
- switch(errorcode)
- if(PROG_CRASH)
- if(usr)
- to_chat(usr, "\red The program crashed!")
- usr << browse(null,"\ref[src]")
- Reset()
-
- if(MISSING_PERIPHERAL)
- Reset()
- if(usr)
- usr << browse("ERROR: Missing or disabled component A hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer. ","window=\ref[src]")
-
- if(BUSTED_ASS_COMPUTER)
- Reset()
- os.error = BUSTED_ASS_COMPUTER
- if(usr)
- usr << browse("ERROR: Missing or disabled component A hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer. ","window=\ref[src]")
-
- if(MISSING_PROGRAM)
- Reset()
- if(usr)
- usr << browse("ERROR: No associated program This file requires a specific program to open, which cannot be located. Please install the related program and try again. ","window=\ref[src]")
-
- if(FILE_DRM)
- Reset()
- if(usr)
- usr << browse("ERROR: File operation prohibited Copy protection exception: missing authorization token. ","window=\ref[src]")
-
- if(NETWORK_FAILURE)
- Reset()
- if(usr)
- usr << browse("ERROR: Networking exception: Unable to connect to remote host.","window=\ref[src]")
-
-
- else
- if(usr)
- to_chat(usr, "\red The program crashed!")
- usr << browse(null,"\ref[src]")
- testing("computer/Crash() - unknown error code [errorcode]")
- Reset()
- return null
-
- #define ANY_DRIVE 0
- #define PREFER_FLOPPY 1
- #define PREFER_CARD 2
- #define PREFER_HDD 4
-
-
- // required_location: only put on preferred devices
- proc/writefile(var/datum/file/F, var/where = ANY_DRIVE, var/required_location = 0)
- if(where != ANY_DRIVE)
- if((where&PREFER_FLOPPY) && floppy && floppy.addfile(F))
- return 1
- if((where&PREFER_CARD) && cardslot && cardslot.addfile(F))
- return 1
- if((where&PREFER_HDD) && hdd && hdd.addfile(F))
- return 1
-
- if(required_location)
- return 0
-
- if(floppy && floppy.addfile(F))
- return 1
- if(cardslot && cardslot.addfile(F))
- return 1
- if(hdd && hdd.addfile(F))
- return 1
- return 0
diff --git a/code/modules/computer3/buildandrepair.dm b/code/modules/computer3/buildandrepair.dm
deleted file mode 100644
index 2165205e354..00000000000
--- a/code/modules/computer3/buildandrepair.dm
+++ /dev/null
@@ -1,302 +0,0 @@
-// Computer3 circuitboard specifically
-/obj/item/part/computer/circuitboard
- density = 0
- anchored = 0
- w_class = 2
- name = "Circuit board"
- icon = 'icons/obj/module.dmi'
- icon_state = "id_mod"
- item_state = "electronic"
- origin_tech = "programming=2"
- var/id = null
- var/frequency = null
- var/build_path = null
- var/board_type = "computer"
- var/list/req_components = null
- var/powernet = null
- var/list/records = null
- var/frame_desc = null
-
- var/datum/file/program/OS = new/datum/file/program/ntos
-
-/obj/machinery/computer3/proc/disassemble(mob/user as mob) // todo
- return
-
-
-/obj/structure/computer3frame
- density = 1
- anchored = 0
- name = "computer frame"
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "0"
- var/state = 0
-
- var/obj/item/part/computer/circuitboard/circuit = null
- var/completed = /obj/machinery/computer
-
- // Computer3 components - a carbon copy of the list from
- // computer.dm; however, we will need to check to make sure
- // we don't install more components than the computer frame
- // can handle. This will be different for certain formfactors.
-
- var/max_components = 4
- var/list/components = list()
-
- // Storage
- var/obj/item/part/computer/storage/hdd/hdd = null
- var/obj/item/part/computer/storage/removable/floppy = null
- // Networking
- var/obj/item/part/computer/networking/radio/radio = null // not handled the same as other networks
- var/obj/item/part/computer/networking/cameras/camnet = null // just plain special
- var/obj/item/part/computer/networking/net = null // Proximity, area, or cable network
- var/obj/item/part/computer/networking/subspace/centcom = null // only for offstation communications
-
- // Card reader - note the HoP reader is a subtype
- var/obj/item/part/computer/cardslot/cardslot = null
-
- // Misc & special purpose
- var/obj/item/part/computer/ai_holder/cradle = null
- var/obj/item/part/computer/toybox/toybox = null
-
- // Battery must be installed BEFORE wiring the computer.
- // if installing it in an existing computer, you will have to
- // get back to this state first.
- var/obj/item/weapon/stock_parts/cell/battery = null
-
-/obj/structure/computer3frame/server
- name = "server frame"
- completed = /obj/machinery/computer3/server
- max_components = 6
-/obj/structure/computer3frame/wallcomp
- name = "wall-computer frame"
- completed = /obj/machinery/computer3/wall_comp
- max_components = 3
-/obj/structure/computer3frame/laptop
- name = "laptop frame"
- completed = /obj/machinery/computer3/laptop
- max_components = 3
-
-/obj/structure/computer3frame/attackby(obj/item/P as obj, mob/user as mob, params)
- switch(state)
- if(0)
- if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- to_chat(user, "\blue You wrench the frame into place.")
- src.anchored = 1
- src.state = 1
- if(istype(P, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = P
- if(!WT.remove_fuel(0, user))
- to_chat(user, "The welding tool must be on to complete this task.")
- return
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "\blue You deconstruct the frame.")
- new /obj/item/stack/sheet/metal( src.loc, 5 )
- qdel(src)
- if(1)
- if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- to_chat(user, "\blue You unfasten the frame.")
- src.anchored = 0
- src.state = 0
- if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
- var/obj/item/weapon/circuitboard/B = P
- if(B.board_type == "computer")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- to_chat(user, "\blue You place the circuit board inside the frame.")
- src.icon_state = "1"
- src.circuit = P
- user.drop_item()
- P.loc = src
- else
- to_chat(user, "\red This frame does not accept circuit boards of this type!")
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "\blue You screw the circuit board into place.")
- src.state = 2
- src.icon_state = "2"
- if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- to_chat(user, "\blue You remove the circuit board.")
- src.state = 1
- src.icon_state = "0"
- circuit.loc = src.loc
- src.circuit = null
- if(2)
- if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "\blue You unfasten the circuit board.")
- src.state = 1
- src.icon_state = "1"
-
- if(istype(P, /obj/item/weapon/crowbar))
- if(battery)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(10, target = src))
- battery.loc = loc
- to_chat(user, "\blue You remove [battery].")
- battery = null
- else
- to_chat(user, "\red There's no battery to remove!")
-
- if(istype(P, /obj/item/weapon/stock_parts/cell))
- if(!battery)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(5, target = src))
- battery = P
- P.loc = src
- to_chat(user, "\blue You insert [battery].")
- else
- to_chat(user, "\red There's already \an [battery] in [src]!")
-
-
- if(istype(P, /obj/item/stack/cable_coil))
- if(P:amount >= 5)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- if(P)
- P:amount -= 5
- if(!P:amount) qdel(P)
- to_chat(user, "\blue You add cables to the frame.")
- src.state = 3
- src.icon_state = "3"
- if(3)
- if(istype(P, /obj/item/weapon/wirecutters))
- if(components.len)
- to_chat(user, "There are parts in the way!")
- return
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- to_chat(user, "\blue You remove the cables.")
- src.state = 2
- src.icon_state = "2"
- var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
- A.amount = 5
-
- if(istype(P, /obj/item/weapon/crowbar)) // complicated check
- remove_peripheral()
-
- if(istype(P, /obj/item/stack/sheet/glass))
- if(P:amount >= 2)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
- if(P)
- P:use(2)
- to_chat(user, "\blue You put in the glass panel.")
- src.state = 4
- src.icon_state = "4"
- if(4)
- if(istype(P, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- to_chat(user, "\blue You remove the glass panel.")
- src.state = 3
- src.icon_state = "3"
- new /obj/item/stack/sheet/glass( src.loc, 2 )
- if(istype(P, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "\blue You connect the monitor.")
- var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 )
- /*if(circuit.powernet) B:powernet = circuit.powernet
- if(circuit.id) B:id = circuit.id
- //if(circuit.records) B:records = circuit.records
- if(circuit.frequency) B:frequency = circuit.frequency
- if(istype(circuit,/obj/item/weapon/circuitboard/supplycomp))
- var/obj/machinery/computer/supplycomp/SC = B
- var/obj/item/weapon/circuitboard/supplycomp/C = circuit
- SC.can_order_contraband = C.contraband_enabled*/
- B.circuit = circuit
- circuit.loc = B
- if(circuit.OS)
- circuit.OS.computer = B
- B.RefreshParts() // todo
- qdel(src)
-
-/*
- This will remove peripherals if you specify one, but the main function is to
- allow the user to remove a part specifically.
-*/
-/obj/structure/computer3frame/proc/remove_peripheral(var/obj/item/I = null)
- if(!components || !components.len)
- to_chat(usr, "\red There are no components in [src] to take out!")
- return 0
- if(!I)
- I = input(usr, "Remove which component?","Remove component", null) as null|obj in components
-
- if(I)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(usr,25, target = src))
- if(I==hdd)
- components -= hdd
- hdd.loc = loc
- hdd = null
- else if(I==floppy)
- components -= floppy
- floppy.loc = loc
- floppy = null
- else if(I==radio)
- components -= radio
- radio.loc = loc
- radio = null
- else if(I==camnet)
- components -= camnet
- camnet.loc = loc
- camnet = null
- else if(I==net)
- components -= net
- net.loc = loc
- net = null
- else if(I==cradle)
- components -= cradle
- cradle.loc = loc
- cradle = null
- else if(I==toybox)
- components -= toybox
- toybox.loc = loc
- toybox = null
- else
- warning("Erronous component in computerframe/remove_peripheral: [I]")
- I.loc = loc
- to_chat(usr, "\blue You remove [I]")
- return 1
- return 0
-/obj/structure/computer3frame/proc/insert_peripheral(var/obj/item/I)
- if(components.len >= max_components)
- to_chat(usr, "There isn't room in [src] for another component!")
- return 0
- switch(I.type)
- if(/obj/item/part/computer/storage/hdd)
- if(hdd)
- to_chat(usr, "There is already \an [hdd] in [src]!")
- return 0
- hdd = I
- components += hdd
- hdd.loc = src
- if(/obj/item/part/computer/storage/removable)
- if(floppy)
- to_chat(usr, "There is already \an [floppy] in [src]!")
- return 0
- floppy = I
- components += floppy
- floppy.loc = src
- if(/obj/item/part/computer/networking/radio)
- if(radio)
- to_chat(usr, "There is already \an [radio] in [src]!")
- return 0
- radio = I
- components += radio
- radio.loc = src
- if(/obj/item/part/computer/networking/cameras)
- if(camnet)
- to_chat(usr, "There is already \an [camnet] in [src]!")
- return 0
- camnet = I
- components += camnet
- camnet.loc = src
- if(/obj/item/part/computer/networking)
- if(net)
- to_chat(usr, "There is already \an [net] in [src]!")
-
-
diff --git a/code/modules/computer3/component.dm b/code/modules/computer3/component.dm
deleted file mode 100644
index 0070c057fcd..00000000000
--- a/code/modules/computer3/component.dm
+++ /dev/null
@@ -1,294 +0,0 @@
-
-/*
- Objects used to construct computers, and objects that can be inserted into them, etc.
-
- TODO:
- * Synthesizer part (toybox, injectors, etc)
-*/
-
-
-
-/obj/item/part/computer
- name = "computer part"
- desc = "Holy jesus you donnit now"
- gender = PLURAL
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "hdd1"
- w_class = 2
-
- var/emagged = 0
- crit_fail = 0
-
- // the computer that this device is attached to
- var/obj/machinery/computer3/computer
-
- // If the computer is attacked by an item it will reference this to decide which peripheral(s) are affected.
- var/list/attackby_types = list()
- proc/allow_attackby(var/obj/item/I as obj,var/mob/user as mob, params)
-
- for(var/typekey in attackby_types)
- if(istype(I,typekey))
- return 1
- return 0
-
- proc/init(var/obj/machinery/computer/target)
- computer = target
- // continue to handle all other type-specific procedures
-
-/*
- Below are all the miscellaneous components
- For storage drives, see storage.dm
- For networking parts, see
-*/
-
-/obj/item/part/computer/ai_holder
- name = "intelliCard computer module"
- desc = "Contains a specialized nacelle for dealing with highly sensitive equipment without interference."
-
- attackby_types = list(/obj/item/device/aicard)
-
- var/mob/living/silicon/ai/occupant = null
- var/busy = 0
-
- attackby(obj/I as obj,mob/user as mob, params)
- if(computer && !computer.stat)
- if(istype(I, /obj/item/device/aicard))
- I:transfer_ai("AIFIXER","AICARD",src,user)
- if(computer.program)
- computer.program.update_icon()
- computer.update_icon()
- computer.occupant = occupant
- ..()
- return
-
-/*
- ID computer cardslot - reading and writing slots
-*/
-
-/obj/item/part/computer/cardslot
- name = "magnetic card slot"
- desc = "Contains a slot for reading magnetic swipe cards."
-
- var/obj/item/weapon/card/reader = null
- var/obj/item/weapon/card/writer = null // so that you don't need to typecast dual cardslots, but pretend it's not here
- // alternately pretend they did it to save money on manufacturing somehow
- var/dualslot = 0 // faster than typechecking
- attackby_types = list(/obj/item/weapon/card)
-
- emag_act(user as mob)
- if(!writer)
- to_chat(usr, "You insert \the card, and the computer grinds, sparks, and beeps. After a moment, the card ejects itself.")
- computer.emagged = 1
- return 1
- else
- to_chat(usr, "You are unable to insert \the card, as the reader slot is occupied")
- return 0
-
- attackby(var/obj/item/I as obj, var/mob/user as mob, params)
- if(istype(I,/obj/item/weapon/card))
- insert(I)
- return
- ..(I,user)
-
- // cardslot.insert(card, slot)
- // card: The card obj you want to insert (usually your ID)
- // slot: Which slot to insert into (1: reader, 2: writer, 3: auto), 3 default
- proc/insert(var/obj/item/weapon/card/card, var/slot = 3)
- if(!computer)
- return 0
- // This shouldn't happen, just in case..
- if(slot == 2 && !dualslot)
- to_chat(usr, "This device has only one card slot")
- return 0
-
- var/mob/living/L = usr
- switch(slot)
- if(1)
- if(equip_to_reader(card, L))
- to_chat(usr, "You insert the card into reader slot")
- else
- to_chat(usr, "There is already something in the reader slot.")
- if(2)
- if(equip_to_writer(card, L))
- to_chat(usr, "You insert the card into writer slot")
- else
- to_chat(usr, "There is already something in the reader slot.")
- if(3)
- if(equip_to_reader(card, L))
- to_chat(usr, "You insert the card into reader slot")
- else if(equip_to_writer(card, L) && dualslot)
- to_chat(usr, "You insert the card into writer slot")
- else if(dualslot)
- to_chat(usr, "There is already something in both slots.")
- else
- to_chat(usr, "There is already something in the reader slot.")
-
- // Usage of insert() preferred, as it also tells result to the user.
- proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L)
- if(!reader)
- L.drop_item()
- card.loc = src
- reader = card
- return 1
- return 0
-
- proc/equip_to_writer(var/obj/item/weapon/card/card, var/mob/living/L)
- if(!writer && dualslot)
- L.drop_item()
- card.loc = src
- writer = card
- return 1
- return 0
-
- // cardslot.remove(slot)
- // slot: Which slot to remove card(s) from (1: reader only, 2: writer only, 3: both [works even with one card], 4: reader and if empty then writer ), 3 default
- proc/remove(var/slot = 3)
- var/mob/living/L = usr
- switch(slot)
- if(1)
- if(remove_reader(L))
- to_chat(L, "You remove the card from reader slot")
- else
- to_chat(L, "There is no card in the reader slot")
- if(2)
- if(remove_writer(L))
- to_chat(L, "You remove the card from writer slot")
- else
- to_chat(L, "There is no card in the writer slot")
- if(3)
- if(remove_reader(L))
- if(remove_writer(L))
- to_chat(L, "You remove cards from both slots")
- else
- to_chat(L, "You remove the card from reader slot")
- else
- if(remove_writer(L))
- to_chat(L, "You remove the card from writer slot")
- else
- to_chat(L, "There are no cards in both slots")
- if(4)
- if(!remove_reader(L))
- if(remove_writer(L))
- to_chat(L, "You remove the card from writer slot")
- else if(!dualslot)
- to_chat(L, "There is no card in the reader slot")
- else
- to_chat(L, "There are no cards in both slots")
- else
- to_chat(L, "You remove the card from reader slot")
-
-
- proc/remove_reader(var/mob/living/L)
- if(reader)
- reader.loc = loc
- if(istype(L) && !L.get_active_hand())
- L.put_in_hands(reader)
- else
- reader.loc = computer.loc
- reader = null
- return 1
- return 0
-
- proc/remove_writer(var/mob/living/L)
- if(writer && dualslot)
- writer.loc = loc
- if(istype(L) && !L.get_active_hand())
- L.put_in_hands(writer)
- else
- writer.loc = computer.loc
- writer = null
- return 1
- return 0
-
-
-
-
- // Authorizes the user based on the computer's requirements
- proc/authenticate()
- return computer.check_access(reader)
-
- proc/addfile(var/datum/file/F)
- if(!dualslot || !istype(writer,/obj/item/weapon/card/data))
- return 0
- var/obj/item/weapon/card/data/D = writer
- if(D.files.len > 3)
- return 0
- D.files += F
- return 1
-
-/obj/item/part/computer/cardslot/dual
- name = "magnetic card reader"
- desc = "Contains slots for inserting magnetic swipe cards for reading and writing."
- dualslot = 1
-
-
- /*
- // Atlantis: Reworked card manipulation a bit.
- // No need for separated code for dual and single readers.
- // Both is handled in single-slot reader code now, thanks to the "dualslot" var.
- // Leaving this code here if someone wants to somehow use it, just uncomment.
-
- insert(var/obj/item/weapon/card/card,var/slot = 0)
- if(!computer)
- return 0
-
- if(istype(card,/obj/item/weapon/card/emag) && !reader) // emag reader slot
- usr.visible_message("[computer]'s screen flickers for a moment.","You insert \the [card]. After a moment, the card ejects itself, and [computer] beeps.","[computer] beeps.")
- computer.emagged = 1
- return 1
-
- if(slot == 1) // 1: writer
- if(writer != null)
- to_chat(usr, "There's already a card in that slot!")
- return 0
- var/mob/living/L = usr
- L.drop_item()
- card.loc = src
- writer = card
- return 1
- else if(slot == 2) // 2: reader
- if(reader != null)
- to_chat(usr, "There's already a card in that slot!")
- return 0
- var/mob/living/L = usr
- L.drop_item()
- card.loc = src
- reader = card
- return 1
- else // 0: auto
- if(reader && writer)
- to_chat(usr, "Both slots are full!")
- return 0
- var/mob/living/L = usr
- L.drop_item()
- card.loc = src
- if(reader)
- writer = card
- computer.updateUsrDialog()
- return 1
- if(istype(card,/obj/item/weapon/card/id) && !(access_change_ids in card:access) && !writer) // not authorized
- writer = card
- computer.updateUsrDialog()
- return 1
- if(!reader)
- reader = card
- computer.updateUsrDialog()
- return 1
- return 0
-
- remove(var/obj/item/weapon/card/card)
- if(card != reader && card != writer)
- return
-
- if(card == reader) reader = null
- if(card == writer) writer = null
- card.loc = loc
-
- var/mob/living/carbon/human/user = usr
- if(ishuman(user) && !user.get_active_hand())
- user.put_in_hands(card)
- else
- card.loc = computer.loc
-*/
-
-
diff --git a/code/modules/computer3/computer.dm b/code/modules/computer3/computer.dm
deleted file mode 100644
index eca1207c692..00000000000
--- a/code/modules/computer3/computer.dm
+++ /dev/null
@@ -1,460 +0,0 @@
-/obj/machinery/computer3
- name = "computer"
- icon = 'icons/obj/computer3.dmi'
- icon_state = "frame"
- density = 1
- anchored = 1.0
-
- idle_power_usage = 20
- active_power_usage = 50
-
- var/allow_disassemble = 1
- var/legacy_icon = 0 // if 1, use old style icons
- var/show_keyboard = 1
-
- // These is all you should need to change when creating a new computer.
- // If there is no default program, the OS will run instead.
- // If there is no hard drive, but there is a default program, the OS rom on
- // the circuitboard will be overridden.
-
- // For these, typepaths are used, NOT objects
-
- var/default_prog = null // the program running when spawned
- var/list/spawn_files = list() // files added when spawned
- var/list/spawn_parts = list(/obj/item/part/computer/storage/hdd/big) // peripherals to spawn
-
- // Computer3 components - put an object in them in New() when not built
- // I used to have a more pliable /list, but the ambiguities
- // there in how many of what you had was killing me, especially
- // when you had to search the list to find what you had.
-
- // Mostly decorative, holds the OS rom
- var/obj/item/part/computer/circuitboard/circuit
-
- // Storage
- var/obj/item/part/computer/storage/hdd/hdd = null
- var/obj/item/part/computer/storage/removable/floppy = null
- // Networking
- var/obj/item/part/computer/networking/radio/radio = null // not handled the same as other networks
- var/obj/item/part/computer/networking/cameras/camnet = null // just plain special
- var/obj/item/part/computer/networking/net = null // Proximity, area, or cable network
-
- // Card reader - note the HoP reader is a subtype
- var/obj/item/part/computer/cardslot/cardslot = null
-
- // Misc & special purpose
- var/obj/item/part/computer/ai_holder/cradle = null
- var/obj/item/part/computer/toybox/toybox = null
- var/mob/living/silicon/ai/occupant = null
-
-
- // Legacy variables
- // camera networking - overview (???)
- var/mapping = 0
- var/last_pic = 1.0
-
- // Purely graphical effect
- var/icon/kb = null
-
- // These are necessary in order to consolidate all computer types into one
- var/datum/wires/wires = null
- var/powernet = null
-
- // Used internally
- var/datum/file/program/program = null // the active program (null if defaulting to os)
- var/datum/file/program/os = null // the base code of the machine (os or hardcoded program)
-
- // If you want the computer to have a UPS, add a battery during construction. This is useful for things like
- // the comms computer, solar trackers, etc, that should function when all else is off.
- // Laptops will require batteries and have no mains power.
-
- var/obj/item/weapon/stock_parts/cell/battery = null // uninterruptible power supply aka battery
-
-
- verb/ResetComputer()
- set name = "Reset Computer"
- set category = "Object"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
- to_chat(usr, "\red You can't do that.")
- return
-
- if(!Adjacent(usr))
- to_chat(usr, "You can't reach it.")
- return
-
- Reset()
-
- New(var/L, var/built = 0)
- ..()
- spawn(2)
- power_change()
-
- if(show_keyboard)
- var/kb_state = "kb[rand(1,15)]"
- kb = image('icons/obj/computer3.dmi',icon_state=kb_state)
- overlays += kb
-
- if(!built)
- if(!circuit || !istype(circuit))
- circuit = new(src)
- if(circuit.OS)
- os = circuit.OS
- circuit.OS.computer = src
- else
- os = null
-
- // separated into its own function because blech
- spawn_parts()
-
- if(default_prog) // Add the default software if applicable
- var/datum/file/program/P = new default_prog
- if(hdd)
- hdd.addfile(P,1)
- program = P
- if(!os)
- os = P
- else if(floppy)
- floppy.inserted = new(floppy)
- floppy.files = floppy.inserted.files
- floppy.addfile(P)
- program = P
- else
- circuit.OS = P
- circuit.OS.computer = src
- os = circuit.OS
- circuit.name = "Circuitboard ([P])"
-
-
- if(hdd) // Spawn files
- for(var/typekey in spawn_files)
- hdd.addfile(new typekey,1)
-
- if(program)
- program.execute(os)
- update_icon()
-
-
- proc/update_spawn_files()
- for(var/typekey in spawn_files)
- hdd.addfile(new typekey,1)
-
- proc/spawn_parts()
- for(var/typekey in spawn_parts)
-
- if(ispath(typekey,/obj/item/part/computer/storage/removable))
- if(floppy) continue
- floppy = new typekey(src)
- floppy.init(src)
- continue
- if(ispath(typekey,/obj/item/part/computer/storage/hdd))
- if(hdd) continue
- hdd = new typekey(src)
- hdd.init(src)
- continue
-
- if(ispath(typekey,/obj/item/part/computer/networking/cameras))
- if(camnet) continue
- camnet = new typekey(src)
- camnet.init(src)
- continue
- if(ispath(typekey,/obj/item/part/computer/networking/radio))
- if(radio) continue
- radio = new typekey(src)
- radio.init(src)
- continue
- if(ispath(typekey,/obj/item/part/computer/networking))
- if(net) continue
- net = new typekey(src)
- net.init(src)
- continue
-
- if(ispath(typekey,/obj/item/part/computer/cardslot))
- if(cardslot) continue
- cardslot = new typekey(src)
- cardslot.init(src)
- continue
- if(ispath(typekey,/obj/item/part/computer/ai_holder))
- if(cradle) continue
- cradle = new typekey(src)
- cradle.init(src)
- if(ispath(typekey,/obj/item/part/computer/toybox))
- if(toybox) continue
- toybox = new typekey(src)
- toybox.init(src)
- continue
-
- if(ispath(typekey,/obj/item/weapon/stock_parts/cell))
- if(battery) continue
- battery = new typekey(src)
- continue
-
- proc/Reset(var/error = 0)
- for(var/mob/living/M in range(1))
- M << browse(null,"window=\ref[src]")
- if(program)
- program.Reset()
- program = null
- req_access = os.req_access
- update_icon()
-
- // todo does this do enough
-
- emp_act(severity)
- if(prob(20/severity)) set_broken()
- ..()
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
- if(prob(25))
- qdel(src)
- return
- if(prob(50))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- if(3.0)
- if(prob(25))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- else
- return
-
-
- blob_act()
- if(prob(75))
- set_broken()
- density = 0
-
- /*
- Computers have the capability to use a battery backup.
- Note that auto_use_power's return value is strictly whether
- or not it is successfully powered.
-
- This allows laptops, and also allows you to create computers that
- remain active when:
-
- * the APC is destroy'd, emag'd, malf'd, emp'd, ninja'd etc
- * the computer was built in an unpowered zone
- * the station power is out, cables are cut, etc
-
- By default, most computers will NOT spawn with a battery backup, and
- SHOULD not. Players can take apart a computer to insert the battery
- if they want to ensure, for example, the AI upload remains when the
- power is cut off.
-
- Make sure to use use_power() a bunch in peripherals code
- */
- auto_use_power()
- if(!powered(power_channel))
- if(battery && battery.charge > 0)
- if(use_power == 1)
- battery.use(idle_power_usage)
- else
- battery.use(active_power_usage)
- return 1
- return 0
- if(src.use_power == 1)
- use_power(idle_power_usage,power_channel)
- else if(src.use_power >= 2)
- use_power(active_power_usage,power_channel)
- return 1
-
- use_power(var/amount, var/chan = -1)
- if(chan == -1)
- chan = power_channel
-
- var/area/A = get_area(loc)
- if(istype(A) && A.powered(chan))
- A.use_power(amount, chan)
- else if(battery && battery.charge > 0)
- battery.use(amount)
-
- power_change()
- if( !powered(power_channel) && (!battery || battery.charge <= 0) )
- stat |= NOPOWER
- else
- stat &= ~NOPOWER
-
- process()
- auto_use_power()
- power_change()
- update_icon()
- if(stat & (NOPOWER|BROKEN))
- return
-
- if(program)
- program.process()
- return
-
- if(os)
- program = os
- os.process()
- return
-
-
- proc/set_broken()
- icon_state = "computer_b"
- stat |= BROKEN
- crit_fail = 1
- if(program)
- program.error = BUSTED_ASS_COMPUTER
- if(os)
- os.error = BUSTED_ASS_COMPUTER
-
- attackby(I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/weapon/screwdriver) && allow_disassemble)
- disassemble(user)
- return
-
- /*
- +++++++++++
- |IMPORTANT| If you add a peripheral, put it in this list
- +++++++++++ --------------------------------------------
- */
- var/list/peripherals = list(hdd,floppy,radio,net,cardslot,cradle) //camnet, toybox removed
-
- var/list/p_list = list()
- for(var/obj/item/part/computer/C in peripherals)
- if(!isnull(C) && C.allow_attackby(I,user))
- p_list += C
- if(p_list.len)
- var/obj/item/part/computer/P = null
- if(p_list.len == 1)
- P = p_list[1]
- else
- P = input(user,"Which component?") as null|anything in p_list
-
- if(P)
- P.attackby(I,user, params)
- return
- ..()
-
- attack_hand(var/mob/user as mob)
- if(stat)
- Reset()
- return
-
- // I don't want to deal with computers that you can't walk up to and use
- // there is still cardauth anyway
- //if(!allowed(user))
- // return
-
- if(program)
- if(program.computer != src) // floppy disk may have been removed, etc
- Reset()
- attack_hand(user)
- return
- if(program.error)
- Crash(program.error)
- return
- user.set_machine(src)
- program.attack_hand(user) // will normally translate to program/interact()
- return
-
- if(os)
- program = os
- user.set_machine(src)
- os.attack_hand(user)
- return
-
- to_chat(user, "\The [src] won't boot!")
-
- attack_ai(var/mob/user as mob) // copypasta because server racks lose attack_hand()
- if(stat)
- Reset()
- return
-
- if(program)
- if(program.computer != src) // floppy disk may have been removed, etc
- Reset()
- attack_ai(user)
- return
- if(program.error)
- Crash(program.error)
- return
- user.set_machine(src)
- program.attack_hand(user) // will normally translate to program/interact()
- return
-
- if(os)
- program = os
- user.set_machine(src)
- os.attack_hand(user)
- return
-
- to_chat(user, "\The [src] won't boot!")
-
- interact()
- if(stat)
- Reset()
- return
- if(!allowed(usr) || !usr in view(1))
- usr.unset_machine()
- return
-
- if(program)
- program.interact()
- return
-
- if(os)
- program = os
- os.interact()
- return
-
- update_icon()
- if(legacy_icon)
- icon_state = initial(icon_state)
- // Broken
- if(stat & BROKEN)
- icon_state += "b"
-
- // Powered
- else if(stat & NOPOWER)
- icon_state = initial(icon_state)
- icon_state += "0"
- return
- if(stat)
- overlays.Cut()
- return
- if(program)
- overlays = list(program.overlay)
- if(show_keyboard)
- overlays += kb
- name = "[program.name] [initial(name)]"
- else if(os)
- overlays = list(os.overlay)
- if(show_keyboard)
- overlays += kb
- name = initial(name)
- else
- var/global/image/generic = image('icons/obj/computer3.dmi',icon_state="osod") // orange screen of death
- overlays = list(generic)
- if(show_keyboard)
- overlays += kb
- name = initial(name) + " (orange screen of death)"
-
- //Returns percentage of battery charge remaining. Returns -1 if no battery is installed.
- proc/check_battery_status()
- if(battery)
- var/obj/item/weapon/stock_parts/cell/B = battery
- return round(B.charge / (B.maxcharge / 100))
- else
- return -1
-
-
-
-/obj/machinery/computer3/wall_comp
- name = "terminal"
- icon = 'icons/obj/computer3.dmi'
- icon_state = "wallframe"
- density = 0
- pixel_y = -3
- show_keyboard = 0
diff --git a/code/modules/computer3/computer3_notes.dm b/code/modules/computer3/computer3_notes.dm
deleted file mode 100644
index c27410e6375..00000000000
--- a/code/modules/computer3/computer3_notes.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- 1. Do NOT confuse Computer.Crash(errorcode) with byond CRASH(message)
- 2 Do NOT talk about fight club.
- 3 If this if your first night here, you have to crash the computer.
- 4 Where am I?
- 5 Someone help me, please...
- 6. Be sure to use computer.use_power() appropriately. Laptops should run out of battery occasionally.
- 7 Everyone fights, no-one quits. If you don't do your job, I'll crash you myself.
- 6 Don't allow more than 42 angels to dance on the head of a pin.
- 5. Once a computer has spawned, they are just like the rest, except when they aren't.
- 4 Get me four glasses of apple juice.
- 3. Components are only added or removed when disassembled and rebuilt. However, they may be EMP'd.
- 2 Only you can prevent friendly fire.
- 1 Do not talk about fight club.
- 2. If a component subtype needs to be handled separately (removable drives, radio networks), declare it separately.
- 3 Television rules the nation
- 4. interactable() does all the sanity checks, adds fingerprints, sets machines, initializes popup, and makes a damn fine pot of coffee.
- 5 Love conquers all.
- 6 If at all possible, do a barrel roll.
- 7. Don't forget to use the network verify function to make sure you still have access to remote machines.
-
-
-
-
- TODO:
- * "Nothing left to call the shuttle" check
- * Communications terminal printing - move it to a printer of some sort? Make a printer peripheral--but then which ones print the comms?
- * Remove the partially transparent border on program screens, as it clashes with some frames
- * Chop the corners on program screens now that screen sizes are standard
- * ntos:
- * Needs a text editor/viewer
- * Needs file copy and file move - I think I know how I'm gonna do it
- * Needs a peripheral view (eject disks and cards, network actions, ???)
-*/
\ No newline at end of file
diff --git a/code/modules/computer3/computers/HolodeckControl.dm b/code/modules/computer3/computers/HolodeckControl.dm
deleted file mode 100644
index dc4c71a0f90..00000000000
--- a/code/modules/computer3/computers/HolodeckControl.dm
+++ /dev/null
@@ -1,254 +0,0 @@
-/obj/machinery/computer3/HolodeckControl
- default_prog = /datum/file/program/holodeck
-
-
-// Todo: I personally would like to add a second holodeck in the theater for making appropriate playgrounds.
-// perhaps a holodeck association keyfile?
-// One more thing while I'm here
-// C3 allows multiple computers to run this program, but it was designed on the assumption that only one would, ever
-// I am not going to add or remove anything right now, I'm just porting it
-
-
-/datum/file/program/holodeck
- name = "holodeck control console"
- desc = "Used to control a nearby holodeck."
- active_state = "holocontrol"
- var/area/linkedholodeck = null
- var/area/target = null
- var/active = 0
- var/list/holographic_items = list()
- var/damaged = 0
- var/last_change = 0
- var/emagged = 0
-
-
- interact()
- if(!interactable())
- return
- var/dat = "Current Loaded Programs "
- dat += "((Empty Court)) "
- dat += "((Boxing Court)) "
- dat += "((Basketball Court)) "
- dat += "((Thunderdome Court)) "
- dat += "((Beach)) "
-// dat += "((Shutdown System)) "
-
- dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded. "
-
- if(emagged)
- dat += "(Begin Atmospheric Burn Simulation ) "
- dat += "Ensure the holodeck is empty before testing. "
- dat += " "
- dat += "(Begin Wildlife Simulation ) "
- dat += "Ensure the holodeck is empty before testing. "
- dat += " "
- if(issilicon(usr))
- dat += "(Re-Enable Safety Protocols? ) "
- dat += "Safety Protocols are DISABLED "
- else
- if(issilicon(usr))
- dat += "(Override Safety Protocols? ) "
- dat += " "
- dat += "Safety Protocols are ENABLED "
-
- popup.set_content(dat)
- popup.open()
- return
-
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if("emptycourt" in href_list)
- target = locate(/area/holodeck/source_emptycourt)
- if(target)
- loadProgram(target)
-
- else if("boxingcourt" in href_list)
- target = locate(/area/holodeck/source_boxingcourt)
- if(target)
- loadProgram(target)
-
- else if("basketball" in href_list)
- target = locate(/area/holodeck/source_basketball)
- if(target)
- loadProgram(target)
-
- else if("thunderdomecourt" in href_list)
- target = locate(/area/holodeck/source_thunderdomecourt)
- if(target)
- loadProgram(target)
-
- else if("beach" in href_list)
- target = locate(/area/holodeck/source_beach)
- if(target)
- loadProgram(target)
-
- else if("turnoff" in href_list)
- target = locate(/area/holodeck/source_plating)
- if(target)
- loadProgram(target)
-
- else if("burntest" in href_list)
- if(!emagged) return
- target = locate(/area/holodeck/source_burntest)
- if(target)
- loadProgram(target)
-
- else if("wildlifecarp" in href_list)
- if(!emagged) return
- target = locate(/area/holodeck/source_wildlife)
- if(target)
- loadProgram(target)
-
- else if("AIoverride" in href_list)
- if(!issilicon(usr)) return
- emagged = !emagged
- if(emagged)
- message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
- log_game("[key_name(usr)] overrided the holodeck's safeties")
- else
- message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
- log_game("[key_name(usr)] restored the holodeck's safeties")
-
- interact()
- return
-
- Reset()
- emergencyShutdown()
-
- process()
- if(active)
- if(!checkInteg(linkedholodeck))
- damaged = 1
- target = locate(/area/holodeck/source_plating)
- if(target)
- loadProgram(target)
- active = 0
- for(var/mob/M in range(10,src))
- M.show_message("The holodeck overloads!")
-
-
- for(var/turf/T in linkedholodeck)
- if(prob(30))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(2, 1, T)
- s.start()
- T.ex_act(3)
- T.hotspot_expose(1000,500,1)
-
-
- for(var/item in holographic_items)
- if(!(get_turf(item) in linkedholodeck))
- derez(item, 0)
-
-
-
- proc/derez(var/obj/obj , var/silent = 1)
- holographic_items.Remove(obj)
-
- if(obj == null)
- return
-
- if(isobj(obj))
- var/mob/M = obj.loc
- if(ismob(M))
- M.unEquip(obj)
- M.update_icons() //so their overlays update
-
- if(!silent)
- var/obj/oldobj = obj
- obj.visible_message("The [oldobj.name] fades away!")
- qdel(obj)
-
- proc/checkInteg(var/area/A)
- for(var/turf/T in A)
- if(istype(T, /turf/space))
- return 0
-
- return 1
-
- proc/togglePower(var/toggleOn = 0)
-
- if(toggleOn)
- var/area/targetsource = locate(/area/holodeck/source_emptycourt)
- holographic_items = targetsource.copy_contents_to(linkedholodeck)
-
- spawn(30)
- for(var/obj/effect/landmark/L in linkedholodeck)
- if(L.name=="Atmospheric Test Start")
- spawn(20)
- var/turf/T = get_turf(L)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(2, 1, T)
- s.start()
- if(T)
- T.temperature = 5000
- T.hotspot_expose(50000,50000,1)
-
- active = 1
- else
- for(var/item in holographic_items)
- derez(item)
- var/area/targetsource = locate(/area/holodeck/source_plating)
- targetsource.copy_contents_to(linkedholodeck , 1)
- active = 0
-
-
- proc/loadProgram(var/area/A)
-
- if(world.time < (last_change + 25))
- if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
- return
- for(var/mob/M in range(3,src))
- M.show_message("\b ERROR. Recalibrating projetion apparatus.")
- last_change = world.time
- return
-
- last_change = world.time
- active = 1
-
- for(var/item in holographic_items)
- derez(item)
-
- for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
- qdel(B)
-
- for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
- qdel(C)
-
- holographic_items = A.copy_contents_to(linkedholodeck , 1)
-
- if(emagged)
- for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
- H.damtype = BRUTE
-
- spawn(30)
- for(var/obj/effect/landmark/L in linkedholodeck)
- if(L.name=="Atmospheric Test Start")
- spawn(20)
- var/turf/T = get_turf(L)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(2, 1, T)
- s.start()
- if(T)
- T.temperature = 5000
- T.hotspot_expose(50000,50000,1)
- if(L.name=="Holocarp Spawn")
- new /mob/living/simple_animal/hostile/carp(L.loc)
-
-
- proc/emergencyShutdown()
- //Get rid of any items
- for(var/item in holographic_items)
- derez(item)
- //Turn it back to the regular non-holographic room
- target = locate(/area/holodeck/source_plating)
- if(target)
- loadProgram(target)
-
- var/area/targetsource = locate(/area/holodeck/source_plating)
- targetsource.copy_contents_to(linkedholodeck , 1)
- active = 0
-
diff --git a/code/modules/computer3/computers/Operating.dm b/code/modules/computer3/computers/Operating.dm
deleted file mode 100644
index 0f989780d71..00000000000
--- a/code/modules/computer3/computers/Operating.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/obj/machinery/computer3/operating
- default_prog = /datum/file/program/op_monitor
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/prox)
- icon_state = "frame-med"
-
-/datum/file/program/op_monitor
- name = "operating table monitor"
- desc = "Monitors patient status during surgery."
- active_state = "operating"
- var/mob/living/carbon/human/patient = null
- var/obj/machinery/optable/table = null
-
-
-/datum/file/program/op_monitor/interact()
- if(!interactable())
- return
- if(!computer.net)
- computer.Crash(MISSING_PERIPHERAL)
- return
- table = computer.net.connect_to(/obj/machinery/optable,table)
-
- var/dat = ""
- if(table)
- dat += "Patient information: "
- if(src.table && (src.table.check_victim()))
- src.patient = src.table.victim
- dat += {"Patient Status: [patient.stat ? "Non-Responsive" : "Stable"]
- Blood Type: [patient.b_type]
-
- Health: [round(patient.health)]
- Brute Damage: [round(patient.getBruteLoss())]
- Toxins Damage: [round(patient.getToxLoss())]
- Fire Damage: [round(patient.getFireLoss())]
- Suffocation Damage: [round(patient.getOxyLoss())]
- "}
- else
- src.patient = null
- dat += "No patient detected "
- else
- dat += "Operating table not found. "
-
- popup.set_content(dat)
- popup.open()
-/datum/file/program/op_monitor/Topic()
- if(!interactable())
- return
- ..()
\ No newline at end of file
diff --git a/code/modules/computer3/computers/aifixer.dm b/code/modules/computer3/computers/aifixer.dm
deleted file mode 100644
index 7e1f3959e9f..00000000000
--- a/code/modules/computer3/computers/aifixer.dm
+++ /dev/null
@@ -1,117 +0,0 @@
-/obj/machinery/computer3/aifixer
- default_prog = /datum/file/program/aifixer
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/ai_holder)
- icon_state = "frame-rnd"
-
-
-/datum/file/program/aifixer
- name = "AI system integrity restorer"
- desc = "Repairs and revives artificial intelligence cores."
- image = 'icons/ntos/airestore.png'
- active_state = "ai-fixer-empty"
- req_access = list(access_captain, access_robotics, access_heads)
-
- update_icon()
- if(!computer || !computer.cradle)
- overlay.icon_state = "ai-fixer-404"
- return // what
-
- if(!computer.cradle.occupant)
- overlay.icon_state = "ai-fixer-empty"
- else
- if(computer.cradle.occupant.health >= 0 && computer.cradle.occupant.stat != 2)
- overlay.icon_state = "ai-fixer-full"
- else
- overlay.icon_state = "ai-fixer-404"
- computer.update_icon()
-
- interact()
- if(!interactable())
- return
-
- if(!computer.cradle)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- popup.set_content(aifixer_menu())
- popup.open()
- return
-
- proc/aifixer_menu()
- var/dat = ""
- if(computer.cradle.occupant)
- var/laws
- dat += "Stored AI: [computer.cradle.occupant.name] "
- dat += "System integrity: [(computer.cradle.occupant.health+100)/2]% "
-
- if(computer.cradle.occupant.laws.zeroth)
- laws += "0: [computer.cradle.occupant.laws.zeroth] "
-
- var/number = 1
- for(var/index = 1, index <= computer.cradle.occupant.laws.inherent.len, index++)
- var/law = computer.cradle.occupant.laws.inherent[index]
- if(length(law) > 0)
- laws += "[number]: [law] "
- number++
-
- for(var/index = 1, index <= computer.cradle.occupant.laws.supplied.len, index++)
- var/law = computer.cradle.occupant.laws.supplied[index]
- if(length(law) > 0)
- laws += "[number]: [law] "
- number++
-
- dat += "Laws: [laws] "
-
- if(computer.cradle.occupant.stat == 2)
- dat += "AI non-functional "
- else
- dat += "AI functional "
- if(!computer.cradle.busy)
- dat += " [topic_link(src,"fix","Begin Reconstruction")]"
- else
- dat += " Reconstruction in process, please wait. "
- dat += " [topic_link(src,"close","Close")]"
- return dat
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || !computer.cradle || ..(href,href_list))
- return
-
- if("fix" in href_list)
- var/mob/living/silicon/ai/occupant = computer.cradle.occupant
- if(!occupant) return
-
- computer.cradle.busy = 1
- computer.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
-
- var/i = 0
- while(occupant.health < 100)
- if(!computer || (computer.stat&~MAINT)) // takes some time, keep checking
- break
-
- occupant.adjustOxyLoss(-1)
- occupant.adjustFireLoss(-1)
- occupant.adjustToxLoss(-1)
- occupant.adjustBruteLoss(-1)
- occupant.updatehealth()
- if(occupant.health >= 0 && computer.cradle.occupant.stat == 2)
- occupant.stat = 0
- occupant.lying = 0
- dead_mob_list -= occupant
- living_mob_list += occupant
- update_icon()
-
- i++
- if(i == 5)
- computer.use_power(50) // repairing an AI is nontrivial. laptop battery may not be enough.
- computer.power_change() // if the power runs out, set stat
- i = 0
-
- computer.updateUsrDialog()
-
- sleep(10)
- computer.cradle.busy = 0
- computer.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
-
- computer.updateUsrDialog()
- return
diff --git a/code/modules/computer3/computers/arcade.dm b/code/modules/computer3/computers/arcade.dm
deleted file mode 100644
index 29ada5126c3..00000000000
--- a/code/modules/computer3/computers/arcade.dm
+++ /dev/null
@@ -1,180 +0,0 @@
-/obj/machinery/computer3/arcade
- default_prog = /datum/file/program/arcade
- spawn_parts = list(/obj/item/part/computer/toybox) //NO HDD - the game is loaded on the circuitboard's OS slot
-
-/obj/item/part/computer/toybox
- var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
- /obj/item/toy/blink = 2,
- /obj/item/clothing/under/syndicate/tacticool = 2,
- /obj/item/toy/sword = 2,
- /obj/item/weapon/gun/projectile/revolver/capgun = 2,
- /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
- /obj/item/clothing/suit/syndicatefake = 2,
- /obj/item/weapon/storage/fancy/crayons = 2,
- /obj/item/toy/spinningtoy = 2,
- /obj/item/toy/prize/ripley = 1,
- /obj/item/toy/prize/fireripley = 1,
- /obj/item/toy/prize/deathripley = 1,
- /obj/item/toy/prize/gygax = 1,
- /obj/item/toy/prize/durand = 1,
- /obj/item/toy/prize/honk = 1,
- /obj/item/toy/prize/marauder = 1,
- /obj/item/toy/prize/seraph = 1,
- /obj/item/toy/prize/mauler = 1,
- /obj/item/toy/prize/odysseus = 1,
- /obj/item/toy/prize/phazon = 1
- )
- proc/dispense()
- if(computer && !computer.stat)
- var/prizeselect = pickweight(prizes)
- new prizeselect(computer.loc)
- if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
- new /obj/item/ammo_box/caps(computer.loc)
- else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
- new /obj/item/clothing/head/syndicatefake(computer.loc)
- feedback_inc("arcade_win_normal")
- computer.use_power(500)
-
-
-/datum/file/program/arcade
- desc = "The best arcade game ever produced by Nanotrasen's short-lived entertainment divison."
- //headcanon: they also ported E.T. for the atari 2600, superman 64, and basically every other movie tie-in game ever
-
- active_state = "generic"
-
- var/turtle = 0
- var/enemy_name = "Space Villian"
- var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc
- var/player_hp = 30 //Player health/attack points
- var/player_mp = 10
- var/enemy_hp = 45 //Enemy health/attack points
- var/enemy_mp = 20
- var/gameover = 0
- var/blocked = 0 //Player cannot attack/heal while set
-
-/datum/file/program/arcade/New()
- ..()
- var/name_action
- var/name_part1
- var/name_part2
-
- name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "ERP ")
-
- name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
- name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn")
-
- enemy_name = replacetext(name_part1, "the ", "") + name_part2
- name = (name_action + name_part1 + name_part2)
-
-
-/datum/file/program/arcade/interact()
- if(!interactable())
- return
- var/dat// = topic_link(src,"close","Close")
- dat = "[enemy_name] "
-
- dat += "[temp] "
- dat += "Health: [player_hp] | Magic: [player_mp] | Enemy Health: [enemy_hp] "
-
- if(gameover)
- dat += "[topic_link(src,"newgame","New Game")]"
- else
- dat += " [topic_link(src,"attack","Attack")] | [topic_link(src,"heal","Heal")] | [topic_link(src,"charge","Recharge Power")]"
-
- dat += " "
-
- popup.set_content(dat)
- popup.open()
-
-/datum/file/program/arcade/Topic(href, list/href_list)
- if(!interactable() || ..(href,href_list))
- return
- if(!blocked && !gameover)
- if("attack" in href_list)
- blocked = 1
- var/attackamt = rand(2,6)
- temp = "You attack for [attackamt] damage!"
- computer.updateUsrDialog()
- if(turtle > 0)
- turtle--
-
- sleep(10)
- enemy_hp -= attackamt
- arcade_action()
-
- else if("heal" in href_list)
- blocked = 1
- var/pointamt = rand(1,3)
- var/healamt = rand(6,8)
- temp = "You use [pointamt] magic to heal for [healamt] damage!"
- computer.updateUsrDialog()
- turtle++
-
- sleep(10)
- player_mp -= pointamt
- player_hp += healamt
- blocked = 1
- computer.updateUsrDialog()
- arcade_action()
-
- else if("charge" in href_list)
- blocked = 1
- var/chargeamt = rand(4,7)
- temp = "You regain [chargeamt] points"
- player_mp += chargeamt
- if(turtle > 0)
- turtle--
-
- computer.updateUsrDialog()
- sleep(10)
- arcade_action()
-
- if("newgame" in href_list) //Reset everything
- temp = "New Round"
- player_hp = 30
- player_mp = 10
- enemy_hp = 45
- enemy_mp = 20
- gameover = 0
- turtle = 0
- computer.updateUsrDialog()
-
-
-/datum/file/program/arcade/proc/arcade_action()
- if((enemy_mp <= 0) || (enemy_hp <= 0))
- if(!gameover)
- gameover = 1
- temp = "[enemy_name] has fallen! Rejoice!"
- if(computer.toybox)
- computer.toybox.dispense()
-
- else if((enemy_mp <= 5) && (prob(70)))
- var/stealamt = rand(2,3)
- temp = "[enemy_name] steals [stealamt] of your power!"
- player_mp -= stealamt
-
- if(player_mp <= 0)
- gameover = 1
- sleep(10)
- temp = "You have been drained! GAME OVER"
- feedback_inc("arcade_loss_mana_normal")
-
- else if((enemy_hp <= 10) && (enemy_mp > 4))
- temp = "[enemy_name] heals for 4 health!"
- enemy_hp += 4
- enemy_mp -= 4
-
- else
- var/attackamt = rand(3,6)
- temp = "[enemy_name] attacks for [attackamt] damage!"
- player_hp -= attackamt
-
- if((player_mp <= 0) || (player_hp <= 0))
- gameover = 1
- temp = "You have been crushed! GAME OVER"
- feedback_inc("arcade_loss_hp_normal")
-
- if(interactable())
- computer.updateUsrDialog()
- blocked = 0
- return
diff --git a/code/modules/computer3/computers/atmos_alert.dm b/code/modules/computer3/computers/atmos_alert.dm
deleted file mode 100644
index 894286d334b..00000000000
--- a/code/modules/computer3/computers/atmos_alert.dm
+++ /dev/null
@@ -1,110 +0,0 @@
-/obj/machinery/computer3/atmos_alert
- default_prog = /datum/file/program/atmos_alert
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio)
- icon_state = "frame-eng"
-
-/datum/file/program/atmos_alert
- name = "atmospheric alert monitor"
- desc = "Recieves alerts over the radio."
- active_state = "alert:2"
- refresh = 1
- var/list/priority_alarms = list()
- var/list/minor_alarms = list()
-
-
- execute(var/datum/file/program/source)
- ..(source)
-
- if(!computer.radio)
- computer.Crash(MISSING_PERIPHERAL)
-
- computer.radio.set_frequency(1437,RADIO_ATMOSIA)
-
-
- Reset()
- ..()
- // Never save your work
- priority_alarms.Cut()
- minor_alarms.Cut()
-
-
- // This will be called as long as the program is running on the parent computer
- // and the computer has the radio peripheral
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/zone = signal.data["zone"]
- var/severity = signal.data["alert"]
- if(!zone || !severity) return
-
- minor_alarms -= zone
- priority_alarms -= zone
- if(severity=="severe")
- priority_alarms += zone
- else if(severity=="minor")
- minor_alarms += zone
- update_icon()
- return
-
-
- interact()
- if(!interactable())
- return
- if(!computer.radio)
- computer.Crash(MISSING_PERIPHERAL)
-
- popup.set_content(return_text())
- popup.open()
-
-
- update_icon()
- ..()
- if(priority_alarms.len > 0)
- overlay.icon_state = "alert:2"
- else if(minor_alarms.len > 0)
- overlay.icon_state = "alert:1"
- else
- overlay.icon_state = "alert:0"
-
- if(computer)
- computer.update_icon()
-
-
- proc/return_text()
- var/priority_text = "Priority Alerts: "
- var/minor_text = "Minor Alerts: "
-
- if(priority_alarms.len)
- for(var/zone in priority_alarms)
- priority_text += "[format_text(zone)] [topic_link(src,"priority_clear=[ckey(zone)]","X")] "
- else
- priority_text += "No priority alerts detected. "
-
- if(minor_alarms.len)
- for(var/zone in minor_alarms)
- minor_text += "[format_text(zone)] [topic_link(src,"minor_clear=[ckey(zone)]","X")] "
- else
- minor_text += "No minor alerts detected. "
-
- return "[priority_text] [minor_text] [topic_link(src,"close","Close")]"
-
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if("priority_clear" in href_list)
- var/removing_zone = href_list["priority_clear"]
- for(var/zone in priority_alarms)
- if(ckey(zone) == removing_zone)
- to_chat(usr, "\green Priority Alert for area [zone] cleared.")
- priority_alarms -= zone
-
- if("minor_clear" in href_list)
- var/removing_zone = href_list["minor_clear"]
- for(var/zone in minor_alarms)
- if(ckey(zone) == removing_zone)
- to_chat(usr, "\green Minor Alert for area [zone] cleared.")
- minor_alarms -= zone
-
- computer.updateUsrDialog()
diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm
deleted file mode 100644
index 76fdc4d3d2d..00000000000
--- a/code/modules/computer3/computers/camera.dm
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- Camera monitoring computers
-
- NOTE: If we actually split the station camera network into regions that will help with sorting through the
- tediously large list of cameras. The new camnet_key architecture lets you switch between keys easily,
- so you don't lose the capability of seeing everything, you just switch to a subnet.
-*/
-
-/obj/machinery/computer3/security
- default_prog = /datum/file/program/security
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/cameras)
- spawn_files = list(/datum/file/camnet_key)
- icon_state = "frame-sec"
-
-
-/obj/machinery/computer3/security/wooden_tv
- name = "security cameras console"
- desc = "An old TV hooked into the stations camera network."
- icon = 'icons/obj/computer.dmi'
- icon_state = "security_det"
-
- legacy_icon = 1
- allow_disassemble = 0
-
- // No operating system
- New()
- ..(built=0)
- os = program
- circuit.OS = os
-
-
-/obj/machinery/computer3/security/mining
- name = "outpost cameras console"
- desc = "Used to access the various cameras on the outpost."
- spawn_files = list(/datum/file/camnet_key/miningoutpost)
-
-/*
- Camera monitoring computers, wall-mounted
-*/
-/obj/machinery/computer3/wall_comp/telescreen
- default_prog = /datum/file/program/security
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/cameras)
- spawn_files = list(/datum/file/camnet_key)
-
-/obj/machinery/computer3/wall_comp/telescreen/entertainment
- desc = "Damn, they better have Paradise Channel on these things."
- spawn_files = list(/datum/file/camnet_key/entertainment)
-
-
-/*
- File containing an encrypted camera network key.
-
- (Where by encrypted I don't actually mean encrypted at all)
-*/
-/datum/file/camnet_key
- name = "Security Camera Network Main Key"
- var/title = "Station"
- var/desc = "Connects to station security cameras."
- var/list/networks = list("SS13")
- var/screen = "cameras"
-
- execute(var/datum/file/source)
- if(istype(source,/datum/file/program/security))
- var/datum/file/program/security/prog = source
- prog.key = src
- prog.camera_list = null
- return
- if(istype(source,/datum/file/program/ntos))
- for(var/obj/item/part/computer/storage/S in list(computer.hdd,computer.floppy))
- for(var/datum/file/F in S.files)
- if(istype(F,/datum/file/program/security))
- var/datum/file/program/security/Sec = F
- Sec.key = src
- Sec.camera_list = null
- Sec.execute(source)
- return
- computer.Crash(MISSING_PROGRAM)
-
-/datum/file/camnet_key/telecomms
- name = "Telecomms Network Key"
- title = "telecommunications satellite"
- desc = "Connects to telecommunications satellite security cameras."
- networks = list("Telecomms")
-
-/datum/file/camnet_key/researchoutpost
- name = "Research Outpost Network Key"
- title = "research outpost"
- desc = "Connects to research outpost security cameras."
- networks = list("Research Outpost")
-
-/datum/file/camnet_key/miningoutpost
- name = "Mining Outpost Network Key"
- title = "mining outpost"
- desc = "Connects to mining outpost security cameras."
- networks = list("Mining Outpost")
- screen = "miningcameras"
-
-/datum/file/camnet_key/research
- name = "Research Network Key"
- title = "research"
- desc = "Connects to research security cameras."
- networks = list("Research")
-
-/datum/file/camnet_key/prison
- name = "Prison Network Key"
- title = "prison"
- desc = "Connects to prison security cameras."
- networks = list("Prison")
-
-/datum/file/camnet_key/interrogation
- name = "Interrogation Network Key"
- title = "interrogation"
- desc = "Connects to interrogation security cameras."
- networks = list("Interrogation")
-
-/datum/file/camnet_key/supermatter
- name = "Supermatter Network Key"
- title = "supermatter"
- desc = "Connects to supermatter security cameras."
- networks = list("Supermatter")
-
-/datum/file/camnet_key/singularity
- name = "Singularity Network Key"
- title = "singularity"
- desc = "Connects to singularity security cameras."
- networks = list("Singularity")
-
-/datum/file/camnet_key/anomalyisolation
- name = "Anomaly Isolation Network Key"
- title = "anomalyisolation"
- desc = "Connects to interrogation security cameras."
- networks = list("Anomaly Isolation")
-
-/datum/file/camnet_key/toxins
- name = "Toxins Network Key"
- title = "toxins"
- desc = "Connects to toxins security cameras."
- networks = list("Toxins")
-
-/datum/file/camnet_key/telepad
- name = "Telepad Network Key"
- title = "telepad"
- desc = "Connects to telepad security cameras."
- networks = list("Telepad")
-
-/datum/file/camnet_key/ert
- name = "Emergency Response Team Network Key"
- title = "emergency response team"
- desc = "Connects to emergency response team security cameras."
- networks = list("ERT")
-
-/datum/file/camnet_key/centcom
- name = "Central Command Network Key"
- title = "central command"
- desc = "Connects to central command security cameras."
- networks = list("CentCom")
-
-/datum/file/camnet_key/thunderdome
- name = "Thunderdome Network Key"
- title = "thunderdome"
- desc = "Connects to thunderdome security cameras."
- networks = list("Thunderdome")
-
-/datum/file/camnet_key/entertainment
- name = "Entertainment Network Key"
- title = "entertainment"
- desc = "Connects to entertainment security cameras."
- networks = list("news")
-
-
-/*
- Computer part needed to connect to cameras
-*/
-
-/obj/item/part/computer/networking/cameras
- name = "camera network access module"
- desc = "Connects a computer to the camera network."
-
- // I have no idea what the following does
- var/mapping = 0//For the overview file, interesting bit of code.
-
- //proc/camera_list(var/datum/file/camnet_key/key)
- get_machines(var/datum/file/camnet_key/key)
- if(!computer || !is_away_level(computer.z))
- return null
-
- var/list/L = list()
- for(var/obj/machinery/camera/C in cameranet.cameras)
- var/list/temp = C.network & key.networks
- if(temp.len)
- L.Add(C)
-
-
- return L
- verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null)
- if(!istype(C) || !C.can_use())
- return 0
-
- if(key)
- var/list/temp = C.network & key.networks
- if(!temp.len)
- return 0
- return 1
-
-/*
- Camera monitoring program
-
- The following things should break you out of the camera view:
- * The computer resetting, being damaged, losing power, etc
- * The program quitting
- * Closing the window
- * Going out of range of the computer
- * Becoming incapacitated
- * The camera breaking, emping, disconnecting, etc
-*/
-
-/datum/file/program/security
- name = "camera monitor"
- desc = "Connets to the Nanotrasen Camera Network"
- image = 'icons/ntos/camera.png'
- active_state = "camera-static"
-
- var/datum/file/camnet_key/key = null
- var/last_pic = 1.0
- var/last_camera_refresh = 0
- var/camera_list = null
-
- var/obj/machinery/camera/current = null
-
- execute(var/datum/file/program/caller)
- ..(caller)
- if(computer && !key)
- var/list/fkeys = computer.list_files(/datum/file/camnet_key)
- if(fkeys && fkeys.len)
- key = fkeys[1]
- update_icon()
- computer.update_icon()
- for(var/mob/living/L in viewers(1))
- if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
- L.reset_perspective(null)
-
-
- Reset()
- ..()
- current = null
- for(var/mob/living/L in viewers(1))
- if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
- L.reset_perspective(null)
-
- interact()
- if(!interactable())
- return
-
- if(!computer.camnet)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- if(!key)
- var/list/fkeys = computer.list_files(/datum/file/camnet_key)
- if(fkeys && fkeys.len)
- key = fkeys[1]
- update_icon()
- computer.update_icon()
- if(!key)
- return
-
- if(computer.camnet.verify_machine(current))
- usr.reset_perspective(current)
-
- if(world.time - last_camera_refresh > 50 || !camera_list)
- last_camera_refresh = world.time
-
- var/list/temp_list = computer.camnet.get_machines(key)
-
- camera_list = "Network Key: [key.title] [topic_link(src,"keyselect","\[ Select key \]")] "
- for(var/obj/machinery/camera/C in temp_list)
- if(C.status)
- camera_list += "[C.c_tag] - [topic_link(src,"show=\ref[C]","Show")] "
- else
- camera_list += "[C.c_tag] - DEACTIVATED "
- //camera_list += " " + topic_link(src,"close","Close")
-
- popup.set_content(camera_list)
- popup.open()
-
-
- update_icon()
- if(key)
- overlay.icon_state = key.screen
- name = key.title + " Camera Monitor"
- else
- overlay.icon_state = "camera-static"
- name = initial(name)
-
-
-
- Topic(var/href,var/list/href_list)
- if(!interactable() || !computer.camnet || ..(href,href_list))
- return
-
- if("show" in href_list)
- var/obj/machinery/camera/C = locate(href_list["show"])
- if(istype(C) && C.status)
- current = C
- usr.reset_perspective(C)
- interact()
- return
-
- if("keyselect" in href_list)
- current = null
- usr.reset_perspective(null)
- key = input(usr,"Select a camera network key:", "Key Select", null) as null|anything in computer.list_files(/datum/file/camnet_key)
- camera_list = null
- update_icon()
- computer.update_icon()
- if(key)
- interact()
- else
- to_chat(usr, "The screen turns to static.")
- return
-
- // Atlantis: Required for camnetkeys to work.
-/datum/file/program/security/hidden
- hidden_file = 1
diff --git a/code/modules/computer3/computers/card.dm b/code/modules/computer3/computers/card.dm
deleted file mode 100644
index 69b74a0b067..00000000000
--- a/code/modules/computer3/computers/card.dm
+++ /dev/null
@@ -1,347 +0,0 @@
-/obj/machinery/computer3/card
- default_prog = /datum/file/program/card_comp
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot/dual)
-/obj/machinery/computer3/card/hop
- default_prog = /datum/file/program/card_comp
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot/dual)
- spawn_files = list(/datum/file/program/arcade, /datum/file/program/security, /datum/file/camnet_key/miningoutpost, /datum/file/camnet_key/entertainment,/datum/file/camnet_key/prison)
-
-
-/obj/machinery/computer3/card/centcom
- default_prog = /datum/file/program/card_comp/centcom
-
-/datum/file/program/card_comp
- name = "identification card console"
- desc = "Used to modify magnetic strip ID cards."
- image = 'icons/ntos/cardcomp.png'
- active_state = "id"
-
- var/obj/item/weapon/card/id/reader = null
- var/obj/item/weapon/card/id/writer = null
-
- var/mode = 0
- var/auth = 0
- var/printing = 0
-
- proc/list_jobs()
- return get_all_jobs() + "Custom"
-
- // creates the block with the script in it
- // cache the result since it's almost constant but not quite
- // the list of jobs won't change after all...
- proc/scriptblock()
- var/global/dat = null
- var/counter = 0
- var jobs_all = ""
- jobs_all += "Command "
-
- jobs_all += "Special "//Captain in special because he is head of heads ~Intercross21
- jobs_all += "Captain "
- jobs_all += "Custom "
-
- counter = 0
- jobs_all += "Security "//Red
- for(var/job in security_positions)
- counter++
- if(counter >= 6)
- jobs_all += " "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] "
-
- counter = 0
- jobs_all += "Engineering "//Orange
- for(var/job in engineering_positions)
- counter++
- if(counter >= 6)
- jobs_all += " "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] "
-
- counter = 0
- jobs_all += "Medical "//Green
- for(var/job in medical_positions)
- counter++
- if(counter >= 6)
- jobs_all += " "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] "
-
- counter = 0
- jobs_all += "Science "//Purple
- for(var/job in science_positions)
- counter++
- if(counter >= 6)
- jobs_all += " "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] "
-
- counter = 0
- jobs_all += "Support "//Grey
- for(var/job in support_positions)
- counter++
- if(counter >= 6)
- jobs_all += " "
- counter = 0
- jobs_all += "[replacetext(job, " ", " ")] "
-
- dat = {""}
- return dat
-
- // creates the list of access rights on the card
- proc/accessblock()
- var/accesses = "Access
"
- accesses += ""
- accesses += ""
- for(var/i = 1; i <= 7; i++)
- accesses += "[get_region_accesses_name(i)]: "
- accesses += " "
- for(var/i = 1; i <= 7; i++)
- accesses += ""
- for(var/A in get_region_accesses(i))
- if(A in writer.access)
- accesses += topic_link(src,"access=[A]","[replacetext(get_access_desc(A), " ", " ")] ") + " "
- else
- accesses += topic_link(src,"access=[A]",replacetext(get_access_desc(A), " ", " ")) + " "
- accesses += " "
- accesses += " "
- accesses += "
"
- return accesses
-
- proc/card_modify_menu()
- //assume peripherals and cards, do checks for them in interact
-
- // Header
- var/dat = " "
- dat += topic_link(src,"remove=writer","Remove [writer.name]") + " || "
- dat += topic_link(src,"remove=reader","Remove [reader.name]") + " "
- dat += topic_link(src,"mode=1","Access Crew Manifest") + " || "
- dat += topic_link(src,"logout","Log Out") + "
"
- dat += " " + scriptblock()
-
- // form for renaming the ID
- dat += ""
-
- // form for changing assignment, taken care of by scriptblock() mostly
- var/assign_temp = writer.assignment
- if(!assign_temp || assign_temp == "") assign_temp = "Unassigned"
- dat += "Assignment: [assign_temp] change "
-
- // list of access rights
- dat += accessblock()
-
- return dat
-
- proc/login_menu()
- //assume peripherals and cards, do checks for them in interact
- var/dat = "Please insert the cards into the slots "
-
- if(istype(writer))
- dat += "Target: [topic_link(src,"remove=writer",writer.name)] "
- else
- dat += "Target: [topic_link(src,"insert=writer","--------")] "
-
- if(istype(reader))
- dat += "Confirm Identity: [topic_link(src,"remove=reader",reader.name)] "
- else
- dat += "Confirm Identity: [topic_link(src,"insert=reader","--------")] "
- dat += "[topic_link(src,"auth","{Log in}")] "
- dat += topic_link(src,"mode=1","Access Crew Manifest")
- return dat
-
- proc/show_manifest()
- // assume linked_db since called by interact()
- var/crew = ""
- var/list/L = list()
- for(var/datum/data/record/t in data_core.general)
- var/R = t.fields["name"] + " - " + t.fields["rank"]
- L += R
- for(var/R in sortList(L))
- crew += "[R] "
- return "Crew Manifest: Please use security record computer to modify entries. [crew][topic_link(src,"print","Print")] [topic_link(src,"mode=0","Access ID modification console.")] "
-
- // These are here partly in order to be overwritten by the centcom card computer code
- proc/authenticate()
- if(access_change_ids in reader.access)
- return 1
- if(istype(usr,/mob/living/silicon/ai))
- return 1
- return 0
-
- proc/set_default_access(var/jobname)
- var/datum/job/jobdatum
- for(var/jobtype in typesof(/datum/job))
- var/datum/job/J = new jobtype
- if(ckey(J.title) == ckey(jobname))
- jobdatum = J
- break
- if(jobdatum)
- writer.access = jobdatum.get_access() // ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1)
-
-
- interact()
- if(!interactable()) return
-
- if(!computer.cardslot || !computer.cardslot.dualslot)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- reader = computer.cardslot.reader
- writer = computer.cardslot.writer
-
- var/dat
-
- switch(mode)
- if(0)
- if( !istype(writer) || !istype(reader) )
- auth = 0
- if( !auth )
- dat = login_menu()
- else
- dat = card_modify_menu()
- if(1)
- dat = show_manifest()
-
-
- popup.width = 940
- popup.height = 520
- popup.set_content(dat)
- popup.open()
- return
-
-
- Topic(href, list/href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- // todo distance/disability checks
-
- if("mode" in href_list)
- mode = text2num(href_list["mode"])
- if(mode != 0 && mode != 1)
- mode = 0
-
- auth = 0 // always log out if switching modes just in case
-
- if("remove" in href_list)
- var/which = href_list["remove"]
- if(which == "writer")
- computer.cardslot.remove(2)
- else
- computer.cardslot.remove(1)
- auth = 0
-
- if("insert" in href_list)
- var/obj/item/weapon/card/card = usr.get_active_hand()
- if(!istype(card)) return
-
- var/which = href_list["insert"]
- if(which == "writer")
- computer.cardslot.insert(card,2)
- else
- computer.cardslot.insert(card,1)
-
- if("print" in href_list)
- if(printing)
- return
-
- printing = 1
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
- P.info = "Crew Manifest: "
- var/list/L = list()
- for(var/datum/data/record/t in data_core.general)
- var/R = t.fields["name"] + " - " + t.fields["rank"]
- L += R
- for(var/R in sortList(L))
- P.info += "[R] "
- P.name = "paper- 'Crew Manifest'"
- printing = 0
-
- if("auth" in href_list)
- auth = 0
- if(istype(reader) && istype(writer) && authenticate())
- auth = 1
-
- if("logout" in href_list)
- auth = 0
-
- // Actual ID changing
-
- if("access" in href_list)
- if(auth)
- var/access_type = text2num(href_list["access"])
- writer.access ^= list(access_type) //logical xor: remove if present, add if not
-
- if("assign" in href_list)
- if(auth)
- var/t1 = href_list["assign"]
- if(t1 == "Custom")
- var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
- if(temp_t)
- t1 = temp_t
- set_default_access(t1)
-
- writer.assignment = t1
- writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])")
-
- if("reg" in href_list)
- if(auth)
- writer.registered_name = href_list["reg"]
- writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])")
-
- computer.updateUsrDialog()
- return
-
-
-
-
-
-
-/datum/file/program/card_comp/centcom
- name = "CentCom identification console"
- drm = 1
-
- list_jobs()
- return get_all_centcom_jobs() + "Custom"
-
- accessblock()
- var/accesses = "Central Command: "
- for(var/A in get_all_centcom_access())
- if(A in writer.access)
- accesses += topic_link(src,"access=[A]","[replacetext(get_centcom_access_desc(A), " ", " ")] ") + " "
- else
- accesses += topic_link(src,"access=[A]",replacetext(get_centcom_access_desc(A), " ", " ")) + " "
- return accesses
-
- authenticate()
- if(access_cent_commander in reader.access)
- return 1
- return 0
\ No newline at end of file
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
deleted file mode 100644
index a4fad8a16cb..00000000000
--- a/code/modules/computer3/computers/communications.dm
+++ /dev/null
@@ -1,403 +0,0 @@
-/obj/machinery/computer3/communications
- default_prog = /datum/file/program/communications
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace)
-
-/obj/machinery/computer3/communications/captain
- default_prog = /datum/file/program/communications
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/cardslot/dual)
- spawn_files = list(/datum/file/program/card_comp, /datum/file/program/security, /datum/file/program/crew, /datum/file/program/arcade,
- /datum/file/camnet_key, /datum/file/camnet_key/entertainment, /datum/file/camnet_key/singularity)
-
-
-/datum/file/program/communications
- var/const/STATE_DEFAULT = 1
- var/const/STATE_CALLSHUTTLE = 2
- var/const/STATE_CANCELSHUTTLE = 3
- var/const/STATE_MESSAGELIST = 4
- var/const/STATE_VIEWMESSAGE = 5
- var/const/STATE_DELMESSAGE = 6
- var/const/STATE_STATUSDISPLAY = 7
- var/const/STATE_ALERT_LEVEL = 8
- var/const/STATE_CONFIRM_LEVEL = 9
-
-
-/datum/file/program/communications
- name = "Centcom communications relay"
- desc = "Used to connect to Centcom."
- active_state = "comm"
- req_access = list(access_heads)
-
- var/prints_intercept = 1
- var/authenticated = 0
- var/list/messagetitle = list()
- var/list/messagetext = list()
- var/currmsg = 0
- var/aicurrmsg = 0
- var/state = STATE_DEFAULT
- var/aistate = STATE_DEFAULT
- var/message_cooldown = 0
- var/centcomm_message_cooldown = 0
- var/tmp_alertlevel = 0
-
- var/status_display_freq = "1435"
- var/stat_msg1
- var/stat_msg2
-
- var/datum/announcement/priority/crew_announcement = new
-
- New()
- ..()
- crew_announcement.newscast = 1
-
- Reset()
- ..()
- authenticated = 0
- state = STATE_DEFAULT
- aistate = STATE_DEFAULT
-
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || !computer.radio || ..(href,href_list) )
- return
- if(!is_station_level(computer.z))
- to_chat(usr, "Unable to establish a connection : You're too far away from the station!")
- return
-
- if("main" in href_list)
- state = STATE_DEFAULT
- if("login" in href_list)
- if(!ishuman(usr))
- to_chat(usr, "Access denied. ")
- return
- var/mob/living/carbon/human/H = usr
- var/obj/item/I = H.get_active_hand()
- if(I)
- I = I.GetID()
- if(istype(I,/obj/item/weapon/card/id) && check_access(I))
- authenticated = 1
- if(access_captain in I.GetAccess())
- authenticated = 2
- var/obj/item/weapon/card/id = H.get_idcard(TRUE)
- if(istype(id))
- crew_announcement.announcer = GetNameAndAssignmentFromId(id)
-
- if("logout" in href_list)
- authenticated = 0
- crew_announcement.announcer = ""
-
- if("swipeidseclevel" in href_list)
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
- I = I.GetID()
-
- if(istype(I,/obj/item/weapon/card/id))
- if(access_captain in I.GetAccess())
- var/old_level = security_level
- if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
- if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN
- if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
- set_security_level(tmp_alertlevel)
- if(security_level != old_level)
- //Only notify the admins if an actual change happened
- log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
- message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
- switch(security_level)
- if(SEC_LEVEL_GREEN)
- feedback_inc("alert_comms_green",1)
- if(SEC_LEVEL_BLUE)
- feedback_inc("alert_comms_blue",1)
- tmp_alertlevel = 0
- else:
- to_chat(usr, "You are not authorized to do this.")
- tmp_alertlevel = 0
- state = STATE_DEFAULT
- else
- to_chat(usr, "You need to swipe your ID.")
- if("announce" in href_list)
- if(authenticated==2)
- if(message_cooldown)
- to_chat(usr, "Please allow at least one minute to pass between announcements")
- return
- var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement")
- if(!input || !interactable())
- return
- crew_announcement.Announce(input)
- message_cooldown = 1
- spawn(600)//One minute cooldown
- message_cooldown = 0
-
- if("callshuttle" in href_list)
- state = STATE_DEFAULT
- if(authenticated)
- state = STATE_CALLSHUTTLE
- if("callshuttle2" in href_list)
- if(!computer.radio.subspace)
- return
- if(authenticated)
- var/input = stripped_input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null
- if(!input || ..(href, href_list) || !authenticated)
- return
- call_shuttle_proc(usr, input)
- if(shuttle_master.emergency.timer)
- post_status("shuttle")
- state = STATE_DEFAULT
- if("cancelshuttle" in href_list)
- state = STATE_DEFAULT
- if(authenticated)
- cancel_call_proc(usr)
- state = STATE_CANCELSHUTTLE
- if("messagelist" in href_list)
- currmsg = 0
- state = STATE_MESSAGELIST
- if("viewmessage" in href_list)
- state = STATE_VIEWMESSAGE
- if(!currmsg)
- if(href_list["message-num"])
- currmsg = text2num(href_list["message-num"])
- else
- state = STATE_MESSAGELIST
- if("delmessage" in href_list)
- state = (currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
- if("delmessage2" in href_list)
- if(authenticated)
- if(currmsg)
- var/title = messagetitle[currmsg]
- var/text = messagetext[currmsg]
- messagetitle.Remove(title)
- messagetext.Remove(text)
- if(currmsg == aicurrmsg)
- aicurrmsg = 0
- currmsg = 0
- state = STATE_MESSAGELIST
- else
- state = STATE_VIEWMESSAGE
- if("status" in href_list)
- state = STATE_STATUSDISPLAY
-
- // Status display stuff
- if("setstat" in href_list)
- switch(href_list["statdisp"])
- if("message")
- post_status("message", stat_msg1, stat_msg2)
- if("alert")
- post_status("alert", href_list["alert"])
- else
- post_status(href_list["statdisp"])
-
- if("setmsg1" in href_list)
- stat_msg1 = reject_bad_text(input("Line 1", "Enter Message Text", stat_msg1) as text|null, 40)
- computer.updateDialog()
- if("setmsg2" in href_list)
- stat_msg2 = reject_bad_text(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 40)
- computer.updateDialog()
-
- // OMG CENTCOMM LETTERHEAD
- if("MessageCentcomm" in href_list)
- if(!computer.radio.subspace)
- return
- if(authenticated==2)
- if(centcomm_message_cooldown)
- to_chat(usr, "Arrays recycling. Please stand by.")
- return
- var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")
- if(!input || !interactable())
- return
- Centcomm_announce(input, usr)
- to_chat(usr, "Message transmitted.")
- log_say("[key_name(usr)] has made a Centcomm announcement: [input]")
- centcomm_message_cooldown = 1
- spawn(600)//10 minute cooldown
- centcomm_message_cooldown = 0
-
-
- // OMG SYNDICATE ...LETTERHEAD
- if("MessageSyndicate" in href_list)
- if((authenticated==2) && (computer.emagged))
- if(centcomm_message_cooldown)
- to_chat(usr, "Arrays recycling. Please stand by.")
- return
- var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")
- if(!input || !interactable())
- return
- Syndicate_announce(input, usr)
- to_chat(usr, "Message transmitted.")
- log_say("[key_name(usr)] has made a Syndicate announcement: [input]")
- centcomm_message_cooldown = 1
- spawn(600)//10 minute cooldown
- centcomm_message_cooldown = 0
-
- if("RestoreBackup" in href_list)
- to_chat(usr, "Backup routing data restored!")
- computer.emagged = 0
- computer.updateDialog()
-
-
-
- // AI interface
- if("ai-main" in href_list)
- aicurrmsg = 0
- aistate = STATE_DEFAULT
- if("ai-callshuttle" in href_list)
- aistate = STATE_CALLSHUTTLE
- if("ai-callshuttle2" in href_list)
- if(!computer.radio.subspace)
- return
- var/input = stripped_input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null
- if(!input || ..(href, href_list))
- return
- call_shuttle_proc(usr, input)
- aistate = STATE_DEFAULT
- if("ai-messagelist" in href_list)
- aicurrmsg = 0
- aistate = STATE_MESSAGELIST
- if("ai-viewmessage" in href_list)
- aistate = STATE_VIEWMESSAGE
- if(!aicurrmsg)
- if(href_list["message-num"])
- aicurrmsg = text2num(href_list["message-num"])
- else
- aistate = STATE_MESSAGELIST
- if("ai-delmessage" in href_list)
- aistate = (aicurrmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
- if("ai-delmessage2" in href_list)
- if(aicurrmsg)
- var/title = messagetitle[aicurrmsg]
- var/text = messagetext[aicurrmsg]
- messagetitle.Remove(title)
- messagetext.Remove(text)
- if(currmsg == aicurrmsg)
- currmsg = 0
- aicurrmsg = 0
- aistate = STATE_MESSAGELIST
- if("ai-status" in href_list)
- aistate = STATE_STATUSDISPLAY
-
- if("securitylevel" in href_list)
- tmp_alertlevel = text2num( href_list["newalertlevel"] )
- if(!tmp_alertlevel) tmp_alertlevel = 0
- state = STATE_CONFIRM_LEVEL
-
- if("changeseclevel" in href_list)
- state = STATE_ALERT_LEVEL
-
- computer.updateUsrDialog()
-
-
-
- proc/main_menu()
- var/dat = ""
- if(computer.radio.subspace)
- if(shuttle_master.emergency.mode == SHUTTLE_CALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- dat += "Emergency shuttle \n \nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]"
- refresh = 1
- else
- refresh = 0
- if(authenticated)
- dat += " \[ Log Out \]"
- if(authenticated==2)
- dat += " \[ Make An Announcement \]"
- if(computer.emagged == 0)
- dat += " \[ Send an emergency message to Centcomm \]"
- else
- dat += " \[ Send an emergency message to \[UNKNOWN\] \]"
- dat += " \[ Restore Backup Routing Data \]"
-
- dat += " \[ Change alert level \]"
- /*if(emergency_shuttle.location())
- if(emergency_shuttle.online())
- dat += " \[ Cancel Shuttle Call \]"
- else
- dat += " \[ Call Emergency Shuttle \]"*/
-
- dat += " \[ Set Status Display \]"
- else
- dat += " \[ Log In \]"
- dat += " \[ Message List \]"
- return dat
-
- proc/confirm_menu(var/prompt,var/yes_option)
- return "Are you sure you want to [prompt]? \[ [topic_link(src,yes_option,"OK")] | [topic_link(src,"main","Cancel")] \]"
-
- interact()
- if(!interactable())
- return
- if(!computer.radio)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- var/dat = ""
- switch(state)
- if(STATE_DEFAULT)
- dat = main_menu()
- if(STATE_CALLSHUTTLE)
- dat = confirm_menu("call the shuttle","callshuttle2")
- if(STATE_CANCELSHUTTLE)
- dat = confirm_menu("cancel the shuttle","cancelshuttle2")
- if(STATE_MESSAGELIST)
- dat += "\[ Back \] "
- dat += "Messages:"
- for(var/i = 1; i<=messagetitle.len; i++)
- dat += "[messagetitle[i]] "
- if(STATE_VIEWMESSAGE)
- if(currmsg)
- dat += "[messagetitle[currmsg]] [messagetext[currmsg]]"
- if(authenticated)
- dat += " \[ Delete \]"
- else
- state = STATE_MESSAGELIST
- interact()
- return
- if(STATE_DELMESSAGE)
- if(currmsg)
- dat += "Are you sure you want to delete this message? \[ OK | Cancel \]"
- else
- state = STATE_MESSAGELIST
- interact()
- return
- if(STATE_STATUSDISPLAY)
- dat += "\[ Back \] "
- dat += "Set Status Displays "
- dat += "\[ Clear \] "
- dat += "\[ Shuttle ETA \] "
- dat += "\[ Message \]"
- dat += " "
- dat += "\[ Alert: None |"
- dat += " Red Alert |"
- dat += " Lockdown |"
- dat += " Biohazard \] "
- if(STATE_ALERT_LEVEL)
- dat += "Current alert level: [get_security_level()] "
- if(security_level == SEC_LEVEL_DELTA)
- dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate. "
- else
- dat += "Blue "
- dat += "Green "
- if(STATE_CONFIRM_LEVEL)
- dat += "Current alert level: [get_security_level()] "
- dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)] "
- dat += "Swipe ID to confirm change. "
-
- popup.set_content(dat)
- popup.open()
-
-
- proc/post_status(var/command, var/data1, var/data2)
- var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
-
- if(!frequency) return
-
- var/datum/signal/status_signal = new
- status_signal.source = src
- status_signal.transmission_method = 1
- status_signal.data["command"] = command
-
- switch(command)
- if("message")
- status_signal.data["msg1"] = data1
- status_signal.data["msg2"] = data2
- if("alert")
- status_signal.data["picture_state"] = data1
-
- frequency.post_signal(src, status_signal)
diff --git a/code/modules/computer3/computers/crew.dm b/code/modules/computer3/computers/crew.dm
deleted file mode 100644
index 29c411ad164..00000000000
--- a/code/modules/computer3/computers/crew.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-/obj/machinery/computer3/crew
- default_prog = /datum/file/program/crew
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio)
- icon_state = "frame-med"
-
-/datum/file/program/crew
- name = "crew monitoring console"
- desc = "Used to monitor active health sensors built into most of the crew's uniforms."
- active_state = "crew"
- var/list/tracked = list( )
-
- interact(mob/user)
- if(!interactable())
- return
-
- scan()
- var/t = "Crew Monitoring "
- t += "Refresh "
- t += "Close "
- t += "Name Vitals Position "
- var/list/logs = list()
- for(var/obj/item/clothing/under/C in src.tracked)
- var/log = ""
- var/turf/pos = get_turf(C)
- if((C) && (C.has_sensor) && (pos) && (pos.z == computer.z) && C.sensor_mode)
- if(istype(C.loc, /mob/living/carbon/human))
-
- var/mob/living/carbon/human/H = C.loc
-
- var/dam1 = round(H.getOxyLoss(),1)
- var/dam2 = round(H.getToxLoss(),1)
- var/dam3 = round(H.getFireLoss(),1)
- var/dam4 = round(H.getBruteLoss(),1)
-
- var/life_status = "[H.stat > 1 ? "Deceased " : "Living"]"
- var/damage_report = "([dam1] /[dam2] /[dam3] /[dam4] )"
-
- if(H.wear_id)
- log += "[H.wear_id.name] "
- else
- log += "Unknown "
-
- switch(C.sensor_mode)
- if(1)
- log += "[life_status] Not Available "
- if(2)
- log += "[life_status] [damage_report] Not Available "
- if(3)
- var/area/player_area = get_area(H)
- log += "[life_status] [damage_report] [player_area.name] ([pos.x], [pos.y]) "
- logs += log
- logs = sortList(logs)
- for(var/log in logs)
- t += log
- t += "
"
- t += " "
-
- popup.set_content(t)
- popup.open()
-
-
- proc/scan()
- for(var/obj/item/clothing/under/C in world)
- if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human)))
- tracked |= C
- return 1
-
- Topic(href, list/href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- if( href_list["close"] )
- usr << browse(null, "window=crewcomp")
- usr.unset_machine()
- return
- if(href_list["update"])
- interact()
- //src.updateUsrDialog()
- return
\ No newline at end of file
diff --git a/code/modules/computer3/computers/customs.dm b/code/modules/computer3/computers/customs.dm
deleted file mode 100644
index bca73055b8f..00000000000
--- a/code/modules/computer3/computers/customs.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/obj/machinery/computer3/customs
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras)
- spawn_files = list(/datum/file/program/arcade,/datum/file/program/security,/datum/file/camnet_key/entertainment,/datum/file/program/crew)
\ No newline at end of file
diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm
deleted file mode 100644
index 533a600a4eb..00000000000
--- a/code/modules/computer3/computers/law.dm
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-/obj/machinery/computer3/aiupload
- name = "\improper AI upload console"
- desc = "Used to upload laws to the AI."
- icon_state = "frame-rnd"
- var/mob/living/silicon/ai/current = null
- var/opened = 0
-
-
- verb/AccessInternals()
- set category = "Object"
- set name = "Access Computer's Internals"
- set src in oview(1)
- if(!Adjacent(usr) || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon) || !istype(usr, /mob/living))
- return
-
- opened = !opened
- if(opened)
- to_chat(usr, "\blue The access panel is now open.")
- else
- to_chat(usr, "\blue The access panel is now closed.")
- return
-
-
- attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
- if(is_away_level(user.z))
- to_chat(user, "Unable to establish a connection : You're too far away from the station!")
- return
- if(istype(module, /obj/item/weapon/aiModule))
- module.install(src)
- else
- return ..()
-
-
- attack_hand(var/mob/user as mob)
- if(src.stat & NOPOWER)
- to_chat(usr, "The upload computer has no power!")
- return
- if(src.stat & BROKEN)
- to_chat(usr, "The upload computer is broken!")
- return
-
- src.current = select_active_ai(user)
-
- if(!src.current)
- to_chat(usr, "No active AIs detected.")
- else
- to_chat(usr, "[src.current.name] selected for law changes.")
- return
-
-
-
-/obj/machinery/computer3/borgupload
- name = "cyborg upload console"
- desc = "Used to upload laws to Cyborgs."
- icon_state = "frame-rnd"
- var/mob/living/silicon/robot/current = null
-
-
- attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
- if(istype(module, /obj/item/weapon/aiModule))
- module.install(src)
- else
- return ..()
-
-
- attack_hand(var/mob/user as mob)
- if(src.stat & NOPOWER)
- to_chat(usr, "The upload computer has no power!")
- return
- if(src.stat & BROKEN)
- to_chat(usr, "The upload computer is broken!")
- return
-
- src.current = freeborg()
-
- if(!src.current)
- to_chat(usr, "No free cyborgs detected.")
- else
- to_chat(usr, "[src.current.name] selected for law changes.")
- return
diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm
deleted file mode 100644
index c54b4867d7e..00000000000
--- a/code/modules/computer3/computers/medical.dm
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- I hate to make this a todo, but I cannot possibly complete all of computer3
- if I have to rearchitecture datacores and everything else that uses them right now.
-
- In the future the datacore should probably be a server, perhaps on station, perhaps on centcom,
- with data records as files probably. It's not difficult unless you're trying to do a million
- impossible things before breakfast.
-*/
-
-/obj/machinery/computer3/med_data
- default_prog = /datum/file/program/med_data
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
-
-
-/obj/machinery/computer3/laptop/medical
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
- spawn_files = list(/datum/file/program/arcade,/datum/file/program/crew,/datum/file/program/med_data)
-
-/datum/file/program/med_data
- name = "Medical Records"
- desc = "This can be used to check medical records."
- active_state = "medcomp"
- req_one_access = list(access_medical, access_forensics_lockers)
-
- var/obj/item/weapon/card/id/scan = null
- var/obj/item/weapon/card/id/scan2 = null
- var/authenticated = null
- var/rank = null
- var/screen = null
- var/datum/data/record/active1 = null
- var/datum/data/record/active2 = null
- var/a_id = null
- var/temp = null
- var/printing = null
-
-
- proc/authenticate()
- if(access_medical in scan.access)
- return 1
- if(istype(usr,/mob/living/silicon/ai))
- return 1
- return 0
-
- interact()
- if(!computer.cardslot)
- computer.Crash(MISSING_PERIPHERAL)
- return
- scan = computer.cardslot.reader
- if(!interactable())
- return
- if(is_away_level(computer.z))
- to_chat(usr, "Unable to establish a connection : You're too far away from the station!")
- return
- var/dat
-
- if(temp)
- dat = text("[src.temp] Clear Screen ")
- else
- dat = text("Confirm Identity (R): [] ", (scan ? text("[]", scan.name) : "----------"))
- if(computer.cardslot.dualslot)
- dat += text("Check Identity (W): [] ", (scan2 ? text("[]", scan2.name) : "----------"))
- if(scan2 && !scan)
- dat += text("Insert card into reader slot to log in.
")
-
- if(src.authenticated)
- switch(src.screen)
- if(1.0)
- dat += {"
-Search Records
-List Records
-
-Virus Database
-Medbot Tracking
-
-Record Maintenance
-{Log Out}
-"}
- if(2.0)
- dat += "Record List : "
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general))
- dat += text("[]: [] ", R, R.fields["id"], R.fields["name"])
- //Foreach goto(132)
- dat += " Back "
- if(3.0)
- dat += "Records Maintenance \nBackup To Disk \nUpload From disk \nDelete All Records \n \nBack "
- if(4.0)
- dat += "Medical Record "
- if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- dat += ""
- else
- dat += "General Record Lost! "
- if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src.active2.fields["b_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], decode(src.active2.fields["notes"]))
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- dat += text("[]Delete Entry ", src.active2.fields[text("com_[]", counter)], counter)
- counter++
- dat += "Add Entry "
- dat += "Delete Record (Medical Only) "
- else
- dat += "Medical Record Lost! "
- dat += text("New Record ")
- dat += "\nPrint Record \nBack "
- if(5.0)
- dat += "Virus Database "
- for(var/Dt in typesof(/datum/disease/))
- var/datum/disease/Dis = new Dt(0)
- if(istype(Dis, /datum/disease/advance))
- continue // TODO (tm): Add advance diseases to the virus database which no one uses.
- if(!Dis.desc)
- continue
- dat += "[Dis.name] "
- dat += "Back "
- if(6.0)
- dat += "Medical Robot Monitor "
- dat += "Back "
- dat += "Medical Robots: "
- var/bdat = null
- for(var/mob/living/simple_animal/bot/medbot/M in world)
-
- if(M.z != computer.z) continue //only find medibots on the same z-level as the computer
- var/turf/bl = get_turf(M)
- if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up
- bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"] "
- if((!isnull(M.reagent_glass)) && M.use_beaker)
- bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\] "
- else
- bdat += "Using Internal Synthesizer. "
- if(!bdat)
- dat += "None detected "
- else
- dat += " [bdat]"
-
- else
- else
- dat += "{Log In} "
- popup.width = 600
- popup.height = 400
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
-
- Topic(href, href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- if(!( data_core.general.Find(src.active1) ))
- src.active1 = null
- if(!( data_core.medical.Find(src.active2) ))
- src.active2 = null
-
- if(href_list["temp"])
- src.temp = null
-
- if(href_list["cardr"])
- if(scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(1)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- computer.cardslot.insert(I, 1)
- scan = I
-
- if(href_list["cardw"])
- if(scan2)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(2)
- else
- scan2.loc = get_turf(src)
- scan2 = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- computer.cardslot.insert(I, 2)
- scan2 = I
-
- else if(href_list["logout"])
- src.authenticated = null
- src.screen = null
- src.active1 = null
- src.active2 = null
-
- else if(href_list["login"])
-
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
-
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = "[R.modtype] [R.braintype]"
- src.screen = 1
-
- else if(istype(src.scan, /obj/item/weapon/card/id))
- src.active1 = null
- src.active2 = null
-
- if(src.check_access(src.scan))
- src.authenticated = src.scan.registered_name
- src.rank = src.scan.assignment
- src.screen = 1
-
- if(src.authenticated)
-
- if(href_list["screen"])
- src.screen = text2num(href_list["screen"])
- if(src.screen < 1)
- src.screen = 1
-
- src.active1 = null
- src.active2 = null
-
- if(href_list["vir"])
- var/datum/data/record/v = locate(href_list["vir"])
- src.temp = "GNAv2 based virus lifeform V-[v.fields["id"]] "
- src.temp += "Name: [v.fields["name"]] "
- src.temp += "Antigen: [v.fields["antigen"]]"
- src.temp += "Spread: [v.fields["spread type"]] "
- src.temp += "Details: [v.fields["description"]] "
-
- if(href_list["del_all"])
- src.temp = "Are you sure you wish to delete all records? \n\tYes \n\tNo "
-
- if(href_list["del_all2"])
- for(var/datum/data/record/R in data_core.medical)
- //R = null
- qdel(R)
- //Foreach goto(494)
- src.temp = "All records deleted."
-
- if(href_list["field"])
- var/a1 = src.active1
- var/a2 = src.active2
- switch(href_list["field"])
- if("fingerprint")
- if(istype(src.active1, /datum/data/record))
- var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN)))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(src.active1, /datum/data/record))
- if(src.active1.fields["sex"] == "Male")
- src.active1.fields["sex"] = "Female"
- else
- src.active1.fields["sex"] = "Male"
- if("age")
- if(istype(src.active1, /datum/data/record))
- var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["age"] = t1
- if("mi_dis")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis"] = t1
- if("mi_dis_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis_d"] = t1
- if("ma_dis")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis"] = t1
- if("ma_dis_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis_d"] = t1
- if("alg")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg"] = t1
- if("alg_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg_d"] = t1
- if("cdi")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi"] = t1
- if("cdi_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi_d"] = t1
- if("notes")
- if(istype(src.active2, /datum/data/record))
- var/t1 = html_encode(trim(copytext(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message,1,MAX_MESSAGE_LEN)))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["notes"] = t1
- if("p_stat")
- if(istype(src.active1, /datum/data/record))
- src.temp = "Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled "
- if("m_stat")
- if(istype(src.active1, /datum/data/record))
- src.temp = "Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable "
- if("b_type")
- if(istype(src.active2, /datum/data/record))
- src.temp = "Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ "
- if("b_dna")
- if(istype(src.active1, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["dna"] = t1
- if("vir_name")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if(v)
- var/t1 = sanitize(copytext(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["name"] = t1
- if("vir_desc")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if(v)
- var/t1 = sanitize(copytext(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["description"] = t1
- else
-
- if(href_list["p_stat"])
- if(src.active1)
- switch(href_list["p_stat"])
- if("deceased")
- src.active1.fields["p_stat"] = "*Deceased*"
- if("ssd")
- src.active1.fields["p_stat"] = "*SSD*"
- if("active")
- src.active1.fields["p_stat"] = "Active"
- if("unfit")
- src.active1.fields["p_stat"] = "Physically Unfit"
- if("disabled")
- src.active1.fields["p_stat"] = "Disabled"
-
- if(href_list["m_stat"])
- if(src.active1)
- switch(href_list["m_stat"])
- if("insane")
- src.active1.fields["m_stat"] = "*Insane*"
- if("unstable")
- src.active1.fields["m_stat"] = "*Unstable*"
- if("watch")
- src.active1.fields["m_stat"] = "*Watch*"
- if("stable")
- src.active1.fields["m_stat"] = "Stable"
-
-
- if(href_list["b_type"])
- if(src.active2)
- switch(href_list["b_type"])
- if("an")
- src.active2.fields["b_type"] = "A-"
- if("bn")
- src.active2.fields["b_type"] = "B-"
- if("abn")
- src.active2.fields["b_type"] = "AB-"
- if("on")
- src.active2.fields["b_type"] = "O-"
- if("ap")
- src.active2.fields["b_type"] = "A+"
- if("bp")
- src.active2.fields["b_type"] = "B+"
- if("abp")
- src.active2.fields["b_type"] = "AB+"
- if("op")
- src.active2.fields["b_type"] = "O+"
-
-
- if(href_list["del_r"])
- if(src.active2)
- src.temp = "Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo "
-
- if(href_list["del_r2"])
- if(src.active2)
- //src.active2 = null
- qdel(src.active2)
-
- if(href_list["d_rec"])
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/datum/data/record/M = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- src.temp = "Record Not Found!"
- return
- for(var/datum/data/record/E in data_core.medical)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- else
- //Foreach continue //goto(2540)
- src.active1 = R
- src.active2 = M
- src.screen = 4
-
- if(href_list["new"])
- if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record( )
- R.fields["name"] = src.active1.fields["name"]
- R.fields["id"] = src.active1.fields["id"]
- R.name = text("Medical Record #[]", R.fields["id"])
- R.fields["b_type"] = "Unknown"
- R.fields["b_dna"] = "Unknown"
- R.fields["mi_dis"] = "None"
- R.fields["mi_dis_d"] = "No minor disabilities have been declared."
- R.fields["ma_dis"] = "None"
- R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
- R.fields["alg"] = "None"
- R.fields["alg_d"] = "No allergies have been detected in this patient."
- R.fields["cdi"] = "None"
- R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- R.fields["notes"] = "No notes."
- data_core.medical += R
- src.active2 = R
- src.screen = 4
-
- if(href_list["add_c"])
- if(!( istype(src.active2, /datum/data/record) ))
- return
- var/a2 = src.active2
- var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- counter++
- src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
-
- if(href_list["del_c"])
- if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
- src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
-
- if(href_list["search"])
- var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
- if((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!interactable()) && (!istype(usr, /mob/living/silicon)))))
- return
- src.active1 = null
- src.active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.medical)
- if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
- src.active2 = R
- else
- //Foreach continue //goto(3229)
- if(!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
- else
- for(var/datum/data/record/E in data_core.general)
- if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
- src.active1 = E
- else
- //Foreach continue //goto(3334)
- src.screen = 4
-
- if(href_list["print_p"])
- if(!( src.printing ))
- src.printing = 1
- var/datum/data/record/record1 = null
- var/datum/data/record/record2 = null
- if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- record1 = active1
- if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- record2 = active2
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
- P.info = "Medical Record "
- if(record1)
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
- P.name = text("Medical Record ([])", record1.fields["name"])
- else
- P.info += "General Record Lost! "
- P.name = "Medical Record"
- if(record2)
- P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["b_type"], record2.fields["b_dna"], record2.fields["mi_dis"], record2.fields["mi_dis_d"], record2.fields["ma_dis"], record2.fields["ma_dis_d"], record2.fields["alg"], record2.fields["alg_d"], record2.fields["cdi"], record2.fields["cdi_d"], decode(record2.fields["notes"]))
- var/counter = 1
- while(record2.fields[text("com_[]", counter)])
- P.info += text("[] ", record2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Medical Record Lost! "
- P.info += ""
- src.printing = null
-
- interact()
- return
diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm
deleted file mode 100644
index 35e981a4a7a..00000000000
--- a/code/modules/computer3/computers/message.dm
+++ /dev/null
@@ -1,452 +0,0 @@
-/obj/machinery/computer3/message_monitor
- default_prog = /datum/file/program/message_mon
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/prox)
-
-
-//BROKEN AS HELL, DON'T USE UNTIL FIXED
-
-/datum/file/program/message_mon
- name = "Message Monitor Console"
- desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages."
- active_state = "comm_logs"
- var/hack_icon = "comm_logsc"
- var/normal_icon = "comm_logs"
-
- //Server linked to.
- var/obj/machinery/message_server/linkedServer = null
- //Sparks effect - For emag
- //var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread
-
- //Messages - Saves me time if I want to change something.
- var/noserver = "ALERT: No server detected. "
- var/incorrectkey = "ALERT: Incorrect decryption key! "
- var/defaultmsg = "Welcome. Please select an option. "
- var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit! "
-
- //Computer properties
- var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
- var/hacking = 0 // Is it being hacked into by the AI/Cyborg
- var/emag = 0 // When it is emagged.
- var/message = "System bootup complete. Please select an option. " // The message that shows on the main menu.
- var/auth = 0 // Are they authenticated?
- var/optioncount = 7
-
- // Custom Message Properties
- var/customsender = "System Administrator"
- var/obj/item/device/pda/customrecepient = null
- var/customjob = "Admin"
- var/custommessage = "This is a test, please ignore."
-
-
- procinitialize()
- if(!linkedServer)
- if(message_servers && message_servers.len > 0)
- linkedServer = message_servers[1]
- return
-
-
- update_icon()
- if(emag || hacking)
- overlay.icon_state = hack_icon
- else
- overlay.icon_state = normal_icon
- computer.update_icon()
-
- interact()
- if(!interactable())
- return
- //If the computer is being hacked or is emagged, display the reboot message.
- if(hacking || emag)
- message = rebootmsg
- var/dat = "Message Monitor Console "
- dat += "Message Monitor Console "
- dat += " "
-
- if(auth)
- dat += ""
- else
- dat += " \[Unauthenticated\] /"
- dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\] ":"\[Off\] "] "
-
- if(hacking || emag)
- screen = 2
- else if(!auth || !linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
- if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) message = noserver
- screen = 0
-
- switch(screen)
- //Main menu
- if(0)
- // = TAB
- var/i = 0
- dat += " [++i]. Link To A Server "
- if(auth)
- if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
- dat += " ERROR: Server not found! "
- else
- dat += " [++i]. View Message Logs "
- dat += " [++i]. View Request Console Logs "
- dat += " [++i]. Clear Message Logs "
- dat += " [++i]. Clear Request Console Logs "
- dat += " [++i]. Set Custom Key "
- dat += " [++i]. Send Admin Message "
- else
- for(var/n = ++i; n <= optioncount; n++)
- dat += " [n]. --------------- "
- if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
- //Malf/Traitor AIs can bruteforce into the system to gain the Key.
- dat += "*&@#. Bruteforce Key "
- else
- dat += " "
-
- //Bottom message
- if(!auth)
- dat += "Please authenticate with the server in order to show additional options. "
- else
- dat += "Reg, #514 forbids sending messages containing Erotic Rendering Properties. "
-
- //Message Logs
- if(1)
- var/index = 0
- //var/recipient = "Unspecified" //name of the person
- //var/sender = "Unspecified" //name of the sender
- //var/message = "Blank" //transferred message
- dat += "Back - Refresh "
- dat += "X Sender Recipient Message "
- for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
- index++
- if(index > 3000)
- break
- // Del - Sender - Recepient - Message
- // X - Al Green - Your Mom - WHAT UP!?
- dat += "X [pda.sender] [pda.recipient] [pda.message] "
- dat += "
"
- //Hacking screen.
- if(2)
- if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
- dat += "Brute-forcing for server key. It will take 20 seconds for every character that the password has."
- dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time."
- else
- //It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever.
- dat += {"01000010011100100111010101110100011001010010110
- 10110011001101111011100100110001101101001011011100110011
- 10010000001100110011011110111001000100000011100110110010
- 10111001001110110011001010111001000100000011010110110010
- 10111100100101110001000000100100101110100001000000111011
- 10110100101101100011011000010000001110100011000010110101
- 10110010100100000001100100011000000100000011100110110010
- 10110001101101111011011100110010001110011001000000110011
- 00110111101110010001000000110010101110110011001010111001
- 00111100100100000011000110110100001100001011100100110000
- 10110001101110100011001010111001000100000011101000110100
- 00110000101110100001000000111010001101000011001010010000
- 00111000001100001011100110111001101110111011011110111001
- 00110010000100000011010000110000101110011001011100010000
- 00100100101101110001000000111010001101000011001010010000
- 00110110101100101011000010110111001110100011010010110110
- 10110010100101100001000000111010001101000011010010111001
- 10010000001100011011011110110111001110011011011110110110
- 00110010100100000011000110110000101101110001000000111001
- 00110010101110110011001010110000101101100001000000111100
- 10110111101110101011100100010000001110100011100100111010
- 10110010100100000011010010110111001110100011001010110111
- 00111010001101001011011110110111001110011001000000110100
- 10110011000100000011110010110111101110101001000000110110
- 00110010101110100001000000111001101101111011011010110010
- 10110111101101110011001010010000001100001011000110110001
- 10110010101110011011100110010000001101001011101000010111
- 00010000001001101011000010110101101100101001000000111001
- 10111010101110010011001010010000001101110011011110010000
- 00110100001110101011011010110000101101110011100110010000
- 00110010101101110011101000110010101110010001000000111010
- 00110100001100101001000000111001001101111011011110110110
- 10010000001100100011101010111001001101001011011100110011
- 10010000001110100011010000110000101110100001000000111010
- 001101001011011010110010100101110"}
-
- //Fake messages
- if(3)
- dat += "Back - Reset "
-
- dat += {"
- Sender
- Sender's Job
- Recipient
- Message "}
- //Sender - Sender's Job - Recepient - Message
- //Al Green- Your Dad - Your Mom - WHAT UP!?
-
- dat += {"[customsender]
- [customjob]
- [customrecepient ? customrecepient.owner : "NONE"]
- [custommessage] "}
- dat += "
Send "
-
- //Request Console Logs
- if(4)
-
- var/index = 0
- /* data_rc_msg
- X - 5%
- var/rec_dpt = "Unspecified" //name of the person - 15%
- var/send_dpt = "Unspecified" //name of the sender- 15%
- var/message = "Blank" //transferred message - 300px
- var/stamp = "Unstamped" - 15%
- var/id_auth = "Unauthenticated" - 15%
- var/priority = "Normal" - 10%
- */
- dat += "Back - Refresh "
- dat += {"X Sending Dep. Receiving Dep.
- Message Stamp ID Auth. Priority. "}
- for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs)
- index++
- if(index > 3000)
- break
- // Del - Sender - Recepient - Message
- // X - Al Green - Your Mom - WHAT UP!?
- dat += {"X [rc.send_dpt]
- [rc.rec_dpt] [rc.message] [rc.stamp] [rc.id_auth] [rc.priority] "}
- dat += "
"
-
-
- popup.width = 700
- popup.height = 700
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
-
-
- proc/BruteForce(mob/usr as mob)
- if(isnull(linkedServer))
- to_chat(usr, "Could not complete brute-force: Linked Server Disconnected! ")
- else
- var/currentKey = src.linkedServer.decryptkey
- to_chat(usr, "Brute-force completed! The key is '[currentKey]'. ")
- src.hacking = 0
- src.active_state = normal_icon
- src.screen = 0 // Return the screen back to normal
-
- proc/UnmagConsole()
- src.active_state = normal_icon
- src.emag = 0
-
- proc/ResetMessage()
- customsender = "System Administrator"
- customrecepient = null
- custommessage = "This is a test, please ignore."
- customjob = "Admin"
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if("auth" in href_list)
- if(auth)
- auth = 0
- screen = 0
- else
- var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
- if(dkey && dkey != "")
- if(src.linkedServer.decryptkey == dkey)
- auth = 1
- else
- message = incorrectkey
-
- //Turn the server on/off.
- if("active" in href_list)
- if(auth) linkedServer.active = !linkedServer.active
- //Find a server
- if("find" in href_list)
- if(message_servers && message_servers.len > 1)
- src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers
- message = "NOTICE: Server selected. "
- else if(message_servers && message_servers.len > 0)
- linkedServer = message_servers[1]
- message = "NOTICE: Only Single Server Detected - Server selected. "
- else
- message = noserver
-
- //View the logs - KEY REQUIRED
- if("view" in href_list)
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.screen = 1
-
- //Clears the logs - KEY REQUIRED
- if("clear" in href_list)
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.linkedServer.pda_msgs = list()
- message = "NOTICE: Logs cleared. "
- //Clears the request console logs - KEY REQUIRED
- if("clearr" in href_list)
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.linkedServer.rc_msgs = list()
- message = "NOTICE: Logs cleared. "
- //Change the password - KEY REQUIRED
- if("pass" in href_list)
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
- if(dkey && dkey != "")
- if(src.linkedServer.decryptkey == dkey)
- var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
- if(length(newkey) <= 3)
- message = "NOTICE: Decryption key too short! "
- else if(length(newkey) > 16)
- message = "NOTICE: Decryption key too long! "
- else if(newkey && newkey != "")
- src.linkedServer.decryptkey = newkey
- message = "NOTICE: Decryption key set. "
- else
- message = incorrectkey
-
- //Hack the Console to get the password
- if("hack" in href_list)
- if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
- src.hacking = 1
- src.screen = 2
- src.active_state = hack_icon
- //Time it takes to bruteforce is dependant on the password length.
- spawn(100*length(src.linkedServer.decryptkey))
- if(src && src.linkedServer && usr)
- BruteForce(usr)
- //Delete the log.
- if("delete" in href_list)
- //Are they on the view logs screen?
- if(screen == 1)
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else //if(istype(href_list["delete"], /datum/data_pda_msg))
- src.linkedServer.pda_msgs -= locate(href_list["delete"])
- message = "NOTICE: Log Deleted! "
- //Delete the request console log.
- if("deleter" in href_list)
- //Are they on the view logs screen?
- if(screen == 4)
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else //if(istype(href_list["delete"], /datum/data_pda_msg))
- src.linkedServer.rc_msgs -= locate(href_list["deleter"])
- message = "NOTICE: Log Deleted! "
- //Create a custom message
- if("msg" in href_list)
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.screen = 3
- //Fake messaging selection - KEY REQUIRED
- if("select" in href_list)
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- screen = 0
- else
- switch(href_list["select"])
-
- //Reset
- if("Reset")
- ResetMessage()
-
- //Select Your Name
- if("Sender")
- customsender = input(usr, "Please enter the sender's name.") as text|null
-
- //Select Receiver
- if("Recepient")
- //Get out list of viable PDAs
- var/list/obj/item/device/pda/sendPDAs = list()
- for(var/obj/item/device/pda/P in PDAs)
- if(!P.owner || P.toff || P.hidden) continue
- sendPDAs += P
- if(PDAs && PDAs.len > 0)
- customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sendPDAs
- else
- customrecepient = null
-
-
- //Enter custom job
- if("RecJob")
- customjob = input(usr, "Please enter the sender's job.") as text|null
-
- //Enter message
- if("Message")
- custommessage = input(usr, "Please enter your message.") as text|null
- custommessage = sanitize(copytext(custommessage), 1, MAX_MESSAGE_LEN)
-
- //Send message
- if("Send")
-
- if(isnull(customsender) || customsender == "")
- customsender = "UNKNOWN"
-
- if(isnull(customrecepient))
- message = "NOTICE: No recepient selected! "
- return src.attack_hand(usr)
-
- if(isnull(custommessage) || custommessage == "")
- message = "NOTICE: No message entered! "
- return src.attack_hand(usr)
-
- var/obj/item/device/pda/PDARec = null
- for(var/obj/item/device/pda/P in PDAs)
- if(!P.owner || P.toff || P.hidden) continue
- if(P.owner == customsender)
- PDARec = P
- //Sender isn't faking as someone who exists
- if(isnull(PDARec))
- src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
- customrecepient.tnote += "← From [customsender] ([customjob]): [custommessage] "
- if(!customrecepient.silent)
- playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for(var/mob/O in hearers(3, customrecepient.loc))
- O.show_message(text("[bicon(customrecepient)] *[customrecepient.ttone]*"))
- if( customrecepient.loc && ishuman(customrecepient.loc) )
- var/mob/living/carbon/human/H = customrecepient.loc
- to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply )"
-
- log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
- customrecepient.overlays.Cut()
- customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
- //Sender is faking as someone who exists
- else
- src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
- customrecepient.tnote += "← From [PDARec.owner] ([customjob]): [custommessage] "
- if(!customrecepient.silent)
- playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for(var/mob/O in hearers(3, customrecepient.loc))
- O.show_message(text("[bicon(customrecepient)] *[customrecepient.ttone]*"))
- if( customrecepient.loc && ishuman(customrecepient.loc) )
- var/mob/living/carbon/human/H = customrecepient.loc
- to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply )"
-
- log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
- customrecepient.overlays.Cut()
- customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
- //Finally..
- ResetMessage()
-
- //Request Console Logs - KEY REQUIRED
- if("viewr" in href_list)
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.screen = 4
-
-// to_chat(usr, href_list["select"])
-
- if("back" in href_list)
- src.screen = 0
- interact()
\ No newline at end of file
diff --git a/code/modules/computer3/computers/power.dm b/code/modules/computer3/computers/power.dm
deleted file mode 100644
index 38477be836d..00000000000
--- a/code/modules/computer3/computers/power.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/obj/machinery/computer3/powermonitor
- default_prog = /datum/file/program/powermon
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/cable)
- icon_state = "frame-eng"
-
-/datum/file/program/powermon
- name = "power monitoring console"
- desc = "It monitors APC status."
- active_state = "power"
-
- proc/format(var/obj/machinery/power/apc/A)
- var/static/list/S = list(" Off","AOff"," On", " AOn")
- var/static/list/chg = list("N","C","F")
- return "[copytext(add_tspace("\The [A.area]", 30), 1, 30)] [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] \
- [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"] "
-
- interact()
- if(!interactable())
- return
- if(!computer.net)
- computer.Crash(MISSING_PERIPHERAL)
- return
- var/list/L = computer.net.get_machines(/obj/machinery/power/apc)
- var/t = ""
- t += "Refresh "
- if(!L || !L.len)
- t += "No connection"
- else
- var/datum/powernet/powernet = computer.net.connect_to(/datum/powernet,null)
- if(powernet)
- t += "Total power: [powernet.avail] W Total load: [num2text(powernet.viewload,10)] W "
- else
- t += "Power statistics unavailable "
- t += ""
-
- if(L.len > 0)
- t += "Area Eqp./Lgt./Env. Load Cell "
- for(var/obj/machinery/power/apc/A in L)
- t += src.format(A)
- t += " "
-
- popup.set_content(t)
- popup.open()
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
- interact()
diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm
deleted file mode 100644
index e2c41a6f71d..00000000000
--- a/code/modules/computer3/computers/prisoner.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-/obj/machinery/computer3/prisoner
- default_prog = /datum/file/program/prisoner
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio)
- icon_state = "frame-sec"
-
-/datum/file/program/prisoner
- name = "Prisoner Management Console"
- active_state = "explosive"
- req_access = list(access_armory)
-
- var/id = 0.0
- var/temp = null
- var/status = 0
- var/timeleft = 60
- var/stop = 0.0
- var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
-
-
- interact()
- if(!interactable())
- return
- var/dat
- dat += "Prisoner Implant Manager System "
- if(screen == 0)
- dat += "Unlock Console "
- else if(screen == 1)
- dat += " Chemical Implants "
- var/turf/Tr = null
- for(var/obj/item/weapon/implant/chem/C in world)
- Tr = get_turf(C)
- if((Tr) && (Tr.z != computer.z)) continue//Out of range
- if(!C.implanted) continue
- dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
- dat += "((1) ) "
- dat += "((5) ) "
- dat += "((10) ) "
- dat += "******************************** "
- dat += " Tracking Implants "
- for(var/obj/item/weapon/implant/tracking/T in world)
- Tr = get_turf(T)
- if((Tr) && (Tr.z != computer.z)) continue//Out of range
- if(!T.implanted) continue
- var/loc_display = "Unknown"
- var/mob/living/carbon/M = T.imp_in
- if(is_station_level(M.z) && !istype(M.loc, /turf/space))
- var/turf/mob_loc = get_turf(M)
- loc_display = mob_loc.loc
- dat += "ID: [T.id] | Location: [loc_display] "
- dat += "(Send Message ) | "
- dat += "******************************** "
- dat += "Lock Console "
-
- popup.width = 400
- popup.height = 500
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
-
-
- process()
- if(!..())
- interact()
- return
-
-
- Topic(href, href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if(href_list["inject1"])
- var/obj/item/weapon/implant/I = locate(href_list["inject1"])
- if(istype(I))
- I.activate(1)
-
- else if(href_list["inject5"])
- var/obj/item/weapon/implant/I = locate(href_list["inject5"])
- if(istype(I))
- I.activate(5)
-
- else if(href_list["inject10"])
- var/obj/item/weapon/implant/I = locate(href_list["inject10"])
- if(istype(I))
- I.activate(10)
-
- else if(href_list["lock"])
- screen = !screen
-
- else if(href_list["warn"])
- var/warning = trim(sanitize(copytext(input(usr,"Message:","Enter your message here!",""),1,MAX_MESSAGE_LEN)))
- if(!warning) return
- var/obj/item/weapon/implant/I = locate(href_list["warn"])
- if( istype(I) && I.imp_in)
- var/mob/living/carbon/R = I.imp_in
- log_say("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]")
- to_chat(R, "\green You hear a voice in your head saying: '[warning]'")
-
- interact()
- return
diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm
deleted file mode 100644
index a68475bf732..00000000000
--- a/code/modules/computer3/computers/robot.dm
+++ /dev/null
@@ -1,208 +0,0 @@
-/obj/machinery/computer3/robotics
- default_prog = /datum/file/program/borg_control
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio)
- icon_state = "frame-rnd"
-
-/datum/file/program/borg_control
- name = "Cyborg Control"
- desc = "Used to remotely lockdown or detonate linked Cyborgs."
- active_state = "robot"
- var/id = 0.0
- var/temp = null
- var/status = 0
- var/timeleft = 60
- var/stop = 0.0
- var/screen = 0 // 0 - Main Menu, 1 - Cyborg Status, 2 - Kill 'em All! -- In text
- req_access = list(access_robotics)
-
- proc/start_sequence()
- do
- if(src.stop)
- src.stop = 0
- return
- src.timeleft--
- sleep(10)
- while(src.timeleft)
-
- for(var/mob/living/silicon/robot/R in mob_list)
- if(!R.scrambledcodes)
- R.self_destruct()
- return
-
-
- interact()
- if(!interactable() || is_away_level(computer.z))
- return
- var/dat
- if(src.temp)
- dat = "[src.temp] Clear Screen "
- else
- if(screen == 0)
- //dat += "Cyborg Control Console "
- dat += "1. Cyborg Status "
- dat += "2. Emergency Full Destruct "
- if(screen == 1)
- for(var/mob/living/silicon/robot/R in mob_list)
- if(istype(usr, /mob/living/silicon/ai))
- if(R.connected_ai != usr)
- continue
- if(istype(usr, /mob/living/silicon/robot))
- if(R != usr)
- continue
- if(R.scrambledcodes)
- continue
-
- dat += "[R.name] |"
- if(R.stat)
- dat += " Not Responding |"
- else if(!R.canmove)
- dat += " Locked Down |"
- else
- dat += " Operating Normally |"
- if(!R.canmove)
- else if(R.cell)
- dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
- else
- dat += " No Cell Installed |"
- if(R.module)
- dat += " Module Installed ([R.module.name]) |"
- else
- dat += " No Module Installed |"
- if(R.connected_ai)
- dat += " Slaved to [R.connected_ai.name] |"
- else
- dat += " Independent from AI |"
- if(istype(usr, /mob/living/silicon))
- if(issilicon(usr) && is_special_character(usr) && !R.emagged)
- dat += "(Hack ) "
- dat += "([R.canmove ? "Lockdown" : "Release"] ) "
- dat += "(Destroy ) "
- dat += " "
- dat += "(Return to Main Menu) "
- if(screen == 2)
- if(!src.status)
- dat += {"Emergency Robot Self-Destruct \nStatus: Off
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
- \nStart Sequence
- \n
- \nClose "}
- else
- dat = {"Emergency Robot Self-Destruct \nStatus: Activated
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n \nStop Sequence
- \n
- \nClose "}
- dat += "(Return to Main Menu) "
-
- popup.set_content(dat)
- popup.open()
- return
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || ..(href,href_list))
- return
-
- if("killall" in href_list)
- src.temp = {"Destroy Robots?
- \[Swipe ID to initiate destruction sequence\]
- Cancel "}
-
- if("do_killall" in href_list)
- var/obj/item/weapon/card/id/I = usr.get_active_hand()
- if(istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if(istype(I))
- if(src.check_access(I))
- if(!status)
- message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!")
- log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!")
- src.status = 1
- src.start_sequence()
- src.temp = null
-
- else
- to_chat(usr, "\red Access Denied.")
-
- if("stop" in href_list)
- src.temp = {"
- Stop Robot Destruction Sequence?
- Yes
- No "}
-
- if("stop2" in href_list)
- src.stop = 1
- src.temp = null
- src.status = 0
-
- if("reset" in href_list)
- src.timeleft = 60
-
- if("temp" in href_list)
- src.temp = null
- if("screen" in href_list)
- switch(href_list["screen"])
- if("0")
- screen = 0
- if("1")
- screen = 1
- if("2")
- screen = 2
- if("killbot" in href_list)
- if(computer.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["killbot"])
- if(R)
- var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- if(R.mind && R.mind.special_role && R.emagged)
- to_chat(R, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.")
- R.ResetSecurityCodes()
-
- else
- message_admins("\blue [key_name_admin(usr)] detonated [R.name]!")
- log_game("\blue [key_name_admin(usr)] detonated [R.name]!")
- R.self_destruct()
- else
- to_chat(usr, "\red Access Denied.")
-
- if("stopbot" in href_list)
- if(computer.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
- if(R && istype(R)) // Extra sancheck because of input var references
- var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- R.canmove = !R.canmove
- if(R.lockcharge)
- // R.cell.charge = R.lockcharge
- R.lockcharge = !R.lockcharge
- to_chat(R, "Your lockdown has been lifted!")
- else
- R.lockcharge = !R.lockcharge
- // R.cell.charge = 0
- to_chat(R, "You have been locked down!")
-
- else
- to_chat(usr, "\red Access Denied.")
-
- if("magbot" in href_list)
- if(computer.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["magbot"])
- if(R)
- var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
-// message_admins("\blue [key_name_admin(usr)] emagged [R.name] using robotic console!")
- log_game("[key_name(usr)] emagged [R.name] using robotic console!")
- R.emagged = 1
- if(R.mind.special_role)
- R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
-
- interact()
- return
diff --git a/code/modules/computer3/computers/scanconsole.dm b/code/modules/computer3/computers/scanconsole.dm
deleted file mode 100644
index 747ca4b1a61..00000000000
--- a/code/modules/computer3/computers/scanconsole.dm
+++ /dev/null
@@ -1,1274 +0,0 @@
-/obj/machinery/computer3/scan_consolenew
- default_prog = /datum/file/program/dnascanner
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/storage/removable,/obj/item/part/computer/networking/prox)
-
-
-#define MAX_UIBLOCK 13
-#define MAX_SEBLOCK 14
-
-/datum/file/program/dnascanner
- name = "DNA Scanner and Manipulator"
- desc = "The DNA ScaM is sure to change your life forever."
- active_state = "dna"
- var/obj/machinery/dna_scannernew/scanner = null
-
- var/ui_block = 1
- var/se_block = 1
- var/subblock = 1
-
- var/uitarget = 1
- var/uitargethex = "1"
-
- var/radduration = 2
- var/radstrength = 1
-
- var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
-
- var/mode = 0
- // These keep track of the patient status
- var/present = 0
- var/viable = 0
-
- var/bufferlabel = ""
- var/datum/dna/buffer = null
- var/obj/item/part/computer/target_drive = null
-
- Reset()
- ..()
- mode = 0
- scanner = null
- ui_block = 1
- se_block = 1
- subblock = 1
- buffer = null
- bufferlabel = ""
-
-
- Topic(var/href, var/list/href_list)
- if(!interactable() || !computer.net || ..(href,href_list))
- return
-
- scanner = computer.net.connect_to(/obj/machinery/dna_scannernew, scanner) // if exists, will be verified
- if(!scanner)
- computer.Crash(NETWORK_FAILURE)
- return
-
- // todo check everything goddamnit
- present = scanner.occupant && scanner.occupant.dna
- viable = present && !(NOCLONE in scanner.occupant.mutations)
-
- // current screen/function
- if("mode" in href_list)
- mode = text2num(href_list["mode"])
- // locks scanner door
- if("lock" in href_list)
- scanner.locked = !scanner.locked
-
- // inject good-juice
- if("rejuv" in href_list)
- rejuv()
-
- // expose to radiation, controlled otherwise
- if("pulse" in href_list)
- pulse(href_list["pulse"]) // ui, se, or nothing/null
-
- if("duration" in href_list)
- var/modifier = text2num(href_list["duration"])
- radduration += modifier
- if("strength" in href_list)
- var/modifier = text2num(href_list["strength"])
- radstrength += modifier
-
- if("uiblock" in href_list)
- ui_block = text2num(href_list["uiblock"])
- if("seblock" in href_list)
- se_block = text2num(href_list["seblock"])
- if("subblock" in href_list)
- subblock = text2num(href_list["subblock"])
- if("uitarget" in href_list)
- uitarget = text2num(href_list["uitarget"])
- uitargethex = num2hex(uitarget)
-
- // save dna to buffer - buffer=se,ui,ue,all,clear
- if("buffer" in href_list)
- if(!viable)
- return
- var/which = href_list["buffer"]
- if(!which || which == "clear")
- buffer = null
- else
- if(!buffer)
- buffer = new
- if( which == "all" )
- buffer.unique_enzymes = scanner.occupant.dna.unique_enzymes
- buffer.struc_enzymes = scanner.occupant.dna.struc_enzymes
- buffer.uni_identity = scanner.occupant.dna.uni_identity
- buffer.real_name = scanner.occupant.dna.real_name
- buffer.mutantrace = scanner.occupant.dna.mutantrace
- if( which == "se" )
- buffer.struc_enzymes = scanner.occupant.dna.struc_enzymes
- buffer.mutantrace = scanner.occupant.dna.mutantrace
- if( which == "ui" )
- buffer.uni_identity = scanner.occupant.dna.uni_identity
- if( which == "ue" )
- buffer.uni_identity = scanner.occupant.dna.uni_identity
- buffer.unique_enzymes = scanner.occupant.dna.unique_enzymes
- buffer.real_name = scanner.occupant.dna.real_name
-
- // save buffer to file -
- if("save" in href_list)
- if(!viable || !buffer)
- return
- var/datum/file/data/genome/G = null
- var/obj/item/part/computer/dest = device
- if(target_drive)
- dest = target_drive
-
- switch(href_list["save"])
- if("se")
- if(buffer.struc_enzymes)
- G = new /datum/file/data/genome/SE()
- G.content = buffer.struc_enzymes
- G:mutantrace = buffer.mutantrace // : not . due to inheritance
- G.real_name = buffer.real_name
- if("ui")
- if(buffer.uni_identity)
- G = new /datum/file/data/genome/UI()
- G.content = buffer.uni_identity
- G.real_name = buffer.real_name
- if("ue")
- if(buffer.uni_identity)
- G = new /datum/file/data/genome/UI/UE()
- G.content = buffer.uni_identity
- G.real_name = buffer.real_name
- if(G && dest)
- var/label = input(usr, "Enter a filename:", "Save file", buffer.real_name) as text
- G.name = G.name + "([label])"
- dest:addfile(G)
-
- // load buffer from file
- if("load" in href_list)
- var/datum/file/data/genome/G = locate(href_list["load"])
- if(G)
- if(!buffer)
- buffer = new
- switch(G.type)
- if(/datum/file/data/genome/SE)
- buffer.struc_enzymes = G.content
- buffer.mutantrace = G:mutantrace
- if(/datum/file/data/genome/UI/UE)
- buffer.uni_identity = G.content
- buffer.real_name = G.real_name
- buffer.unique_enzymes = md5(buffer.real_name)
- if(/datum/file/data/genome/UI)
- buffer.uni_identity = G.content
- if(/datum/file/data/genome/cloning)
- var/datum/dna/record = G:record
- buffer.unique_enzymes = record.unique_enzymes
- buffer.struc_enzymes = record.struc_enzymes
- buffer.uni_identity = record.uni_identity
- buffer.real_name = record.real_name
- buffer.mutantrace = record.mutantrace
-
-
- // inject genetics into occupant
- if("inject" in href_list)
- if(!buffer || !viable)
- return
-
- var/which = href_list["inject"]
- var/datum/dna/target = scanner.occupant.dna
- switch(which)
- if("all",null)
- if(buffer.struc_enzymes)
- target.struc_enzymes = buffer.struc_enzymes
- if(buffer.uni_identity)
- target.uni_identity = buffer.uni_identity
- if(buffer.real_name)
- target.real_name = buffer.real_name
- target.unique_enzymes = md5(target.real_name)
- updateappearance(scanner.occupant,target.uni_identity)
- domutcheck(scanner.occupant, scanner, 1)
-
- if(ishuman(scanner.occupant))
- target.mutantrace = buffer.mutantrace
- scanner.occupant:update_mutantrace()
- if("se")
- if(buffer.struc_enzymes)
- target.struc_enzymes = buffer.struc_enzymes
- domutcheck(scanner.occupant, scanner, 1)
- if(ishuman(scanner.occupant))
- target.mutantrace = buffer.mutantrace
- scanner.occupant:update_mutantrace()
- if("ui")
- if(buffer.uni_identity)
- target.uni_identity = buffer.uni_identity
- updateappearance(scanner.occupant,target.uni_identity)
- if("ue")
- if(buffer.uni_identity)
- target.uni_identity = buffer.uni_identity
- if(buffer.real_name)
- target.real_name = buffer.real_name
- target.unique_enzymes = md5(target.real_name)
- updateappearance(scanner.occupant,target.uni_identity)
-
- // generate dna injector
- if("generate" in href_list)
- if(!buffer || !injectorready)
- return
- buffer.check_integrity()
- var/which = href_list["generate"]
- var/obj/item/weapon/dnainjector/inj
- switch(which)
- if("se")
- inj = new(computer.loc)
- inj.dnatype = "se"
- inj.dna = buffer.struc_enzymes
- inj.mutantrace = buffer.mutantrace
- inj.name = "Structural Enzymes"
- if("ui")
- inj = new(computer.loc)
- inj.dnatype = "ui"
- inj.dna = buffer.uni_identity
- inj.ue = null
- inj.name = "Unique Identifiers"
- if("ue")
- inj = new(computer.loc)
- inj.dnatype = "ui"
- inj.dna = buffer.uni_identity
- inj.ue = buffer.real_name
- inj.name = "Unique Enzymes + Unique Identifiers"
- if(inj)
- injectorready = 0
- spawn(300)
- injectorready = 1
- var/label = input(usr, "Enter a label", "Label [inj.name] Injector", buffer.real_name) as null|text
- if(label && inj) // it's possible it was deleted before we get here, input suspends execution
- inj.name += " ([label])"
-
- interact()
- return // putting this in there to visually mark the end of topic() while I do other things
-
- proc/menu()
- if(!present && (mode==1 || mode==2)) // require viable occupant
- mode = 0
- switch(mode)
- if(0) // MAIN MENU
- return main_menu()
-
- if(1)
- return ui_menu()
- if(2)
- return se_menu()
-
- if(3)
- return emitter_menu()
-
- if(4)
- return buffer_menu()
-
- // unified header with health data
- // option to show UI,UE,SE as plaintext
- proc/status_display(var/dna_summary = 0)
- var/mob/living/occupant = scanner.occupant
- var/status_html
- if(viable)
- status_html = "Health:
[occupant.health]%
"
- status_html += "Radiation Level:
[occupant.radiation]%
"
- if(ishuman(occupant))
- var/rejuvenators = round(occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100)
- status_html += "Rejuvenators:
[occupant.reagents.get_reagent_amount("inaprovaline")] units
"
-
- if(dna_summary)
- status_html += "Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
"
- status_html += "Unique Identifier:
[occupant.dna.uni_identity]
"
- status_html += "Structural Enzymes:
[occupant.dna.struc_enzymes]
"
-
- var/occupant_status = "Scanner Unoccupied"
- if(present)
- if(!viable)
- occupant_status = "Invalid DNA structure "
- else
- switch(occupant.stat) // obvious, see what their status is
- if(0)
- occupant_status = "Conscious "
- if(1)
- occupant_status = "Unconscious "
- else
- occupant_status = "DEAD "
-
- occupant_status = "[occupant.name] => [occupant_status] "
- var/dat = "Scanner Status [topic_link(src,"","Scan")][occupant_status][status_html]
"
- if(present)
- dat += topic_link(src,"lock",scanner.locked?"Unlock Scanner":"Lock Scanner") + " " + topic_link(src,"rejuv","Inject Rejuvenators")
- else
- dat += "[scanner.locked?"Unlock Scanner":"Lock Scanner"] Inject Rejuvenators "
- return dat
-
- proc/main_menu()
- var/dat = status_display(dna_summary = 1)
- dat += "Main Menu "
- if(present)
- dat += topic_link(src,"mode=1","Modify Unique Identifier") + " " + topic_link(src,"mode=2","Modify Structural Enzymes") + " "
- else
- dat += "Modify Unique Identifier Modify Structural Enzymes "
- dat += topic_link(src,"mode=3","Radiation Emitter Settings") + " " + topic_link(src,"mode=4","Transfer Buffer")
- return dat
-
-
- proc/block_plus_minus(var/topicstr, var/blockval,var/min,var/max)
- var/left = blockval - 1
- var/right = blockval + 1
- if(left < min)
- left = max
- if(right > max)
- right = min
- return topic_link(src,"[topicstr]=[left]","<-") + " [blockval] " + topic_link(src,"[topicstr]=[right]","->")
-
-
- proc/getblockstring(var/ui = 0)
- var/mainblock = "seblock"
- var/block = se_block
- var/input = scanner.occupant.dna.struc_enzymes
- if(ui)
- mainblock = "uiblock"
- block = ui_block
- input = scanner.occupant.dna.uni_identity
-
- var/string = ""
- var/subpos = 1 // keeps track of the current sub block
- var/blockpos = 1
-
- for(var/i = 1, i <= length(input), i++) // loop through each letter
-
- if(blockpos == block && subpos == subblock) // if the current block/subblock is selected, mark it
- string += fake_link(copytext(input,i,i+1))
- else
- string += topic_link(src,"[mainblock]=[blockpos];subblock=[subpos]",copytext(input,i,i+1))
-
- subpos++
- if(subpos > 3) // add a line break for every block
- string += "
"
- subpos = 1
- blockpos++
-
- string += "
"
- return string
-
- proc/ui_menu()
- if(!viable)
- return "No viable occupant detected."
- to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + " ")
- dat += "Modify Unique Identifier "
- dat += "Unique Identifier: [getblockstring(ui=1)] "
-
- dat += "Selected Block: " + block_plus_minus("uiblock",ui_block,1,MAX_UIBLOCK) + " "
- dat += "Selected Sub-Block: " + block_plus_minus("subblock",subblock,1,3) + " "
- dat += "Selected Target: " + block_plus_minus("uitarget",uitarget,0,15) + " "
- dat += "Modify Block "
- dat += topic_link(src,"pulse=ui","Irradiate") + "
"
- return dat
-
- proc/se_menu()
- if(!viable)
- return "No viable occupant detected."
- to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + " ")
- dat += "Modify Structural Enzymes "
- dat += "Structural Enzymes: [getblockstring(ui=0)] "
- dat += "Selected Block: " + block_plus_minus("seblock",se_block,1,MAX_SEBLOCK) + " "
- dat += "Selected Sub-Block: " + block_plus_minus("subblock",subblock,1,3) + " "
- dat += "Modify Block "
- dat += topic_link(src,"pulse=se","Irradiate") + "
"
- return dat
-
- proc/emitter_menu()
- to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + " ")
- dat += "Radiation Emitter Settings "
- if(viable)
- dat += topic_link(src,"pulse","Pulse Radiation")
- else
- dat += fake_link("Pulse Radiation")
- dat += " "
- dat += "Radiation Duration: " + block_plus_minus("duration",radduration,1,20) + " "
- dat += "Radiation Intensity: " + block_plus_minus("strength",radstrength,1,10) + " "
- return dat
-
- proc/buffer_menu()
-
- interact()
- if(!interactable())
- return
- popup.add_stylesheet("scannernew", 'html/browser/scannernew.css')
-
- if(!computer.net)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- scanner = computer.net.connect_to(/obj/machinery/dna_scannernew, scanner) // if exists, will be verified
- if(!scanner)
- computer.Crash(NETWORK_FAILURE)
- return
-
- // todo check everything goddamnit
-
- present = scanner.occupant && scanner.occupant.dna
- viable = present && !(NOCLONE in scanner.occupant.mutations)
-
- popup.set_content(menu())
- popup.open()
-
- proc/pulse(var/target as null|anything in list("ui","se"))
-
- //Makes sure someone is in there (And valid) before trying anything
- //More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason
-
- if(target != "ui" && target != "se")
- target = null
-
- // transforms into the fail condition instead of having it in yet another nested if block
- else if( prob(20 - (radduration / 2)))
- target += "-f"
-
- if(!viable)
- popup.set_content("No viable occupant detected.")
- popup.open()
- else
- popup.set_content("Working ... Please wait ([radduration]) Seconds)")
- popup.open()
-
- var/lock_state = scanner.locked
- scanner.locked = 1//lock it
- sleep(10*radduration)
-
- switch(target)
- if("ui")
- var/ui = scanner.occupant.dna.uni_identity
- var/block = getblock(ui,ui_block,3)
- var/result = ""
- for(var/sb = 1; sb <=3; sb++)
- var/temp = copytext(block,sb,sb+1)
- if(sb == subblock)
- temp = miniscramble("[uitargethex]",radstrength,radduration)
- result += temp
- scanner.occupant.dna.uni_identity = setblock(ui, ui_block, result,3)
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
- if("ui-f")
- if(prob(20+radstrength))
- randmutb(scanner.occupant)
- domutcheck(scanner.occupant,scanner)
- else
- randmuti(scanner.occupant)
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- scanner.occupant.apply_effect((radstrength*2)+radduration, IRRADIATE)
-
- if("se")
- var/se = scanner.occupant.dna.struc_enzymes
- var/targetblock = se_block
-
- if(!(se_block in list(2,8,10,12)) && prob (20)) // shifts the target slightly
- if(se_block <= 5)
- targetblock++
- else
- targetblock--
- var/block = getblock(scanner.occupant.dna.struc_enzymes,targetblock,3)
-
- var/result = ""
- for(var/sb = 1; sb <=3; sb++)
- var/temp = copytext(block,sb,sb+1)
- if(sb == subblock)
- temp = miniscramble(temp,radstrength,radduration)
- result += temp
-
- scanner.occupant.dna.struc_enzymes = setblock(se, se_block, result,3)
- domutcheck(scanner.occupant,scanner)
- scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
- if("se-f")
- if(prob(80-radduration))
- randmutb(scanner.occupant)
- domutcheck(scanner.occupant,scanner)
- else
- randmuti(scanner.occupant)
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- scanner.occupant.apply_effect((radstrength*2)+radduration, IRRADIATE)
-
- if(null)
- if(prob(95))
- if(prob(75))
- randmutb(scanner.occupant)
- else
- randmuti(scanner.occupant)
- else
- if(prob(95))
- randmutg(scanner.occupant)
- else
- randmuti(scanner.occupant)
- scanner.occupant.apply_effect((radstrength*3)+radduration*3, IRRADIATE)
-
-
- scanner.locked = lock_state
- interact()
-
- proc/rejuv()
- if(!viable)
- popup.set_content("No viable occupant detected.")
- popup.open()
- var/mob/living/carbon/human/H = scanner.occupant
- if(istype(H))
- var/inap = H.reagents.get_reagent_amount("inaprovaline") // oh my *god* this section was ugly before I shortened it
-
- if(inap < (REJUVENATORS_MAX - REJUVENATORS_INJECT))
- H.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT)
- else
- H.reagents.add_reagent("inaprovaline", max(REJUVENATORS_MAX - inap,0))
-
-/*
-/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
-
- temp_html = null
- var/temp_header_html = null
- var/temp_footer_html = null
-
- scanner_status_html = null // Scanner status is reset each update
- var/mob/living/occupant = scanner.occupant
- var/viable_occupant = (occupant && occupant.dna && !(NOCLONE in occupant.mutations))
- var/mob/living/carbon/human/human_occupant = scanner.occupant
-
- if(href_list["screen"]) // Passing a screen is only a request, we set current_screen here but it can be overridden below if necessary
- current_screen = href_list["screen"]
-
- if(!viable_occupant) // If there is no viable occupant only allow certain screens
- var/allowed_no_occupant_screens = list("mainmenu", "radsetmenu", "buffermenu") //These are the screens which will be allowed if there's no occupant
- if(!(current_screen in allowed_no_occupant_screens))
- href_list = new /list(0) // clear list of options
- current_screen = "mainmenu"
-
-
- if(!current_screen) // If no screen is set default to mainmenu
- current_screen = "mainmenu"
-
-
- if(!scanner) //Is the scanner not connected?
- scanner_status_html = "ERROR: No DNA Scanner connected. "
- current_screen = null // blank does not exist in the switch below, so no screen will be outputted
- updateUsrDialog()
- return
-
- usr.set_machine(src)
- if(href_list["locked"])
- if(scanner.occupant)
- scanner.locked = !( scanner.locked )
- ////////////////////////////////////////////////////////
- if(href_list["genpulse"])
- if(!viable_occupant)//Makes sure someone is in there (And valid) before trying anything
- temp_html = text("No viable occupant detected.")//More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason
- //usr << browse(temp_html, "window=scannernew;size=550x650")
- //onclose(usr, "scannernew")
- popup.set_content(temp_html)
- popup.open()
- else
-
- temp_html = text("Working ... Please wait ([] Seconds)", radduration)
- popup.set_content(temp_html)
- popup.open()
- var/lock_state = scanner.locked
- scanner.locked = 1//lock it
- sleep(10*radduration)
- if(!scanner.occupant)
- temp_html = null
- return null
- if(prob(95))
- if(prob(75))
- randmutb(scanner.occupant)
- else
- randmuti(scanner.occupant)
- else
- if(prob(95))
- randmutg(scanner.occupant)
- else
- randmuti(scanner.occupant)
- scanner.occupant.apply_effect((radstrength*3)+radduration*3, IRRADIATE)
- scanner.locked = lock_state
- temp_html = null
- dopage(src,"screen=radsetmenu")
- if(href_list["radleplus"])
- if(!viable_occupant)
- temp_html = text("No viable occupant detected.")
- popup.set_content(temp_html)
- popup.open()
- if(radduration < 20)
- radduration++
- radduration++
- dopage(src,"screen=radsetmenu")
- if(href_list["radleminus"])
- if(!viable_occupant)
- temp_html = text("No viable occupant detected.")
- popup.set_content(temp_html)
- popup.open()
- if(radduration > 2)
- radduration--
- radduration--
- dopage(src,"screen=radsetmenu")
- if(href_list["radinplus"])
- if(radstrength < 10)
- radstrength++
- dopage(src,"screen=radsetmenu")
- if(href_list["radinminus"])
- if(radstrength > 1)
- radstrength--
- dopage(src,"screen=radsetmenu")
- ////////////////////////////////////////////////////////
- if(href_list["unimenuplus"])
- if(ui_block < 13)
- ui_block++
- else
- ui_block = 1
- dopage(src,"screen=unimenu")
- if(href_list["unimenuminus"])
- if(ui_block > 1)
- ui_block--
- else
- ui_block = 13
- dopage(src,"screen=unimenu")
- if(href_list["unimenusubplus"])
- if(subblock < 3)
- subblock++
- else
- subblock = 1
- dopage(src,"screen=unimenu")
- if(href_list["unimenusubminus"])
- if(subblock > 1)
- subblock--
- else
- subblock = 3
- dopage(src,"screen=unimenu")
- if(href_list["unimenutargetplus"])
- if(unitarget < 15)
- unitarget++
- unitargethex = unitarget
- switch(unitarget)
- if(10)
- unitargethex = "A"
- if(11)
- unitargethex = "B"
- if(12)
- unitargethex = "C"
- if(13)
- unitargethex = "D"
- if(14)
- unitargethex = "E"
- if(15)
- unitargethex = "F"
- else
- unitarget = 0
- unitargethex = 0
- dopage(src,"screen=unimenu")
- if(href_list["unimenutargetminus"])
- if(unitarget > 0)
- unitarget--
- unitargethex = unitarget
- switch(unitarget)
- if(10)
- unitargethex = "A"
- if(11)
- unitargethex = "B"
- if(12)
- unitargethex = "C"
- if(13)
- unitargethex = "D"
- if(14)
- unitargethex = "E"
- else
- unitarget = 15
- unitargethex = "F"
- dopage(src,"screen=unimenu")
- if(href_list["uimenuset"] && href_list["uimenusubset"]) // This chunk of code updates selected block / sub-block based on click
- var/menuset = text2num(href_list["uimenuset"])
- var/menusubset = text2num(href_list["uimenusubset"])
- if((menuset <= 13) && (menuset >= 1))
- ui_block = menuset
- if((menusubset <= 3) && (menusubset >= 1))
- subblock = menusubset
- dopage(src, "unimenu")
- if(href_list["unipulse"])
- if(scanner.occupant)
- var/block
- var/newblock
- var/tstructure2
- block = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),subblock,1)
-
- temp_html = text("Working ... Please wait ([] Seconds)", radduration)
- popup.set_content(temp_html)
- popup.open()
- var/lock_state = scanner.locked
- scanner.locked = 1//lock it
- sleep(10*radduration)
- if(!scanner.occupant)
- temp_html = null
- return null
- ///
- if(prob((80 + (radduration / 2))))
- block = miniscrambletarget(num2text(unitarget), radstrength, radduration)
- newblock = null
- if(subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1)
- if(subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1)
- if(subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + block
- tstructure2 = setblock(scanner.occupant.dna.uni_identity, ui_block, newblock,3)
- scanner.occupant.dna.uni_identity = tstructure2
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
- else
- if(prob(20+radstrength))
- randmutb(scanner.occupant)
- domutcheck(scanner.occupant,scanner)
- else
- randmuti(scanner.occupant)
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- scanner.occupant.apply_effect((radstrength*2)+radduration, IRRADIATE)
- scanner.locked = lock_state
- dopage(src,"screen=unimenu")
-
- ////////////////////////////////////////////////////////
- if(href_list["rejuv"])
- if(!viable_occupant)
- temp_html = text("No viable occupant detected.")
- popup.set_content(temp_html)
- popup.open()
- else
- if(human_occupant)
- if(human_occupant.reagents.get_reagent_amount("inaprovaline") < REJUVENATORS_MAX)
- if(human_occupant.reagents.get_reagent_amount("inaprovaline") < (REJUVENATORS_MAX - REJUVENATORS_INJECT))
- human_occupant.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT)
- else
- human_occupant.reagents.add_reagent("inaprovaline", round(REJUVENATORS_MAX - human_occupant.reagents.get_reagent_amount("inaprovaline")))
-// to_chat(usr, text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline")))
-
- ////////////////////////////////////////////////////////
- if(href_list["strucmenuplus"])
- if(se_block < 14)
- se_block++
- else
- se_block = 1
- dopage(src,"screen=strucmenu")
- if(href_list["strucmenuminus"])
- if(se_block > 1)
- se_block--
- else
- se_block = 14
- dopage(src,"screen=strucmenu")
- if(href_list["strucmenusubplus"])
- if(subblock < 3)
- subblock++
- else
- subblock = 1
- dopage(src,"screen=strucmenu")
- if(href_list["strucmenusubminus"])
- if(subblock > 1)
- subblock--
- else
- subblock = 3
- dopage(src,"screen=strucmenu")
- if(href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
- var/menuset = text2num(href_list["semenuset"])
- var/menusubset = text2num(href_list["semenusubset"])
- if((menuset <= 14) && (menuset >= 1))
- se_block = menuset
- if((menusubset <= 3) && (menusubset >= 1))
- subblock = menusubset
- dopage(src, "strucmenu")
- if(href_list["strucpulse"])
- var/block
- var/newblock
- var/tstructure2
- var/oldblock
- var/lock_state = scanner.locked
- scanner.locked = 1//lock it
- if(viable_occupant)
- block = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),subblock,1)
-
- temp_html = text("Working ... Please wait ([] Seconds)", radduration)
- popup.set_content(temp_html)
- popup.open()
- sleep(10*radduration)
- else
- temp_html = null
- return null
- ///
- if(viable_occupant)
- if(prob((80 + (radduration / 2))))
- if((se_block != 2 || se_block != 12 || se_block != 8 || se_block || 10) && prob (20))
- oldblock = se_block
- block = miniscramble(block, radstrength, radduration)
- newblock = null
- if(se_block > 1 && se_block < 5)
- se_block++
- else if(se_block > 5 && se_block < 14)
- se_block--
- if(subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if(subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if(subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block
- tstructure2 = setblock(scanner.occupant.dna.struc_enzymes, se_block, newblock,3)
- scanner.occupant.dna.struc_enzymes = tstructure2
- domutcheck(scanner.occupant,scanner)
- scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
- se_block = oldblock
- else
- //
- block = miniscramble(block, radstrength, radduration)
- newblock = null
- if(subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if(subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if(subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block
- tstructure2 = setblock(scanner.occupant.dna.struc_enzymes, se_block, newblock,3)
- scanner.occupant.dna.struc_enzymes = tstructure2
- domutcheck(scanner.occupant,scanner)
- scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
- else
- if(prob(80-radduration))
- randmutb(scanner.occupant)
- domutcheck(scanner.occupant,scanner)
- else
- randmuti(scanner.occupant)
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- scanner.occupant.apply_effect((radstrength*2)+radduration, IRRADIATE)
- scanner.locked = lock_state
- ///
- dopage(src,"screen=strucmenu")
-
- ////////////////////////////////////////////////////////
- if(href_list["b1addui"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer1iue = 0
- buffer1 = scanner.occupant.dna.uni_identity
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer1owner = scanner.occupant.name
- else
- buffer1owner = scanner.occupant.real_name
- buffer1label = "Unique Identifier"
- buffer1type = "ui"
- dopage(src,"screen=buffermenu")
- if(href_list["b1adduiue"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer1 = scanner.occupant.dna.uni_identity
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer1owner = scanner.occupant.name
- else
- buffer1owner = scanner.occupant.real_name
- buffer1label = "Unique Identifier & Unique Enzymes"
- buffer1type = "ui"
- buffer1iue = 1
- dopage(src,"screen=buffermenu")
- if(href_list["b2adduiue"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer2 = scanner.occupant.dna.uni_identity
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer2owner = scanner.occupant.name
- else
- buffer2owner = scanner.occupant.real_name
- buffer2label = "Unique Identifier & Unique Enzymes"
- buffer2type = "ui"
- buffer2iue = 1
- dopage(src,"screen=buffermenu")
- if(href_list["b3adduiue"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer3 = scanner.occupant.dna.uni_identity
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer3owner = scanner.occupant.name
- else
- buffer3owner = scanner.occupant.real_name
- buffer3label = "Unique Identifier & Unique Enzymes"
- buffer3type = "ui"
- buffer3iue = 1
- dopage(src,"screen=buffermenu")
- if(href_list["b2addui"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer2iue = 0
- buffer2 = scanner.occupant.dna.uni_identity
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer2owner = scanner.occupant.name
- else
- buffer2owner = scanner.occupant.real_name
- buffer2label = "Unique Identifier"
- buffer2type = "ui"
- dopage(src,"screen=buffermenu")
- if(href_list["b3addui"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer3iue = 0
- buffer3 = scanner.occupant.dna.uni_identity
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer3owner = scanner.occupant.name
- else
- buffer3owner = scanner.occupant.real_name
- buffer3label = "Unique Identifier"
- buffer3type = "ui"
- dopage(src,"screen=buffermenu")
- if(href_list["b1addse"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer1iue = 0
- buffer1 = scanner.occupant.dna.struc_enzymes
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer1owner = scanner.occupant.name
- else
- buffer1owner = scanner.occupant.real_name
- buffer1label = "Structural Enzymes"
- buffer1type = "se"
- dopage(src,"screen=buffermenu")
- if(href_list["b2addse"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer2iue = 0
- buffer2 = scanner.occupant.dna.struc_enzymes
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer2owner = scanner.occupant.name
- else
- buffer2owner = scanner.occupant.real_name
- buffer2label = "Structural Enzymes"
- buffer2type = "se"
- dopage(src,"screen=buffermenu")
- if(href_list["b3addse"])
- if(scanner.occupant && scanner.occupant.dna)
- buffer3iue = 0
- buffer3 = scanner.occupant.dna.struc_enzymes
- if(!istype(scanner.occupant,/mob/living/carbon/human))
- buffer3owner = scanner.occupant.name
- else
- buffer3owner = scanner.occupant.real_name
- buffer3label = "Structural Enzymes"
- buffer3type = "se"
- dopage(src,"screen=buffermenu")
- if(href_list["b1clear"])
- buffer1 = null
- buffer1owner = null
- buffer1label = null
- buffer1iue = null
- dopage(src,"screen=buffermenu")
- if(href_list["b2clear"])
- buffer2 = null
- buffer2owner = null
- buffer2label = null
- buffer2iue = null
- dopage(src,"screen=buffermenu")
- if(href_list["b3clear"])
- buffer3 = null
- buffer3owner = null
- buffer3label = null
- buffer3iue = null
- dopage(src,"screen=buffermenu")
- if(href_list["b1label"])
- buffer1label = sanitize(input("New Label:","Edit Label","Infos here"))
- dopage(src,"screen=buffermenu")
- if(href_list["b2label"])
- buffer2label = sanitize(input("New Label:","Edit Label","Infos here"))
- dopage(src,"screen=buffermenu")
- if(href_list["b3label"])
- buffer3label = sanitize(input("New Label:","Edit Label","Infos here"))
- dopage(src,"screen=buffermenu")
- if(href_list["b1transfer"])
- if(!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
- return
- if(buffer1type == "ui")
- if(buffer1iue)
- scanner.occupant.real_name = buffer1owner
- scanner.occupant.name = buffer1owner
- scanner.occupant.dna.uni_identity = buffer1
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- else if(buffer1type == "se")
- scanner.occupant.dna.struc_enzymes = buffer1
- domutcheck(scanner.occupant,scanner)
- temp_html = "Transfered."
- scanner.occupant.apply_effect(rand(20,50), IRRADIATE)
-
- if(href_list["b2transfer"])
- if(!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
- return
- if(buffer2type == "ui")
- if(buffer2iue)
- scanner.occupant.real_name = buffer2owner
- scanner.occupant.name = buffer2owner
- scanner.occupant.dna.uni_identity = buffer2
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- else if(buffer2type == "se")
- scanner.occupant.dna.struc_enzymes = buffer2
- domutcheck(scanner.occupant,scanner)
- temp_html = "Transfered."
- scanner.occupant.apply_effect(rand(20,50), IRRADIATE)
-
- if(href_list["b3transfer"])
- if(!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
- return
- if(buffer3type == "ui")
- if(buffer3iue)
- scanner.occupant.real_name = buffer3owner
- scanner.occupant.name = buffer3owner
- scanner.occupant.dna.uni_identity = buffer3
- updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- else if(buffer3type == "se")
- scanner.occupant.dna.struc_enzymes = buffer3
- domutcheck(scanner.occupant,scanner)
- temp_html = "Transfered."
- scanner.occupant.apply_effect(rand(20,50), IRRADIATE)
-
- if(href_list["b1injector"])
- if(injectorready)
- var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector
- I.dna = buffer1
- I.dnatype = buffer1type
- I.loc = loc
- I.name += " ([buffer1label])"
- if(buffer1iue) I.ue = buffer1owner //lazy haw haw
- temp_html = "Injector created."
-
- injectorready = 0
- spawn(300)
- injectorready = 1
- else
- temp_html = "Replicator not ready yet."
-
- if(href_list["b2injector"])
- if(injectorready)
- var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector
- I.dna = buffer2
- I.dnatype = buffer2type
- I.loc = loc
- I.name += " ([buffer2label])"
- if(buffer2iue) I.ue = buffer2owner //lazy haw haw
- temp_html = "Injector created."
-
- injectorready = 0
- spawn(300)
- injectorready = 1
- else
- temp_html = "Replicator not ready yet."
-
- if(href_list["b3injector"])
- if(injectorready)
- var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector
- I.dna = buffer3
- I.dnatype = buffer3type
- I.loc = loc
- I.name += " ([buffer3label])"
- if(buffer3iue) I.ue = buffer3owner //lazy haw haw
- temp_html = "Injector created."
-
- injectorready = 0
- spawn(300)
- injectorready = 1
- else
- temp_html = "Replicator not ready yet."
-
- ////////////////////////////////////////////////////////
- if(href_list["load_disk"])
- var/buffernum = text2num(href_list["load_disk"])
- if((buffernum > 3) || (buffernum < 1))
- return
- if((isnull(diskette)) || (!diskette.data) || (diskette.data == ""))
- return
- switch(buffernum)
- if(1)
- buffer1 = diskette.data
- buffer1type = diskette.data_type
- buffer1iue = diskette.ue
- buffer1owner = diskette.owner
- if(2)
- buffer2 = diskette.data
- buffer2type = diskette.data_type
- buffer2iue = diskette.ue
- buffer2owner = diskette.owner
- if(3)
- buffer3 = diskette.data
- buffer3type = diskette.data_type
- buffer3iue = diskette.ue
- buffer3owner = diskette.owner
- temp_html = "Data loaded."
-
- if(href_list["save_disk"])
- var/buffernum = text2num(href_list["save_disk"])
- if((buffernum > 3) || (buffernum < 1))
- return
- if((isnull(diskette)) || (diskette.read_only))
- return
- switch(buffernum)
- if(1)
- diskette.data = buffer1
- diskette.data_type = buffer1type
- diskette.ue = buffer1iue
- diskette.owner = buffer1owner
- diskette.name = "data disk - '[buffer1owner]'"
- if(2)
- diskette.data = buffer2
- diskette.data_type = buffer2type
- diskette.ue = buffer2iue
- diskette.owner = buffer2owner
- diskette.name = "data disk - '[buffer2owner]'"
- if(3)
- diskette.data = buffer3
- diskette.data_type = buffer3type
- diskette.ue = buffer3iue
- diskette.owner = buffer3owner
- diskette.name = "data disk - '[buffer3owner]'"
- temp_html = "Data saved."
- if(href_list["eject_disk"])
- if(!diskette)
- return
- diskette.loc = get_turf(src)
- diskette = null
- ////////////////////////////////////////////////////////
-
- temp_html = temp_header_html
- switch(current_screen)
- if("mainmenu")
- temp_html += "Main Menu "
- if(viable_occupant) //is there REALLY someone in there who can be modified?
- temp_html += "Modify Unique Identifier "
- temp_html += "Modify Structural Enzymes "
- else
- temp_html += "Modify Unique Identifier "
- temp_html += "Modify Structural Enzymes "
- temp_html += "Radiation Emitter Settings "
- temp_html += "Transfer Buffer "
-
- if("unimenu")
- if(!viable_occupant)
- temp_html = text("No viable occupant detected.")
- popup.set_content(temp_html)
- popup.open()
- else
- temp_html = "<< Main Menu "
- temp_html += "Modify Unique Identifier "
- temp_html += "Unique Identifier:
[getblockstring(scanner.occupant.dna.uni_identity,ui_block,subblock,3, src,1)]
"
- temp_html += "Selected Block:
<- [ui_block] -> "
- temp_html += "Selected Sub-Block:
<- [subblock] -> "
- temp_html += "Selected Target:
<- [unitargethex] -> "
- temp_html += "
Modify Block "
- temp_html += "
Irradiate "
-
- if("strucmenu")
- if(!viable_occupant)
- temp_html = text("No viable occupant detected.")
- popup.set_content(temp_html)
- popup.open()
- else
- temp_html = "<< Main Menu "
- temp_html += "Modify Structural Enzymes "
- temp_html += "Structural Enzymes: [getblockstring(scanner.occupant.dna.struc_enzymes,se_block,subblock,3,src,0)]
"
- temp_html += "Selected Block:
<- [se_block] -> "
- temp_html += "Selected Sub-Block:
<- [subblock] -> "
- temp_html += "
Modify Block "
- temp_html += "
Irradiate "
-
- if("radsetmenu")
- temp_html = "<< Main Menu "
- temp_html += "Radiation Emitter Settings "
- if(viable_occupant)
- temp_html += "Pulse Radiation "
- else
- temp_html += "Pulse Radiation "
- temp_html += " Radiation Duration: - [radduration] + "
- temp_html += "Radiation Intensity: - [radstrength] + "
-
- if("buffermenu")
- temp_html = "<< Main Menu "
- temp_html += "Transfer Buffer "
- temp_html += "Buffer 1: "
- if(!(buffer1))
- temp_html += "Buffer Empty "
- else
- temp_html += text("Data: [] ", buffer1)
- temp_html += text("By: [] ", buffer1owner)
- temp_html += text("Label: [] ", buffer1label)
- if(viable_occupant) temp_html += "Save : UI - UI+UE - SE "
- if(buffer1) temp_html += "Transfer to: Occupant - Injector "
- //if(buffer1) temp_html += "Isolate Block "
- if(buffer1) temp_html += "Disk: Save To | Load From "
- if(buffer1) temp_html += "Edit Label "
- if(buffer1) temp_html += "Clear Buffer "
- if(!buffer1) temp_html += " "
- temp_html += "Buffer 2: "
- if(!(buffer2))
- temp_html += "Buffer Empty "
- else
- temp_html += text("Data: [] ", buffer2)
- temp_html += text("By: [] ", buffer2owner)
- temp_html += text("Label: [] ", buffer2label)
- if(viable_occupant) temp_html += "Save : UI - UI+UE - SE "
- if(buffer2) temp_html += "Transfer to: Occupant - Injector "
- //if(buffer2) temp_html += "Isolate Block "
- if(buffer2) temp_html += "Disk: Save To | Load From "
- if(buffer2) temp_html += "Edit Label "
- if(buffer2) temp_html += "Clear Buffer "
- if(!buffer2) temp_html += " "
- temp_html += "Buffer 3: "
- if(!(buffer3))
- temp_html += "Buffer Empty "
- else
- temp_html += text("Data: [] ", buffer3)
- temp_html += text("By: [] ", buffer3owner)
- temp_html += text("Label: [] ", buffer3label)
- if(viable_occupant) temp_html += "Save : UI - UI+UE - SE "
- if(buffer3) temp_html += "Transfer to: Occupant - Injector "
- //if(buffer3) temp_html += "Isolate Block "
- if(buffer3) temp_html += "Disk: Save To | Load From "
- if(buffer3) temp_html += "Edit Label "
- if(buffer3) temp_html += "Clear Buffer "
- if(!buffer3) temp_html += " "
- temp_html += temp_footer_html
-
- if(viable_occupant && !scanner_status_html && occupant) //is there REALLY someone in there?
- scanner_status_html = "Health:
[occupant.health]%
"
- scanner_status_html += "Radiation Level:
[occupant.radiation]%
"
- if(human_occupant)
- var/rejuvenators = round(human_occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100)
- scanner_status_html += "Rejuvenators:
[human_occupant.reagents.get_reagent_amount("inaprovaline")] units
"
-
- if(current_screen == "mainmenu")
- scanner_status_html += "Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
"
- scanner_status_html += "Unique Identifier:
[occupant.dna.uni_identity]
"
- scanner_status_html += "Structural Enzymes:
[occupant.dna.struc_enzymes]
"
-
- var/dat = "Scanner Status "
-
- var/occupant_status = "Scanner Unoccupied"
- if(occupant && occupant.dna) //is there REALLY someone in there?
- if(!istype(occupant,/mob/living/carbon/human))
- sleep(1)
- if(NOCLONE in occupant.mutations)
- occupant_status = "Invalid DNA structure "
- else
- switch(occupant.stat) // obvious, see what their status is
- if(0)
- occupant_status = "Conscious "
- if(1)
- occupant_status = "Unconscious "
- else
- occupant_status = "DEAD "
-
- occupant_status = "[occupant.name] => [occupant_status] "
-
- dat += "[occupant_status][scanner_status_html]
"
-
- var/scanner_access_text = "Lock Scanner"
- if(scanner.locked)
- scanner_access_text = "Unlock Scanner"
-
- dat += "Scan "
-
- if(occupant && occupant.dna)
- dat += "[scanner_access_text] "
- if(human_occupant)
- dat += "Inject Rejuvenators "
- else
- dat += "Inject Rejuvenators "
- else
- dat += "[scanner_access_text] "
- dat += "Inject Rejuvenators "
-
- if(!isnull(diskette))
- dat += "Eject Disk "
-
- dat += " "
-
- if(temp_html)
- dat += temp_html
-
- popup.set_content(dat)
- popup.open()
-*/
diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm
deleted file mode 100644
index c3c05c11d19..00000000000
--- a/code/modules/computer3/computers/security.dm
+++ /dev/null
@@ -1,628 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-/obj/machinery/computer3/secure_data
- default_prog = /datum/file/program/secure_data
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
- icon_state = "frame-sec"
-
-/obj/machinery/computer3/laptop/secure_data
- default_prog = /datum/file/program/secure_data
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio)
- icon_state = "laptop"
-
-
-/datum/file/program/secure_data
- name = "Security Records"
- desc = "Used to view and edit personnel's security records"
- active_state = "security"
- image = 'icons/ntos/records.png'
-
- req_one_access = list(access_security, access_forensics_lockers)
-
- var/obj/item/weapon/card/id/scan = null
- var/obj/item/weapon/card/id/scan2 = null
- var/authenticated = null
- var/rank = null
- var/screen = null
- var/datum/data/record/active1 = null
- var/datum/data/record/active2 = null
- var/a_id = null
- var/temp = null
- var/printing = null
- var/can_change_id = 0
- var/list/Perp
- var/tempname = null
- //Sorting Variables
- var/sortBy = "name"
- var/order = 1 // -1 = Descending - 1 = Ascending
-
-
-
- proc/authenticate()
- if((access_security in scan.access) || (access_forensics_lockers in scan.access) )
- return 1
- if(istype(usr,/mob/living/silicon/ai))
- return 1
- return 0
-
- interact()
- if(!computer.cardslot)
- computer.Crash(MISSING_PERIPHERAL)
- return
- scan = computer.cardslot.reader
-
- if(computer.cardslot.dualslot)
- scan2 = computer.cardslot.writer
-
- if(!interactable())
- return
-
- if(is_away_level(computer.z))
- to_chat(usr, "Unable to establish a connection : You're too far away from the station!")
- return
- var/dat
-
- if(temp)
- dat = "[temp] Clear Screen "
- else
- dat = text("Confirm Identity (R): [] ", (scan ? text("[]", scan.name) : "----------"))
- if(computer.cardslot.dualslot)
- dat += text("Check Identity (W): [] ", (scan2 ? text("[]", scan2.name) : "----------"))
- if(scan2 && !scan)
- dat += text("Insert card into reader slot to log in.
")
- if(authenticated)
- switch(screen)
- if(1.0)
- dat += {"
- "}
- dat += "Search Records "
- dat += "New Record "
- dat += {"
-
-
-
-
- Name
- ID
- Rank
- Fingerprints
- Criminal Status
- "}
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
- var/crimstat = ""
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- crimstat = E.fields["criminal"]
- var/background
- switch(crimstat)
- if("*Arrest*")
- background = "'background-color:#DC143C;'"
- if("Incarcerated")
- background = "'background-color:#CD853F;'"
- if("Parolled")
- background = "'background-color:#CD853F;'"
- if("Released")
- background = "'background-color:#3BB9FF;'"
- if("None")
- background = "'background-color:#00FF00;'"
- if("")
- background = "'background-color:#00FF7F;'"
- crimstat = "No Record."
- dat += text("[] ", background, R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += text("[] ", crimstat)
- dat += "
"
- dat += "Record Maintenance "
- dat += "{Log Out} "
- if(2.0)
- dat += "Records Maintenance "
- dat += "Delete All Records Back "
- if(3.0)
- dat += "Security Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += text("")
- else
- dat += "General Record Lost! "
- if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", active2.fields["criminal"], active2.fields["mi_crim"], active2.fields["mi_crim_d"], active2.fields["ma_crim"], active2.fields["ma_crim_d"], decode(active2.fields["notes"]))
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- dat += text("[]Delete Entry ", active2.fields[text("com_[]", counter)], counter)
- counter++
- dat += "Add Entry "
- dat += "Delete Record (Security Only) "
- else
- dat += "Security Record Lost! "
- dat += "New Security Record "
- dat += "\nDelete Record (ALL) \nPrint Record \nBack "
- if(4.0)
- if(!Perp.len)
- dat += "ERROR. String could not be located.Back "
- else
- dat += {"
-
- "}
- dat += text("Search Results for '[]': ", tempname)
- dat += {"
-
-
-
-
- Name
- ID
- Rank
- Fingerprints
- Criminal Status
- "}
- for(var/i=1, i<=Perp.len, i += 2)
- var/crimstat = ""
- var/datum/data/record/R = Perp[i]
- if(istype(Perp[i+1],/datum/data/record/))
- var/datum/data/record/E = Perp[i+1]
- crimstat = E.fields["criminal"]
- var/background
- switch(crimstat)
- if("*Arrest*")
- background = "'background-color:#DC143C;'"
- if("Incarcerated")
- background = "'background-color:#CD853F;'"
- if("Parolled")
- background = "'background-color:#CD853F;'"
- if("Released")
- background = "'background-color:#3BB9FF;'"
- if("None")
- background = "'background-color:#00FF7F;'"
- if("")
- background = "'background-color:#FFFFFF;'"
- crimstat = "No Record."
- dat += text("[] ", background, R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += text("[] ", crimstat)
- dat += "
"
- dat += "Return to index. "
- else
- else
- dat += "{Log In} "
- popup.width = 600
- popup.height = 400
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
-
-/*Revised /N
-I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
-What a mess.*/
- Topic(href, href_list)
- if(!interactable() || !computer.cardslot || ..(href,href_list))
- return
- if(!( data_core.general.Find(active1) ))
- active1 = null
- if(!( data_core.security.Find(active2) ))
- active2 = null
- switch(href_list["choice"])
-// SORTING!
- if("Sorting")
- // Reverse the order if clicked twice
- if(sortBy == href_list["sort"])
- if(order == 1)
- order = -1
- else
- order = 1
- else
- // New sorting order!
- sortBy = href_list["sort"]
- order = initial(order)
-//BASIC FUNCTIONS
- if("Clear Screen")
- temp = null
-
- if("Return")
- screen = 1
- active1 = null
- active2 = null
-
- if("Confirm Identity R")
- if(scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(1)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- computer.cardslot.insert(I, 1)
- scan = I
-
- if("Confirm Identity W")
- if(scan2)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- computer.cardslot.remove(2)
- else
- scan2.loc = get_turf(src)
- scan2 = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- computer.cardslot.insert(I, 2)
- scan2 = I
-
- if("Log Out")
- authenticated = null
- screen = null
- active1 = null
- active2 = null
-
- if("Log In")
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = "[R.modtype] [R.braintype]"
- src.screen = 1
- else if(istype(scan, /obj/item/weapon/card/id))
- active1 = null
- active2 = null
- if(authenticate())
- authenticated = scan.registered_name
- rank = scan.assignment
- screen = 1
-//RECORD FUNCTIONS
- if("Search Records")
- var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
- if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !interactable()))
- return
- Perp = new/list()
- t1 = lowertext(t1)
- var/list/components = splittext(t1, " ")
- if(components.len > 5)
- return //Lets not let them search too greedily.
- for(var/datum/data/record/R in data_core.general)
- var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
- for(var/i = 1, i<=components.len, i++)
- if(findtext(temptext,components[i]))
- var/prelist = new/list(2)
- prelist[1] = R
- Perp += prelist
- for(var/i = 1, i<=Perp.len, i+=2)
- for(var/datum/data/record/E in data_core.security)
- var/datum/data/record/R = Perp[i]
- if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- Perp[i+1] = E
- tempname = t1
- screen = 4
-
- if("Record Maintenance")
- screen = 2
- active1 = null
- active2 = null
-
- if("Browse Record")
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/S = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- temp = "Record Not Found!"
- else
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
- active1 = R
- active2 = S
- screen = 3
-
-/* if("Search Fingerprints")
- var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!interactable()) && (!istype(usr, /mob/living/silicon))))
- return
- active1 = null
- active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.general)
- if(lowertext(R.fields["fingerprint"]) == t1)
- active1 = R
- if(!( active1 ))
- temp = text("Could not locate record [].", t1)
- else
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
- active2 = E
- screen = 3 */
-
- if("Print Record")
- if(!( printing ))
- printing = 1
- var/datum/data/record/record1 = null
- var/datum/data/record/record2 = null
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- record1 = active1
- if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- record2 = active2
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
- P.info = "Security Record "
- if(record1)
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
- P.name = text("Security Record ([])", record1.fields["name"])
- else
- P.info += "General Record Lost! "
- P.name = "Security Record"
- if(record2)
- P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["criminal"], record2.fields["mi_crim"], record2.fields["mi_crim_d"], record2.fields["ma_crim"], record2.fields["ma_crim_d"], decode(record2.fields["notes"]))
- var/counter = 1
- while(record2.fields[text("com_[]", counter)])
- P.info += text("[] ", record2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Security Record Lost! "
- P.info += ""
- printing = null
- computer.updateUsrDialog()
-//RECORD DELETE
- if("Delete All Records")
- temp = ""
- temp += "Are you sure you wish to delete all Security records? "
- temp += "Yes "
- temp += "No "
-
- if("Purge All Records")
- for(var/datum/data/record/R in data_core.security)
- qdel(R)
- temp = "All Security records deleted."
-
- if("Add Entry")
- if(!( istype(active2, /datum/data/record) ))
- return
- var/a2 = active2
- var/t1 = sanitize(copytext(input("Add Comment:", "Secure. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- counter++
- active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
-
- if("Delete Record (ALL)")
- if(active1)
- temp = "Are you sure you wish to delete the record (ALL)? "
- temp += "Yes "
- temp += "No "
-
- if("Delete Record (Security)")
- if(active2)
- temp = "Are you sure you wish to delete the record (Security Portion Only)? "
- temp += "Yes "
- temp += "No "
-
- if("Delete Entry")
- if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
- active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
-//RECORD CREATE
- if("New Record (Security)")
- if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record()
- R.fields["name"] = active1.fields["name"]
- R.fields["id"] = active1.fields["id"]
- R.name = text("Security Record #[]", R.fields["id"])
- R.fields["criminal"] = "None"
- R.fields["mi_crim"] = "None"
- R.fields["mi_crim_d"] = "No minor crime convictions."
- R.fields["ma_crim"] = "None"
- R.fields["ma_crim_d"] = "No major crime convictions."
- R.fields["notes"] = "No notes."
- data_core.security += R
- active2 = R
- screen = 3
-
- if("New Record (General)")
- var/datum/data/record/G = new /datum/data/record()
- G.fields["name"] = "New Record"
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
- G.fields["rank"] = "Unassigned"
- G.fields["real_rank"] = "Unassigned"
- G.fields["sex"] = "Male"
- G.fields["age"] = "Unknown"
- G.fields["fingerprint"] = "Unknown"
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["species"] = "Human"
- data_core.general += G
- active1 = G
- active2 = null
-
-//FIELD FUNCTIONS
- if("Edit Field")
- var/a1 = active1
- var/a2 = active2
- switch(href_list["field"])
- if("name")
- if(istype(active1, /datum/data/record))
- var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text
- if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
- return
- active1.fields["name"] = t1
- if("id")
- if(istype(active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input id:", "Secure. records", active1.fields["id"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["id"] = t1
- if("fingerprint")
- if(istype(active1, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(active1, /datum/data/record))
- if(active1.fields["sex"] == "Male")
- active1.fields["sex"] = "Female"
- else
- active1.fields["sex"] = "Male"
- if("age")
- if(istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["age"] = t1
- if("mi_crim")
- if(istype(active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim"] = t1
- if("mi_crim_d")
- if(istype(active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim_d"] = t1
- if("ma_crim")
- if(istype(active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim"] = t1
- if("ma_crim_d")
- if(istype(active2, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim_d"] = t1
- if("notes")
- if(istype(active2, /datum/data/record))
- var/t1 = trim(sanitize(copytext(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN)))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["notes"] = t1
- if("criminal")
- if(istype(active2, /datum/data/record))
- temp = "Criminal Status: "
- temp += ""
- if("rank")
- var/list/L = list( "Head of Personnel", "Captain", "AI" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if((istype(active1, /datum/data/record) && L.Find(rank)))
- temp = "Rank: "
- temp += ""
- for(var/rank in joblist)
- temp += "[rank] "
- temp += " "
- else
- alert(usr, "You do not have the required rank to do this!")
- if("species")
- if(istype(active1, /datum/data/record))
- var/t1 = sanitize(copytext(input("Please enter race:", "General records", active1.fields["species"], null) as message,1,MAX_MESSAGE_LEN))
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["species"] = t1
-
-//TEMPORARY MENU FUNCTIONS
- else//To properly clear as per clear screen.
- temp=null
- switch(href_list["choice"])
- if("Change Rank")
- if(active1)
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in joblist)
- active1.fields["real_rank"] = href_list["real_rank"]
-
- if("Change Criminal Status")
- if(active2)
-
- switch(href_list["criminal2"])
- if("none")
- active2.fields["criminal"] = "None"
- if("arrest")
- active2.fields["criminal"] = "*Arrest*"
- if("incarcerated")
- active2.fields["criminal"] = "Incarcerated"
- if("parolled")
- active2.fields["criminal"] = "Parolled"
- if("released")
- active2.fields["criminal"] = "Released"
- for(var/mob/living/carbon/human/H in mob_list)
- H.sec_hud_set_security_status()
-
- if("Delete Record (Security) Execute")
- if(active2)
- qdel(active2)
-
- if("Delete Record (ALL) Execute")
- if(active1)
- for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
- qdel(R)
- else
- qdel(active1)
- if(active2)
- qdel(active2)
- else
- temp = "This function does not appear to be working at the moment. Our apologies."
-
- //computer.updateUsrDialog()
- interact()
- return
-
-/obj/machinery/computer3/secure_data/emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
-
- for(var/datum/data/record/R in data_core.security)
- if(prob(10/severity))
- switch(rand(1,6))
- if(1)
- R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
- if(2)
- R.fields["sex"] = pick("Male", "Female")
- if(3)
- R.fields["age"] = rand(5, 85)
- if(4)
- R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
- if(5)
- R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
- if(6)
- R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
- continue
-
- else if(prob(1))
- qdel(R)
- continue
-
- ..(severity)
-
-/obj/machinery/computer3/secure_data/detective_computer
- icon = 'icons/obj/computer.dmi'
- icon_state = "messyfiles"
diff --git a/code/modules/computer3/computers/station_alert.dm b/code/modules/computer3/computers/station_alert.dm
deleted file mode 100644
index 82c57cc7ee5..00000000000
--- a/code/modules/computer3/computers/station_alert.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-/obj/machinery/computer3/station_alert
- default_prog = /datum/file/program/station_alert
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio)
- icon_state = "frame-eng"
-
-
-/datum/file/program/station_alert
- name = "Station Alert Console"
- desc = "Used to access the station's automated alert system."
- active_state = "alert:0"
- var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list())
-
- interact(mob/user)
- if(!interactable())
- return
- var/dat = "Current Station Alerts \n"
- dat += "Close "
- for(var/cat in src.alarms)
- dat += text("[] \n", cat)
- var/list/L = src.alarms[cat]
- if(L.len)
- for(var/alarm in L)
- var/list/alm = L[alarm]
- var/area/A = alm[1]
- var/list/sources = alm[3]
- dat += ""
- dat += "• "
- dat += "[A.name]"
- if(sources.len > 1)
- dat += text(" - [] sources", sources.len)
- dat += " \n"
- else
- dat += "-- All Systems Nominal \n"
- dat += " \n"
- //user << browse(dat, "window=alerts")
- //onclose(user, "alerts")
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
-
-
- Topic(href, href_list)
- if(..())
- return
- return
-
-
- proc/triggerAlarm(var/class, area/A, var/O, var/alarmsource)
- var/list/L = src.alarms[class]
- for(var/I in L)
- if(I == A.name)
- var/list/alarm = L[I]
- var/list/sources = alarm[3]
- if(!(alarmsource in sources))
- sources += alarmsource
- return 1
- var/obj/machinery/camera/C = null
- var/list/CL = null
- if(O && istype(O, /list))
- CL = O
- if(CL.len == 1)
- C = CL[1]
- else if(O && istype(O, /obj/machinery/camera))
- C = O
- L[A.name] = list(A, (C) ? C : O, list(alarmsource))
- return 1
-
-
- proc/cancelAlarm(var/class, area/A as area, obj/origin)
- var/list/L = src.alarms[class]
- var/cleared = 0
- for(var/I in L)
- if(I == A.name)
- var/list/alarm = L[I]
- var/list/srcs = alarm[3]
- if(origin in srcs)
- srcs -= origin
- if(srcs.len == 0)
- cleared = 1
- L -= I
- return !cleared
-
-
-
- process()
- var/active_alarms = 0
- for(var/cat in src.alarms)
- var/list/L = src.alarms[cat]
- if(L.len) active_alarms = 1
- if(active_alarms)
- active_state = "alert:2"
- else
- active_state = "alert:0"
- ..()
- return
diff --git a/code/modules/computer3/computers/welcome.dm b/code/modules/computer3/computers/welcome.dm
deleted file mode 100644
index 203c5922289..00000000000
--- a/code/modules/computer3/computers/welcome.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/obj/machinery/computer3/laptop/vended
- default_prog = /datum/file/program/welcome
-
-
-/datum/file/program/welcome
- name = "Welcome Screen"
- desc = "First time boot splash screen"
- active_state = "osod"
- image = 'icons/ntos/program.png'
-
-
- interact()
- if(!interactable())
- return
- var/dat = ""
- dat += "Welcome to NTOS "
- dat += "Thank you for choosing NTOS, your gateway to the future of mobile computing technology, sponsored by Nanotrasen (R) "
- dat += "Getting started with NTOS: "
- dat += "To leave a current program, click the X button in the top right corner of the window. This will return you to the NTOS desktop. \
- From the desktop, you can open the hard drive, usually located in the top left corner to access all the programs installed on your computer. \
- When you rented your laptop, you were supplied with programs that your Nanotrasen Issued ID has given you access to use. \
- In the event of a serious error, the right click menu will give you the ability to reset your computer. To open and close your laptop, alt-click your device.\
- If you have any questions or technical issues, please contact your local computer technical experts at your local Central Command."
- popup.set_content(dat)
- popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state))
- popup.open()
- return
-
- Topic(href, href_list)
- if(!interactable() || ..(href,href_list))
- return
- interact()
- return
\ No newline at end of file
diff --git a/code/modules/computer3/file.dm b/code/modules/computer3/file.dm
deleted file mode 100644
index 1cbb363894a..00000000000
--- a/code/modules/computer3/file.dm
+++ /dev/null
@@ -1,165 +0,0 @@
-// I am deciding that for sayustation's purposes directories are right out,
-// we can't even get backpacks to work right with recursion, and that
-// actually fucking matters. Metadata too, that can be added if ever needed.
-
-/*
- Files are datums that can be stored in digital storage devices
-*/
-
-/datum/file
- var/name = "File"
- var/extension = "dat"
- var/volume = 10 // in KB
- var/image = 'icons/ntos/file.png' // determines the icon to use, found in icons/ntos
- var/obj/machinery/computer3/computer // the parent computer, if fixed
- var/obj/item/part/computer/storage/device // the device that is containing this file
- var/hidden_file = 0 // Prevents file from showing up on NTOS program list.
- var/drm = 0 // Copy protection, called by copy() and move()
- var/readonly = 0 // Edit protection, called by edit(), which is just a failcheck proc
-
- proc/execute(var/datum/file/source)
- return
-
- //
- // Copy file to device.
- // If you overwrite this function, use the return value to make sure it succeeded
- //
- proc/copy(var/obj/item/part/computer/storage/dest)
- if(!computer || computer.crit_fail) return null
- if(drm)
- if(!computer.emagged)
- return null
- var/datum/file/F = new type()
- if(!dest.addfile(F))
- return null // todo: arf here even though the player can't do a damn thing due to concurrency
- return F
-
- //
- // Move file to device
- // Returns null on failure even though the existing file doesn't go away
- //
- proc/move(var/obj/item/part/computer/storage/dest)
- if(!computer || computer.crit_fail) return null
- if(drm)
- if(!computer.emagged)
- return null
- var/obj/item/part/computer/storage/current = device
- if(!dest.addfile(src))
- return null
- current.removefile(src)
- return src
-
- //
- // Determines if the file is editable. This does not use the DRM flag,
- // but instead the readonly flag.
- //
-
- proc/edit()
- if(!computer || computer.crit_fail)
- return 0
- if(readonly && !computer.emagged)
- return 0 //
- return 1
-
-/*
- Centcom root authorization certificate
-
- Non-destructive, officially sanctioned.
- Has the same effect on computers as an emag.
-*/
-/datum/file/centcom_auth
- name = "Centcom Root Access Token"
- extension = "auth"
- volume = 100
- copy()
- return null
-
-/*
- A file that contains information
-*/
-
-/datum/file/data
-
- var/content = "content goes here"
- var/file_increment = 1
- var/binary = 0 // determines if the file can't be opened by editor
-
- // Set the content to a specific amount, increase filesize appropriately.
- proc/set_content(var/text)
- content = text
- if(file_increment > 1)
- volume = round(file_increment * length(text))
-
- copy(var/obj/O)
- var/datum/file/data/D = ..(O)
- if(D)
- D.content = content
- D.readonly = readonly
-
- New()
- if(content)
- if(file_increment > 1)
- volume = round(file_increment * length(content))
-
-/*
- A generic file that contains text
-*/
-
-/datum/file/data/text
- name = "Text File"
- extension = "txt"
- image = 'icons/ntos/file.png'
- content = ""
- file_increment = 0.002 // 0.002 kilobytes per character (1024 characters per KB)
-
-/datum/file/data/text/ClownProphecy
- name = "Clown Prophecy"
- content = "HONKhHONKeHONKlHONKpHONKHONmKHONKeHONKHONKpHONKlHONKeHONKaHONKsHONKe"
-
-
-/*
- A file that contains research
-*/
-
-/datum/file/data/research
- name = "Untitled Research"
- binary = 1
- content = "Untitled Tier X Research"
- var/datum/tech/stored // the actual tech contents
- volume = 1440
-
-/*
- A file that contains genetic information
-*/
-
-/datum/file/data/genome
- name = "Genetic Buffer"
- binary = 1
- var/real_name = "Poop"
-
-
-/datum/file/data/genome/SE
- name = "Structural Enzymes"
-
-/datum/file/data/genome/UE
- name = "Unique Enzymes"
-
-/*
-the way genome computers now work, a subtype is the wrong way to do this;
-it will no longer be picked up. You can change this later if you need to.
-for now put it on a disk
-
-/datum/file/data/genome/UE/GodEmperorOfMankind
- name = "G.E.M.K."
- content = "066000033000000000AF00330660FF4DB002690"
- label = "God Emperor of Mankind"
-*/
-/datum/file/data/genome/UI
- name = "Unique Identifier"
-
-/datum/file/data/genome/UI/UE
- name = "Unique Identifier + Unique Enzymes"
-
-/datum/file/data/genome/cloning
- name = "Cloning Data"
- var/datum/data/record/record
diff --git a/code/modules/computer3/laptop.dm b/code/modules/computer3/laptop.dm
deleted file mode 100644
index e32375a457c..00000000000
--- a/code/modules/computer3/laptop.dm
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- Computer3 portable computer.
-
- Battery powered only; it does not use the APC network at all.
-
- When picked up, becomes an inert item. This item can be put in a recharger,
- or set down and re-opened into the original machine. While closed, the computer
- has the MAINT stat flag. If you want to ignore this, you will have to bitmask it out.
-
- The unused(?) alt+click will toggle laptops open and closed. If we find a better
- answer for this in the future, by all means use it. I just don't want it limited
- to the verb, which is SIGNIFICANTLY less accessible than shutting a laptop.
- Ctrl-click would work for closing the machine, since it's anchored, but not for
- opening it back up again. And obviously, I don't want to override shift-click.
- There's no double-click because that's used in regular click events. Alt-click is the
- only obvious one left.
-*/
-
-
-/obj/item/device/laptop
- name = "Laptop Computer"
- desc = "A clamshell portable computer. It is closed."
- icon = 'icons/obj/computer3.dmi'
- icon_state = "laptop-closed"
- item_state = "laptop-inhand"
- pixel_x = 2
- pixel_y = -3
- w_class = 3
-
- var/obj/machinery/computer3/laptop/stored_computer = null
-
- verb/open_computer()
- set name = "Open Laptop"
- set category = "Object"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
- to_chat(usr, "\red You can't do that.")
- return
-
- if(!Adjacent(usr))
- to_chat(usr, "You can't reach it.")
- return
-
- if(!istype(loc,/turf))
- to_chat(usr, "[src] is too bulky! You'll have to set it down.")
- return
-
- if(!stored_computer)
- if(contents.len)
- for(var/obj/O in contents)
- O.forceMove(loc)
- to_chat(usr, "\The [src] crumbles to pieces.")
- spawn(5)
- qdel(src)
- return
-
- if(!stored_computer.manipulating)
- stored_computer.manipulating = 1
- stored_computer.loc = loc
- stored_computer.stat &= ~MAINT
- stored_computer.update_icon()
- loc = null
- to_chat(usr, "You open \the [src].")
-
- spawn(5)
- stored_computer.manipulating = 0
- qdel(src)
- else
- to_chat(usr, "\red You are already opening the computer!")
-
-
- AltClick()
- if(Adjacent(usr))
- open_computer()
-
- Destroy()
- ..()
- return QDEL_HINT_HARDDEL_NOW // Warning: GC'ing will cause the laptop to vanish when it next closes
-
-//Quickfix until Snapshot works out how he wants to redo power. ~Z
-/obj/item/device/laptop/verb/eject_id()
- set category = null
- set name = "Eject ID Card"
- set src in oview(1)
-
- if(stored_computer)
- stored_computer.eject_id()
-
-/obj/machinery/computer3/laptop/verb/eject_id()
- set category = null
- set name = "Eject ID Card"
- set src in oview(1)
-
- var/obj/item/part/computer/cardslot/C = locate() in src.contents
-
- if(!C)
- to_chat(usr, "There is no card port on the laptop.")
- return
-
- var/obj/item/weapon/card/id/card
- if(C.reader)
- card = C.reader
- C.remove_reader(usr)
- else if(C.writer)
- card = C.writer
- C.remove_writer(usr)
- else
- to_chat(usr, "There is nothing to remove from the laptop card port.")
- return
-
- to_chat(usr, "You remove [card] from the laptop.")
-
-
-/obj/machinery/computer3/laptop
- name = "Laptop Computer"
- desc = "A clamshell portable computer. It is open."
-
- icon_state = "laptop"
- density = 0
- pixel_x = 2
- pixel_y = -3
- show_keyboard = 0
-
- var/manipulating = 0 // To prevent disappearing bug
- var/obj/item/device/laptop/portable = null
-
- New(var/L, var/built = 0)
- if(!built && !battery)
- battery = new /obj/item/weapon/stock_parts/cell(src)
- ..(L,built)
-
- verb/close_computer()
- set name = "Close Laptop"
- set category = "Object"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living))
- to_chat(usr, "\red You can't do that.")
- return
-
- if(!Adjacent(usr))
- to_chat(usr, "You can't reach it.")
- return
-
- if(istype(loc,/obj/item/device/laptop))
- testing("Close closed computer")
- return
- if(!istype(loc,/turf))
- testing("Odd computer location: [loc] - close laptop")
- return
-
- if(stat&BROKEN)
- to_chat(usr, "\The [src] is broken! You can't quite get it closed.")
- return
-
- if(!portable)
- portable = new
- portable.stored_computer = src
-
- if(!manipulating)
- portable.forceMove(loc)
- forceMove(portable)
- stat |= MAINT
- to_chat(usr, "You close \the [src].")
-
- auto_use_power()
- if(stat&MAINT)
- return
- if(use_power && istype(battery) && battery.charge > 0)
- if(use_power == 1)
- battery.use(idle_power_usage)
- else
- battery.use(active_power_usage)
- return 1
- return 0
-
- use_power(var/amount, var/chan = -1)
- if(battery && battery.charge > 0)
- battery.use(amount)
-
- power_change()
- if( !battery || battery.charge <= 0 )
- stat |= NOPOWER
- else
- stat &= ~NOPOWER
-
- Destroy()
- if(istype(loc,/obj/item/device/laptop))
- var/obj/O = loc
- spawn(5)
- if(O)
- qdel(O)
- return ..()
-
-
- AltClick()
- if(Adjacent(usr))
- close_computer()
diff --git a/code/modules/computer3/lapvend.dm b/code/modules/computer3/lapvend.dm
deleted file mode 100644
index 0eb665f70b2..00000000000
--- a/code/modules/computer3/lapvend.dm
+++ /dev/null
@@ -1,410 +0,0 @@
-/obj/machinery/lapvend
- name = "laptop vendor"
- desc = "A generic vending machine."
- icon = 'icons/obj/vending.dmi'
- icon_state = "robotics"
- layer = 2.9
- anchored = 1
- density = 1
- var/datum/browser/popup = null
- var/obj/machinery/computer3/laptop/vended/newlap = null
- var/obj/item/device/laptop/relap = null
- var/vendmode = 0
-
-
- var/cardreader = 0
- var/floppy = 0
- var/radionet = 0
- var/camera = 0
- var/network = 0
- var/power = 0
-
-
-/obj/machinery/lapvend/New()
- ..()
- spawn(4)
- power_change()
- return
- return
-
-
-/obj/machinery/lapvend/blob_act()
- if(prob(50))
- spawn(0)
- qdel(src)
- return
-
- return
-
-
-/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(vendmode == 1)
- if(istype(W, /obj/item/weapon/card))
- var/obj/item/weapon/card/I = W
- scan_card(I)
- vendmode = 0
- if(vendmode == 3)
- if(istype(W,/obj/item/weapon/card))
- var/obj/item/weapon/card/I = W
- reimburse(I)
- vendmode = 0
- if(vendmode == 0)
- if(istype(W, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = W
- relap = L
- calc_reimburse(L)
- usr.drop_item()
- L.loc = src
- vendmode = 3
- to_chat(usr, "You slot your [L.name] into \The [src.name] ")
- else
- ..()
-
-
-/obj/machinery/lapvend/attack_hand(mob/user as mob)
- user.set_machine(src)
- var/vendorname = (src.name) //import the machine's name
- var/dat = "[vendorname] " //display the name, and added a horizontal rule
- if(vendmode == 0)
- dat += "Please choose your laptop customization options "
- dat += "Your comptuer will automatically be loaded with any programs you can use after the transaction is complete."
- dat += "Some programs will require additional components to be installed! "
- dat += "HDD (Required) : Added "
- dat += "Card Reader : Single (50) | Dual (125) "
- dat += "Floppy Drive : Add (50) "
- dat += "Radio Network card Add (50) "
- dat += "Camera Card Add (100) "
- dat += " Network card Area (75) Adjacent (50) Powernet (25) "
- dat += " Power source upgrade Extended (175) Unreal (250) "
-
- if(vendmode == 0 || vendmode == 1)
- dat += "Cart "
- dat += "Total: [total()] "
- if(cardreader == 1)
- dat += "Card Reader: (single) (50) "
- else if(cardreader == 2)
- dat += "Card Reader: (double) (125) "
- else
- dat += "Card Reader: None "
- if(floppy == 0)
- dat += "Floppy Drive: None "
- else
- dat += "Floppy Drive: Added (50) "
- if(radionet == 1)
- dat += "Radio Card: Added (50) "
- else
- dat += "Radio Card: None "
- if(camera == 1)
- dat += "Camera Card: Added (100) "
- else
- dat += "Camera Card: None "
- if(network == 1)
- dat += "Network card: Area (75) "
- else if(network == 2)
- dat += "Network card: Adjacent (50) "
- else if(network == 3)
- dat += "Network card: Powernet (25) "
- else
- dat += "Network card: None "
- if(power == 0)
- dat += "Power source: Regular "
- else if(power == 1)
- dat += "Power source: Extended (175) "
- else
- dat += "Power source: Unreal (250) "
-
- if(vendmode == 0)
- dat += "Vend Laptop "
-
- if(vendmode == 1)
- dat += "Please swipe your card to complete the transaction"
-
- if(vendmode == 3)
- dat += "Please swipe your card to finish returning your computer "
- dat += "Cancel "
-
-
-
-
- popup = new(user, "lapvend", name, 450, 500)
- popup.set_content(dat)
- popup.open()
- return
-
-
-/obj/machinery/lapvend/Topic(href, href_list)
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
- usr.set_machine(src)
- switch(href_list["choice"])
- if("single_add")
- cardreader = 1
- if("dual_add")
- cardreader = 2
- if("floppy_add")
- floppy = 1
- if("radio_add")
- radionet = 1
- if("camnet_add")
- camera = 1
- if("area_add")
- network = 1
- if("prox_add")
- network = 2
- if("cable_add")
- network = 3
- if("high_add")
- power = 1
- if("super_add")
- power = 2
-
- if("single_rem" || "dual_rem")
- cardreader = 0
- if("floppy_rem")
- floppy = 0
- if("radio_rem")
- radionet = 0
- if("camnet_rem")
- camera = 0
- if("area_rem" || "prox_rem" || "cable_rem")
- network = 0
- if("high_rem" || "super_rem")
- power = 0
-
- if("vend")
- vendmode = 1
-
- if("cancel")
- relap.loc = src.loc
- relap = null
- vendmode = 0
-
- src.updateUsrDialog()
- return
-
-
-/obj/machinery/lapvend/proc/vend()
- if(cardreader > 0)
- if(cardreader == 1)
- newlap.spawn_parts += (/obj/item/part/computer/cardslot)
- else
- newlap.spawn_parts += (/obj/item/part/computer/cardslot/dual)
- if(floppy == 1)
- newlap.spawn_parts += (/obj/item/part/computer/storage/removable)
- if(radionet == 1)
- newlap.spawn_parts += (/obj/item/part/computer/networking/radio)
- if(camera == 1)
- newlap.spawn_parts += (/obj/item/part/computer/networking/cameras)
- if(network == 1)
- newlap.spawn_parts += (/obj/item/part/computer/networking/area)
- if(network == 2)
- newlap.spawn_parts += (/obj/item/part/computer/networking/prox)
- if(network == 3)
- newlap.spawn_parts += (/obj/item/part/computer/networking/cable)
- if(power == 1)
- qdel(newlap.battery)
- newlap.battery = new /obj/item/weapon/stock_parts/cell/high(newlap)
- if(power == 2)
- qdel(newlap.battery)
- newlap.battery = new /obj/item/weapon/stock_parts/cell/super(newlap)
-
- newlap.spawn_parts()
-
-/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I)
- if(istype(I, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src]. ")
- if(vendor_account)
- var/datum/money_account/D = attempt_account_access_nosec(C.associated_account_number)
- if(D && D.security_level)
- var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
- D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
- if(D)
- var/transaction_amount = total()
- if(transaction_amount <= D.money)
-
- //transfer the money
- D.money -= transaction_amount
- vendor_account.money += transaction_amount
-
- //Transaction logs
- var/datum/transaction/T = new()
- T.target_name = "[vendor_account.owner_name] (via [src.name])"
- T.purpose = "Purchase of Laptop"
- if(transaction_amount > 0)
- T.amount = "([transaction_amount])"
- else
- T.amount = "[transaction_amount]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = worldtime2text()
- D.transaction_log.Add(T)
- //
- T = new()
- T.target_name = D.owner_name
- T.purpose = "Purchase of Laptop"
- T.amount = "[transaction_amount]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = worldtime2text()
- vendor_account.transaction_log.Add(T)
-
- newlap = new /obj/machinery/computer3/laptop/vended(src.loc)
-
- choose_progs(C)
- vend()
- popup.close()
- newlap.close_computer()
- newlap = null
- cardreader = 0
- floppy = 0
- radionet = 0
- camera = 0
- network = 0
- power = 0
- else
- to_chat(usr, "[bicon(src)]You don't have that much money! ")
- else
- to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
- else
- to_chat(usr, "[bicon(src)]Unable to access vendor account. Please record the machine ID and call CentComm Support. ")
-
-/obj/machinery/lapvend/proc/total()
- var/total = 0
-
- if(cardreader == 1)
- total += 50
- if(cardreader == 2)
- total += 125
- if(floppy == 1)
- total += 50
- if(radionet == 1)
- total += 50
- if(camera == 1)
- total += 100
- if(network == 1)
- total += 75
- if(network == 2)
- total += 50
- if(network == 3)
- total += 25
- if(power == 1)
- total += 175
- if(power == 2)
- total += 250
-
- return total
-
-/obj/machinery/lapvend/proc/choose_progs(var/obj/item/weapon/card/id/C)
- if((access_security in C.access) || (access_forensics_lockers in C.access))
- newlap.spawn_files += (/datum/file/program/secure_data)
- newlap.spawn_files += (/datum/file/camnet_key)
- newlap.spawn_files += (/datum/file/camnet_key/researchoutpost)
- newlap.spawn_files += (/datum/file/camnet_key/miningoutpost)
- newlap.spawn_files += (/datum/file/camnet_key/telecomms)
- newlap.spawn_files += (/datum/file/program/security)
- if(access_armory in C.access)
- newlap.spawn_files += (/datum/file/program/prisoner)
- if(access_atmospherics in C.access)
- newlap.spawn_files += (/datum/file/program/atmos_alert)
- if(access_change_ids in C.access)
- newlap.spawn_files += (/datum/file/program/card_comp)
- if(access_heads in C.access)
- newlap.spawn_files += (/datum/file/program/communications)
- if((access_medical in C.access) || (access_forensics_lockers in C.access)) //Gives detective the medical records program, but not the crew monitoring one.
- newlap.spawn_files += (/datum/file/program/med_data)
- if(access_medical in C.access)
- newlap.spawn_files += (/datum/file/program/crew)
- if(access_engine in C.access)
- newlap.spawn_files += (/datum/file/program/powermon)
- if(access_research in C.access)
- newlap.spawn_files += (/datum/file/camnet_key/researchoutpost)
- newlap.spawn_files += (/datum/file/camnet_key/research)
- newlap.spawn_files += (/datum/file/camnet_key/anomalyisolation)
- newlap.spawn_files += (/datum/file/camnet_key/toxins)
- newlap.spawn_files += (/datum/file/camnet_key/telepad)
-/* if(access_rd in C.access)
- newlap.spawn_files += (/datum/file/program/borg_control) */
- if(access_cent_specops in C.access)
- newlap.spawn_files += (/datum/file/camnet_key/ert)
- newlap.spawn_files += (/datum/file/camnet_key/centcom)
- newlap.spawn_files += (/datum/file/camnet_key/thunderdome)
- newlap.spawn_files += (/datum/file/program/arcade)
- newlap.spawn_files += (/datum/file/camnet_key/entertainment)
- //Atlantis: Each laptop gets "invisible" program/security - REQUIRED for camnetkeys to work.
- newlap.spawn_files += (/datum/file/program/security/hidden)
- newlap.update_spawn_files()
-
-/obj/machinery/lapvend/proc/calc_reimburse(var/obj/item/device/laptop/L)
- if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot))
- cardreader = 1
- if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot/dual))
- cardreader = 2
- if(istype(L.stored_computer.floppy,/obj/item/part/computer/storage/removable))
- floppy = 1
- if(istype(L.stored_computer.radio,/obj/item/part/computer/networking/radio))
- radionet = 1
- if(istype(L.stored_computer.camnet,/obj/item/part/computer/networking/cameras))
- camera = 1
- if(istype(L.stored_computer.net,/obj/item/part/computer/networking/area))
- network = 1
- if(istype(L.stored_computer.net,/obj/item/part/computer/networking/prox))
- network = 2
- if(istype(L.stored_computer.net,/obj/item/part/computer/networking/cable))
- network = 3
- if(istype(L.stored_computer.battery, /obj/item/weapon/stock_parts/cell/high))
- power = 1
- if(istype(L.stored_computer.battery, /obj/item/weapon/stock_parts/cell/super))
- power = 2
-
-
-
-/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I)
- if(istype(I, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src]. ")
- if(vendor_account)
- var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
- var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
- if(D)
- var/transaction_amount = total()
-
- //transfer the money
- D.money += transaction_amount
- vendor_account.money -= transaction_amount
-
- //Transaction logs
- var/datum/transaction/T = new()
- T.target_name = "[vendor_account.owner_name] (via [src.name])"
- T.purpose = "Return purchase of Laptop"
- if(transaction_amount > 0)
- T.amount = "([transaction_amount])"
- else
- T.amount = "[transaction_amount]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = worldtime2text()
- D.transaction_log.Add(T)
- //
- T = new()
- T.target_name = D.owner_name
- T.purpose = "Return purchase of Laptop"
- T.amount = "[transaction_amount]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = worldtime2text()
- vendor_account.transaction_log.Add(T)
-
- qdel(relap)
-
- vendmode = 0
- cardreader = 0
- floppy = 0
- radionet = 0
- camera = 0
- network = 0
- power = 0
-
- else
- to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
- else
- to_chat(usr, "[bicon(src)]Unable to access vendor account. Please record the machine ID and call CentComm Support. ")
diff --git a/code/modules/computer3/networking.dm b/code/modules/computer3/networking.dm
deleted file mode 100644
index f55a63b0718..00000000000
--- a/code/modules/computer3/networking.dm
+++ /dev/null
@@ -1,235 +0,0 @@
-/obj/item/part/computer/networking
- name = "Computer networking component"
-
- /*
- This is the public-facing proc used by NETUP.
- It does additional checking before and after calling get_machines()
-
- */
- proc/connect_to(var/typekey,var/atom/previous)
- if(!computer || computer.stat)
- return null
-
- if(istype(previous,typekey) && verify_machine(previous))
- return previous
-
- var/result = get_machines(typekey)
-
- if(!result)
- return null
-
- if(islist(result))
- var/list/R = result
- if(R.len == 0)
- return null
- else if(R.len == 1)
- return R[1]
- else
- var/list/atomlist = computer.format_atomlist(R)
- result = input("Select:","Multiple destination machines located",atomlist[1]) as null|anything in atomlist
- return atomlist[result]
-
- if(isobj(result))
- return result
-
- return null // ?
-
- /*
- This one is used to determine the candidate machines.
- It may return an object, a list of objects, or null.
-
- Overwite this on any networking component.
- */
- proc/get_machines(var/typekey)
- return list()
-
- /*
- This is used to verify that an existing machine is within the network.
- Calling NETUP() with an object argument will run this check, and if
- the object is still accessible, it will be used. Otherwise, another
- search will be run.
-
- Overwrite this on any networking component.
- */
- proc/verify_machine(var/obj/previous)
- return 0
-
-/*
- Provides radio/signaler functionality, and also
- network-connects to anything on the same z-level
- which is tuned to the same frequency.
-*/
-/obj/item/part/computer/networking/radio
- name = "Wireless networking component"
- desc = "Radio module for computers"
-
- var/datum/radio_frequency/radio_connection = null
- var/frequency = 1459
- var/filter = null
- var/range = null
- var/subspace = 0
-
- init()
- ..()
- spawn(5)
- radio_connection = radio_controller.add_object(src, src.frequency, src.filter)
-
- proc/set_frequency(new_frequency)
- if(radio_controller)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, filter)
- else
- frequency = new_frequency
- spawn(rand(5,10))
- set_frequency(new_frequency)
-
- receive_signal(var/datum/signal/signal)
- if(!signal || !computer || (computer.stat&~MAINT)) // closed laptops use maint, allow it
- return
- if(computer.program)
- computer.program.receive_signal(signal)
-
- proc/post_signal(var/datum/signal/signal)
- if(!computer || (computer.stat&~MAINT) || !computer.program) return
- if(!radio_connection) return
-
- radio_connection.post_signal(src,signal,filter,range)
-
- get_machines(var/typekey)
- if(!radio_connection || !radio_connection.frequency)
- return list()
- var/list/result = list()
- var/turf/T = get_turf(loc)
- var/z_level = T.z
- for(var/obj/O in radio_connection.devices)
- if(istype(O,typekey))
- T = get_turf(O)
- // TODO: Make the radio system cooperate with the space manager
- if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels
- result |= O
- return result
-
- verify_machine(var/obj/previous)
- if(!previous) return 0
- if(subspace)
- return ( radio_connection && (previous in radio_connection.devices) )
- else
- var/turf/T = get_turf(loc)
- var/turf/O = get_turf(previous)
- if(!T || !O)
- return 0
- return ( radio_connection && (previous in radio_connection.devices) && (T.z == O.z))
-
-/*
- Subspace networking: Communicates off-station. Allows centcom communications.
-*/
-/obj/item/part/computer/networking/radio/subspace
- name = "subspace networking terminal"
- desc = "Communicates long distances and through spatial anomalies."
- subspace = 1
-
-/*
- APC (/area) networking
-*/
-
-/obj/item/part/computer/networking/area
- name = "short-wave networking terminal"
- desc = "Connects to nearby computers through the area power network"
-
- get_machines(var/typekey)
- var/area/A = get_area(loc)
- if(!istype(A) || A == /area)
- return list()
- if(typekey == null)
- typekey = /obj/machinery
- var/list/machines = list()
- for(var/obj/O in A.contents)
- if(istype(O,typekey))
- machines |= O
- return machines
- verify_machine(var/obj/previous)
- if(!previous) return 0
- var/area/A = get_area(src)
- if( A && A == get_area(previous) )
- return 1
- return 0
-
-/*
- Proximity networking: Connects to machines or computers adjacent to this device
-*/
-/obj/item/part/computer/networking/prox
- name = "proximity networking terminal"
- desc = "Connects a computer to adjacent machines"
-
- get_machines(var/typekey)
- var/turf/T = get_turf(loc)
- if(!istype(T))
- return list()
- if(typekey == null)
- typekey = /obj/machinery
- var/list/machines = list()
- for(var/d in cardinal)
- var/turf/T2 = get_step(T,d)
- for(var/obj/O in T2)
- if(istype(O,typekey))
- machines += O
- return machines
-
- verify_machine(var/obj/previous)
- if(!previous)
- return 0
- if(get_dist(get_turf(previous),get_turf(loc)) == 1)
- return 1
- return 0
-/*
- Cable networking: Not currently used
-*/
-
-/obj/item/part/computer/networking/cable
- name = "cable networking terminal"
- desc = "Connects to other machines on the same cable network."
-
- get_machines(var/typekey)
-// if(istype(computer,/obj/machinery/computer/laptop)) // laptops move, this could get breaky
-// return list()
- var/turf/T = get_turf(loc)
- var/datum/powernet/P = null
- for(var/obj/structure/cable/C in T)
- if(C.d1 == 0)
- P = C.powernet
- break
- if(!P)
- return list()
- if(!typekey)
- typekey = /obj/machinery
- else if(typekey == /datum/powernet)
- return list(P)
- var/list/candidates = list()
- for(var/atom/A in P.nodes)
- if(istype(A,typekey))
- candidates += A
- else if(istype(A,/obj/machinery/power/terminal))
- var/obj/machinery/power/terminal/PT = A
- if(istype(PT.master,typekey))
- candidates += PT.master
- return candidates
-
- verify_machine(var/obj/previous)
- if(!previous)
- return 0
- var/turf/T = get_turf(loc)
- var/datum/powernet/P = null
- for(var/obj/structure/cable/C in T)
- if(C.d1 == 0)
- P = C.powernet
- break
- if(istype(previous,/datum/powernet))
- if(previous == P)
- return 1
- return 0
- T = get_turf(previous.loc)
- for(var/obj/structure/cable/C in T)
- if(C.d1 == 0 && (C.powernet == P))
- return 1
- return 0
diff --git a/code/modules/computer3/program.dm b/code/modules/computer3/program.dm
deleted file mode 100644
index f1f68c0890d..00000000000
--- a/code/modules/computer3/program.dm
+++ /dev/null
@@ -1,404 +0,0 @@
-
-/*
-Programs are a file that can be executed
-*/
-
-/datum/file/program
- name = "Untitled"
- extension = "prog"
- image = 'icons/ntos/program.png'
- var/desc = "An unidentifiable program."
-
- var/image/overlay = null // Icon to be put on top of the computer frame.
-
- var/active_state = "generic" // the icon_state that the computer goes to when the program is active
-
- drm = 0 // prevents a program from being copied
- var/refresh = 0 // if true, computer does screen updates during process().
- var/error = 0 // set by background programs so an error pops up when used
-
- var/human_controls = 0 // if true, non-human animals cannot interact with this program (monkeys, xenos, etc)
- var/ai_allowed = 1 // if true, silicon mobs (AI/cyborg) are allowed to use this program.
-
- var/datum/browser/popup = null
-
- // ID access: Note that computer3 does not normally check your ID.
- // By default this is only really used for inserted cards.
- var/list/req_access = list() // requires all of these UNLESS below succeeds
- var/list/req_one_access = list() // requires one of these
-
-
-/datum/file/program/New()
- ..()
- if(!active_state)
- active_state = "generic"
- overlay = image('icons/obj/computer3.dmi',icon_state = active_state)
-
-
-/datum/file/program/proc/decode(text)
- //adds line breaks
- text = replacetext(text, "\n"," ")
- return text
-
-
-
-/datum/file/program/execute(var/datum/file/source)
- if(computer && !computer.stat)
- computer.program = src
- computer.req_access = req_access
- computer.req_one_access = req_one_access
- update_icon()
- computer.update_icon()
- if(usr)
- usr << browse(null, "window=\ref[computer]")
- computer.attack_hand(usr)
-
- ..()
-
-/*
- Standard Topic() for links
-*/
-
-/datum/file/program/Topic(href, href_list)
- return
-
-/*
- The computer object will transfer all empty-hand calls to the program (this includes AIs, Cyborgs, and Monkies)
-*/
-/datum/file/program/proc/interact()
- return
-
-/*
- Standard receive_signal()
-*/
-
-/datum/file/program/proc/receive_signal(var/datum/signal/signal)
- return
-/*
- The computer object will transfer all attackby() calls to the program
- If the item is a valid interactable object, return 1. Else, return 0.
- This helps identify what to use to actually hit the computer with, and
- what can be used to interact with it.
-
- Screwdrivers will, by default, never call program/attackby(). That's used
- for deconstruction instead.
-*/
-
-
-/datum/file/program/proc/attackby(O as obj, user as mob, params)
- return
-
-/*
- Try not to overwrite this proc, I'd prefer we stayed
- with interact() as the main proc
-*/
-/datum/file/program/proc/attack_hand(mob/user as mob)
- usr = user
- interact()
-
-/*
- Called when the computer is rebooted or the program exits/restarts.
- Be sure not to save any work. Do NOT start the program again.
- If it is the os, the computer will run it again automatically.
-
- Also, we are deleting the browser window on the chance that this is happening
- when the computer is damaged or disassembled, causing us to lose our computer.
- The popup window's title is a reference to the computer, making it unique, so
- it could introduce bugs in that case.
-*/
-/datum/file/program/proc/Reset()
- error = 0
- update_icon()
- if(popup)
- popup.close()
- qdel(popup)
- return
-
-/*
- The computer object will transfer process() calls to the program.
-*/
-/datum/file/program/proc/process()
- if(refresh && computer && !computer.stat)
- computer.updateDialog()
- update_icon()
-
-/datum/file/program/proc/update_icon()
- return
-
-/datum/file/program/proc/check_access(obj/item/I)
- if( (!istype(req_access) || !req_access.len) && (!istype(req_one_access) || !req_one_access.len) ) //no requirements
- return 1
-
- if(!I)
- return 0
-
- var/list/iAccess = I.GetAccess()
- if(!iAccess || !iAccess.len)
- return 0
-
- var/list/temp = req_one_access & iAccess
- if(temp.len) // a required access in item access list
- return 1
- temp = req_access - iAccess
- if(temp.len) // a required access not in item access list
- return 0
- return 1
-
-
-/*
- Because this does sanity checks I have added the code to make a popup here.
- It also does sanity checks there that should prevent some edge case madness.
-*/
-/datum/file/program/proc/interactable(var/mob/user = usr)
- if(computer && computer.interactable(user))
- if(!popup)
- popup = new(user, "\ref[computer]", name, nref=src)
- popup.set_title_image(usr.browse_rsc_icon(overlay.icon, overlay.icon_state))
- popup.set_title_buttons(topic_link(src,"quit"," "))
- if(popup.user != user)
- popup.user = user
- popup.set_title_image(usr.browse_rsc_icon(overlay.icon, overlay.icon_state))
- popup.set_title(name)
- return 1
- return 0
-
-
-/datum/file/program/proc/fake_link(var/text)
- return "[text] "
-
-/*
- Meant for text (not icons) -
- lists all installed drives and their files
-
- I am NOT adding a computer sanity check here,
- because why the flying fuck would you get to this
- proc before having run it at least once?
- If you cause runtimes with this function
- may the shame of all ages come upon you.
-*/
-/datum/file/program/proc/list_all_files_by_drive(var/typekey,var/linkop = "runfile")
- var/dat = ""
- if(!typekey) typekey = /datum/file
- if(computer.hdd)
- dat += "[computer.hdd] "
- for(var/datum/file/F in computer.hdd.files)
- if(istype(F,typekey))
- dat += topic_link(src,"[linkop]=\ref[F]",F.name) + " "
- if(computer.hdd.files.len == 0)
- dat += "No files "
- dat += " "
-
- if(computer.floppy)
- if(!computer.floppy.inserted)
- dat += "[computer.floppy] - Eject "
- else
- dat += "[computer.floppy] - [topic_link(src,"eject_disk","Eject")] "
- for(var/datum/file/F in computer.floppy.inserted.files)
- dat += topic_link(src,"[linkop]=\ref[F]",F.name) + " "
- if(computer.floppy.inserted.files.len == 0)
- dat += "No files "
- dat += " "
-
- if(computer.cardslot && istype(computer.cardslot.reader,/obj/item/weapon/card/data))
- dat += "[computer.cardslot.reader] - [topic_link(src,"eject_card=reader","Eject")] "
- var/obj/item/weapon/card/data/D = computer.cardslot.reader
- for(var/datum/file/F in D.files)
- dat += topic_link(src,"[linkop]=\ref[F]",F.name) + " "
- if(D.files.len == 0)
- dat += "No files "
- return dat
-
-// You don't NEED to use this version of topic() for this, you can do it yourself if you prefer
-// If you do, do the interactable() check first, please, I don't want to repeat it here. It's not hard.
-/datum/file/program/Topic(var/href,var/list/href_list)
- if(!computer)
- return 0
-
- //
- // usage: eject_disk
- // only functions if there is a removable drive
- //
- if("eject_disk" in href_list)
- if(computer.floppy)
- computer.floppy.eject_disk()
- return 1
- //
- // usage: eject_card | eject_card=reader | eject_card=writer
- // only functions if there is a cardslot
- //
- if("eject_card" in href_list)
- if(computer.cardslot)
- if(computer.cardslot.dualslot && href_list["eject_card"] == "writer")
- computer.cardslot.remove(computer.cardslot.writer)
- else
- computer.cardslot.remove(computer.cardslot.reader)
- return 1
- //
- // usage: runfile=\ref[file]
- // executes the file
- //
- if("runfile" in href_list)
- var/datum/file/F = locate(href_list["runfile"])
- if(istype(F) && F.computer == computer)
- F.execute(src)
- return 1
-
- if("close" in href_list)
- usr.unset_machine()
- popup.close()
- return 1
- //
- // usage: quit
- // unloads the program, returning control to the OS
- //
- if("quit" in href_list)
- computer.program = null
- usr << browse(null,"window=\ref[computer]") // ntos will need to resize the window
- computer.update_icon()
- computer.updateDialog()
- return 1
- return 0
-
-
-/datum/file/program/RD
- name = "R&D Manager"
- image = 'icons/ntos/research.png'
- desc = "A software suit for generic research and development machinery interaction. Comes pre-packaged with extensive cryptographic databanks for secure connections with external devices."
- active_state = "rdcomp"
- volume = 11000
-
-/datum/file/program/RDserv
- name = "R&D Server"
- image = 'icons/ntos/server.png'
- active_state = "rdcomp"
- volume = 9000
-
-/datum/file/program/SuitSensors
- name = "Crew Monitoring"
- image = 'icons/ntos/monitoring.png'
- active_state = "crew"
- volume = 3400
-
-/datum/file/program/Genetics
- name = "Genetics Suite"
- image = 'icons/ntos/genetics.png'
- desc = "A sophisticated software suite containing read-only genetics hardware specifications and a highly compressed genome databank."
- active_state = "dna"
- volume = 8000
-
-/datum/file/program/Cloning
- name = "Cloning Platform"
- image = 'icons/ntos/cloning.png'
- desc = "A software platform for accessing external cloning apparatus."
- active_state = "dna"
- volume = 7000
-
-/datum/file/program/TCOMmonitor
- name = "TComm Monitor"
- image = 'icons/ntos/tcomms.png'
- active_state = "comm_monitor"
- volume = 5500
-
-/datum/file/program/TCOMlogs
- name = "TComm Log View"
- image = 'icons/ntos/tcomms.png'
- active_state = "comm_logs"
- volume = 5230
-
-/datum/file/program/TCOMtraffic
- name = "TComm Traffic"
- image = 'icons/ntos/tcomms.png'
- active_state = "generic"
- volume = 8080
-
-/datum/file/program/securitycam
- name = "Sec-Cam Viewport"
- image = 'icons/ntos/camera.png'
- drm = 1
- active_state = "cameras"
- volume = 2190
-
-/datum/file/program/securityrecords
- name = "Security Records"
- image = 'icons/ntos/records.png'
- drm = 1
- active_state = "security"
- volume = 2520
-
-/datum/file/program/medicalrecords
- name = "Medical Records"
- image = 'icons/ntos/medical.png'
- drm = 1
- active_state = "medcomp"
- volume = 5000
-
-/datum/file/program/SMSmonitor
- name = "Messaging Monitor"
- image = 'icons/ntos/pda.png'
- active_state = "comm_monitor"
- volume = 3070
-
-/datum/file/program/OperationMonitor
- name = "OR Monitor"
- image = 'icons/ntos/operating.png'
- active_state = "operating"
- volume = 4750
-
-/datum/file/program/PodLaunch
- name = "Pod Launch"
- active_state = "computer_generic"
- volume = 520
-
-/datum/file/program/powermon
- name = "Power Grid"
- image = 'icons/ntos/power.png'
- active_state = "power"
- volume = 7200
-
-/datum/file/program/prisoner
- name = "Prisoner Control"
- image = 'icons/ntos/prison.png'
- drm = 1
- active_state = "power"
- volume = 5000
-/*
-/datum/file/program/borg_control
- name = "Cyborg Maint"
- image = 'icons/ntos/borgcontrol.png'
- active_state = "robot"
- volume = 9050 */
-
-/datum/file/program/AIupload
- name = "AI Upload"
- image = 'icons/ntos/aiupload.png'
- active_state = "command"
- volume = 5000
-
-/datum/file/program/Cyborgupload
- name = "Cyborg Upload"
- image = 'icons/ntos/borgupload.png'
- active_state = "command"
- volume = 5000
-
-/datum/file/program/Exosuit
- name = "Exosuit Monitor"
- image = 'icons/ntos/exocontrol.png'
- active_state = "mecha"
- volume = 7000
-
-/datum/file/program/EmergencyShuttle
- name = "Shuttle Console"
- active_state = "shuttle"
- volume = 10000
-
-/datum/file/program/Stationalert
- name = "Alert Monitor"
- image = 'icons/ntos/alerts.png'
- active_state = "computer_generic"
- volume = 10150
-
-
-
-
-
-
diff --git a/code/modules/computer3/program_disks.dm b/code/modules/computer3/program_disks.dm
deleted file mode 100644
index 201fff39392..00000000000
--- a/code/modules/computer3/program_disks.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-/obj/item/weapon/disk/file/arcade
- name = "Arcade game grab pack"
- desc = "A program install disk."
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "datadisk_arcade"
- spawn_files = list(/datum/file/program/arcade,/datum/file/program/arcade,/datum/file/program/arcade,/datum/file/program/arcade)
-
-/*/obj/item/weapon/disk/file/aifixer
- name = "AI System Integrity Restorer"
- desc = "A program install disk."
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "datadisk_arcade"
- spawn_files = list(/datum/file/program/aifixer)*/
-
-/obj/item/weapon/disk/file/atmos_alert
- name = "Atmospheric Alert Notifier"
- desc = "A program install disk."
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "datadisk_arcade"
- spawn_files = list(/datum/file/program/atmos_alert)
-
-/obj/item/weapon/disk/file/cameras
- name = "Camera Viewer"
- desc = "A program install disk."
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "datadisk_arcade"
- spawn_files = list(/datum/file/program/security)
-
-/obj/item/weapon/disk/file/card
- name = "ID Card Modifier"
- desc = "A program install disk."
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "datadisk_arcade"
- spawn_files = list(/datum/file/program/card_comp)
-/*
-/obj/item/weapon/disk/file/genetics
- name = "Genetics & Cloning"
- desc = "A program install disk."
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "datadisk_arcade"
- spawn_files = list(/datum/file/program/cloning,/datum/file/program/dnascanner)
-*/
diff --git a/code/modules/computer3/server.dm b/code/modules/computer3/server.dm
deleted file mode 100644
index 9e32918feae..00000000000
--- a/code/modules/computer3/server.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- Todo:
- I can probably get away with a global list on servers that contains database sort of stuff
- (replacing the datacore probably)
- with the justification that they loadbalance and duplicate data across each other. As long as
- one server-type computer exists, the station will still have access to datacore-type info.
-
- I can doubtless use this for station alerts as well, which is good, because I was sort of
- wondering how the hell I was going to port that.
-
- Also todo: Server computers should maybe generate heat the way the R&D server does?
- At least the rack computer probably should.
-*/
-
-/obj/machinery/computer3/server
- name = "server"
- icon = 'icons/obj/computer3.dmi'
- icon_state = "serverframe"
- show_keyboard = 0
-
-/obj/machinery/computer3/server/rack
- name = "server rack"
- icon_state = "rackframe"
-
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace)
-
- update_icon()
- //overlays.Cut()
- return
-
- attack_hand() // Racks have no screen, only AI can use them
- return
diff --git a/code/modules/computer3/storage.dm b/code/modules/computer3/storage.dm
deleted file mode 100644
index 9ff8cab497b..00000000000
--- a/code/modules/computer3/storage.dm
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- Computer devices that can store programs, files, etc.
-*/
-
-/obj/item/part/computer/storage
- name = "Storage Device"
- desc = "A device used for storing and retrieving digital information."
-
- // storage capacity, kb
- var/volume = 0
- var/max_volume = 64 // should be enough for anyone
-
- var/driveletter = null // drive letter according to the computer
-
- var/list/files = list() // a list of files in the memory (ALL files)
- var/removeable = 0 // determinse if the storage device is a removable hard drive (ie floppy)
-
-
- var/writeprotect = 0 // determines if the drive forbids writing.
- // note that write-protect is hardware and does not respect emagging.
-
- var/list/spawnfiles = list()// For mappers, special drives, and data disks
-
- New()
- ..()
- if(islist(spawnfiles))
- if(removeable && spawnfiles.len)
- var/obj/item/part/computer/storage/removable/R = src
- R.inserted = new(src)
- if(writeprotect)
- R.inserted.writeprotect = 1
- for(var/typekey in spawnfiles)
- addfile(new typekey(),1)
-
- // Add a file to the hard drive, returns 0 if failed
- // forced is used when spawning files on a write-protect drive
- proc/addfile(var/datum/file/F,var/forced = 0)
- if(!F || crit_fail || (F in files))
- return 1
- if(writeprotect && !forced)
- return 0
- if(volume + F.volume > max_volume)
- if(!forced)
- return 0
- max_volume = volume + F.volume
-
- files.Add(F)
- volume += F.volume
- F.computer = computer
- F.device = src
- return 1
- proc/removefile(var/datum/file/F,var/forced = 0)
- if(!F || !(F in files))
- return 1
- if(writeprotect && !forced)
- return 0
-
- files -= F
- volume -= F.volume
- if(F.device == src)
- F.device = null
- F.computer = null
- return 1
-
- init(var/obj/machinery/computer/target)
- computer = target
- for(var/datum/file/F in files)
- F.computer = computer
-
-/*
- Standard hard drives for computers. Used in computer construction
-*/
-
-/obj/item/part/computer/storage/hdd
- name = "Hard Drive"
- max_volume = 25000
- icon_state = "hdd1"
-
-
-/obj/item/part/computer/storage/hdd/big
- name = "Big Hard Drive"
- max_volume = 50000
- icon_state = "hdd2"
-
-/obj/item/part/computer/storage/hdd/gigantic
- name = "Gigantic Hard Drive"
- max_volume = 75000
- icon_state = "hdd3"
-
-/*
- Removeable hard drives for portable storage
-*/
-
-/obj/item/part/computer/storage/removable
- name = "Disk Drive"
- max_volume = 3000
- removeable = 1
-
- attackby_types = list(/obj/item/weapon/disk/file, /obj/item/weapon/pen)
- var/obj/item/weapon/disk/file/inserted = null
-
- proc/eject_disk(var/forced = 0)
- if(!forced)
- return
- files = list()
- inserted.loc = computer.loc
- if(usr)
- if(!usr.get_active_hand())
- usr.put_in_active_hand(inserted)
- else if(forced && !usr.get_inactive_hand())
- usr.put_in_inactive_hand(inserted)
- for(var/datum/file/F in inserted.files)
- F.computer = null
- inserted = null
-
-
- attackby(obj/O as obj, mob/user as mob, params)
- if(inserted && istype(O,/obj/item/weapon/pen))
- to_chat(usr, "You use [O] to carefully pry [inserted] out of [src].")
- eject_disk(forced = 1)
- return
-
- if(istype(O,/obj/item/weapon/disk/file))
- if(inserted)
- to_chat(usr, "There's already a disk in [src]!")
- return
-
- to_chat(usr, "You insert [O] into [src].")
- usr.drop_item()
- O.loc = src
- inserted = O
- writeprotect = inserted.writeprotect
-
- files = inserted.files
- for(var/datum/file/F in inserted.files)
- F.computer = computer
-
- return
-
- ..()
-
- addfile(var/datum/file/F)
- if(!F || !inserted)
- return 0
-
- if(F in inserted.files)
- return 1
-
- if(inserted.volume + F.volume > inserted.max_volume)
- return 0
-
- inserted.files.Add(F)
- F.computer = computer
- F.device = inserted
- return 1
-
-/*
- Removable hard drive presents...
- removeable disk!
-*/
-
-/obj/item/weapon/disk/file
- //parent_type = /obj/item/part/computer/storage // todon't: do this
- name = "Data Disk"
- desc = "A device that can be inserted and removed into computers easily as a form of portable data storage. This one stores 1 Megabyte"
- var/list/files
- var/list/spawn_files = list()
- var/writeprotect = 0
- var/volume = 0
- var/max_volume = 1028
-
-
- New()
- ..()
- icon_state = "datadisk[rand(0,6)]"
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
- files = list()
- if(istype(spawn_files))
- for(var/typekey in spawn_files)
- var/datum/file/F = new typekey()
- F.device = src
- files += F
- volume += F.volume
diff --git a/code/modules/computer3/test_machines.dm b/code/modules/computer3/test_machines.dm
deleted file mode 100644
index 53a96d6c057..00000000000
--- a/code/modules/computer3/test_machines.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-
-/obj/machinery/computer3/testing
- spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert,
- /datum/file/program/security,/datum/file/program/card_comp,
- /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications,
- /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon,
-
- /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research,
- /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison)
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder,
- /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras,
- /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area)
- New(var/L,var/built=0)
- if(!built && !battery)
- battery = new /obj/item/weapon/stock_parts/cell(src)
- ..(L,built)
-
-/obj/machinery/computer3/laptop/testing
- spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert,
- /datum/file/program/security,/datum/file/program/card_comp,
- /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications,
- /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon,
-
- /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research,
- /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison)
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder,
- /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras,
- /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area)
- New(var/L,var/built=0)
- if(!built && !battery)
- battery = new /obj/item/weapon/stock_parts/cell/super(src)
- ..(L,built)
-
-/obj/machinery/computer3/wall_comp/testing
- spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert,
- /datum/file/program/security,/datum/file/program/card_comp,
- /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications,
- /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon,
-
- /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research,
- /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison)
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder,
- /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras,
- /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area)
- New(var/L,var/built=0)
- if(!built && !battery)
- battery = new /obj/item/weapon/stock_parts/cell(src)
- ..(L,built)
-
-/obj/machinery/computer3/server/testing
- spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert,
- /datum/file/program/security,/datum/file/program/card_comp,
- /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications,
- /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon,
-
- /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research,
- /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison)
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder,
- /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras,
- /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area)
- New(var/L,var/built=0)
- if(!built && !battery)
- battery = new /obj/item/weapon/stock_parts/cell(src)
- ..(L,built)
-
-/obj/machinery/computer3/server/rack/testing
- spawn_files = list(/datum/file/program/aifixer,/datum/file/program/arcade,/datum/file/program/atmos_alert,
- /datum/file/program/security,/datum/file/program/card_comp,
- /datum/file/program/borg_control,/datum/file/program/holodeck, /datum/file/program/communications,
- /datum/file/program/crew,/datum/file/program/op_monitor, /datum/file/program/powermon,
-
- /datum/file/camnet_key,/datum/file/camnet_key/mining,/datum/file/camnet_key/entertainment,/datum/file/camnet_key/research,
- /datum/file/camnet_key/bombrange,/datum/file/camnet_key/xeno,/datum/file/camnet_key/singulo,/datum/file/camnet_key/prison)
- spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/storage/removable,/obj/item/part/computer/ai_holder,
- /obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras,
- /obj/item/part/computer/cardslot/dual,/obj/item/part/computer/networking/area)
- New(var/L,var/built=0)
- if(!built && !battery)
- battery = new /obj/item/weapon/stock_parts/cell(src)
- ..(L,built)
-
-/obj/item/weapon/storage/box/testing_disks
- New()
- ..()
- for(var/typekey in subtypesof(/obj/item/weapon/disk/file))
- new typekey(src)
\ No newline at end of file
diff --git a/code/modules/computer3/upload/lawfile.dm b/code/modules/computer3/upload/lawfile.dm
deleted file mode 100644
index 7fcbac00663..00000000000
--- a/code/modules/computer3/upload/lawfile.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- Computer3 law changes:
-
- * Laws are a file type
- * Connecting to the AI requires a network connection
- * Connecting to a borg requires a radio or network.
-
-*/
-
-/datum/file/ai_law
- var/list/hacklaws = null
- var/zerolaw = null
- var/list/corelaws = null
- var/list/auxlaws = null
-
- var/configurable = 0
-
- // override this when you need to be able to alter the parameters of the lawset
- proc/configure()
- return
-
- execute(var/datum/file/program/source)
- if(istype(usr,/mob/living/silicon))
- return
- if(istype(source,/datum/file/program/ntos))
- if(configurable)
- configure()
- return
- if(istype(source,/datum/file/program/upload/ai))
\ No newline at end of file
diff --git a/code/modules/computer3/upload/programs.dm b/code/modules/computer3/upload/programs.dm
deleted file mode 100644
index 34197f3bf69..00000000000
--- a/code/modules/computer3/upload/programs.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- Note that as with existing ai upload, this is not an interactive program.
- That means that the work is done in execute() rather than interact()
-*/
-
-/datum/file/program/upload/ai
- execute(var/datum/file/program/source)
- if(!interactable() || istype(usr,/mob/living/silicon))
- return 0
- if(!computer.net)
- to_chat(usr, "An indecipherable set of code flicks across the screen. Nothing else happens.")
- return
- var/list/results = computer.net.get_machines
\ No newline at end of file
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index ebd37b4b9e1..e1ea3f4dc5c 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -2,6 +2,8 @@
var/busy
var/viewing_category = 1 //typical powergamer starting on the Weapons tab
var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
+ var/display_craftable_only = FALSE
+ var/display_compact = TRUE
@@ -34,8 +36,8 @@
else
continue
return 0
- for(var/A in R.chem_catalists)
- if(contents[A] < R.chem_catalists[A])
+ for(var/A in R.chem_catalysts)
+ if(contents[A] < R.chem_catalysts[A])
return 0
return 1
@@ -225,68 +227,70 @@
Deletion.Cut(Deletion.len)
qdel(DL)
-/datum/personal_crafting/proc/craft(mob/user)
- if(user.incapacitated() || user.lying || istype(user.loc, /obj/mecha))
- return
+/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, datum/topic_state/state = not_incapacitated_turf_state)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "personal_crafting.tmpl", "Crafting Menu", 700, 800, state = state)
+ ui.open()
+
+/datum/personal_crafting/ui_data(mob/user)
+ var/list/data = list()
+ var/cur_category = categories[viewing_category]
+ data["busy"] = busy
+ data["prev_cat"] = categories[prev_cat()]
+ data["category"] = cur_category
+ data["next_cat"] = categories[next_cat()]
+ data["display_craftable_only"] = display_craftable_only
+ data["display_compact"] = display_compact
+
var/list/surroundings = get_surroundings(user)
- var/dat = "Crafting menu "
- if(busy)
- dat += "Crafting in progress...
"
- else
- dat += "<-- "
- dat += " [categories[prev_cat()]] |"
- dat += " [categories[viewing_category]] "
- dat += "| [categories[next_cat()]] "
- dat += "--> "
-
- dat += ""
-
- //Filter the recipes we can craft to the top
- var/list/can_craft = list()
- var/list/cant_craft = list()
- for(var/datum/crafting_recipe/R in crafting_recipes)
- if(R.category != categories[viewing_category])
- continue
- if(check_contents(R, surroundings))
- can_craft += R
- else
- cant_craft += R
-
- for(var/datum/crafting_recipe/R in can_craft)
- dat += build_recipe_text(R, surroundings)
- for(var/datum/crafting_recipe/R in cant_craft)
- dat += build_recipe_text(R, surroundings)
-
-
- dat += "
"
-
- var/datum/browser/popup = new(user, "crafting", "Crafting", 500, 500)
- popup.set_content(dat)
- popup.open()
- return
+ var/list/can_craft = list()
+ var/list/cant_craft = list()
+ for(var/rec in crafting_recipes)
+ var/datum/crafting_recipe/R = rec
+ if(R.category != cur_category)
+ continue
+ if(check_contents(R, surroundings))
+ can_craft += list(build_recipe_data(R))
+ else
+ cant_craft += list(build_recipe_data(R))
+ data["can_craft"] = can_craft
+ data["cant_craft"] = cant_craft
+ return data
/datum/personal_crafting/Topic(href, href_list)
- if(usr.stat || usr.lying)
+ if(..())
return
+
if(href_list["make"])
var/datum/crafting_recipe/TR = locate(href_list["make"])
busy = 1
- craft(usr)
+ nanomanager.update_uis(src)
var/fail_msg = construct_item(usr, TR)
if(!fail_msg)
- usr << "[TR.name] constructed. "
+ to_chat(usr, "[TR.name] constructed. ")
else
- usr << "Construction failed[fail_msg] "
+ to_chat(usr, "Construction failed[fail_msg] ")
busy = 0
- craft(usr)
+ nanomanager.update_uis(src)
if(href_list["forwardCat"])
viewing_category = next_cat()
- usr << "Category is now [categories[viewing_category]]. "
- craft(usr)
+ to_chat(usr, "Category is now [categories[viewing_category]]. ")
+ . = TRUE
if(href_list["backwardCat"])
viewing_category = prev_cat()
- usr << "Category is now [categories[viewing_category]]. "
- craft(usr)
+ to_chat(usr, "Category is now [categories[viewing_category]]. ")
+ . = TRUE
+ if(href_list["toggle_recipes"])
+ display_craftable_only = !display_craftable_only
+ to_chat(usr, "You will now [display_craftable_only ? "only see recipes you can craft":"see all recipes"]. ")
+ . = TRUE
+ if(href_list["toggle_compact"])
+ display_compact = !display_compact
+ to_chat(usr, "Crafting menu is now [display_compact? "compact" : "full size"]. ")
+ . = TRUE
+
+ nanomanager.update_uis(src)
//Next works nicely with modular arithmetic
/datum/personal_crafting/proc/next_cat()
@@ -301,39 +305,32 @@
if(. <= 0)
. = categories.len
-/datum/personal_crafting/proc/build_recipe_text(datum/crafting_recipe/R, list/contents)
- . = ""
- var/name_text = ""
+/datum/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
+ var/list/data = list()
+ data["name"] = R.name
+ data["ref"] = "\ref[R]"
var/req_text = ""
var/tool_text = ""
- var/catalist_text = ""
- if(check_contents(R, contents))
- name_text ="[R.name] "
+ var/catalyst_text = ""
- else
- name_text = "[R.name] "
+ for(var/a in R.reqs)
+ //We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var)
+ //Also these are typepaths so sadly we can't just do "[a]"
+ var/atom/A = a
+ req_text += " [R.reqs[A]] [initial(A.name)],"
+ req_text = replacetext(req_text, ",", "", -1)
+ data["req_text"] = req_text
- if(name_text)
- for(var/A in R.reqs)
- if(ispath(A, /obj))
- var/obj/O = A
- req_text += " [R.reqs[A]] [initial(O.name)]"
- else if(ispath(A, /datum/reagent))
- var/datum/reagent/RE = A
- req_text += " [R.reqs[A]] [initial(RE.name)]"
+ for(var/a in R.chem_catalysts)
+ var/atom/A = a //cheat-typecast
+ catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)],"
+ catalyst_text = replacetext(catalyst_text, ",", "", -1)
+ data["catalyst_text"] = catalyst_text
- if(R.chem_catalists.len)
- catalist_text += ", Catalysts:"
- for(var/C in R.chem_catalists)
- if(ispath(C, /datum/reagent))
- var/datum/reagent/RE = C
- catalist_text += " [R.chem_catalists[C]] [initial(RE.name)]"
+ for(var/a in R.tools)
+ var/atom/A = a //cheat-typecast
+ tool_text += " [R.tools[A]] [initial(A.name)],"
+ tool_text = replacetext(tool_text, ",", "", -1)
+ data["tool_text"] = tool_text
- if(R.tools.len)
- tool_text += ", Tools:"
- for(var/O in R.tools)
- if(ispath(O, /obj))
- var/obj/T = O
- tool_text += " [R.tools[O]] [initial(T.name)]"
-
- . = "[name_text][req_text][tool_text][catalist_text] "
+ return data
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 288dcfcd9c5..ae964af74a8 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -5,8 +5,7 @@
var/tools[] = list() //type paths of items needed but not consumed
var/time = 30 //time in deciseconds
var/parts[] = list() //type paths of items that will be placed in the result
- var/chem_catalists[] = list() //like tools but for reagents
- var/fruit[] = list() //grown products required by the recipe
+ var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_MISC // Recipe category
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
@@ -49,10 +48,8 @@
result = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
- /obj/item/weapon/wirecutters = 1,
- /obj/item/weapon/stock_parts/cell = 1)
+ /obj/item/device/assembly/igniter = 1)
time = 40
- parts = list(/obj/item/weapon/stock_parts/cell = 1)
category = CAT_WEAPON
/datum/crafting_recipe/bola
@@ -289,7 +286,7 @@
time = 150
reqs = list(/obj/item/stack/rods = 3,
/obj/item/stack/cable_coil = 10,
- /obj/item/stack/sheet/mineral/plastic = 3,
+ /obj/item/stack/sheet/plastic = 3,
/obj/item/stack/sheet/wood = 5)
tools = list(/obj/item/weapon/weldingtool,
/obj/item/weapon/screwdriver)
@@ -308,4 +305,11 @@
time = 20
reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
/obj/item/weapon/bikehorn)
- category = CAT_MISC
\ No newline at end of file
+ category = CAT_MISC
+
+/datum/crafting_recipe/bonfire
+ name = "Bonfire"
+ time = 60
+ reqs = list(/obj/item/weapon/grown/log = 5)
+ result = /obj/structure/bonfire
+ category = CAT_PRIMAL
\ No newline at end of file
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 97d010439c9..faf381ffd8d 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -20,12 +20,14 @@
icon_state = "tatgun"
force = 0
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages
var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm
var/tattoo_r = 1 // RGB values for the body markings
var/tattoo_g = 1
var/tattoo_b = 1
+ toolspeed = 1
+ usesound = 'sound/items/Welder2.ogg'
/obj/item/device/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob)
if(user.a_intent == "harm")
@@ -61,7 +63,7 @@
else
user.visible_message("[user] begins to apply a [tattoo_name] [target] with the [src]. ", "You begin to tattoo [target] with the [src]! ")
- if(!do_after(user,30, target = M))
+ if(!do_after(user, 30 * toolspeed, target = M))
return
user.visible_message("[user] finishes the [tattoo_name] on [target]. ", "You finish the [tattoo_name]. ")
@@ -69,7 +71,7 @@
target.change_markings(tattoo_icon, "body")
target.change_marking_color(rgb(tattoo_r, tattoo_g, tattoo_b), "body")
- playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(src.loc, usesound, 20, 1)
used = 1
update_icon()
@@ -127,6 +129,12 @@
icon_state = "zeldacrowbar"
item_state = "crowbar"
+/obj/item/clothing/glasses/monocle/fluff/trubus //Trubus: Wolf O'Shaw
+ name = "Gold Thermal Eyepatch"
+ desc = "Wolf's non-functional thermal eyepatch."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "wolf_eyepatch"
+
/obj/item/clothing/glasses/meson/fluff/book_berner_1 // Adrkiller59: Adam Cooper
name = "bespectacled mesonic surveyors"
desc = "One of the older meson scanner models retrofitted to perform like its modern counterparts."
@@ -138,6 +146,28 @@
desc = "A weathered Vox thermonocle, doesn't seem to work anymore."
icon_state = "thermoncle"
+/obj/item/device/fluff/rapid_wheelchair_kit //Rapidvalj: Hakikarahiti
+ name = "wheelchair conversion kit"
+ desc = "An assorted set of exchangable parts for a wheelchair."
+ icon_state = "modkit"
+
+/obj/item/device/fluff/rapid_wheelchair_kit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+
+ if(istype(target, /obj/structure/stool/bed/chair/wheelchair) && !istype(target, /obj/structure/stool/bed/chair/wheelchair/bike))
+ to_chat(user, "You modify the appearance of [target]. ")
+ var/obj/structure/stool/bed/chair/wheelchair/chair = target
+ chair.icon = 'icons/obj/custom_items.dmi'
+ chair.icon_state = "vox_wheelchair"
+ chair.name = "vox wheelchair"
+ chair.desc = "A luxurious Vox Wheelchair, weathered from use."
+ chair.handle_rotation()
+ qdel(src)
+ return
+
+ to_chat(user, "You can't modify [target]! ")
+
/obj/item/weapon/lighter/zippo/fluff/purple // GodOfOreos: Jason Conrad
name = "purple engraved zippo"
desc = "All craftsspacemanship is of the highest quality. It is encrusted with refined plasma sheets. On the item is an image of a dwarf and the words 'Strike the Earth!' etched onto the side."
@@ -191,7 +221,7 @@
item_state = "lunch_box"
force = 5
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 9
storage_slots = 3
@@ -218,7 +248,7 @@
hitsound = 'sound/weapons/tap.ogg'
force = 0
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/used = 0
/obj/item/fluff/wingler_comb/attack_self(mob/user)
@@ -233,23 +263,49 @@
to_chat(target, "You comb your tail with the [src]. ")
used = 1
+/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael steampunk_witch
+ name = "stun baton converstion kit"
+ desc = "Some sci-fi looking parts for a stun baton."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "scifikit"
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/device/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+
+ if(istype(target, /obj/item/weapon/melee/baton) && !istype(target, /obj/item/weapon/melee/baton/cattleprod))
+ to_chat(user, "You modify the appearance of [target]. ")
+ var/obj/item/weapon/melee/baton/the_baton = target
+ the_baton.base_icon = "desolate_baton"
+ the_baton.item_state = "desolate_baton"
+ the_baton.icon = 'icons/obj/custom_items.dmi'
+ the_baton.lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
+ the_baton.righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
+ the_baton.update_icon()
+ user.update_icons()
+ qdel(src)
+ return
+
+ to_chat(user, "You can't modify [target]! ")
+
/obj/item/device/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery
name = "welding helmet modkit"
desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!"
icon_state = "modkit"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
/obj/item/device/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !ishuman(user) || user.lying)
+ if(!proximity || !ishuman(user) || user.incapacitated())
return
if(istype(target, /obj/item/clothing/head/welding))
to_chat(user, "You modify the appearance of [target]. ")
var/obj/item/clothing/head/welding/flamedecal/P = new(get_turf(target))
- transfer_fingerprints_to(P)
+ target.transfer_fingerprints_to(P)
qdel(target)
qdel(src)
return
@@ -262,12 +318,12 @@
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 0
throwforce = 0
/obj/item/device/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !ishuman(user) || user.lying)
+ if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
@@ -307,11 +363,78 @@
#undef USED_MOD_HELM
#undef USED_MOD_SUIT
+/obj/item/device/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
+ name = "sallet modkit"
+ desc = "A modkit that can make most helmets look like a steel sallet."
+ icon_state = "modkit"
+ w_class = WEIGHT_CLASS_SMALL
+ force = 0
+ throwforce = 0
+
+/obj/item/device/fluff/merchant_sallet_modkit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+
+ var/mob/living/carbon/human/H = user
+ if(istype(target, /obj/item/clothing/head/helmet) && !istype(target, /obj/item/clothing/head/helmet/space))
+ var/obj/item/clothing/head/helmet/helm = target
+ var/obj/item/clothing/head/helmet/fluff/merchant_sallet/sallet = new(get_turf(target))
+ sallet.flags = helm.flags
+ sallet.flags_cover = helm.flags_cover
+ sallet.armor = helm.armor
+ sallet.flags_inv = helm.flags_inv
+ sallet.cold_protection = helm.cold_protection
+ sallet.min_cold_protection_temperature = helm.min_cold_protection_temperature
+ sallet.heat_protection = helm.heat_protection
+ sallet.max_heat_protection_temperature = helm.max_heat_protection_temperature
+ sallet.strip_delay = helm.strip_delay
+ sallet.put_on_delay = helm.put_on_delay
+ sallet.burn_state = helm.burn_state
+ sallet.flags_cover = helm.flags_cover
+ sallet.visor_flags = helm.visor_flags
+ sallet.visor_flags_inv = helm.visor_flags_inv
+ if(!(BLOCKHAIR in sallet.flags))
+ sallet.flags |= BLOCKHAIR
+
+ sallet.add_fingerprint(H)
+ target.transfer_fingerprints_to(sallet)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ to_chat(user, "You modify [target] with [src]. ")
+ H.update_inv_head()
+ qdel(target)
+ qdel(src)
+ else
+ to_chat(user, "You can't modify [target]! ")
+
+/obj/item/device/fluff/k3_webbing_modkit //IK3I: Yakikatachi
+ name = "webbing modkit"
+ desc = "A modkit that can be used to turn certain vests and labcoats into lightweight webbing"
+ icon_state = "modkit"
+ w_class = 2
+ force = 0
+ throwforce = 0
+
+/obj/item/device/fluff/k3_webbing_modkit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+
+ if(istype(target, /obj/item/clothing/suit/storage/labcoat) || istype(target, /obj/item/clothing/suit/storage/hazardvest))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/clothing/suit/storage/S = target
+ var/obj/item/clothing/suit/storage/fluff/k3_webbing/webbing = new(get_turf(target))
+ webbing.allowed = S.allowed
+ to_chat(user, "You modify the [S] with [src]. ")
+ H.update_inv_wear_suit()
+ qdel(S)
+ qdel(src)
+ else
+ to_chat(user, "You can't modify [target]! ")
+
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
-//////////// Gloves ////////////
+//////////// Gloves //////////////
//////////// Eye Wear ////////////
/obj/item/clothing/glasses/hud/security/sunglasses/fluff/eyepro //T0EPIC4U: Ty Omaha
@@ -324,6 +447,7 @@
/obj/item/clothing/glasses/hud/security/sunglasses/fluff/voxxyhud //LP Spartan: Kaskreyarawkta
name = "VoxxyHUD"
desc = "A worn down visor from a vox raider's gear, crudely ripped from its helmet and linked into the security systems of the station. The word 'Kask' is scratched into the side."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "hud-spartan"
//////////// Hats ////////////
@@ -339,13 +463,12 @@
desc = "Fuzzy, and also stained with blood."
icon = 'icons/obj/custom_items.dmi'
icon_state = "polarbearpelt"
- item_state = "polarbearpelt"
/obj/item/clothing/head/fluff/sparkyninja_beret // Sparkyninja: Neil Wilkinson
name = "royal marines commando beret"
desc = "Dark Green beret with an old insignia on it."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "sparkyninja_beret"
- item_state = "sparkyninja_beret"
/obj/item/clothing/head/beret/fluff/sigholt //sigholtstarsong: Sigholt Starsong
name = "Lieutenant Starsong's beret"
@@ -376,25 +499,77 @@
/obj/item/clothing/head/beret/fluff/linda //Epic_Charger: Linda Clark
name = "Green beret"
desc = "A beret, an artist's favorite headwear. This one has two holes cut on the edges."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "linda_beret"
/obj/item/clothing/head/fluff/kaki //Rapidvalj: Kakicharakiti
name = "sleek fancy leader hat"
desc = "A uniquely colored vox leader hat. Has some signs of wear."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "kakicharakiti"
+/obj/item/clothing/head/helmet/fluff/merchant_sallet //Travelling Merchant: Trav Noble. This >>IS NOT<< what they spawn in with
+ name = "Steel Sallet"
+ desc = "A heavy steel sallet with the word Noble scratched into the side. Comes with a Bevor attached."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "merchant_sallet_visor_bevor"
+ item_state = "merchant_sallet_visor_bevor"
+ actions_types = list(/datum/action/item_action/toggle_helmet_mode)
+ toggle_cooldown = 20
+ toggle_sound = 'sound/items/ZippoClose.ogg'
+ flags = BLOCKHAIR
+ flags_inv = HIDEEYES|HIDEMASK|HIDEFACE|HIDEEARS
+ var/state = "Visor & Bevor"
+
+/obj/item/clothing/head/helmet/fluff/merchant_sallet/attack_self(mob/user)
+ if(!user.incapacitated() && (world.time > cooldown + toggle_cooldown) && Adjacent(user))
+ var/list/options = list()
+ options["Visor & Bevor"] = list(
+ "icon_state" = "merchant_sallet_visor_bevor",
+ "visor_flags" = HIDEEYES,
+ "mask_flags" = HIDEMASK|HIDEFACE
+ )
+ options["Visor Only"] = list(
+ "icon_state" = "merchant_sallet_visor",
+ "visor_flags" = HIDEEYES,
+ "mask_flags" = HIDEFACE
+ )
+ options["Bevor Only"] = list(
+ "icon_state" = "merchant_sallet_bevor",
+ "visor_flags" = null,
+ "mask_flags" = HIDEMASK|HIDEFACE
+ )
+ options["Neither Visor nor Bevor"] = list(
+ "icon_state" = "merchant_sallet",
+ "visor_flags" = null,
+ "mask_flags" = null
+ )
+
+ var/choice = input(user, "How would you like to adjust the sallet?", "Adjust Sallet") as null|anything in options
+
+ if(choice && choice != state && !user.incapacitated() && Adjacent(user))
+ var/list/new_state = options[choice]
+ icon_state = new_state["icon_state"]
+ state = choice
+ to_chat(user, "You adjust the sallet.")
+ playsound(src.loc, "[toggle_sound]", 100, 0, 4)
+ user.update_inv_head()
+ return 1
+
//////////// Suits ////////////
+/obj/item/clothing/suit/fluff
+ icon = 'icons/obj/custom_items.dmi'
+ actions_types = list()
+ ignore_suitadjust = 1
+ adjust_flavour = null
+ species_fit = null
+ sprite_sheets = null
+
/obj/item/clothing/suit/fluff/dusty_jacket //ComputerlessCitizen: Screech
name = "Dusty Jacket"
desc = "A worn leather jacket. Some burn holes have been patched."
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- icon = 'icons/obj/custom_items.dmi'
icon_state = "dusty_jacket"
- ignore_suitadjust = 1
- actions_types = list()
- adjust_flavour = null
- species_fit = null
- sprite_sheets = null
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
name = "Robotics labcoat"
@@ -419,6 +594,7 @@
/obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen
name = "Nano Fibre Jacket"
desc = "A Black Suit made out of nanofibre. The newest of cyberpunk fashion using hightech liquid to solid materials."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "Kluysfluff1"
item_state = "Kluysfluff1"
blood_overlay_type = "coat"
@@ -465,17 +641,62 @@
/obj/item/clothing/suit/hooded/hoodie/fluff/linda // Epic_Charger: Linda Clark
name = "Green Nanotrasen Hoodie"
desc = "A green hoodie with the Nanotrasen logo on the back. It looks weathered."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "linda_hoodie"
hoodtype = /obj/item/clothing/head/hood/fluff/linda
/obj/item/clothing/head/hood/fluff/linda //Epic_Charger: Linda Clark
icon_state = "greenhood"
+/obj/item/clothing/suit/hooded/fluff/bone //Doru7: Jack Bone
+ name = "skeleton suit"
+ desc = "A spooky full-body suit! This one doesn't glow in the dark."
+ body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "skeleton_suit"
+ hoodtype = /obj/item/clothing/head/hood/fluff/skeleton
+
+/obj/item/clothing/head/hood/fluff/skeleton
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "skeleton_hood"
+
/obj/item/clothing/suit/armor/shodanscoat // RazekPraxis: SHODAN
name = "SHODAN's Captain's Coat"
desc = "A black coat with gold trim and an old US Chevron printed on the back. Edgy."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "shodancoat"
+/obj/item/clothing/suit/storage/fluff/k3_webbing
+ name = "vox tactical webbing"
+ desc = "A somewhat worn but well kept set of vox tactical webbing. It has a couple of pouches attached."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "k3_webbing"
+ species_fit = list("Vox")
+ sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
+ ignore_suitadjust = 0
+ actions_types = list(/datum/action/item_action/toggle)
+ suit_adjusted = 0
+
+/obj/item/clothing/suit/storage/fluff/k3_webbing/adjustsuit(var/mob/user)
+ if(!user.incapacitated())
+ var/flavour
+ if(suit_adjusted)
+ flavour = "off"
+ icon_state = copytext(icon_state, 1, findtext(icon_state, "_on"))
+ item_state = copytext(item_state, 1, findtext(item_state, "_on"))
+ suit_adjusted = 0 //Lights Off
+ else
+ flavour = "on"
+ icon_state += "_on"
+ item_state += "_on"
+ suit_adjusted = 1 //Lights On
+
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+ to_chat(user, "You turn the [src]'s lighting system [flavour].")
+ user.update_inv_wear_suit()
+
//////////// Uniforms ////////////
/obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile
name = "Castile formal outfit"
@@ -494,6 +715,15 @@
item_color = "elishirt"
displays_id = 0
+/obj/item/clothing/under/fluff/jay_turtleneck // Jayfeather: Jay Wingler
+ name = "Mar's Pattern Custom Turtleneck"
+ desc = "It seems to be lightly dusted in orange fuzz, and damp with the smell of anti-freeze. It has a strange symbol in the middle."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "jaywingler"
+ item_state = "jaywingler"
+ item_color = "jaywingler"
+ displays_id = 0
+
/obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius
name = "Isaca's suit"
desc = "Black, comfortable and nicely fitting suit. Made not to hinder the wearer in any way. Made of some exotic fabric. And some strange glowing jewel at the waist. Name labels says; Property of Isaca Sirius; The Seeder."
@@ -540,6 +770,9 @@
/obj/item/clothing/under/fluff/aegis //PlagueWalker: A.E.G.I.S.
name = "gilded waistcoat"
desc = "This black, gold-trimmed, rather expensive-looking uniform laced with fine materials appears comfortable despite its stiffness."
+ icon = 'icons/obj/custom_items.dmi'
+ lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
icon_state = "aegisuniform"
item_state = "aegisuniform"
item_color = "aegisuniform"
@@ -550,8 +783,17 @@
/obj/item/clothing/mask/bandana/fluff/dar //sasanek12: Dar'Konr
name = "camo bandana"
desc = "It's a worn-out bandana in camo paint"
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "bandcamo"
+/obj/item/clothing/mask/gas/sechailer/fluff/spartan //LP Spartan: Kaskreyarawkta
+ name = "minimal gasmask"
+ desc = "Designed to cover as little of face as possible while still being a functional gasmask."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "spartan_mask"
+ item_state = "spartan_mask"
+ species_restricted = list("Vox")
+
//////////// Shoes ////////////
//////////// Sets ////////////
@@ -614,7 +856,8 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "chronx_hood"
item_state = "chronx_hood"
- flags = HEADCOVERSEYES | BLOCKHAIR
+ flags = BLOCKHAIR
+ flags_cover = HEADCOVERSEYES
actions_types = list(/datum/action/item_action/toggle)
var/adjusted = 0
@@ -684,4 +927,44 @@
/obj/item/weapon/storage/backpack/fluff/krich_back //lizardzsi: Krichahka
name = "Voxcaster"
desc = "Battered, Sol-made military radio backpack that had its speakers fried from playing Vox opera. The words 'Swift-Talon' are crudely scratched onto its side."
+ icon = 'icons/obj/custom_items.dmi'
icon_state = "voxcaster_fluff"
+
+/obj/item/clothing/head/wizard/fake/fluff/dreamy //phantasmicdream : Dreamy Rockwall
+ name = "strange witch hat"
+ desc = "A shapeshifting witch hat. A strange aura comes from it..."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "classic_witch"
+ item_state = "classic_witch"
+
+/obj/item/clothing/head/wizard/fake/fluff/dreamy/attack_self(mob/user)
+ var/list/options = list()
+ options["Classic"] = "classic_witch"
+ options["Good"] = "good_witch"
+ options["Dark"] = "dark_witch"
+ options["Steampunk"] ="steampunk_witch"
+ options["Healer"] = "healer_witch"
+ options["Cute"] = "cutie_witch"
+ options["Shy"] = "shy_witch"
+ options["Sexy"] ="sexy_witch"
+ options["Bunny"] = "bunny_witch"
+ options["Potions"] = "potions_witch"
+ options["Syndicate"] = "syndie_witch"
+ options["Nanotrasen"] ="nt_witch"
+
+ var/choice = input(user, "To what form do you wish to Shapeshift this hat?", "Shapeshift Hat") as null|anything in options
+
+ if(choice && !user.stat && in_range(user, src))
+ icon_state = options[choice]
+ to_chat(user, "Your strange witch hat has now shapeshifted into it's [choice] form!")
+ return 1
+ ..()
+
+/obj/item/clothing/accessory/necklace/locket/fluff/fethasnecklace //Fethas: Sefra'neem
+ name = "Orange gemmed locket"
+ desc = "A locket with a orange gem set on the front, the picture inside seems to be of a Tajaran."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "fethasnecklace"
+ item_state = "fethasnecklace"
+ item_color = "fethasnecklace"
+ slot_flags = SLOT_MASK | SLOT_TIE
diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm
index 6f62a7eecac..cb4e2604771 100644
--- a/code/modules/detective_work/evidence.dm
+++ b/code/modules/detective_work/evidence.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "evidenceobj"
item_state = ""
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user,proximity)
if(!proximity || loc == I)
@@ -29,7 +29,7 @@
to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd. ")
return 1 //now this is podracing
- if(I.w_class > 3)
+ if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user, "[I] won't fit in [src]. ")
return
@@ -40,8 +40,7 @@
if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
if(istype(I.loc,/obj/item/weapon/storage)) //in a container.
var/obj/item/weapon/storage/U = I.loc
- user.client.screen -= I
- U.contents.Remove(I)
+ U.remove_from_storage(I, src)
else if(user.l_hand == I) //in a hand
user.drop_l_hand()
else if(user.r_hand == I) //in a hand
@@ -59,6 +58,7 @@
I.pixel_x = 0 //then remove it so it'll stay within the evidence bag
I.pixel_y = 0
var/image/img = image("icon"=I, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn
+ img.plane = FLOAT_PLANE
I.pixel_x = xx //and then return it
I.pixel_y = yy
overlays += img
@@ -69,31 +69,30 @@
w_class = I.w_class
return 1
-/obj/item/weapon/evidencebag/attack_self(mob/user as mob)
+/obj/item/weapon/evidencebag/attack_self(mob/user)
if(contents.len)
var/obj/item/I = contents[1]
user.visible_message("[user] takes [I] out of [src]. ", "You take [I] out of [src]. ",\
"You hear someone rustle around in a plastic bag, and remove something. ")
overlays.Cut() //remove the overlays
user.put_in_hands(I)
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
icon_state = "evidenceobj"
desc = "An empty evidence bag."
else
to_chat(user, "[src] is empty.")
icon_state = "evidenceobj"
- return
/obj/item/weapon/storage/box/evidence
name = "evidence bag box"
desc = "A box claiming to contain evidence bags."
- New()
- new /obj/item/weapon/evidencebag(src)
- new /obj/item/weapon/evidencebag(src)
- new /obj/item/weapon/evidencebag(src)
- new /obj/item/weapon/evidencebag(src)
- new /obj/item/weapon/evidencebag(src)
- new /obj/item/weapon/evidencebag(src)
- ..()
- return
\ No newline at end of file
+
+/obj/item/weapon/storage/box/evidence/New()
+ new /obj/item/weapon/evidencebag(src)
+ new /obj/item/weapon/evidencebag(src)
+ new /obj/item/weapon/evidencebag(src)
+ new /obj/item/weapon/evidencebag(src)
+ new /obj/item/weapon/evidencebag(src)
+ new /obj/item/weapon/evidencebag(src)
+ ..()
diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm
index 64ade59adee..cc6a463a0ee 100644
--- a/code/modules/detective_work/footprints_and_rag.dm
+++ b/code/modules/detective_work/footprints_and_rag.dm
@@ -17,7 +17,7 @@
/obj/item/weapon/reagent_containers/glass/rag
name = "damp rag"
desc = "For cleaning up messes, you suppose."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
icon = 'icons/obj/toy.dmi'
icon_state = "rag"
amount_per_transfer_from_this = 5
@@ -25,6 +25,7 @@
volume = 5
can_be_placed_into = null
flags = OPENCONTAINER | NOBLUDGEON
+ var/wipespeed = 30
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
if(ismob(target) && target.reagents && reagents.total_volume)
@@ -39,7 +40,7 @@
if(!proximity) return
if(istype(A) && src in user)
user.visible_message("[user] starts to wipe down [A] with [src]!")
- if(do_after(user,30, target = A))
+ if(do_after(user, wipespeed, target = A))
user.visible_message("[user] finishes wiping off the [A]!")
A.clean_blood()
return
diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm
index be8e7d147a2..bb1a79f13ad 100644
--- a/code/modules/detective_work/scanner.dm
+++ b/code/modules/detective_work/scanner.dm
@@ -7,7 +7,7 @@
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
icon = 'icons/goonstation/objects/objects.dmi'
icon_state = "detscanner"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
item_state = "electronic"
flags = CONDUCT | NOBLUDGEON
slot_flags = SLOT_BELT
@@ -66,7 +66,7 @@
if(log.len && !scanning)
scanning = 1
to_chat(usr, "Printing report, please wait... ")
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
spawn(100)
// Create our paper
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index b583c04702f..40f258b0c2a 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -46,11 +46,11 @@ log transactions
if(stat & NOPOWER)
return
- if(linked_db && ( (linked_db.stat & NOPOWER) || !linked_db.activated ) )
+ if(linked_db && ((linked_db.stat & NOPOWER) || !linked_db.activated))
linked_db = null
authenticated_account = null
- src.visible_message("\red [bicon(src)] [src] buzzes rudely, \"Connection to remote database lost.\"")
- updateDialog()
+ visible_message("[bicon(src)][src] buzzes rudely, \"Connection to remote database lost.\" ")
+ nanomanager.update_uis(src)
if(ticks_left_timeout > 0)
ticks_left_timeout--
@@ -63,158 +63,101 @@ log transactions
if(authenticated_account)
var/turf/T = get_turf(src)
- if(istype(T) && locate(/obj/item/weapon/spacecash) in T)
- var/list/cash_found = list()
- for(var/obj/item/weapon/spacecash/S in T)
- cash_found+=S
- if(cash_found.len>0)
- if(prob(50))
- playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
- else
- playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
- var/amount = count_cash(cash_found)
- for(var/obj/item/weapon/spacecash/S in cash_found)
- qdel(S)
- authenticated_account.charge(-amount,null,"Credit deposit",terminal_id=machine_id,dest_name = "Terminal")
+ if(istype(T) && locate(/obj/item/stack/spacecash) in T)
+ var/cash_amount = 0
+ for(var/obj/item/stack/spacecash/S in T)
+ cash_amount += S.amount
+ if(cash_amount)
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
+ for(var/obj/item/stack/spacecash/S in T)
+ S.use(S.amount)
+ authenticated_account.charge(-cash_amount, null, "Credit deposit", terminal_id = machine_id, dest_name = "Terminal")
/obj/machinery/atm/proc/reconnect_database()
- for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
- if( DB.z == src.z && !(DB.stat & NOPOWER) && DB.activated )
+ for(var/obj/machinery/computer/account_database/DB in machines)
+ if(DB.z == z && !(DB.stat & NOPOWER) && DB.activated)
linked_db = DB
break
-/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/machinery/atm/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card))
- var/obj/item/weapon/card/id/idcard = I
if(!held_card)
- usr.drop_item()
- idcard.loc = src
- held_card = idcard
+ user.drop_item()
+ I.forceMove(src)
+ held_card = I
if(authenticated_account && held_card.associated_account_number != authenticated_account.account_number)
authenticated_account = null
+ nanomanager.update_uis(src)
else if(authenticated_account)
- if(istype(I,/obj/item/weapon/spacecash))
+ if(istype(I, /obj/item/stack/spacecash))
//consume the money
- var/obj/item/weapon/spacecash/C = I
- authenticated_account.money += C.get_total()
- if(prob(50))
- playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
- else
- playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+ var/obj/item/stack/spacecash/C = I
+ authenticated_account.money += C.amount
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
//create a transaction log entry
var/datum/transaction/T = new()
T.target_name = authenticated_account.owner_name
T.purpose = "Credit deposit"
- T.amount = C.get_total()
+ T.amount = C.amount
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
to_chat(user, "You insert [C] into [src]. ")
- src.attack_hand(user)
- qdel(I)
+ nanomanager.update_uis(src)
+ C.use(C.amount)
else
..()
-/obj/machinery/atm/attack_hand(mob/user as mob)
- if(istype(user, /mob/living/silicon))
- to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.")
+/obj/machinery/atm/attack_hand(mob/user)
+ if(..())
+ return 1
+ if(issilicon(user))
+ to_chat(user, "Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005. ")
return
- if(get_dist(src,user) <= 1)
- add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/atm/attack_ghost(mob/user)
+ ui_interact(user)
- //js replicated from obj/machinery/computer/card
- var/dat = {"Nanotrasen Automatic Teller Machine
- For all your monetary needs!
- This terminal is [machine_id]. Report this code when contacting Nanotrasen IT Support
- Card: [held_card ? held_card.name : "------"] "}
+/obj/machinery/atm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atm.tmpl", name, 550, 650)
+ ui.open()
- if(ticks_left_locked_down > 0)
- dat += "Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled. "
- else if(authenticated_account)
- switch(view_screen)
- if(CHANGE_SECURITY_LEVEL)
- dat += "Select a new security level for this account: "
- var/text = "Zero - Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct."
- if(authenticated_account.security_level != 0)
- text = "[text] "
- dat += "[text] "
- text = "One - An account number and pin must be manually entered to access this account and process transactions."
- if(authenticated_account.security_level != 1)
- text = "[text] "
- dat += "[text] "
- text = "Two - In addition to account number and pin, a card is required to access this account and process transactions."
- if(authenticated_account.security_level != 2)
- text = "[text] "
- dat += {"[text]
- Back "}
- if(VIEW_TRANSACTION_LOGS)
- dat += {"Transaction logs
- Back
-
-
- Date
- Time
- Target
- Purpose
- Value
- Source terminal ID
- "}
- for(var/datum/transaction/T in authenticated_account.transaction_log)
- dat += {"
- [T.date]
- [T.time]
- [T.target_name]
- [T.purpose]
- $[T.amount]
- [T.source_terminal]
- "}
- dat += "
"
- if(TRANSFER_FUNDS)
- dat += {"Account balance: $[authenticated_account.money]
- Back
- "}
- else
- dat += {"Welcome, [authenticated_account.owner_name].
- Account balance: $[authenticated_account.money]
-
- Change account security level
- Make transfer
- View transaction log
- Print balance statement
- Logout "}
- else if(linked_db)
- dat += {""}
- else
- dat += "Unable to connect to accounts database, please retry and if the issue persists contact Nanotrasen IT support. "
- reconnect_database()
+/obj/machinery/atm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["src"] = UID()
+ data["view_screen"] = view_screen
+ data["machine_id"] = machine_id
+ data["held_card_name"] = held_card ? held_card.name : "------"
+ data["ticks_left_locked_down"] = ticks_left_locked_down
+ data["linked_db"] = linked_db
- var/datum/browser/popup = new(user, "atm", name, 550, 650)
- popup.set_content(dat)
- popup.open(0)
- else
- user << browse(null,"window=atm")
+ data["authenticated_account"] = authenticated_account
+ if(authenticated_account)
+ data["owner_name"] = authenticated_account.owner_name
+ data["money"] = authenticated_account.money
+ data["security_level"] = authenticated_account.security_level
-/obj/machinery/atm/Topic(var/href, var/href_list)
+ var/list/trx = list()
+ for(var/datum/transaction/T in authenticated_account.transaction_log)
+ trx[++trx.len] = list(
+ "date" = T.date,
+ "time" = T.time,
+ "target_name" = T.target_name,
+ "purpose" = T.purpose,
+ "amount" = T.amount,
+ "source_terminal" = T.source_terminal)
+ data["transaction_log"] = trx
+
+ return data
+
+/obj/machinery/atm/Topic(href, list/href_list)
if(href_list["choice"])
switch(href_list["choice"])
if("transfer")
@@ -253,7 +196,7 @@ log transactions
if(linked_db)
// check if they have low security enabled
scan_user(usr)
-
+
if(!ticks_left_locked_down && held_card)
var/tried_account_num = text2num(href_list["account_num"])
if(!tried_account_num)
@@ -280,11 +223,11 @@ log transactions
T.time = worldtime2text()
failed_account.transaction_log.Add(T)
else
- to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining. ")
previous_account_number = tried_account_num
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
- to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
+ to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered. ")
number_incorrect_tries = 0
else
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
@@ -299,9 +242,7 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
-
- to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
-
+ to_chat(usr, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].' ")
previous_account_number = tried_account_num
if("withdrawal")
var/amount = max(text2num(href_list["funds_amount"]),0)
@@ -313,7 +254,7 @@ log transactions
//remove the money
if(amount > 10000) // prevent crashes
- to_chat(usr, "\blue The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'")
+ to_chat(usr, "The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.' ")
amount = 10000
authenticated_account.money -= amount
withdraw_arbitrary_sum(amount)
@@ -332,11 +273,11 @@ log transactions
if("balance_statement")
if(authenticated_account)
if(world.timeofday < lastprint + PRINT_DELAY)
- to_chat(usr, "The [src.name] flashes an error on its display. ")
+ to_chat(usr, "The [name] flashes an error on its display. ")
return
lastprint = world.timeofday
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
- var/obj/item/weapon/paper/R = new(src.loc)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
+ var/obj/item/weapon/paper/R = new(loc)
R.name = "Account balance: [authenticated_account.owner_name]"
R.info = {"NT Automated Teller Account Statement
Account holder: [authenticated_account.owner_name]
@@ -349,54 +290,49 @@ log transactions
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!R.stamped)
- R.stamped = new
+ R.stamped = new()
R.stamped += /obj/item/weapon/stamp
R.overlays += stampoverlay
R.stamps += "This paper has been stamped by the Automatic Teller Machine. "
- if(prob(50))
- playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
- else
- playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
if("insert_card")
if(held_card)
- held_card.loc = src.loc
+ held_card.forceMove(loc)
authenticated_account = null
-
if(ishuman(usr) && !usr.get_active_hand())
usr.put_in_hands(held_card)
held_card = null
-
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
- I.loc = src
+ I.forceMove(src)
held_card = I
if("logout")
authenticated_account = null
- //usr << browse(null,"window=atm")
- src.attack_hand(usr)
+ nanomanager.update_uis(src)
+ return 1
//create the most effective combination of notes to make up the requested amount
-/obj/machinery/atm/proc/withdraw_arbitrary_sum(var/arbitrary_sum)
- dispense_cash(arbitrary_sum,get_step(get_turf(src),turn(dir,180))) // Spawn on the ATM.
+/obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum)
+ new /obj/item/stack/spacecash(get_step(get_turf(src), turn(dir, 180)), arbitrary_sum)
//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri
-/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob)
+/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H)
if(!authenticated_account && linked_db)
- if(human_user.wear_id)
+ if(H.wear_id)
var/obj/item/weapon/card/id/I
- if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
- I = human_user.wear_id
- else if(istype(human_user.wear_id, /obj/item/device/pda) )
- var/obj/item/device/pda/P = human_user.wear_id
+ if(istype(H.wear_id, /obj/item/weapon/card/id) )
+ I = H.wear_id
+ else if(istype(H.wear_id, /obj/item/device/pda) )
+ var/obj/item/device/pda/P = H.wear_id
I = P.id
if(I)
authenticated_account = attempt_account_access(I.associated_account_number)
if(authenticated_account)
- to_chat(human_user, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(H, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].' ")
//create a transaction log entry
var/datum/transaction/T = new()
@@ -406,5 +342,6 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
-
+
view_screen = NO_SCREEN
+ nanomanager.update_uis(src)
diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm
index 6079e62c54f..620396f7da2 100644
--- a/code/modules/economy/Accounts.dm
+++ b/code/modules/economy/Accounts.dm
@@ -89,7 +89,7 @@ var/global/list/all_money_accounts = list()
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(source_db.loc)
var/obj/item/weapon/paper/R = new /obj/item/weapon/paper(P)
- playsound(source_db.loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(source_db.loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
P.wrapped = R
R.name = "Account information: [M.owner_name]"
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 44299826454..1c9291083d7 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -220,7 +220,7 @@
if("print")
var/text
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/P = new(loc)
if(detailed_account_view)
P.name = "account #[detailed_account_view.account_number] details"
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index 8f408767f72..babbac30b11 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -26,8 +26,8 @@
linked_account = station_account
/obj/item/device/eftpos/proc/print_reference()
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
- var/obj/item/weapon/paper/R = new(src.loc)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
+ var/obj/item/weapon/paper/R = new(loc)
R.name = "Reference: [eftpos_name]"
// AUTOFIXED BY fix_string_idiocy.py
@@ -45,7 +45,7 @@
R.overlays += stampoverlay
R.stamps += "This paper has been stamped by the EFTPOS device. "
var/obj/item/smallDelivery/D = new(R.loc)
- R.loc = D
+ R.forceMove(D)
D.wrapped = R
D.name = "small parcel - 'EFTPOS access code'"
@@ -54,70 +54,51 @@
if(!location)
return
- for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
+ for(var/obj/machinery/computer/account_database/DB in machines)
if(DB.z == location.z)
linked_db = DB
break
-/obj/item/device/eftpos/attack_self(mob/user as mob)
- if(get_dist(src,user) <= 1)
+/obj/item/device/eftpos/attack_self(mob/user)
+ ui_interact(user)
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: var/dat = "[eftpos_name] "
- var/dat = {"[eftpos_name]
-This terminal is [machine_id]. Report this code when contacting Nanotrasen IT Support "}
- // END AUTOFIX
- if(transaction_locked)
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: dat += "Reset[transaction_paid ? "" : " (authentication required)"] "
- dat += {"Reset[transaction_paid ? "" : " (authentication required)"]
- Transaction purpose: [transaction_purpose]
- Value: $[transaction_amount]
- Linked account: [linked_account ? linked_account.owner_name : "None"] "}
- // END AUTOFIX
- if(transaction_paid)
- dat += "This transaction has been processed successfully. "
- else
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:67: dat += "Swipe your card below the line to finish this transaction. "
- dat += {"Swipe your card below the line to finish this transaction.
- \[------\] "}
- // END AUTOFIX
- else
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:70: dat += "Lock in new transaction "
- dat += {"Lock in new transaction
- Transaction purpose: [transaction_purpose]
- Value: $[transaction_amount]
- Linked account: [linked_account ? linked_account.owner_name : "None"]
- Change access code
- Change EFTPOS ID
- Scan card to reset access code \[------\] "}
- // END AUTOFIX
- user << browse(dat,"window=eftpos")
- else
- user << browse(null,"window=eftpos")
-
-/obj/item/device/eftpos/attackby(O as obj, user as mob, params)
+/obj/item/device/eftpos/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/weapon/card))
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
reconnect_database()
if(linked_db)
if(linked_account)
- var/obj/item/weapon/card/I = O
- scan_card(I)
+ scan_card(O, user)
+ nanomanager.update_uis(src)
else
- to_chat(usr, "[bicon(src)]Unable to connect to linked account. ")
+ to_chat(user, "[bicon(src)]Unable to connect to linked account. ")
else
- to_chat(usr, "[bicon(src)]Unable to connect to accounts database. ")
+ to_chat(user, "[bicon(src)]Unable to connect to accounts database. ")
else
..()
-/obj/item/device/eftpos/Topic(var/href, var/href_list)
+/obj/item/device/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "eftpos.tmpl", name, 790, 310)
+ ui.open()
+
+/obj/item/device/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["eftpos_name"] = eftpos_name
+ data["machine_id"] = machine_id
+ data["transaction_locked"] = transaction_locked
+ data["transaction_paid"] = transaction_paid
+ data["transaction_purpose"] = transaction_purpose
+ data["transaction_amount"] = transaction_amount
+ data["linked_account"] = linked_account ? linked_account.owner_name : null
+ return data
+
+/obj/item/device/eftpos/Topic(href, list/href_list)
+ if(..())
+ return 1
+
if(href_list["choice"])
switch(href_list["choice"])
if("change_code")
@@ -134,9 +115,9 @@
if("change_id")
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
- var name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
+ var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
if(name)
- eftpos_name = name + " EFTPOS scanner"
+ eftpos_name = "[name] EFTPOS scanner"
print_reference()
else
to_chat(usr, "[bicon(src)]Incorrect code entered. ")
@@ -150,11 +131,11 @@
else
to_chat(usr, "[bicon(src)]Unable to connect to accounts database. ")
if("trans_purpose")
- var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null
+ var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose", transaction_purpose) as text|null
if(purpose)
transaction_purpose = purpose
if("trans_value")
- var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount") as num
+ var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount", transaction_amount) as num
if(try_num < 0)
alert("That is not a valid amount!")
else
@@ -168,7 +149,7 @@
else if(linked_account)
transaction_locked = 1
else
- to_chat(usr, "[bicon(src)] No account connected to send transactions to. ")
+ to_chat(usr, "[bicon(src)]No account connected to send transactions to. ")
if("scan_card")
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
@@ -176,7 +157,7 @@
if(linked_db && linked_account)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card))
- scan_card(I)
+ scan_card(I, usr)
else
to_chat(usr, "[bicon(src)]Unable to link accounts. ")
if("reset")
@@ -191,12 +172,13 @@
access_code = 0
to_chat(usr, "[bicon(src)]Access code reset to 0. ")
- src.attack_self(usr)
+ nanomanager.update_uis(src)
+ return 1
-/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I)
+/obj/item/device/eftpos/proc/scan_card(obj/item/weapon/card/I, mob/user)
if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src]. ")
+ visible_message("[user] swipes a card through [src]. ")
if(transaction_locked && !transaction_paid)
if(linked_account)
var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num
@@ -204,7 +186,7 @@
if(D)
if(transaction_amount <= D.money)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
- src.visible_message("[bicon(src)] The [src] chimes.")
+ visible_message("[bicon(src)] The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -233,11 +215,11 @@
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]You don't have that much money! ")
+ to_chat(user, "[bicon(src)]You don't have that much money! ")
else
- to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
+ to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again. ")
else
- to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account. ")
+ to_chat(user, "[bicon(src)]EFTPOS is not connected to an account. ")
else
..()
diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm
index 09c6bdcf205..ca5189ce122 100644
--- a/code/modules/economy/POS.dm
+++ b/code/modules/economy/POS.dm
@@ -201,7 +201,7 @@ var/const/POS_HEADER = {"
"}
receipt += "
"
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/P = new(loc)
P.name="Receipt #[id]-[++sales]"
P.info=receipt
@@ -403,7 +403,7 @@ var/const/POS_HEADER = {"
src.attack_hand(usr)
return
if(usr != logged_in)
- to_chat(usr, "\red [logged_in.name] is already logged in. You cannot use this machine until they log out.")
+ to_chat(usr, "[logged_in.name] is already logged in. You cannot use this machine until they log out. ")
return
if("act" in href_list)
switch(href_list["act"])
@@ -431,7 +431,7 @@ var/const/POS_HEADER = {"
for(var/list/line in splittext(href_list["csv"],"\n"))
var/list/cells = splittext(line,",")
if(cells.len<2)
- to_chat(usr, "\red The CSV must have at least two columns: Product Name, followed by Price (as a number).")
+ to_chat(usr, "The CSV must have at least two columns: Product Name, followed by Price (as a number). ")
src.attack_hand(usr)
return
var/line_item/LI = new
@@ -445,7 +445,7 @@ var/const/POS_HEADER = {"
if("Save Settings")
var/datum/money_account/new_linked_account = get_money_account(text2num(href_list["payableto"]),z)
if(!new_linked_account)
- to_chat(usr, "\red Unable to link new account.")
+ to_chat(usr, "Unable to link new account. ")
else
linked_account = new_linked_account
screen=POS_SCREEN_SETTINGS
@@ -482,7 +482,7 @@ var/const/POS_HEADER = {"
if(istype(A,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = A
if(!logged_in)
- user.visible_message("\blue The machine beeps, and logs you in","You hear a beep.")
+ user.visible_message("The machine beeps, and logs you in ","You hear a beep.")
logged_in = user
screen=POS_SCREEN_ORDER
update_icon()
@@ -490,50 +490,47 @@ var/const/POS_HEADER = {"
return
else
if(!linked_account)
- visible_message("\red The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen.","You hear a buzz.")
+ visible_message("The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen. ","You hear a buzz.")
flick(src,"pos-error")
return
if(screen!=POS_SCREEN_FINALIZE)
- visible_message("\blue The machine buzzes.","\red You hear a buzz.")
+ visible_message("The machine buzzes. ","You hear a buzz. ")
flick(src,"pos-error")
return
var/datum/money_account/acct = get_card_account(I)
if(!acct)
- visible_message("\red The machine buzzes, and flashes \"NO ACCOUNT\" on the screen.","You hear a buzz.")
+ visible_message("The machine buzzes, and flashes \"NO ACCOUNT\" on the screen. ","You hear a buzz.")
flick(src,"pos-error")
return
if(credits_needed > acct.money)
- visible_message("\red The machine buzzes, and flashes \"NOT ENOUGH FUNDS\" on the screen.","You hear a buzz.")
+ visible_message("The machine buzzes, and flashes \"NOT ENOUGH FUNDS\" on the screen. ","You hear a buzz.")
flick(src,"pos-error")
return
- visible_message("\blue The machine beeps, and begins printing a receipt","You hear a beep.")
+ visible_message("The machine beeps, and begins printing a receipt ","You hear a beep.")
PrintReceipt()
NewOrder()
acct.charge(credits_needed,linked_account,"Purchase at POS #[id].")
credits_needed=0
screen=POS_SCREEN_ORDER
- else if(istype(A,/obj/item/weapon/spacecash))
+ else if(istype(A, /obj/item/stack/spacecash))
if(!linked_account)
- visible_message("\red The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen.","You hear a buzz.")
+ visible_message("The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen. ","You hear a buzz.")
flick(src,"pos-error")
return
if(!logged_in || screen!=POS_SCREEN_FINALIZE)
- visible_message("\blue The machine buzzes.","\red You hear a buzz.")
+ visible_message("The machine buzzes. ","You hear a buzz. ")
flick(src,"pos-error")
return
- var/obj/item/weapon/spacecash/C=A
- credits_held += C.get_total()
+ var/obj/item/stack/spacecash/C = A
+ credits_held += C.amount
if(credits_held >= credits_needed)
- visible_message("\blue The machine beeps, and begins printing a receipt","You hear a beep and the sound of paper being shredded.")
+ visible_message("The machine beeps, and begins printing a receipt ","You hear a beep and the sound of paper being shredded.")
PrintReceipt()
NewOrder()
credits_held -= credits_needed
credits_needed=0
screen=POS_SCREEN_ORDER
if(credits_held)
- var/obj/item/weapon/storage/box/B = new(loc)
- dispense_cash(credits_held,B)
- B.name="change"
- B.desc="A box of change."
+ new /obj/item/stack/spacecash(loc, credits_held)
credits_held=0
..()
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 3bc26b52799..ed8b8d52ccd 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -10,7 +10,7 @@
/datum/event/alien_infestation/announce()
if(successSpawn)
- command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
+ event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
/datum/event/alien_infestation/start()
var/list/vents = list()
@@ -29,6 +29,8 @@
respawnable_list -= C.client
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
new_xeno.key = C.key
+ if(ticker && ticker.mode)
+ ticker.mode.xenos += new_xeno.mind
spawncount--
successSpawn = 1
diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm
index a1f951f5747..0349d09d0b8 100644
--- a/code/modules/events/anomaly.dm
+++ b/code/modules/events/anomaly.dm
@@ -15,7 +15,7 @@
setup(safety_loop)
/datum/event/anomaly/announce()
- command_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
+ event_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
/datum/event/anomaly/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 65b005c2538..e5327d92b16 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -4,7 +4,7 @@
endWhen = 160
/datum/event/anomaly/anomaly_bluespace/announce()
- command_announcement.Announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ event_announcement.Announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/event/anomaly/anomaly_bluespace/start()
var/turf/T = pick(get_area_turfs(impact_area))
@@ -33,7 +33,7 @@
var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO
playsound(TO, 'sound/effects/phasein.ogg', 100, 1)
- command_announcement.Announce("Massive bluespace translocation detected.", "Anomaly Alert")
+ event_announcement.Announce("Massive bluespace translocation detected.", "Anomaly Alert")
var/list/flashers = list()
for(var/mob/living/carbon/C in viewers(TO, null))
diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm
index b7a14ab9327..e5cebbff40d 100644
--- a/code/modules/events/anomaly_flux.dm
+++ b/code/modules/events/anomaly_flux.dm
@@ -4,7 +4,7 @@
endWhen = 180
/datum/event/anomaly/anomaly_flux/announce()
- command_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ event_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/event/anomaly/anomaly_flux/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm
index 0c9f3776f82..19fe7a41525 100644
--- a/code/modules/events/anomaly_grav.dm
+++ b/code/modules/events/anomaly_grav.dm
@@ -4,7 +4,7 @@
endWhen = 70
/datum/event/anomaly/anomaly_grav/announce()
- command_announcement.Announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ event_announcement.Announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/event/anomaly/anomaly_grav/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index b1cf81b23c3..3c2e6025952 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -4,7 +4,7 @@
endWhen = 110
/datum/event/anomaly/anomaly_pyro/announce()
- command_announcement.Announce("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+ event_announcement.Announce("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/event/anomaly/anomaly_pyro/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm
index c950444978e..662669509cb 100644
--- a/code/modules/events/anomaly_vortex.dm
+++ b/code/modules/events/anomaly_vortex.dm
@@ -4,7 +4,7 @@
endWhen = 80
/datum/event/anomaly/anomaly_vortex/announce()
- command_announcement.Announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
+ event_announcement.Announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
/datum/event/anomaly/anomaly_vortex/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index 3fc9d3f1bdc..ef5a816d2ff 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -1,18 +1,24 @@
/datum/event/blob
- announceWhen = 12
+ announceWhen = 60
endWhen = 120
- var/obj/effect/blob/core/Blob
+ var/obj/structure/blob/core/Blob
/datum/event/blob/announce()
- command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
+ event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
/datum/event/blob/start()
var/turf/T = pick(blobstart)
if(!T)
return kill()
- Blob = new /obj/effect/blob/core(T, 200)
- for(var/i = 1; i < rand(3, 6), i++)
- Blob.process()
+ var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
+ var/mob/C
+ if(candidates.len)
+ C = pick(candidates)
+ Blob = new /obj/structure/blob/core(T, new_overmind=C.client)
+ for(var/i in 1 to 5)
+ Blob.process()
+ else
+ return kill()
/datum/event/blob/tick()
if(!Blob)
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index d640bca8641..67f4a93d339 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -14,7 +14,7 @@
"You don't want to buy anything? Yeah, well I didn't want to buy your mom either.")
/datum/event/brand_intelligence/announce()
- command_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by. The origin is believed to be \a [originMachine.name].", "Machine Learning Alert")
+ event_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by. The origin is believed to be \a [originMachine.name].", "Machine Learning Alert")
/datum/event/brand_intelligence/start()
for(var/obj/machinery/vending/V in machines)
@@ -29,6 +29,7 @@
vendingMachines.Remove(originMachine)
originMachine.shut_up = 0
originMachine.shoot_inventory = 1
+ log_debug("Original brand intelligence machine: [originMachine] [ADMIN_VV(originMachine)] [ADMIN_JMP(originMachine)]")
/datum/event/brand_intelligence/tick()
if(!originMachine || !isnull(originMachine.gcDestroyed) || originMachine.shut_up || originMachine.wires.IsAllCut()) //if the original vending machine is missing or has it's voice switch flipped
diff --git a/code/modules/events/cargobonus.dm b/code/modules/events/cargobonus.dm
index 75276615a40..c51c7ff41a8 100644
--- a/code/modules/events/cargobonus.dm
+++ b/code/modules/events/cargobonus.dm
@@ -2,7 +2,7 @@
announceWhen = 5
/datum/event/cargo_bonus/announce()
- command_announcement.Announce("Congratulations! [station_name()] was chosen for a supply limit increase. Please contact the local cargo department for details!", "Supply Alert")
+ event_announcement.Announce("Congratulations! [station_name()] was chosen for a supply limit increase. Please contact the local cargo department for details!", "Supply Alert")
/datum/event/cargo_bonus/start()
supply_controller.points += rand(100,500)
\ No newline at end of file
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index 13b5c884131..abab5c39254 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -14,7 +14,7 @@
announcement = "Massive migration of unknown biological entities has been detected near [station_name()], please stand-by."
else
announcement = "Unknown biological [spawned_carp.len == 1 ? "entity has" : "entities have"] been detected near [station_name()], please stand-by."
- command_announcement.Announce(announcement, "Lifesign Alert")
+ event_announcement.Announce(announcement, "Lifesign Alert")
/datum/event/carp_migration/start()
if(severity == EVENT_LEVEL_MAJOR)
diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm
index 6ada1a25c0f..1b499027150 100644
--- a/code/modules/events/communications_blackout.dm
+++ b/code/modules/events/communications_blackout.dm
@@ -12,7 +12,7 @@
to_chat(A, " ")
if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts.
- command_announcement.Announce(alert)
+ event_announcement.Announce(alert)
/datum/event/communications_blackout/start()
for(var/obj/machinery/telecomms/T in telecomms_list)
@@ -20,7 +20,7 @@
/proc/communications_blackout(var/silent = 1)
if(!silent)
- command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg')
+ event_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg')
else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
for(var/mob/living/silicon/ai/A in player_list)
to_chat(A, " ")
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index e8483ccc4ca..069ef9865af 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -7,7 +7,7 @@
announceWhen = rand(15, 30)
/datum/event/disease_outbreak/announce()
- command_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
+ event_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/datum/event/disease_outbreak/start()
if(!virus_type)
diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm
index c0ef182571b..94ef81ceee5 100644
--- a/code/modules/events/electrical_storm.dm
+++ b/code/modules/events/electrical_storm.dm
@@ -3,7 +3,7 @@
var/lightsoutRange = 25
/datum/event/electrical_storm/announce()
- command_announcement.Announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
+ event_announcement.Announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
/datum/event/electrical_storm/start()
var/list/epicentreList = list()
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index deaa1b85aa8..98fe9fad27f 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -101,8 +101,13 @@ var/list/event_last_fired = list()
playercount_modifier = 1
if(26 to 35)
playercount_modifier = 0.9
- if(36 to 100000)
+ if(36 to 50)
playercount_modifier = 0.8
+ if(50 to 80)
+ playercount_modifier = 0.7
+ if(80 to 10000)
+ playercount_modifier = 0.6
+
playercount_modifier = playercount_modifier * delay_modifier
var/event_delay = rand(config.event_delay_lower[severity], config.event_delay_upper[severity]) * playercount_modifier
@@ -141,20 +146,21 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1230),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 200, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 20), 1),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 40, list(ASSIGNMENT_SECURITY = 20)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Vines", /datum/event/spacevine, 250, list(ASSIGNMENT_ENGINEER = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 20)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meaty Ores", /datum/event/dust/meaty, 0, list(ASSIGNMENT_ENGINEER = 30)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meaty Ores", /datum/event/dust/meaty, 0, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 25, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ion_storm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 40, list(ASSIGNMENT_SECURITY = 30), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Immovable Rod", /datum/event/immovable_rod, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
//new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 15), 1),
// NON-BAY EVENTS
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mass Hallucination", /datum/event/mass_hallucination, 300),
@@ -163,14 +169,14 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Dimensional Tear", /datum/event/tear, 0, list(ASSIGNMENT_SECURITY = 35)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vent Clog", /datum/event/vent_clog, 250),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 150),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 100, list(ASSIGNMENT_ENGINEER = 60)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vortex Anomaly", /datum/event/anomaly/anomaly_vortex, 50, list(ASSIGNMENT_ENGINEER = 25)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Bluespace Anomaly", /datum/event/anomaly/anomaly_bluespace, 50, list(ASSIGNMENT_ENGINEER = 25)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 50, list(ASSIGNMENT_ENGINEER = 50)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vortex Anomaly", /datum/event/anomaly/anomaly_vortex, 75, list(ASSIGNMENT_ENGINEER = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Bluespace Anomaly", /datum/event/anomaly/anomaly_bluespace, 75, list(ASSIGNMENT_ENGINEER = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 75, list(ASSIGNMENT_ENGINEER = 50)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = 1),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 0, is_one_shot = 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 40, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), 1)
)
@@ -181,10 +187,12 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1),
//new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
- new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1),
+ new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
)
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index 5a892efb691..db9dd4c6955 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -8,14 +8,14 @@
power_failure(0)
/datum/event/grid_check/announce()
- command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
+ event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
/datum/event/grid_check/end()
power_restore()
/proc/power_failure(var/announce = 1)
if(announce)
- command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
+ event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
var/list/skipped_areas = list(/area/turret_protected/ai)
var/list/skipped_areas_apc = list(/area/engine/engineering)
@@ -45,7 +45,7 @@
var/list/skipped_areas_apc = list(/area/engine/engineering)
if(announce)
- command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
+ event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in apcs)
var/area/current_area = get_area(C)
if(current_area.type in skipped_areas_apc || !is_station_level(C.z))
@@ -64,7 +64,7 @@
/proc/power_restore_quick(var/announce = 1)
if(announce)
- command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
+ event_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in machines)
if(!is_station_level(S.z))
continue
diff --git a/code/modules/events/holidays/Holidays.dm b/code/modules/events/holidays/Holidays.dm
index 107767455f6..5a2c35ebe52 100644
--- a/code/modules/events/holidays/Holidays.dm
+++ b/code/modules/events/holidays/Holidays.dm
@@ -133,7 +133,7 @@ var/global/Holiday = null
world.update_status()
Holiday_Game_Start()
- message_admins("\blue ADMIN: Event: [key_name_admin(src)] force-set Holiday to \"[Holiday]\"")
+ message_admins("ADMIN: Event: [key_name_admin(src)] force-set Holiday to \ "[Holiday]\"")
log_admin("[key_name(src)] force-set Holiday to \"[Holiday]\"")
@@ -174,7 +174,7 @@ var/global/Holiday = null
if(!is_station_level(S.z)) continue
containers += S
- message_admins("\blue DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/
+ message_admins("DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z]) ")*/
if("End of the World")
if(prob(eventchance)) GameOver()
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 3012b0f9535..d11ffa2ba78 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -11,13 +11,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
announceWhen = 5
/datum/event/immovable_rod/announce()
- command_announcement.Announce("What the fuck was that?!", "General Alert")
+ event_announcement.Announce("What the fuck was that?!", "General Alert")
/datum/event/immovable_rod/start()
var/startside = pick(cardinal)
var/turf/startT = spaceDebrisStartLoc(startside, 1)
var/turf/endT = spaceDebrisFinishLoc(startside, 1)
- new /obj/effect/immovablerod(startT, endT)
+ new /obj/effect/immovablerod/event(startT, endT)
/obj/effect/immovablerod
name = "Immovable Rod"
@@ -29,17 +29,30 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
anchored = 1
var/z_original = 0
var/destination
+ var/notify = TRUE
+ var/move_delay = 1
-/obj/effect/immovablerod/New(atom/start, atom/end)
+/obj/effect/immovablerod/New(atom/start, atom/end, delay)
loc = start
z_original = z
destination = end
+ move_delay = delay
+ if(notify)
+ notify_ghosts("\A [src] is inbound!",
+ enter_link="(Click to follow) ",
+ source=src, action=NOTIFY_FOLLOW)
+ poi_list |= src
if(end && end.z==z_original)
- walk_towards(src, destination, 1)
+ walk_towards(src, destination, move_delay)
-/obj/effect/immovablerod/Move()
- if(z != z_original || loc == destination)
- qdel(src)
+/obj/effect/immovablerod/Topic(href, href_list)
+ if(href_list["follow"])
+ var/mob/dead/observer/ghost = usr
+ if(istype(ghost))
+ ghost.ManualFollow(src)
+
+/obj/effect/immovablerod/Destroy()
+ poi_list.Remove(src)
return ..()
/obj/effect/immovablerod/ex_act(test)
@@ -65,4 +78,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
H.adjustBruteLoss(160)
if(clong.density || prob(10))
clong.ex_act(2)
- return
+
+/obj/effect/immovablerod/event
+ var/tiles_moved = 0
+
+/obj/effect/immovablerod/event/Move()
+ var/atom/oldloc = loc
+ . = ..()
+ tiles_moved++
+ if(get_dist(oldloc, loc) > 2 && tiles_moved > 10) // We went on a journey, commit sudoku
+ qdel(src)
diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm
index ee2aa2de868..c5a5873afa0 100644
--- a/code/modules/events/infestation.dm
+++ b/code/modules/events/infestation.dm
@@ -77,7 +77,7 @@
max_number = 6
vermstring = "lizards"
if(VERM_SPIDERS)
- spawn_types = list(/obj/effect/spider/spiderling)
+ spawn_types = list(/obj/structure/spider/spiderling)
max_number = 3
vermstring = "spiders"
@@ -89,7 +89,7 @@
num--
if(vermin == VERM_SPIDERS)
- var/obj/effect/spider/spiderling/S = new(T)
+ var/obj/structure/spider/spiderling/S = new(T)
S.amount_grown = -1
else
var/spawn_type = pick(spawn_types)
@@ -97,7 +97,7 @@
/datum/event/infestation/announce()
- command_announcement.Announce("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Lifesign Alert")
+ event_announcement.Announce("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Lifesign Alert")
#undef LOC_KITCHEN
#undef LOC_ATMOS
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 20a53a4413f..4979b0889ed 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -17,7 +17,7 @@
/datum/event/ion_storm/announce()
if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(ionAnnounceChance)))
- command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/AI/ionstorm.ogg')
+ event_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/AI/ionstorm.ogg')
/datum/event/ion_storm/start()
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index a3f302cff9f..500350a037c 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -9,4 +9,4 @@
H.AdjustHallucinate(rand(50, 100))
/datum/event/mass_hallucination/announce()
- command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
+ event_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
diff --git a/code/modules/events/meaty_gore.dm b/code/modules/events/meaty_gore.dm
index 729f5182344..b9cb43deb99 100644
--- a/code/modules/events/meaty_gore.dm
+++ b/code/modules/events/meaty_gore.dm
@@ -1,5 +1,5 @@
/datum/event/meteor_wave/gore/announce()
- command_announcement.Announce("Unknown biological debris have been detected near [station_name()], please stand-by.", "Debris Alert")
+ event_announcement.Announce("Unknown biological debris have been detected near [station_name()], please stand-by.", "Debris Alert")
/datum/event/meteor_wave/gore/setup()
waves = 3
@@ -14,4 +14,4 @@
/datum/event/meteor_wave/gore/end()
- command_announcement.Announce("The station has cleared the debris.", "Debris Alert")
+ event_announcement.Announce("The station has cleared the debris.", "Debris Alert")
diff --git a/code/modules/events/meaty_ops.dm b/code/modules/events/meaty_ops.dm
index 19263c75f82..87d58ae7dbb 100644
--- a/code/modules/events/meaty_ops.dm
+++ b/code/modules/events/meaty_ops.dm
@@ -1,6 +1,6 @@
/datum/event/meteor_wave/goreop/announce()
var/meteor_declaration = "MeteorOps have declared their intent to utterly destroy [station_name()] with their own bodies, and dares the crew to try and stop them."
- command_announcement.Announce(meteor_declaration, "Declaration of 'War'", 'sound/effects/siren.ogg')
+ event_announcement.Announce(meteor_declaration, "Declaration of 'War'", 'sound/effects/siren.ogg')
/datum/event/meteor_wave/goreop/setup()
waves = 3
@@ -15,5 +15,5 @@
-/datum/event/meteor_wave/goreops/end()
- command_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps")
\ No newline at end of file
+/datum/event/meteor_wave/goreop/end()
+ event_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps")
\ No newline at end of file
diff --git a/code/modules/events/meaty_ores.dm b/code/modules/events/meaty_ores.dm
index df56749734e..48d24ebeef1 100644
--- a/code/modules/events/meaty_ores.dm
+++ b/code/modules/events/meaty_ores.dm
@@ -1,8 +1,8 @@
/datum/event/dust/meaty/announce()
if(prob(16))
- command_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
+ event_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
else
- command_announcement.Announce("Meaty ores have been detected on collision course with the station.", "Meaty Ore Alert", new_sound = 'sound/AI/meteors.ogg')
+ event_announcement.Announce("Meaty ores have been detected on collision course with the station.", "Meaty Ore Alert", new_sound = 'sound/AI/meteors.ogg')
/datum/event/dust/meaty/setup()
qnty = rand(45,125)
diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm
index d26e43dba6b..b21e02bd7fa 100644
--- a/code/modules/events/meteors.dm
+++ b/code/modules/events/meteors.dm
@@ -10,9 +10,9 @@
/datum/event/meteor_wave/announce()
switch(severity)
if(EVENT_LEVEL_MAJOR)
- command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
+ event_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
else
- command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
+ event_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
//meteor showers are lighter and more common,
/datum/event/meteor_wave/tick()
@@ -25,9 +25,9 @@
/datum/event/meteor_wave/end()
switch(severity)
if(EVENT_LEVEL_MAJOR)
- command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
+ event_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
else
- command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
+ event_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
/datum/event/meteor_wave/proc/get_meteors()
switch(severity)
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index 340ca836e94..8f16d2636ea 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -37,7 +37,7 @@
/datum/event/prison_break/announce()
if(areas && areas.len > 0)
- command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert")
+ event_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert")
/datum/event/prison_break/start()
for(var/area/A in world)
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 7968e2493cf..2e090979ce6 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -21,7 +21,7 @@
/datum/event/radiation_storm/start()
spawn()
- command_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
+ event_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
for(var/area/A in world)
if(!is_station_level(A.z) || is_safe_zone(A))
@@ -32,7 +32,7 @@
sleep(600)
- command_announcement.Announce("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
+ event_announcement.Announce("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
for(var/i = 0, i < 10, i++)
for(var/mob/living/carbon/human/H in living_mob_list)
@@ -58,7 +58,7 @@
sleep(100)
- command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
+ event_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
for(var/area/A in world)
if(!is_station_level(A.z) || is_safe_zone(A))
diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm
index 9b7386fe470..3a770bf7864 100644
--- a/code/modules/events/rogue_drones.dm
+++ b/code/modules/events/rogue_drones.dm
@@ -30,7 +30,7 @@
msg = "Contact has been lost with a combat drone wing operating out of the NSV Icarus. If any are sighted in the area, approach with caution."
else
msg = "Unidentified hackers have targetted a combat drone wing deployed from the NSV Icarus. If any are sighted in the area, approach with caution."
- command_announcement.Announce(msg, "Rogue drone alert")
+ event_announcement.Announce(msg, "Rogue drone alert")
/datum/event/rogue_drone/tick()
return
@@ -48,6 +48,6 @@
num_recovered++
if(num_recovered > drones_list.len * 0.75)
- command_announcement.Announce("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert")
+ event_announcement.Announce("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert")
else
- command_announcement.Announce("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")
+ event_announcement.Announce("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")
diff --git a/code/modules/events/slaughterevent.dm b/code/modules/events/slaughterevent.dm
index 3a7464baa8c..f46ebcfd605 100644
--- a/code/modules/events/slaughterevent.dm
+++ b/code/modules/events/slaughterevent.dm
@@ -37,8 +37,8 @@
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = SPECIAL_ROLE_SLAUGHTER_DEMON
- message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.")
- log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
+ message_admins("[key_name_admin(S)] has been made into a Slaughter Demon by an event.")
+ log_game("[key_name_admin(S)] was spawned as a Slaughter Demon by an event.")
return 1
/datum/event/spawn_slaughter/start()
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index cf00e4f78b9..f0408a9bdc0 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -1,11 +1,703 @@
-/var/global/spacevines_spawned = 0
-
-/datum/event/spacevine
- announceWhen = 10
+//Types of usual mutations
+#define POSITIVE 1
+#define NEGATIVE 2
+#define MINOR_NEGATIVE 3
/datum/event/spacevine/start()
- spacevine_infestation()
- spacevines_spawned = 1
+ var/list/turfs = list() //list of all the empty floor turfs in the hallway areas
-/datum/event/spacevine/announce()
- command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
+ var/obj/structure/spacevine/SV = new()
+
+ for(var/area/hallway/A in world)
+ for(var/turf/F in A)
+ if(F.Enter(SV))
+ turfs += F
+
+ qdel(SV)
+
+ if(turfs.len) //Pick a turf to spawn at if we can
+ var/turf/T = pick(turfs)
+ var/obj/structure/spacevine_controller/SC = new /obj/structure/spacevine_controller(T, , rand(30,70),rand(5,2)) //spawn a controller at turf
+
+ // Make the event start fun - give the vine a random hostile mutation
+ if(SC.vines.len)
+ SV = SC.vines[1]
+ var/list/mutations = SC.mutations_list.Copy()
+ while(mutations.len)
+ var/datum/spacevine_mutation/SM = pick_n_take(mutations)
+ if(SM.quality == NEGATIVE && !SM.nofun)
+ SM.add_mutation_to_vinepiece(SV)
+ break
+ mutations.Cut()
+ mutations = null
+
+
+/datum/spacevine_mutation
+ var/name = ""
+ var/severity = 1
+ var/hue
+ var/quality
+ // For stuff that isn't fun as a random-event vine
+ var/nofun = FALSE
+
+/datum/spacevine_mutation/proc/add_mutation_to_vinepiece(obj/structure/spacevine/holder)
+ holder.mutations |= src
+ holder.color = hue
+
+/datum/spacevine_mutation/proc/remove_mutation_from_vinepiece(obj/structure/spacevine/holder)
+ holder.mutations -= src
+ var/datum/spacevine_mutation/oldmutation
+ if(holder.mutations.len)
+ oldmutation = pick(holder.mutations)
+ holder.color = oldmutation.hue
+ else
+ holder.color = ""
+
+/datum/spacevine_mutation/proc/process_mutation(obj/structure/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/process_temperature(obj/structure/spacevine/holder, temp, volume)
+ return
+
+/datum/spacevine_mutation/proc/on_birth(obj/structure/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_grow(obj/structure/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_death(obj/structure/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_deletion(obj/structure/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
+ . = expected_damage
+
+/datum/spacevine_mutation/proc/on_cross(obj/structure/spacevine/holder, mob/crosser)
+ return
+
+/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/holder, datum/reagent/R)
+ return
+
+/datum/spacevine_mutation/proc/on_eat(obj/structure/spacevine/holder, mob/living/eater)
+ return
+
+/datum/spacevine_mutation/proc/on_spread(obj/structure/spacevine/holder, turf/target)
+ return
+
+/datum/spacevine_mutation/proc/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
+ return
+
+/datum/spacevine_mutation/proc/on_explosion(severity, obj/structure/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_search(severity, obj/structure/spacevine/holder)
+ return
+
+
+/datum/spacevine_mutation/space_covering
+ name = "space protective"
+ hue = "#aa77aa"
+ quality = POSITIVE
+
+/turf/simulated/floor/vines
+ color = "#aa77aa"
+ icon_state = "vinefloor"
+ broken_states = list()
+
+
+//All of this shit is useless for vines
+
+/turf/simulated/floor/vines/attackby()
+ return
+
+/turf/simulated/floor/vines/burn_tile()
+ return
+
+/turf/simulated/floor/vines/break_tile()
+ return
+
+/turf/simulated/floor/vines/make_plating()
+ return
+
+/turf/simulated/floor/vines/break_tile_to_plating()
+ return
+
+/turf/simulated/floor/vines/ex_act(severity)
+ if(severity < 3)
+ ChangeTurf(baseturf)
+
+/turf/simulated/floor/vines/narsie_act()
+ if(prob(20))
+ ChangeTurf(baseturf) //nar sie eats this shit
+
+/turf/simulated/floor/vines/singularity_pull(S, current_size)
+ if(current_size >= STAGE_FIVE)
+ if(prob(50))
+ ChangeTurf(baseturf)
+
+/turf/simulated/floor/vines/ChangeTurf(turf/open/floor/T)
+ . = ..()
+ //Do this *after* the turf has changed as qdel in spacevines will call changeturf again if it hasn't
+ for(var/obj/structure/spacevine/SV in src)
+ SV.wither()
+
+/datum/spacevine_mutation/space_covering
+ var/static/list/coverable_turfs
+
+/datum/spacevine_mutation/space_covering/New()
+ . = ..()
+ if(!coverable_turfs)
+ coverable_turfs = typecacheof(list(
+ /turf/space
+ ))
+ coverable_turfs -= typecacheof(list(
+ /turf/space/transit
+ ))
+
+/datum/spacevine_mutation/space_covering/on_grow(obj/structure/spacevine/holder)
+ process_mutation(holder)
+
+/datum/spacevine_mutation/space_covering/on_spread(obj/structure/spacevine/holder, turf/target)
+ if(target.type == /turf/space && !locate(/obj/structure/spacevine) in target)
+ holder.master.spawn_spacevine_piece(target, holder)
+ . = TRUE
+
+/datum/spacevine_mutation/space_covering/process_mutation(obj/structure/spacevine/holder)
+ var/turf/T = get_turf(holder)
+ if(is_type_in_typecache(T, coverable_turfs))
+ var/currtype = T.type
+ T.ChangeTurf(/turf/simulated/floor/vines)
+ T.baseturf = currtype
+
+/datum/spacevine_mutation/space_covering/on_deletion(obj/structure/spacevine/holder)
+ var/turf/T = get_turf(holder)
+ if(istype(T, /turf/simulated/floor/vines))
+ T.ChangeTurf(T.baseturf)
+
+/datum/spacevine_mutation/bluespace
+ name = "bluespace"
+ hue = "#3333ff"
+ quality = MINOR_NEGATIVE
+
+/datum/spacevine_mutation/bluespace/on_spread(obj/structure/spacevine/holder, turf/target)
+ if(holder.energy > 1 && !locate(/obj/structure/spacevine) in target)
+ // Lose bluespace upon piercing a single tile, and drop it from our own mutations too
+ // Representing a loss in "high potential"
+ // also conveniently prevents this from spreading too crazily
+ remove_mutation_from_vinepiece(holder)
+ holder.master.spawn_spacevine_piece(target, holder)
+ playsound(holder, 'sound/misc/interference.ogg', 50, 1)
+ . = TRUE
+
+/datum/spacevine_mutation/light
+ name = "light"
+ hue = "#ffff00"
+ quality = POSITIVE
+ severity = 4
+
+/datum/spacevine_mutation/light/on_grow(obj/structure/spacevine/holder)
+ if(holder.energy)
+ holder.set_light(severity)
+
+/datum/spacevine_mutation/toxicity
+ name = "toxic"
+ hue = "#ff00ff"
+ severity = 10
+ quality = NEGATIVE
+
+/datum/spacevine_mutation/toxicity/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
+ if(issilicon(crosser))
+ return
+ if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
+ to_chat(crosser, "You accidently touch the vine and feel a strange sensation. ")
+ crosser.adjustToxLoss(5)
+
+/datum/spacevine_mutation/toxicity/on_eat(obj/structure/spacevine/holder, mob/living/eater)
+ if(!isvineimmune(eater))
+ eater.adjustToxLoss(5)
+
+/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!!
+ name = "explosive"
+ hue = "#ff0000"
+ quality = NEGATIVE
+ severity = 2
+ // kaboom events aren't fun
+ nofun = TRUE
+
+/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, obj/structure/spacevine/holder)
+ if(explosion_severity < 3)
+ qdel(holder)
+ else
+ . = 1
+ spawn(5)
+ holder.wither()
+
+/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/I)
+ explosion(holder.loc, 0, 0, severity, 0, 0)
+
+/datum/spacevine_mutation/fire_proof
+ name = "fire proof"
+ hue = "#ff8888"
+ quality = MINOR_NEGATIVE
+
+/datum/spacevine_mutation/fire_proof/process_temperature(obj/structure/spacevine/holder, temp, volume)
+ return 1
+
+/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
+ if(I && I.damtype == "fire")
+ . = 0
+ else
+ . = expected_damage
+
+/datum/spacevine_mutation/vine_eating
+ name = "vine eating"
+ hue = "#ff7700"
+ quality = MINOR_NEGATIVE
+
+/datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/holder, turf/target)
+ var/obj/structure/spacevine/prey = locate() in target
+ if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin
+ prey.wither()
+ . = TRUE
+
+/datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently
+ name = "aggressive spreading"
+ hue = "#333333"
+ severity = 3
+ quality = NEGATIVE
+
+/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target)
+ if(istype(target, /turf/simulated/wall/r_wall))
+ // Too tough to pierce - should lead to interesting spread patterns
+ return
+ // Bust through windows or other stuff blocking the way
+ if(!target.Enter(holder))
+ for(var/atom/movable/AM in target)
+ if(istype(AM, /obj/structure/spacevine) || !AM.density)
+ continue
+ AM.ex_act(severity)
+ target.ex_act(severity) // vine immunity handled at /mob/ex_act
+ . = TRUE
+
+/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
+ buckled.ex_act(severity)
+
+/datum/spacevine_mutation/transparency
+ name = "transparent"
+ hue = ""
+ quality = POSITIVE
+
+/datum/spacevine_mutation/transparency/on_grow(obj/structure/spacevine/holder)
+ holder.set_opacity(0)
+ holder.alpha = 125
+
+/datum/spacevine_mutation/thorns
+ name = "thorny"
+ hue = "#666666"
+ severity = 10
+ quality = NEGATIVE
+
+/datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
+ if(prob(severity) && istype(crosser) && !isvineimmune(holder))
+ var/mob/living/M = crosser
+ M.adjustBruteLoss(5)
+ to_chat(M, "You cut yourself on the thorny vines. ")
+
+/datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
+ if(prob(severity) && istype(hitter) && !isvineimmune(holder))
+ var/mob/living/M = hitter
+ M.adjustBruteLoss(5)
+ to_chat(M, "You cut yourself on the thorny vines. ")
+ . = expected_damage
+
+/datum/spacevine_mutation/woodening
+ name = "hardened"
+ hue = "#997700"
+ quality = NEGATIVE
+
+/datum/spacevine_mutation/woodening/on_grow(obj/structure/spacevine/holder)
+ if(holder.energy)
+ holder.density = 1
+ holder.maxhealth = 100
+ holder.health = holder.maxhealth
+
+/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
+ if(!is_sharp(I))
+ . = expected_damage * 0.5
+ else
+ . = expected_damage
+
+/datum/spacevine_mutation/flowering
+ name = "flowering"
+ hue = "#0A480D"
+ quality = NEGATIVE
+ severity = 10
+
+/datum/spacevine_mutation/flowering/on_grow(obj/structure/spacevine/holder)
+ if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder))
+ new /obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
+
+/datum/spacevine_mutation/flowering/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
+ if(prob(25))
+ holder.entangle(crosser)
+
+
+/datum/spacevine_mutation/virulent_spread
+ name = "virulently spreading"
+ hue = "#FF8080"
+ quality = MINOR_NEGATIVE
+
+/datum/spacevine_mutation/virulent_spread/on_search(obj/structure/spacevine/holder)
+ return 1
+
+// Sure, let's encourage crew members to deliberately breed a highly dangerous
+// threat. What could *possibly* go wrong? ;)
+/datum/spacevine_mutation/mineral
+ name = "metallic"
+ hue = "#444444"
+ quality = POSITIVE
+ severity = 3
+ var/drop_rate = 20
+ var/list/mineral_results = list(
+ /obj/item/stack/sheet/metal = 1
+ )
+
+/datum/spacevine_mutation/mineral/on_death(obj/structure/spacevine/holder)
+ if(!prob(drop_rate))
+ return
+ var/itemtype = pickweight(mineral_results)
+ var/turf/pos = get_turf(holder)
+ new itemtype(pos, severity)
+
+/datum/spacevine_mutation/mineral/valuables
+ name = "glimmering"
+ hue = "#888800"
+ drop_rate = 10
+ mineral_results = list(
+ /obj/item/stack/sheet/mineral/silver = 4,
+ /obj/item/stack/sheet/mineral/gold = 2,
+ /obj/item/stack/sheet/mineral/diamond = 1
+ )
+
+/datum/spacevine_mutation/mineral/glass
+ name = "glassy"
+ hue = "#8888FF"
+ mineral_results = list(
+ /obj/item/stack/sheet/glass = 1
+ )
+
+/datum/spacevine_mutation/mineral/plastic
+ name = "plasticine"
+ hue = "#222288"
+ mineral_results = list(
+ /obj/item/stack/sheet/plastic = 1
+ )
+
+/datum/spacevine_mutation/mineral/wood
+ name = "wooden"
+ hue = "#442200"
+ mineral_results = list(
+ /obj/item/stack/sheet/wood = 1
+ )
+
+// SPACE VINES (Note that this code is very similar to Biomass code)
+/obj/structure/spacevine
+ name = "space vines"
+ desc = "An extremely expansionistic species of vine."
+ icon = 'icons/effects/spacevines.dmi'
+ icon_state = "Light1"
+ anchored = 1
+ density = 0
+ layer = MOB_LAYER + 0.8
+ mouse_opacity = 2 //Clicking anywhere on the turf is good enough
+ pass_flags = PASSTABLE | PASSGRILLE
+ var/health = 50
+ var/maxhealth = 50
+ var/energy = 0
+ var/obj/structure/spacevine_controller/master = null
+ var/list/mutations = list()
+
+/obj/structure/spacevine/New()
+ ..()
+ color = "#ffffff"
+
+/obj/structure/spacevine/examine(mob/user)
+ ..()
+ var/text = "This one is a"
+ if(mutations.len)
+ for(var/A in mutations)
+ var/datum/spacevine_mutation/SM = A
+ text += " [SM.name]"
+ else
+ text += " normal"
+ text += " vine."
+ to_chat(user, text)
+
+/obj/structure/spacevine/proc/wither()
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_death(src)
+ qdel(src)
+
+
+/obj/structure/spacevine/Destroy()
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_deletion(src)
+ if(master)
+ master.vines -= src
+ master.growth_queue -= src
+ if(!master.vines.len)
+ var/obj/item/seeds/kudzu/KZ = new(loc)
+ KZ.mutations |= mutations
+ KZ.set_potency(10 ** sqrt(master.mutativeness))
+ KZ.set_production(10 - (master.spread_cap / 10))
+ qdel(master)
+ master = null
+ mutations.Cut()
+ set_opacity(0)
+ if(buckled_mob)
+ unbuckle_mob()
+ return ..()
+
+/obj/structure/spacevine/proc/add_mutation(datum/spacevine_mutation/mutation)
+ mutations |= mutation
+ color = mutation.hue
+
+/obj/structure/spacevine/proc/on_chem_effect(datum/reagent/R)
+ var/override = 0
+ for(var/datum/spacevine_mutation/SM in mutations)
+ override += SM.on_chem(src, R)
+ if(!override && istype(R, /datum/reagent/glyphosate))
+ if(prob(50))
+ wither()
+
+/obj/structure/spacevine/proc/eat(mob/eater)
+ var/override = 0
+ for(var/datum/spacevine_mutation/SM in mutations)
+ override += SM.on_eat(src, eater)
+ if(!override)
+ if(prob(10))
+ eater.say("Nom")
+ wither()
+
+/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
+ if (!W || !user || !W.type)
+ return
+ user.changeNext_move(CLICK_CD_MELEE)
+ var/damage_to_do = W.force
+
+ if(istype(W, /obj/item/weapon/scythe))
+ var/obj/item/weapon/scythe/S = W
+ if(S.extend) //so folded telescythes won't get damage boosts / insta-clears (they instead will instead be treated like non-scythes)
+ damage_to_do *= 4
+ for(var/obj/structure/spacevine/B in range(1,src))
+ if(B.health > damage_to_do) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
+ B.health -= damage_to_do
+ else
+ B.wither()
+ return
+
+ if(is_sharp(W))
+ damage_to_do *= 4
+
+ if(W && W.damtype == "fire")
+ damage_to_do *= 4
+
+ for(var/datum/spacevine_mutation/SM in mutations)
+ damage_to_do = SM.on_hit(src, user, W, damage_to_do) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
+
+ health -= damage_to_do
+ if(health < 1)
+ wither()
+
+ ..()
+
+/obj/structure/spacevine/Crossed(mob/crosser)
+ if(isliving(crosser))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_cross(src, crosser)
+
+/obj/structure/spacevine/attack_hand(mob/user)
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_hit(src, user)
+ user_unbuckle_mob(user, user)
+
+/obj/structure/spacevine/attack_alien(mob/living/user)
+ eat(user)
+
+/obj/structure/spacevine_controller
+ invisibility = 101
+ var/list/obj/structure/spacevine/vines = list()
+ var/list/growth_queue = list()
+ var/spread_multiplier = 5
+ var/spread_cap = 30
+ var/list/mutations_list = list()
+ var/mutativeness = 1
+
+/obj/structure/spacevine_controller/New(loc, list/muts, potency, production)
+ color = "#ffffff"
+ spawn_spacevine_piece(loc, , muts)
+ processing_objects.Add(src)
+ init_subtypes(/datum/spacevine_mutation/, mutations_list)
+ if(potency != null && potency > 0)
+ // 1 mutativeness at 10 potency
+ // 4 mutativeness at 100 potency
+ mutativeness = log(10, potency) ** 2
+ if(production != null)
+ // 1 production is crazy powerful
+ var/spread_value = max(10 - production, 1)
+ // 40 at 6 production
+ // 90 at 1 production
+ spread_cap = spread_value * 10
+ // 6 vines/spread at 6 production
+ // ~2.5 vines/spread at 1 production
+ spread_multiplier /= spread_value / 5
+ ..()
+
+
+/obj/structure/spacevine_controller/ex_act() //only killing all vines will end this suffering
+ return
+
+/obj/structure/spacevine_controller/singularity_act()
+ return
+
+/obj/structure/spacevine_controller/singularity_pull()
+ return
+
+/obj/structure/spacevine_controller/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
+ var/obj/structure/spacevine/SV = new(location)
+ growth_queue += SV
+ vines += SV
+ SV.master = src
+ if(muts && muts.len)
+ for(var/datum/spacevine_mutation/M in muts)
+ M.add_mutation_to_vinepiece(SV)
+ return
+ if(parent)
+ SV.mutations |= parent.mutations
+ SV.color = parent.color
+ if(prob(mutativeness))
+ var/list/random_mutations_picked = mutations_list - SV.mutations
+ if(random_mutations_picked.len)
+ var/datum/spacevine_mutation/randmut = pick(random_mutations_picked)
+ randmut.add_mutation_to_vinepiece(SV)
+
+ for(var/datum/spacevine_mutation/SM in SV.mutations)
+ SM.on_birth(SV)
+
+/obj/structure/spacevine_controller/process()
+ if(!vines || !vines.len)
+ qdel(src) //space vines exterminated. Remove the controller
+ return
+ if(!growth_queue)
+ qdel(src) //Sanity check
+ return
+
+ var/length = 0
+
+ length = min( spread_cap , max( 1 , vines.len / spread_multiplier ) )
+ var/i = 0
+ var/list/obj/structure/spacevine/queue_end = list()
+
+ for(var/obj/structure/spacevine/SV in growth_queue)
+ if(qdeleted(SV))
+ continue
+ i++
+ queue_end += SV
+ growth_queue -= SV
+ for(var/datum/spacevine_mutation/SM in SV.mutations)
+ SM.process_mutation(SV)
+ if(SV.energy < 2) //If tile isn't fully grown
+ if(prob(20))
+ SV.grow()
+ else //If tile is fully grown
+ SV.entangle_mob()
+
+ //if(prob(25))
+ SV.spread()
+ if(i >= length)
+ break
+
+ growth_queue = growth_queue + queue_end
+
+/obj/structure/spacevine/proc/grow()
+ if(!energy)
+ icon_state = pick("Med1", "Med2", "Med3")
+ energy = 1
+ set_opacity(1)
+ else
+ icon_state = pick("Hvy1", "Hvy2", "Hvy3")
+ energy = 2
+
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_grow(src)
+
+/obj/structure/spacevine/proc/entangle_mob()
+ if(!buckled_mob && prob(25))
+ for(var/mob/living/V in loc)
+ entangle(V)
+ if(has_buckled_mobs())
+ break //only capture one mob at a time
+
+
+/obj/structure/spacevine/proc/entangle(mob/living/V)
+ if(!V || isvineimmune(V))
+ return
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_buckle(src, V)
+ if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured
+ to_chat(V, "The vines [pick("wind", "tangle", "tighten")] around you! ")
+ buckle_mob(V, 1)
+
+/obj/structure/spacevine/proc/spread()
+ var/list/dir_list = cardinal.Copy()
+ var/spread_search = FALSE // Whether to exhaustive search all 4 cardinal dirs for an open direction
+ for(var/datum/spacevine_mutation/SM in mutations)
+ spread_search |= SM.on_search(src)
+ while(dir_list.len)
+ var/direction = pick(dir_list)
+ dir_list -= direction
+ var/turf/stepturf = get_step(src,direction)
+ var/spread_success = FALSE
+ for(var/datum/spacevine_mutation/SM in mutations)
+ spread_success |= SM.on_spread(src, stepturf) // If this returns 1, spreading succeeded
+ if(!locate(/obj/structure/spacevine, stepturf))
+ // snowflake for space turf, but space turf is super common and a big deal
+ if(!istype(stepturf, /turf/space) && stepturf.Enter(src))
+ if(master)
+ master.spawn_spacevine_piece(stepturf, src)
+ spread_success = TRUE
+ if(spread_success || !spread_search)
+ break
+
+/obj/structure/spacevine/ex_act(severity)
+ var/i
+ for(var/datum/spacevine_mutation/SM in mutations)
+ i += SM.on_explosion(severity, src)
+ if(!i && prob(100/severity))
+ wither()
+
+/obj/structure/spacevine/temperature_expose(null, temp, volume)
+ var/override = 0
+ for(var/datum/spacevine_mutation/SM in mutations)
+ override += SM.process_temperature(src, temp, volume)
+ if(!override)
+ wither()
+
+/obj/structure/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
+ if(isvineimmune(mover))
+ . = TRUE
+ else
+ . = ..()
+
+/proc/isvineimmune(atom/A)
+ . = FALSE
+ if(isliving(A))
+ var/mob/living/M = A
+ if(("vines" in M.faction) || ("plants" in M.faction))
+ . = TRUE
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 2b3ffb799df..90cc1ee28ad 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -10,7 +10,7 @@
sent_spiders_to_station = 1
/datum/event/spider_infestation/announce()
- command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
+ event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
/datum/event/spider_infestation/start()
@@ -22,7 +22,7 @@
while((spawncount >= 1) && vents.len)
var/obj/vent = pick(vents)
- var/obj/effect/spider/spiderling/S = new(vent.loc)
+ var/obj/structure/spider/spiderling/S = new(vent.loc)
if(prob(66))
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse
vents -= vent
diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm
new file mode 100644
index 00000000000..ebcf1346db9
--- /dev/null
+++ b/code/modules/events/spider_terror.dm
@@ -0,0 +1,45 @@
+
+/datum/event/spider_terror
+ announceWhen = 240
+ var/spawncount = 1
+
+/datum/event/spider_terror/setup()
+ announceWhen = rand(announceWhen, announceWhen + 30)
+ spawncount = 1
+
+/datum/event/spider_terror/announce()
+ command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren-spooky.ogg')
+
+/datum/event/spider_terror/start()
+
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in all_vent_pumps)
+ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
+ if(temp_vent.parent.other_atmosmch.len > 50)
+ vents += temp_vent
+ var/spider_type
+ var/infestation_type = pick(1, 2, 3, 4, 5)
+ switch(infestation_type)
+ if(1)
+ spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green
+ spawncount = 4
+ if(2)
+ spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white
+ spawncount = 2
+ if(3)
+ spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince
+ spawncount = 1
+ if(4)
+ spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
+ spawncount = 1
+ if(5)
+ spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/mother
+ spawncount = 1
+ while(spawncount >= 1 && vents.len)
+ var/obj/vent = pick(vents)
+ var/obj/structure/spider/spiderling/terror_spiderling/S = new(vent.loc)
+ S.name = "evil-looking spiderling"
+ S.grow_as = spider_type
+ S.amount_grown = 75
+ vents -= vent
+ spawncount--
\ No newline at end of file
diff --git a/code/modules/events/tear.dm b/code/modules/events/tear.dm
index e409f6592d8..7a13c239de0 100644
--- a/code/modules/events/tear.dm
+++ b/code/modules/events/tear.dm
@@ -5,7 +5,7 @@
var/obj/effect/tear/TE
/datum/event/tear/announce()
- command_announcement.Announce("A tear in the fabric of space and time has opened. Expected location: [impact_area.name].", "Anomaly Alert")
+ event_announcement.Announce("A tear in the fabric of space and time has opened. Expected location: [impact_area.name].", "Anomaly Alert")
/datum/event/tear/start()
var/turf/T = pick(get_area_turfs(impact_area))
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index e5679764a39..137ffc83183 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -6,7 +6,7 @@
var/list/vents = list()
/datum/event/vent_clog/announce()
- command_announcement.Announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
+ event_announcement.Announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
/datum/event/vent_clog/setup()
endWhen = rand(25, 100)
diff --git a/code/modules/events/wallrot.dm b/code/modules/events/wallrot.dm
index a246345b632..84c0ee211c4 100644
--- a/code/modules/events/wallrot.dm
+++ b/code/modules/events/wallrot.dm
@@ -3,7 +3,7 @@
endWhen = announceWhen + 1
/datum/event/wallrot/announce()
- command_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
+ event_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
/datum/event/wallrot/start()
spawn()
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index 398994f972d..91a4612cb16 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -21,7 +21,7 @@
wormholes += new /obj/effect/portal/wormhole(T, null, null, -1)
/datum/event/wormholes/announce()
- command_announcement.Announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/spanomalies.ogg')
+ event_announcement.Announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/spanomalies.ogg')
/datum/event/wormholes/tick()
if(activeFor % shift_frequency == 0)
diff --git a/code/modules/fancytitle/fancytitle.dm b/code/modules/fancytitle/fancytitle.dm
new file mode 100644
index 00000000000..e445024aae1
--- /dev/null
+++ b/code/modules/fancytitle/fancytitle.dm
@@ -0,0 +1,33 @@
+/hook/startup/proc/setup_title_screen()
+ var/list/provisional_title_screens = flist("config/title_screens/images/")
+ var/list/title_screens = list()
+ var/use_rare_screens = prob(1)
+
+ for(var/S in provisional_title_screens)
+ var/list/L = splittext(S,"+")
+ if(L.len == 1 && L[1] != "blank.png")
+ title_screens += S
+
+ else if(L.len > 1)
+ if(use_rare_screens && lowertext(L[1]) == "rare")
+ title_screens += S
+ else if(lowertext(L[1]) == lowertext(MAP_NAME))
+ title_screens += S
+
+ if(!isemptylist(title_screens))
+ if(length(title_screens) > 1)
+ for(var/S in title_screens)
+ var/list/L = splittext(S,".")
+ if(L.len != 2 || L[1] != "default")
+ continue
+ title_screens -= S
+ break
+
+ var/file_path = "config/title_screens/images/[pick(title_screens)]"
+
+ var/icon/icon = new(fcopy_rsc(file_path))
+
+ for(var/turf/unsimulated/wall/splashscreen/splash in world)
+ splash.icon = icon
+ return TRUE
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/fish/fish_eggs.dm b/code/modules/fish/fish_eggs.dm
index 493f3dcf1db..756093fbd01 100644
--- a/code/modules/fish/fish_eggs.dm
+++ b/code/modules/fish/fish_eggs.dm
@@ -4,82 +4,65 @@
desc = "Eggs laid by a fish. This cluster seems... empty?"
icon = 'icons/obj/fish_items.dmi'
icon_state = "eggs"
- w_class = 2
- var/fish_type = null //Holds the name of the fish that the egg is for
-
-/obj/item/fish_eggs/New()
- ..()
-
-var/global/list/fish_eggs_list = list("dud" = /obj/item/fish_eggs,
- "goldfish" = /obj/item/fish_eggs/goldfish,
- "clownfish" = /obj/item/fish_eggs/clownfish,
- "shark" = /obj/item/fish_eggs/shark,
- "baby space carp" = /obj/item/fish_eggs/babycarp,
- "catfish" = /obj/item/fish_eggs/catfish,
- "feederfish" = /obj/item/fish_eggs/feederfish,
- "salmon" = /obj/item/fish_eggs/salmon,
- "shrimp" = /obj/item/fish_eggs/shrimp,
- "electric eel" = /obj/item/fish_eggs/electric_eel,
- "glofish" = /obj/item/fish_eggs/glofish,
- )
+ w_class = WEIGHT_CLASS_SMALL
+ var/datum/fish/fish_type = null //Holds the datum of the fish that the egg is for, null means dud eggs
/obj/item/fish_eggs/goldfish
name = "goldfish eggs"
desc = "Goldfish eggs, surprisingly, don't contain actual gold."
icon_state = "gold_eggs"
- fish_type = "goldfish"
+ fish_type = /datum/fish/goldfish
/obj/item/fish_eggs/clownfish
name = "clownfish eggs"
desc = "Even as eggs, they are funnier than the clown. HONK!"
icon_state = "clown_eggs"
- fish_type = "clownfish"
+ fish_type = /datum/fish/clownfish
/obj/item/fish_eggs/shark
name = "shark eggs"
desc = "We're gonna need a- Oh wait, they're still eggs."
icon_state = "shark_eggs"
- fish_type = "shark"
+ fish_type = /datum/fish/shark
/obj/item/fish_eggs/babycarp
name = "baby space carp eggs"
desc = "Eggs from the substantially smaller form of the intergalactic terror."
icon_state = "babycarp_eggs"
- fish_type = "baby space carp"
+ fish_type = /datum/fish/babycarp
/obj/item/fish_eggs/catfish
name = "catfish eggs"
desc = "A bottom-feeding species noted for their similarity to cats and Tajaran."
icon_state = "catfish_eggs"
- fish_type = "catfish"
+ fish_type = /datum/fish/catfish
/obj/item/fish_eggs/feederfish
name = "feeder fish eggs"
desc = "These generic fish are commonly found being eaten by larger fish."
icon_state = "feederfish_eggs"
- fish_type = "feederfish"
+ fish_type = /datum/fish/feederfish
/obj/item/fish_eggs/salmon
name = "salmon eggs"
desc = "A collection of salmon eggs."
icon_state = "salmon_eggs"
- fish_type = "salmon"
+ fish_type = /datum/fish/salmon
/obj/item/fish_eggs/shrimp
name = "shrimp eggs"
desc = "Eggs for shrimp. You figured they'd be smaller though..."
icon_state = "shrimp_eggs"
- fish_type = "shrimp"
+ fish_type = /datum/fish/shrimp
/obj/item/fish_eggs/electric_eel
name = "electric eel eggs"
desc = "A pile of eggs for a slimy, shocking, sea-serpent."
icon_state = "electric_eel_eggs"
- fish_type = "electric eel"
+ fish_type = /datum/fish/electric_eel
/obj/item/fish_eggs/glofish
name = "glofish eggs"
desc = "A cluster of bright neon eggs belonging to a bio-luminescent species of fish."
icon_state = "glofish_eggs"
- fish_type = "glofish"
-
+ fish_type = /datum/fish/glofish
diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm
index 0266f06df90..64ca8269298 100644
--- a/code/modules/fish/fish_items.dm
+++ b/code/modules/fish/fish_items.dm
@@ -1,17 +1,4 @@
-var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfish,
- "clownfish" = /obj/item/weapon/bananapeel/clownfish,
- "shark" = /obj/item/weapon/fish/shark,
- "baby space carp" = /obj/item/weapon/fish/babycarp,
- "catfish" = /obj/item/weapon/fish/catfish,
- "feederfish" = /obj/item/weapon/reagent_containers/food/snacks/feederfish,
- "salmon" = /obj/item/weapon/fish/salmon,
- "shrimp" = /obj/item/weapon/reagent_containers/food/snacks/shrimp,
- "electric eel" = /obj/item/weapon/fish/electric_eel,
- "glofish" = /obj/item/weapon/fish/glofish
-,
- )
-
//////////////////////////////////////////////
// Aquarium Supplies //
//////////////////////////////////////////////
@@ -23,7 +10,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon_state = "egg_scoop"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
@@ -34,7 +21,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon_state = "net"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
@@ -48,7 +35,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon = 'icons/obj/fish_items.dmi'
icon_state = "fish_food"
throwforce = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
@@ -59,7 +46,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon_state = "brush"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
attack_verb = list("scrubbed", "brushed", "scraped")
@@ -103,7 +90,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon = 'icons/obj/fish_items.dmi'
icon_state = "fish"
throwforce = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
force = 1
@@ -208,7 +195,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
..()
-/obj/item/weapon/bananapeel/clownfish
+/obj/item/weapon/grown/bananapeel/clownfish
name = "clown fish"
desc = "Even underwater, you cannot escape HONKing."
icon = 'icons/obj/fish_items.dmi'
diff --git a/code/modules/fish/fish_types.dm b/code/modules/fish/fish_types.dm
new file mode 100644
index 00000000000..13c3dea9845
--- /dev/null
+++ b/code/modules/fish/fish_types.dm
@@ -0,0 +1,76 @@
+
+/datum/fish
+ var/fish_name = "generic fish"
+ var/egg_item = /obj/item/fish_eggs
+ var/fish_item = /obj/item/weapon/fish
+ var/crossbreeder = 1 //determines if the fish will attempt to breed with other types, set to 0 if you want the fish to only lay eggs with its own species
+
+/datum/fish/proc/special_interact(obj/machinery/fishtank/my_tank)
+ return
+
+/datum/fish/goldfish
+ fish_name = "goldfish"
+ egg_item = /obj/item/fish_eggs/goldfish
+ fish_item = /obj/item/weapon/fish/goldfish
+
+/datum/fish/glofish
+ fish_name = "glofish"
+ egg_item = /obj/item/fish_eggs/glofish
+ fish_item = /obj/item/weapon/fish/glofish
+
+/datum/fish/clownfish
+ fish_name = "clownfish"
+ egg_item = /obj/item/fish_eggs/clownfish
+ fish_item = /obj/item/weapon/grown/bananapeel/clownfish
+
+/datum/fish/shark
+ fish_name = "shark"
+ egg_item = /obj/item/fish_eggs/shark
+ fish_item = /obj/item/weapon/fish/shark
+
+/datum/fish/babycarp
+ fish_name = "baby space carp"
+ egg_item = /obj/item/fish_eggs/babycarp
+ fish_item = /obj/item/weapon/fish/babycarp
+
+/datum/fish/catfish
+ fish_name = "catfish"
+ egg_item = /obj/item/fish_eggs/catfish
+ fish_item = /obj/item/weapon/fish/catfish
+
+/datum/fish/catfish/special_interact(obj/machinery/fishtank/my_tank)
+ if(!my_tank || !istype(my_tank))
+ return
+ if(my_tank.filth_level > 0 && prob(33))
+ my_tank.adjust_filth_level(-0.1)
+
+/datum/fish/salmon
+ fish_name = "salmon"
+ egg_item = /obj/item/fish_eggs/salmon
+ fish_item = /obj/item/weapon/fish/salmon
+
+/datum/fish/shrimp
+ fish_name = "shrimp"
+ egg_item = /obj/item/fish_eggs/shrimp
+ fish_item = /obj/item/weapon/reagent_containers/food/snacks/shrimp
+ crossbreeder = 0
+
+/datum/fish/feederfish
+ fish_name = "feeder fish"
+ egg_item = /obj/item/fish_eggs/feederfish
+ fish_item = /obj/item/weapon/reagent_containers/food/snacks/feederfish
+
+/datum/fish/feederfish/special_interact(obj/machinery/fishtank/my_tank)
+ if(!my_tank || !istype(my_tank))
+ return
+ if(my_tank.fish_count < 2)
+ return
+ if(my_tank.food_level <= 5 && prob(25))
+ my_tank.adjust_food_level(1)
+ my_tank.kill_fish(src)
+
+/datum/fish/electric_eel
+ fish_name = "electric eel"
+ egg_item = /obj/item/fish_eggs/electric_eel
+ fish_item = /obj/item/weapon/fish/electric_eel
+ crossbreeder = 0
\ No newline at end of file
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 005fce56df0..45967dc8ac7 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -11,7 +11,7 @@
icon_state = "tank1"
density = 0
anchored = 0
- throwpass = 0
+ pass_flags = 0
var/tank_type = "" // Type of aquarium, used for icon updating
var/water_capacity = 0 // Number of units the tank holds (varies with tank type)
@@ -38,8 +38,7 @@
icon_state = "bowl1"
density = 0 // Small enough to not block stuff
anchored = 0 // Small enough to move even when filled
- throwpass = 1 // Just like at the county fair, you can't seem to throw the ball in to win the goldfish
- pass_flags = PASSTABLE // Small enough to pull onto a table
+ pass_flags = PASSTABLE | LETPASSTHROW // Just like at the county fair, you can't seem to throw the ball in to win the goldfish, and it's small enough to pull onto a table
tank_type = "bowl"
water_capacity = 50 // Not very big, therefore it can't hold much
@@ -57,7 +56,7 @@
icon_state = "tank1"
density = 1
anchored = 1
- throwpass = 1 // You can throw objects over this, despite it's density, because it's short enough.
+ pass_flags = LETPASSTHROW
tank_type = "tank"
water_capacity = 200 // Decent sized, holds almost 2 full buckets
@@ -75,7 +74,7 @@
icon_state = "wall1"
density = 1
anchored = 1
- throwpass = 0 // This thing is the size of a wall, you can't throw past it.
+ pass_flags = 0 // This thing is the size of a wall, you can't throw past it.
tank_type = "wall"
water_capacity = 500 // This thing fills an entire tile, it holds a lot.
@@ -112,7 +111,7 @@
if(light_switch)
set_light(2,2,"#a0a080")
else
- set_light(0)
+ adjust_tank_light()
//////////////////////////////
// NEW() PROCS //
@@ -176,6 +175,7 @@
/obj/machinery/fishtank/process()
//Start by counting fish in the tank
fish_count = 0
+ var/ate_food = 0
for(var/fish in fish_list)
if(fish)
fish_count++
@@ -184,43 +184,38 @@
if((fish_count * 50) > water_level)
if(prob(50)) //Not enough water for all the fish, chance to kill one
kill_fish() //Chance passed, kill a random fish
- filth_level += 2 //Dead fish raise the filth level quite a bit, reflect this
+ adjust_filth_level(2) //Dead fish raise the filth level quite a bit, reflect this
//Check filth_level
- check_filth_level()
if(filth_level == 10 && fish_count > 0) //This tank is nasty and possibly unsuitable for fish if any are in it
if(prob(30)) //Chance for a fish to die each cycle while the tank is this nasty
kill_fish() //Kill a random fish, don't raise filth level since we're at cap already
//Check breeding conditions
if(fish_count >=2 && egg_count < max_fish) //Need at least 2 fish to breed, but won't breed if there are as many eggs as max_fish
- if(food_level > 2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high
+ if(food_level >= 0.2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high
if(prob(((fish_count - 2) * 5)+10)) //Chances increase with each additional fish, 10% base + 5% per additional fish
- egg_count++ //A new set of eggs were laid, increase egg_count
- egg_list.Add(select_egg_type()) //Add the new egg to the egg_list for storage
- food_level -= 2 //Remove extra food for the breeding process
+ breed_fish()
+ adjust_food_level(-0.2) //Remove extra food for the breeding process
+ ate_food = 1
//Handle standard food and filth adjustments
- check_food_level()
- var/ate_food = 0
if(food_level > 0 && prob(50)) //Chance for the fish to eat some food
if(food_level >= (fish_count * 0.1)) //If there is at least enough food to go around, feed all the fish
- food_level -= fish_count * 0.1
+ adjust_food_level(fish_count * -0.1)
else //Use up the last of the food
- food_level = 0
+ adjust_food_level(-food_level)
ate_food = 1
- check_food_level()
if(water_level > 0) //Don't dirty the tank if it has no water
if(fish_count == 0) //If the tank has no fish, algae growth can occur
if(filth_level < 7.5 && prob(15)) //Algae growth is a low chance and cannot exceed filth_level of 7.5
- filth_level += 0.05 //Algae growth is slower than fish filth build-up
+ adjust_filth_level(0.05) //Algae growth is slower than fish filth build-up
else if(filth_level < 10 && prob(10)) //Chance for the tank to get dirtier if the filth_level isn't 10
if(ate_food && prob(25)) //If they ate this cycle, there is an additional chance they make a bigger mess
- filth_level += fish_count * 0.1
+ adjust_filth_level(fish_count * 0.1)
else //If they didn't make the big mess, make a little one
- filth_level += 0.1
- check_filth_level()
+ adjust_filth_level(0.1)
//Handle special interactions
handle_special_interactions()
@@ -228,54 +223,42 @@
//Handle water leakage from damage
if(water_level > 0) //Can't leak water if there is no water in the tank
if(leaking == 2) //At or below 25% health, the tank will lose 10 water_level per cycle (major leak)
- water_level -= 10
+ adjust_water_level(-10)
else if(leaking == 1) //At or below 50% health, the tank will lose 1 water_level per cycle (minor leak)
- water_level -= 1
- check_water_level()
+ adjust_water_level(-1)
+ update_icon()
//////////////////////////////
// SUPPORT PROCS //
//////////////////////////////
/obj/machinery/fishtank/proc/handle_special_interactions()
- var/glo_light = 0
- for(var/fish in fish_list)
- switch(fish)
- if("catfish") //Catfish have a small chance of cleaning some filth since they are a bottom-feeder
- if((filth_level > 0) && prob(30))
- filth_level -= 0.1
- if("feederfish") //Feeder fish have a small chance of sacrificing themselves to produce some food
- if(fish_count < 2) //Don't sacrifice the last fish, there's nothing to eat it
- continue
- if(food_level <= 5 && prob(25))
- kill_fish("feederfish") //Kill the fish to reflect it's sacrifice, but don't increase the filth_level
- food_level += 1 //The corpse became food for the other fish, ecology at it's finest
- if("glofish")
- glo_light++
- if(!light_switch && (glo_light > 0))
- set_light(2,glo_light,"#99FF66")
- check_food_level()
- check_filth_level()
- check_water_level()
+ for(var/datum/fish/fish in fish_list)
+ fish.special_interact(src)
+ adjust_tank_light()
-/obj/machinery/fishtank/proc/check_water_level()
- if(water_level < 0) //Water_level cannot be negative, set it to 0 if it is
- water_level = 0
- if(water_level > water_capacity) //Water_level cannot exceed capacity, set it to capacity if it does
- water_level = water_capacity
+/obj/machinery/fishtank/proc/adjust_tank_light()
+ if(light_switch) //tank light overrides fish lights
+ return
+ else
+ var/glo_light = 0
+ for(var/datum/fish/fish in fish_list)
+ if(istype(fish, /datum/fish/glofish))
+ glo_light ++
+ if(glo_light)
+ set_light(2, glo_light, "#99FF66")
+ else
+ set_light(0, 0)
+
+/obj/machinery/fishtank/proc/adjust_water_level(amount = 0)
+ water_level = min(water_capacity, max(0, water_level + amount))
update_icon()
-/obj/machinery/fishtank/proc/check_filth_level()
- if(filth_level < 0) //Filth_level cannot be negative, set it to 0 if it is
- filth_level = 0
- if(filth_level > 10) //Filth_level cannot exceed 10 (cap), set it to 10 if it does
- filth_level = 10
+/obj/machinery/fishtank/proc/adjust_filth_level(amount = 0)
+ filth_level = min(10, max(0, filth_level + amount))
-/obj/machinery/fishtank/proc/check_food_level()
- if(food_level < 0) //Food_level cannot be negative, set it to 0 if it is
- food_level = 0
- if(food_level > 10) //Food_level cannot exceed 10 (cap), set it to 10 if it does
- food_level = 10
+/obj/machinery/fishtank/proc/adjust_food_level(amount = 0)
+ food_level = min(10, max(0, food_level + amount))
/obj/machinery/fishtank/proc/check_health()
//Max value check
@@ -292,37 +275,28 @@
if(cur_health <= 0) //The tank is broken, destroy it
destroy()
-/obj/machinery/fishtank/proc/kill_fish(var/type = null)
+/obj/machinery/fishtank/proc/kill_fish(datum/fish/fish_type = null)
//Check if we were passed a fish to kill, otherwise kill a random one
- if(type)
- fish_list.Remove(type) //Kill a fish of the specified type
- fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
- else
- fish_list.Remove(pick(fish_list)) //Kill a random fish
- fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
+ if(!fish_type)
+ fish_type = pick(fish_list)
+ fish_list.Remove(fish_type) //Kill a fish of the specified type
+ fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
+ if(istype(fish_type, /datum/fish/glofish))
+ adjust_tank_light()
+ qdel(fish_type)
-/obj/machinery/fishtank/proc/add_fish(var/type = null)
+/obj/machinery/fishtank/proc/add_fish(datum/fish/fish_type = null)
//Check if we were passed a fish type
- if(type)
- fish_list.Add("[type]") //Add a fish of the specified type
+ if(fish_type)
+ fish_type = new fish_type
+ fish_list.Add(fish_type) //Add a fish of the specified type
fish_count++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine
//Announce the new fish
- src.visible_message("A new [type] has hatched in \the [src]!")
+ visible_message("A new [fish_type.fish_name] has hatched in \the [src]!")
//Null type fish are dud eggs, give a message to inform the player
else
to_chat(usr, "The eggs disolve in the water. They were duds!")
-/obj/machinery/fishtank/proc/select_egg_type()
- var/fish = pick(fish_list) //Select a fish from the fish in the tank
- if(prob(25)) //25% chance to be a dud (blank) egg
- fish = "dud"
- var/obj/item/fish_eggs/egg_path = null //Create empty variable to receive the egg_path
- egg_path = fish_eggs_list[fish] //Locate the corresponding path from fish_eggs_list that matches the fish
- if(!egg_path) //The fish wasn't located in the fish_eggs_list, potentially due to a typo, so return a dud egg
- return /obj/item/fish_eggs
- else //The fish was located in the fish_eggs_list, so return the proper egg
- return egg_path
-
/obj/machinery/fishtank/proc/harvest_eggs(var/mob/user)
if(!egg_count) //Can't harvest non-existant eggs
return
@@ -342,17 +316,17 @@
if(!fish_count) //Can't catch non-existant fish!
to_chat(usr, "There are no fish in \the [src] to catch!")
return
-
- var/caught_fish
- caught_fish = input("Select a fish to catch.", "Fishing", caught_fish) in fish_list //Select a fish from the tank
+ var/list/fish_names_list = list()
+ for(var/datum/fish/fish_type in fish_list)
+ fish_names_list += list("[fish_type.fish_name]" = fish_type)
+ var/caught_fish = input("Select a fish to catch.", "Fishing") as null|anything in fish_names_list //Select a fish from the tank
if(caught_fish)
- var/dead_fish = null
- dead_fish = fish_items_list[caught_fish] //Locate the appropriate fish_item for the caught fish
- if(!dead_fish) //No fish_item found, possibly due to typo or not being listed. Do nothing.
- return
- kill_fish(caught_fish) //Kill the caught fish from the tank
user.visible_message("[user.name] harvests \a [caught_fish] from \the [src].", "You scoop \a [caught_fish] out of \the [src].")
- new dead_fish(get_turf(user)) //Spawn the appropriate fish_item at the user's feet.
+ var/datum/fish/fish_type = fish_names_list[caught_fish]
+ var/fish_item = fish_type.fish_item
+ if(fish_item)
+ new fish_item(get_turf(user)) //Spawn the appropriate fish_item at the user's feet.
+ kill_fish(fish_type) //Kill the caught fish from the tank
/obj/machinery/fishtank/proc/destroy(var/deconstruct = 0)
var/turf/T = get_turf(src) //Store the tank's turf for atmos updating after deletion of tank
@@ -392,6 +366,38 @@
var/turf/simulated/S = T
S.MakeSlippery()
+/obj/machinery/fishtank/proc/breed_fish()
+ var/list/breed_candidates = fish_list.Copy()
+ var/datum/fish/parent1 = pick_n_take(breed_candidates)
+ if(!parent1.crossbreeder) //fish with crossbreed = 0 will only breed with their own species, and only leave duds if they can't breed
+ var/match_found = 0
+ for(var/datum/fish/possible in breed_candidates)
+ if(parent1.type == possible.type)
+ match_found = 1
+ break
+ if(match_found)
+ egg_list.Add(parent1.egg_item)
+ else
+ egg_list.Add(/obj/item/fish_eggs)
+ else
+ var/datum/fish/parent2 = pick(breed_candidates)
+ if(!parent2.crossbreeder) //second fish refuses to crossbreed, spawn a dud
+ egg_list.Add(/obj/item/fish_eggs)
+ else if(parent1.type == parent2.type) //both fish are the same type
+ if(prob(90)) //90% chance to get that type of egg
+ egg_list.Add(parent1.egg_item)
+ else //10% chance to get a dud
+ egg_list.Add(/obj/item/fish_eggs)
+ else //different types of fish
+ if(prob(30)) //30% chance to get dud
+ egg_list.Add(/obj/item/fish_eggs)
+ else
+ if(prob(50)) //chance to get egg for either parent type (50/50 for either parent, 35% overall each)
+ egg_list.Add(parent1.egg_item)
+ else
+ egg_list.Add(parent2.egg_item)
+ egg_count++
+
////////////////////////////// Note from FalseIncarnate:
// EXAMINE PROC // This proc is massive, messy, and probably could be handled better.
////////////////////////////// Feel free to try cleaning it up if you think of a better way to do it.
@@ -464,9 +470,11 @@
var/fish_num = fish_count
var/message = "You spot "
while(fish_num > 0)
+ var/datum/fish/fish_type = fish_list[fish_num]
+ var/fish_name = fish_type.fish_name
if(fish_count > 1 && fish_num == 1) //If there were at least 2 fish, and this is the last one, add "and" to the message
message += "and "
- message += "a [fish_list[fish_num]]"
+ message += "\an [fish_name]"
fish_num --
if(fish_num > 0) //There's more fish, add a comma to the message
message +=", "
@@ -606,6 +614,7 @@
if(user.a_intent == I_HELP)
if(W.isOn())
if(cur_health < max_health)
+ playsound(loc, W.usesound, 50, 1)
to_chat(usr, "You repair some of the cracks on \the [src].")
cur_health += 20
check_health()
@@ -613,7 +622,7 @@
to_chat(usr, "There is no damage to fix!")
else
if(cur_health < max_health)
- to_chat(usr, "[W.name] must on to repair this damage.")
+ to_chat(usr, "[W.name] must be on to repair this damage.")
else
user.changeNext_move(CLICK_CD_MELEE)
hit(W.force)
@@ -644,13 +653,13 @@
return
else
message = "The filtration process purifies the water, raising the water level."
- water_level += water_value
- if(water_level == water_capacity)
+
+ if((water_level + water_value) == water_capacity)
message += " You filled \the [src] to the brim!"
- if(water_level > water_capacity)
+ if((water_level + water_value) > water_capacity)
message += " You overfilled \the [src] and some water runs down the side, wasted."
C.reagents.clear_reagents()
- check_water_level()
+ adjust_water_level(water_value)
user.visible_message("[user.name] pours the contents of [C.name] into \the [src].", "[message]")
return
//Empty containers will scoop out water, filling the container as much as possible from the water_level
@@ -660,20 +669,19 @@
else
if(water_level >= C.volume) //Enough to fill the container completely
C.reagents.add_reagent("fishwater", C.volume)
- water_level -= C.volume
+ adjust_water_level(-C.volume)
user.visible_message("[user.name] scoops out some water from \the [src].", "You completely fill [C.name] from \the [src].")
else //Fill the container as much as possible with the water_level
C.reagents.add_reagent("fishwater", water_level)
- water_level = 0
+ adjust_water_level(-water_level)
user.visible_message("[user.name] scoops out some water from \the [src].", "You fill [C.name] with the last of the water in \the [src].")
- check_water_level()
return
//Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
if(istype(O, /obj/item/weapon/wrench))
if(water_level == 0)
to_chat(usr, "Now disassembling [src]. ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user,50, target = src))
+ playsound(src.loc, O.usesound, 50, 1)
+ if(do_after(user, 50 * O.toolspeed, target = src))
destroy(1)
else
to_chat(usr, "[src] must be empty before you disassemble it!")
@@ -701,12 +709,11 @@
user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.")
else
user.visible_message("[user.name] feeds the fish in \the [src]. The fish look excited!", "You feed the fish in \the [src]. They look excited!")
- food_level += 10
+ adjust_food_level(10)
else
to_chat(usr, "[src] already has plenty of food in it. You decide to not add more.")
else
to_chat(usr, "[src] doesn't have any water in it. You should fill it with water first.")
- check_food_level()
return
//Fish egg scoop
else if(istype(O, /obj/item/weapon/egg_scoop))
@@ -725,7 +732,7 @@
if(filth_level == 0)
to_chat(usr, "[src] is already spotless!")
else
- filth_level = 0
+ adjust_filth_level(-filth_level)
user.visible_message("[user.name] scrubs the inside of \the [src], cleaning the filth.", "You scrub the inside of \the [src], cleaning the filth.")
else if(O && O.force)
user.visible_message("\The [src] has been attacked by [user.name] with \the [O]! ")
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 4c120db79e0..64bb91a9db4 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -11,54 +11,57 @@ Gunshots/explosions/opening doors/less rare audio (done)
*/
-/mob/living/carbon/
+#define SCREWYHUD_NONE 0
+#define SCREWYHUD_CRIT 1
+#define SCREWYHUD_DEAD 2
+#define SCREWYHUD_HEALTHY 3
+
+/mob/living/carbon
var/image/halimage
var/image/halbody
var/obj/halitem
- var/hal_screwyhud = 0 //1 - critical, 2 - dead, 3 - oxygen indicator, 4 - toxin indicator
+ var/hal_screwyhud = SCREWYHUD_NONE
var/handling_hal = 0
- var/hal_crit = 0
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal)
return
//Least obvious
- var/list/minor = list("sounds"=20,"bolts_minor"=10,"whispers"=15,"message"=5)
+ var/list/minor = list("sounds"=25,"bolts_minor"=5,"whispers"=15,"message"=10,"hudscrew"=15)
//Something's wrong here
- var/list/medium = list("hudscrew"=15,"items"=15,"dangerflash"=15,"bolts"=10,"flood"=10,"husks"=10,"battle"=10)
- //AAAAH
- var/list/major = list("fake"=10,"death"=5,"xeno"=10,"singulo"=10,"delusion"=10)
-
- var/grade = 0
- var/current = list()
- var/trip_length = 0
+ var/list/medium = list("fake_alert"=15,"items"=10,"items_other"=10,"dangerflash"=10,"bolts"=5,"flood"=5,"husks"=10,"battle"=15,"self_delusion"=10)
+ //AAAAHg
+ var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10)
handling_hal = 1
while(hallucination > 20)
- sleep(rand(200,500)/(hallucination/25))
- trip_length += 1
- if(prob(min(20,trip_length*2)))
- grade = min(3,grade+1)
+ sleep(rand(200, 500) / (hallucination / 25))
if(prob(20))
continue
- current = list()
- for(var/a in minor)
- current[a] = minor[a] * (grade==0?2:1)
- for(var/b in medium)
- current[b] = medium[b] * (grade==1?2:1)
- for(var/c in major)
- current[c] = major[c] * (grade==2?2:1)
+ var/list/current = list()
+ switch(rand(100))
+ if(1 to 50)
+ current = minor
+ if(51 to 85)
+ current = medium
+ if(86 to 100)
+ current = major
var/halpick = pickweight(current)
hallucinate(halpick)
handling_hal = 0
+
/obj/effect/hallucination
invisibility = INVISIBILITY_OBSERVER
var/mob/living/carbon/target = null
+/obj/effect/hallucination/proc/wake_and_restore()
+ target.hal_screwyhud = SCREWYHUD_NONE
+ target.SetSleeping(0)
+
/obj/effect/hallucination/simple
var/image_icon = 'icons/mob/alien.dmi'
var/image_state = "alienh_pounce"
@@ -69,28 +72,31 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/image_layer = MOB_LAYER
var/active = 1 //qdelery
-/obj/effect/hallucination/simple/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/simple/New(loc, mob/living/carbon/T)
+ ..()
target = T
current_image = GetImage()
- if(target.client) target.client.images |= current_image
- return
+ if(target.client)
+ target.client.images |= current_image
/obj/effect/hallucination/simple/proc/GetImage()
- var/image/I = image(image_icon,loc,image_state,image_layer,dir=src.dir)
+ var/image/I = image(image_icon, src, image_state, image_layer, dir = dir)
I.pixel_x = px
I.pixel_y = py
if(col_mod)
I.color = col_mod
return I
-/obj/effect/hallucination/simple/proc/Show(var/update=1)
+/obj/effect/hallucination/simple/proc/Show(update = 1)
if(active)
- if(target.client) target.client.images.Remove(current_image)
+ if(target.client)
+ target.client.images.Remove(current_image)
if(update)
current_image = GetImage()
- if(target.client) target.client.images |= current_image
+ if(target.client)
+ target.client.images |= current_image
-/obj/effect/hallucination/simple/update_icon(var/new_state,var/new_icon,var/new_px=0,var/new_py=0)
+/obj/effect/hallucination/simple/update_icon(new_state, new_icon, new_px = 0, new_py = 0)
image_state = new_state
if(new_icon)
image_icon = new_icon
@@ -105,15 +111,16 @@ Gunshots/explosions/opening doors/less rare audio (done)
Show()
/obj/effect/hallucination/simple/Destroy()
- if(target.client) target.client.images.Remove(current_image)
+ if(target.client)
+ target.client.images.Remove(current_image)
active = 0
return ..()
-#define FAKE_FLOOD_EXPAND_TIME 30
-#define FAKE_FLOOD_MAX_RADIUS 7
+#define FAKE_FLOOD_EXPAND_TIME 20
+#define FAKE_FLOOD_MAX_RADIUS 10
/obj/effect/hallucination/fake_flood
- //Plasma/N2O starts flooding from the nearby vent
+ //Plasma starts flooding from the nearby vent
var/list/flood_images = list()
var/list/turf/flood_turfs = list()
var/image_icon = 'icons/effects/tile_effects.dmi'
@@ -121,17 +128,17 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/radius = 0
var/next_expand = 0
-/obj/effect/hallucination/fake_flood/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/fake_flood/New(loc, mob/living/carbon/T)
..()
target = T
for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
if(!U.welded)
src.loc = U.loc
break
- image_state = pick("plasma","sleeping_agent")
flood_images += image(image_icon,src,image_state,MOB_LAYER)
flood_turfs += get_turf(src.loc)
- if(target.client) target.client.images |= flood_images
+ if(target.client)
+ target.client.images |= flood_images
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
processing_objects += src
@@ -141,26 +148,28 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(radius > FAKE_FLOOD_MAX_RADIUS)
qdel(src)
Expand()
+ if((get_turf(target) in flood_turfs) && !target.internal)
+ target.hallucinate("fake_alert", "tox_in_air")
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
- return
/obj/effect/hallucination/fake_flood/proc/Expand()
- if(!flood_turfs) //for qdel
- return
- for(var/turf/T in circlerangeturfs(loc,radius))
- if((T in flood_turfs)|| T.blocks_air)
- continue
- flood_images += image(image_icon,T,image_state,MOB_LAYER)
- flood_turfs += T
- if(target.client) target.client.images |= flood_images
- return
+ for(var/turf/FT in flood_turfs)
+ for(var/dir in cardinal)
+ var/turf/T = get_step(FT, dir)
+ if((T in flood_turfs) || !FT.CanAtmosPass(T))
+ continue
+ flood_images += image(image_icon,T,image_state,MOB_LAYER)
+ flood_turfs += T
+ if(target.client)
+ target.client.images |= flood_images
/obj/effect/hallucination/fake_flood/Destroy()
processing_objects -= src
- qdel(flood_turfs)
- if(target.client) target.client.images.Remove(flood_images)
+ flood_turfs.Cut()
+ if(target.client)
+ target.client.images.Remove(flood_images)
target = null
- qdel(flood_images)
+ QDEL_LIST(flood_images)
return ..()
/obj/effect/hallucination/simple/xeno
@@ -170,48 +179,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/xeno/New(loc,var/mob/living/carbon/T)
..()
name = "alien hunter ([rand(1, 1000)])"
- return
-
-/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
- if(!target || !src || (flags & NODROP)) return 0
-
- src.throwing = 1
-
- var/dist_x = abs(target.x - src.x)
- var/dist_y = abs(target.y - src.y)
- var/dist_travelled = 0
- var/dist_since_sleep = 0
-
- var/tdist_x = dist_x;
- var/tdist_y = dist_y;
-
- if(dist_x <= dist_y)
- tdist_x = dist_y;
- tdist_y = dist_x;
-
- var/error = tdist_x/2 - tdist_y
- while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
-
- if(!src.throwing) break
- if(!istype(src.loc, /turf)) break
-
- var/atom/step = get_step(src, get_dir(src,target))
- if(!step)
- break
- src.Move(step, get_dir(src, step))
- hit_check()
- error += (error < 0) ? tdist_x : -tdist_y;
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
-
-
- src.throwing = 0
- src.throw_impact(get_turf(src))
-
- return 1
/obj/effect/hallucination/simple/xeno/throw_impact(A)
update_icon("alienh_pounce")
@@ -224,49 +191,155 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/obj/machinery/atmospherics/unary/vent_pump/pump = null
var/obj/effect/hallucination/simple/xeno/xeno = null
-/obj/effect/hallucination/xeno_attack/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/xeno_attack/New(loc, mob/living/carbon/T)
target = T
for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
if(!U.welded)
pump = U
break
- if(!pump) return 0
+ if(!pump)
+ return 0
xeno = new(pump.loc,target)
sleep(10)
- if(!xeno) return
+ if(!xeno)
+ return
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(target,7,1)
+ xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
sleep(10)
- if(!xeno) return
+ if(!xeno)
+ return
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(pump,7,1)
+ xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
sleep(10)
- if(!xeno) return
+ if(!xeno)
+ return
var/xeno_name = xeno.name
to_chat(target, "[xeno_name] begins climbing into the ventilation system... ")
sleep(10)
- if(!xeno) return
+ if(!xeno)
+ return
qdel(xeno)
to_chat(target, "[xeno_name] scrambles into the ventilation ducts! ")
qdel(src)
+/obj/effect/hallucination/simple/clown
+ image_icon = 'icons/mob/animal.dmi'
+ image_state = "clown"
+
+/obj/effect/hallucination/simple/clown/New(loc, mob/living/carbon/T, duration)
+ ..(loc, T)
+ name = pick(clown_names)
+ sleep(duration)
+ qdel(src)
+
+/obj/effect/hallucination/simple/clown/scary
+ image_state = "scary_clown"
+
+/obj/effect/hallucination/simple/borer
+ image_icon = 'icons/mob/animal.dmi'
+ image_state = "brainslug"
+
+/obj/effect/hallucination/borer
+ //A borer paralyzes you and crawls in your ear
+ var/obj/machinery/atmospherics/unary/vent_pump/pump = null
+ var/obj/effect/hallucination/simple/borer/borer = null
+
+/obj/effect/hallucination/borer/New(loc, mob/living/carbon/T)
+ ..()
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7, target))
+ if(!U.welded)
+ pump = U
+ break
+ if(pump)
+ borer = new(pump.loc,target)
+ for(var/i=0, i<11, i++)
+ walk_to(borer, get_step(borer, get_cardinal_dir(borer, T)))
+ if(borer.Adjacent(T))
+ to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing. ")
+ T.Stun(4)
+ sleep(50)
+ qdel(borer)
+ sleep(rand(60, 90))
+ to_chat(T, "Primary [rand(1000,9999)] states: [pick("Hello","Hi","You're my slave now!","Don't try to get rid of me...")] ")
+ break
+ sleep(4)
+ if(!qdeleted(borer))
+ qdel(borer)
+ qdel(src)
+
+/obj/effect/hallucination/simple/bubblegum
+ name = "Bubblegum"
+ image_icon = 'icons/mob/lavaland/96x96megafauna.dmi'
+ image_state = "bubblegum"
+ px = -32
+
+/obj/effect/hallucination/oh_yeah
+ var/turf/simulated/wall/wall
+ var/obj/effect/hallucination/simple/bubblegum/bubblegum = null
+ var/image/fakebroken
+ var/image/fakerune
+
+/obj/effect/hallucination/oh_yeah/New(loc, mob/living/carbon/T)
+ ..()
+ target = T
+ for(var/turf/simulated/wall/W in range(7,target))
+ wall = W
+ break
+ if(wall)
+ fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER)
+ var/turf/landing = get_turf(target)
+ var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3
+ fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER)
+ fakebroken.override = TRUE
+ if(target.client)
+ target.client.images |= fakebroken
+ target.client.images |= fakerune
+ target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1)
+ bubblegum = new(wall, target)
+ sleep(10) //ominous wait
+ var/charged = FALSE //only get hit once
+ while(get_turf(bubblegum) != landing && target)
+ bubblegum.forceMove(get_step_towards(bubblegum, landing))
+ bubblegum.setDir(get_dir(bubblegum, landing))
+ target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
+ shake_camera(target, 2, 1)
+ if(bubblegum.Adjacent(target) && !charged)
+ charged = TRUE
+ target.Weaken(4)
+ target.staminaloss += 40
+ step_away(target, bubblegum)
+ shake_camera(target, 4, 3)
+ target.visible_message("[target] jumps backwards, falling on the ground! ","[bubblegum] slams into you! ")
+ sleep(2)
+ sleep(30)
+ qdel(bubblegum)
+ qdel(src)
+
+/obj/effect/hallucination/oh_yeah/Destroy()
+ if(target.client)
+ target.client.images.Remove(fakebroken)
+ target.client.images.Remove(fakerune)
+ return ..()
+
/obj/effect/hallucination/singularity_scare
//Singularity moving towards you.
//todo Hide where it moved with fake space images
var/obj/effect/hallucination/simple/singularity/s = null
-/obj/effect/hallucination/singularity_scare/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/singularity_scare/New(loc, mob/living/carbon/T)
target = T
- var/turf/start = T.loc
- var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
+ var/turf/start = get_turf(T)
+ var/screen_border = pick(cardinal)
for(var/i = 0,i<11,i++)
- start = get_step(start,screen_border)
+ start = get_step(start, screen_border)
s = new(start,target)
for(var/i = 0,i<11,i++)
sleep(5)
- s.loc = get_step(get_turf(s),get_dir(s,target))
+ s.loc = get_step(get_turf(s), get_dir(s, target))
s.Show()
s.Eat()
+ addtimer(src, "wake_and_restore", rand(50, 100))
qdel(s)
/obj/effect/hallucination/simple/singularity
@@ -277,50 +350,98 @@ Gunshots/explosions/opening doors/less rare audio (done)
py = -96
/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
- var/target_dist = get_dist(src,target)
- if(target_dist<=3) //"Eaten"
- target.Sleeping(20)
- target.hal_crit = 1
- target.hal_screwyhud = 1
- spawn(rand(50,100))
- target.SetSleeping(0)
- target.hal_crit = 0
- target.hal_screwyhud = 0
+ var/target_dist = get_dist(src, target)
+ if(target_dist <= 3) //"Eaten"
+ target.hal_screwyhud = SCREWYHUD_CRIT
+ target.SetSleeping(8, no_alert = TRUE)
/obj/effect/hallucination/battle
-/obj/effect/hallucination/battle/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/battle/New(loc, mob/living/carbon/T)
target = T
var/hits = rand(3,6)
switch(rand(1,5))
if(1) //Laser fight
for(var/i=0,i...wabbajack...wabbajack...")
+ target.playsound_local(target,'sound/magic/Staff_Change.ogg', 50, 1, -1)
+ delusion = A
+ target.client.images |= A
+ sleep(duration)
qdel(src)
-/obj/effect/hallucination/fakeattacker/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/self_delusion/Destroy()
+ if(target.client)
+ target.client.images.Remove(delusion)
+ return ..()
+
+/obj/effect/hallucination/fakeattacker/New(loc, mob/living/carbon/T)
+ ..()
target = T
var/mob/living/carbon/human/clone = null
var/clone_weapon = null
@@ -417,25 +584,25 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/health = 100
-/obj/effect/fake_attacker/attackby(var/obj/item/weapon/P as obj, mob/living/user as mob, params)
+/obj/effect/fake_attacker/attackby(obj/item/weapon/P, mob/living/user, params)
step_away(src,my_target,2)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
+ my_target.playsound_local(src, P.hitsound, 1)
my_target.visible_message("[my_target] flails around wildly. ", \
"[my_target] has attacked [src]! ")
- src.health -= P.force
+ health -= P.force
return
-/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber)
+/obj/effect/fake_attacker/Crossed(mob/M, somenumber)
if(M == my_target)
step_away(src,my_target,2)
if(prob(30))
for(var/mob/O in oviewers(world.view , my_target))
to_chat(O, "[my_target] stumbles around. ")
-/obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T)
+/obj/effect/fake_attacker/New(loc, mob/living/carbon/T)
..()
my_target = T
spawn(300)
@@ -447,25 +614,25 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/fake_attacker/proc/updateimage()
// qdel(src.currentimage)
- if(src.dir == NORTH)
+ if(dir == NORTH)
qdel(src.currentimage)
- src.currentimage = new /image(up,src)
- else if(src.dir == SOUTH)
+ currentimage = new /image(up, src)
+ else if(dir == SOUTH)
qdel(src.currentimage)
- src.currentimage = new /image(down,src)
- else if(src.dir == EAST)
+ currentimage = new /image(down, src)
+ else if(dir == EAST)
qdel(src.currentimage)
- src.currentimage = new /image(right,src)
- else if(src.dir == WEST)
+ currentimage = new /image(right, src)
+ else if(dir == WEST)
qdel(src.currentimage)
- src.currentimage = new /image(left,src)
+ currentimage = new /image(left, src)
my_target << currentimage
/obj/effect/fake_attacker/proc/attack_loop()
while(1)
sleep(rand(5,10))
- if(src.health < 0)
+ if(src.health < 0 || my_target.stat)
collapse()
continue
if(get_dist(src,my_target) > 1)
@@ -474,9 +641,8 @@ Gunshots/explosions/opening doors/less rare audio (done)
updateimage()
else
if(prob(15))
- src.do_attack_animation(my_target)
if(weapon_name)
- my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
+ my_target.playsound_local(my_target, weap.hitsound, 1)
my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]! ", 1)
my_target.staminaloss += 30
if(prob(20))
@@ -485,7 +651,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
else
- my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'))
+ my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1, -1)
my_target.show_message("[src.name] has punched [my_target]! ", 1)
my_target.staminaloss += 30
if(prob(33))
@@ -498,8 +664,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/fake_attacker/proc/collapse()
collapse = 1
updateimage()
+ qdel(src)
-/obj/effect/fake_attacker/proc/fake_blood(var/mob/target)
+/obj/effect/fake_attacker/proc/fake_blood(mob/target)
var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc)
O.name = "blood"
var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1)
@@ -527,7 +694,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/effect/hallucination/bolts
var/list/doors = list()
-/obj/effect/hallucination/bolts/New(loc,var/mob/living/carbon/T,var/door_number=-1) //-1 for sever 1-2 for subtle
+/obj/effect/hallucination/bolts/New(loc, mob/living/carbon/T, door_number = -1) //-1 for sever 1-2 for subtle
target = T
var/image/I = null
var/count = 0
@@ -535,23 +702,26 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
if(count>door_number && door_number>0)
break
count++
- I = image(A.icon,A,"door_locked",layer=A.layer+0.1)
+ I = image(A.icon, get_turf(A), "door_locked", layer=A.layer+0.1)
doors += I
if(target.client)
target.client.images |= I
- sleep(2)
+ target.playsound_local(get_turf(A), 'sound/machines/BoltsDown.ogg',30,0,3)
+ sleep(rand(6,12))
sleep(100)
for(var/image/B in doors)
if(target.client)
target.client.images.Remove(B)
+ target.playsound_local(get_turf(B), 'sound/machines/BoltsUp.ogg',30,0,3)
+ sleep(rand(6,12))
qdel(src)
/obj/effect/hallucination/whispers
/obj/effect/hallucination/whispers/New(loc,var/mob/living/carbon/T)
target = T
- var/speak_messages = list("I'm watching you...","[target.name]!","Go away!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!")
- var/radio_messages = list("Xenos!","Singularity loose!","They are arming the nuke!","They butchered Ian!","H-help!","[pick(teleportlocs)]!!","Where's [target.name]?","Call the shuttle!")
+ var/speak_messages = list("I'm watching you...","[target.name]!","Get out!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!", "EI NATH!!", "RUN!!", "Kill me!","O bidai nabora se'sma!")
+ var/radio_messages = list("Xenos!","Singularity loose!","Comms down!","They are arming the nuke!","They butchered Ian!","H-help!","[pick("Cult", "Wizard", "Ling", "Ops", "Revenant", "Murderer", "Harm", "I hear flashing", "Help")] in [pick(teleportlocs)][prob(50)?"!":"!!"]","Where's [target.name]?","Call the shuttle!","AI rogue!!")
var/list/mob/living/carbon/people = list()
var/list/mob/living/carbon/person = null
@@ -565,7 +735,12 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
person = H
people += H
if(person) //Basic talk
+ var/image/speech_overlay = image('icons/mob/talk.dmi', person, "h0", layer = ABOVE_MOB_LAYER)
target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)
+ if(target.client)
+ target.client.images |= speech_overlay
+ sleep(30)
+ target.client.images.Remove(speech_overlay)
else // Radio talk
var/list/humans = list()
for(var/mob/living/carbon/human/H in living_mob_list)
@@ -578,76 +753,93 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/effect/hallucination/message/New(loc,var/mob/living/carbon/T)
target = T
- var/chosen = pick("The light burns you! ", \
- "You don't feel like yourself. ", \
- "Unknown has punched [target]! ", \
- "You hear something squeezing through the ducts... ", \
- "You hear a distant scream. ", \
- "You feel invincible, nothing can hurt you! ", \
- "[target] sneezes.", \
- "You feel faint. ", \
- "You hear a strange, alien voice in your head... [pick("Hiss","Ssss")]", \
+ var/chosen = pick("The light burns you! ",
+ "You don't feel like yourself. ",
+ "Unknown has punched [target]! ",
+ "You hear something squeezing through the ducts... ",
+ "You hear a distant scream. ",
+ "You feel invincible, nothing can hurt you! ",
+ "You feel a tiny prick! ",
+ "[target] sneezes.",
+ "You feel faint. ",
+ "You hear a strange, alien voice in your head... [pick("Hiss","Ssss")]",
"You can see...everything! ")
to_chat(target, chosen)
qdel(src)
-/mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines
+/mob/living/carbon/proc/hallucinate(hal_type, specific) // specific is used to specify a particular hallucination
switch(hal_type)
if("xeno")
- new /obj/effect/hallucination/xeno_attack(src.loc,src)
+ new /obj/effect/hallucination/xeno_attack(loc, src)
+ if("borer")
+ new /obj/effect/hallucination/borer(loc, src)
if("singulo")
- new /obj/effect/hallucination/singularity_scare(src.loc,src)
+ new /obj/effect/hallucination/singularity_scare(loc, src)
+ if("koolaid")
+ new /obj/effect/hallucination/oh_yeah(loc, src)
if("battle")
- new /obj/effect/hallucination/battle(src.loc,src)
+ new /obj/effect/hallucination/battle(loc, src)
if("flood")
- new /obj/effect/hallucination/fake_flood(src.loc,src)
+ new /obj/effect/hallucination/fake_flood(loc, src)
if("delusion")
- new /obj/effect/hallucination/delusion(src.loc,src)
+ new /obj/effect/hallucination/delusion(loc, src)
+ if("self_delusion")
+ new /obj/effect/hallucination/self_delusion(loc, src)
if("fake")
- new /obj/effect/hallucination/fakeattacker(src.loc,src)
+ new /obj/effect/hallucination/fakeattacker(loc, src)
if("bolts")
- new /obj/effect/hallucination/bolts(src.loc,src)
+ new /obj/effect/hallucination/bolts(loc, src)
if("bolts_minor")
- new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2))
+ new /obj/effect/hallucination/bolts(loc,src, rand(1,2))
if("whispers")
- new /obj/effect/hallucination/whispers(src.loc,src)
+ new /obj/effect/hallucination/whispers(loc, src)
if("message")
- new /obj/effect/hallucination/message(src.loc,src)
+ new /obj/effect/hallucination/message(loc, src)
+ if("items_other")
+ new /obj/effect/hallucination/items_other(src.loc,src)
if("sounds")
//Strange audio
// to_chat(src, "Strange Audio")
switch(rand(1,18))
if(1)
- src << 'sound/machines/airlock.ogg'
+ playsound_local(null,'sound/machines/airlock_open.ogg', 15, 1)
if(2)
if(prob(50))
- src << 'sound/effects/Explosion1.ogg'
+ playsound_local(null,'sound/effects/Explosion1.ogg', 50, 1)
else
- src << 'sound/effects/Explosion2.ogg'
+ playsound_local(null, 'sound/effects/Explosion2.ogg', 50, 1)
if(3)
- src << 'sound/effects/explosionfar.ogg'
+ playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1)
if(4)
- src << 'sound/effects/Glassbr1.ogg'
+ playsound_local(null, pick('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg'), 50, 1)
if(5)
- src << 'sound/effects/Glassbr2.ogg'
+ playsound_local(null, 'sound/weapons/ring.ogg', 35)
+ sleep(15)
+ playsound_local(null, 'sound/weapons/ring.ogg', 35)
+ sleep(15)
+ playsound_local(null, 'sound/weapons/ring.ogg', 35)
if(6)
- src << 'sound/effects/Glassbr3.ogg'
+ playsound_local(null, 'sound/magic/Summon_guns.ogg', 50, 1)
if(7)
- src << 'sound/machines/twobeep.ogg'
+ playsound_local(null, 'sound/machines/Alarm.ogg', 100, 0)
if(8)
- src << 'sound/machines/windowdoor.ogg'
+ playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
if(9)
//To make it more realistic, I added two gunshots (enough to kill)
- src << 'sound/weapons/Gunshot.ogg'
+ playsound_local(null, 'sound/weapons/Gunshot.ogg', 25, 1)
spawn(rand(10,30))
- src << 'sound/weapons/Gunshot.ogg'
+ playsound_local(null, 'sound/weapons/Gunshot.ogg', 25, 1)
+ sleep(rand(5,10))
+ playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1)
if(10)
- src << 'sound/weapons/smash.ogg'
+ playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
if(11)
//Same as above, but with tasers.
- src << 'sound/weapons/Taser.ogg'
+ playsound_local(null, 'sound/weapons/Taser.ogg', 25, 1)
spawn(rand(10,30))
- src << 'sound/weapons/Taser.ogg'
+ playsound_local(null, 'sound/weapons/Taser.ogg', 25, 1)
+ sleep(rand(5,10))
+ playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1)
//Rare audio
if(12)
//These sounds are (mostly) taken from Hidden: Source
@@ -656,40 +848,112 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
- src << pick(creepyasssounds)
+ playsound_local(null, pick(creepyasssounds), 50, 1)
if(13)
to_chat(src, "You feel a tiny prick! ")
if(14)
to_chat(src, "Priority Announcement ")
to_chat(src, "The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle. ")
- src << sound('sound/AI/shuttledock.ogg')
+ playsound_local(null, 'sound/AI/shuttledock.ogg', 100)
if(15)
- src << 'sound/items/Welder.ogg'
+ playsound_local(null, 'sound/items/Welder.ogg', 15, 1)
+ sleep(105)
+ playsound_local(null, 'sound/items/Welder2.ogg', 15, 1)
+ sleep(15)
+ playsound_local(null, 'sound/items/Ratchet.ogg', 15, 1)
if(16)
- src << 'sound/items/Screwdriver.ogg'
+ playsound_local(null, 'sound/items/Screwdriver.ogg', 15, 1)
+ sleep(rand(10,30))
+ for(var/i = rand(1,3), i>0, i--)
+ playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
+ sleep(rand(10,30))
+ playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1)
if(17)
- src << 'sound/weapons/saberon.ogg'
+ playsound_local(null, 'sound/weapons/saberon.ogg', 35, 1)
if(18)
- src << 'sound/weapons/saberoff.ogg'
+ to_chat(src, "Biohazard Alert ")
+ to_chat(src, "Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak. ")
+ playsound_local(null, 'sound/AI/outbreak5.ogg')
+ if(19) //Tesla loose!
+ playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1)
+ sleep(20)
+ playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1)
+ sleep(20)
+ playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1)
+ if(20) //AI is doomsdaying!
+ to_chat(src, "Anomaly Alert ")
+ to_chat(src, "Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core. ")
+ playsound_local(null, 'sound/AI/aimalf.ogg')
if("hudscrew")
//Screwy HUD
-// to_chat(src, "Screwy HUD")
- hal_screwyhud = pick(1,2,3,3,4,4)
- spawn(rand(100,250))
- hal_screwyhud = 0
+ hal_screwyhud = pick(SCREWYHUD_NONE, SCREWYHUD_CRIT, SCREWYHUD_DEAD, SCREWYHUD_HEALTHY)
+ sleep(rand(100,250))
+ hal_screwyhud = SCREWYHUD_NONE
+ if("fake_alert")
+ var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
+ if(specific)
+ alert_type = specific
+ switch(alert_type)
+ if("oxy")
+ throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE)
+ if("not_enough_tox")
+ throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE)
+ if("not_enough_co2")
+ throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE)
+ if("too_much_oxy")
+ throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE)
+ if("too_much_co2")
+ throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE)
+ if("tox_in_air")
+ throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE)
+ if("nutrition")
+ if(prob(50))
+ throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE)
+ else
+ throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE)
+ if("weightless")
+ throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE)
+ if("fire")
+ throw_alert("fire", /obj/screen/alert/fire, override = TRUE)
+ if("temp")
+ if(prob(50))
+ throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE)
+ else
+ throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE)
+ if("pressure")
+ if(prob(50))
+ throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE)
+ else
+ throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE)
+ //BEEP BOOP I AM A ROBOT
+ if("newlaw")
+ throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE)
+ if("locked")
+ throw_alert("locked", /obj/screen/alert/locked, override = TRUE)
+ if("hacked")
+ throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE)
+ if("charge")
+ throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE)
+ sleep(rand(100,200))
+ clear_alert(alert_type, clear_override = TRUE)
if("items")
//Strange items
// to_chat(src, "Traitor Items")
if(!halitem)
halitem = new
var/list/slots_free = list(ui_lhand,ui_rhand)
- if(l_hand) slots_free -= ui_lhand
- if(r_hand) slots_free -= ui_rhand
+ if(l_hand)
+ slots_free -= ui_lhand
+ if(r_hand)
+ slots_free -= ui_rhand
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
- if(!H.belt) slots_free += ui_belt
- if(!H.l_store) slots_free += ui_storage1
- if(!H.r_store) slots_free += ui_storage2
+ if(!H.belt)
+ slots_free += ui_belt
+ if(!H.l_store)
+ slots_free += ui_storage1
+ if(!H.r_store)
+ slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
halitem.layer = 50
@@ -726,7 +990,6 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
qdel(halitem)
if("dangerflash")
//Flashes of danger
-// to_chat(src, "Danger Flash")
if(!halimage)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
@@ -734,31 +997,38 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
- switch(rand(1,3))
+ switch(rand(1,4))
if(1)
-// to_chat(src, "Space")
halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
if(2)
-// to_chat(src, "Fire")
- halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
+ halimage = image('icons/turf/floors/lava.dmi',target,"smooth",TURF_LAYER)
if(3)
-// to_chat(src, "C4")
+ halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER)
+ if(4)
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
- if(client) client.images += halimage
- spawn(rand(10,50)) //Only seen for a brief moment.
- if(client) client.images -= halimage
- halimage = null
+ if(client)
+ client.images += halimage
+ sleep(rand(40,60)) //Only seen for a brief moment.
+ if(client)
+ client.images -= halimage
+ halimage = null
if("death")
- //Fake death
- Sleeping(20)
- hal_crit = 1
- hal_screwyhud = 1
- spawn(rand(50,100))
- SetSleeping(0)
- hal_crit = 0
- hal_screwyhud = 0
+ hal_screwyhud = SCREWYHUD_DEAD
+ SetSleeping(20, no_alert = TRUE)
+ if(prob(50))
+ var/list/dead_people = list()
+ for(var/mob/dead/observer/G in player_list)
+ dead_people += G
+ var/mob/dead/observer/fakemob = pick(dead_people)
+ if(fakemob)
+ sleep(rand(30, 60))
+ to_chat(src, "[fakemob.name] (FOLLOW) [pick("complains", "moans", "whines", "laments", "blubbers", "salts")], \"[pick("rip","welcome [name]","you too?","is the AI malf?",\
+ "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\" ")
+ sleep(rand(50,70))
+ hal_screwyhud = SCREWYHUD_NONE
+ SetSleeping(0)
if("husks")
if(!halbody)
var/list/possible_points = list()
@@ -768,17 +1038,19 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,4))
if(1)
- var/image/body = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ var/image/body = image('icons/mob/human.dmi', target, "husk_s", TURF_LAYER)
var/matrix/M = matrix()
M.Turn(90)
body.transform = M
halbody = body
if(2,3)
- halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ halbody = image('icons/mob/human.dmi', target, "husk_s", TURF_LAYER)
if(4)
- halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
+ halbody = image('icons/mob/alien.dmi', target, "alienother", TURF_LAYER)
- if(client) client.images += halbody
- spawn(rand(50,80)) //Only seen for a brief moment.
- if(client) client.images -= halbody
+ if(client)
+ client.images += halbody
+ spawn(rand(30,50)) //Only seen for a brief moment.
+ if(client)
+ client.images -= halbody
halbody = null
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
index c6b88b78c6c..89c55a65f98 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
@@ -41,7 +41,7 @@
/obj/machinery/bottler/attackby(obj/item/O, mob/user, params)
if(iswrench(O)) //This being before the canUnequip check allows borgs to (un)wrench bottlers in case they need move them to fix stuff
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, "[src] can now be moved. ")
@@ -179,7 +179,7 @@
con_type = "glass bottle"
max_define = MAX_GLASS
mat_ratio = RATIO_GLASS
- else if(istype(S, /obj/item/stack/sheet/mineral/plastic))
+ else if(istype(S, /obj/item/stack/sheet/plastic))
con_type = "plastic bottle"
max_define = MAX_PLAST
mat_ratio = RATIO_PLAST
@@ -213,12 +213,7 @@
for(var/i = 1, i <= slots.len, i++)
var/obj/item/O = slots[i]
if(istype(O, recipe.ingredients[i]))
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
- if(G.seed && G.seed.kitchen_tag == recipe.tags[i])
- number_matches++
- else
- number_matches++
+ number_matches++
if(number_matches == 3)
return recipe
return null
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm b/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm
index be7504afade..85b3452ebfc 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm
@@ -3,7 +3,6 @@
var/name = ""
var/description = ""
var/list/ingredients[3]
- var/list/tags[3]
var/datum/reagent/result = null
@@ -12,12 +11,10 @@
name = "Example"
description = "This is an example."
ingredients = list(thing_1, thing_2, thing_3)
- tags = list(null, "tag_2", null)
result = "water"
The ingredients list must have 3 non-null entries.
-The tags list must have 3 entries, using null where a tag is unused.
-Failing to ensure both lists have EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
+Failing to ensure the list has EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
There is no excuse to do this wrong now that there is an example for you. --FalseIncarnate
*/
@@ -25,62 +22,55 @@ There is no excuse to do this wrong now that there is an example for you. --Fals
/datum/bottler_recipe/Paradise_Punch
name = "Paradise Punch"
description = "Tastes just how you'd think Paradise would if you could bottle it."
- ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown)
- tags = list("grapes", "banana", "cherries")
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/cherries)
result = "paradise_punch"
/datum/bottler_recipe/Applepocalypse
name = "Apple-pocalypse"
description = "If doomsday came in fruit form, it'd probably be apples."
- ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown)
- tags = list("apple", "apple", "apple")
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple)
result = "apple-pocalypse"
/datum/bottler_recipe/Berry_Banned
name = "Berry Banned"
description = "Reason for ban: Excessive Flavor."
- ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown)
- tags = list("berries", "berries", "berries")
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/berries,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries)
result = "berry_banned"
/datum/bottler_recipe/Berry_Banned2
name = "Berry Banned"
description = "Reason for ban: Excessive Flavor."
- ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown)
- tags = list("poisonberries", "poisonberries", "poisonberries")
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison)
result = "berry_banned2"
/datum/bottler_recipe/Blackeye_Brew
name = "Blackeye Brew"
description = "Creamy, smooth flavor, just like the bald heads of the masses. Supposedly aged for 30 years."
ingredients = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane,
/obj/item/weapon/reagent_containers/food/snacks/icecream)
- tags = list(null, "sugarcane", null)
result = "blackeye_brew"
/datum/bottler_recipe/Grape_Granade
name = "Grape Granade"
description = "Exploding with grape flavor and a favorite among ERT members system-wide."
ingredients = list(/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes,
/obj/item/device/flash)
- tags = list(null, "grapes", null)
result = "grape_granade"
/datum/bottler_recipe/Meteor_Malt
name = "Meteor Malt"
description = "Soft drinks have been detected on collision course with your tastebuds."
ingredients = list(/obj/item/weapon/ore,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/wheat,
/obj/item/weapon/ore)
- tags = list(null, "wheat", null)
result = "meteor_malt"
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 0814bf988f4..0b5b2171f86 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -41,6 +41,17 @@
return 1
return 0
+/obj/item/weapon/reagent_containers/food/drinks/MouseDrop(atom/over_object) //CHUG! CHUG! CHUG!
+ var/mob/living/carbon/chugger = over_object
+ if(istype(chugger) && loc == chugger && src == chugger.get_active_hand() && reagents.total_volume)
+ chugger.visible_message("[chugger] raises the [src] to their mouth and starts [pick("chugging","gulping")] it down like [pick("a savage","a mad beast","it's going out of style","there's no tomorrow")]! ", "You start chugging \the [src]. ", "You hear what sounds like gulping. ")
+ while(do_mob(chugger, chugger, 40)) //Between the default time for do_mob and the time it takes for a vampire to suck blood.
+ chugger.eat(src, chugger, 25) //Half of a glass, quarter of a bottle.
+ if(!reagents.total_volume) //Finish in style.
+ chugger.emote("gasp")
+ chugger.visible_message("[chugger] [pick("finishes","downs","polishes off","slams")] the entire [src], what a [pick("savage","monster","champ","beast")]! ", "You finish off the [src]![prob(50) ? " Maybe that wasn't such a good idea..." : ""] ", "You hear a gasp and a clink. ")
+ break
+
/obj/item/weapon/reagent_containers/food/drinks/afterattack(obj/target, mob/user, proximity)
if(!proximity) return
@@ -61,7 +72,7 @@
to_chat(user, " [src] is full. ")
return
- var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
to_chat(user, " You fill [src] with [trans] units of the contents of [target]. ")
else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
@@ -130,7 +141,7 @@
name = "pewter cup"
desc = "Everyone gets a trophy."
icon_state = "pewter_cup"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
force = 1
throwforce = 1
amount_per_transfer_from_this = 5
@@ -143,7 +154,7 @@
name = "gold cup"
desc = "You're winner!"
icon_state = "golden_cup"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 14
throwforce = 10
amount_per_transfer_from_this = 20
@@ -154,7 +165,7 @@
name = "silver cup"
desc = "Best loser!"
icon_state = "silver_cup"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 10
throwforce = 8
amount_per_transfer_from_this = 15
@@ -165,7 +176,7 @@
name = "bronze cup"
desc = "At least you ranked!"
icon_state = "bronze_cup"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 5
throwforce = 4
amount_per_transfer_from_this = 10
@@ -331,4 +342,11 @@
name = "cup"
desc = "A cup with the british flag emblazoned on it."
icon_state = "britcup"
- volume = 30
\ No newline at end of file
+ volume = 30
+
+/obj/item/weapon/reagent_containers/food/drinks/mushroom_bowl
+ name = "mushroom bowl"
+ desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
+ icon = 'icons/obj/lavaland/ash_flora.dmi'
+ icon_state = "mushroom_bowl"
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 53130d972f4..e1a517caaf3 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -130,7 +130,7 @@
throwforce = 5
throw_speed = 3
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
item_state = "beer"
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("stabbed", "slashed", "attacked")
@@ -216,7 +216,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac
name = "Chateau De Baton Premium Cognac"
- desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
+ desc = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
icon_state = "cognacbottle"
list_reagents = list("cognac" = 100)
@@ -228,7 +228,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe
name = "Extra-Strong Absinthe"
- desc = "An strong alcoholic drink brewed and distributed by"
+ desc = "A strong alcoholic drink brewed and distributed by REDACTED."
icon_state = "absinthebottle"
list_reagents = list("absinthe" = 100)
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 0412c93626b..4188afe209a 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -37,11 +37,17 @@
extinguish()
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
+ overlays.Cut()
if(reagents.reagent_list.len)
var/datum/reagent/R = reagents.get_master_reagent()
- icon_state = R.drink_icon
name = R.drink_name
desc = R.drink_desc
+ if(R.drink_icon)
+ icon_state = R.drink_icon
+ else
+ var/image/I = image(icon, "glassoverlay")
+ I.color = mix_color_from_reagents(reagents.reagent_list)
+ overlays += I
else
icon_state = "glass_empty"
name = "glass"
@@ -56,4 +62,7 @@
list_reagents = list("cola" = 50)
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss
- list_reagents = list("devilskiss" = 50)
\ No newline at end of file
+ list_reagents = list("devilskiss" = 50)
+
+/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/alliescocktail
+ list_reagents = list("alliescocktail" = 50)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index dfd89a809da..7087410e6c4 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -372,8 +372,7 @@
overlays += T
/obj/item/weapon/reagent_containers/food/snacks/customizable/Destroy()
- for(var/obj/item/O in ingredients)
- qdel(O)
+ QDEL_LIST(ingredients)
return ..()
/obj/item/weapon/reagent_containers/food/snacks/customizable/examine(mob/user)
diff --git a/code/modules/food_and_drinks/food/meat.dm b/code/modules/food_and_drinks/food/meat.dm
index 4635f6eb9b1..19d8307c906 100644
--- a/code/modules/food_and_drinks/food/meat.dm
+++ b/code/modules/food_and_drinks/food/meat.dm
@@ -44,4 +44,12 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/ham
name = "Ham"
desc = "Taste like bacon."
- list_reagents = list("protein" = 3, "porktonium" = 10)
\ No newline at end of file
+ list_reagents = list("protein" = 3, "porktonium" = 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/meat/meatwheat
+ name = "meatwheat clump"
+ desc = "This doesn't look like meat, but your standards aren't that high to begin with."
+ list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5)
+ filling_color = rgb(150, 0, 0)
+ icon_state = "meatwheat_clump"
+ bitesize = 4
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index dd5884606d0..cbb049c883c 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -11,7 +11,9 @@
var/eatverb
var/wrapped = 0
var/dried_type = null
+ var/dry = 0
var/cooktype[0]
+ var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving
//Placeholder for effect that trigger on eating that aren't tied to reagents.
@@ -25,12 +27,8 @@
user.visible_message("[user] finishes eating \the [src]. ")
user.unEquip(src) //so icons update :[
Post_Consume(M)
- if(trash)
- if(ispath(trash,/obj/item))
- var/obj/item/TrashItem = new trash(user)
- user.put_in_hands(TrashItem)
- else if(istype(trash,/obj/item))
- user.put_in_hands(trash)
+ var/obj/item/trash_item = generate_trash(usr)
+ usr.put_in_hands(trash_item)
qdel(src)
return
@@ -132,7 +130,7 @@
istype(W, /obj/item/weapon/hatchet) \
)
inaccurate = 1
- else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
+ else if(W.w_class <= WEIGHT_CLASS_SMALL && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
if(!iscarbon(user))
return 1
to_chat(user, "You slip [W] inside [src]. ")
@@ -173,6 +171,19 @@
return
+/obj/item/weapon/reagent_containers/food/snacks/proc/generate_trash(atom/location)
+ if(trash)
+ if(ispath(trash, /obj/item))
+ . = new trash(location)
+ trash = null
+ return
+ else if(istype(trash, /obj/item))
+ var/obj/item/trash_item = trash
+ trash_item.forceMove(location)
+ . = trash
+ trash = null
+ return
+
/obj/item/weapon/reagent_containers/food/snacks/Destroy()
if(contents)
for(var/atom/movable/something in contents)
@@ -706,6 +717,14 @@
bitesize = 3
list_reagents = list("nutriment" = 6, "vitamin" = 1)
+/obj/item/weapon/reagent_containers/food/snacks/baseballburger
+ name = "home run baseball burger"
+ desc = "It's still warm. The steam coming off of it looks like baseball."
+ icon_state = "baseball"
+ filling_color = "#CD853F"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
/obj/item/weapon/reagent_containers/food/snacks/omelette
name = "Omelette Du Fromage"
desc = "That's all you can say!"
@@ -887,6 +906,12 @@
junkiness = 25
list_reagents = list("protein" = 1, "sugar" = 3)
+/obj/item/weapon/reagent_containers/food/snacks/sosjerky/healthy
+ name = "homemade beef jerky"
+ desc = "Homemade beef jerky made from the finest space cows."
+ list_reagents = list("nutriment" = 3, "vitamin" = 1)
+ junkiness = 0
+
/obj/item/weapon/reagent_containers/food/snacks/pistachios
name = "Pistachios"
icon_state = "pistachios"
@@ -905,6 +930,12 @@
junkiness = 25
list_reagents = list("plantmatter" = 2, "sugar" = 4)
+/obj/item/weapon/reagent_containers/food/snacks/no_raisin/healthy
+ name = "homemade raisins"
+ desc = "homemade raisins, the best in all of spess."
+ list_reagents = list("nutriment" = 3, "vitamin" = 2)
+ junkiness = 0
+
/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie
name = "Space Twinkie"
icon_state = "space_twinkie"
@@ -1187,86 +1218,37 @@
var/monkey_type = "Monkey"
list_reagents = list("nutriment" = 2)
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity)
- if(!proximity)
- return
- if(istype(O,/obj/structure/sink) && !wrapped)
- to_chat(user, "You place [src] under a stream of water... ")
- user.drop_item()
- forceMove(get_turf(O))
- return Expand()
- if(istype(O, /obj/machinery/computer/camera_advanced/xenobio))
- var/obj/machinery/computer/camera_advanced/xenobio/X = O
- X.monkeys++
- to_chat(user, "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored. ")
- qdel(src)
- return
- ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user)
- if(wrapped)
- Unwrap(user)
-
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
if(volume >= 5)
return Expand()
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
- if(wrapped)
- ..()
- return
- if(do_after(user, 40, target = source))
- return 1
+ user.drop_item()
+ forceMove(get_turf(source))
+ return 1
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
if(isnull(gcDestroyed))
visible_message("[src] expands! ")
- new/mob/living/carbon/human(get_turf(src),monkey_type)
+ new/mob/living/carbon/human(get_turf(src), monkey_type)
qdel(src)
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user)
- icon_state = "monkeycube"
- desc = "Just add water!"
- to_chat(user, "You unwrap the cube. ")
- wrapped = 0
-
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped
- desc = "Still wrapped in some paper."
- icon_state = "monkeycubewrap"
- wrapped = 1
-
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube
name = "farwa cube"
monkey_type = "Farwa"
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube
- name = "farwa cube"
- monkey_type = "Farwa"
-
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube
name = "wolpin cube"
monkey_type = "Wolpin"
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube
- name = "wolpin cube"
- monkey_type = "Wolpin"
-
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube
name = "stok cube"
monkey_type = "Stok"
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube
- name = "stok cube"
- monkey_type = "Stok"
-
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube
name = "neaera cube"
monkey_type = "Neara"
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube
- name = "neaera cube"
- monkey_type = "Neara"
-
/obj/item/weapon/reagent_containers/food/snacks/spellburger
name = "Spell Burger"
@@ -2472,4 +2454,27 @@
trash = /obj/item/trash/tastybread
filling_color = "#A66829"
junkiness = 20
- list_reagents = list("nutriment" = 2, "sugar" = 4)
\ No newline at end of file
+ list_reagents = list("nutriment" = 2, "sugar" = 4)
+
+/obj/item/weapon/reagent_containers/food/snacks/yakiimo
+ name = "yaki imo"
+ desc = "Made with roasted sweet potatoes!"
+ icon_state = "yakiimo"
+ trash = /obj/item/trash/plate
+ list_reagents = list("nutriment" = 5, "vitamin" = 4)
+ filling_color = "#8B1105"
+
+/obj/item/weapon/reagent_containers/food/snacks/roastparsnip
+ name = "roast parsnip"
+ desc = "Sweet and crunchy."
+ icon_state = "roastparsnip"
+ trash = /obj/item/trash/plate
+ list_reagents = list("nutriment" = 3, "vitamin" = 4)
+ filling_color = "#FF5500"
+
+/obj/item/weapon/reagent_containers/food/snacks/tatortot
+ name = "tator tot"
+ desc = "A large fried potato nugget that may or may not try to valid you."
+ icon_state = "tatortot"
+ list_reagents = list("nutriment" = 4)
+ filling_color = "FFD700"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
index 381525a13ae..1c8db0d9b20 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
@@ -41,6 +41,8 @@
return 0
if(istype(check, /obj/item/weapon/reagent_containers/food/snacks))
return 1
+ if(istype(check, /obj/item/weapon/grab))
+ return special_attack(check, user)
to_chat(user, "You can only process food! ")
return 0
@@ -144,6 +146,9 @@
turnoff(I)
//qdel(I)
+/obj/machinery/cooker/proc/special_attack(obj/item/weapon/grab/G, mob/user)
+ return 0
+
// MAKE SURE TO OVERRIDE THESE ON THE MACHINE IF IT HAS SPECIAL FOOD INTERACTIONS!
// FAILURE TO OVERRIDE WILL RESULT IN FAILURE TO PROPERLY HANDLE SPECIAL INTERACTIONS! --FalseIncarnate
/obj/machinery/cooker/proc/checkSpecials(obj/item/I)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 73607d4e3ab..5862de7d6ca 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -43,16 +43,34 @@
var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src))
return type
+/obj/machinery/cooker/deepfryer/special_attack(obj/item/weapon/grab/G, mob/user)
+ if(ishuman(G.affecting))
+ if(G.state < GRAB_AGGRESSIVE)
+ to_chat(user, "You need a better grip to do that! ")
+ return 0
+ var/mob/living/carbon/human/C = G.affecting
+ var/obj/item/organ/external/head/head = C.get_organ("head")
+ if(!head)
+ to_chat(user, "This person doesn't have a head! ")
+ return 0
+ C.visible_message("[user] dunks [C]'s face into [src]! ", \
+ "[user] dunks your face into [src]! ")
+ C.emote("scream")
+ user.changeNext_move(CLICK_CD_MELEE)
+ C.apply_damage(25, BURN, "head") //25 fire damage and disfigurement because your face was just deep fried!
+ head.disfigure("burn")
+ add_logs(user, G.affecting, "deep-fried", addition="'s face")
+ qdel(G) //Removes the grip so the person MIGHT have a small chance to run the fuck away and to prevent rapid dunks.
+ return 0
+ return 0
+
+
/obj/machinery/cooker/deepfryer/checkSpecials(obj/item/I)
if(!I)
return 0
for(var/Type in subtypesof(/datum/deepfryer_special))
var/datum/deepfryer_special/P = new Type()
- if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I
- if(G.seed.kitchen_tag != P.input)
- continue
- else if(!istype(I, P.input))
+ if(!istype(I, P.input))
continue
return P
return 0
@@ -80,7 +98,7 @@
output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp
/datum/deepfryer_special/banana
- input = "banana"
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana
/datum/deepfryer_special/potato_chips
@@ -88,7 +106,7 @@
output = /obj/item/weapon/reagent_containers/food/snacks/chips
/datum/deepfryer_special/corn_chips
- input = "corn"
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/corn
output = /obj/item/weapon/reagent_containers/food/snacks/cornchips
/datum/deepfryer_special/fried_tofu
@@ -97,4 +115,12 @@
/datum/deepfryer_special/chimichanga
input = /obj/item/weapon/reagent_containers/food/snacks/burrito
- output = /obj/item/weapon/reagent_containers/food/snacks/chimichanga
\ No newline at end of file
+ output = /obj/item/weapon/reagent_containers/food/snacks/chimichanga
+
+/datum/deepfryer_special/fries
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
+ output = /obj/item/weapon/reagent_containers/food/snacks/fries
+
+/datum/deepfryer_special/carrotfries
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot/wedges
+ output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 31d7a9d0003..efdd173bed9 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -28,7 +28,8 @@
if(contents.len)
for(var/atom/movable/A in contents)
A.loc = get_turf(src)
- if(occupant) occupant = null
+ if(occupant)
+ occupant = null
return ..()
/obj/machinery/gibber/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts.
@@ -122,7 +123,7 @@
return
if(!ishuman(victim) || issmall(victim))
- to_chat(user, "This is not suitable for the [src]]! ")
+ to_chat(user, "This is not suitable for the [src]! ")
return
if(victim.abiotic(1))
@@ -132,7 +133,7 @@
user.visible_message("[user] starts to put [victim] into the [src]! ")
add_fingerprint(user)
if(do_after(user, 30, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
- user.visible_message("[user] stuffs [victim] into the [src]]! ")
+ user.visible_message("[user] stuffs [victim] into the [src]! ")
victim.forceMove(src)
occupant = victim
@@ -258,8 +259,8 @@
new /obj/effect/decal/cleanable/blood/gibs(src)
if(!UserOverride)
- occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [key_name(user)]" //One shall not simply gib a mob unnoticed!
- user.attack_log += "\[[time_stamp()]\] Gibbed [key_name(occupant)]"
+ occupant.create_attack_log("Was gibbed by [key_name(user)]") //One shall not simply gib a mob unnoticed!)
+ user.create_attack_log("Gibbed [key_name(occupant)]")
if(occupant.ckey)
msg_admin_attack("[key_name_admin(user)] gibbed [key_name_admin(occupant)]")
@@ -270,7 +271,7 @@
occupant.LAssailant = user
else //this looks ugly but it's better than a copy-pasted startgibbing proc override
- occupant.attack_log += "\[[time_stamp()]\] Was gibbed by an autogibber (\the [src]) "
+ occupant.create_attack_log("Was gibbed by an autogibber (\the [src]) ")
occupant.emote("scream")
playsound(get_turf(src), 'sound/goonstation/effects/gib.ogg', 50, 1)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm
index 8b9ac0cd27c..1a1dd34196d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm
@@ -43,3 +43,19 @@
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
E += M.rating
efficiency = round((E/2), 1) // There's 2 lasers, so halve the effect on the efficiency to keep it balanced
+
+/obj/machinery/kitchen_machine/grill/special_attack(obj/item/weapon/grab/G, mob/user)
+ if(ishuman(G.affecting))
+ if(G.state < GRAB_AGGRESSIVE)
+ to_chat(user, "You need a better grip to do that! ")
+ return 0
+ var/mob/living/carbon/human/C = G.affecting
+ C.visible_message("[user] forces [C] onto [src], searing [C]'s body! ", \
+ "[user] forces you onto [src]! It burns! ")
+ C.emote("scream")
+ user.changeNext_move(CLICK_CD_MELEE)
+ C.adjustFireLoss(30)
+ add_logs(user, G.affecting, "burned", src)
+ qdel(G) //Removes the grip to prevent rapid sears and give you a chance to run
+ return 0
+ return 0
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm
index 19da4fb85ac..a6401446767 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm
@@ -179,7 +179,7 @@ var/list/ingredients_source = list(
return
if(href_list["dispense"])
dispense_flavour = text2num(href_list["dispense"])
- visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.")
+ visible_message("[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream. ")
if(href_list["cone"])
var/dispense_cone = text2num(href_list["cone"])
diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
index 03ceb5c0034..edf714d0f21 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
@@ -4,27 +4,29 @@
icon = 'icons/obj/kitchen.dmi'
icon_state = "juicer1"
layer = 2.9
- density = 0
+ density = 1
anchored = 0
use_power = 1
idle_power_usage = 5
active_power_usage = 100
+ pass_flags = PASSTABLE
var/obj/item/weapon/reagent_containers/beaker = null
- var/global/list/allowed_items = list(
+ var/global/list/allowed_items = list (
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = "tomatojuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = "carrotjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = "grapejuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green = "grapejuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = "banana",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/potato = "potato",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = "lemonjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = "orangejuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = "limejuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = "watermelonjuice",
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice",
- /obj/item/weapon/reagent_containers/food/snacks/grown = "water",
- )
-
- var/global/list/allowed_tags = list (
- "tomato" = "tomatojuice",
- "carrot" = "carrotjuice",
- "berries" = "berryjuice",
- "banana" = "banana",
- "potato" = "potato",
- "lemon" = "lemonjuice",
- "orange" = "orangejuice",
- "lime" = "limejuice",
- "poisonberries" = "poisonberryjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = "poisonberryjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries = "berryjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice",
+ /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice",
)
/obj/machinery/juicer/New()
@@ -135,23 +137,18 @@
beaker = null
update_icon()
-/obj/machinery/juicer/proc/get_juice_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/watermelonslice))
- return "watermelonjuice"
- else if(istype(O, /obj.item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
- for(var/i in allowed_tags)
- if(G.seed.kitchen_tag == allowed_tags[i])
- return allowed_tags[i]
- return "water"
+/obj/machinery/juicer/proc/get_juice_id(obj/item/weapon/reagent_containers/food/snacks/grown/O)
+ for (var/i in allowed_items)
+ if (istype(O, i))
+ return allowed_items[i]
-/obj/machinery/juicer/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
- if(!istype(O))
+/obj/machinery/juicer/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O)
+ if(!istype(O) || !O.seed)
return 5
- else if(O.potency == -1)
+ else if (O.seed.potency == -1)
return 5
else
- return round(5*sqrt(O.potency))
+ return round(5*sqrt(O.seed.potency))
/obj/machinery/juicer/proc/juice()
power_change() //it is a portable machine
@@ -167,19 +164,21 @@
if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
-/obj/structure/closet/crate/juice
- New()
- ..()
- new/obj/machinery/juicer(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
- new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
\ No newline at end of file
+/obj/structure/closet/crate/juice/New()
+ ..()
+ new/obj/machinery/juicer(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
+ new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index ef7591e3955..e09198cb4e9 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -8,7 +8,7 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- flags = OPENCONTAINER | NOREACT
+ flags = OPENCONTAINER
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
@@ -33,6 +33,7 @@
/obj/machinery/kitchen_machine/New()
create_reagents(100)
+ reagents.set_reacting(FALSE)
if(!available_recipes)
available_recipes = new
acceptable_items = new
@@ -45,7 +46,7 @@
acceptable_items |= item
for(var/reagent in recipe.reagents)
acceptable_reagents |= reagent
- if(recipe.items || recipe.fruit)
+ if(recipe.items)
max_n_of_items = max(max_n_of_items,recipe.count_n_items())
else
qdel(recipe)
@@ -64,7 +65,7 @@
if(exchange_parts(user, O))
return
if(!broken && istype(O, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, "\The [src] can now be moved. ")
@@ -82,7 +83,7 @@
"[user] starts to fix part of \the [src]. ", \
"You start to fix part of \the [src]. " \
)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] fixes part of \the [src]. ", \
"You have fixed part of \the [src]. " \
@@ -93,7 +94,7 @@
"[user] starts to fix part of \the [src]. ", \
"You start to fix part of \the [src]. " \
)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] fixes \the [src]. ", \
"You have fixed \the [src]. " \
@@ -111,7 +112,7 @@
"[user] starts to clean \the [src]. ", \
"You start to clean \the [src]. " \
)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] has cleaned \the [src]. ", \
"You have cleaned \the [src]. " \
@@ -154,9 +155,7 @@
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = O
- to_chat(user, "This is ridiculous. You can not fit \the [G.affecting] in this [src]. ")
- return 1
+ return special_attack(O, user)
else
to_chat(user, "You have no idea what you can cook with this [O]. ")
return 1
@@ -169,6 +168,10 @@
user.set_machine(src)
interact(user)
+/obj/machinery/kitchen_machine/proc/special_attack(obj/item/weapon/grab/G, mob/user)
+ to_chat(user, "This is ridiculous. You can not fit [G.affecting] in this [src]. ")
+ return 0
+
/********************
* Machine Menu *
********************/
diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm
index c709fdf0b5e..5c1ed4ac6df 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm
@@ -43,3 +43,25 @@
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
E += M.rating
efficiency = round((E/2), 1) // There's 2 lasers, so halve the effect on the efficiency to keep it balanced
+
+/obj/machinery/kitchen_machine/oven/special_attack(obj/item/weapon/grab/G, mob/user)
+ if(ishuman(G.affecting))
+ if(G.state < GRAB_AGGRESSIVE)
+ to_chat(user, "You need a better grip to do that! ")
+ return 0
+ var/mob/living/carbon/human/C = G.affecting
+ var/obj/item/organ/external/head/head = C.get_organ("head")
+ if(!head)
+ to_chat(user, "This person doesn't have a head! ")
+ return 0
+ C.visible_message("[user] bashes [C]'s head in [src]'s door! ", \
+ "[user] bashes your head in [src]'s door! It feels rather hot in the oven! ")
+ C.emote("scream")
+ user.changeNext_move(CLICK_CD_MELEE)
+ C.apply_damage(5, BURN, "head") //5 fire damage, 15 brute damage, and weakening because your head was just in a hot oven with the door bashing into your neck!
+ C.apply_damage(15, BRUTE, "head")
+ C.Weaken(2)
+ add_logs(user, G.affecting, "smashed", addition="'s head on [src]")
+ qdel(G) //Removes the grip to prevent rapid bashes. With the weaken, you PROBABLY can't run unless they are slow to grab you again...
+ return 0
+ return 0
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 5183fe6a4fa..38edb2e2174 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -71,21 +71,30 @@
input = /obj/item/weapon/reagent_containers/food/snacks/meat
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
-/datum/food_processor_process/potato
- input = "potato"
- output = /obj/item/weapon/reagent_containers/food/snacks/fries
+/datum/food_processor_process/sweetpotato
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet
+ output = /obj/item/weapon/reagent_containers/food/snacks/yakiimo
-/datum/food_processor_process/carrot
- input = "carrot"
- output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries
+/datum/food_processor_process/potato
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato
+ output = /obj/item/weapon/reagent_containers/food/snacks/tatortot
/datum/food_processor_process/soybeans
- input = "soybeans"
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
output = /obj/item/weapon/reagent_containers/food/snacks/soydope
/datum/food_processor_process/spaghetti
input = /obj/item/weapon/reagent_containers/food/snacks/doughslice
output = /obj/item/weapon/reagent_containers/food/snacks/spagetti
+
+/datum/food_processor_process/parsnip
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip
+ output = /obj/item/weapon/reagent_containers/food/snacks/roastparsnip
+
+/datum/food_processor_process/carrot
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot
+ output = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot/wedges
+
/////////////////////////
///END OBJECT RECIPIES///
/////////////////////////
@@ -142,14 +151,10 @@
//END RECIPE DATUMS
-/obj/machinery/processor/proc/select_recipe(var/X)
+/obj/machinery/processor/proc/select_recipe(X)
for(var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob)
var/datum/food_processor_process/P = new Type()
- if(istype(X, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = X
- if(G.seed.kitchen_tag != P.input)
- continue
- else if(!istype(X, P.input))
+ if(!istype(X, P.input))
continue
return P
return 0
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 149744675a9..6b8d9cebd26 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -10,7 +10,6 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- flags = NOREACT
var/max_n_of_items = 1500
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
@@ -21,10 +20,14 @@
var/locked = 0
var/scan_id = 1
var/is_secure = 0
+ var/can_dry = FALSE
+ var/drying = FALSE
var/datum/wires/smartfridge/wires = null
/obj/machinery/smartfridge/New()
..()
+ create_reagents()
+ reagents.set_reacting(FALSE)
component_parts = list()
var/obj/item/weapon/circuitboard/smartfridge/board = new(null)
board.set_type(type)
@@ -47,14 +50,13 @@
wires = new/datum/wires/smartfridge(src)
/obj/machinery/smartfridge/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
for(var/atom/movable/A in contents)
A.forceMove(loc)
return ..()
/obj/machinery/smartfridge/proc/accept_check(obj/item/O)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/))
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/) || istype(O,/obj/item/weapon/grown/))
return 1
return 0
@@ -82,7 +84,7 @@
return 1
if(istype(O,/obj/item/weapon/storage/pill_bottle/))
return 1
- if(istype(O,/obj/item/weapon/reagent_containers/food/pill/))
+ if(ispill(O))
return 1
return 0
@@ -108,7 +110,7 @@
return 1
if(istype(O,/obj/item/weapon/storage/pill_bottle/))
return 1
- if(istype(O,/obj/item/weapon/reagent_containers/food/pill/))
+ if(ispill(O))
return 1
return 0
@@ -192,14 +194,15 @@
* Item Adding
********************/
-/obj/machinery/smartfridge/attackby(obj/item/O, mob/user)
- if(istype(O, /obj/item/weapon/screwdriver) && anchored)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
- panel_open = !panel_open
- to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
- overlays.Cut()
- if(panel_open)
- overlays += image(icon, "[initial(icon_state)]-panel")
+/obj/machinery/smartfridge/default_deconstruction_screwdriver(mob/user, obj/item/weapon/screwdriver/S)
+ . = ..(user, icon_state, icon_state, S)
+
+ overlays.Cut()
+ if(panel_open)
+ overlays += image(icon, "[initial(icon_state)]-panel")
+
+/obj/machinery/smartfridge/attackby(obj/item/O, var/mob/user)
+ if(default_deconstruction_screwdriver(user, O))
return
if(exchange_parts(user, O))
@@ -305,7 +308,7 @@
to_chat(user, "Some items are refused. ")
nanomanager.update_uis(src)
-/obj/machinery/smartfridge/secure/emag_act(user)
+/obj/machinery/smartfridge/secure/emag_act(mob/user)
emagged = 1
locked = -1
to_chat(user, "You short out the product lock on [src].")
@@ -330,6 +333,8 @@
data["shoot_inventory"] = shoot_inventory
data["locked"] = locked
data["secure"] = is_secure
+ data["can_dry"] = can_dry
+ data["drying"] = drying
var/list/items[0]
for(var/i=1 to length(item_quants))
@@ -370,6 +375,7 @@
for(var/obj/O in contents)
if(O.name == K)
O.forceMove(loc)
+ update_icon()
i--
if(i <= 0)
return 1
@@ -392,6 +398,7 @@
if(T.name == O)
T.forceMove(loc)
throw_item = T
+ update_icon()
break
break
if(!throw_item)
@@ -401,6 +408,134 @@
visible_message("[src] launches [throw_item.name] at [target.name]! ")
return 1
+// ----------------------------
+// Drying Rack 'smartfridge'
+// ----------------------------
+/obj/machinery/smartfridge/drying_rack
+ name = "drying rack"
+ desc = "A wooden contraption, used to dry plant products, food and leather."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "drying_rack_on"
+ use_power = 1
+ idle_power_usage = 5
+ active_power_usage = 200
+ icon_on = "drying_rack_on"
+ icon_off = "drying_rack"
+ can_dry = TRUE
+
+/obj/machinery/smartfridge/drying_rack/New()
+ ..()
+ if(component_parts && component_parts.len)
+ component_parts.Cut()
+ component_parts = null
+
+/obj/machinery/smartfridge/drying_rack/Destroy()
+ new /obj/item/stack/sheet/wood(loc, 10)
+ return ..()
+
+/obj/machinery/smartfridge/drying_rack/RefreshParts()
+ return
+
+/obj/machinery/smartfridge/drying_rack/default_deconstruction_screwdriver()
+ return
+
+/obj/machinery/smartfridge/drying_rack/exchange_parts()
+ return
+
+/obj/machinery/smartfridge/drying_rack/spawn_frame()
+ return
+
+/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 1)
+ ..()
+
+/obj/machinery/smartfridge/drying_rack/Topic(href, href_list)
+ if(..())
+ return 1
+ if(href_list["dryingOn"])
+ drying = TRUE
+ use_power = 2
+ update_icon()
+ return 1
+
+ if(href_list["dryingOff"])
+ drying = FALSE
+ use_power = 1
+ update_icon()
+ return 1
+ return 0
+
+/obj/machinery/smartfridge/drying_rack/power_change()
+ if(powered() && anchored)
+ stat &= ~NOPOWER
+ else
+ stat |= NOPOWER
+ toggle_drying(TRUE)
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/load(obj/I, mob/user) //For updating the filled overlay
+ if(..())
+ update_icon()
+ return 1
+
+/obj/machinery/smartfridge/drying_rack/update_icon()
+ ..()
+ overlays.Cut()
+ if(drying)
+ overlays += "drying_rack_drying"
+ if(contents.len)
+ overlays += "drying_rack_filled"
+
+/obj/machinery/smartfridge/drying_rack/process()
+ ..()
+ if(drying)
+ if(rack_dry())//no need to update unless something got dried
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O)
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks))
+ var/obj/item/weapon/reagent_containers/food/snacks/S = O
+ if(S.dried_type)
+ return TRUE
+ if(istype(O, /obj/item/stack/sheet/wetleather))
+ return TRUE
+ return FALSE
+
+/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff)
+ if(drying || forceoff)
+ drying = FALSE
+ use_power = 1
+ else
+ drying = TRUE
+ use_power = 2
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/proc/rack_dry()
+ for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
+ if(S.dried_type == S.type)//if the dried type is the same as the object's type, don't bother creating a whole new item...
+ S.color = "#ad7257"
+ S.dry = TRUE
+ item_quants[S.name]--
+ S.forceMove(get_turf(src))
+ else
+ var/dried = S.dried_type
+ new dried(loc)
+ item_quants[S.name]--
+ qdel(S)
+ nanomanager.update_uis(src)
+ return TRUE
+ for(var/obj/item/stack/sheet/wetleather/WL in contents)
+ var/obj/item/stack/sheet/leather/L = new(loc)
+ L.amount = WL.amount
+ item_quants[WL.name]--
+ qdel(WL)
+ nanomanager.update_uis(src)
+ return TRUE
+ return FALSE
+
+/obj/machinery/smartfridge/drying_rack/emp_act(severity)
+ ..()
+ atmos_spawn_air(SPAWN_HEAT)
+
/************************
* Secure SmartFridges
*************************/
@@ -413,4 +548,4 @@
to_chat(usr, "Access denied. ")
nanomanager.update_uis(src)
return 0
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/recipes_candy.dm b/code/modules/food_and_drinks/recipes/recipes_candy.dm
index 414eee38354..7c8a1ba478b 100644
--- a/code/modules/food_and_drinks/recipes/recipes_candy.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_candy.dm
@@ -27,14 +27,14 @@
/datum/recipe/candy/fudge_peanut
reagents = list("sugar" = 5, "milk" = 5)
- items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
- fruit = list("peanuts" = 3)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts, /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut
/datum/recipe/candy/fudge_cherry
reagents = list("sugar" = 5, "milk" = 5)
- items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
- fruit = list("cherries" = 3)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, /obj/item/weapon/reagent_containers/food/snacks/grown/cherries,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/cherries, /obj/item/weapon/reagent_containers/food/snacks/grown/cherries)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cherry
/datum/recipe/candy/fudge_cookies_n_cream
@@ -50,8 +50,8 @@
items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts
)
- fruit = list("peanuts" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle
/datum/recipe/candy/fudge
@@ -319,10 +319,7 @@
/datum/recipe/candy/gummybear_wtf2
reagents = list()
- fruit = list("ambrosia" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf
// ***********************************************************
@@ -386,10 +383,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
/datum/recipe/candy/gummyworm_wtf2
- fruit = list("ambrosia" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
// ***********************************************************
@@ -464,6 +458,7 @@
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/popcorn,
+ /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn
@@ -489,10 +484,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
/datum/recipe/candy/jellybean_wtf2
- fruit = list("ambrosia" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
// ***********************************************************
diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
index 2840c099ea6..2fe0ccc28dd 100644
--- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
@@ -10,11 +10,8 @@
result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg
/datum/recipe/microwave/dionaroast
- fruit = list("apple" = 1)
reagents = list("facid" = 5) //It dissolves the carapace. Still poisonous, though.
- items = list(
- /obj/item/weapon/holder/diona,
- )
+ items = list(/obj/item/weapon/holder/diona, /obj/item/weapon/reagent_containers/food/snacks/grown/apple)
result = /obj/item/weapon/reagent_containers/food/snacks/dionaroast
/datum/recipe/microwave/jellydonut
@@ -129,6 +126,13 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/mimeburger
+/datum/recipe/microwave/baseballburger
+ items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/bun,
+ /obj/item/weapon/melee/baseball_bat
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/baseballburger
+
/datum/recipe/microwave/hotdog
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
@@ -150,16 +154,16 @@
result = /obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket
/datum/recipe/microwave/eggplantparm
- fruit = list("eggplant" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant
)
result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm
/datum/recipe/microwave/soylenviridians
- fruit = list("soybeans" = 1)
reagents = list("flour" = 10)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans)
result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians
/datum/recipe/microwave/soylentgreen
@@ -185,25 +189,27 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyfries
/datum/recipe/microwave/cubancarp
- fruit = list("chili" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/carpmeat,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/chili
)
result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp
/datum/recipe/microwave/popcorn
- fruit = list("corn" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/corn)
result = /obj/item/weapon/reagent_containers/food/snacks/popcorn
/datum/recipe/microwave/spacylibertyduff
reagents = list("water" = 5, "vodka" = 5)
- fruit = list("libertycap" = 3)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap)
result = /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff
/datum/recipe/microwave/amanitajelly
reagents = list("water" = 5, "vodka" = 5)
- fruit = list("amanita" = 3)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita)
result = /obj/item/weapon/reagent_containers/food/snacks/amanitajelly
/datum/recipe/microwave/amanitajelly/make_food(obj/container)
@@ -213,23 +219,18 @@
/datum/recipe/microwave/meatballsoup
reagents = list("water" = 10)
- fruit = list("potato" = 1, "carrot" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/meatball ,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/grown/potato, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot)
result = /obj/item/weapon/reagent_containers/food/snacks/meatballsoup
/datum/recipe/microwave/vegetablesoup
reagents = list("water" = 10)
- fruit = list("carrot" = 1, "corn" = 1, "eggplant" = 1, "potato" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/potato, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/corn, /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant)
result = /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup
/datum/recipe/microwave/nettlesoup
reagents = list("water" = 10)
- fruit = list("nettle" = 1, "potato" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/egg,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/grown/nettle/basic, /obj/item/weapon/reagent_containers/food/snacks/grown/potato)
result = /obj/item/weapon/reagent_containers/food/snacks/nettlesoup
/datum/recipe/microwave/wishsoup
@@ -237,17 +238,11 @@
result= /obj/item/weapon/reagent_containers/food/snacks/wishsoup
/datum/recipe/microwave/hotchili
- fruit = list("chili" = 1, "tomato" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
result = /obj/item/weapon/reagent_containers/food/snacks/hotchili
/datum/recipe/microwave/coldchili
- fruit = list("icechili" = 1, "tomato" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
result = /obj/item/weapon/reagent_containers/food/snacks/coldchili
/datum/recipe/microwave/spellburger
@@ -275,10 +270,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger
/datum/recipe/microwave/enchiladas
- fruit = list("chili" = 2, "corn" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/cutlet,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/corn)
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
/datum/recipe/microwave/burrito
@@ -292,11 +284,8 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burrito
/datum/recipe/microwave/monkeysdelight
- fruit = list("banana" = 1)
reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/monkeycube
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube, /obj/item/weapon/reagent_containers/food/snacks/grown/banana)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight
/datum/recipe/microwave/fishandchips
@@ -323,15 +312,14 @@
/datum/recipe/microwave/tomatosoup
reagents = list("water" = 10)
- fruit = list("tomato" = 2)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
result = /obj/item/weapon/reagent_containers/food/snacks/tomatosoup
/datum/recipe/microwave/stew
reagents = list("water" = 10)
- fruit = list("tomato" = 1, "potato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat,
- )
+ items= list(/obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/potato,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, /obj/item/weapon/reagent_containers/food/snacks/meat)
result = /obj/item/weapon/reagent_containers/food/snacks/stew
/datum/recipe/microwave/slimetoast
@@ -359,11 +347,8 @@
result = /obj/item/weapon/reagent_containers/food/snacks/milosoup
/datum/recipe/microwave/stewedsoymeat
- fruit = list("carrot" = 1, "tomato" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/soydope,
- /obj/item/weapon/reagent_containers/food/snacks/soydope,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/soydope, /obj/item/weapon/reagent_containers/food/snacks/soydope,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
/datum/recipe/microwave/boiledspagetti
@@ -383,17 +368,12 @@
/datum/recipe/microwave/pastatomato
reagents = list("water" = 5)
- fruit = list("tomato" = 2)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/spagetti,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato
/datum/recipe/microwave/poppypretzel
- items = list(
- /obj/item/seeds/poppyseed,
- /obj/item/weapon/reagent_containers/food/snacks/dough,
- )
+ items = list(/obj/item/seeds/poppy, /obj/item/weapon/reagent_containers/food/snacks/dough)
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
/datum/recipe/microwave/meatballspagetti
@@ -418,19 +398,19 @@
/datum/recipe/microwave/superbiteburger
reagents = list("sodiumchloride" = 5, "blackpepper" = 5)
- fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/boiledegg,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
)
result = /obj/item/weapon/reagent_containers/food/snacks/superbiteburger
/datum/recipe/microwave/candiedapple
reagents = list("water" = 5, "sugar" = 5)
- fruit = list("apple" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/apple)
result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple
/datum/recipe/microwave/slimeburger
@@ -473,19 +453,18 @@ datum/recipe/microwave/slimesandwich
/datum/recipe/microwave/bloodsoup
reagents = list("blood" = 10)
- fruit = list("bloodtomato" = 2)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood)
result = /obj/item/weapon/reagent_containers/food/snacks/bloodsoup
/datum/recipe/microwave/slimesoup
reagents = list("water" = 10, "slimejelly" = 5)
- items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/slimesoup
/datum/recipe/microwave/clownstears
reagents = list("water" = 10)
- fruit = list("banana" = 1)
items = list(
/obj/item/weapon/ore/bananium,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana
)
result = /obj/item/weapon/reagent_containers/food/snacks/clownstears
@@ -519,25 +498,26 @@ datum/recipe/microwave/slimesandwich
/datum/recipe/microwave/mushroomsoup
reagents = list("water" = 5, "milk" = 5)
- fruit = list("mushroom" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom)
result = /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup
/datum/recipe/microwave/chawanmushi
reagents = list("water" = 5, "soysauce" = 5)
- fruit = list("mushroom" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
)
result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi
/datum/recipe/microwave/beetsoup
reagents = list("water" = 10)
- fruit = list("whitebeet" = 1, "cabbage" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage)
result = /obj/item/weapon/reagent_containers/food/snacks/beetsoup
/datum/recipe/microwave/herbsalad
- fruit = list("ambrosia" = 3, "apple" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/apple)
result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
/datum/recipe/microwave/herbsalad/make_food(obj/container)
@@ -546,14 +526,14 @@ datum/recipe/microwave/slimesandwich
return being_cooked
/datum/recipe/microwave/aesirsalad
- fruit = list("ambrosiadeus" = 3, "goldapple" = 1)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold)
result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad
/datum/recipe/microwave/validsalad
- fruit = list("ambrosia" = 3, "potato" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/meatball,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/potato,
+ /obj/item/weapon/reagent_containers/food/snacks/meatball)
result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
/datum/recipe/microwave/validsalad/make_food(obj/container)
@@ -565,15 +545,12 @@ datum/recipe/microwave/slimesandwich
/datum/recipe/microwave/wrap
reagents = list("soysauce" = 10)
- fruit = list("cabbage" = 1)
- items = list(
- /obj/item/weapon/reagent_containers/food/snacks/friedegg,
- )
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/friedegg, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage )
result = /obj/item/weapon/reagent_containers/food/snacks/wrap
/datum/recipe/microwave/beans
reagents = list("ketchup" = 5)
- fruit = list("soybeans" = 2)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans, /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans)
result = /obj/item/weapon/reagent_containers/food/snacks/beans
/datum/recipe/microwave/benedict
@@ -586,10 +563,10 @@ datum/recipe/microwave/slimesandwich
/datum/recipe/microwave/meatbun
reagents = list("soysauce" = 5)
- fruit = list("cabbage" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meatball,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatbun
@@ -610,9 +587,9 @@ datum/recipe/microwave/slimesandwich
/datum/recipe/microwave/friedbanana
reagents = list("sugar" = 10, "cornoil" = 5)
- fruit = list("banana" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana
)
result = /obj/item/weapon/reagent_containers/food/snacks/friedbanana
@@ -655,8 +632,8 @@ datum/recipe/microwave/slimesandwich
result = /obj/item/weapon/reagent_containers/food/snacks/sashimi
/datum/recipe/microwave/mashedtaters
- fruit = list("potato" = 1)
reagents = list("gravy" = 5)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/potato)
result = /obj/item/weapon/reagent_containers/food/snacks/mashed_potatoes
//////////////////////////////////////////
diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm
index d20c06e260f..473641c4cc8 100644
--- a/code/modules/food_and_drinks/recipes/recipes_oven.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm
@@ -51,11 +51,11 @@
/datum/recipe/oven/bananabread
reagents = list("milk" = 5, "sugar" = 15)
- fruit = list("banana" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
@@ -68,11 +68,13 @@
/datum/recipe/oven/carrotcake
reagents = list("milk" = 5, "sugar" = 15)
- fruit = list("carrot" = 3)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
@@ -119,24 +121,24 @@
/datum/recipe/oven/pie
reagents = list("sugar" = 5)
- fruit = list("banana" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana
)
result = /obj/item/weapon/reagent_containers/food/snacks/pie
/datum/recipe/oven/cherrypie
reagents = list("sugar" = 10)
- fruit = list("cherries" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/cherries
)
result = /obj/item/weapon/reagent_containers/food/snacks/cherrypie
/datum/recipe/oven/berryclafoutis
- fruit = list("berries" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries
)
result = /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
@@ -155,9 +157,9 @@
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread
/datum/recipe/oven/loadedbakedpotato
- fruit = list("potato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/potato
)
result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
@@ -194,71 +196,80 @@
return .
/datum/recipe/oven/pizzamargherita
- fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita
/datum/recipe/oven/meatpizza
- fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
/datum/recipe/oven/syntipizza
- fruit = list("tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
/datum/recipe/oven/mushroompizza
- fruit = list("mushroom" = 5, "tomato" = 1)
+
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
/datum/recipe/oven/vegetablepizza
- fruit = list("eggplant" = 1, "carrot" = 1, "corn" = 1, "tomato" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/corn,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
/datum/recipe/oven/amanita_pie
- fruit = list("amanita" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
)
result = /obj/item/weapon/reagent_containers/food/snacks/amanita_pie
/datum/recipe/oven/plump_pie
- fruit = list("plumphelmet" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet
)
result = /obj/item/weapon/reagent_containers/food/snacks/plump_pie
/datum/recipe/oven/plumphelmetbiscuit
- fruit = list("plumphelmet" = 1)
reagents = list("water" = 5, "flour" = 5)
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet)
result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
/datum/recipe/oven/creamcheesebread
@@ -301,49 +312,53 @@
return being_cooked
/datum/recipe/oven/applepie
- fruit = list("apple" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple
)
result = /obj/item/weapon/reagent_containers/food/snacks/applepie
/datum/recipe/oven/applecake
reagents = list("milk" = 5, "sugar" = 5)
- fruit = list("apple" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
/datum/recipe/oven/orangecake
reagents = list("milk" = 5)
- fruit = list("orange" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
/datum/recipe/oven/limecake
reagents = list("milk" = 5)
- fruit = list("lime" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
/datum/recipe/oven/lemoncake
reagents = list("milk" = 5)
- fruit = list("lemon" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
@@ -370,17 +385,17 @@
/datum/recipe/oven/pumpkinpie
reagents = list("milk" = 5, "sugar" = 5)
- fruit = list("pumpkin" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie
/datum/recipe/oven/appletart
- fruit = list("goldapple" = 1)
reagents = list("sugar" = 5, "milk" = 5, "flour" = 10)
items = list(
- /obj/item/weapon/reagent_containers/food/snacks/egg
+ /obj/item/weapon/reagent_containers/food/snacks/egg,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
)
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
index b6c943dbdab..54203f92d12 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
@@ -6,7 +6,6 @@
tools[] = list() //type paths of items needed but not consumed
time = 30 //time in deciseconds
parts[] = list() //type paths of items that will be placed in the result
- fruit[] = list() //grown products required by the recipe
*/
/datum/crafting_recipe/sandwich
@@ -55,44 +54,14 @@
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry
category = CAT_FOOD
-/* Temporarily disabled until we can find a workaround for this fruit shit.
-/datum/crafting_recipe/herbsalad
- name = "herb salad"
- fruit = list("ambrosia" = 3, "apple" = 1)
- result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
-
-/datum/crafting_recipe/herbsalad/AdjustChems(var/obj/resultobj as obj)
- if(istype(resultobj, /obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = resultobj
- RC.reagents.del_reagent("toxin")
-
-/datum/crafting_recipe/aesirsalad
- name = "Aesir salad"
- fruit = list("ambrosiadeus" = 3, "goldapple" = 1)
- result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad
-
-/datum/crafting_recipe/validsalad
- name = "valid salad"
- fruit = list("ambrosia" = 3, "potato" = 1)
+/datum/crafting_recipe/baseballburger
+ name = "Home run baseball burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meatball = 1,
+ /obj/item/weapon/melee/baseball_bat = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/bun = 1,
)
- result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
-
-/datum/crafting_recipe/validsalad/AdjustChems(var/obj/resultobj as obj)
- if(istype(resultobj, /obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = resultobj
- RC.reagents.del_reagent("toxin")
-
-/datum/crafting_recipe/wrap
- name = "egg wrap"
- fruit = list("cabbage" = 1)
- reqs = list(
- /datum/reagent/soysauce = 10,
- /obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/wrap
-*/
+ result = /obj/item/weapon/reagent_containers/food/snacks/baseballburger
+ category = CAT_FOOD
/datum/crafting_recipe/notasandwich
name = "not-a-sandwich"
diff --git a/code/modules/garbage_collection/__gc_info.dm b/code/modules/garbage_collection/__gc_info.dm
index be72097a8c9..e36b5fd2b1b 100644
--- a/code/modules/garbage_collection/__gc_info.dm
+++ b/code/modules/garbage_collection/__gc_info.dm
@@ -1,7 +1,7 @@
/*
===============================================================================
- How Garbage Collection Works
+ How Garbage Collection Works
===============================================================================
In BYOND, there are exactly two ways anything gets deleted:
@@ -31,8 +31,8 @@ that can't be. There are two main procs involved in this process:
/proc/qdel(datumToDelete)
This is, effectively, a replacement for del that tells an object to prepare itself to be soft deleted by calling its
Destroy() proc. Depending on the qdel hint returned by Destroy(), qdel will queue the object in the garbage collector
- (to be hard deleted if it isn't soft deleted), directly delete the object, pool the object, or ignore the object and
- assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
+ (to be hard deleted if it isn't soft deleted), directly delete the object, or ignore the object and
+ assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
isnull(gcDestroyed) will be true if an object is not being destroyed, and false if it is (which means you should get
rid of the reference you have to it).
@@ -50,7 +50,7 @@ that can't be. There are two main procs involved in this process:
should use a Del proc for any necessary cleanup, as a Destroy proc on them will not automatically get called.
When called by qdel, Destroy is expected to return a qdel hint, which determines whether the object should be directly
- deleted, queued for deletion, pooled, or ignored entirely; which of these are appropriate will vary, though objects
+ deleted, queued for deletion, or ignored entirely; which of these are appropriate will vary, though objects
should be pooled or queued whenever possible. The full list of qdel hints are in the code for the qdel proc.
As mentioned above, gcDestroyed can be used to tell whether an object is being destroyed. This is important, because if
@@ -62,7 +62,4 @@ reference immediately.
The inner workings of the GC itself and the stuff related to testing it probably don't need a detailed description - if
you intend to work with them, it would be best to read the code to understand what they do.
-Pooling is related to GC, in that it's meant to reduce deletion overhead, but it does so by re-using objects instead of
-deleting them at all. Explaining pooling is outside the scope of this file.
-
*/
\ No newline at end of file
diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm
index 3d6007d313e..51493432ace 100644
--- a/code/modules/garbage_collection/garbage_collector.dm
+++ b/code/modules/garbage_collection/garbage_collector.dm
@@ -7,9 +7,11 @@
#define GC_FORCE_DEL_PER_TICK 30
//#define GC_DEBUG
-// A list of types that were queued in the GC, and had to be soft deleted; used in testing
-var/list/gc_hard_del_types = list()
-var/global/datum/controller/process/garbage_collector/garbageCollector
+var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened.
+ // the types are stored as strings
+var/list/sleptDestroy = list() //Same as above but these are paths that slept during their Destroy call
+
+var/list/noqdelhint = list() // list of all types that do not return a QDEL_HINT
// The time a datum was destroyed by the GC, or null if it hasn't been
/datum/var/gcDestroyed
@@ -82,7 +84,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
#undef GC_COLLECTIONS_PER_TICK
/datum/controller/process/garbage_collector/proc/hardDel(var/datum/D)
- gc_hard_del_types |= D.type
+ didntgc["[D.type]"]++
D.hard_deleted = 1
if(!D.gcDestroyed)
spawn(-1)
@@ -126,6 +128,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
return
if(!isnull(D.gcDestroyed) && D.gcDestroyed != world.time)
gcwarning("Sleep detected in Destroy() call of [D.type]")
+ sleptDestroy["[D.type]"]++
D.gcDestroyed = world.time
switch(hint)
@@ -149,15 +152,15 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
del(D)
if(garbageCollector)
garbageCollector.dels_count++
- if(QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
- PlaceInPool(D,0)
if(QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
#ifdef TESTING
D.find_references(remove_from_queue = FALSE)
#endif
garbageCollector.addTrash(D)
else
-// to_chat(world, "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!")
+ if(!noqdelhint["[D.type]"])
+ noqdelhint["[D.type]"] = "[D.type]"
+ gcwarning("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.")
garbageCollector.addTrash(D)
diff --git a/code/modules/garbage_collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm
index b1b413a0398..934a93adc21 100644
--- a/code/modules/garbage_collection/gc_testing.dm
+++ b/code/modules/garbage_collection/gc_testing.dm
@@ -11,23 +11,29 @@
garbageCollector.del_everything = !garbageCollector.del_everything
// to_chat(world, "GC: qdel turned [garbageCollector.del_everything ? "off" : "on"]. ")
log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].")
- message_admins("\blue [key_name_admin(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].", 1)
+ message_admins("[key_name_admin(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"]. ", 1)
-/client/proc/gc_dump_hdl()
- set name = "(GC) Hard Del List"
- set desc = "List types that are hard del()'d by the GC."
+/client/proc/cmd_display_del_log()
set category = "Debug"
+ set name = "(GC) Display del() Log"
+ set desc = "Displays a list of things that have failed to GC this round"
if(!check_rights(R_DEBUG))
return
- if(!gc_hard_del_types || !gc_hard_del_types.len)
- to_chat(usr, "No hard del()'d types found. ")
- return
+ var/dat = "List of things that failed to GC this round "
+ for(var/path in didntgc)
+ dat += "[path] - [didntgc[path]] times "
- to_chat(usr, "Types hard del()'d by the GC:")
- for(var/A in gc_hard_del_types)
- to_chat(usr, "[A]")
+ dat += "List of paths that did not return a qdel hint in Destroy() "
+ for(var/path in noqdelhint)
+ dat += "[path] "
+
+ dat += "List of paths that slept in Destroy() "
+ for(var/path in sleptDestroy)
+ dat += "[path] "
+
+ usr << browse(dat, "window=dellog")
#ifdef TESTING
/client/var/running_find_references
diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm
index db82a5227e6..85162a75c2d 100644
--- a/code/modules/holiday/holiday.dm
+++ b/code/modules/holiday/holiday.dm
@@ -354,5 +354,5 @@
//update our hub status
world.update_status()
- message_admins("\blue ADMIN: Event: [key_name(src)] force-set Holiday to \"[H]\"")
+ message_admins("ADMIN: Event: [key_name_admin(src)] force-set Holiday to \"[H]\" ")
log_admin("[key_name(src)] force-set Holiday to \"[H]\"")
\ No newline at end of file
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 817f002f014..7bfa00d35c3 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -33,7 +33,7 @@
/obj/structure/beebox
name = "apiary"
desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!"
- icon = 'icons/obj/apiary_bees.dmi'
+ icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "beebox"
anchored = 1
density = 1
@@ -51,11 +51,13 @@
/obj/structure/beebox/Destroy()
processing_objects.Remove(src)
+ for(var/mob/living/simple_animal/hostile/poison/bees/B in bees)
+ B.beehome = null
bees.Cut()
bees = null
- honeycombs.Cut()
- honeycombs = null
- queen_bee = null
+ QDEL_LIST(honeycombs)
+ QDEL_LIST(honey_frames)
+ QDEL_NULL(queen_bee)
return ..()
@@ -251,4 +253,4 @@
if(!user.put_in_active_hand(QB))
QB.forceMove(get_turf(src))
visible_message("[user] removes the queen from the apiary. ")
- queen_bee = null
\ No newline at end of file
+ queen_bee = null
diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
index 93b5b0c53a8..640d022c9e3 100644
--- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
+++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
@@ -13,4 +13,5 @@
icon_state = "beekeeper"
item_state = "beekeeper"
flags = THICKMATERIAL
- allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer,/obj/item/weapon/minihoe)
+ allowed = list (/obj/item/weapon/reagent_containers/spray,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/cultivator)
+
diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm
index a58ab7041c7..74eec401d6d 100644
--- a/code/modules/hydroponics/beekeeping/honey_frame.dm
+++ b/code/modules/hydroponics/beekeeping/honey_frame.dm
@@ -1,8 +1,8 @@
/obj/item/honey_frame
name = "honey frame"
- desc = "a scaffold for bees to build honeycomb on"
- icon = 'icons/obj/apiary_bees.dmi'
+ desc = "A scaffold for bees to build honeycomb on."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "honey_frame"
var/honeycomb_capacity = 10 //10 Honeycomb per frame by default, researchable frames perhaps?
diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm
index 23588cc5c48..713e46804e7 100644
--- a/code/modules/hydroponics/beekeeping/honeycomb.dm
+++ b/code/modules/hydroponics/beekeeping/honeycomb.dm
@@ -1,8 +1,8 @@
/obj/item/weapon/reagent_containers/honeycomb
name = "honeycomb"
- desc = "a hexagonal mesh of honeycomb"
- icon = 'icons/obj/apiary_bees.dmi'
+ desc = "A hexagonal mesh of honeycomb."
+ icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "honeycomb"
possible_transfer_amounts = list()
disease_amount = 0
@@ -22,10 +22,10 @@
overlays.Cut()
var/image/honey
if(honey_color)
- honey = image(icon = 'icons/obj/apiary_bees.dmi', icon_state = "greyscale_honey")
+ honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "greyscale_honey")
honey.color = honey_color
else
- honey = image(icon = 'icons/obj/apiary_bees.dmi', icon_state = "honey")
+ honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "honey")
overlays += honey
@@ -37,4 +37,4 @@
reagents.add_reagent(R.id,5)
else
honey_color = ""
- update_icon()
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
new file mode 100644
index 00000000000..deac3c6660d
--- /dev/null
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -0,0 +1,328 @@
+/obj/machinery/biogenerator
+ name = "Biogenerator"
+ desc = "Converts plants into biomass, which can be used to construct useful items."
+ icon = 'icons/obj/biogenerator.dmi'
+ icon_state = "biogen-empty"
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 40
+ var/processing = 0
+ var/obj/item/weapon/reagent_containers/glass/beaker = null
+ var/points = 0
+ var/menustat = "menu"
+ var/efficiency = 0
+ var/productivity = 0
+ var/max_items = 40
+ var/datum/research/files
+ var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth")
+ var/list/timesFiveCategories = list("Food", "Botany Chemicals")
+
+/obj/machinery/biogenerator/New()
+ ..()
+ files = new /datum/research/biogenerator(src)
+ create_reagents(1000)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/biogenerator(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ RefreshParts()
+
+/obj/machinery/biogenerator/Destroy()
+ QDEL_NULL(beaker)
+ QDEL_NULL(files)
+ return ..()
+
+/obj/machinery/biogenerator/ex_act(severity)
+ if(beaker)
+ beaker.ex_act(severity)
+ ..()
+
+/obj/machinery/biogenerator/RefreshParts()
+ var/E = 0
+ var/P = 0
+ var/max_storage = 40
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ P += B.rating
+ max_storage = 40 * B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ E += M.rating
+ efficiency = E
+ productivity = P
+ max_items = max_storage
+
+/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
+ update_icon()
+
+/obj/machinery/biogenerator/update_icon()
+ if(panel_open)
+ icon_state = "biogen-empty-o"
+ else if(!beaker)
+ icon_state = "biogen-empty"
+ else if(!processing)
+ icon_state = "biogen-stand"
+ else
+ icon_state = "biogen-work"
+ return
+
+/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params)
+ if(user.a_intent == I_HARM)
+ return ..()
+
+ if(processing)
+ to_chat(user, "The biogenerator is currently processing. ")
+ return
+
+ if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O))
+ if(beaker)
+ var/obj/item/weapon/reagent_containers/glass/B = beaker
+ B.forceMove(loc)
+ beaker = null
+ update_icon()
+ return
+
+ if(exchange_parts(user, O))
+ return
+
+ if(default_deconstruction_crowbar(O))
+ return
+
+ if(istype(O, /obj/item/weapon/reagent_containers/glass))
+ . = 1 //no afterattack
+ if(!panel_open)
+ if(beaker)
+ to_chat(user, "A container is already loaded into the machine. ")
+ else
+ if(!user.drop_item())
+ return
+ O.forceMove(src)
+ beaker = O
+ to_chat(user, "You add the container to the machine. ")
+ update_icon()
+ updateUsrDialog()
+ else
+ to_chat(user, "Close the maintenance panel first. ")
+ return
+
+ else if(istype(O, /obj/item/weapon/storage/bag/plants))
+ var/obj/item/weapon/storage/bag/plants/PB = O
+ var/i = 0
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
+ i++
+ if(i >= max_items)
+ to_chat(user, "The biogenerator is already full! Activate it. ")
+ else
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
+ if(i >= max_items)
+ break
+ PB.remove_from_storage(G, src)
+ i++
+ if(iYou empty the plant bag into the biogenerator.")
+ else if(PB.contents.len == 0)
+ to_chat(user, "You empty the plant bag into the biogenerator, filling it to its capacity. ")
+ else
+ to_chat(user, "You fill the biogenerator to its capacity. ")
+ return 1 //no afterattack
+
+ else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
+ var/i = 0
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
+ i++
+ if(i >= max_items)
+ to_chat(user, "The biogenerator is full! Activate it. ")
+ else
+ user.unEquip(O)
+ O.forceMove(src)
+ to_chat(user, "You put [O.name] in [name] ")
+ return 1 //no afterattack
+ else if (istype(O, /obj/item/weapon/disk/design_disk))
+ user.visible_message("[user] begins to load [O] in [src]...",
+ "You begin to load a design from [O]...",
+ "You hear the chatter of a floppy drive.")
+ processing = 1
+ var/obj/item/weapon/disk/design_disk/D = O
+ if(do_after(user, 10, target = src))
+ files.AddDesign2Known(D.blueprint)
+ processing = 0
+ return 1
+ else
+ to_chat(user, "You cannot put this in [name]! ")
+
+/obj/machinery/biogenerator/interact(mob/user)
+ if(stat & BROKEN || panel_open)
+ return
+ user.set_machine(src)
+ add_fingerprint(user)
+ var/dat
+ if(processing)
+ dat += "Biogenerator is processing! Please wait...
"
+ else
+ switch(menustat)
+ if("nopoints")
+ dat += "You do not have enough biomass to create products. Please, put growns into reactor and activate it.
"
+ menustat = "menu"
+ if("complete")
+ dat += "Operation complete.
"
+ menustat = "menu"
+ if("void")
+ dat += "Error: No growns inside. Please, put growns into reactor.
"
+ menustat = "menu"
+ if("nobeakerspace")
+ dat += "Not enough space left in container. Unable to create product.
"
+ menustat = "menu"
+ if(beaker)
+ var/categories = show_categories.Copy()
+ for(var/V in categories)
+ categories[V] = list()
+ for(var/V in files.known_designs)
+ var/datum/design/D = files.known_designs[V]
+ for(var/C in categories)
+ if(C in D.category)
+ categories[C] += D
+
+ dat += "Biomass: [points] units.
"
+ dat += "Activate Detach Container "
+ for(var/cat in categories)
+ dat += "[cat]: "
+ dat += ""
+ for(var/V in categories[cat])
+ var/datum/design/D = V
+ dat += "[D.name]:
Make "
+ if(cat in timesFiveCategories)
+ dat += "
x5 "
+ if(ispath(D.build_path, /obj/item/stack))
+ dat += "
x10 "
+ dat += "([D.materials[MAT_BIOMASS]/efficiency])
"
+ dat += "
"
+ else
+ dat += "No container inside, please insert container.
"
+
+ var/datum/browser/popup = new(user, "biogen", name, 350, 520)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/obj/machinery/biogenerator/attack_hand(mob/user)
+ interact(user)
+
+/obj/machinery/biogenerator/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/biogenerator/proc/activate()
+ if(usr.stat != 0)
+ return
+ if(stat != 0) //NOPOWER etc
+ return
+ if(processing)
+ to_chat(usr, "The biogenerator is in the process of working. ")
+ return
+ var/S = 0
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
+ S += 5
+ if(I.reagents.get_reagent_amount("nutriment")+I.reagents.get_reagent_amount("plantmatter") < 0.1)
+ points += 1*productivity
+ else
+ points += (I.reagents.get_reagent_amount("nutriment")+I.reagents.get_reagent_amount("plantmatter"))*10*productivity
+ qdel(I)
+ if(S)
+ processing = 1
+ update_icon()
+ updateUsrDialog()
+ playsound(loc, 'sound/machines/blender.ogg', 50, 1)
+ use_power(S*30)
+ sleep(S+15/productivity)
+ processing = 0
+ update_icon()
+ else
+ menustat = "void"
+ return
+
+/obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = 1)
+ if(materials.len != 1 || materials[1] != MAT_BIOMASS)
+ return 0
+ if (materials[MAT_BIOMASS]*multiplier/efficiency > points)
+ menustat = "nopoints"
+ return 0
+ else
+ if(remove_points)
+ points -= materials[MAT_BIOMASS]*multiplier/efficiency
+ update_icon()
+ updateUsrDialog()
+ return 1
+
+/obj/machinery/biogenerator/proc/check_container_volume(list/reagents, multiplier = 1)
+ var/sum_reagents = 0
+ for(var/R in reagents)
+ sum_reagents += reagents[R]
+ sum_reagents *= multiplier
+
+ if(beaker.reagents.total_volume + sum_reagents > beaker.reagents.maximum_volume)
+ menustat = "nobeakerspace"
+ return 0
+
+ return 1
+
+/obj/machinery/biogenerator/proc/create_product(datum/design/D, amount)
+ if(!beaker || !loc)
+ return 0
+
+ if(ispath(D.build_path, /obj/item/stack))
+ if(!check_container_volume(D.make_reagents, amount))
+ return 0
+ if(!check_cost(D.materials, amount))
+ return 0
+
+ var/obj/item/stack/product = new D.build_path(loc)
+ product.amount = amount
+ for(var/R in D.make_reagents)
+ beaker.reagents.add_reagent(R, D.make_reagents[R]*amount)
+ else
+ var/i = amount
+ while(i > 0)
+ if(!check_container_volume(D.make_reagents))
+ return .
+ if(!check_cost(D.materials))
+ return .
+ if(D.build_path)
+ new D.build_path(loc)
+ for(var/R in D.make_reagents)
+ beaker.reagents.add_reagent(R, D.make_reagents[R])
+ . = 1
+ --i
+
+ menustat = "complete"
+ update_icon()
+ return .
+
+/obj/machinery/biogenerator/proc/detach()
+ if(beaker)
+ beaker.forceMove(loc)
+ beaker = null
+ update_icon()
+
+/obj/machinery/biogenerator/Topic(href, href_list)
+ if(..() || panel_open)
+ return 1
+
+ usr.set_machine(src)
+
+ if(href_list["activate"])
+ activate()
+ updateUsrDialog()
+
+ else if(href_list["detach"])
+ detach()
+ updateUsrDialog()
+
+ else if(href_list["create"])
+ var/amount = (text2num(href_list["amount"]))
+ var/datum/design/D = locate(href_list["create"])
+ create_product(D, amount)
+ updateUsrDialog()
+
+ else if(href_list["menu"])
+ menustat = "menu"
+ updateUsrDialog()
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
new file mode 100644
index 00000000000..ebe74316ed4
--- /dev/null
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -0,0 +1,424 @@
+/obj/machinery/plantgenes
+ name = "plant DNA manipulator"
+ desc = "An advanced device designed to manipulate plant genetic makeup."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "dnamod"
+ density = 1
+ anchored = 1
+
+ var/obj/item/seeds/seed
+ var/obj/item/weapon/disk/plantgene/disk
+
+ var/list/core_genes = list()
+ var/list/reagent_genes = list()
+ var/list/trait_genes = list()
+
+ var/datum/plant_gene/target
+ var/operation = ""
+ var/rating = 0
+ var/max_extract_pot = 50
+ // The cap on potency gene extraction.
+ // This number is for T1, each upgraded part adds 5% for a tech level above T1.
+ // At T4, it reaches 95%.
+
+/obj/machinery/plantgenes/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/plantgenes(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+
+/obj/machinery/plantgenes/Destroy()
+ core_genes.Cut()
+ reagent_genes.Cut()
+ trait_genes.Cut()
+ target = null
+ QDEL_NULL(seed)
+ QDEL_NULL(disk)
+ return ..()
+
+/obj/machinery/plantgenes/RefreshParts()
+ rating = 0
+ for(var/I in component_parts)
+ if(istype(I, /obj/item/weapon/stock_parts))
+ var/obj/item/weapon/stock_parts/S = I
+ rating += S.rating-1
+ max_extract_pot = initial(max_extract_pot) + rating*5
+
+/obj/machinery/plantgenes/update_icon()
+ ..()
+ overlays.Cut()
+ if((stat & (BROKEN|NOPOWER)))
+ icon_state = "dnamod-off"
+ else
+ icon_state = "dnamod"
+ if(seed)
+ overlays += "dnamod-dna"
+ if(panel_open)
+ overlays += "dnamod-open"
+
+/obj/machinery/plantgenes/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I))
+ update_icon()
+ return
+ if(exchange_parts(user, I))
+ return
+ if(default_deconstruction_crowbar(I))
+ return
+ if(isrobot(user))
+ return
+
+ if(istype(I, /obj/item/seeds))
+ if(seed)
+ to_chat(user, "A sample is already loaded into the machine! ")
+ else
+ if(!user.drop_item())
+ return
+ insert_seed(I)
+ to_chat(user, "You add [I] to the machine. ")
+ interact(user)
+ return
+ else if(istype(I, /obj/item/weapon/disk/plantgene))
+ if(disk)
+ to_chat(user, "A data disk is already loaded into the machine! ")
+ else
+ if(!user.drop_item())
+ return
+ disk = I
+ disk.forceMove(src)
+ to_chat(user, "You add [I] to the machine. ")
+ interact(user)
+ else
+ ..()
+
+
+/obj/machinery/plantgenes/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/plantgenes/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/plantgenes/interact(mob/user)
+ add_fingerprint(user)
+ user.set_machine(src)
+ if(!user)
+ return
+
+ var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600)
+
+ var/dat = ""
+
+ if(operation)
+ if(!seed || (!target && operation != "insert"))
+ operation = ""
+ target = null
+ interact(user)
+ return
+ if((operation == "replace" || operation == "insert") && (!disk || !disk.gene))
+ operation = ""
+ target = null
+ interact(user)
+ return
+
+ dat += "
Confirm Operation "
+ dat += "Are you sure you want to [operation] "
+ switch(operation)
+ if("remove")
+ dat += "[target.get_name()] gene from \the [seed] ? "
+ if("extract")
+ dat += "[target.get_name()] gene from \the [seed] ? "
+ dat += "The sample will be destroyed in process! "
+ if(istype(target, /datum/plant_gene/core/potency))
+ var/datum/plant_gene/core/gene = target
+ if(gene.value > max_extract_pot)
+ dat += " This device's extraction capabilities are currently limited to [max_extract_pot] potency. "
+ dat += "Target gene will be degraded to [max_extract_pot] potency on extraction."
+ if("replace")
+ dat += "[target.get_name()] gene with [disk.gene.get_name()] ? "
+ if("insert")
+ dat += "[disk.gene.get_name()] gene into \the [seed] ? "
+ dat += "
"
+ popup.set_content(dat)
+ popup.open()
+ return
+
+ dat+= ""
+
+ dat += "
"
+
+ dat += "
"
+
+ dat += "
"
+
+ if(seed)
+ var/can_insert = disk && disk.gene && disk.gene.can_add(seed)
+ var/can_extract = disk && !disk.read_only
+
+ dat += "
Core Genes "
+ for(var/a in core_genes)
+ var/datum/plant_gene/G = a
+ if(!G)
+ continue
+ dat += "[G.get_name()] "
+ if(can_extract)
+ dat += "Extract "
+ if(can_insert && istype(disk.gene, G.type))
+ dat += "Replace "
+ dat += " "
+ dat += "
"
+
+ if(seed.yield != -1)
+ dat += "
Content Genes "
+ if(reagent_genes.len)
+ dat += "
"
+ for(var/a in reagent_genes)
+ var/datum/plant_gene/G = a
+ dat += "[G.get_name()] "
+ if(can_extract)
+ dat += "Extract "
+ dat += "Remove "
+ dat += " "
+ dat += "
"
+ else
+ dat += "No content-related genes detected in sample.
"
+ dat += "
"
+ if(can_insert && istype(disk.gene, /datum/plant_gene/reagent))
+ dat += "Insert: [disk.gene.get_name()] "
+
+ dat += "
Trait Genes "
+ if(trait_genes.len)
+ dat += "
"
+ for(var/a in trait_genes)
+ var/datum/plant_gene/G = a
+ dat += "[G.get_name()] "
+ if(can_extract)
+ dat += "Extract "
+ dat += "Remove "
+ dat += " "
+ dat += "
"
+ else
+ dat += "No trait-related genes detected in sample.
"
+ if(can_insert && istype(disk.gene, /datum/plant_gene/trait))
+ dat += "
Insert: [disk.gene.get_name()] "
+ dat += "
"
+ else
+ dat += " No sample found.Please, insert a plant sample to use this device. "
+ popup.set_content(dat)
+ popup.open()
+
+
+/obj/machinery/plantgenes/Topic(var/href, var/list/href_list)
+ if(..())
+ return 1
+ usr.set_machine(src)
+
+ if(href_list["eject_seed"] && !operation)
+ if(seed)
+ seed.forceMove(loc)
+ seed.verb_pickup()
+ seed = null
+ update_genes()
+ update_icon()
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/seeds))
+ if(!usr.drop_item())
+ return
+ insert_seed(I)
+ to_chat(usr, "You add [I] to the machine. ")
+ update_icon()
+ else if(href_list["eject_disk"] && !operation)
+ if(disk)
+ disk.forceMove(loc)
+ disk.verb_pickup()
+ disk = null
+ update_genes()
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/disk/plantgene))
+ if(!usr.drop_item())
+ return
+ disk = I
+ disk.forceMove(src)
+ to_chat(usr, "You add [I] to the machine. ")
+ else if(href_list["op"] == "insert" && disk && disk.gene && seed)
+ if(!operation) // Wait for confirmation
+ operation = "insert"
+ else
+ if(!istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed))
+ seed.genes += disk.gene.Copy()
+ if(istype(disk.gene, /datum/plant_gene/reagent))
+ seed.reagents_from_genes()
+ update_genes()
+ repaint_seed()
+ operation = ""
+ target = null
+
+ else if(href_list["gene"] && seed)
+ var/datum/plant_gene/G = seed.get_gene(href_list["gene"])
+ if(!G || !href_list["op"] || !(href_list["op"] in list("remove", "extract", "replace")))
+ interact(usr)
+ return
+
+ if(!operation || target != G) // Wait for confirmation
+ target = G
+ operation = href_list["op"]
+
+ else if(operation == href_list["op"] && target == G)
+ switch(href_list["op"])
+ if("remove")
+ if(!istype(G, /datum/plant_gene/core))
+ seed.genes -= G
+ if(istype(G, /datum/plant_gene/reagent))
+ seed.reagents_from_genes()
+ repaint_seed()
+ if("extract")
+ if(disk && !disk.read_only)
+ disk.gene = G.Copy()
+ if(istype(disk.gene, /datum/plant_gene/core/potency))
+ var/datum/plant_gene/core/gene = disk.gene
+ gene.value = min(gene.value, max_extract_pot)
+ disk.update_name()
+ qdel(seed)
+ seed = null
+ update_icon()
+ if("replace")
+ if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core))
+ seed.genes -= G
+ var/datum/plant_gene/core/C = disk.gene.Copy()
+ seed.genes += C
+ C.apply_stat(seed)
+ repaint_seed()
+ if("insert")
+ if(disk && disk.gene && !istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed))
+ seed.genes += disk.gene.Copy()
+ if(istype(disk.gene, /datum/plant_gene/reagent))
+ seed.reagents_from_genes()
+ repaint_seed()
+
+ update_genes()
+ operation = ""
+ target = null
+ else if(href_list["abort"])
+ operation = ""
+ target = null
+
+ interact(usr)
+
+/obj/machinery/plantgenes/proc/insert_seed(obj/item/seeds/S)
+ if(!istype(S) || seed)
+ return
+ S.forceMove(src)
+ seed = S
+ update_genes()
+ update_icon()
+
+/obj/machinery/plantgenes/proc/update_genes()
+ core_genes = list()
+ reagent_genes = list()
+ trait_genes = list()
+
+ if(seed)
+ var/gene_paths = list(
+ /datum/plant_gene/core/potency,
+ /datum/plant_gene/core/yield,
+ /datum/plant_gene/core/production,
+ /datum/plant_gene/core/endurance,
+ /datum/plant_gene/core/lifespan,
+ /datum/plant_gene/core/weed_rate,
+ /datum/plant_gene/core/weed_chance
+ )
+ for(var/a in gene_paths)
+ core_genes += seed.get_gene(a)
+
+ for(var/datum/plant_gene/reagent/G in seed.genes)
+ reagent_genes += G
+ for(var/datum/plant_gene/trait/G in seed.genes)
+ trait_genes += G
+
+/obj/machinery/plantgenes/proc/repaint_seed()
+ if(!seed)
+ return
+ if(copytext(seed.name, 1, 13) == "experimental")
+ return // Already modded name and icon
+ seed.name = "experimental " + seed.name
+ seed.icon_state = "seed-x"
+
+/*
+ * Plant DNA disk
+ */
+
+/obj/item/weapon/disk/plantgene
+ name = "plant data disk"
+ desc = "A disk for storing plant genetic data."
+ icon_state = "datadisk_hydro"
+ materials = list(MAT_METAL=30, MAT_GLASS=10)
+ var/datum/plant_gene/gene
+ var/read_only = 0 //Well, it's still a floppy disk
+
+/obj/item/weapon/disk/plantgene/New()
+ ..()
+ overlays += "datadisk_gene"
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
+/obj/item/weapon/disk/plantgene/Destroy()
+ QDEL_NULL(gene)
+ return ..()
+
+/obj/item/weapon/disk/plantgene/attackby(obj/item/weapon/W, mob/user, params)
+ ..()
+ if(istype(W, /obj/item/weapon/pen))
+ var/t = stripped_input(user, "What would you like the label to be?", name, null)
+ if(user.get_active_hand() != W)
+ return
+ if(!in_range(src, user) && loc != user)
+ return
+ if(t)
+ name = "plant data disk - '[t]'"
+ else
+ name = "plant data disk"
+
+/obj/item/weapon/disk/plantgene/proc/update_name()
+ if(gene)
+ name = "plant data disk - '[gene.get_name()]'"
+ else
+ name = "plant data disk"
+
+/obj/item/weapon/disk/plantgene/attack_self(mob/user)
+ read_only = !read_only
+ to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"]. ")
+
+/obj/item/weapon/disk/plantgene/examine(mob/user)
+ ..()
+ to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
+
+
+/*
+ * Plant DNA Disks Box
+ */
+/obj/item/weapon/storage/box/disks_plantgene
+ name = "plant data disks box"
+ icon_state = "disk_kit"
+
+/obj/item/weapon/storage/box/disks_plantgene/New()
+ ..()
+ for(var/i in 1 to 7)
+ new /obj/item/weapon/disk/plantgene(src)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 81d489d9da1..130fc2730ac 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -1,535 +1,150 @@
-//Grown foods.
+// ***********************************************************
+// Foods that are produced from hydroponics ~~~~~~~~~~
+// Data from the seeds carry over to these grown foods
+// ***********************************************************
+
+// Base type. Subtypes are found in /grown dir.
/obj/item/weapon/reagent_containers/food/snacks/grown
-
- name = "fruit"
- icon = 'icons/obj/hydroponics_products.dmi'
- icon_state = "blank"
- desc = "Nutritious! Probably."
-
- var/plantname
- var/datum/seed/seed
- var/potency = -1
- var/awakening = 0
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
+ var/plantname = ""
+ var/bitesize_mod = 0
+ var/splat_type = /obj/effect/decal/cleanable/plant_smudge
+ // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod)
+ dried_type = -1
+ // Saves us from having to define each stupid grown's dried_type as itself.
+ // If you don't want a plant to be driable (watermelons) set this to null in the time definition.
burn_state = FLAMMABLE
+ origin_tech = "biotech=1"
-/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc,planttype)
-
+/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null)
..()
- if(!dried_type)
+ if(new_seed)
+ seed = new_seed.Copy()
+ else if(ispath(seed))
+ // This is for adminspawn or map-placed growns. They get the default stats of their seed type.
+ seed = new seed()
+ seed.adjust_potency(50-seed.potency)
+
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
+ if(dried_type == -1)
dried_type = type
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
-
- // Fill the object up with the appropriate reagents.
- if(planttype)
- plantname = planttype
-
- if(!plantname)
- return
-
- if(!plant_controller)
- sleep(250) // ugly hack, should mean roundstart plants are fine.
- if(!plant_controller)
- to_chat(world, "Plant controller does not exist and [src] requires it. Aborting. ")
- qdel(src)
- return
-
- seed = plant_controller.seeds[plantname]
-
- if(!seed)
- return
-
- name = "[seed.seed_name]"
-
- if(seed.modular_icon == 1)
- update_icon()
- else
- icon = 'icons/obj/harvest.dmi'
- icon_state = seed.preset_icon
-
- if(!seed.chems)
- return
-
- potency = seed.get_trait(TRAIT_POTENCY)
-
- for(var/rid in seed.chems)
- var/list/reagent_data = seed.chems[rid]
- if(reagent_data && reagent_data.len)
- var/rtotal = reagent_data[1]
- if(reagent_data.len > 1 && potency > 0)
- rtotal += round(potency/reagent_data[2])
- reagents.add_reagent(rid,max(1,rtotal))
- update_desc()
- update_trash()
- if(reagents.total_volume > 0)
- bitesize = 1+round(reagents.total_volume / 2, 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_trash()
- if(!seed)
- return
- trash = seed.trash_type
- if(seed.kitchen_tag)
- if(seed.kitchen_tag == "watermelon") // 15% chance to leave behind a pack of watermelon seeds
- if(prob(15))
- var/obj/item/seeds/seeds = new()
- seeds.seed = seed
- seeds.update_seed()
- trash = seeds
- else
- trash = null
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_desc()
-
- if(!seed)
- return
- if(!plant_controller)
- sleep(250) // ugly hack, should mean roundstart plants are fine.
- if(!plant_controller)
- to_chat(world, "Plant controller does not exist and [src] requires it. Aborting. ")
- qdel(src)
- return
-
- if(plant_controller.product_descs["[seed.uid]"])
- desc = plant_controller.product_descs["[seed.uid]"]
- else
- var/list/descriptors = list()
- if(reagents.has_reagent("sugar") || reagents.has_reagent("cherryjelly") || reagents.has_reagent("honey") || reagents.has_reagent("berryjuice"))
- descriptors |= "sweet"
- if(reagents.has_reagent("charcoal"))
- descriptors |= "astringent"
- if(reagents.has_reagent("frostoil"))
- descriptors |= "numbing"
- if(reagents.has_reagent("nutriment"))
- descriptors |= "nutritious"
- if(reagents.has_reagent("condensedcapsaicin") || reagents.has_reagent("capsaicin"))
- descriptors |= "spicy"
- if(reagents.has_reagent("cocoa"))
- descriptors |= "bitter"
- if(reagents.has_reagent("orangejuice") || reagents.has_reagent("lemonjuice") || reagents.has_reagent("limejuice"))
- descriptors |= "sweet-sour"
- if(reagents.has_reagent("radium") || reagents.has_reagent("uranium"))
- descriptors |= "radioactive"
- if(reagents.has_reagent("amanitin") || reagents.has_reagent("toxin") || reagents.has_reagent("carpotoxin"))
- descriptors |= "poisonous"
- if(reagents.has_reagent("lsd") || reagents.has_reagent("space_drugs") || reagents.has_reagent("psilocybin"))
- descriptors |= "hallucinogenic"
- if(reagents.has_reagent("styptic_powder"))
- descriptors |= "medicinal"
- if(reagents.has_reagent("gold") || reagents.has_reagent("silver"))
- descriptors |= "shiny"
- if(reagents.has_reagent("lube"))
- descriptors |= "slippery"
- if(reagents.has_reagent("facid") || reagents.has_reagent("sacid"))
- descriptors |= "acidic"
- if(reagents.has_reagent("fuel"))
- descriptors |= "flammable"
- if(reagents.has_reagent("moonshine"))
- descriptors |= "intoxicating"
- if(seed.get_trait(TRAIT_JUICY))
- descriptors |= "juicy"
- if(seed.get_trait(TRAIT_STINGS))
- descriptors |= "stinging"
- if(seed.get_trait(TRAIT_TELEPORTING))
- descriptors |= "glowing"
- if(seed.get_trait(TRAIT_EXPLOSIVE))
- descriptors |= "bulbous"
-
- var/descriptor_num = rand(2,4)
- var/descriptor_count = descriptor_num
- desc = "A"
- while(descriptors.len && descriptor_num > 0)
- var/chosen = pick(descriptors)
- descriptors -= chosen
- desc += "[(descriptor_count>1 && descriptor_count!=descriptor_num) ? "," : "" ] [chosen]"
- descriptor_num--
- if(seed.seed_noun == "spores")
- desc += " mushroom"
- else
- desc += " fruit"
- plant_controller.product_descs["[seed.uid]"] = desc
- desc += ". Delicious! Probably."
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/update_icon()
- if(!seed || !plant_controller || !plant_controller.plant_icon_cache)
- return
- if(seed.modular_icon != 1)
- return
- overlays.Cut()
- var/image/plant_icon
- var/icon_key = "fruit-[seed.get_trait(TRAIT_PRODUCT_ICON)]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"
- if(plant_controller.plant_icon_cache[icon_key])
- plant_icon = plant_controller.plant_icon_cache[icon_key]
- else
- plant_icon = image('icons/obj/hydroponics_products.dmi',"blank")
- var/image/fruit_base = image('icons/obj/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-product")
- fruit_base.color = "[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"
- plant_icon.overlays |= fruit_base
- if("[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf" in icon_states('icons/obj/hydroponics_products.dmi'))
- var/image/fruit_leaves = image('icons/obj/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf")
- fruit_leaves.color = "[seed.get_trait(TRAIT_PLANT_COLOUR)]"
- plant_icon.overlays |= fruit_leaves
- plant_controller.plant_icon_cache[icon_key] = plant_icon
- overlays |= plant_icon
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M)
- if(seed && seed.get_trait(TRAIT_JUICY) == 2)
- if(istype(M))
-
- if(M.buckled)
- return
-
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.shoes && H.shoes.flags & NOSLIP)
- return
-
- M.stop_pulling()
- to_chat(M, "You slipped on the [name]! ")
- playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(8)
- M.Weaken(5)
- seed.thrown_at(src,M)
- sleep(-1)
- if(src) qdel(src)
- return
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
- ..()
- if(seed) seed.thrown_at(src,hit_atom)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/weapon/W, var/mob/user)
if(seed)
- if(seed.get_trait(TRAIT_PRODUCES_POWER) && istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if(C.use(5))
- //TODO: generalize this.
- to_chat(user, "You add some cable to the [src.name] and slide it inside the battery casing. ")
- var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(get_turf(user))
- if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human))
- user.put_in_hands(pocell)
- pocell.maxcharge = src.potency * 10
- pocell.charge = pocell.maxcharge
- qdel(src)
- return
- else if(W.sharp)
- var/reagents_per_slice
- var/obj/slice
- if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
- user.show_message("You carve a face into [src]! ", 1)
- new /obj/item/clothing/head/hardhat/pumpkinhead (user.loc)
- qdel(src)
- return
- else if(seed.kitchen_tag == "potato")
- to_chat(user, "You slice \the [src] into sticks.")
- reagents_per_slice = reagents.total_volume
- slice = new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
- reagents.trans_to(slice, reagents_per_slice)
- qdel(src)
- return
- else if(seed.kitchen_tag == "carrot")
- to_chat(user, "You slice \the [src] into sticks.")
- reagents_per_slice = reagents.total_volume
- slice = new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
- reagents.trans_to(slice, reagents_per_slice)
- qdel(src)
- return
- else if(seed.kitchen_tag == "watermelon")
- to_chat(user, "You slice \the [src] into large slices.")
- reagents_per_slice = reagents.total_volume/5
- for(var/i=0,i<5,i++)
- slice = new /obj/item/weapon/reagent_containers/food/snacks/watermelonslice(get_turf(src))
- reagents.trans_to(slice, reagents_per_slice)
- qdel(src)
- return
- else if(seed.kitchen_tag == "soybeans")
- to_chat(user, "You roughly chop up \the [src].")
- reagents_per_slice = reagents.total_volume
- slice = new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
- reagents.trans_to(slice, reagents_per_slice)
- qdel(src)
- return
- else if(seed.chems)
- if(istype(W,/obj/item/weapon/hatchet) && !isnull(seed.chems["woodpulp"]))
- user.show_message("You make planks out of \the [src]! ", 1)
- for(var/i=0,i<2,i++)
- var/obj/item/stack/sheet/wood/NG = new (user.loc)
- NG.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- for(var/obj/item/stack/sheet/wood/G in user.loc)
- if(G==NG)
- continue
- if(G.amount>=G.max_amount)
- continue
- G.attackby(NG, user)
- to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.")
- qdel(src)
- return
- else if(istype(W, /obj/item/weapon/rollingpaper))
- if(seed.kitchen_tag == "ambrosia" || seed.kitchen_tag == "ambrosiadeus" || seed.kitchen_tag == "tobacco" || seed.kitchen_tag == "stobacco")
- user.unEquip(W)
- if(seed.kitchen_tag == "ambrosia")
- var/obj/item/clothing/mask/cigarette/joint/J = new /obj/item/clothing/mask/cigarette/joint(user.loc)
- J.chem_volume = src.reagents.total_volume
- src.reagents.trans_to(J, J.chem_volume)
- qdel(W)
- user.put_in_active_hand(J)
- else if(seed.kitchen_tag == "ambrosiadeus")
- var/obj/item/clothing/mask/cigarette/joint/deus/J = new /obj/item/clothing/mask/cigarette/joint/deus(user.loc)
- J.chem_volume = src.reagents.total_volume
- src.reagents.trans_to(J, J.chem_volume)
- qdel(W)
- user.put_in_active_hand(J)
- else if(seed.kitchen_tag == "tobacco" || seed.kitchen_tag == "stobacco")
- var/obj/item/clothing/mask/cigarette/handroll/J = new /obj/item/clothing/mask/cigarette/handroll(user.loc)
- J.chem_volume = src.reagents.total_volume
- src.reagents.trans_to(J, J.chem_volume)
- qdel(W)
- user.put_in_active_hand(J)
- to_chat(user, "\blue You roll the [src] into a rolling paper.")
- qdel(src)
- else
- to_chat(user, "\red You can't roll a smokable from the [src].")
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_new(src, newloc)
+ seed.prepare_result(src)
+ transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
+ add_juice()
- ..()
+/obj/item/weapon/reagent_containers/food/snacks/grown/Destroy()
+ QDEL_NULL(seed)
+ return ..()
-/obj/item/weapon/reagent_containers/food/snacks/grown/attack(var/mob/living/carbon/M, var/mob/user, var/def_zone)
- if(awakening)
- to_chat(user, "The [src] is twitching and shaking, preventing you from eating it. ")
- return
- if(user == M)
- return ..()
-
- if(user.a_intent == I_HARM)
-
- // This is being copypasted here because reagent_containers (WHY DOES FOOD DESCEND FROM THAT) overrides it completely.
- // TODO: refactor all food paths to be less horrible and difficult to work with in this respect. ~Z
- if(!istype(M)) return 0
-
- if(!def_zone)
- def_zone = check_zone(user.zone_sel.selecting)
-
- user.lastattacked = M
- M.lastattacker = user
- user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) "
- M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) "
- msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" )
-
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- var/hit = H.attacked_by(src, user, def_zone)
- if(hit && hitsound)
- playsound(loc, hitsound, 50, 1, -1)
- //return hit
- else
- if(attack_verb.len)
- user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]! ")
- else
- user.visible_message("[M] has been attacked with [src] by [user]! ")
-
- if(hitsound)
- playsound(loc, hitsound, 50, 1, -1)
- switch(damtype)
- if("brute")
- M.take_organ_damage(force)
- if(prob(33))
- var/turf/simulated/location = get_turf(M)
- if(istype(location)) location.add_blood_floor(M)
- if("fire")
- M.take_organ_damage(0, force)
- M.updatehealth()
-
- if(seed && seed.get_trait(TRAIT_CARNIVOROUS))
- seed.do_thorns(M, src, def_zone)
-
- if(ishuman(M) && seed && seed.get_trait(TRAIT_STINGS))
- if(!reagents || reagents.total_volume <= 0)
- return
- seed.do_sting(M, src, def_zone)
- reagents.remove_any(rand(1,3)) //use up some of the reagents at random
- sleep(-1)
- if(!src)
- return
- if(reagents && reagents.total_volume <= 0) //used-up fruit will be destroyed
- if(user)
- to_chat(user, "\The [src] has dried out and crumbles to dust. ")
- //user.drop_from_inventory(src)
- qdel(src)
- else if(prob(35)) //fruit that still has reagents has a chance of breaking each time it stings on hit
- if(user)
- to_chat(user, "\The [src] has fallen to bits. ")
- //user.drop_from_inventory(src)
- qdel(src)
-
- add_fingerprint(user)
+/obj/item/weapon/reagent_containers/food/snacks/grown/proc/add_juice()
+ if(reagents)
+ if(bitesize_mod)
+ bitesize = 1 + round(reagents.total_volume / bitesize_mod)
return 1
+ return 0
- else
- ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user as mob)
-
- if(!seed)
- return
-
- if(istype(user.loc,/turf/space))
- return
-
- if(user.a_intent == I_HARM)
- user.visible_message("\The [user] squashes \the [src]! ")
- seed.thrown_at(src,user)
- sleep(-1)
- if(src) qdel(src)
- return
-
- if(user.a_intent == I_DISARM && seed.get_trait(TRAIT_SPREAD) > 0) //Using disarm so we can tell if you want to plant or convert non-final plants
- to_chat(user, "You plant the [src.name]. ")
- new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed)
- new /obj/effect/plant(get_turf(user), src.seed)
- qdel(src)
- return
-
-
- if(!seed.final_form) //This isn't even my final form! (sorry, it had to be done)
- switch(seed.kitchen_tag)
- if("comfrey")
- var/obj/item/stack/medical/bruise_pack/comfrey/poultice = new /obj/item/stack/medical/bruise_pack/comfrey(user.loc)
- poultice.heal_brute = potency
- to_chat(user, "You mash the leaves into a poultice. ")
- qdel(src)
- return
- if("aloe")
- var/obj/item/stack/medical/ointment/aloe/poultice = new /obj/item/stack/medical/ointment/aloe(user.loc)
- poultice.heal_burn = potency
- to_chat(user, "You mash the petals into a poultice. ")
- qdel(src)
- return
- if("grass")
- user.show_message("You make a grass tile out of \the [src]! ", 1)
- for(var/i=0,i<2,i++)
- var/obj/item/stack/tile/grass/G = new (user.loc)
- G.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- for(var/obj/item/stack/tile/grass/NG in user.loc)
- if(G==NG)
- continue
- if(NG.amount>=NG.max_amount)
- continue
- NG.attackby(G, user)
- to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.amount] tiles.")
- qdel(src)
- return
- if("sunflower")
- var/obj/item/weapon/grown/sunflower/SF = new /obj/item/weapon/grown/sunflower(user.loc)
- user.unEquip(src)
- user.put_in_hands(SF)
- qdel(src)
- return
- if("novaflower")
- var/obj/item/weapon/grown/novaflower/NF = new /obj/item/weapon/grown/novaflower(user.loc)
- if(prob(10))
- user.say("PRAISE THE SUN!")
- else
- to_chat(user, "PRAISE THE SUN!")
- user.unEquip(src)
- user.put_in_hands(NF)
- qdel(src)
- return
- if("nettle")
- var/obj/item/weapon/grown/nettle/nettle = new /obj/item/weapon/grown/nettle(user.loc)
- nettle.force = round((5 + potency / 5), 1)
- to_chat(user, "You straighten up the plant.")
- user.unEquip(src)
- user.put_in_hands(nettle)
- qdel(src)
- return
- if("deathnettle")
- var/obj/item/weapon/grown/nettle/death/DN = new /obj/item/weapon/grown/nettle/death(user.loc)
- DN.force = round((5 + potency / 2.5), 1)
- to_chat(user, "You straighten up the plant.")
- user.unEquip(src)
- user.put_in_hands(DN)
- qdel(src)
- return
- if("killertomato")
- if(awakening || istype(user.loc,/turf/space))
- return
- to_chat(user, "You begin to awaken the Killer Tomato... ")
- awakening = 1
-
- spawn(30)
- if(!qdeleted(src))
- var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc))
- var/endurance_value = seed.get_trait(TRAIT_ENDURANCE)
- K.maxHealth += round(endurance_value / 3)
- K.melee_damage_lower += round(potency / 10)
- K.melee_damage_upper += round(potency / 10)
- var/production_value = seed.get_trait(TRAIT_PRODUCTION)
- K.move_to_delay -= round(production_value / 50)
- K.health = K.maxHealth
- K.visible_message("The Killer Tomato growls as it suddenly awakens. ")
- if(user)
- user.unEquip(src)
- qdel(src)
- if("cashpod")
- to_chat(user, "You crack open the cash pod...")
- var/value = round(seed.get_trait(TRAIT_POTENCY))
- user.unEquip(src)
- switch(value)
- if(0)
- to_chat(user, "It's empty! What a waste...")
- if(1 to 10)
- to_chat(user, "It has a space dollar inside. Woo.")
- new /obj/item/weapon/spacecash(get_turf(user))
- if(11 to 20)
- to_chat(user, "It has 10 space dollars inside!")
- new /obj/item/weapon/spacecash/c10(get_turf(user))
- if(21 to 30)
- to_chat(user, "It has 20 space dollars inside! Cool!")
- new /obj/item/weapon/spacecash/c20(get_turf(user))
- if(31 to 40)
- to_chat(user, "It has 50 space dollars inside! Nice!")
- new /obj/item/weapon/spacecash/c50(get_turf(user))
- if(41 to 50)
- to_chat(user, "It has 100 space dollars inside! Sweet!")
- new /obj/item/weapon/spacecash/c100(get_turf(user))
- if(51 to 60)
- to_chat(user, "It has 200 space dollars inside! Awesome!")
- new /obj/item/weapon/spacecash/c200(get_turf(user))
- if(61 to 80)
- to_chat(user, "It has 500 space dollars inside! CHA-CHING!")
- new /obj/item/weapon/spacecash/c500(get_turf(user))
- else
- to_chat(user, "It has 1000 space dollars inside! JACKPOT!")
- new /obj/item/weapon/spacecash/c1000(get_turf(user))
- qdel(src)
- return
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/pickup(mob/user)
+/obj/item/weapon/reagent_containers/food/snacks/grown/examine(user)
..()
- if(!seed)
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ if(T.examine_line)
+ to_chat(user, T.examine_line)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params)
+ ..()
+ if (istype(O, /obj/item/device/plant_analyzer))
+ var/msg = "*---------*\n This is \a [src] .\n"
+ if(seed)
+ msg += seed.get_analyzer_text()
+ var/reag_txt = ""
+ if(seed)
+ for(var/reagent_id in seed.reagents_add)
+ var/datum/reagent/R = chemical_reagents_list[reagent_id]
+ var/amt = reagents.get_reagent_amount(reagent_id)
+ reag_txt += "\n- [R.name]: [amt] "
+
+ if(reag_txt)
+ msg += reag_txt
+ msg += "*---------* "
+ to_chat(user, msg)
+ else
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_attackby(src, O, user)
+
+
+// Various gene procs
+/obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user)
+ if(seed && seed.get_gene(/datum/plant_gene/trait/squash))
+ squash(user)
+ ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
+ if(!..()) //was it caught by a mob?
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_throw_impact(src, hit_atom)
+ if(seed.get_gene(/datum/plant_gene/trait/squash))
+ squash(hit_atom)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/proc/squash(atom/target)
+ var/turf/T = get_turf(target)
+ if(ispath(splat_type, /obj/effect/decal/cleanable/plant_smudge))
+ if(filling_color)
+ var/obj/O = new splat_type(T)
+ O.color = filling_color
+ O.name = "[name] smudge"
+ else if(splat_type)
+ new splat_type(T)
+
+ if(trash)
+ generate_trash(T)
+
+ visible_message("[src] has been squashed. ","You hear a smack. ")
+ if(seed)
+ for(var/datum/plant_gene/trait/trait in seed.genes)
+ trait.on_squash(src, target)
+
+ for(var/A in T)
+ if(reagents)
+ reagents.reaction(A)
+
+ qdel(src)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/On_Consume()
+ if(iscarbon(usr))
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_consume(src, usr)
+ ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM)
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_cross(src, AM)
+ ..()
+
+
+// Glow gene procs
+/obj/item/weapon/reagent_containers/food/snacks/grown/generate_trash(atom/location)
+ if(trash && ispath(trash, /obj/item/weapon/grown))
+ . = new trash(location, seed)
+ trash = null
return
- if(seed.get_trait(TRAIT_STINGS))
- var/mob/living/carbon/human/H = user
- if(istype(H) && H.gloves)
- return
- if(!reagents || reagents.total_volume <= 0)
- return
- reagents.remove_any(rand(1,3)) //Todo, make it actually remove the reagents the seed uses.
- seed.do_thorns(H,src)
- seed.do_sting(H,src,pick("r_hand","l_hand"))
+ return ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/On_Consume(mob/M, mob/user)
- if(seed && seed.get_trait(TRAIT_BATTERY_RECHARGE))
- if(!reagents.total_volume)
- var/batteries_recharged = 0
- for(var/obj/item/weapon/stock_parts/cell/C in user.GetAllContents())
- var/newcharge = (potency*0.01)*C.maxcharge
- if(C.charge < newcharge)
- C.charge = newcharge
- if(isobj(C.loc))
- var/obj/O = C.loc
- O.update_icon() //update power meters and such
- batteries_recharged = 1
- if(batteries_recharged)
- to_chat(user, "Battery has recovered. ")
- ..()
\ No newline at end of file
+// For item-containing growns such as eggy or gatfruit
+/obj/item/weapon/reagent_containers/food/snacks/grown/shell/attack_self(mob/user)
+ user.unEquip(src)
+ if(trash)
+ var/obj/item/T = generate_trash()
+ user.put_in_hands(T)
+ to_chat(user, "You open [src]\'s shell, revealing \a [T]. ")
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
new file mode 100644
index 00000000000..f1dac422fad
--- /dev/null
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -0,0 +1,86 @@
+// Ambrosia - base type
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia
+ seed = /obj/item/seeds/ambrosia
+ name = "ambrosia branch"
+ desc = "This is a plant."
+ icon_state = "ambrosiavulgaris"
+ slot_flags = SLOT_HEAD
+ filling_color = "#008000"
+ bitesize_mod = 2
+
+// Ambrosia Vulgaris
+/obj/item/seeds/ambrosia
+ name = "pack of ambrosia vulgaris seeds"
+ desc = "These seeds grow into common ambrosia, a plant grown by and from medicine."
+ icon_state = "seed-ambrosiavulgaris"
+ species = "ambrosiavulgaris"
+ plantname = "Ambrosia Vulgaris"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris
+ lifespan = 60
+ endurance = 25
+ yield = 6
+ potency = 5
+ icon_dead = "ambrosia-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/ambrosia/deus)
+ reagents_add = list("space_drugs" = 0.15, "bicaridine" = 0.1, "kelotane" = 0.1, "vitamin" = 0.04, "plantmatter" = 0.05, "toxin" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris
+ seed = /obj/item/seeds/ambrosia
+ name = "ambrosia vulgaris branch"
+ desc = "This is a plant containing various healing chemicals."
+ origin_tech = "biotech=2"
+
+// Ambrosia Deus
+/obj/item/seeds/ambrosia/deus
+ name = "pack of ambrosia deus seeds"
+ desc = "These seeds grow into ambrosia deus. Could it be the food of the gods..?"
+ icon_state = "seed-ambrosiadeus"
+ species = "ambrosiadeus"
+ plantname = "Ambrosia Deus"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus
+ mutatelist = list(/obj/item/seeds/ambrosia/gaia)
+ reagents_add = list("weak_omnizine" = 0.15, "synaptizine" = 0.15, "space_drugs" = 0.1, "vitamin" = 0.04, "plantmatter" = 0.05)
+ rarity = 40
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus
+ seed = /obj/item/seeds/ambrosia/deus
+ name = "ambrosia deus branch"
+ desc = "Eating this makes you feel immortal!"
+ icon_state = "ambrosiadeus"
+ filling_color = "#008B8B"
+ origin_tech = "biotech=4;materials=3"
+
+//Ambrosia Gaia
+/obj/item/seeds/ambrosia/gaia
+ name = "pack of ambrosia gaia seeds"
+ desc = "These seeds grow into ambrosia gaia, filled with infinite potential."
+ icon_state = "seed-ambrosia_gaia"
+ species = "ambrosia_gaia"
+ plantname = "Ambrosia Gaia"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia
+ mutatelist = list()
+ reagents_add = list("earthsblood" = 0.05, "nutriment" = 0.06, "vitamin" = 0.05)
+ rarity = 30 //These are some pretty good plants right here
+ genes = list()
+ weed_rate = 4
+ weed_chance = 100
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia
+ name = "ambrosia gaia branch"
+ desc = "Eating this makes you immortal."
+ icon_state = "ambrosia_gaia"
+ filling_color = rgb(255, 175, 0)
+ origin_tech = "biotech=6;materials=5"
+ light_range = 3
+ seed = /obj/item/seeds/ambrosia/gaia
+
+// Ambrosia Cruciatus
+/obj/item/seeds/ambrosia/cruciatus
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/cruciatus
+ potency = 10
+ mutatelist = list()
+ reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/cruciatus
+ seed = /obj/item/seeds/ambrosia/cruciatus
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm
new file mode 100644
index 00000000000..9300eb73fef
--- /dev/null
+++ b/code/modules/hydroponics/grown/apple.dm
@@ -0,0 +1,57 @@
+// Apple
+/obj/item/seeds/apple
+ name = "pack of apple seeds"
+ desc = "These seeds grow into apple trees."
+ icon_state = "seed-apple"
+ species = "apple"
+ plantname = "Apple Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple
+ lifespan = 55
+ endurance = 35
+ yield = 5
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "apple-grow"
+ icon_dead = "apple-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/apple/gold)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/apple
+ seed = /obj/item/seeds/apple
+ name = "apple"
+ desc = "It's a little piece of Eden."
+ icon_state = "apple"
+ filling_color = "#FF4500"
+ bitesize = 100 // Always eat the apple in one bite
+
+// Posioned Apple
+/obj/item/seeds/apple/poisoned
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned
+ mutatelist = list()
+ reagents_add = list("cyanide" = 0.5, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 50 // Source of cyanide, and hard (almost impossible) to obtain normally.
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned
+ seed = /obj/item/seeds/apple/poisoned
+
+// Gold Apple
+/obj/item/seeds/apple/gold
+ name = "pack of golden apple seeds"
+ desc = "These seeds grow into golden apple trees. Good thing there are no firebirds in space."
+ icon_state = "seed-goldapple"
+ species = "goldapple"
+ plantname = "Golden Apple Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
+ maturation = 10
+ production = 10
+ mutatelist = list()
+ reagents_add = list("gold" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 40 // Alchemy!
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
+ seed = /obj/item/seeds/apple/gold
+ name = "golden apple"
+ desc = "Emblazoned upon the apple is the word 'Kallisti'."
+ icon_state = "goldapple"
+ filling_color = "#FFD700"
+ origin_tech = "biotech=4;materials=5"
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
new file mode 100644
index 00000000000..8301b021cc4
--- /dev/null
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -0,0 +1,121 @@
+// Banana
+/obj/item/seeds/banana
+ name = "pack of banana seeds"
+ desc = "They're seeds that grow into banana trees. When grown, keep away from clown."
+ icon_state = "seed-banana"
+ species = "banana"
+ plantname = "Banana Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
+ lifespan = 50
+ endurance = 30
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_dead = "banana-dead"
+ genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/banana/mime, /obj/item/seeds/banana/bluespace)
+ reagents_add = list("banana" = 0.1, "potassium" = 0.1, "vitamin" = 0.04, "plantmatter" = 0.02)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/banana
+ seed = /obj/item/seeds/banana
+ name = "banana"
+ desc = "It's an excellent prop for a clown."
+ icon_state = "banana"
+ item_state = "banana"
+ trash = /obj/item/weapon/grown/bananapeel
+ filling_color = "#FFFF00"
+ bitesize = 5
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
+ user.visible_message("[user] is aiming the [src.name] at themself! It looks like \he's trying to commit suicide. ")
+ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
+ sleep(25)
+ if(!user)
+ return (OXYLOSS)
+ user.say("BANG!")
+ sleep(25)
+ if(!user)
+ return (OXYLOSS)
+ user.visible_message("[user] laughs so hard they begin to suffocate!")
+ return (OXYLOSS)
+
+/obj/item/weapon/grown/bananapeel
+ seed = /obj/item/seeds/banana
+ name = "banana peel"
+ desc = "A peel from a banana."
+ icon_state = "banana_peel"
+ item_state = "banana_peel"
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+
+/obj/item/weapon/grown/bananapeel/suicide_act(mob/user)
+ user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like \he's trying to commit suicide. ")
+ playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
+
+// Mimana - invisible sprites are totally a feature!
+/obj/item/seeds/banana/mime
+ name = "pack of mimana seeds"
+ desc = "They're seeds that grow into mimana trees. When grown, keep away from mime."
+ icon_state = "seed-mimana"
+ species = "mimana"
+ plantname = "Mimana Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime
+ growthstages = 4
+ mutatelist = list()
+ reagents_add = list("nothing" = 0.1, "capulettium_plus" = 0.1, "nutriment" = 0.02)
+ rarity = 15
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime
+ seed = /obj/item/seeds/banana/mime
+ name = "mimana"
+ desc = "It's an excellent prop for a mime."
+ icon_state = "mimana"
+ trash = /obj/item/weapon/grown/bananapeel/mimanapeel
+ filling_color = "#FFFFEE"
+
+/obj/item/weapon/grown/bananapeel/mimanapeel
+ seed = /obj/item/seeds/banana/mime
+ name = "mimana peel"
+ desc = "A mimana peel."
+ icon_state = "mimana_peel"
+
+// Bluespace Banana
+/obj/item/seeds/banana/bluespace
+ name = "pack of bluespace banana seeds"
+ desc = "They're seeds that grow into bluespace banana trees. When grown, keep away from bluespace clown."
+ icon_state = "seed-banana-blue"
+ species = "bluespacebanana"
+ icon_grow = "banana-grow"
+ plantname = "Bluespace Banana Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana/bluespace
+ mutatelist = list()
+ genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("singulo" = 0.2, "banana" = 0.1, "vitamin" = 0.04, "plantmatter" = 0.02)
+ rarity = 30
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/banana/bluespace
+ seed = /obj/item/seeds/banana/bluespace
+ name = "bluespace banana"
+ icon_state = "banana_blue"
+ trash = /obj/item/weapon/grown/bananapeel/bluespace
+ filling_color = "#0000FF"
+ origin_tech = "biotech=3;bluespace=5"
+
+/obj/item/weapon/grown/bananapeel/bluespace
+ seed = /obj/item/seeds/banana/bluespace
+ name = "bluespace banana peel"
+ desc = "A peel from a bluespace banana."
+ icon_state = "banana_peel_blue"
+
+// Other
+/obj/item/weapon/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
+ name = "synthesized banana peel"
+ desc = "A synthetic banana peel."
+
+/obj/item/weapon/grown/bananapeel/specialpeel/Crossed(AM)
+ if(iscarbon(AM))
+ var/mob/living/carbon/carbon = AM
+ if(carbon.slip("[src]", 2, 2))
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm
new file mode 100644
index 00000000000..d939387fe2b
--- /dev/null
+++ b/code/modules/hydroponics/grown/beans.dm
@@ -0,0 +1,48 @@
+// Soybeans
+/obj/item/seeds/soya
+ name = "pack of soybean seeds"
+ desc = "These seeds grow into soybean plants."
+ icon_state = "seed-soybean"
+ species = "soybean"
+ plantname = "Soybean Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
+ maturation = 4
+ production = 4
+ potency = 15
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "soybean-grow"
+ icon_dead = "soybean-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/soya/koi)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
+ seed = /obj/item/seeds/soya
+ name = "soybeans"
+ desc = "It's pretty bland, but oh the possibilities..."
+ gender = PLURAL
+ icon_state = "soybeans"
+ filling_color = "#F0E68C"
+ bitesize_mod = 2
+
+// Koibean
+/obj/item/seeds/soya/koi
+ name = "pack of koibean seeds"
+ desc = "These seeds grow into koibean plants."
+ icon_state = "seed-koibean"
+ species = "koibean"
+ plantname = "Koibean Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/koibeans
+ potency = 10
+ mutatelist = list()
+ reagents_add = list("carpotoxin" = 0.1, "vitamin" = 0.04, "plantmatter" = 0.05)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/koibeans
+ seed = /obj/item/seeds/soya/koi
+ name = "koibean"
+ desc = "Something about these seems fishy."
+ icon_state = "koibeans"
+ filling_color = "#F0E68C"
+ bitesize_mod = 2
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
new file mode 100644
index 00000000000..ff411e0b990
--- /dev/null
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -0,0 +1,188 @@
+// Berries
+/obj/item/seeds/berry
+ name = "pack of berry seeds"
+ desc = "These seeds grow into berry bushes."
+ icon_state = "seed-berry"
+ species = "berry"
+ plantname = "Berry Bush"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries
+ lifespan = 20
+ maturation = 5
+ production = 5
+ yield = 2
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes
+ icon_dead = "berry-dead" // Same for the dead icon
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/berry/glow, /obj/item/seeds/berry/poison)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/berries
+ seed = /obj/item/seeds/berry
+ name = "bunch of berries"
+ desc = "Nutritious!"
+ icon_state = "berrypile"
+ gender = PLURAL
+ filling_color = "#FF00FF"
+ bitesize_mod = 2
+
+// Poison Berries
+/obj/item/seeds/berry/poison
+ name = "pack of poison-berry seeds"
+ desc = "These seeds grow into poison-berry bushes."
+ icon_state = "seed-poisonberry"
+ species = "poisonberry"
+ plantname = "Poison-Berry Bush"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison
+ mutatelist = list(/obj/item/seeds/berry/death)
+ reagents_add = list("cyanide" = 0.15, "tirizene" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 10 // Mildly poisonous berries are common in reality
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison
+ seed = /obj/item/seeds/berry/poison
+ name = "bunch of poison-berries"
+ desc = "Taste so good, you could die!"
+ icon_state = "poisonberrypile"
+ filling_color = "#C71585"
+
+// Death Berries
+/obj/item/seeds/berry/death
+ name = "pack of death-berry seeds"
+ desc = "These seeds grow into death berries."
+ icon_state = "seed-deathberry"
+ species = "deathberry"
+ plantname = "Death Berry Bush"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/death
+ lifespan = 30
+ potency = 50
+ mutatelist = list()
+ reagents_add = list("coniine" = 0.08, "tirizene" = 0.1, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 30
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/berries/death
+ seed = /obj/item/seeds/berry/death
+ name = "bunch of death-berries"
+ desc = "Taste so good, you could die!"
+ icon_state = "deathberrypile"
+ filling_color = "#708090"
+
+// Glow Berries
+/obj/item/seeds/berry/glow
+ name = "pack of glow-berry seeds"
+ desc = "These seeds grow into glow-berry bushes."
+ icon_state = "seed-glowberry"
+ species = "glowberry"
+ plantname = "Glow-Berry Bush"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow
+ lifespan = 30
+ endurance = 25
+ mutatelist = list()
+ genes = list(/datum/plant_gene/trait/glow/berry , /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("uranium" = 0.25, "iodine" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow
+ seed = /obj/item/seeds/berry/glow
+ name = "bunch of glow-berries"
+ desc = "Nutritious!"
+ icon_state = "glowberrypile"
+ filling_color = "#7CFC00"
+ origin_tech = "plasmatech=6"
+ light_color = "#006622"
+
+// Cherries
+/obj/item/seeds/cherry
+ name = "pack of cherry pits"
+ desc = "Careful not to crack a tooth on one... That'd be the pits."
+ icon_state = "seed-cherry"
+ species = "cherry"
+ plantname = "Cherry Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cherries
+ lifespan = 35
+ endurance = 35
+ maturation = 5
+ production = 5
+ growthstages = 5
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "cherry-grow"
+ icon_dead = "cherry-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/cherry/blue)
+ reagents_add = list("plantmatter" = 0.07, "sugar" = 0.07)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherries
+ seed = /obj/item/seeds/cherry
+ name = "cherries"
+ desc = "Great for toppings!"
+ icon_state = "cherry"
+ gender = PLURAL
+ filling_color = "#FF0000"
+ bitesize_mod = 2
+
+// Blue Cherries
+/obj/item/seeds/cherry/blue
+ name = "pack of blue cherry pits"
+ desc = "The blue kind of cherries"
+ icon_state = "seed-bluecherry"
+ species = "bluecherry"
+ plantname = "Blue Cherry Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries
+ mutatelist = list()
+ reagents_add = list("plantmatter" = 0.07, "sugar" = 0.07)
+ rarity = 10
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries
+ seed = /obj/item/seeds/cherry/blue
+ name = "blue cherries"
+ desc = "They're cherries that are blue."
+ icon_state = "bluecherry"
+ filling_color = "#6495ED"
+ bitesize_mod = 2
+
+// Grapes
+/obj/item/seeds/grape
+ name = "pack of grape seeds"
+ desc = "These seeds grow into grape vines."
+ icon_state = "seed-grapes"
+ species = "grape"
+ plantname = "Grape Vine"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/grapes
+ lifespan = 50
+ endurance = 25
+ maturation = 3
+ production = 5
+ yield = 4
+ growthstages = 2
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "grape-grow"
+ icon_dead = "grape-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/grape/green)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1, "sugar" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/grapes
+ seed = /obj/item/seeds/grape
+ name = "bunch of grapes"
+ desc = "Nutritious!"
+ icon_state = "grapes"
+ dried_type = /obj/item/weapon/reagent_containers/food/snacks/no_raisin
+ filling_color = "#FF1493"
+ bitesize_mod = 2
+
+// Green Grapes
+/obj/item/seeds/grape/green
+ name = "pack of green grape seeds"
+ desc = "These seeds grow into green-grape vines."
+ icon_state = "seed-greengrapes"
+ species = "greengrape"
+ plantname = "Green-Grape Vine"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green
+ reagents_add = list("kelotane" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1, "sugar" = 0.1)
+ // No rarity: technically it's a beneficial mutant, but it's not exactly "new"...
+ mutatelist = list()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green
+ seed = /obj/item/seeds/grape/green
+ name = "bunch of green grapes"
+ icon_state = "greengrapes"
+ filling_color = "#7FFF00"
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
new file mode 100644
index 00000000000..ab1dff988e8
--- /dev/null
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -0,0 +1,121 @@
+// Cannabis
+/obj/item/seeds/cannabis
+ name = "pack of cannabis seeds"
+ desc = "Taxable."
+ icon_state = "seed-cannabis"
+ species = "cannabis"
+ plantname = "Cannabis Plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis
+ maturation = 8
+ potency = 20
+ growthstages = 1
+ growing_icon = 'icons/goonstation/objects/hydroponics.dmi'
+ icon_grow = "cannabis-grow" // Uses one growth icons set for all the subtypes
+ icon_dead = "cannabis-dead" // Same for the dead icon
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/cannabis/rainbow,
+ /obj/item/seeds/cannabis/death,
+ /obj/item/seeds/cannabis/white,
+ /obj/item/seeds/cannabis/ultimate)
+ reagents_add = list("thc" = 0.15)
+
+
+/obj/item/seeds/cannabis/rainbow
+ name = "pack of rainbow weed seeds"
+ desc = "These seeds grow into rainbow weed. Groovy."
+ icon_state = "seed-megacannabis"
+ species = "megacannabis"
+ plantname = "Rainbow Weed"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow
+ mutatelist = list()
+ reagents_add = list("lsd" = 0.15, "thc" = 0.15)
+ rarity = 40
+
+/obj/item/seeds/cannabis/death
+ name = "pack of deathweed seeds"
+ desc = "These seeds grow into deathweed. Not groovy."
+ icon_state = "seed-blackcannabis"
+ species = "blackcannabis"
+ plantname = "Deathweed"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/death
+ mutatelist = list()
+ reagents_add = list("cyanide" = 0.35, "thc" = 0.15)
+ rarity = 40
+
+/obj/item/seeds/cannabis/white
+ name = "pack of lifeweed seeds"
+ desc = "I will give unto him that is munchies of the fountain of the cravings of life, freely."
+ icon_state = "seed-whitecannabis"
+ species = "whitecannabis"
+ plantname = "Lifeweed"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/white
+ mutatelist = list()
+ reagents_add = list("omnizine" = 0.35, "thc" = 0.15)
+ rarity = 40
+
+
+/obj/item/seeds/cannabis/ultimate
+ name = "pack of omega weed seeds"
+ desc = "These seeds grow into omega weed."
+ icon_state = "seed-ocannabis"
+ species = "ocannabis"
+ plantname = "Omega Weed"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/ultimate
+ mutatelist = list()
+ reagents_add = list("lsd" = 0.15,
+ "suicider" = 0.15,
+ "space_drugs" = 0.15,
+ "mercury" = 0.15,
+ "lithium" = 0.15,
+ "atropine" = 0.15,
+ "ephedrine" = 0.15,
+ "haloperidol" = 0.15,
+ "methamphetamine" = 0.15,
+ "thc" = 0.15,
+ "psilocybin" = 0.15,
+ "hairgrownium" = 0.15,
+ "ectoplasm" = 0.15,
+ "bath_salts" = 0.15,
+ "itching_powder" = 0.15,
+ "crank" = 0.15,
+ "krokodil" = 0.15,
+ "histamine" = 0.15)
+ rarity = 69
+
+
+// ---------------------------------------------------------------
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis
+ seed = /obj/item/seeds/cannabis
+ icon = 'icons/goonstation/objects/hydroponics.dmi'
+ name = "cannabis leaf"
+ desc = "Recently legalized in most galaxies."
+ icon_state = "cannabis"
+ filling_color = "#00FF00"
+ bitesize_mod = 2
+
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow
+ seed = /obj/item/seeds/cannabis/rainbow
+ name = "rainbow cannabis leaf"
+ desc = "Is it supposed to be glowing like that...?"
+ icon_state = "megacannabis"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/death
+ seed = /obj/item/seeds/cannabis/death
+ name = "death cannabis leaf"
+ desc = "Looks a bit dark. Oh well."
+ icon_state = "blackcannabis"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/white
+ seed = /obj/item/seeds/cannabis/white
+ name = "white cannabis leaf"
+ desc = "It feels smooth and nice to the touch."
+ icon_state = "whitecannabis"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/ultimate
+ seed = /obj/item/seeds/cannabis/ultimate
+ name = "omega cannibas leaf"
+ desc = "You feel dizzy looking at it. What the fuck?"
+ icon_state = "ocannabis"
+ volume = 420
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
new file mode 100644
index 00000000000..040e557352c
--- /dev/null
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -0,0 +1,91 @@
+// Wheat
+/obj/item/seeds/wheat
+ name = "pack of wheat seeds"
+ desc = "These may, or may not, grow into wheat."
+ icon_state = "seed-wheat"
+ species = "wheat"
+ plantname = "Wheat Stalks"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat
+ production = 1
+ yield = 4
+ potency = 15
+ icon_dead = "wheat-dead"
+ mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat)
+ reagents_add = list("plantmatter" = 0.04)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/wheat
+ seed = /obj/item/seeds/wheat
+ name = "wheat"
+ desc = "Sigh... wheat... a-grain?"
+ gender = PLURAL
+ icon_state = "wheat"
+ filling_color = "#F0E68C"
+ bitesize_mod = 2
+
+// Oat
+/obj/item/seeds/wheat/oat
+ name = "pack of oat seeds"
+ desc = "These may, or may not, grow into oat."
+ icon_state = "seed-oat"
+ species = "oat"
+ plantname = "Oat Stalks"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/oat
+ mutatelist = list()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/oat
+ seed = /obj/item/seeds/wheat/oat
+ name = "oat"
+ desc = "Eat oats, do squats."
+ gender = PLURAL
+ icon_state = "oat"
+ filling_color = "#556B2F"
+ bitesize_mod = 2
+
+// Rice
+/obj/item/seeds/wheat/rice
+ name = "pack of rice seeds"
+ desc = "These may, or may not, grow into rice."
+ icon_state = "seed-rice"
+ species = "rice"
+ plantname = "Rice Stalks"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/rice
+ mutatelist = list()
+ growthstages = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/rice
+ seed = /obj/item/seeds/wheat/rice
+ name = "rice"
+ desc = "Rice to meet you."
+ gender = PLURAL
+ icon_state = "rice"
+ filling_color = "#FAFAD2"
+ bitesize_mod = 2
+
+//Meatwheat - grows into synthetic meat
+/obj/item/seeds/wheat/meat
+ name = "pack of meatwheat seeds"
+ desc = "If you ever wanted to drive a vegetarian to insanity, here's how."
+ icon_state = "seed-meatwheat"
+ species = "meatwheat"
+ plantname = "Meatwheat"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat
+ mutatelist = list()
+ reagents_add = list("protein" = 0.04)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat
+ name = "meatwheat"
+ desc = "Some blood-drenched wheat stalks. You can crush them into what passes for meat if you squint hard enough."
+ icon_state = "meatwheat"
+ gender = PLURAL
+ filling_color = rgb(150, 0, 0)
+ bitesize_mod = 2
+ seed = /obj/item/seeds/wheat/meat
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user)
+ user.visible_message("[user] crushes [src] into meat. ", "You crush [src] into something that resembles meat. ")
+ playsound(user, 'sound/effects/blobattack.ogg', 50, 1)
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/meatwheat/M = new(get_turf(user))
+ user.drop_item()
+ qdel(src)
+ user.put_in_hands(M)
+ return 1
diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm
new file mode 100644
index 00000000000..c80ffa561d3
--- /dev/null
+++ b/code/modules/hydroponics/grown/chili.dm
@@ -0,0 +1,76 @@
+// Chili
+/obj/item/seeds/chili
+ name = "pack of chili seeds"
+ desc = "These seeds grow into chili plants. HOT! HOT! HOT!"
+ icon_state = "seed-chili"
+ species = "chili"
+ plantname = "Chili Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/chili
+ lifespan = 20
+ maturation = 5
+ production = 5
+ yield = 4
+ potency = 20
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "chili-grow" // Uses one growth icons set for all the subtypes
+ icon_dead = "chili-dead" // Same for the dead icon
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/chili/ice, /obj/item/seeds/chili/ghost)
+ reagents_add = list("capsaicin" = 0.25, "vitamin" = 0.04, "plantmatter" = 0.04)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/chili
+ seed = /obj/item/seeds/chili
+ name = "chili"
+ desc = "It's spicy! Wait... IT'S BURNING ME!!"
+ icon_state = "chilipepper"
+ filling_color = "#FF0000"
+ bitesize_mod = 2
+
+// Ice Chili
+/obj/item/seeds/chili/ice
+ name = "pack of ice pepper seeds"
+ desc = "These seeds grow into ice pepper plants."
+ icon_state = "seed-icepepper"
+ species = "chiliice"
+ plantname = "Ice Pepper Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
+ lifespan = 25
+ maturation = 4
+ production = 4
+ rarity = 20
+ mutatelist = list()
+ reagents_add = list("frostoil" = 0.25, "vitamin" = 0.02, "plantmatter" = 0.02)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
+ seed = /obj/item/seeds/chili/ice
+ name = "ice pepper"
+ desc = "It's a mutant strain of chili"
+ icon_state = "icepepper"
+ filling_color = "#0000CD"
+ bitesize_mod = 2
+ origin_tech = "biotech=4"
+
+// Ghost Chili
+/obj/item/seeds/chili/ghost
+ name = "pack of ghost chili seeds"
+ desc = "These seeds grow into a chili said to be the hottest in the galaxy."
+ icon_state = "seed-chilighost"
+ species = "chilighost"
+ plantname = "Ghost Chili Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili
+ endurance = 10
+ maturation = 10
+ production = 10
+ yield = 3
+ rarity = 20
+ mutatelist = list()
+ reagents_add = list("condensedcapsaicin" = 0.3, "capsaicin" = 0.55, "plantmatter" = 0.04)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili
+ seed = /obj/item/seeds/chili/ghost
+ name = "ghost chili"
+ desc = "It seems to be vibrating gently."
+ icon_state = "ghostchilipepper"
+ filling_color = "#F8F8FF"
+ bitesize_mod = 4
+ origin_tech = "biotech=4;magnets=5"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
new file mode 100644
index 00000000000..1657dd0e955
--- /dev/null
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -0,0 +1,155 @@
+// Citrus - base type
+/obj/item/weapon/reagent_containers/food/snacks/grown/citrus
+ seed = /obj/item/seeds/lime
+ name = "citrus"
+ desc = "It's so sour, your face will twist."
+ icon_state = "lime"
+ bitesize_mod = 2
+
+// Lime
+/obj/item/seeds/lime
+ name = "pack of lime seeds"
+ desc = "These are very sour seeds."
+ icon_state = "seed-lime"
+ species = "lime"
+ plantname = "Lime Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
+ lifespan = 55
+ endurance = 50
+ yield = 4
+ potency = 15
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/orange)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
+ seed = /obj/item/seeds/lime
+ name = "lime"
+ desc = "It's so sour, your face will twist."
+ icon_state = "lime"
+ filling_color = "#00FF00"
+
+// Orange
+/obj/item/seeds/orange
+ name = "pack of orange seeds"
+ desc = "Sour seeds."
+ icon_state = "seed-orange"
+ species = "orange"
+ plantname = "Orange Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
+ lifespan = 60
+ endurance = 50
+ yield = 5
+ potency = 20
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "lime-grow"
+ icon_dead = "lime-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/lime)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
+ seed = /obj/item/seeds/orange
+ name = "orange"
+ desc = "It's an tangy fruit."
+ icon_state = "orange"
+ filling_color = "#FFA500"
+
+// Lemon
+/obj/item/seeds/lemon
+ name = "pack of lemon seeds"
+ desc = "These are sour seeds."
+ icon_state = "seed-lemon"
+ species = "lemon"
+ plantname = "Lemon Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
+ lifespan = 55
+ endurance = 45
+ yield = 4
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "lime-grow"
+ icon_dead = "lime-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/firelemon)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
+ seed = /obj/item/seeds/lemon
+ name = "lemon"
+ desc = "When life gives you lemons, make lemonade."
+ icon_state = "lemon"
+ filling_color = "#FFD700"
+
+// Combustible lemon
+/obj/item/seeds/firelemon //combustible lemon is too long so firelemon
+ name = "pack of combustible lemon seeds"
+ desc = "When life gives you lemons, don't make lemonade. Make life take the lemons back! Get mad! I don't want your damn lemons!"
+ icon_state = "seed-firelemon"
+ species = "firelemon"
+ plantname = "Combustible Lemon Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/firelemon
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "lime-grow"
+ icon_dead = "lime-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ lifespan = 55
+ endurance = 45
+ yield = 4
+ reagents_add = list("plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon
+ seed = /obj/item/seeds/firelemon
+ name = "Combustible Lemon"
+ desc = "Made for burning houses down."
+ icon_state = "firelemon"
+ bitesize_mod = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user)
+ var/area/A = get_area(user)
+ user.visible_message("[user] primes the [src]! ", "You prime the [src]! ")
+ var/message = "[ADMIN_LOOKUPFLW(user)] primed a combustible lemon for detonation at [A] [ADMIN_COORDJMP(user)]"
+ bombers += message
+ message_admins(message)
+ log_game("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].")
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.throw_mode_on()
+ icon_state = "firelemon_active"
+ playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ addtimer(src, "prime", rand(10, 60))
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/burn()
+ prime()
+ ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/proc/update_mob()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.unEquip(src)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/ex_act(severity)
+ qdel(src) //Ensuring that it's deleted by its own explosion
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/proc/prime()
+ switch(seed.potency) //Combustible lemons are alot like IEDs, lots of flame, very little bang.
+ if(0 to 30)
+ update_mob()
+ explosion(loc,-1,-1,2, flame_range = 1)
+ qdel(src)
+ if(31 to 50)
+ update_mob()
+ explosion(loc,-1,-1,2, flame_range = 2)
+ qdel(src)
+ if(51 to 70)
+ update_mob()
+ explosion(loc,-1,-1,2, flame_range = 3)
+ qdel(src)
+ if(71 to 90)
+ update_mob()
+ explosion(loc,-1,-1,2, flame_range = 4)
+ qdel(src)
+ else
+ update_mob()
+ explosion(loc,-1,-1,2, flame_range = 5)
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm
new file mode 100644
index 00000000000..74754fac13e
--- /dev/null
+++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm
@@ -0,0 +1,46 @@
+// Cocoa Pod
+/obj/item/seeds/cocoapod
+ name = "pack of cocoa pod seeds"
+ desc = "These seeds grow into cacao trees. They look fattening." //SIC: cocoa is the seeds. The trees are spelled cacao.
+ icon_state = "seed-cocoapod"
+ species = "cocoapod"
+ plantname = "Cocao Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod
+ lifespan = 20
+ maturation = 5
+ production = 5
+ yield = 2
+ growthstages = 5
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "cocoapod-grow"
+ icon_dead = "cocoapod-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/cocoapod/vanillapod)
+ reagents_add = list("cocoa" = 0.25, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod
+ seed = /obj/item/seeds/cocoapod
+ name = "cocoa pod"
+ desc = "Fattening... Mmmmm... chucklate."
+ icon_state = "cocoapod"
+ filling_color = "#FFD700"
+ bitesize_mod = 2
+
+// Vanilla Pod
+/obj/item/seeds/cocoapod/vanillapod
+ name = "pack of vanilla pod seeds"
+ desc = "These seeds grow into vanilla trees. They look fattening."
+ icon_state = "seed-vanillapod"
+ species = "vanillapod"
+ plantname = "Vanilla Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/vanillapod
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list()
+ reagents_add = list("vanilla" = 0.25, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/vanillapod
+ seed = /obj/item/seeds/cocoapod/vanillapod
+ name = "vanilla pod"
+ desc = "Fattening... Mmmmm... vanilla."
+ icon_state = "vanillapod"
+ filling_color = "#FFD700"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm
new file mode 100644
index 00000000000..d2dac1decfe
--- /dev/null
+++ b/code/modules/hydroponics/grown/corn.dm
@@ -0,0 +1,84 @@
+// Corn
+/obj/item/seeds/corn
+ name = "pack of corn seeds"
+ desc = "I don't mean to sound corny..."
+ icon_state = "seed-corn"
+ species = "corn"
+ plantname = "Corn Stalks"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/corn
+ maturation = 8
+ potency = 20
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "corn-grow" // Uses one growth icons set for all the subtypes
+ icon_dead = "corn-dead" // Same for the dead icon
+ mutatelist = list(/obj/item/seeds/corn/snapcorn)
+ reagents_add = list("cornoil" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/corn
+ seed = /obj/item/seeds/corn
+ name = "ear of corn"
+ desc = "Needs some butter!"
+ icon_state = "corn"
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/popcorn
+ filling_color = "#FFFF00"
+ trash = /obj/item/weapon/grown/corncob
+ bitesize_mod = 2
+
+/obj/item/weapon/grown/corncob
+ name = "corn cob"
+ desc = "A reminder of meals gone by."
+ icon_state = "corncob"
+ item_state = "corncob"
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+
+/obj/item/weapon/grown/corncob/attackby(obj/item/weapon/grown/W, mob/user, params)
+ if(is_sharp(W))
+ to_chat(user, "You use [W] to fashion a pipe out of the corn cob! ")
+ new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc)
+ user.unEquip(src)
+ qdel(src)
+ return
+ else
+ return ..()
+
+// Snapcorn
+/obj/item/seeds/corn/snapcorn
+ name = "pack of snapcorn seeds"
+ desc = "Oh snap!"
+ icon_state = "seed-snapcorn"
+ species = "snapcorn"
+ plantname = "Snapcorn Stalks"
+ product = /obj/item/weapon/grown/snapcorn
+ mutatelist = list()
+ rarity = 10
+
+/obj/item/weapon/grown/snapcorn
+ seed = /obj/item/seeds/corn/snapcorn
+ name = "snap corn"
+ desc = "A cob with snap pops"
+ icon_state = "snapcorn"
+ item_state = "corncob"
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+ var/snap_pops = 1
+
+/obj/item/weapon/grown/snapcorn/add_juice()
+ ..()
+ snap_pops = max(round(seed.potency/8), 1)
+
+/obj/item/weapon/grown/snapcorn/attack_self(mob/user)
+ ..()
+ to_chat(user, "You pick a snap pop from the cob. ")
+ var/obj/item/toy/snappop/S = new /obj/item/toy/snappop(user.loc)
+ if(ishuman(user))
+ user.put_in_hands(S)
+ snap_pops -= 1
+ if(!snap_pops)
+ new /obj/item/weapon/grown/corncob(user.loc)
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm
new file mode 100644
index 00000000000..6fb991b9d32
--- /dev/null
+++ b/code/modules/hydroponics/grown/eggplant.dm
@@ -0,0 +1,44 @@
+// Eggplant
+/obj/item/seeds/eggplant
+ name = "pack of eggplant seeds"
+ desc = "These seeds grow to produce berries that look nothing like eggs."
+ icon_state = "seed-eggplant"
+ species = "eggplant"
+ plantname = "Eggplants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant
+ yield = 2
+ potency = 20
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "eggplant-grow"
+ icon_dead = "eggplant-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/eggplant/eggy)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant
+ seed = /obj/item/seeds/eggplant
+ name = "eggplant"
+ desc = "Maybe there's a chicken inside?"
+ icon_state = "eggplant"
+ filling_color = "#800080"
+ bitesize_mod = 2
+
+// Egg-Plant
+/obj/item/seeds/eggplant/eggy
+ desc = "These seeds grow to produce berries that look a lot like eggs."
+ icon_state = "seed-eggy"
+ species = "eggy"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy
+ lifespan = 75
+ production = 12
+ mutatelist = list()
+ reagents_add = list("nutriment" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy
+ seed = /obj/item/seeds/eggplant/eggy
+ name = "Egg-plant"
+ desc = "There MUST be a chicken inside."
+ icon_state = "eggyplant"
+ trash = /obj/item/weapon/reagent_containers/food/snacks/egg
+ filling_color = "#F8F8FF"
+ bitesize_mod = 2
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
new file mode 100644
index 00000000000..1752cda7567
--- /dev/null
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -0,0 +1,202 @@
+// Poppy
+/obj/item/seeds/poppy
+ name = "pack of poppy seeds"
+ desc = "These seeds grow into poppies."
+ icon_state = "seed-poppy"
+ species = "poppy"
+ plantname = "Poppy Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/poppy
+ endurance = 10
+ maturation = 8
+ yield = 6
+ potency = 20
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
+ icon_grow = "poppy-grow"
+ icon_dead = "poppy-dead"
+ mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily)
+ reagents_add = list("bicaridine" = 0.2, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/poppy
+ seed = /obj/item/seeds/poppy
+ name = "poppy"
+ desc = "Long-used as a symbol of rest, peace, and death."
+ icon_state = "poppy"
+ slot_flags = SLOT_HEAD
+ filling_color = "#FF6347"
+ bitesize_mod = 3
+
+// Lily
+/obj/item/seeds/poppy/lily
+ name = "pack of lily seeds"
+ desc = "These seeds grow into lilies."
+ icon_state = "seed-lily"
+ species = "lily"
+ plantname = "Lily Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/poppy/lily
+ mutatelist = list()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/poppy/lily
+ seed = /obj/item/seeds/poppy/lily
+ name = "lily"
+ desc = "A beautiful orange flower"
+ icon_state = "lily"
+ filling_color = "#FFA500"
+
+// Geranium
+/obj/item/seeds/poppy/geranium
+ name = "pack of geranium seeds"
+ desc = "These seeds grow into geranium."
+ icon_state = "seed-geranium"
+ species = "geranium"
+ plantname = "Geranium Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/poppy/geranium
+ mutatelist = list()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/poppy/geranium
+ seed = /obj/item/seeds/poppy/geranium
+ name = "geranium"
+ desc = "A beautiful blue flower"
+ icon_state = "geranium"
+ filling_color = "#008B8B"
+
+
+// Harebell
+/obj/item/seeds/harebell
+ name = "pack of harebell seeds"
+ desc = "These seeds grow into pretty little flowers."
+ icon_state = "seed-harebell"
+ species = "harebell"
+ plantname = "Harebells"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/harebell
+ lifespan = 100
+ endurance = 20
+ maturation = 7
+ production = 1
+ yield = 2
+ potency = 30
+ growthstages = 4
+ genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
+ reagents_add = list("plantmatter" = 0.04)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/harebell
+ seed = /obj/item/seeds/harebell
+ name = "harebell"
+ desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten'd not thy breath.\""
+ icon_state = "harebell"
+ slot_flags = SLOT_HEAD
+ filling_color = "#E6E6FA"
+ bitesize_mod = 3
+
+
+// Sunflower
+/obj/item/seeds/sunflower
+ name = "pack of sunflower seeds"
+ desc = "These seeds grow into sunflowers."
+ icon_state = "seed-sunflower"
+ species = "sunflower"
+ plantname = "Sunflowers"
+ product = /obj/item/weapon/grown/sunflower
+ endurance = 20
+ production = 2
+ yield = 2
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
+ icon_grow = "sunflower-grow"
+ icon_dead = "sunflower-dead"
+ mutatelist = list(/obj/item/seeds/sunflower/moonflower, /obj/item/seeds/sunflower/novaflower)
+ reagents_add = list("cornoil" = 0.08, "plantmatter" = 0.04)
+
+/obj/item/weapon/grown/sunflower // FLOWER POWER!
+ seed = /obj/item/seeds/sunflower
+ name = "sunflower"
+ desc = "It's beautiful! A certain person might beat you to death if you trample these."
+ icon_state = "sunflower"
+ damtype = "fire"
+ force = 0
+ slot_flags = SLOT_HEAD
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 1
+ throw_range = 3
+
+/obj/item/weapon/grown/sunflower/attack(mob/M, mob/user)
+ to_chat(M, " [user] smacks you with a sunflower! FLOWER POWER ")
+ to_chat(user, "Your sunflower's FLOWER POWER strikes [M] ")
+
+// Moonflower
+/obj/item/seeds/sunflower/moonflower
+ name = "pack of moonflower seeds"
+ desc = "These seeds grow into moonflowers."
+ icon_state = "seed-moonflower"
+ species = "moonflower"
+ plantname = "Moonflowers"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/moonflower
+ mutatelist = list()
+ reagents_add = list("moonshine" = 0.2, "vitamin" = 0.02, "plantmatter" = 0.02)
+ rarity = 15
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/moonflower
+ seed = /obj/item/seeds/sunflower/moonflower
+ name = "moonflower"
+ desc = "Store in a location at least 50 yards away from werewolves."
+ icon_state = "moonflower"
+ slot_flags = SLOT_HEAD
+ filling_color = "#E6E6FA"
+ bitesize_mod = 2
+
+// Novaflower
+/obj/item/seeds/sunflower/novaflower
+ name = "pack of novaflower seeds"
+ desc = "These seeds grow into novaflowers."
+ icon_state = "seed-novaflower"
+ species = "novaflower"
+ plantname = "Novaflowers"
+ product = /obj/item/weapon/grown/novaflower
+ mutatelist = list()
+ reagents_add = list("condensedcapsaicin" = 0.25, "capsaicin" = 0.3, "plantmatter" = 0)
+ rarity = 20
+
+/obj/item/weapon/grown/novaflower
+ seed = /obj/item/seeds/sunflower/novaflower
+ name = "novaflower"
+ desc = "These beautiful flowers have a crisp smokey scent, like a summer bonfire."
+ icon_state = "novaflower"
+ damtype = "fire"
+ force = 0
+ slot_flags = SLOT_HEAD
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 1
+ throw_range = 3
+ attack_verb = list("roasted", "scorched", "burned")
+
+/obj/item/weapon/grown/novaflower/add_juice()
+ ..()
+ force = round((5 + seed.potency / 5), 1)
+
+/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M, mob/user)
+ ..()
+ if(isliving(M))
+ to_chat(M, "You are lit on fire from the intense heat of the [name]! ")
+ M.adjust_fire_stacks(seed.potency / 20)
+ if(M.IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
+ log_game("[key_name(user)] set [key_name(M)] on fire")
+
+/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user,proximity)
+ if(!proximity)
+ return
+ if(force > 0)
+ force -= rand(1, (force / 3) + 1)
+ else
+ to_chat(usr, "All the petals have fallen off the [name] from violent whacking! ")
+ usr.unEquip(src)
+ qdel(src)
+
+/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user)
+ ..()
+ if(!user.gloves)
+ to_chat(user, "The [name] burns your bare hand! ")
+ user.adjustFireLoss(rand(1, 5))
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
new file mode 100644
index 00000000000..24c0a9f9df2
--- /dev/null
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -0,0 +1,67 @@
+// Grass
+/obj/item/seeds/grass
+ name = "pack of grass seeds"
+ desc = "These seeds grow into grass. Yummy!"
+ icon_state = "seed-grass"
+ species = "grass"
+ plantname = "Grass"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/grass
+ lifespan = 40
+ endurance = 40
+ maturation = 2
+ production = 5
+ yield = 5
+ growthstages = 2
+ icon_grow = "grass-grow"
+ icon_dead = "grass-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/grass/carpet)
+ reagents_add = list("plantmatter" = 0.02, "hydrogen" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/grass
+ seed = /obj/item/seeds/grass
+ name = "grass"
+ desc = "Green and lush."
+ icon_state = "grassclump"
+ filling_color = "#32CD32"
+ bitesize_mod = 2
+ var/stacktype = /obj/item/stack/tile/grass
+ var/tile_coefficient = 0.02 // 1/50
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/grass/attack_self(mob/user)
+ to_chat(user, "You prepare the astroturf. ")
+ var/grassAmt = 1 + round(seed.potency * tile_coefficient) // The grass we're holding
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/grass/G in user.loc) // The grass on the floor
+ if(G.type != type)
+ continue
+ grassAmt += 1 + round(G.seed.potency * tile_coefficient)
+ qdel(G)
+ var/obj/item/stack/tile/GT = new stacktype(user.loc)
+ while(grassAmt > GT.max_amount)
+ GT.amount = GT.max_amount
+ grassAmt -= GT.max_amount
+ GT = new stacktype(user.loc)
+ GT.amount = grassAmt
+ for(var/obj/item/stack/tile/T in user.loc)
+ if((T.type == stacktype) && (T.amount < T.max_amount) && (T != GT))
+ T.attackby(GT, user)
+ qdel(src)
+ return
+
+// Carpet
+/obj/item/seeds/grass/carpet
+ name = "pack of carpet seeds"
+ desc = "These seeds grow into stylish carpet samples."
+ icon_state = "seed-carpet"
+ species = "carpet"
+ plantname = "Carpet"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/grass/carpet
+ mutatelist = list()
+ rarity = 10
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/grass/carpet
+ seed = /obj/item/seeds/grass/carpet
+ name = "carpet"
+ desc = "The textile industry's dark secret."
+ icon_state = "carpetclump"
+ stacktype = /obj/item/stack/tile/carpet
diff --git a/code/modules/hydroponics/grown/herbals.dm b/code/modules/hydroponics/grown/herbals.dm
new file mode 100644
index 00000000000..f47d84a8edd
--- /dev/null
+++ b/code/modules/hydroponics/grown/herbals.dm
@@ -0,0 +1,53 @@
+/obj/item/seeds/comfrey
+ name = "pack of comfrey seeds"
+ desc = "These seeds grow into comfrey."
+ icon_state = "seed-cabbage"
+ species = "cabbage"
+ plantname = "comfrey"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/comfrey
+ yield = 2
+ maturation = 3
+ growthstages = 1
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list("styptic_powder" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/comfrey
+ seed = /obj/item/seeds/comfrey
+ name = "comfrey leaf"
+ desc = "Mash to turn into a poultice."
+ icon_state = "tea_astra_leaves"
+ color = "#378C61"
+ bitesize_mod = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/comfrey/attack_self(mob/user)
+ var/obj/item/stack/medical/bruise_pack/comfrey/C = new(get_turf(user))
+ C.heal_brute = seed.potency
+ to_chat(user, "You mash [src] into a poultice. ")
+ user.drop_item()
+ qdel(src)
+
+/obj/item/seeds/aloe
+ name = "pack of aloe seeds"
+ desc = "These seeds grow into aloe vera plant."
+ icon_state = "seed-ambrosiavulgaris"
+ species = "ambrosiavulgaris"
+ plantname = "Aloe Vera Plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/aloe
+ yield = 2
+ icon_dead = "ambrosia-dead"
+ reagents_add = list("silver_sulfadiazine" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/aloe
+ seed = /obj/item/seeds/aloe
+ name = "aloe leaf"
+ desc = "Mash to turn into a poultice."
+ icon_state = "ambrosiavulgaris"
+ color = "#4CC5C7"
+ bitesize_mod = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/aloe/attack_self(mob/user)
+ var/obj/item/stack/medical/ointment/aloe/A = new(get_turf(user))
+ A.heal_burn = seed.potency
+ to_chat(user, "You mash [src] into a poultice. ")
+ user.drop_item()
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
new file mode 100644
index 00000000000..1e975b4b79f
--- /dev/null
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -0,0 +1,97 @@
+// A very special plant, deserving it's own file.
+
+/obj/item/seeds/kudzu
+ name = "pack of kudzu seeds"
+ desc = "These seeds grow into a weed that grows incredibly fast."
+ icon_state = "seed-kudzu"
+ species = "kudzu"
+ plantname = "Kudzu"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy)
+ lifespan = 20
+ endurance = 10
+ yield = 4
+ growthstages = 4
+ rarity = 30
+ var/list/mutations = list()
+ reagents_add = list("charcoal" = 0.04, "plantmatter" = 0.02)
+
+/obj/item/seeds/kudzu/Copy()
+ var/obj/item/seeds/kudzu/S = ..()
+ S.mutations = mutations.Copy()
+ return S
+
+/obj/item/seeds/kudzu/suicide_act(mob/user)
+ user.visible_message("[user] swallows the pack of kudzu seeds! It looks like \he's trying to commit suicide.. ")
+ plant(user)
+ return (BRUTELOSS)
+
+/obj/item/seeds/kudzu/proc/plant(mob/user)
+ if(istype(user.loc, /turf/space))
+ return
+ var/turf/T = get_turf(src)
+ message_admins("Kudzu planted by [key_name_admin(user)](? ) (FLW ) at ([T.x],[T.y],[T.z] - (JMP) )",0,1)
+ investigate_log("was planted by [key_name(user)] at ([T.x],[T.y],[T.z])","kudzu")
+ new /obj/structure/spacevine_controller(user.loc, mutations, potency, production)
+ user.drop_item()
+ qdel(src)
+
+/obj/item/seeds/kudzu/attack_self(mob/user)
+ plant(user)
+ to_chat(user, "You plant the kudzu. You monster. ")
+
+/obj/item/seeds/kudzu/get_analyzer_text()
+ var/text = ..()
+ var/text_string = ""
+ for(var/datum/spacevine_mutation/SM in mutations)
+ text_string += "[(text_string == "") ? "" : ", "][SM.name]"
+ text += "\n- Plant Mutations: [(text_string == "") ? "None" : text_string]"
+ return text
+
+/obj/item/seeds/kudzu/on_chem_reaction(datum/reagents/S)
+ var/list/temp_mut_list = list()
+
+ if(S.has_reagent("sterilizine", 5))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ if(SM.quality == NEGATIVE)
+ temp_mut_list += SM
+ if(prob(20) && temp_mut_list.len)
+ mutations.Remove(pick(temp_mut_list))
+ temp_mut_list.Cut()
+
+ if(S.has_reagent("welding_fuel", 5))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ if(SM.quality == POSITIVE)
+ temp_mut_list += SM
+ if(prob(20) && temp_mut_list.len)
+ mutations.Remove(pick(temp_mut_list))
+ temp_mut_list.Cut()
+
+ if(S.has_reagent("phenol", 5))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ if(SM.quality == MINOR_NEGATIVE)
+ temp_mut_list += SM
+ if(prob(20) && temp_mut_list.len)
+ mutations.Remove(pick(temp_mut_list))
+ temp_mut_list.Cut()
+
+ if(S.has_reagent("blood", 15))
+ adjust_production(rand(15, -5))
+
+ if(S.has_reagent("amanitin", 5))
+ adjust_production(rand(5, -15))
+
+ if(S.has_reagent("plasma", 5))
+ adjust_potency(rand(5, -15))
+
+ if(S.has_reagent("holywater", 10))
+ adjust_potency(rand(15, -5))
+
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod
+ seed = /obj/item/seeds/kudzu
+ name = "kudzu pod"
+ desc = "Pueraria Virallis : An invasive species with vines that rapidly creep and wrap around whatever they contact."
+ icon_state = "kudzupod"
+ filling_color = "#6B8E23"
+ bitesize_mod = 2
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
new file mode 100644
index 00000000000..06bb153e47f
--- /dev/null
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -0,0 +1,47 @@
+// Watermelon
+/obj/item/seeds/watermelon
+ name = "pack of watermelon seeds"
+ desc = "These seeds grow into watermelon plants."
+ icon_state = "seed-watermelon"
+ species = "watermelon"
+ plantname = "Watermelon Vines"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon
+ lifespan = 50
+ endurance = 40
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_dead = "watermelon-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/watermelon/holy)
+ reagents_add = list("water" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.2)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon
+ seed = /obj/item/seeds/watermelon
+ name = "watermelon"
+ desc = "It's full of watery goodness."
+ icon_state = "watermelon"
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/watermelonslice
+ slices_num = 5
+ dried_type = null
+ w_class = WEIGHT_CLASS_NORMAL
+ filling_color = "#008000"
+ bitesize_mod = 3
+
+// Holymelon
+/obj/item/seeds/watermelon/holy
+ name = "pack of holymelon seeds"
+ desc = "These seeds grow into holymelon plants."
+ icon_state = "seed-holymelon"
+ species = "holymelon"
+ plantname = "Holy Melon Vines"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/holymelon
+ mutatelist = list()
+ reagents_add = list("holywater" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/holymelon
+ seed = /obj/item/seeds/watermelon/holy
+ name = "holymelon"
+ desc = "The water within this melon has been blessed by some deity that's particularly fond of watermelon."
+ icon_state = "holymelon"
+ filling_color = "#FFD700"
+ dried_type = null
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
new file mode 100644
index 00000000000..2e05e3f18a0
--- /dev/null
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -0,0 +1,139 @@
+// Weeds
+/obj/item/seeds/weeds
+ name = "pack of weed seeds"
+ desc = "Yo mang, want some weeds?"
+ icon_state = "seed"
+ species = "weeds"
+ plantname = "Starthistle"
+ lifespan = 100
+ endurance = 50 // damm pesky weeds
+ maturation = 5
+ production = 1
+ yield = -1
+ potency = -1
+ growthstages = 4
+ genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
+
+
+// Cabbage
+/obj/item/seeds/cabbage
+ name = "pack of cabbage seeds"
+ desc = "These seeds grow into cabbages."
+ icon_state = "seed-cabbage"
+ species = "cabbage"
+ plantname = "Cabbages"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage
+ lifespan = 50
+ endurance = 25
+ maturation = 3
+ production = 5
+ yield = 4
+ growthstages = 1
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/replicapod)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage
+ seed = /obj/item/seeds/cabbage
+ name = "cabbage"
+ desc = "Ewwwwwwwwww. Cabbage."
+ icon_state = "cabbage"
+ filling_color = "#90EE90"
+ bitesize_mod = 2
+
+
+// Sugarcane
+/obj/item/seeds/sugarcane
+ name = "pack of sugarcane seeds"
+ desc = "These seeds grow into sugarcane."
+ icon_state = "seed-sugarcane"
+ species = "sugarcane"
+ plantname = "Sugarcane"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ lifespan = 60
+ endurance = 50
+ maturation = 3
+ yield = 4
+ growthstages = 3
+ reagents_add = list("sugar" = 0.25)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane
+ seed = /obj/item/seeds/sugarcane
+ name = "sugarcane"
+ desc = "Sickly sweet."
+ icon_state = "sugarcane"
+ filling_color = "#FFD700"
+ bitesize_mod = 2
+
+
+// Gatfruit
+/obj/item/seeds/gatfruit
+ name = "pack of gatfruit seeds"
+ desc = "These seeds grow into .357 revolvers."
+ icon_state = "seed-gatfruit"
+ species = "gatfruit"
+ plantname = "Gatfruit Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/gatfruit
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ lifespan = 20
+ endurance = 20
+ maturation = 40
+ production = 10
+ yield = 2
+ potency = 60
+ growthstages = 2
+ rarity = 60 // Obtainable only with xenobio+superluck.
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ reagents_add = list("sulfur" = 0.1, "carbon" = 0.1, "nitrogen" = 0.07, "potassium" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/shell/gatfruit
+ seed = /obj/item/seeds/gatfruit
+ name = "gatfruit"
+ desc = "It smells like burning."
+ icon_state = "gatfruit"
+ origin_tech = "combat=6"
+ trash = /obj/item/weapon/gun/projectile/revolver
+ bitesize_mod = 2
+
+//Cherry Bombs
+/obj/item/seeds/cherry/bomb
+ name = "pack of cherry bomb pits"
+ desc = "They give you vibes of dread and frustration."
+ icon_state = "seed-cherry_bomb"
+ species = "cherry_bomb"
+ plantname = "Cherry Bomb Tree"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb
+ mutatelist = list()
+ reagents_add = list("plantmatter" = 0.1, "sugar" = 0.1, "blackpowder" = 0.7)
+ rarity = 60 //See above
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb
+ name = "cherry bombs"
+ desc = "You think you can hear the hissing of a tiny fuse."
+ icon_state = "cherry_bomb"
+ filling_color = rgb(20, 20, 20)
+ seed = /obj/item/seeds/cherry/bomb
+ bitesize_mod = 2
+ volume = 125 //Gives enough room for the black powder at max potency
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
+ var/area/A = get_area(user)
+ user.visible_message("[user] plucks the stem from [src]! ", "You pluck the stem from [src], which begins to hiss loudly! ")
+ message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP) ")
+ log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
+ prime()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/burn()
+ prime()
+ ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity)
+ qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
+ icon_state = "cherry_bomb_lit"
+ playsound(src, 'sound/goonstation/misc/fuse.ogg', seed.potency, 0)
+ reagents.chem_temp = 1000 //Sets off the black powder
+ reagents.handle_reactions()
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
new file mode 100644
index 00000000000..f923d08c694
--- /dev/null
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -0,0 +1,328 @@
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
+ name = "mushroom"
+ bitesize_mod = 2
+
+
+// Reishi
+/obj/item/seeds/reishi
+ name = "pack of reishi mycelium"
+ desc = "This mycelium grows into something medicinal and relaxing."
+ icon_state = "mycelium-reishi"
+ species = "reishi"
+ plantname = "Reishi"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi
+ lifespan = 35
+ endurance = 35
+ maturation = 10
+ production = 5
+ yield = 4
+ potency = 15
+ growthstages = 4
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list("morphine" = 0.35, "charcoal" = 0.35, "nutriment" = 0)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi
+ seed = /obj/item/seeds/reishi
+ name = "reishi"
+ desc = "Ganoderma lucidum : A special fungus known for its medicinal and stress relieving properties."
+ icon_state = "reishi"
+ filling_color = "#FF4500"
+
+
+// Fly Amanita
+/obj/item/seeds/amanita
+ name = "pack of fly amanita mycelium"
+ desc = "This mycelium grows into something horrible."
+ icon_state = "mycelium-amanita"
+ species = "amanita"
+ plantname = "Fly Amanitas"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
+ lifespan = 50
+ endurance = 35
+ maturation = 10
+ production = 5
+ yield = 4
+ growthstages = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ mutatelist = list(/obj/item/seeds/angel)
+ reagents_add = list("psilocybin" = 0.04, "amanitin" = 0.35, "nutriment" = 0, "growthserum" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
+ seed = /obj/item/seeds/amanita
+ name = "fly amanita"
+ desc = "Amanita Muscaria : Learn poisonous mushrooms by heart. Only pick mushrooms you know."
+ icon_state = "amanita"
+ filling_color = "#FF0000"
+
+
+// Destroying Angel
+/obj/item/seeds/angel
+ name = "pack of destroying angel mycelium"
+ desc = "This mycelium grows into something devastating."
+ icon_state = "mycelium-angel"
+ species = "angel"
+ plantname = "Destroying Angels"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel
+ lifespan = 50
+ endurance = 35
+ maturation = 12
+ production = 5
+ yield = 2
+ potency = 35
+ growthstages = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list("psilocybin" = 0.04, "nutriment" = 0, "amanitin" = 0.3)
+ rarity = 30
+ origin_tech = "biotech=5"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel
+ seed = /obj/item/seeds/angel
+ name = "destroying angel"
+ desc = "Amanita Virosa : Deadly poisonous basidiomycete fungus filled with alpha amatoxins."
+ icon_state = "angel"
+ filling_color = "#C0C0C0"
+
+
+// Liberty Cap
+/obj/item/seeds/liberty
+ name = "pack of liberty-cap mycelium"
+ desc = "This mycelium grows into liberty-cap mushrooms."
+ icon_state = "mycelium-liberty"
+ species = "liberty"
+ plantname = "Liberty-Caps"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap
+ maturation = 7
+ production = 1
+ yield = 5
+ potency = 15
+ growthstages = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list("psilocybin" = 0.25, "nutriment" = 0.02)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap
+ seed = /obj/item/seeds/liberty
+ name = "liberty-cap"
+ desc = "Psilocybe Semilanceata : Liberate yourself!"
+ icon_state = "libertycap"
+ filling_color = "#DAA520"
+
+
+// Plump Helmet
+/obj/item/seeds/plump
+ name = "pack of plump-helmet mycelium"
+ desc = "This mycelium grows into helmets... maybe."
+ icon_state = "mycelium-plump"
+ species = "plump"
+ plantname = "Plump-Helmet Mushrooms"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet
+ maturation = 8
+ production = 1
+ yield = 4
+ potency = 15
+ growthstages = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ mutatelist = list(/obj/item/seeds/plump/walkingmushroom)
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet
+ seed = /obj/item/seeds/plump
+ name = "plump-helmet"
+ desc = "Plumus Hellmus : Plump, soft and s-so inviting~"
+ icon_state = "plumphelmet"
+ filling_color = "#9370DB"
+
+
+// Walking Mushroom
+/obj/item/seeds/plump/walkingmushroom
+ name = "pack of walking mushroom mycelium"
+ desc = "This mycelium will grow into huge stuff!"
+ icon_state = "mycelium-walkingmushroom"
+ species = "walkingmushroom"
+ plantname = "Walking Mushrooms"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom
+ lifespan = 30
+ endurance = 30
+ maturation = 5
+ yield = 1
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ mutatelist = list()
+ reagents_add = list("vitamin" = 0.05, "nutriment" = 0.15)
+ rarity = 30
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom
+ seed = /obj/item/seeds/plump/walkingmushroom
+ name = "walking mushroom"
+ desc = "Plumus Locomotus : The beginning of the great walk."
+ icon_state = "walkingmushroom"
+ filling_color = "#9370DB"
+ origin_tech = "biotech=4;programming=5"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user)
+ if(istype(user.loc, /turf/space))
+ return
+ var/mob/living/simple_animal/hostile/mushroom/M = new /mob/living/simple_animal/hostile/mushroom(user.loc)
+ M.maxHealth += round(seed.endurance / 4)
+ M.melee_damage_lower += round(seed.potency / 20)
+ M.melee_damage_upper += round(seed.potency / 20)
+ M.move_to_delay -= round(seed.production / 50)
+ M.health = M.maxHealth
+ qdel(src)
+ to_chat(user, "You plant the walking mushroom. ")
+
+
+// Chanterelle
+/obj/item/seeds/chanter
+ name = "pack of chanterelle mycelium"
+ desc = "This mycelium grows into chanterelle mushrooms."
+ icon_state = "mycelium-chanter"
+ species = "chanter"
+ plantname = "Chanterelle Mushrooms"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle
+ lifespan = 35
+ endurance = 20
+ maturation = 7
+ production = 1
+ yield = 5
+ potency = 15
+ growthstages = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list("nutriment" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle
+ seed = /obj/item/seeds/chanter
+ name = "chanterelle cluster"
+ desc = "Cantharellus Cibarius : These jolly yellow little shrooms sure look tasty!"
+ icon_state = "chanterelle"
+ filling_color = "#FFA500"
+
+
+// Glowshroom
+/obj/item/seeds/glowshroom
+ name = "pack of glowshroom mycelium"
+ desc = "This mycelium -glows- into mushrooms!"
+ icon_state = "mycelium-glowshroom"
+ species = "glowshroom"
+ plantname = "Glowshrooms"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom
+ lifespan = 100 //ten times that is the delay
+ endurance = 30
+ maturation = 15
+ production = 1
+ yield = 3 //-> spread
+ potency = 30 //-> brightness
+ growthstages = 4
+ rarity = 20
+ genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ mutatelist = list(/obj/item/seeds/glowshroom/glowcap, /obj/item/seeds/glowshroom/shadowshroom)
+ reagents_add = list("radium" = 0.1, "phosphorus" = 0.1, "nutriment" = 0.04)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom
+ seed = /obj/item/seeds/glowshroom
+ name = "glowshroom cluster"
+ desc = "Mycena Bregprox : This species of mushroom glows in the dark."
+ icon_state = "glowshroom"
+ filling_color = "#00FA9A"
+ var/effect_path = /obj/structure/glowshroom
+ origin_tech = "biotech=4;plasmatech=6"
+ light_color = "#006622"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
+ if(istype(user.loc, /turf/space))
+ return FALSE
+ if(!isturf(user.loc))
+ to_chat(user, "You need more space to plant [src]. ")
+ return FALSE
+ var/count = 0
+ var/maxcount = 1
+ for(var/tempdir in cardinal)
+ var/turf/simulated/wall = get_step(user.loc, tempdir)
+ if(istype(wall))
+ maxcount++
+ for(var/obj/structure/glowshroom/G in user.loc)
+ count++
+ if(count >= maxcount)
+ to_chat(user, "There are too many shrooms here to plant [src]. ")
+ return FALSE
+ new effect_path(user.loc, seed)
+ to_chat(user, "You plant [src]. ")
+ qdel(src)
+ return TRUE
+
+
+// Glowcap
+/obj/item/seeds/glowshroom/glowcap
+ name = "pack of glowcap mycelium"
+ desc = "This mycelium -powers- into mushrooms!"
+ icon_state = "mycelium-glowcap"
+ species = "glowcap"
+ icon_grow = "glowshroom-grow"
+ icon_dead = "glowshroom-dead"
+ plantname = "Glowcaps"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap
+ genes = list(/datum/plant_gene/trait/glow/red, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/plant_type/fungal_metabolism)
+ mutatelist = list()
+ reagents_add = list("teslium" = 0.1, "nutriment" = 0.04)
+ rarity = 30
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap
+ seed = /obj/item/seeds/glowshroom/glowcap
+ name = "glowcap cluster"
+ desc = "Mycena Ruthenia : This species of mushroom glows in the dark, but isn't actually bioluminescent. They're warm to the touch..."
+ icon_state = "glowcap"
+ filling_color = "#00FA9A"
+ effect_path = /obj/structure/glowshroom/glowcap
+ origin_tech = "biotech=4;powerstorage=6;plasmatech=4"
+ light_color = "#8E0300"
+
+// Fungus/Mold
+/obj/item/seeds/fungus
+ name = "pack of fungus spores"
+ desc = "These spores grow into fungus."
+ icon_state = "mycelium-tower"
+ species = "mold"
+ plantname = "Fungus"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/fungus
+ yield = 4
+ icon_grow = "mold-grow"
+ icon_dead = "mold-dead"
+ icon_harvest = "mold-harvest"
+ growthstages = 3
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ reagents_add = list("fungus" = 0.35)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/fungus
+ seed = /obj/item/seeds/fungus
+ name = "fungus"
+ desc = "A fungus ideal for making antibacterials."
+ icon_state = "angel"
+ color = "#4f4331"
+
+//Shadowshroom
+/obj/item/seeds/glowshroom/shadowshroom
+ name = "pack of shadowshroom mycelium"
+ desc = "This mycelium will grow into something shadowy."
+ icon_state = "mycelium-shadowshroom"
+ species = "shadowshroom"
+ icon_grow = "shadowshroom-grow"
+ icon_dead = "shadowshroom-dead"
+ plantname = "Shadowshrooms"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom
+ genes = list(/datum/plant_gene/trait/glow/shadow, /datum/plant_gene/trait/plant_type/fungal_metabolism)
+ mutatelist = list()
+ reagents_add = list("radium" = 0.2, "nutriment" = 0.04)
+ rarity = 30
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom
+ seed = /obj/item/seeds/glowshroom/shadowshroom
+ name = "shadowshroom cluster"
+ desc = "Mycena Umbra : This species of mushroom emits shadow instead of light."
+ icon_state = "shadowshroom"
+ effect_path = /obj/structure/glowshroom/shadowshroom
+ origin_tech = "biotech=4;plasmatech=4;magnets=4"
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
new file mode 100644
index 00000000000..52f60d06b18
--- /dev/null
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -0,0 +1,113 @@
+/obj/item/seeds/nettle
+ name = "pack of nettle seeds"
+ desc = "These seeds grow into nettles."
+ icon_state = "seed-nettle"
+ species = "nettle"
+ plantname = "Nettles"
+ product = /obj/item/weapon/grown/nettle/basic
+ lifespan = 30
+ endurance = 40 // tuff like a toiger
+ yield = 4
+ growthstages = 5
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy)
+ mutatelist = list(/obj/item/seeds/nettle/death)
+ reagents_add = list("sacid" = 0.5)
+
+/obj/item/seeds/nettle/death
+ name = "pack of death-nettle seeds"
+ desc = "These seeds grow into death-nettles."
+ icon_state = "seed-deathnettle"
+ species = "deathnettle"
+ plantname = "Death Nettles"
+ product = /obj/item/weapon/grown/nettle/death
+ endurance = 25
+ maturation = 8
+ yield = 2
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/stinging)
+ mutatelist = list()
+ reagents_add = list("facid" = 0.5, "sacid" = 0.5)
+ rarity = 20
+
+/obj/item/weapon/grown/nettle //abstract type
+ name = "nettle"
+ desc = "It's probably not wise to touch it with bare hands..."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "nettle"
+ damtype = "fire"
+ force = 15
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ throwforce = 5
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 1
+ throw_range = 3
+ origin_tech = "combat=3"
+ attack_verb = list("stung")
+
+/obj/item/weapon/grown/nettle/suicide_act(mob/user)
+ user.visible_message("[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide. ")
+ return (BRUTELOSS|TOXLOSS)
+
+/obj/item/weapon/grown/nettle/pickup(mob/living/user)
+ ..()
+ if(!ishuman(user))
+ return 0
+ var/mob/living/carbon/human/H = user
+ if(H.gloves)
+ return 0
+ var/organ = ((H.hand ? "l_":"r_") + "arm")
+ var/obj/item/organ/external/affecting = H.get_organ(organ)
+ if(affecting)
+ if(affecting.take_damage(0, force))
+ H.UpdateDamageIcon()
+ to_chat(H, "The nettle burns your bare hand! ")
+ return 1
+
+
+
+/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity)
+ if(!proximity)
+ return
+ if(force > 0)
+ force -= rand(1, (force / 3) + 1) // When you whack someone with it, leaves fall off
+ else
+ to_chat(usr, "All the leaves have fallen off the nettle from violent whacking.")
+ usr.unEquip(src)
+ qdel(src)
+
+/obj/item/weapon/grown/nettle/basic
+ seed = /obj/item/seeds/nettle
+
+/obj/item/weapon/grown/nettle/basic/add_juice()
+ ..()
+ force = round((5 + seed.potency / 5), 1)
+
+/obj/item/weapon/grown/nettle/death
+ seed = /obj/item/seeds/nettle/death
+ name = "deathnettle"
+ desc = "The glowing nettle incites rage in you just from looking at it!"
+ icon_state = "deathnettle"
+ force = 30
+ throwforce = 15
+ origin_tech = "combat=5"
+
+/obj/item/weapon/grown/nettle/death/add_juice()
+ ..()
+ force = round((5 + seed.potency / 2.5), 1)
+
+/obj/item/weapon/grown/nettle/death/pickup(mob/living/carbon/user)
+ if(..())
+ if(prob(50))
+ user.Paralyse(5)
+ to_chat(user, "You are stunned by the Deathnettle when you try picking it up! ")
+
+/obj/item/weapon/grown/nettle/death/attack(mob/living/carbon/M, mob/user)
+ ..()
+ if(isliving(M))
+ to_chat(M, "You are stunned by the powerful acid of the Deathnettle! ")
+ add_logs(user, M, "attacked", src)
+
+ M.AdjustEyeBlurry(force/7)
+ if(prob(20))
+ M.Paralyse(force / 6)
+ M.Weaken(force / 15)
+ M.drop_item()
diff --git a/code/modules/hydroponics/grown/nymph.dm b/code/modules/hydroponics/grown/nymph.dm
new file mode 100644
index 00000000000..acea5497fea
--- /dev/null
+++ b/code/modules/hydroponics/grown/nymph.dm
@@ -0,0 +1,26 @@
+/obj/item/seeds/nymph
+ name = "pack of diona nymph seeds"
+ desc = "These seeds grow into diona nymphs."
+ icon_state = "seed-replicapod"
+ species = "replicapod"
+ plantname = "Nymph Pod"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/nymph_pod
+ lifespan = 50
+ endurance = 8
+ maturation = 10
+ production = 1
+ yield = 1
+ reagents_add = list("plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/nymph_pod
+ seed = /obj/item/seeds/nymph
+ name = "nymph pod"
+ desc = "A peculiar wriggling pod with a grown nymph inside. Crack it open to let the nymph out."
+ icon_state = "mushy"
+ bitesize_mod = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/nymph_pod/attack_self(mob/user)
+ new /mob/living/simple_animal/diona(get_turf(user))
+ to_chat(user, "You crack open [src] letting the nymph out. ")
+ user.drop_item()
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/peanut.dm b/code/modules/hydroponics/grown/peanut.dm
new file mode 100644
index 00000000000..146c1ecfacf
--- /dev/null
+++ b/code/modules/hydroponics/grown/peanut.dm
@@ -0,0 +1,25 @@
+// Peanuts
+/obj/item/seeds/peanuts
+ name = "pack of peanut seeds"
+ desc = "These seeds grow into peanuts."
+ icon_state = "seed-potato"
+ species = "potato"
+ plantname = "Peanut Vines"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts
+ lifespan = 30
+ maturation = 10
+ production = 1
+ yield = 4
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "potato-grow"
+ icon_dead = "potato-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/peanuts
+ seed = /obj/item/seeds/peanuts
+ name = "patch of peanuts"
+ desc = "Best avoided if you have spess allergies."
+ icon_state = "peanuts"
+ gender = PLURAL
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm
new file mode 100644
index 00000000000..5335346b713
--- /dev/null
+++ b/code/modules/hydroponics/grown/potato.dm
@@ -0,0 +1,65 @@
+// Potato
+/obj/item/seeds/potato
+ name = "pack of potato seeds"
+ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!"
+ icon_state = "seed-potato"
+ species = "potato"
+ plantname = "Potato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/potato
+ lifespan = 30
+ maturation = 10
+ production = 1
+ yield = 4
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_grow = "potato-grow"
+ icon_dead = "potato-dead"
+ genes = list(/datum/plant_gene/trait/battery)
+ mutatelist = list(/obj/item/seeds/potato/sweet)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/potato
+ seed = /obj/item/seeds/potato
+ name = "potato"
+ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!"
+ icon_state = "potato"
+ filling_color = "#E9967A"
+ bitesize = 100
+
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
+ name = "potato wedges"
+ desc = "Slices of neatly cut potato."
+ icon_state = "potato_wedges"
+ filling_color = "#E9967A"
+ bitesize = 100
+
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W, mob/user, params)
+ if(is_sharp(W))
+ to_chat(user, "You cut the potato into wedges with [W]. ")
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges/Wedges = new /obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ user.put_in_hands(Wedges)
+ qdel(src)
+ else
+ return ..()
+
+
+// Sweet Potato
+/obj/item/seeds/potato/sweet
+ name = "pack of sweet potato seeds"
+ desc = "These seeds grow into sweet potato plants."
+ icon_state = "seed-sweetpotato"
+ species = "sweetpotato"
+ plantname = "Sweet Potato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet
+ mutatelist = list()
+ reagents_add = list("vitamin" = 0.1, "sugar" = 0.1, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet
+ seed = /obj/item/seeds/potato/sweet
+ name = "sweet potato"
+ desc = "It's sweet."
+ icon_state = "sweetpotato"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm
new file mode 100644
index 00000000000..93da0b28fac
--- /dev/null
+++ b/code/modules/hydroponics/grown/pumpkin.dm
@@ -0,0 +1,54 @@
+// Pumpkin
+/obj/item/seeds/pumpkin
+ name = "pack of pumpkin seeds"
+ desc = "These seeds grow into pumpkin vines."
+ icon_state = "seed-pumpkin"
+ species = "pumpkin"
+ plantname = "Pumpkin Vines"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
+ lifespan = 50
+ endurance = 40
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "pumpkin-grow"
+ icon_dead = "pumpkin-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/pumpkin/blumpkin)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.2)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
+ seed = /obj/item/seeds/pumpkin
+ name = "pumpkin"
+ desc = "It's large and scary."
+ icon_state = "pumpkin"
+ filling_color = "#FFA500"
+ bitesize_mod = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(is_sharp(W))
+ user.show_message("You carve a face into [src]! ", 1)
+ new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc)
+ qdel(src)
+ return
+ else
+ return ..()
+
+// Blumpkin
+/obj/item/seeds/pumpkin/blumpkin
+ name = "pack of blumpkin seeds"
+ desc = "These seeds grow into blumpkin vines."
+ icon_state = "seed-blumpkin"
+ species = "blumpkin"
+ plantname = "Blumpkin Vines"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin
+ mutatelist = list()
+ reagents_add = list("ammonia" = 0.2, "chlorine" = 0.1, "plasma" = 0.1, "plantmatter" = 0.2)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin
+ seed = /obj/item/seeds/pumpkin/blumpkin
+ name = "blumpkin"
+ desc = "The pumpkin's toxic sibling."
+ icon_state = "blumpkin"
+ filling_color = "#87CEFA"
+ bitesize_mod = 2
diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm
new file mode 100644
index 00000000000..1f48f83c9a5
--- /dev/null
+++ b/code/modules/hydroponics/grown/random.dm
@@ -0,0 +1,29 @@
+//Random seeds; stats, traits, and plant type are randomized for each seed.
+
+/obj/item/seeds/random
+ name = "pack of strange seeds"
+ desc = "Mysterious seeds as strange as their name implies. Spooky"
+ icon_state = "seed-x"
+ species = "?????"
+ plantname = "strange plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/random
+ icon_grow = "xpod-grow"
+ icon_dead = "xpod-dead"
+ icon_harvest = "xpod-harvest"
+ growthstages = 4
+
+/obj/item/seeds/random/New()
+ randomize_stats()
+ ..()
+ if(prob(60))
+ add_random_reagents()
+ if(prob(50))
+ add_random_traits()
+ add_random_plant_type(35)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/random
+ seed = /obj/item/seeds/random
+ name = "strange plant"
+ desc = "What could this even be?"
+ icon_state = "crunchy"
+ bitesize_mod = 2
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
new file mode 100644
index 00000000000..8b90d28aa67
--- /dev/null
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -0,0 +1,106 @@
+// A very special plant, deserving it's own file.
+
+/obj/item/seeds/replicapod
+ name = "pack of replica pod seeds"
+ desc = "These seeds grow into replica pods. They say these are used to harvest humans."
+ icon_state = "seed-replicapod"
+ species = "replicapod"
+ plantname = "Replica Pod"
+ product = /mob/living/carbon/human/diona //verrry special -- Urist
+ lifespan = 50
+ endurance = 8
+ maturation = 10
+ production = 1
+ yield = 1 //seeds if there isn't a dna inside
+ potency = 30
+ var/ckey = null
+ var/realName = null
+ var/datum/mind/mind = null
+ var/blood_gender = null
+ var/blood_type = null
+ var/factions = null
+ var/contains_sample = 0
+
+/obj/item/seeds/replicapod/Destroy()
+ mind = null
+ return ..()
+
+/obj/item/seeds/replicapod/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W,/obj/item/weapon/reagent_containers/syringe))
+ if(!contains_sample)
+ for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list)
+ if(bloodSample.data["mind"] && bloodSample.data["cloneable"] == 1)
+ mind = bloodSample.data["mind"]
+ ckey = bloodSample.data["ckey"]
+ realName = bloodSample.data["real_name"]
+ blood_gender = bloodSample.data["gender"]
+ blood_type = bloodSample.data["blood_type"]
+ factions = bloodSample.data["factions"]
+ W.reagents.clear_reagents()
+ to_chat(user, "You inject the contents of the syringe into the seeds. ")
+ contains_sample = 1
+ else
+ to_chat(user, "The seeds reject the sample! ")
+ else
+ to_chat(user, "The seeds already contain a genetic sample! ")
+ else
+ return ..()
+
+/obj/item/seeds/replicapod/get_analyzer_text()
+ var/text = ..()
+ if(contains_sample)
+ text += "\n It contains a blood sample!"
+ return text
+
+
+/obj/item/seeds/replicapod/harvest(mob/user = usr) //now that one is fun -- Urist
+ var/obj/machinery/hydroponics/parent = loc
+ var/make_podman = 0
+ var/ckey_holder = null
+ if(config.revival_pod_plants)
+ if(ckey)
+ for(var/mob/M in player_list)
+ if(isobserver(M))
+ var/mob/dead/observer/O = M
+ if(O.ckey == ckey && O.can_reenter_corpse)
+ make_podman = 1
+ break
+ else
+ if(M.ckey == ckey && M.stat == DEAD && !M.suiciding)
+ make_podman = 1
+ break
+ else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
+ for(var/mob/M in player_list)
+ if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == DEAD && !M.suiciding)
+ if(isobserver(M))
+ var/mob/dead/observer/O = M
+ if(!O.can_reenter_corpse)
+ break
+ make_podman = 1
+ ckey_holder = M.ckey
+ break
+
+ if(make_podman) //all conditions met!
+ var/mob/living/carbon/human/diona/podman = new /mob/living/carbon/human/diona(parent.loc)
+ if(realName)
+ podman.real_name = realName
+ mind.transfer_to(podman)
+ if(ckey)
+ podman.ckey = ckey
+ else
+ podman.ckey = ckey_holder
+ podman.gender = blood_gender
+ podman.faction |= factions
+ podman.faction |= "plants"
+ podman.faction |= "vines" //Pod grown Diona are allied with plants and vines alike.
+
+ else //else, one packet of seeds. maybe two
+ var/seed_count = 1
+ if(prob(getYield() * 20))
+ seed_count++
+ var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK
+ for(var/i=0,iYou sharpen the carrot into a shiv with [I]. ")
+ var/obj/item/weapon/kitchen/knife/carrotshiv/Shiv = new /obj/item/weapon/kitchen/knife/carrotshiv
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ user.put_in_hands(Shiv)
+ qdel(src)
+ else
+ return ..()
+
+
+// Parsnip
+/obj/item/seeds/carrot/parsnip
+ name = "pack of parsnip seeds"
+ desc = "These seeds grow into parsnips."
+ icon_state = "seed-parsnip"
+ species = "parsnip"
+ plantname = "Parsnip"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip
+ icon_dead = "carrot-dead"
+ mutatelist = list()
+ reagents_add = list("vitamin" = 0.05, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/parsnip
+ seed = /obj/item/seeds/carrot/parsnip
+ name = "parsnip"
+ desc = "Closely related to carrots."
+ icon_state = "parsnip"
+ bitesize_mod = 2
+
+
+// White-Beet
+/obj/item/seeds/whitebeet
+ name = "pack of white-beet seeds"
+ desc = "These seeds grow into sugary beet producing plants."
+ icon_state = "seed-whitebeet"
+ species = "whitebeet"
+ plantname = "White-Beet Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet
+ lifespan = 60
+ endurance = 50
+ yield = 6
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_dead = "whitebeet-dead"
+ mutatelist = list(/obj/item/seeds/redbeet)
+ reagents_add = list("vitamin" = 0.04, "sugar" = 0.2, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet
+ seed = /obj/item/seeds/whitebeet
+ name = "white-beet"
+ desc = "You can't beat white-beet."
+ icon_state = "whitebeet"
+ filling_color = "#F4A460"
+ bitesize_mod = 2
+
+// Red Beet
+/obj/item/seeds/redbeet
+ name = "pack of redbeet seeds"
+ desc = "These seeds grow into red beet producing plants."
+ icon_state = "seed-redbeet"
+ species = "redbeet"
+ plantname = "Red-Beet Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/redbeet
+ lifespan = 60
+ endurance = 50
+ yield = 6
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ icon_dead = "whitebeet-dead"
+ genes = list(/datum/plant_gene/trait/maxchem)
+ reagents_add = list("vitamin" = 0.05, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/redbeet
+ seed = /obj/item/seeds/redbeet
+ name = "red beet"
+ desc = "You can't beat red beet."
+ icon_state = "redbeet"
+ bitesize_mod = 2
diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm
new file mode 100644
index 00000000000..2f1d6c97bda
--- /dev/null
+++ b/code/modules/hydroponics/grown/tea_coffee.dm
@@ -0,0 +1,87 @@
+// Tea
+/obj/item/seeds/tea
+ name = "pack of tea aspera seeds"
+ desc = "These seeds grow into tea plants."
+ icon_state = "seed-teaaspera"
+ species = "teaaspera"
+ plantname = "Tea Aspera Plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tea
+ lifespan = 20
+ maturation = 5
+ production = 5
+ yield = 5
+ growthstages = 5
+ icon_dead = "tea-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/tea/astra)
+ reagents_add = list("vitamin" = 0.04, "teapowder" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tea
+ seed = /obj/item/seeds/tea
+ name = "Tea Aspera tips"
+ desc = "These aromatic tips of the tea plant can be dried to make tea."
+ icon_state = "tea_aspera_leaves"
+ filling_color = "#008000"
+
+// Tea Astra
+/obj/item/seeds/tea/astra
+ name = "pack of tea astra seeds"
+ icon_state = "seed-teaastra"
+ species = "teaastra"
+ plantname = "Tea Astra Plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra
+ mutatelist = list()
+ reagents_add = list("synaptizine" = 0.1, "vitamin" = 0.04, "teapowder" = 0.1)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra
+ seed = /obj/item/seeds/tea/astra
+ name = "Tea Astra tips"
+ icon_state = "tea_astra_leaves"
+ filling_color = "#4582B4"
+
+
+// Coffee
+/obj/item/seeds/coffee
+ name = "pack of coffee arabica seeds"
+ desc = "These seeds grow into coffee arabica bushes."
+ icon_state = "seed-coffeea"
+ species = "coffeea"
+ plantname = "Coffee Arabica Bush"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee
+ lifespan = 30
+ endurance = 20
+ maturation = 5
+ production = 5
+ yield = 5
+ growthstages = 5
+ icon_dead = "coffee-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/coffee/robusta)
+ reagents_add = list("vitamin" = 0.04, "coffeepowder" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/coffee
+ seed = /obj/item/seeds/coffee
+ name = "coffee arabica beans"
+ desc = "Dry them out to make coffee."
+ icon_state = "coffee_arabica"
+ filling_color = "#DC143C"
+ bitesize_mod = 2
+
+// Coffee Robusta
+/obj/item/seeds/coffee/robusta
+ name = "pack of coffee robusta seeds"
+ desc = "These seeds grow into coffee robusta bushes."
+ icon_state = "seed-coffeer"
+ species = "coffeer"
+ plantname = "Coffee Robusta Bush"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta
+ mutatelist = list()
+ reagents_add = list("ephedrine" = 0.1, "vitamin" = 0.04, "coffeepowder" = 0.1)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta
+ seed = /obj/item/seeds/coffee/robusta
+ name = "coffee robusta beans"
+ desc = "Increases robustness by 37 percent!"
+ icon_state = "coffee_robusta"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm
new file mode 100644
index 00000000000..e08f1f0b9f4
--- /dev/null
+++ b/code/modules/hydroponics/grown/tobacco.dm
@@ -0,0 +1,41 @@
+// Tobacco
+/obj/item/seeds/tobacco
+ name = "pack of tobacco seeds"
+ desc = "These seeds grow into tobacco plants."
+ icon_state = "seed-tobacco"
+ species = "tobacco"
+ plantname = "Tobacco Plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco
+ lifespan = 20
+ maturation = 5
+ production = 5
+ yield = 10
+ growthstages = 3
+ icon_dead = "tobacco-dead"
+ mutatelist = list(/obj/item/seeds/tobacco/space)
+ reagents_add = list("nicotine" = 0.03, "plantmatter" = 0.03)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco
+ seed = /obj/item/seeds/tobacco
+ name = "tobacco leaves"
+ desc = "Dry them out to make some smokes."
+ icon_state = "tobacco_leaves"
+ filling_color = "#008000"
+
+// Space Tobacco
+/obj/item/seeds/tobacco/space
+ name = "pack of space tobacco seeds"
+ desc = "These seeds grow into space tobacco plants."
+ icon_state = "seed-stobacco"
+ species = "stobacco"
+ plantname = "Space Tobacco Plant"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco/space
+ mutatelist = list()
+ reagents_add = list("salbutamol" = 0.05, "nicotine" = 0.08, "plantmatter" = 0.03)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco/space
+ seed = /obj/item/seeds/tobacco/space
+ name = "space tobacco leaves"
+ desc = "Dry them out to make some space-smokes."
+ icon_state = "stobacco_leaves"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
new file mode 100644
index 00000000000..78c3e3dfded
--- /dev/null
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -0,0 +1,144 @@
+// Tomato
+/obj/item/seeds/tomato
+ name = "pack of tomato seeds"
+ desc = "These seeds grow into tomato plants."
+ icon_state = "seed-tomato"
+ species = "tomato"
+ plantname = "Tomato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato
+ maturation = 8
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "tomato-grow"
+ icon_dead = "tomato-dead"
+ genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list(/obj/item/seeds/tomato/blue, /obj/item/seeds/tomato/blood)
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
+ seed = /obj/item/seeds/tomato
+ name = "tomato"
+ desc = "I say to-mah-to, you say tom-mae-to."
+ icon_state = "tomato"
+ splat_type = /obj/effect/decal/cleanable/tomato_smudge
+ filling_color = "#FF6347"
+ bitesize_mod = 2
+
+// Blood Tomato
+/obj/item/seeds/tomato/blood
+ name = "pack of blood-tomato seeds"
+ desc = "These seeds grow into blood-tomato plants."
+ icon_state = "seed-bloodtomato"
+ species = "bloodtomato"
+ plantname = "Blood-Tomato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood
+ mutatelist = list(/obj/item/seeds/tomato/killer)
+ reagents_add = list("blood" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood
+ seed = /obj/item/seeds/tomato/blood
+ name = "blood-tomato"
+ desc = "So bloody...so...very...bloody....AHHHH!!!!"
+ icon_state = "bloodtomato"
+ splat_type = /obj/effect/gibspawner/generic
+ filling_color = "#FF0000"
+ origin_tech = "biotech=5"
+
+
+// Blue Tomato
+/obj/item/seeds/tomato/blue
+ name = "pack of blue-tomato seeds"
+ desc = "These seeds grow into blue-tomato plants."
+ icon_state = "seed-bluetomato"
+ species = "bluetomato"
+ plantname = "Blue-Tomato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue
+ yield = 2
+ icon_grow = "bluetomato-grow"
+ mutatelist = list(/obj/item/seeds/tomato/blue/bluespace)
+ genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("lube" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 20
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue
+ seed = /obj/item/seeds/tomato/blue
+ name = "blue-tomato"
+ desc = "I say blue-mah-to, you say blue-mae-to."
+ icon_state = "bluetomato"
+ splat_type = /obj/effect/decal/cleanable/blood/oil
+ filling_color = "#0000FF"
+
+
+// Bluespace Tomato
+/obj/item/seeds/tomato/blue/bluespace
+ name = "pack of bluespace tomato seeds"
+ desc = "These seeds grow into bluespace tomato plants."
+ icon_state = "seed-bluespacetomato"
+ species = "bluespacetomato"
+ plantname = "Bluespace Tomato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace
+ yield = 2
+ mutatelist = list()
+ genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("lube" = 0.2, "singulo" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.1)
+ rarity = 50
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace
+ seed = /obj/item/seeds/tomato/blue/bluespace
+ name = "bluespace tomato"
+ desc = "So lubricated, you might slip through space-time."
+ icon_state = "bluespacetomato"
+ origin_tech = "biotech=4;bluespace=5"
+
+
+// Killer Tomato
+/obj/item/seeds/tomato/killer
+ name = "pack of killer-tomato seeds"
+ desc = "These seeds grow into killer-tomato plants."
+ icon_state = "seed-killertomato"
+ species = "killertomato"
+ plantname = "Killer-Tomato Plants"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer
+ yield = 2
+ genes = list(/datum/plant_gene/trait/squash)
+ growthstages = 2
+ icon_grow = "killertomato-grow"
+ icon_harvest = "killertomato-harvest"
+ icon_dead = "killertomato-dead"
+ mutatelist = list()
+ reagents_add = list("vitamin" = 0.04, "protein" = 0.1)
+ rarity = 30
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer
+ seed = /obj/item/seeds/tomato/killer
+ name = "killer-tomato"
+ desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!"
+ icon_state = "killertomato"
+ var/awakening = 0
+ filling_color = "#FF0000"
+ origin_tech = "biotech=4;combat=5"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone)
+ if(awakening)
+ to_chat(user, "The tomato is twitching and shaking, preventing you from eating it. ")
+ return
+ ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user)
+ if(awakening || istype(user.loc, /turf/space))
+ return
+ to_chat(user, "You begin to awaken the Killer Tomato... ")
+ awakening = 1
+
+ spawn(30)
+ if(!qdeleted(src))
+ var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(loc))
+ K.maxHealth += round(seed.endurance / 3)
+ K.melee_damage_lower += round(seed.potency / 10)
+ K.melee_damage_upper += round(seed.potency / 10)
+ K.move_to_delay -= round(seed.production / 50)
+ K.health = K.maxHealth
+ K.visible_message("The Killer Tomato growls as it suddenly awakens. ")
+ if(user)
+ user.unEquip(src)
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
new file mode 100644
index 00000000000..339459669be
--- /dev/null
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -0,0 +1,194 @@
+/obj/item/seeds/tower
+ name = "pack of tower-cap mycelium"
+ desc = "This mycelium grows into tower-cap mushrooms."
+ icon_state = "mycelium-tower"
+ species = "towercap"
+ plantname = "Tower Caps"
+ product = /obj/item/weapon/grown/log
+ lifespan = 80
+ endurance = 50
+ maturation = 15
+ production = 1
+ yield = 5
+ potency = 50
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ icon_dead = "towercap-dead"
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ mutatelist = list(/obj/item/seeds/tower/steel)
+
+/obj/item/seeds/tower/steel
+ name = "pack of steel-cap mycelium"
+ desc = "This mycelium grows into steel logs."
+ icon_state = "mycelium-steelcap"
+ species = "steelcap"
+ plantname = "Steel Caps"
+ product = /obj/item/weapon/grown/log/steel
+ mutatelist = list()
+ rarity = 20
+
+
+
+
+/obj/item/weapon/grown/log
+ seed = /obj/item/seeds/tower
+ name = "tower-cap log"
+ desc = "It's better than bad, it's good!"
+ icon_state = "logs"
+ force = 5
+ throwforce = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 2
+ throw_range = 3
+ origin_tech = "materials=1"
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ var/plank_type = /obj/item/stack/sheet/wood
+ var/plank_name = "wooden planks"
+ var/list/accepted = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tea,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
+
+
+/obj/item/weapon/grown/log/attackby(obj/item/weapon/W, mob/user, params)
+ if(is_sharp(W))
+ user.show_message("You make [plank_name] out of \the [src]! ", 1)
+ var/seed_modifier = 0
+ if(seed)
+ seed_modifier = round(seed.potency / 25)
+ var/obj/item/stack/plank = new plank_type(user.loc, 1 + seed_modifier)
+ var/old_plank_amount = plank.amount
+ for(var/obj/item/stack/ST in user.loc)
+ if(ST != plank && istype(ST, plank_type) && ST.amount < ST.max_amount)
+ ST.attackby(plank, user) //we try to transfer all old unfinished stacks to the new stack we created.
+ if(plank.amount > old_plank_amount)
+ to_chat(user, "You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name]. ")
+ qdel(src)
+
+ if(is_type_in_list(W,accepted))
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/leaf = W
+ if(leaf.dry)
+ user.show_message("You wrap \the [W] around the log, turning it into a torch! ")
+ var/obj/item/device/flashlight/flare/torch/T = new /obj/item/device/flashlight/flare/torch(user.loc)
+ usr.unEquip(W)
+ usr.put_in_active_hand(T)
+ qdel(leaf)
+ qdel(src)
+ return
+ else
+ to_chat(usr, "You must dry this first! ")
+ else
+ return ..()
+
+/obj/item/weapon/grown/log/tree
+ seed = null
+ name = "wood log"
+ desc = "TIMMMMM-BERRRRRRRRRRR!"
+
+/obj/item/weapon/grown/log/steel
+ seed = /obj/item/seeds/tower/steel
+ name = "steel-cap log"
+ desc = "It's made of metal."
+ icon_state = "steellogs"
+ accepted = list()
+ plank_type = /obj/item/stack/rods
+ plank_name = "rods"
+
+
+/////////BONFIRES//////////
+
+/obj/structure/bonfire
+ name = "bonfire"
+ desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "bonfire"
+ density = FALSE
+ anchored = TRUE
+ buckle_lying = 0
+ var/burning = 0
+ var/fire_stack_strength = 5
+
+/obj/structure/bonfire/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/stack/rods) && !can_buckle)
+ var/obj/item/stack/rods/R = W
+ R.use(1)
+ can_buckle = 1
+ buckle_requires_restraints = 1
+ to_chat(user, "You add a rod to [src].")
+ var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16)
+ underlays += U
+ if(is_hot(W))
+ StartBurning()
+
+
+/obj/structure/bonfire/attack_hand(mob/user)
+ if(burning)
+ to_chat(user, "You need to extinguish [src] before removing the logs!")
+ return
+ if(!has_buckled_mobs() && do_after(user, 50, target = src))
+ for(var/I in 1 to 5)
+ var/obj/item/weapon/grown/log/L = new /obj/item/weapon/grown/log(loc)
+ L.pixel_x += rand(1,4)
+ L.pixel_y += rand(1,4)
+ qdel(src)
+ return
+ ..()
+
+
+/obj/structure/bonfire/proc/CheckOxygen()
+ var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
+ if(G.oxygen > 16)
+ return 1
+ return 0
+
+/obj/structure/bonfire/proc/StartBurning()
+ if(!burning && CheckOxygen())
+ icon_state = "bonfire_on_fire"
+ burning = 1
+ set_light(6, l_color = "#ED9200")
+ Burn()
+ processing_objects.Add(src)
+
+/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume)
+ StartBurning()
+
+/obj/structure/bonfire/Crossed(atom/movable/AM)
+ if(burning)
+ Burn()
+
+/obj/structure/bonfire/proc/Burn()
+ var/turf/current_location = get_turf(src)
+ current_location.hotspot_expose(1000,500,1)
+ for(var/A in current_location)
+ if(A == src)
+ continue
+ if(isobj(A))
+ var/obj/O = A
+ O.fire_act(1000, 500)
+ else if(isliving(A))
+ var/mob/living/L = A
+ L.adjust_fire_stacks(fire_stack_strength)
+ L.IgniteMob()
+
+/obj/structure/bonfire/process()
+ if(!CheckOxygen())
+ extinguish()
+ return
+ Burn()
+
+/obj/structure/bonfire/extinguish()
+ if(burning)
+ icon_state = "bonfire"
+ burning = 0
+ set_light(0)
+ processing_objects.Remove(src)
+
+/obj/structure/bonfire/buckle_mob(mob/living/M, force = 0)
+ if(..())
+ M.pixel_y += 13
+
+/obj/structure/bonfire/unbuckle_mob(force=0)
+ if(buckled_mob)
+ buckled_mob.pixel_y -= 13
+ . = ..()
diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
deleted file mode 100644
index 712f368a078..00000000000
--- a/code/modules/hydroponics/grown_inedible.dm
+++ /dev/null
@@ -1,181 +0,0 @@
-// **********************
-// Other harvested materials from plants (that are not food)
-// **********************
-
-/obj/item/weapon/grown // Grown weapons
- name = "grown_weapon"
- icon = 'icons/obj/weapons.dmi'
- var/plantname
- var/potency = 1
- burn_state = FLAMMABLE
-
-/obj/item/weapon/grown/New(newloc,planttype)
-
- ..()
-
- create_reagents(50)
-
- //Handle some post-spawn var stuff.
- if(planttype)
- plantname = planttype
- var/datum/seed/S = plant_controller.seeds[plantname]
- if(!S || !S.chems)
- return
-
- potency = S.get_trait(TRAIT_POTENCY)
-
- for(var/rid in S.chems)
- var/list/reagent_data = S.chems[rid]
- var/rtotal = reagent_data[1]
- if(reagent_data.len > 1 && potency > 0)
- rtotal += round(potency/reagent_data[2])
- reagents.add_reagent(rid,max(1,rtotal))
-
-/obj/item/weapon/grown/nettle //abstract type
- name = "nettle"
- desc = "It's probably not wise to touch it with bare hands..."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "nettle"
- damtype = "fire"
- force = 15
- hitsound = 'sound/weapons/bladeslice.ogg'
- throwforce = 5
- w_class = 1
- throw_speed = 1
- throw_range = 3
- origin_tech = "combat=1"
- attack_verb = list("stung")
-
-/obj/item/weapon/grown/nettle/suicide_act(mob/user)
- user.visible_message("[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide. ")
- return (BRUTELOSS|TOXLOSS)
-
-/obj/item/weapon/grown/nettle/pickup(mob/living/user)
- if(!iscarbon(user))
- return 0
- var/mob/living/carbon/C = user
- if(ishuman(user))
- var/mob/living/carbon/human/H = C
- if(H.gloves)
- return 0
- var/organ = ((user.hand ? "l_":"r_") + "arm")
- var/obj/item/organ/external/affecting = H.get_organ(organ)
- if(affecting.take_damage(0,force))
- user.UpdateDamageIcon()
- else
- C.take_organ_damage(0,force)
- to_chat(C, "The nettle burns your bare hand! ")
- return 1
-
-/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity)
- if(!proximity) return
- if(force > 0)
- force -= rand(1, (force / 3) + 1) // When you whack someone with it, leaves fall off
- else
- to_chat(usr, "All the leaves have fallen off the nettle from violent whacking.")
- usr.unEquip(src)
- qdel(src)
-
-
-/obj/item/weapon/grown/nettle/death
- name = "deathnettle"
- desc = "The glowing nettle incites rage in you just from looking at it!"
- icon_state = "deathnettle"
- force = 30
- throwforce = 15
- origin_tech = "combat=3"
-
-/obj/item/weapon/grown/nettle/death/pickup(mob/living/carbon/user)
- if(..())
- if(prob(50))
- user.Paralyse(5)
- to_chat(user, "You are stunned by the Deathnettle when you try picking it up! ")
-
-/obj/item/weapon/grown/nettle/death/afterattack(mob/living/carbon/M, mob/user)
- if(istype(M, /mob/living))
- to_chat(M, "You are stunned by the powerful acid of the Deathnettle! ")
- add_logs(user, M, "attacked", src)
-
- M.AdjustEyeBlurry(force/7)
- if(prob(20))
- M.Paralyse(force / 6)
- M.Weaken(force / 15)
- M.drop_item()
- ..()
-
-/obj/item/weapon/corncob
- name = "corn cob"
- desc = "A reminder of meals gone by."
- icon = 'icons/obj/trash.dmi'
- icon_state = "corncob"
- item_state = "corncob"
- w_class = 2
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/knife))
- to_chat(user, "You use [W] to fashion a pipe out of the corn cob! ")
- new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc)
- qdel(src)
- return
-
-/obj/item/weapon/bananapeel
- name = "banana peel"
- desc = "A peel from a banana."
- icon = 'icons/obj/items.dmi'
- icon_state = "banana_peel"
- item_state = "banana_peel"
- w_class = 2
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-
-// Sunflower
-
-/obj/item/weapon/grown/sunflower
- name = "sunflower"
- desc = "A large, fresh-grown sunflower. How cheery!"
- icon = 'icons/obj/harvest.dmi'
- icon_state = "sunflower"
- item_state = "sunflower"
- w_class = 2
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
- to_chat(M, " [user] smacks you with a [name]! FLOWER POWER ")
- to_chat(user, " Your [name]'s FLOWER POWER strikes [M] ")
-
-
-// Novaflower
-
-/obj/item/weapon/grown/novaflower
- name = "novaflower"
- desc = "A large, fresh-grown novaflower. It seems to radiate heat."
- icon = 'icons/obj/harvest.dmi'
- icon_state = "novaflower"
- item_state = "sunflower"
- w_class = 2
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob)
- to_chat(M, "[user] smacks you with a [name]! FLOWER POWER ")
- to_chat(user, " Your [name]'s FLOWER POWER strikes [M] ")
- if(istype(M, /mob/living))
- to_chat(M, "You are lit on fire from the intense heat of the [name]! ")
- M.adjust_fire_stacks(potency / 20)
- if(M.IgniteMob())
- message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
- log_game("[key_name(user)] set [key_name(M)] on fire")
-
-/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob)
- if(!user.gloves)
- to_chat(user, "The [name] burns your bare hand! ")
- user.adjustFireLoss(rand(1,5))
diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm
deleted file mode 100644
index a7a9254db66..00000000000
--- a/code/modules/hydroponics/grown_predefined.dm
+++ /dev/null
@@ -1,55 +0,0 @@
-// Predefined types for placing on the map.
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap
- plantname = "libertycap"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
- plantname = "ambrosia"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/potato
- plantname = "potato"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
- plantname = "tomato"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer
- plantname = "killertomato"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/carrot
- plantname = "carrot"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/berries
- plantname = "berries"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/banana
- plantname = "banana"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/chili
- plantname = "chili"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/lemon
- plantname = "lemon"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/cherries
- plantname = "cherry"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/orange
- plantname = "orange"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/corn
- plantname = "corn"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
- plantname = "amanita"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus
- plantname = "ambrosiadeus"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/aloe
- plantname = "aloe"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/comfrey
- plantname = "comfrey"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/glowcap
- plantname = "glowcap"
\ No newline at end of file
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
new file mode 100644
index 00000000000..c94706f00e5
--- /dev/null
+++ b/code/modules/hydroponics/growninedible.dm
@@ -0,0 +1,64 @@
+// **********************
+// Other harvested materials from plants (that are not food)
+// **********************
+
+/obj/item/weapon/grown // Grown weapons
+ name = "grown_weapon"
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ burn_state = FLAMMABLE
+ var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
+
+/obj/item/weapon/grown/New(newloc, var/obj/item/seeds/new_seed = null)
+ ..()
+ create_reagents(50)
+
+ if(new_seed)
+ seed = new_seed.Copy()
+ else if(ispath(seed))
+ // This is for adminspawn or map-placed growns. They get the default stats of their seed type.
+ seed = new seed()
+ seed.adjust_potency(50-seed.potency)
+
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_new(src, newloc)
+
+ if(istype(src, seed.product)) // no adding reagents if it is just a trash item
+ seed.prepare_result(src)
+ transform *= TransformUsingVariable(seed.potency, 100, 0.5)
+ add_juice()
+
+/obj/item/weapon/grown/Destroy()
+ QDEL_NULL(seed)
+ return ..()
+
+/obj/item/weapon/grown/attackby(obj/item/O, mob/user, params)
+ ..()
+ if (istype(O, /obj/item/device/plant_analyzer))
+ var/msg = "*---------*\n This is \a [src] \n"
+ if(seed)
+ msg += seed.get_analyzer_text()
+ msg += " "
+ to_chat(usr, msg)
+ return
+
+/obj/item/weapon/grown/proc/add_juice()
+ if(reagents)
+ return 1
+ return 0
+
+
+/obj/item/weapon/grown/Crossed(atom/movable/AM)
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_cross(src, AM)
+ ..()
+
+/obj/item/weapon/grown/throw_impact(atom/hit_atom)
+ if(!..()) //was it caught by a mob?
+ if(seed)
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_throw_impact(src, hit_atom)
\ No newline at end of file
diff --git a/code/modules/hydroponics/hydro_reagents.dm b/code/modules/hydroponics/hydro_reagents.dm
deleted file mode 100644
index 20d175b2939..00000000000
--- a/code/modules/hydroponics/hydro_reagents.dm
+++ /dev/null
@@ -1,124 +0,0 @@
-
-/obj/item/weapon/plantspray
- icon = 'icons/obj/hydroponics_machines.dmi'
- item_state = "spray"
- flags = OPENCONTAINER | NOBLUDGEON
- slot_flags = SLOT_BELT
- throwforce = 4
- w_class = 2
- throw_speed = 2
- throw_range = 10
- var/toxicity = 4
- var/pest_kill_str = 0
- var/weed_kill_str = 0
-
-/obj/item/weapon/plantspray/weeds // -- Skie
-
- name = "weed-spray"
- desc = "It's a toxic mixture, in spray form, to kill small weeds."
- icon_state = "weedspray"
- weed_kill_str = 6
-
-/obj/item/weapon/plantspray/pests
- name = "pest-spray"
- desc = "It's some pest eliminator spray! Do not inhale! "
- icon_state = "pestspray"
- pest_kill_str = 6
-
-/obj/item/weapon/plantspray/pests/old
- name = "bottle of pestkiller"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
-
-/obj/item/weapon/plantspray/pests/old/carbaryl
- name = "bottle of carbaryl"
- toxicity = 4
- pest_kill_str = 2
-
-/obj/item/weapon/plantspray/pests/old/lindane
- name = "bottle of lindane"
- icon_state = "bottle18"
- toxicity = 6
- pest_kill_str = 4
-
-/obj/item/weapon/plantspray/pests/old/phosmet
- name = "bottle of phosmet"
- icon_state = "bottle15"
- toxicity = 8
- pest_kill_str = 7
-
-
-// *************************************
-// Weedkiller defines for hydroponics
-// *************************************
-
-/obj/item/weedkiller
- name = "bottle of weedkiller"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
- flags = OPENCONTAINER | NOBLUDGEON
- var/toxicity = 0
- var/weed_kill_str = 0
-
-/obj/item/weedkiller/triclopyr
- name = "bottle of glyphosate"
- icon = 'icons/obj/chemical.dmi'
- toxicity = 4
- weed_kill_str = 2
-
-/obj/item/weedkiller/lindane
- name = "bottle of triclopyr"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle18"
- toxicity = 6
- weed_kill_str = 4
-
-/obj/item/weedkiller/D24
- name = "bottle of 2,4-D"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle15"
- toxicity = 8
- weed_kill_str = 7
-
-// *************************************
-// Nutrient defines for hydroponics
-// *************************************
-
-/obj/item/weapon/reagent_containers/glass/bottle/fertilizer
- name = "fertilizer bottle"
- desc = "A small glass bottle. Can hold up to 10 units."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "round_bottle"
- flags = OPENCONTAINER
- possible_transfer_amounts = null
- w_class = 2
-
- var/fertilizer //Reagent contained, if any.
-
- //Like a shot glass!
- amount_per_transfer_from_this = 10
- volume = 10
-
-/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/New()
- ..()
-
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
-
- if(fertilizer)
- reagents.add_reagent(fertilizer,10)
-
-/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez
- name = "bottle of E-Z-Nutrient"
- icon_state = "round_bottle"
- fertilizer = "eznutrient"
-
-/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/l4z
- name = "bottle of Left 4 Zed"
- icon_state = "round_bottle"
- fertilizer = "left4zed"
-
-/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/rh
- name = "bottle of Robust Harvest"
- icon_state = "round_bottle"
- fertilizer = "robustharvest"
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
new file mode 100644
index 00000000000..9a93d1a9673
--- /dev/null
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -0,0 +1,274 @@
+// Plant analyzer
+/obj/item/device/plant_analyzer
+ name = "plant analyzer"
+ desc = "A scanner used to evaluate a plant's various areas of growth."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "hydro"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_TINY
+ slot_flags = SLOT_BELT
+ origin_tech = "magnets=2;biotech=2"
+ materials = list(MAT_METAL=30, MAT_GLASS=20)
+
+// *************************************
+// Hydroponics Tools
+// *************************************
+
+/obj/item/weapon/reagent_containers/spray/weedspray // -- Skie
+ desc = "It's a toxic mixture, in spray form, to kill small weeds."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ name = "weed spray"
+ icon_state = "weedspray"
+ item_state = "plantbgone"
+ volume = 100
+ flags = OPENCONTAINER
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 10
+
+/obj/item/weapon/reagent_containers/spray/weedspray/New()
+ ..()
+ reagents.add_reagent("atrazine", 100)
+
+/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
+ user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide. ")
+ return (TOXLOSS)
+
+/obj/item/weapon/reagent_containers/spray/pestspray // -- Skie
+ desc = "It's some pest eliminator spray! Do not inhale! "
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ name = "pest spray"
+ icon_state = "pestspray"
+ item_state = "plantbgone"
+ volume = 100
+ flags = OPENCONTAINER
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 10
+
+/obj/item/weapon/reagent_containers/spray/pestspray/New()
+ ..()
+ reagents.add_reagent("pestkiller", 100)
+
+/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
+ user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide. ")
+ return (TOXLOSS)
+
+/obj/item/weapon/cultivator
+ name = "cultivator"
+ desc = "It's used for removing weeds or scratching your back."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "cultivator"
+ item_state = "cultivator"
+ origin_tech = "engineering=2;biotech=2"
+ flags = CONDUCT
+ force = 5
+ throwforce = 7
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=50)
+ attack_verb = list("slashed", "sliced", "cut", "clawed")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/weapon/hatchet
+ name = "hatchet"
+ desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "hatchet"
+ flags = CONDUCT
+ force = 12
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 15
+ throw_speed = 3
+ throw_range = 4
+ materials = list(MAT_METAL = 15000)
+ origin_tech = "materials=2;combat=2"
+ attack_verb = list("chopped", "torn", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharp = 1
+ edge = 1
+
+/obj/item/weapon/hatchet/suicide_act(mob/user)
+ user.visible_message("[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide. ")
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/hatchet/unathiknife
+ name = "duelling knife"
+ desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "unathiknife"
+ attack_verb = list("ripped", "torn", "cut")
+
+/obj/item/weapon/scythe
+ icon_state = "scythe0"
+ name = "scythe"
+ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
+ force = 13
+ throwforce = 5
+ throw_speed = 2
+ throw_range = 3
+ w_class = WEIGHT_CLASS_BULKY
+ flags = CONDUCT
+ armour_penetration = 20
+ slot_flags = SLOT_BACK
+ origin_tech = "materials=3;combat=2"
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharp = 1
+ edge = 1
+ var/extend = 1
+
+/obj/item/weapon/scythe/suicide_act(mob/user)
+ user.visible_message("[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide. ")
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.droplimb(1, DROPLIMB_EDGE)
+ playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/scythe/tele
+ icon_state = "tscythe0"
+ item_state = null //no sprite for folded version, like a tele-baton
+ name = "telescopic scythe"
+ desc = "A sharp and curved blade on a collapsable fibre metal handle, this tool is the pinnacle of covert reaping technology."
+ force = 3
+ sharp = 0
+ edge = 0
+ w_class = WEIGHT_CLASS_SMALL
+ extend = 0
+ slot_flags = SLOT_BELT
+ origin_tech = "materials=3;combat=3"
+ attack_verb = list("hit", "poked")
+ hitsound = "swing_hit"
+
+/obj/item/weapon/scythe/tele/attack_self(mob/user)
+ extend = !extend
+ if(extend)
+ to_chat(user, "With a flick of your wrist, you extend the scythe. It's reaping time! ")
+ icon_state = "tscythe1"
+ item_state = "scythe0" //use the normal scythe in-hands
+ slot_flags = SLOT_BACK //won't fit on belt, but can be worn on belt when extended
+ w_class = WEIGHT_CLASS_BULKY //won't fit in backpacks while extended
+ force = 15 //slightly better than normal scythe damage
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ //Extend sound (blade unsheath)
+ playsound(src.loc, 'sound/weapons/blade_unsheath.ogg', 50, 1) //Sound credit to Qat of Freesound.org
+ else
+ to_chat(user, "You collapse the scythe, folding it away for easy storage. ")
+ icon_state = "tscythe0"
+ item_state = null //no sprite for folded version, like a tele-baton
+ slot_flags = SLOT_BELT //can be worn on belt again, but no longer makes sense to wear on the back
+ w_class = WEIGHT_CLASS_SMALL
+ force = 3
+ attack_verb = list("hit", "poked")
+ hitsound = "swing_hit"
+ //Collapse sound (blade sheath)
+ playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org
+ sharp = extend
+ edge = extend
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+ add_fingerprint(user)
+ if(!blood_DNA)
+ return
+ if(blood_overlay && (blood_DNA.len >= 1)) //updated blood overlay, if any
+ overlays.Cut() //this might delete other item overlays as well but eeeeeh
+
+ var/icon/I = new /icon(icon, icon_state)
+ I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)), ICON_ADD)
+ I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY)
+ blood_overlay = I
+ overlays += blood_overlay
+
+
+// *************************************
+// Nutrient defines for hydroponics
+// *************************************
+
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient
+ name = "bottle of nutrient"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+ volume = 50
+ w_class = WEIGHT_CLASS_TINY
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(1,2,5,10,15,25,50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/New()
+ ..()
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez
+ name = "bottle of E-Z-Nutrient"
+ desc = "Contains a fertilizer that causes mild mutations with each harvest."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/New()
+ ..()
+ reagents.add_reagent("eznutriment", 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
+ name = "bottle of Left 4 Zed"
+ desc = "Contains a fertilizer that limits plant yields to no more than one and causes significant mutations in plants."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle18"
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/New()
+ ..()
+ reagents.add_reagent("left4zednutriment", 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
+ name = "bottle of Robust Harvest"
+ desc = "Contains a fertilizer that increases the yield of a plant by 30% while causing no mutations."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle15"
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/New()
+ ..()
+ reagents.add_reagent("robustharvestnutriment", 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
+ name = "bottle"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+
+/obj/item/weapon/reagent_containers/glass/bottle/killer
+ name = "bottle"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+ volume = 50
+ w_class = WEIGHT_CLASS_TINY
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(1,2,5,10,15,25,50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller
+ name = "bottle of weed killer"
+ desc = "Contains a herbicide."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+
+/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/New()
+ ..()
+ reagents.add_reagent("atrazine", 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
+ name = "bottle of pest spray"
+ desc = "Contains a pesticide."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle20"
+
+/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
+ ..()
+ reagents.add_reagent("pestkiller", 50)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
new file mode 100644
index 00000000000..7c5297e07c4
--- /dev/null
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -0,0 +1,1044 @@
+#define HYDRO_CYCLES_PER_AGE 2 //Adjust this to adjust how many hydroponics cycles it takes to increase age. Positive integers only.
+
+/obj/machinery/hydroponics
+ name = "hydroponics tray"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "hydrotray"
+ density = 1
+ anchored = 1
+ pixel_y = 8
+ var/waterlevel = 100 //The amount of water in the tray (max 100)
+ var/maxwater = 100 //The maximum amount of water in the tray
+ var/nutrilevel = 10 //The amount of nutrient in the tray (max 10)
+ var/maxnutri = 10 //The maximum nutrient of water in the tray
+ var/pestlevel = 0 //The amount of pests in the tray (max 10)
+ var/weedlevel = 0 //The amount of weeds in the tray (max 10)
+ var/yieldmod = 1 //Nutriment's effect on yield
+ var/mutmod = 1 //Nutriment's effect on mutations
+ var/toxic = 0 //Toxicity in the tray?
+ var/age = 0 //Current age
+ var/dead = 0 //Is it dead?
+ var/plant_health //Its health
+ var/lastproduce = 0 //Last time it was harvested
+ var/lastcycle = 0 //Used for timing of cycles.
+ var/cycledelay = 200 //About 10 seconds / cycle
+ var/current_cycle = 0 //Used for tracking when to age
+ var/harvest = 0 //Ready to harvest?
+ var/obj/item/seeds/myseed = null //The currently planted seed
+ var/rating = 1
+ var/wrenchable = 1
+ var/lid_state = 0
+ var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
+ var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
+ var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
+ hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
+
+/obj/machinery/hydroponics/New()
+ ..()
+ var/datum/atom_hud/data/hydroponic/hydro_hud = huds[DATA_HUD_HYDROPONIC]
+ prepare_huds()
+ hydro_hud.add_to_hud(src)
+ plant_hud_set_nutrient()
+ plant_hud_set_water()
+ plant_hud_set_status()
+ plant_hud_set_health()
+ plant_hud_set_toxin()
+ plant_hud_set_pest()
+ plant_hud_set_weed()
+
+/obj/machinery/hydroponics/constructable
+ name = "hydroponics tray"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "hydrotray3"
+
+/obj/machinery/hydroponics/constructable/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/hydroponics(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/hydroponics/constructable/RefreshParts()
+ var/tmp_capacity = 0
+ for (var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ tmp_capacity += M.rating
+ for (var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ rating = M.rating
+ maxwater = tmp_capacity * 50 // Up to 300
+ maxnutri = tmp_capacity * 5 // Up to 30
+ waterlevel = maxwater
+ nutrilevel = 3
+ plant_hud_set_nutrient()
+ plant_hud_set_water()
+
+/obj/machinery/hydroponics/Destroy()
+ remove_from_all_data_huds()
+ QDEL_NULL(myseed)
+ return ..()
+
+/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I))
+ return
+
+ if(exchange_parts(user, I))
+ return
+
+ if(iscrowbar(I))
+ if(using_irrigation)
+ to_chat(user, "Disconnect the hoses first! ")
+ else if(default_deconstruction_crowbar(I, 1))
+ return
+ else
+ return ..()
+
+/obj/machinery/hydroponics/proc/FindConnected()
+ var/list/connected = list()
+ var/list/processing_atoms = list(src)
+
+ while(processing_atoms.len)
+ var/atom/a = processing_atoms[1]
+ for(var/step_dir in cardinal)
+ var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir)
+ // Soil plots aren't dense
+ if(h && h.using_irrigation && h.density && !(h in connected) && !(h in processing_atoms))
+ processing_atoms += h
+
+ processing_atoms -= a
+ connected += a
+
+ return connected
+
+/obj/machinery/hydroponics/AltClick()
+ if(wrenchable && !usr.stat && !usr.lying && Adjacent(usr))
+ toggle_lid(usr)
+ return
+ return ..()
+
+/obj/machinery/hydroponics/proc/toggle_lid(mob/living/user)
+ if(!user || user.stat || user.restrained())
+ return
+
+ lid_state = !lid_state
+ to_chat(user, "You [lid_state ? "close" : "open"] the tray's lid. ")
+ update_icon()
+
+
+/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
+ if(!myseed)
+ return ..()
+ if(istype(Proj ,/obj/item/projectile/energy/floramut))
+ mutate()
+ else if(istype(Proj ,/obj/item/projectile/energy/florayield))
+ return myseed.bullet_act(Proj)
+ else
+ return ..()
+
+/obj/machinery/hydroponics/process()
+ var/needs_update = 0 // Checks if the icon needs updating so we don't redraw empty trays every time
+
+ if(myseed && (myseed.loc != src))
+ myseed.forceMove(src)
+
+ if(self_sustaining)
+ adjustNutri(1)
+ adjustWater(rand(3,5))
+ adjustWeeds(-2)
+ adjustPests(-2)
+ adjustToxic(-2)
+
+ if(world.time > (lastcycle + cycledelay))
+ lastcycle = world.time
+ if(myseed && !dead)
+ // Advance age
+ current_cycle++
+ if(current_cycle == HYDRO_CYCLES_PER_AGE)
+ age++
+ current_cycle = 0
+ if(age < myseed.maturation)
+ lastproduce = age
+
+ needs_update = 1
+
+//Nutrients//////////////////////////////////////////////////////////////
+ // Nutrients deplete slowly
+ if(prob(50))
+ adjustNutri(-1 / rating)
+
+ // Lack of nutrients hurts non-weeds
+ if(nutrilevel <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
+ adjustHealth(-rand(1,3))
+
+//Photosynthesis/////////////////////////////////////////////////////////
+ // Lack of light hurts non-mushrooms
+ if(isturf(loc))
+ var/turf/currentTurf = loc
+ var/lightAmt = currentTurf.get_lumcount() * 10
+ if(myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ if(lightAmt < 2)
+ adjustHealth(-1 / rating)
+ else // Non-mushroom
+ if(lightAmt < 4)
+ adjustHealth(-2 / rating)
+
+//Water//////////////////////////////////////////////////////////////////
+ // Drink random amount of water
+ adjustWater(-rand(1,6) / rating)
+
+ // If the plant is dry, it loses health pretty fast, unless mushroom
+ if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ adjustHealth(-rand(0,1) / rating)
+ if(waterlevel <= 0)
+ adjustHealth(-rand(0,2) / rating)
+
+ // Sufficient water level and nutrient level = plant healthy but also spawns weeds
+ else if(waterlevel > 10 && nutrilevel > 0)
+ adjustHealth(rand(1,2) / rating)
+ if(myseed && prob(myseed.weed_chance))
+ adjustWeeds(myseed.weed_rate)
+ else if(prob(5)) //5 percent chance the weed population will increase
+ adjustWeeds(1 / rating)
+
+//Toxins/////////////////////////////////////////////////////////////////
+
+ // Too much toxins cause harm, but when the plant drinks the contaiminated water, the toxins disappear slowly
+ if(toxic >= 40 && toxic < 80)
+ adjustHealth(-1 / rating)
+ adjustToxic(-rand(1,10) / rating)
+ else if(toxic >= 80) // I don't think it ever gets here tbh unless above is commented out
+ adjustHealth(-3)
+ adjustToxic(-rand(1,10) / rating)
+
+//Pests & Weeds//////////////////////////////////////////////////////////
+
+ else if(pestlevel >= 5)
+ adjustHealth(-1 / rating)
+
+ // If it's a weed, it doesn't stunt the growth
+ if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
+ adjustHealth(-1 / rating)
+
+//Health & Age///////////////////////////////////////////////////////////
+
+ // Plant dies if plant_health <= 0
+ if(plant_health <= 0)
+ plantdies()
+ adjustWeeds(1 / rating) // Weeds flourish
+
+ // If the plant is too old, lose health fast
+ if(age > myseed.lifespan)
+ adjustHealth(-rand(1,5) / rating)
+
+ // Harvest code
+ if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead))
+ nutrimentMutation()
+ if(myseed && myseed.yield != -1) // Unharvestable shouldn't be harvested
+ harvest = 1
+ plant_hud_set_status()
+ else
+ lastproduce = age
+ if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase
+ adjustPests(1 / rating)
+ else
+ if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10%
+ adjustWeeds(1 / rating)
+
+ // Weeeeeeeeeeeeeeedddssss
+ if(weedlevel >= 10 && prob(50)) // At this point the plant is kind of fucked. Weeds can overtake the plant spot.
+ if(myseed)
+ if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy) && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) // If a normal plant
+ weedinvasion()
+ else
+ weedinvasion() // Weed invasion into empty tray
+ needs_update = 1
+ if (needs_update)
+ update_icon()
+ return
+
+/obj/machinery/hydroponics/proc/nutrimentMutation()
+ if (mutmod == 0)
+ return
+ if (mutmod == 1)
+ if(prob(80)) //80%
+ mutate()
+ else if(prob(75)) //15%
+ hardmutate()
+ return
+ if (mutmod == 2)
+ if(prob(50)) //50%
+ mutate()
+ else if(prob(50)) //25%
+ hardmutate()
+ else if(prob(50)) //12.5%
+ mutatespecie()
+ return
+ return
+
+/obj/machinery/hydroponics/update_icon()
+ //Refreshes the icon and sets the luminosity
+ overlays.Cut()
+
+ if(self_sustaining)
+ if(istype(src, /obj/machinery/hydroponics/soil))
+ color = rgb(255, 175, 0)
+ else
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing")
+ set_light(3)
+
+ if(lid_state)
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "hydrocover")
+
+ update_icon_hoses()
+
+ if(myseed)
+ update_icon_plant()
+ update_icon_lights()
+
+ if(!self_sustaining)
+ if(myseed && myseed.get_gene(/datum/plant_gene/trait/glow))
+ var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
+ set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
+ else
+ set_light(0)
+
+ return
+
+/obj/machinery/hydroponics/proc/update_icon_hoses()
+ var/n = 0
+ for(var/Dir in cardinal)
+ var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir)
+ if(t && t.using_irrigation && using_irrigation)
+ n += Dir
+
+ icon_state = "hoses-[n]"
+
+/obj/machinery/hydroponics/proc/update_icon_plant()
+ var/image/I
+ if(dead)
+ I = image(icon = myseed.growing_icon, icon_state = myseed.icon_dead)
+ else if(harvest)
+ if(!myseed.icon_harvest)
+ I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][myseed.growthstages]")
+ else
+ I = image(icon = myseed.growing_icon, icon_state = myseed.icon_harvest)
+ else
+ var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages)
+ I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][t_growthstate]")
+ I.layer = OBJ_LAYER + 0.01
+ overlays += I
+
+/obj/machinery/hydroponics/proc/update_icon_lights()
+ if(waterlevel <= 10)
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowwater3")
+ if(nutrilevel <= 2)
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lownutri3")
+ if(plant_health <= (myseed.endurance / 2))
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowhealth3")
+ if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40)
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_alert3")
+ if(harvest)
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_harvest3")
+
+
+/obj/machinery/hydroponics/examine(user)
+ ..()
+ if(myseed)
+ to_chat(user, "It has [myseed.plantname] planted. ")
+ if (dead)
+ to_chat(user, "It's dead! ")
+ else if (harvest)
+ to_chat(user, "It's ready to harvest. ")
+ else if (plant_health <= (myseed.endurance / 2))
+ to_chat(user, "It looks unhealthy. ")
+ else
+ to_chat(user, "[src] is empty. ")
+
+ if(!self_sustaining)
+ to_chat(user, "Water: [waterlevel]/[maxwater] ")
+ to_chat(user, "Nutrient: [nutrilevel]/[maxnutri] ")
+ else
+ to_chat(user, "It doesn't require any water or nutrients. ")
+
+ if(weedlevel >= 5)
+ to_chat(user, "[src] is filled with weeds! ")
+ if(pestlevel >= 5)
+ to_chat(user, "[src] is filled with tiny worms! ")
+ to_chat(user, "") // Empty line for readability.
+
+
+/obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens.
+ dead = 0
+ var/oldPlantName
+ if(myseed) // In case there's nothing in the tray beforehand
+ oldPlantName = myseed.plantname
+ qdel(myseed)
+ myseed = null
+ else
+ oldPlantName = "empty tray"
+ switch(rand(1,18)) // randomly pick predominative weed
+ if(16 to 18)
+ myseed = new /obj/item/seeds/reishi(src)
+ if(14 to 15)
+ myseed = new /obj/item/seeds/nettle(src)
+ if(12 to 13)
+ myseed = new /obj/item/seeds/harebell(src)
+ if(10 to 11)
+ myseed = new /obj/item/seeds/amanita(src)
+ if(8 to 9)
+ myseed = new /obj/item/seeds/chanter(src)
+ if(6 to 7)
+ myseed = new /obj/item/seeds/tower(src)
+ if(4 to 5)
+ myseed = new /obj/item/seeds/plump(src)
+ else
+ myseed = new /obj/item/seeds/weeds(src)
+ age = 0
+ plant_health = myseed.endurance
+ lastcycle = world.time
+ harvest = 0
+ adjustWeeds(-10) // Reset
+ adjustPests(-10) // Reset
+ update_icon()
+ plant_hud_set_health()
+ plant_hud_set_status()
+ visible_message("The [oldPlantName] is overtaken by some [myseed.plantname]! ")
+
+
+/obj/machinery/hydroponics/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) // Mutates the current seed
+ if(!myseed)
+ return
+ myseed.mutate(lifemut, endmut, productmut, yieldmut, potmut, wrmut, wcmut, traitmut)
+
+/obj/machinery/hydroponics/proc/hardmutate()
+ mutate(4, 10, 2, 4, 50, 4, 10, 3)
+
+
+/obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant!
+ if(!myseed || dead)
+ return
+
+ var/oldPlantName = myseed.plantname
+ if(myseed.mutatelist.len > 0)
+ var/mutantseed = pick(myseed.mutatelist)
+ qdel(myseed)
+ myseed = null
+ myseed = new mutantseed
+ else
+ return
+
+ hardmutate()
+ age = 0
+ plant_health = myseed.endurance
+ lastcycle = world.time
+ harvest = 0
+ plant_hud_set_health()
+ plant_hud_set_status()
+ adjustWeeds(-10) // Reset
+
+ sleep(5) // Wait a while
+ update_icon()
+ visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]! ")
+
+
+/obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant
+ if( weedlevel > 5 )
+ if(myseed)
+ qdel(myseed)
+ myseed = null
+ var/newWeed = pick(/obj/item/seeds/liberty, /obj/item/seeds/angel, /obj/item/seeds/nettle/death, /obj/item/seeds/kudzu)
+ myseed = new newWeed
+ dead = 0
+ hardmutate()
+ age = 0
+ plant_health = myseed.endurance
+ lastcycle = world.time
+ harvest = 0
+ plant_hud_set_health()
+ plant_hud_set_status()
+ adjustWeeds(-10) // Reset
+
+ sleep(5) // Wait a while
+ update_icon()
+ visible_message("The mutated weeds in [src] spawn some [myseed.plantname]! ")
+ else
+ to_chat(usr, "The few weeds in [src] seem to react, but only for a moment... ")
+
+
+/obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier
+ plant_health = 0
+ harvest = 0
+ adjustPests(-10) // Pests die
+ if(!dead)
+ update_icon()
+ dead = 1
+ plant_hud_set_health()
+ plant_hud_set_status()
+
+
+
+/obj/machinery/hydroponics/proc/mutatepest(mob/user)
+ if(pestlevel > 5)
+ message_admins("[ADMIN_LOOKUPFLW(user)] caused spiderling pests to spawn in a hydro tray")
+ log_game("[key_name(user)] caused spiderling pests to spawn in a hydro tray")
+ visible_message("The pests seem to behave oddly... ")
+ for(var/i in 1 to 3)
+ var/obj/structure/spider/spiderling/S = new(get_turf(src))
+ S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter
+ else
+ to_chat(user, "The pests seem to behave oddly, but quickly settle down... ")
+
+/obj/machinery/hydroponics/proc/applyChemicals(datum/reagents/S, mob/user)
+ if(myseed)
+ myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
+
+ // Requires 5 mutagen to possibly change species.// Poor man's mutagen.
+ if(S.has_reagent("mutagen", 5) || S.has_reagent("radium", 10) || S.has_reagent("uranium", 10))
+ switch(rand(100))
+ if(91 to 100)
+ adjustHealth(-10)
+ to_chat(user, "The plant shrivels and burns. ")
+ if(81 to 90)
+ mutatespecie()
+ if(66 to 80)
+ hardmutate()
+ if(41 to 65)
+ mutate()
+ if(21 to 41)
+ to_chat(user, "The plants don't seem to react... ")
+ if(11 to 20)
+ mutateweed()
+ if(1 to 10)
+ mutatepest(user)
+ else
+ to_chat(user, "Nothing happens... ")
+
+ // 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen
+ else if(S.has_reagent("mutagen", 2) || S.has_reagent("radium", 5) || S.has_reagent("uranium", 5))
+ hardmutate()
+ else if(S.has_reagent("mutagen", 1) || S.has_reagent("radium", 2) || S.has_reagent("uranium", 2))
+ mutate()
+
+ // After handling the mutating, we now handle the damage from adding crude radioactives...
+ if(S.has_reagent("uranium", 1))
+ adjustHealth(-round(S.get_reagent_amount("uranium") * 1))
+ adjustToxic(round(S.get_reagent_amount("uranium") * 2))
+ if(S.has_reagent("radium", 1))
+ adjustHealth(-round(S.get_reagent_amount("radium") * 1))
+ adjustToxic(round(S.get_reagent_amount("radium") * 3)) // Radium is harsher (OOC: also easier to produce)
+
+ // Nutriments
+ if(S.has_reagent("eznutriment", 1))
+ yieldmod = 1
+ mutmod = 1
+ adjustNutri(round(S.get_reagent_amount("eznutriment") * 1))
+
+ if(S.has_reagent("left4zednutriment", 1))
+ yieldmod = 0
+ mutmod = 2
+ adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1))
+
+ if(S.has_reagent("robustharvestnutriment", 1))
+ yieldmod = 1.3
+ mutmod = 0
+ adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 ))
+
+
+ //Fish Water is both an excellent fertilizer and waters
+ if(S.has_reagent("fishwater", 1))
+ adjustNutri(round(S.get_reagent_amount("fishwater") * 0.75))
+ adjustWater(round(S.get_reagent_amount("fishwater") * 1))
+
+ // Antitoxin binds shit pretty well. So the tox goes significantly down
+ if(S.has_reagent("charcoal", 1))
+ adjustToxic(-round(S.get_reagent_amount("charcoal") * 2))
+
+ // NIGGA, YOU JUST WENT ON FULL RETARD.
+ if(S.has_reagent("toxin", 1))
+ adjustToxic(round(S.get_reagent_amount("toxin") * 2))
+
+ // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now...
+ if(S.has_reagent("milk", 1))
+ adjustNutri(round(S.get_reagent_amount("milk") * 0.1))
+ adjustWater(round(S.get_reagent_amount("milk") * 0.9))
+
+ // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay?
+ if(S.has_reagent("beer", 1))
+ adjustHealth(-round(S.get_reagent_amount("beer") * 0.05))
+ adjustNutri(round(S.get_reagent_amount("beer") * 0.25))
+ adjustWater(round(S.get_reagent_amount("beer") * 0.7))
+
+ // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial
+ if(S.has_reagent("fluorine", 1))
+ adjustHealth(-round(S.get_reagent_amount("fluorine") * 2))
+ adjustToxic(round(S.get_reagent_amount("flourine") * 2.5))
+ adjustWater(-round(S.get_reagent_amount("flourine") * 0.5))
+ adjustWeeds(-rand(1,4))
+
+ // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial
+ if(S.has_reagent("chlorine", 1))
+ adjustHealth(-round(S.get_reagent_amount("chlorine") * 1))
+ adjustToxic(round(S.get_reagent_amount("chlorine") * 1.5))
+ adjustWater(-round(S.get_reagent_amount("chlorine") * 0.5))
+ adjustWeeds(-rand(1,3))
+
+ // White Phosphorous + water -> phosphoric acid. That's not a good thing really.
+ // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much.
+ if(S.has_reagent("phosphorus", 1))
+ adjustHealth(-round(S.get_reagent_amount("phosphorus") * 0.75))
+ adjustNutri(round(S.get_reagent_amount("phosphorus") * 0.1))
+ adjustWater(-round(S.get_reagent_amount("phosphorus") * 0.5))
+ adjustWeeds(-rand(1,2))
+
+ // Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though...
+ if(S.has_reagent("sugar", 1))
+ adjustWeeds(rand(1,2))
+ adjustPests(rand(1,2))
+ adjustNutri(round(S.get_reagent_amount("sugar") * 0.1))
+
+ // It is water!
+ if(S.has_reagent("water", 1))
+ adjustWater(round(S.get_reagent_amount("water") * 1))
+
+ // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~
+ if(S.has_reagent("holywater", 1))
+ adjustWater(round(S.get_reagent_amount("holywater") * 1))
+ adjustHealth(round(S.get_reagent_amount("holywater") * 0.1))
+
+ // A variety of nutrients are dissolved in club soda, without sugar.
+ // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth.
+ if(S.has_reagent("sodawater", 1))
+ adjustWater(round(S.get_reagent_amount("sodawater") * 1))
+ adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1))
+ adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1))
+
+ // Man, you guys are retards
+ if(S.has_reagent("sacid", 1))
+ adjustHealth(-round(S.get_reagent_amount("sacid") * 1))
+ adjustToxic(round(S.get_reagent_amount("sacid") * 1.5))
+ adjustWeeds(-rand(1,2))
+
+ // SERIOUSLY
+ if(S.has_reagent("facid", 1))
+ adjustHealth(-round(S.get_reagent_amount("facid") * 2))
+ adjustToxic(round(S.get_reagent_amount("facid") * 3))
+ adjustWeeds(-rand(1,4))
+
+ // Glyphosate is just as bad
+ if(S.has_reagent("glyphosate", 1))
+ adjustHealth(-round(S.get_reagent_amount("glyphosate") * 5))
+ adjustToxic(round(S.get_reagent_amount("glyphosate") * 6))
+ adjustWeeds(-rand(4,8))
+
+ // why, just why
+ if(S.has_reagent("napalm", 1))
+ adjustHealth(-round(S.get_reagent_amount("napalm") * 6))
+ adjustToxic(round(S.get_reagent_amount("napalm") * 7))
+ adjustWeeds(-rand(5,9))
+
+ //Weed Spray
+ if(S.has_reagent("atrazine", 1))
+ adjustToxic(round(S.get_reagent_amount("atrazine") * 0.5))
+ //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts
+ adjustWeeds(-rand(1,2))
+
+ //Pest Spray
+ if(S.has_reagent("pestkiller", 1))
+ adjustToxic(round(S.get_reagent_amount("pestkiller") * 0.5))
+ adjustPests(-rand(1,2))
+
+ // Healing
+ if(S.has_reagent("cryoxadone", 1))
+ adjustHealth(round(S.get_reagent_amount("cryoxadone") * 3))
+ adjustToxic(-round(S.get_reagent_amount("cryoxadone") * 3))
+
+ // Ammonia is bad ass.
+ if(S.has_reagent("ammonia", 1))
+ adjustHealth(round(S.get_reagent_amount("ammonia") * 0.5))
+ adjustNutri(round(S.get_reagent_amount("ammonia") * 1))
+ if(myseed)
+ myseed.adjust_yield(round(S.get_reagent_amount("ammonia") * 0.01))
+
+ // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants
+ if(S.has_reagent("saltpetre", 1))
+ var/salt = S.get_reagent_amount("saltpetre")
+ adjustHealth(round(salt * 0.25))
+ if (myseed)
+ myseed.adjust_production(-round(salt/100)-prob(salt%100))
+ myseed.adjust_potency(round(salt*0.50))
+ // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer
+ if(S.has_reagent("ash", 1))
+ adjustHealth(round(S.get_reagent_amount("ash") * 0.25))
+ adjustNutri(round(S.get_reagent_amount("ash") * 0.5))
+ adjustWeeds(-1)
+
+ // This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant.
+ if(S.has_reagent("diethylamine", 1))
+ adjustHealth(round(S.get_reagent_amount("diethylamine") * 1))
+ adjustNutri(round(S.get_reagent_amount("diethylamine") * 2))
+ if(myseed)
+ myseed.adjust_yield(round(S.get_reagent_amount("diethylamine") * 0.02))
+ adjustPests(-rand(1,2))
+
+ // Compost, effectively
+ if(S.has_reagent("nutriment", 1))
+ adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5))
+ adjustNutri(round(S.get_reagent_amount("nutriment") * 1))
+
+ if(S.has_reagent("plantmatter", 1))
+ adjustHealth(round(S.get_reagent_amount("plantmatter") * 0.5))
+ adjustNutri(round(S.get_reagent_amount("plantmatter") * 1))
+
+ // Compost for EVERYTHING
+ if(S.has_reagent("virusfood", 1))
+ adjustNutri(round(S.get_reagent_amount("virusfood") * 0.5))
+ adjustHealth(-round(S.get_reagent_amount("virusfood") * 0.5))
+
+ // FEED ME
+ if(S.has_reagent("blood", 1))
+ adjustNutri(round(S.get_reagent_amount("blood") * 1))
+ adjustPests(rand(2,4))
+
+ // FEED ME SEYMOUR
+ if(S.has_reagent("strangereagent", 1))
+ spawnplant()
+
+ // The best stuff there is. For testing/debugging.
+ if(S.has_reagent("adminordrazine", 1))
+ adjustWater(round(S.get_reagent_amount("adminordrazine") * 1))
+ adjustHealth(round(S.get_reagent_amount("adminordrazine") * 1))
+ adjustNutri(round(S.get_reagent_amount("adminordrazine") * 1))
+ adjustPests(-rand(1,5))
+ adjustWeeds(-rand(1,5))
+ if(S.has_reagent("adminordrazine", 5))
+ switch(rand(100))
+ if(66 to 100)
+ mutatespecie()
+ if(33 to 65)
+ mutateweed()
+ if(1 to 32)
+ mutatepest(user)
+ else
+ to_chat(user, "Nothing happens... ")
+
+/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params)
+ //Called when mob user "attacks" it with object O
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks
+ if(self_sustaining)
+ to_chat(user, "This [name] is already self-sustaining! ")
+ return
+ if(myseed || weedlevel)
+ to_chat(user, "[src] needs to be clear of plants and weeds! ")
+ return
+ if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user)
+ return
+ if(!O || qdeleted(O))
+ return
+ if(!Adjacent(user))
+ return
+ if(self_sustaining)
+ to_chat(user, "This [name] is already self-sustaining! ")
+ return
+ if(myseed || weedlevel)
+ to_chat(user, "[src] needs to be clear of plants and weeds! ")
+ return
+ user.visible_message("[user] gently pulls open the soil for [O] and places it inside. ", "You tenderly root [O] into [src]. ")
+ user.drop_item()
+ qdel(O)
+ visible_message("[src] begins to glow with a beautiful light! ")
+ self_sustaining = TRUE
+ update_icon()
+
+ else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
+ var/obj/item/weapon/reagent_containers/reagent_source = O
+
+ if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe))
+ var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source
+ if(syr.mode != 1)
+ to_chat(user, "You can't get any extract out of this plant. ") //That. Gives me an idea...
+ return
+
+ if(!reagent_source.reagents.total_volume)
+ to_chat(user, "[reagent_source] is empty. ")
+ return 1
+
+ var/list/trays = list(src)//makes the list just this in cases of syringes and compost etc
+ var/target = myseed ? myseed.plantname : src
+ var/visi_msg = ""
+ var/irrigate = 0 //How am I supposed to irrigate pill contents?
+
+ if(istype(reagent_source, /obj/item/weapon/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/weapon/reagent_containers/food/pill))
+ visi_msg="[user] composts [reagent_source], spreading it through [target]"
+ else
+ if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe/))
+ var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source
+ visi_msg="[user] injects [target] with [syr]"
+ if(syr.reagents.total_volume <= syr.amount_per_transfer_from_this)
+ syr.mode = 0
+ else if(istype(reagent_source, /obj/item/weapon/reagent_containers/spray/))
+ visi_msg="[user] sprays [target] with [reagent_source]"
+ playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
+ irrigate = 1
+ else if(reagent_source.amount_per_transfer_from_this) // Droppers, cans, beakers, what have you.
+ visi_msg="[user] uses [reagent_source] on [target]"
+ irrigate = 1
+ // Beakers, bottles, buckets, etc. Can't use is_open_container though.
+ if(istype(reagent_source, /obj/item/weapon/reagent_containers/glass/))
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+
+ if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
+ trays = FindConnected()
+ if (trays.len > 1)
+ visi_msg += ", setting off the irrigation system"
+
+ if(visi_msg)
+ visible_message("[visi_msg]. ")
+
+ var/split = round(reagent_source.amount_per_transfer_from_this/trays.len)
+
+ for(var/obj/machinery/hydroponics/H in trays)
+ //cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener
+
+ var/datum/reagents/S = new /datum/reagents() //This is a strange way, but I don't know of a better one so I can't fix it at the moment...
+ S.my_atom = H
+
+ reagent_source.reagents.trans_to(S,split)
+ if(istype(reagent_source, /obj/item/weapon/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/weapon/reagent_containers/food/pill))
+ qdel(reagent_source)
+
+ H.applyChemicals(S, user)
+
+ S.clear_reagents()
+ qdel(S)
+ H.update_icon()
+ if(reagent_source) // If the source wasn't composted and destroyed
+ reagent_source.update_icon()
+ return 1
+
+ else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample))
+ if(!myseed)
+ if(istype(O, /obj/item/seeds/kudzu))
+ investigate_log("had Kudzu planted in it by [user.ckey]([user]) at ([x],[y],[z])","kudzu")
+ user.unEquip(O)
+ to_chat(user, "You plant [O]. ")
+ dead = 0
+ myseed = O
+ age = 1
+ plant_health = myseed.endurance
+ plant_hud_set_health()
+ plant_hud_set_status()
+ lastcycle = world.time
+ O.forceMove(src)
+ update_icon()
+ else
+ to_chat(user, "[src] already has seeds in it! ")
+
+ else if(istype(O, /obj/item/device/plant_analyzer))
+ if(myseed)
+ to_chat(user, "*** [myseed.plantname] ***") //Carn: now reports the plants growing, not the seeds.
+ to_chat(user, "- Plant Age: [age] ")
+ var/list/text_string = myseed.get_analyzer_text()
+ if(text_string)
+ to_chat(user, text_string)
+ else
+ to_chat(user, "No plant found. ")
+ to_chat(user, "- Weed level: [weedlevel] / 10 ")
+ to_chat(user, "- Pest level: [pestlevel] / 10 ")
+ to_chat(user, "- Toxicity level: [toxic] / 100 ")
+ to_chat(user, "- Water level: [waterlevel] / [maxwater] ")
+ to_chat(user, "- Nutrition level: [nutrilevel] / [maxnutri] ")
+ to_chat(user, "")
+
+ else if(istype(O, /obj/item/weapon/cultivator))
+ if(weedlevel > 0)
+ user.visible_message("[user] uproots the weeds.", "You remove the weeds from [src]. ")
+ adjustWeeds(-10)
+ update_icon()
+ else
+ to_chat(user, "This plot is completely devoid of weeds! It doesn't need uprooting. ")
+
+ else if(istype(O, /obj/item/weapon/storage/bag/plants))
+ attack_hand(user)
+ var/obj/item/weapon/storage/bag/plants/S = O
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
+ if(!S.can_be_inserted(G))
+ return
+ S.handle_item_insertion(G, 1)
+
+ else if(iswrench(O) && wrenchable)
+ if(using_irrigation)
+ to_chat(user, "Disconnect the hoses first! ")
+ return
+
+ if(!anchored && !isinspace())
+ user.visible_message("[user] begins to wrench [src] into place.", "You begin to wrench [src] in place... ")
+ playsound(loc, O.usesound, 50, 1)
+ if (do_after(user, 20 * O.toolspeed, target = src))
+ if(anchored)
+ return
+ anchored = 1
+ user.visible_message("[user] wrenches [src] into place.", \
+ "You wrench [src] in place. ")
+ else if(anchored)
+ user.visible_message("[user] begins to unwrench [src].", \
+ "You begin to unwrench [src]... ")
+ playsound(loc, O.usesound, 50, 1)
+ if (do_after(user, 20 * O.toolspeed, target = src))
+ if(!anchored)
+ return
+ anchored = 0
+ user.visible_message("[user] unwrenches [src].", \
+ "You unwrench [src]. ")
+
+ else if(iswirecutter(O) && wrenchable)
+ using_irrigation = !using_irrigation
+ playsound(src, O.usesound, 50, 1)
+ user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses. ", \
+ "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses. ")
+ for(var/obj/machinery/hydroponics/h in range(1,src))
+ h.update_icon()
+
+ else if(istype(O, /obj/item/weapon/shovel/spade))
+ if(!myseed && !weedlevel)
+ to_chat(user, "[src] doesn't have any plants or weeds! ")
+ return
+ user.visible_message("[user] starts digging out [src]'s plants... ", "You start digging out [src]'s plants... ")
+ playsound(src, O.usesound, 50, 1)
+ if(!do_after(user, 25 * O.toolspeed, target = src) || (!myseed && !weedlevel))
+ return
+ user.visible_message("[user] digs out the plants in [src]! ", "You dig out all of [src]'s plants! ")
+ playsound(src, O.usesound, 50, 1)
+ if(myseed) //Could be that they're just using it as a de-weeder
+ age = 0
+ plant_health = 0
+ if(harvest)
+ harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it
+ qdel(myseed)
+ myseed = null
+ plant_hud_set_health()
+ plant_hud_set_status()
+ adjustWeeds(-10) //Has a side effect of cleaning up those nasty weeds
+ update_icon()
+
+ else
+ return ..()
+
+/obj/machinery/hydroponics/attack_hand(mob/user)
+ if(issilicon(user)) //How does AI know what plant is?
+ return
+ if(lid_state)
+ to_chat(user, "You can't reach the plant through the cover. ")
+ return
+ if(harvest)
+ myseed.harvest(user)
+ else if(dead)
+ dead = 0
+ to_chat(user, "You remove the dead plant from [src]. ")
+ qdel(myseed)
+ myseed = null
+ update_icon()
+ plant_hud_set_status()
+ plant_hud_set_health()
+ else
+ examine(user)
+
+/obj/machinery/hydroponics/proc/update_tray(mob/user = usr)
+ harvest = 0
+ lastproduce = age
+ if(istype(myseed,/obj/item/seeds/replicapod))
+ to_chat(user, "You harvest from the [myseed.plantname]. ")
+ else if(myseed.getYield() <= 0)
+ to_chat(user, "You fail to harvest anything useful! ")
+ else
+ to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname]. ")
+ if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
+ qdel(myseed)
+ myseed = null
+ dead = 0
+ plant_hud_set_status()
+ plant_hud_set_health()
+ update_icon()
+
+/// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds.///
+/obj/machinery/hydroponics/proc/adjustNutri(adjustamt)
+ nutrilevel = Clamp(nutrilevel + adjustamt, 0, maxnutri)
+ plant_hud_set_nutrient()
+
+/obj/machinery/hydroponics/proc/adjustWater(adjustamt)
+ waterlevel = Clamp(waterlevel + adjustamt, 0, maxwater)
+ plant_hud_set_water()
+ if(adjustamt>0)
+ adjustToxic(-round(adjustamt/4))//Toxicity dilutation code. The more water you put in, the lesser the toxin concentration.
+
+/obj/machinery/hydroponics/proc/adjustHealth(adjustamt)
+ if(myseed && !dead)
+ plant_health = Clamp(plant_health + adjustamt, 0, myseed.endurance)
+ plant_hud_set_health()
+
+/obj/machinery/hydroponics/proc/adjustToxic(adjustamt)
+ toxic = Clamp(toxic + adjustamt, 0, 100)
+ plant_hud_set_toxin()
+
+/obj/machinery/hydroponics/proc/adjustPests(adjustamt)
+ pestlevel = Clamp(pestlevel + adjustamt, 0, 10)
+ plant_hud_set_pest()
+
+/obj/machinery/hydroponics/proc/adjustWeeds(adjustamt)
+ weedlevel = Clamp(weedlevel + adjustamt, 0, 10)
+ plant_hud_set_weed()
+
+/obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood
+ var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato)
+ var/chosen = pick(livingplants)
+ var/mob/living/simple_animal/hostile/C = new chosen
+ C.faction = list("plants")
+
+///Diona Nymph Related Procs///
+/obj/machinery/hydroponics/CanPass(atom/movable/mover, turf/target, height=0) //So nymphs can climb over top of trays.
+ if(height==0)
+ return 1
+
+ if(istype(mover) && mover.checkpass(PASSTABLE))
+ return 1
+ else
+ return ..()
+
+/obj/machinery/hydroponics/attack_animal(mob/living/user)
+ if(istype(user, /mob/living/simple_animal/diona))
+ if(weedlevel > 0)
+ user.nutrition += weedlevel * 15
+ adjustWeeds(-10)
+ update_icon()
+ visible_message("[user] begins rooting through [src], ripping out weeds and eating them noisily. ","You begin rooting through [src], ripping out weeds and eating them noisily. ")
+ else if(nutrilevel < 10)
+ user.nutrition -= ((10 - nutrilevel) * 5)
+ adjustNutri(10)
+ update_icon()
+ visible_message("[user] secretes a trickle of green liquid from its tail, refilling [src]'s nutrient tray. ","You secrete a trickle of green liquid from your tail, refilling [src]'s nutrient tray. ")
+ else
+ ..()
+
+///////////////////////////////////////////////////////////////////////////////
+/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk!
+ name = "soil"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "soil"
+ density = 0
+ use_power = 0
+ wrenchable = 0
+
+/obj/machinery/hydroponics/soil/update_icon_hoses()
+ return // Has no hoses
+
+/obj/machinery/hydroponics/soil/update_icon_lights()
+ return // Has no lights
+
+/obj/machinery/hydroponics/soil/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/weapon/shovel) && !istype(O, /obj/item/weapon/shovel/spade)) //Doesn't include spades because of uprooting plants
+ to_chat(user, "You clear up [src]! ")
+ qdel(src)
+ else
+ ..()
+
+#undef HYDRO_CYCLES_PER_AGE
\ No newline at end of file
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
new file mode 100644
index 00000000000..cfda1499555
--- /dev/null
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -0,0 +1,425 @@
+/datum/plant_gene
+ var/name
+
+/datum/plant_gene/proc/get_name() // Used for manipulator display and gene disk name.
+ return name
+
+/datum/plant_gene/proc/can_add(obj/item/seeds/S)
+ return !istype(S, /obj/item/seeds/sample) // Samples can't accept new genes
+
+/datum/plant_gene/proc/Copy()
+ return new type
+
+
+
+
+// Core plant genes store 5 main variables: lifespan, endurance, production, yield, potency
+/datum/plant_gene/core
+ var/value
+
+/datum/plant_gene/core/get_name()
+ return "[name] [value]"
+
+/datum/plant_gene/core/proc/apply_stat(obj/item/seeds/S)
+ return
+
+/datum/plant_gene/core/New(var/i = null)
+ ..()
+ if(!isnull(i))
+ value = i
+
+/datum/plant_gene/core/Copy()
+ var/datum/plant_gene/core/C = ..()
+ C.value = value
+ return C
+
+/datum/plant_gene/core/can_add(obj/item/seeds/S)
+ if(!..())
+ return FALSE
+ return S.get_gene(type)
+
+/datum/plant_gene/core/lifespan
+ name = "Lifespan"
+ value = 25
+
+/datum/plant_gene/core/lifespan/apply_stat(obj/item/seeds/S)
+ S.lifespan = value
+
+
+/datum/plant_gene/core/endurance
+ name = "Endurance"
+ value = 15
+
+/datum/plant_gene/core/endurance/apply_stat(obj/item/seeds/S)
+ S.endurance = value
+
+
+/datum/plant_gene/core/production
+ name = "Production Speed"
+ value = 6
+
+/datum/plant_gene/core/production/apply_stat(obj/item/seeds/S)
+ S.production = value
+
+
+/datum/plant_gene/core/yield
+ name = "Yield"
+ value = 3
+
+/datum/plant_gene/core/yield/apply_stat(obj/item/seeds/S)
+ S.yield = value
+
+
+/datum/plant_gene/core/potency
+ name = "Potency"
+ value = 10
+
+/datum/plant_gene/core/potency/apply_stat(obj/item/seeds/S)
+ S.potency = value
+
+
+/datum/plant_gene/core/weed_rate
+ name = "Weed Growth Rate"
+ value = 1
+
+/datum/plant_gene/core/weed_rate/apply_stat(obj/item/seeds/S)
+ S.weed_rate = value
+
+
+/datum/plant_gene/core/weed_chance
+ name = "Weed Vulnerability"
+ value = 5
+
+/datum/plant_gene/core/weed_chance/apply_stat(obj/item/seeds/S)
+ S.weed_chance = value
+
+
+// Reagent genes store reagent ID and reagent ratio. Amount of reagent in the plant = 1 + (potency * rate)
+/datum/plant_gene/reagent
+ name = "Nutriment"
+ var/reagent_id = "nutriment"
+ var/rate = 0.04
+
+/datum/plant_gene/reagent/get_name()
+ return "[name] production [rate*100]%"
+
+/datum/plant_gene/reagent/proc/set_reagent(reag_id)
+ reagent_id = reag_id
+ name = "UNKNOWN"
+
+ var/datum/reagent/R = chemical_reagents_list[reag_id]
+ if(R && R.id == reagent_id)
+ name = R.name
+
+/datum/plant_gene/reagent/New(reag_id = null, reag_rate = 0)
+ ..()
+ if(reag_id && reag_rate)
+ set_reagent(reag_id)
+ rate = reag_rate
+
+/datum/plant_gene/reagent/Copy()
+ var/datum/plant_gene/reagent/G = ..()
+ G.name = name
+ G.reagent_id = reagent_id
+ G.rate = rate
+ return G
+
+/datum/plant_gene/reagent/can_add(obj/item/seeds/S)
+ if(!..())
+ return FALSE
+ for(var/datum/plant_gene/reagent/R in S.genes)
+ if(R.reagent_id == reagent_id)
+ return FALSE
+ return TRUE
+
+
+// Various traits affecting the product. Each must be somehow useful.
+/datum/plant_gene/trait
+ var/rate = 0.05
+ var/examine_line = ""
+ var/list/origin_tech = null
+ var/trait_id // must be set and equal for any two traits of the same type
+
+/datum/plant_gene/trait/Copy()
+ var/datum/plant_gene/trait/G = ..()
+ G.rate = rate
+ return G
+
+/datum/plant_gene/trait/can_add(obj/item/seeds/S)
+ if(!..())
+ return FALSE
+
+ for(var/datum/plant_gene/trait/R in S.genes)
+ if(trait_id && R.trait_id == trait_id)
+ return FALSE
+ if(type == R.type)
+ return FALSE
+ return TRUE
+
+/datum/plant_gene/trait/proc/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
+ if(!origin_tech) // This ugly code segment adds RnD tech levels to resulting plants.
+ return
+
+ if(G.origin_tech)
+ var/list/tech = params2list(G.origin_tech)
+ for(var/t in origin_tech)
+ if(t in tech)
+ tech[t] = max(text2num(tech[t]), origin_tech[t])
+ else
+ tech[t] = origin_tech[t]
+ G.origin_tech = list2params(tech)
+ else
+ G.origin_tech = list2params(origin_tech)
+
+/datum/plant_gene/trait/proc/on_consume(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
+ return
+
+/datum/plant_gene/trait/proc/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ return
+
+/datum/plant_gene/trait/proc/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
+ return
+
+/datum/plant_gene/trait/proc/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ return
+
+/datum/plant_gene/trait/proc/on_attackby(obj/item/weapon/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
+ return
+
+/datum/plant_gene/trait/proc/on_throw_impact(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ return
+
+/datum/plant_gene/trait/squash
+ // Allows the plant to be squashed when thrown or slipped on, leaving a colored mess and trash type item behind.
+ // Also splashes everything in target turf with reagents and applies other trait effects (teleporting, etc) to the target by on_squash.
+ // For code, see grown.dm
+ name = "Liquid Contents"
+ examine_line = "It has a lot of liquid contents inside. "
+ origin_tech = list("biotech" = 5)
+
+/datum/plant_gene/trait/slip
+ // Makes plant slippery, unless it has a grown-type trash. Then the trash gets slippery.
+ // Applies other trait effects (teleporting, etc) to the target by on_slip.
+ name = "Slippery Skin"
+ rate = 0.1
+ examine_line = "It has a very slippery skin. "
+
+/datum/plant_gene/trait/slip/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ if(iscarbon(target))
+ var/obj/item/seeds/seed = G.seed
+ var/mob/living/carbon/M = target
+
+ var/stun_len = seed.potency * rate * 0.8
+ if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
+ return
+
+ if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
+ stun_len /= 3
+
+ var/stun = min(stun_len, 7)
+ var/weaken = min(stun_len, 7)
+
+ if(M.slip("[G]", stun, weaken))
+ for(var/datum/plant_gene/trait/T in seed.genes)
+ T.on_slip(G, M)
+
+/datum/plant_gene/trait/cell_charge
+ // Cell recharging trait. Charges all mob's power cells to (potency*rate)% mark when eaten.
+ // Generates sparks on squash.
+ // Small (potency*rate*5) chance to shock squish or slip target for (potency*rate*5) damage.
+ // Multiplies max charge by (rate*1000) when used in potato power cells.
+ name = "Electrical Activity"
+ rate = 0.2
+ origin_tech = list("powerstorage" = 5)
+
+/datum/plant_gene/trait/cell_charge/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
+ var/power = G.seed.potency*rate
+ if(prob(power))
+ C.electrocute_act(round(power), G, 1, 1)
+
+/datum/plant_gene/trait/cell_charge/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ var/power = G.seed.potency*rate
+ if(prob(power))
+ C.electrocute_act(round(power), G, 1, 1)
+
+/datum/plant_gene/trait/cell_charge/on_consume(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
+ if(!G.reagents.total_volume)
+ var/batteries_recharged = 0
+ for(var/obj/item/weapon/stock_parts/cell/C in target.GetAllContents())
+ var/newcharge = min(G.seed.potency*0.01*C.maxcharge, C.maxcharge)
+ if(C.charge < newcharge)
+ C.charge = newcharge
+ if(isobj(C.loc))
+ var/obj/O = C.loc
+ O.update_icon() //update power meters and such
+ C.update_icon()
+ batteries_recharged = 1
+ if(batteries_recharged)
+ to_chat(target, "Your batteries are recharged! ")
+
+
+
+/datum/plant_gene/trait/glow
+ // Makes plant glow. Makes plant in tray glow too.
+ // Adds 1 + potency*rate light range and potency*(rate + 0.01) light_power to products.
+ name = "Bioluminescence"
+ rate = 0.03
+ examine_line = "It emits a soft glow. "
+ trait_id = "glow"
+ var/glow_color = "#AAD84B"
+
+/datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S)
+ return 1.4 + S.potency*rate
+
+/datum/plant_gene/trait/glow/proc/glow_power(obj/item/seeds/S)
+ return max(S.potency*(rate + 0.01), 0.1)
+
+/datum/plant_gene/trait/glow/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
+ ..()
+ G.set_light(glow_range(G.seed), glow_power(G.seed), glow_color)
+
+/datum/plant_gene/trait/glow/shadow
+ //makes plant emit slightly purple shadows
+ //adds -potency*(rate*0.05) light power to products
+ name = "Shadow Emission"
+ rate = 0.04
+
+/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
+ return -max(S.potency*(rate*0.05), 0.075)
+
+/datum/plant_gene/trait/glow/red
+ name = "Red Electrical Glow"
+ glow_color = LIGHT_COLOR_RED
+
+/datum/plant_gene/trait/glow/berry
+ name = "Strong Bioluminescence"
+ rate = 0.05
+ glow_color = null
+
+/datum/plant_gene/trait/teleport
+ // Makes plant teleport people when squashed or slipped on.
+ // Teleport radius is calculated as max(round(potency*rate), 1)
+ name = "Bluespace Activity"
+ rate = 0.1
+ origin_tech = list("bluespace" = 5)
+
+/datum/plant_gene/trait/teleport/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ if(isliving(target))
+ var/teleport_radius = max(round(G.seed.potency / 10), 1)
+ var/turf/T = get_turf(target)
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
+ do_teleport(target, T, teleport_radius)
+
+/datum/plant_gene/trait/teleport/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
+ var/teleport_radius = max(round(G.seed.potency / 10), 1)
+ var/turf/T = get_turf(C)
+ to_chat(C, "You slip through spacetime! ")
+ do_teleport(C, T, teleport_radius)
+ if(prob(50))
+ do_teleport(G, T, teleport_radius)
+ else
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
+ qdel(G)
+
+
+/datum/plant_gene/trait/noreact
+ // Makes plant reagents not react until squashed.
+ name = "Separated Chemicals"
+
+/datum/plant_gene/trait/noreact/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
+ ..()
+ G.reagents.set_reacting(FALSE)
+
+/datum/plant_gene/trait/noreact/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ if(G && G.reagents)
+ G.reagents.set_reacting(TRUE)
+ G.reagents.handle_reactions()
+
+
+/datum/plant_gene/trait/maxchem
+ // 2x to max reagents volume.
+ name = "Densified Chemicals"
+ rate = 2
+
+/datum/plant_gene/trait/maxchem/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
+ ..()
+ G.reagents.maximum_volume *= rate
+
+/datum/plant_gene/trait/repeated_harvest
+ name = "Perennial Growth"
+
+/datum/plant_gene/trait/repeated_harvest/can_add(obj/item/seeds/S)
+ if(!..())
+ return FALSE
+ if(istype(S, /obj/item/seeds/replicapod))
+ return FALSE
+ return TRUE
+
+/datum/plant_gene/trait/battery
+ name = "Capacitive Cell Production"
+
+/datum/plant_gene/trait/battery/on_attackby(obj/item/weapon/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
+ if(istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = I
+ if(C.use(5))
+ to_chat(user, "You add some cable to [G] and slide it inside the battery encasing. ")
+ var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(user.loc)
+ pocell.icon_state = G.icon_state
+ pocell.maxcharge = G.seed.potency * 20
+
+ // The secret of potato supercells!
+ var/datum/plant_gene/trait/cell_charge/CG = G.seed.get_gene(/datum/plant_gene/trait/cell_charge)
+ if(CG) // 10x charge for deafult cell charge gene - 20 000 with 100 potency.
+ pocell.maxcharge *= CG.rate*1000
+ pocell.charge = pocell.maxcharge
+ pocell.name = "[G] battery"
+ pocell.desc = "A rechargable plant based power cell. This one has a power rating of [pocell.maxcharge], and you should not swallow it."
+
+ if(G.reagents.has_reagent("plasma", 2))
+ pocell.rigged = 1
+
+ qdel(G)
+ else
+ to_chat(user, "You need five lengths of cable to make a [G] battery! ")
+
+
+/datum/plant_gene/trait/stinging
+ name = "Hypodermic Prickles"
+
+/datum/plant_gene/trait/stinging/on_throw_impact(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ if(isliving(target) && G.reagents && G.reagents.total_volume)
+ var/mob/living/L = target
+ if(L.reagents && L.can_inject(null, 0))
+ var/injecting_amount = max(1, G.seed.potency*0.2) // Minimum of 1, max of 20
+ var/fraction = min(injecting_amount/G.reagents.total_volume, 1)
+ G.reagents.reaction(L, INGEST, fraction)
+ G.reagents.trans_to(L, injecting_amount)
+ to_chat(target, "You are pricked by [G]! ")
+
+/datum/plant_gene/trait/smoke
+ name = "gaseous decomposition"
+
+/datum/plant_gene/trait/smoke/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
+ var/datum/effect/system/chem_smoke_spread/S = new
+ var/splat_location = get_turf(target)
+ var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1)
+ S.attach(splat_location)
+ S.set_up(G.reagents, 2, 0, splat_location)
+ S.start(smoke_amount)
+ if(G && G.reagents)
+ G.reagents.clear_reagents()
+
+/datum/plant_gene/trait/plant_type // Parent type
+ name = "you shouldn't see this"
+ trait_id = "plant_type"
+
+/datum/plant_gene/trait/plant_type/weed_hardy
+ name = "Weed Adaptation"
+
+/datum/plant_gene/trait/plant_type/fungal_metabolism
+ name = "Fungal Vitality"
+
+/datum/plant_gene/trait/plant_type/alien_properties
+ name ="?????"
diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm
new file mode 100644
index 00000000000..4478671b2fb
--- /dev/null
+++ b/code/modules/hydroponics/sample.dm
@@ -0,0 +1,44 @@
+var/list/chem_t1_reagents = list(
+ "hydrogen", "oxygen", "silicon",
+ "phosphorus", "sulfur", "carbon",
+ "nitrogen", "water"
+)
+
+var/list/chem_t2_reagents = list(
+ "lithium", "copper", "mercury",
+ "sodium", "iodine", "bromine"
+) // "sugar", "sacid" removed because they are already in roundstart plants
+
+var/list/chem_t3_reagents = list(
+ "ethanol", "chlorine", "potassium",
+ "aluminium", "radium", "fluorine",
+ "iron", "welding_fuel", "silver",
+ "stable_plasma"
+)
+
+var/list/chem_t4_reagents = list(
+ "oil", "ash", "acetone",
+ "saltpetre", "ammonia", "diethylamine"
+)
+
+/obj/item/seeds/sample
+ name = "plant sample"
+ icon_state = "sample-empty"
+ potency = -1
+ yield = -1
+ var/sample_color = "#FFFFFF"
+
+/obj/item/seeds/sample/New()
+ ..()
+ if(sample_color)
+ var/image/I = image(icon, icon_state = "sample-filling")
+ I.color = sample_color
+ overlays += I
+
+/obj/item/seeds/sample/get_analyzer_text()
+ return " The DNA of this sample is damaged beyond recovery, it can't support life on it's own.\n*---------*"
+
+/obj/item/seeds/sample/alienweed
+ name = "alien weed sample"
+ icon_state = "alienweed"
+ sample_color = null
\ No newline at end of file
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
deleted file mode 100644
index 4343bc75686..00000000000
--- a/code/modules/hydroponics/seed.dm
+++ /dev/null
@@ -1,839 +0,0 @@
-/datum/plantgene
- var/genetype // Label used when applying trait.
- var/list/values // Values to copy into the target seed datum.
-
-/datum/seed
- //Tracking.
- var/uid // Unique identifier.
- var/name // Index for global list.
- var/seed_name // Plant name for seed packet.
- var/seed_noun = "seeds" // Descriptor for packet.
- var/display_name // Prettier name.
- var/base_name // Unchanging name for use with modified versions
- var/roundstart // If set, seed will not display variety number.
- var/mysterious // Only used for the random seed packets.
- var/can_self_harvest = 0 // Mostly used for living mobs.
- var/growth_stages = 0 // Number of stages the plant passes through before it is mature.
- var/list/traits = list() // Initialized in New()
- var/list/mutants // Possible predefined mutant varieties, if any.
- var/list/chems // Chemicals that plant produces in products/injects into victim.
- var/list/consume_gasses // The plant will absorb these gasses during its life.
- var/list/exude_gasses // The plant will exude these gasses during its life.
- var/kitchen_tag // Used by the reagent grinder.
- var/trash_type // Garbage item produced when eaten.
- var/splat_type = /obj/effect/decal/cleanable/fruit_smudge // Graffiti decal.
- var/preset_product
- var/final_form = 1
- var/last_diverge_type = -1 // Used to check if we need to change our name prefix when we are mutated/modified/enhanced
- var/modular_icon = 0 // Dictates if the product uses a modular sprite. 0 = preset, 1 = modular
- var/preset_icon = "undef" // Name of the iconstate in icon/obj/harvest.dmi to use for preset sprite
- // Make sure to set this to the correct icon if not using a modular sprite
-
-/datum/seed/New()
- base_name = seed_name
- set_trait(TRAIT_IMMUTABLE, 0) // If set, plant will never mutate. If -1, plant is highly mutable.
- set_trait(TRAIT_HARVEST_REPEAT, 0) // If 1, this plant will fruit repeatedly.
- set_trait(TRAIT_PRODUCES_POWER, 0) // Can be used to make a battery.
- set_trait(TRAIT_JUICY, 0) // When thrown, causes a splatter decal.
- set_trait(TRAIT_EXPLOSIVE, 0) // When thrown, acts as a grenade.
- set_trait(TRAIT_CARNIVOROUS, 0) // 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine).
- set_trait(TRAIT_PARASITE, 0) // 0 = no, 1 = gain health from weed level.
- set_trait(TRAIT_STINGS, 0) // Can cause damage/inject reagents when thrown or handled.
- set_trait(TRAIT_YIELD, 0) // Amount of product.
- set_trait(TRAIT_SPREAD, 0) // 0 limits plant to tray, 1 = creepers, 2 = vines.
- set_trait(TRAIT_MATURATION, 0) // Time taken before the plant is mature.
- set_trait(TRAIT_PRODUCTION, 0) // Time before harvesting can be undertaken again.
- set_trait(TRAIT_TELEPORTING, 0) // Uses the bluespace tomato effect.
- set_trait(TRAIT_BATTERY_RECHARGE, 0) // Used for glowcaps; recharges batteries on a user.
- set_trait(TRAIT_BIOLUM, 0) // Plant is bioluminescent.
- set_trait(TRAIT_ALTER_TEMP, 0) // If set, the plant will periodically alter local temp by this amount.
- set_trait(TRAIT_PRODUCT_ICON, 0) // Icon to use for fruit coming from this plant.
- set_trait(TRAIT_PLANT_ICON, 0) // Icon to use for the plant growing in the tray.
- set_trait(TRAIT_PRODUCT_COLOUR, 0) // Colour to apply to product icon.
- set_trait(TRAIT_BIOLUM_COLOUR, 0) // The colour of the plant's radiance.
- set_trait(TRAIT_RARITY, 0) // How rare the plant is. Used for giving points to cargo when shipping off to Centcom.
- set_trait(TRAIT_POTENCY, 1) // General purpose plant strength value.
- set_trait(TRAIT_REQUIRES_NUTRIENTS, 1) // The plant can starve.
- set_trait(TRAIT_REQUIRES_WATER, 1) // The plant can become dehydrated.
- set_trait(TRAIT_WATER_CONSUMPTION, 3) // Plant drinks this much per tick.
- set_trait(TRAIT_LIGHT_TOLERANCE, 5) // Departure from ideal that is survivable.
- set_trait(TRAIT_TOXINS_TOLERANCE, 5) // Resistance to poison.
- set_trait(TRAIT_PEST_TOLERANCE, 5) // Threshold for pests to impact health.
- set_trait(TRAIT_WEED_TOLERANCE, 5) // Threshold for weeds to impact health.
- set_trait(TRAIT_IDEAL_LIGHT, 8) // Preferred light level in luminosity.
- set_trait(TRAIT_HEAT_TOLERANCE, 20) // Departure from ideal that is survivable.
- set_trait(TRAIT_LOWKPA_TOLERANCE, 25) // Low pressure capacity.
- set_trait(TRAIT_ENDURANCE, 100) // Maximum plant HP when growing.
- set_trait(TRAIT_HIGHKPA_TOLERANCE, 200) // High pressure capacity.
- set_trait(TRAIT_IDEAL_HEAT, 293) // Preferred temperature in Kelvin.
- set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) // Plant eats this much per tick.
- set_trait(TRAIT_PLANT_COLOUR, "#46B543") // Colour of the plant icon.
-
- spawn(5)
- sleep(-1)
- update_growth_stages()
-
-/datum/seed/proc/get_trait(var/trait)
- return traits["[trait]"]
-
-/datum/seed/proc/set_trait(var/trait,var/nval,var/ubound,var/lbound, var/degrade)
- if(!isnull(degrade)) nval *= degrade
- if(!isnull(ubound)) nval = min(nval,ubound)
- if(!isnull(lbound)) nval = max(nval,lbound)
- traits["[trait]"] = nval
-
-/datum/seed/proc/create_spores(var/turf/T, var/obj/item/thrown)
- if(!T)
- return
- if(!istype(T))
- T = get_turf(T)
- if(!T)
- return
-
- var/datum/reagents/R = new/datum/reagents(100)
- R.my_atom = thrown
- if(chems.len)
- for(var/rid in chems)
- var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3))
- R.add_reagent(rid,injecting)
-
- var/datum/effect/system/chem_smoke_spread/S = new()
- S.attach(T)
- S.set_up(R, round(get_trait(TRAIT_POTENCY)/4), 0, T)
- S.start()
-
-// Does brute damage to a target.
-/datum/seed/proc/do_thorns(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb)
-
- if(!get_trait(TRAIT_CARNIVOROUS))
- return
-
- if(!istype(target))
- if(istype(target, /mob/living/simple_animal/mouse) || istype(target, /mob/living/simple_animal/lizard))
- new /obj/effect/decal/cleanable/blood/splatter(get_turf(target))
- qdel(target)
- return
-
-
- if(!target_limb) target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")
- var/obj/item/organ/external/affecting = target.get_organ(target_limb)
- var/damage = 0
-
- if(get_trait(TRAIT_CARNIVOROUS))
- if(get_trait(TRAIT_CARNIVOROUS) == 2)
- if(affecting)
- to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily! ")
- else
- to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily! ")
- damage = get_trait(TRAIT_POTENCY)/2
- else
- if(affecting)
- to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]! ")
- else
- to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh! ")
- damage = get_trait(TRAIT_POTENCY)/5
- else
- return
-
- if(affecting)
- affecting.take_damage(damage, 0)
- affecting.add_autopsy_data("Thorns",damage)
- else
- target.adjustBruteLoss(damage)
- target.UpdateDamageIcon()
- target.updatehealth()
-
-// Adds reagents to a target.
-/datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb)
- if(!get_trait(TRAIT_STINGS))
- return
- if(!istype(target))
- return
- if(!target_limb) //if we weren't given a target_limb, pick a random one to try stinging
- target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")
- if(chems && chems.len)
-
- if(!target.can_inject(target, 0, target_limb)) //if a syringe can't get through, neither can the sting
- return
-
- var/protection_needed
- switch(target_limb)
- if("head")
- protection_needed = HEAD | HEADCOVERSMOUTH | HEADCOVERSEYES
- if("chest")
- protection_needed = UPPER_TORSO
- if("groin")
- protection_needed = LOWER_TORSO
- if("l_arm","r_arm")
- protection_needed = ARMS
- if("l_hand","r_hand")
- protection_needed = HANDS
- if("l_leg","r_leg")
- protection_needed = LEGS
- if("l_foot","r_foot")
- protection_needed = FEET
-
- for(var/obj/item/clothing/clothes in target)
-
- if(target.l_hand == clothes|| target.r_hand == clothes)
- continue
- protection_needed &= ~(clothes.body_parts_covered)
- if((clothes.slot_flags & SLOT_HEAD) || (clothes.slot_flags & SLOT_MASK))
- if(clothes.flags & HEADCOVERSEYES)
- protection_needed &= ~(HEADCOVERSEYES)
- if(clothes.flags & HEADCOVERSMOUTH)
- protection_needed &= ~(HEADCOVERSMOUTH)
- if(!protection_needed) //already got the needed protection, save some time and skip the rest of the loop
- break
-
- if(!protection_needed) //properly protected, good job!
- return
-
- to_chat(target, "You are stung by \the [fruit]! ")
- for(var/rid in chems)
- var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5))
- target.reagents.add_reagent(rid,injecting)
-
-//Splatter a turf.
-/datum/seed/proc/splatter(var/turf/T,var/obj/item/thrown)
- if(splat_type)
- var/obj/effect/plant/splat = new splat_type(T, src)
- if(!istype(splat)) // Plants handle their own stuff.
- splat.name = "[thrown.name] [pick("smear","smudge","splatter")]"
- var/clr
- if(get_trait(TRAIT_BIOLUM))
- if(get_trait(TRAIT_BIOLUM_COLOUR))
- clr = get_trait(TRAIT_BIOLUM_COLOUR)
- splat.set_light(get_trait(TRAIT_BIOLUM), l_color = clr)
- if(get_trait(TRAIT_PRODUCT_COLOUR))
- splat.color = get_trait(TRAIT_PRODUCT_COLOUR)
-
- if(chems)
- for(var/mob/living/M in T.contents)
- if(!M.reagents)
- continue
- for(var/chem in chems)
- var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3))
- M.reagents.add_reagent(chem,injecting)
-
-//Applies an effect to a target atom.
-/datum/seed/proc/thrown_at(var/obj/item/thrown,var/atom/target, var/force_explode)
-
- var/splatted
- var/turf/origin_turf = get_turf(target)
-
- if(force_explode || get_trait(TRAIT_EXPLOSIVE))
-
- create_spores(origin_turf, thrown)
-
- var/flood_dist = min(10,max(1,get_trait(TRAIT_POTENCY)/15))
- var/list/open_turfs = list()
- var/list/closed_turfs = list()
- var/list/valid_turfs = list()
- open_turfs |= origin_turf
-
- // Flood fill to get affected turfs.
- while(open_turfs.len)
- var/turf/T = pick(open_turfs)
- open_turfs -= T
- closed_turfs |= T
- valid_turfs |= T
-
- for(var/dir in alldirs)
- var/turf/neighbor = get_step(T,dir)
- if(!neighbor || (neighbor in closed_turfs) || (neighbor in open_turfs))
- continue
- if(neighbor.density || get_dist(neighbor,origin_turf) > flood_dist || istype(neighbor,/turf/space))
- closed_turfs |= neighbor
- continue
- // Check for windows.
- var/no_los
- var/turf/last_turf = origin_turf
- for(var/turf/target_turf in getline(origin_turf,neighbor))
- if(!last_turf.Enter(thrown,target_turf) || target_turf.density)
- no_los = 1
- break
- last_turf = target_turf
- if(!no_los && !origin_turf.Enter(thrown, neighbor))
- no_los = 1
- if(no_los)
- closed_turfs |= neighbor
- continue
- open_turfs |= neighbor
-
- for(var/turf/T in valid_turfs)
- for(var/mob/living/M in T.contents)
- apply_special_effect(M)
- splatter(T,thrown)
- origin_turf.visible_message("The [thrown.name] explodes! ")
- qdel(thrown)
- return
-
- if(istype(target,/mob/living))
- splatted = apply_special_effect(target,thrown)
- else if(istype(target,/turf))
- splatted = 1
- for(var/mob/living/M in target.contents)
- apply_special_effect(M)
-
- if(get_trait(TRAIT_JUICY) && splatted)
- splatter(origin_turf,thrown)
- origin_turf.visible_message("The [thrown.name] splatters against [target]! ")
- qdel(thrown)
-
-/datum/seed/proc/handle_environment(var/turf/current_turf, var/datum/gas_mixture/environment, var/light_supplied, var/obj/item/weapon/tank/holding, var/check_only)
-
- var/health_change = 0
-
- if(!environment) //Someone called this without passing an environment. Punish their plant.
- return -100
-
- // Process it.
- var/pressure
- if(holding) //Check if we are running from an internal source (portable tank)
- //Use the tank's distribution pressure or it's internal pressure (whichever is lower) for pressure checks
- pressure = min(environment.return_pressure(), holding.distribute_pressure)
- else //Not using an internal source
- pressure = environment.return_pressure()
- if(pressure < get_trait(TRAIT_LOWKPA_TOLERANCE)|| pressure > get_trait(TRAIT_HIGHKPA_TOLERANCE))
- health_change += rand(1,3) * HYDRO_SPEED_MULTIPLIER
-
- if(abs(environment.temperature - get_trait(TRAIT_IDEAL_HEAT)) > get_trait(TRAIT_HEAT_TOLERANCE))
- health_change += rand(1,3) * HYDRO_SPEED_MULTIPLIER
-
- // Handle gas consumption.
- if(consume_gasses && consume_gasses.len)
- var/missing_gas = 0
- for(var/gas in consume_gasses)
- if(environment && environment.vars[gas] && environment.vars[gas] >= consume_gasses[gas])
- if(!check_only)
- environment = adjust_gas(environment, gas,-consume_gasses[gas])
- else
- missing_gas++
-
- if(missing_gas > 0)
- health_change += missing_gas * HYDRO_SPEED_MULTIPLIER
-
- // Handle gas production.
- if(exude_gasses && exude_gasses.len && !check_only)
- for(var/gas in exude_gasses)
- environment = adjust_gas(environment, gas, max(1,round((exude_gasses[gas]*(get_trait(TRAIT_POTENCY)/5))/exude_gasses.len)))
-
- //Handle heat adjustment
- if(get_trait(TRAIT_ALTER_TEMP))
- environment.temperature += get_trait(TRAIT_ALTER_TEMP)
- if(environment.temperature < 0) //Make sure we didn't drop below absolute zero
- environment.temperature = 0 //Set temperature back to zero if we did
-
- // Handle light requirements.
- if(!light_supplied)
- var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in current_turf
- if(L)
- light_supplied = L.get_clamped_lum()*10
- else
- light_supplied = 5
-
- if(light_supplied)
- if(abs(light_supplied - get_trait(TRAIT_IDEAL_LIGHT)) > get_trait(TRAIT_LIGHT_TOLERANCE))
- health_change += rand(1,3) * HYDRO_SPEED_MULTIPLIER
-
- return health_change
-
-//Screw it, making a new proc for this for the sake of readability or something. --FalseIncarnate
-/datum/seed/proc/adjust_gas(var/datum/gas_mixture/environment, var/gas, var/amount = 0)
- if(!environment || !gas) //no gas_mixture or gas defined to adjust
- return
-
- var/transfer_moles = environment.total_moles()
- var/datum/gas_mixture/temp_holding
- if(transfer_moles <= 0) //Check if the transfer_moles is an unacceptable value for the remove proc
- //The environment is empty (or somehow has negative moles), create a new gas_mixture for temp_holding
- temp_holding = new /datum/gas_mixture()
- temp_holding.temperature = T20C
- else
- //The environment is acceptable, transfer it's contents into temp_holding
- temp_holding = environment.remove(transfer_moles)
-
- if(!temp_holding) return //Just in case temp_holding has somehow avoided being set
-
- switch(gas)
- if("oxygen")
- temp_holding.oxygen += amount
- if("nitrogen")
- temp_holding.nitrogen += amount
- if("carbon_dioxide")
- temp_holding.carbon_dioxide += amount
- if("toxins")
- temp_holding.toxins += amount
-
- return environment.merge(temp_holding)
-
-/datum/seed/proc/apply_special_effect(var/mob/living/target,var/obj/item/thrown)
-
- var/impact = 1
- do_sting(target,thrown)
- do_thorns(target,thrown)
-
- // Bluespace tomato code copied over from grown.dm.
- if(get_trait(TRAIT_TELEPORTING))
- if(!is_teleport_allowed(target.z))
- return 1
-
- //Plant potency determines radius of teleport.
- var/outer_teleport_radius = get_trait(TRAIT_POTENCY)/5
- var/inner_teleport_radius = get_trait(TRAIT_POTENCY)/15
-
- var/list/turfs = list()
- if(inner_teleport_radius > 0)
- for(var/turf/T in orange(target,outer_teleport_radius))
- if(get_dist(target,T) >= inner_teleport_radius)
- turfs |= T
-
- if(turfs.len)
- // Moves the mob, causes sparks.
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, get_turf(target))
- s.start()
- var/turf/picked = get_turf(pick(turfs)) // Just in case...
- new/obj/effect/decal/cleanable/molten_item(get_turf(target)) // Leave a pile of goo behind for dramatic effect...
- target.loc = picked // And teleport them to the chosen location.
-
- impact = 1
-
- return impact
-
-//Creates a random seed. MAKE SURE THE LINE HAS DIVERGED BEFORE THIS IS CALLED.
-/datum/seed/proc/randomize()
-
- roundstart = 0
- // TODO: Better name generator
- seed_name = "cultivar #[uid]"
- display_name = "strange plants" // TODO: name generator.
- base_name = seed_name
- mysterious = 1
- seed_noun = pick("spores","nodes","cuttings","seeds")
- modular_icon = 1
-
- set_trait(TRAIT_POTENCY,rand(5,30),200,0)
- set_trait(TRAIT_PRODUCT_ICON,pick(plant_controller.plant_product_sprites))
- set_trait(TRAIT_PLANT_ICON,pick(plant_controller.plant_sprites))
- set_trait(TRAIT_PLANT_COLOUR,"#[get_random_colour(0,75,190)]")
- set_trait(TRAIT_PRODUCT_COLOUR,"#[get_random_colour(0,75,190)]")
- update_growth_stages()
-
- if(prob(20))
- set_trait(TRAIT_HARVEST_REPEAT,1)
-
- if(prob(15))
- if(prob(15))
- set_trait(TRAIT_JUICY,2)
- else
- set_trait(TRAIT_JUICY,1)
-
- if(prob(5))
- set_trait(TRAIT_STINGS,1)
-
- if(prob(5))
- set_trait(TRAIT_PRODUCES_POWER,1)
-
- if(prob(1))
- set_trait(TRAIT_EXPLOSIVE,1)
- else if(prob(1))
- set_trait(TRAIT_TELEPORTING,1)
-
- if(prob(5))
- consume_gasses = list()
- var/gas = pick("oxygen","nitrogen","toxins","carbon_dioxide")
- consume_gasses[gas] = rand(3,9)
-
- if(prob(5))
- exude_gasses = list()
- var/gas = pick("oxygen","nitrogen","toxins","carbon_dioxide")
- exude_gasses[gas] = rand(3,9)
-
- chems = list()
- if(prob(80))
- var/nutrient_type = rand(1,7)
- switch(nutrient_type)
- if(1)
- chems["plantmatter"] = list(rand(1,10),rand(10,20))
- if(2)
- chems["nutriment"] = list(rand(1,10),rand(10,20))
- if(3)
- chems["protein"] = list(rand(1,10),rand(10,20))
- if(4)
- chems["plantmatter"] = list(rand(1,5),rand(10,20))
- chems["nutriment"] = list(rand(1,5),rand(10,20))
- if(5)
- chems["plantmatter"] = list(rand(1,5),rand(10,20))
- chems["protein"] = list(rand(1,5),rand(10,20))
- if(6)
- chems["protein"] = list(rand(1,5),rand(10,20))
- chems["nutriment"] = list(rand(1,5),rand(10,20))
- if(7)
- chems["plantmatter"] = list(rand(1,3),rand(10,20))
- chems["nutriment"] = list(rand(1,4),rand(10,20))
- chems["protein"] = list(rand(1,3),rand(10,20))
-
- var/additional_chems = rand(0,5)
-
- if(additional_chems)
- for(var/x=1;x<=additional_chems;x++)
- var/new_chem = get_random_chemical(1)
- if(chems.Find(new_chem))
- chems[new_chem] = list(rand(2,20),rand(5,15)) //DOUBLE UP
- else
- chems[new_chem] = list(rand(1,10),rand(10,20))
-
- if(prob(90))
- set_trait(TRAIT_REQUIRES_NUTRIENTS,1)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION,rand(25)/25)
- else
- set_trait(TRAIT_REQUIRES_NUTRIENTS,0)
-
- if(prob(90))
- set_trait(TRAIT_REQUIRES_WATER,1)
- set_trait(TRAIT_WATER_CONSUMPTION,rand(10))
- else
- set_trait(TRAIT_REQUIRES_WATER,0)
-
- set_trait(TRAIT_IDEAL_HEAT, rand(100,400))
- set_trait(TRAIT_HEAT_TOLERANCE, rand(10,30))
- set_trait(TRAIT_IDEAL_LIGHT, rand(2,10))
- set_trait(TRAIT_LIGHT_TOLERANCE, rand(2,7))
- set_trait(TRAIT_TOXINS_TOLERANCE, rand(2,7))
- set_trait(TRAIT_PEST_TOLERANCE, rand(2,7))
- set_trait(TRAIT_WEED_TOLERANCE, rand(2,7))
- set_trait(TRAIT_LOWKPA_TOLERANCE, rand(10,50))
- set_trait(TRAIT_HIGHKPA_TOLERANCE,rand(100,300))
-
- if(prob(5))
- set_trait(TRAIT_ALTER_TEMP,rand(-5,5))
-
- if(prob(1))
- set_trait(TRAIT_IMMUTABLE,-1)
-
- var/carnivore_prob = rand(100)
- if(carnivore_prob < 5)
- set_trait(TRAIT_CARNIVOROUS,2)
- else if(carnivore_prob < 10)
- set_trait(TRAIT_CARNIVOROUS,1)
-
- if(prob(10))
- set_trait(TRAIT_PARASITE,1)
-
- var/vine_prob = rand(100)
- if(vine_prob < 5)
- set_trait(TRAIT_SPREAD,2)
- else if(vine_prob < 10)
- set_trait(TRAIT_SPREAD,1)
-
- if(prob(5))
- set_trait(TRAIT_BIOLUM,1)
- set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]")
-
- set_trait(TRAIT_ENDURANCE,rand(60,100))
- set_trait(TRAIT_YIELD,rand(3,15))
- set_trait(TRAIT_MATURATION,rand(5,15))
- set_trait(TRAIT_PRODUCTION,get_trait(TRAIT_MATURATION)+rand(2,5))
-
-//Returns a key corresponding to an entry in the global seed list.
-/datum/seed/proc/get_mutant_variant()
- if(!mutants || !mutants.len || get_trait(TRAIT_IMMUTABLE) > 0) return 0
- return pick(mutants)
-
-//Mutates the plant overall (randomly).
-/datum/seed/proc/mutate(var/degree,var/turf/source_turf)
-
- if(!degree || get_trait(TRAIT_IMMUTABLE) > 0) return
-
- source_turf.visible_message("\The [display_name] quivers! ")
-
- //This looks like shit, but it's a lot easier to read/change this way.
- var/total_mutations = rand(1,1+degree)
- for(var/i = 0;i\The [display_name] withers rapidly! ")
- if(1)
- set_trait(TRAIT_NUTRIENT_CONSUMPTION,get_trait(TRAIT_NUTRIENT_CONSUMPTION)+rand(-(degree*0.1),(degree*0.1)),5,0)
- set_trait(TRAIT_WATER_CONSUMPTION, get_trait(TRAIT_WATER_CONSUMPTION) +rand(-degree,degree),50,0)
- set_trait(TRAIT_JUICY, !get_trait(TRAIT_JUICY))
- set_trait(TRAIT_STINGS, !get_trait(TRAIT_STINGS))
- if(2)
- set_trait(TRAIT_IDEAL_HEAT, get_trait(TRAIT_IDEAL_HEAT) + (rand(-5,5)*degree),800,70)
- set_trait(TRAIT_HEAT_TOLERANCE, get_trait(TRAIT_HEAT_TOLERANCE) + (rand(-5,5)*degree),800,70)
- set_trait(TRAIT_LOWKPA_TOLERANCE, get_trait(TRAIT_LOWKPA_TOLERANCE)+ (rand(-5,5)*degree),80,0)
- set_trait(TRAIT_HIGHKPA_TOLERANCE, get_trait(TRAIT_HIGHKPA_TOLERANCE)+(rand(-5,5)*degree),500,110)
- set_trait(TRAIT_EXPLOSIVE,1)
- if(3)
- set_trait(TRAIT_IDEAL_LIGHT, get_trait(TRAIT_IDEAL_LIGHT)+(rand(-1,1)*degree),30,0)
- set_trait(TRAIT_LIGHT_TOLERANCE, get_trait(TRAIT_LIGHT_TOLERANCE)+(rand(-2,2)*degree),10,0)
- if(4)
- set_trait(TRAIT_TOXINS_TOLERANCE, get_trait(TRAIT_TOXINS_TOLERANCE)+(rand(-2,2)*degree),10,0)
- if(5)
- set_trait(TRAIT_WEED_TOLERANCE, get_trait(TRAIT_WEED_TOLERANCE)+(rand(-2,2)*degree),10, 0)
- if(prob(degree*5))
- set_trait(TRAIT_CARNIVOROUS, get_trait(TRAIT_CARNIVOROUS)+rand(-degree,degree),2, 0)
- if(get_trait(TRAIT_CARNIVOROUS))
- source_turf.visible_message("\The [display_name] shudders hungrily. ")
- if(6)
- set_trait(TRAIT_WEED_TOLERANCE, get_trait(TRAIT_WEED_TOLERANCE)+(rand(-2,2)*degree),10, 0)
- if(prob(degree*5))
- set_trait(TRAIT_PARASITE,!get_trait(TRAIT_PARASITE))
- if(7)
- if(get_trait(TRAIT_YIELD) != -1)
- set_trait(TRAIT_YIELD, get_trait(TRAIT_YIELD)+(rand(-2,2)*degree),10,0)
- if(8)
- set_trait(TRAIT_ENDURANCE, get_trait(TRAIT_ENDURANCE)+(rand(-5,5)*degree),100,10)
- set_trait(TRAIT_PRODUCTION, get_trait(TRAIT_PRODUCTION)+(rand(-1,1)*degree),10, 1)
- set_trait(TRAIT_POTENCY, get_trait(TRAIT_POTENCY)+(rand(-20,20)*degree),200, 0)
- if(prob(degree*5))
- set_trait(TRAIT_SPREAD, get_trait(TRAIT_SPREAD)+rand(-1,1),2, 0)
- source_turf.visible_message("\The [display_name] spasms visibly, shifting in the tray. ")
- if(9)
- set_trait(TRAIT_MATURATION, get_trait(TRAIT_MATURATION)+(rand(-1,1)*degree),30, 0)
- if(prob(degree*5))
- set_trait(TRAIT_HARVEST_REPEAT, !get_trait(TRAIT_HARVEST_REPEAT))
- if(10)
- if(prob(degree*2))
- set_trait(TRAIT_BIOLUM, !get_trait(TRAIT_BIOLUM))
- if(get_trait(TRAIT_BIOLUM))
- source_turf.visible_message("\The [display_name] begins to glow! ")
- if(prob(degree*2))
- set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]")
- source_turf.visible_message("\The [display_name]'s glow changes colour !")
- else
- source_turf.visible_message("\The [display_name]'s glow dims... ")
- if(11)
- set_trait(TRAIT_TELEPORTING,1)
-
- return
-
-//Mutates a specific trait/set of traits.
-/datum/seed/proc/apply_gene(var/datum/plantgene/gene)
-
- if(!gene || !gene.values || get_trait(TRAIT_IMMUTABLE) > 0) return
-
- // Splicing products has some detrimental effects on yield and lifespan.
- // We handle this before we do the rest of the looping, as normal traits don't really include lists.
- switch(gene.genetype)
- if(GENE_BIOCHEMISTRY)
- for(var/trait in list(TRAIT_YIELD, TRAIT_ENDURANCE))
- if(get_trait(trait) > 0) set_trait(trait,get_trait(trait),null,1,0.85)
-
- if(!chems) chems = list()
-
- var/list/gene_value = gene.values["[TRAIT_CHEMS]"]
- for(var/rid in gene_value)
-
- var/list/gene_chem = gene_value[rid]
-
- if(!chems[rid])
- chems[rid] = gene_chem.Copy()
- continue
-
- // Normally a length 2 list - but sometimes, it's length 1 - poisonberries, etc.
- // This means the reagent does not scale with potency.
- // Index 1 is the base value, index 2 is the potency per u of reagent
- var/list/rgnt_list = chems[rid]
- rgnt_list.len = max(gene_chem.len, rgnt_list.len)
-
- for(var/i=1;i<=gene_chem.len;i++)
-
- if(isnull(gene_chem[i])) gene_chem[i] = 0
-
- if(rgnt_list[i])
- rgnt_list[i] = max(1,round((gene_chem[i] + rgnt_list[i])/2))
- else
- rgnt_list[i] = gene_chem[i]
-
- var/list/new_gasses = gene.values["[TRAIT_EXUDE_GASSES]"]
- if(islist(new_gasses))
- if(!exude_gasses) exude_gasses = list()
- exude_gasses |= new_gasses
- for(var/gas in exude_gasses)
- exude_gasses[gas] = max(1,round(exude_gasses[gas]*0.8))
-
- gene.values["[TRAIT_EXUDE_GASSES]"] = null
- gene.values["[TRAIT_CHEMS]"] = null
-
- if(GENE_DIET)
- var/list/new_gasses = gene.values["[TRAIT_CONSUME_GASSES]"]
- consume_gasses |= new_gasses
- gene.values["[TRAIT_CONSUME_GASSES]"] = null
- if(GENE_METABOLISM)
- preset_product = gene.values["alt_product"]
- gene.values["alt_product"] = null
-
- for(var/trait in gene.values)
- set_trait(trait,gene.values["[trait]"])
-
- update_growth_stages()
-
-//Returns a list of the desired trait values.
-/datum/seed/proc/get_gene(var/genetype)
-
- if(!genetype) return 0
-
- var/list/traits_to_copy
- var/datum/plantgene/P = new()
- P.genetype = genetype
- P.values = list()
-
- switch(genetype)
- if(GENE_BIOCHEMISTRY)
- P.values["[TRAIT_CHEMS]"] = chems
- P.values["[TRAIT_EXUDE_GASSES]"] = exude_gasses
- traits_to_copy = list(TRAIT_POTENCY)
- if(GENE_OUTPUT)
- traits_to_copy = list(TRAIT_PRODUCES_POWER,TRAIT_BIOLUM,TRAIT_BATTERY_RECHARGE)
- if(GENE_ATMOSPHERE)
- traits_to_copy = list(TRAIT_HEAT_TOLERANCE,TRAIT_LOWKPA_TOLERANCE,TRAIT_HIGHKPA_TOLERANCE)
- if(GENE_HARDINESS)
- traits_to_copy = list(TRAIT_TOXINS_TOLERANCE,TRAIT_PEST_TOLERANCE,TRAIT_WEED_TOLERANCE,TRAIT_ENDURANCE)
- if(GENE_METABOLISM)
- P.values["alt_product"] = preset_product
- traits_to_copy = list(TRAIT_REQUIRES_NUTRIENTS,TRAIT_REQUIRES_WATER,TRAIT_ALTER_TEMP)
- if(GENE_VIGOUR)
- traits_to_copy = list(TRAIT_PRODUCTION,TRAIT_MATURATION,TRAIT_YIELD,TRAIT_SPREAD)
- if(GENE_DIET)
- P.values["[TRAIT_CONSUME_GASSES]"] = consume_gasses
- traits_to_copy = list(TRAIT_CARNIVOROUS,TRAIT_PARASITE,TRAIT_NUTRIENT_CONSUMPTION,TRAIT_WATER_CONSUMPTION)
- if(GENE_ENVIRONMENT)
- traits_to_copy = list(TRAIT_IDEAL_HEAT,TRAIT_IDEAL_LIGHT,TRAIT_LIGHT_TOLERANCE)
- if(GENE_PIGMENT)
- traits_to_copy = list(TRAIT_PLANT_COLOUR,TRAIT_PRODUCT_COLOUR,TRAIT_BIOLUM_COLOUR)
- if(GENE_STRUCTURE)
- traits_to_copy = list(TRAIT_PLANT_ICON,TRAIT_PRODUCT_ICON,TRAIT_HARVEST_REPEAT)
- if(GENE_FRUIT)
- traits_to_copy = list(TRAIT_STINGS,TRAIT_EXPLOSIVE,TRAIT_JUICY)
- if(GENE_SPECIAL)
- traits_to_copy = list(TRAIT_TELEPORTING)
-
- for(var/trait in traits_to_copy)
- P.values["[trait]"] = get_trait(trait)
- return (P ? P : 0)
-
-//Place the plant products at the feet of the user.
-/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample,var/force_amount)
-
- if(!user)
- return
-
- if(!force_amount && get_trait(TRAIT_YIELD) == 0 && !harvest_sample)
- if(istype(user))
- to_chat(user, "You fail to harvest anything useful. ")
- else
- if(istype(user))
- to_chat(user, "You [harvest_sample ? "take a sample" : "harvest"] from the [display_name].")
-
- //This may be a new line. Update the global if it is.
- if(name == "new line" || !(name in plant_controller.seeds))
- uid = plant_controller.seeds.len + 1
- name = "[uid]"
- plant_controller.seeds[name] = src
-
- if(harvest_sample)
- var/obj/item/seeds/seeds = new(get_turf(user))
- seeds.seed_type = name
- seeds.update_seed()
- return
-
- var/total_yield = 0
- if(!isnull(force_amount))
- total_yield = force_amount
- else
- if(get_trait(TRAIT_YIELD) > -1)
- if(isnull(yield_mod) || yield_mod < 1)
- yield_mod = 0
- total_yield = get_trait(TRAIT_YIELD)
- else
- total_yield = get_trait(TRAIT_YIELD) + rand(yield_mod)
- total_yield = max(1,total_yield)
-
- currently_querying = list()
- for(var/i = 0;iThe pod disgorges [product]! ")
- handle_living_product(product)
-
-// When the seed in this machine mutates/is modified, the tray seed value
-// is set to a new datum copied from the original. This datum won't actually
-// be put into the global datum list until the product is harvested, though.
-/datum/seed/proc/diverge(var/modified = 0)
-
- if(get_trait(TRAIT_IMMUTABLE) > 0) return
-
- //Set up some basic information.
- var/datum/seed/new_seed = new
- new_seed.name = "new line"
- new_seed.uid = 0
- new_seed.roundstart = 0
- new_seed.can_self_harvest = can_self_harvest
- new_seed.kitchen_tag = kitchen_tag
- new_seed.trash_type = trash_type
- new_seed.preset_product = preset_product
- new_seed.final_form = final_form
- //Copy over everything else.
- if(mutants) new_seed.mutants = mutants.Copy()
- if(chems) new_seed.chems = chems.Copy()
- if(consume_gasses) new_seed.consume_gasses = consume_gasses.Copy()
- if(exude_gasses) new_seed.exude_gasses = exude_gasses.Copy()
- new_seed.modular_icon = modular_icon
- new_seed.preset_icon = preset_icon
-
- new_seed.base_name = base_name
- new_seed.update_name_prefixes(modified)
-
- new_seed.seed_noun = seed_noun
- new_seed.traits = traits.Copy()
- new_seed.update_growth_stages()
- return new_seed
-
-/datum/seed/proc/update_growth_stages()
- if(get_trait(TRAIT_PLANT_ICON))
- growth_stages = plant_controller.plant_sprites[get_trait(TRAIT_PLANT_ICON)]
- else
- growth_stages = 0
-
-/datum/seed/proc/update_name_prefixes(var/modified = 0)
- if(last_diverge_type == modified)
- //We already match the new prefix, so we're not going to bother
- return
- //Since we don't match, set the last_diverge type to the modified value, then handle the new prefix
- last_diverge_type = modified
- switch(modified)
- if(0) //Mutant (default)
- seed_name = "mutant [base_name]"
- display_name = "mutant [base_name]"
- if(1) //Modified
- seed_name = "modified [base_name]"
- display_name = "modified [base_name]"
- if(2) //Enhanced
- seed_name = "enhanced [base_name]"
- display_name = "enhanced [base_name]"
diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm
deleted file mode 100644
index 7e56c57a45f..00000000000
--- a/code/modules/hydroponics/seed_controller.dm
+++ /dev/null
@@ -1,153 +0,0 @@
-// Attempts to offload processing for the spreading plants from the MC.
-// Processes vines/spreading plants.
-
-#define PLANTS_PER_TICK 500 // Cap on number of plant segments processed.
-#define PLANT_TICK_TIME 75 // Number of ticks between the plant processor cycling.
-
-// Debug for testing seed genes (less useful now that the obfuscation is gone, but still might be useful for the future.
-/client/proc/show_plant_genes()
- set category = "Debug"
- set name = "Show Plant Genes"
- set desc = "Prints the round's plant gene tags."
-
- if(!holder) return
-
- if(!plant_controller || !plant_controller.gene_tag_list)
- to_chat(usr, "Gene tags not set.")
- return
-
- for(var/gene_tag in plant_controller.gene_tag_list)
- to_chat(usr, "[gene_tag]")
-
-var/global/datum/controller/plants/plant_controller // Set in New().
-
-/datum/controller/plants
-
- var/plants_per_tick = PLANTS_PER_TICK
- var/plant_tick_time = PLANT_TICK_TIME
- var/list/product_descs = list() // Stores generated fruit descs.
- var/list/plant_queue = list() // All queued plants.
- var/list/seeds = list() // All seed data stored here.
- var/list/gene_tag_list = list() // List of gene tags for xenobotany fun
- var/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds.
- var/list/plant_sprites = list() // List of all harvested product sprites.
- var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
- //var/processing = 0 // Off/on.
-
-/datum/controller/plants/New()
- if(plant_controller && plant_controller != src)
- log_debug("Rebuilding plant controller.")
- qdel(plant_controller)
- plant_controller = src
- setup()
- process()
-
-/datum/controller/plants/Destroy()
- ..()
- return QDEL_HINT_HARDDEL_NOW
-
-// Predefined/roundstart varieties use a string key to make it
-// easier to grab the new variety when mutating. Post-roundstart
-// and mutant varieties use their uid converted to a string instead.
-// Looks like shit but it's sort of necessary.
-/datum/controller/plants/proc/setup()
-
- // Build the icon lists.
- for(var/icostate in icon_states('icons/obj/hydroponics_growing.dmi'))
- var/split = findtext(icostate,"-")
- if(!split)
- // invalid icon_state
- continue
-
- var/ikey = copytext(icostate,(split+1))
- if(ikey == "dead")
- // don't count dead icons
- continue
- ikey = text2num(ikey)
- var/base = copytext(icostate,1,split)
-
- if(!(plant_sprites[base]) || (plant_sprites[base]= max_seeds)
+ break
+ ++loaded
+ add_seed(G)
+ if (loaded)
+ to_chat(user, "You put the seeds from \the [O.name] into [src]. ")
+ else
+ to_chat(user, "There are no seeds in \the [O.name]. ")
+ return
+
+ else if(seedify(O,-1, src, user))
+ to_chat(user, "You extract some seeds. ")
+ return
+ else if (istype(O,/obj/item/seeds))
+ if(add_seed(O))
+ to_chat(user, "You add [O] to [name]. ")
+ updateUsrDialog()
+ return
+ else if(user.a_intent != I_HARM)
+ to_chat(user, "You can't extract any seeds from \the [O.name]! ")
+ else
+ return ..()
+
+/datum/seed_pile
+ var/name = ""
+ var/lifespan = 0 //Saved stats
+ var/endurance = 0
+ var/maturation = 0
+ var/production = 0
+ var/yield = 0
+ var/potency = 0
+ var/amount = 0
+
+/datum/seed_pile/New(var/name, var/life, var/endur, var/matur, var/prod, var/yie, var/poten, var/am = 1)
+ src.name = name
+ src.lifespan = life
+ src.endurance = endur
+ src.maturation = matur
+ src.production = prod
+ src.yield = yie
+ src.potency = poten
+ src.amount = am
+
+/obj/machinery/seed_extractor/attack_hand(mob/user)
+ interact(user)
+
+/obj/machinery/seed_extractor/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/seed_extractor/interact(mob/user)
+ if(stat)
+ return 0
+
+ add_fingerprint(user)
+ user.set_machine(src)
+
+ var/dat = "Stored seeds: "
+
+ if (contents.len == 0)
+ dat += "No seeds "
+ else
+ dat += "Name Lifespan Endurance Maturation Production Yield Potency Stock "
+ for (var/datum/seed_pile/O in piles)
+ dat += "[O.name] [O.lifespan] [O.endurance] [O.maturation] "
+ dat += "[O.production] [O.yield] [O.potency] "
+ dat += "Vend ([O.amount] left) "
+ dat += "
"
+ var/datum/browser/popup = new(user, "seed_ext", name, 700, 400)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/obj/machinery/seed_extractor/Topic(var/href, var/list/href_list)
+ if(..())
+ return 1
+ usr.set_machine(src)
+
+ href_list["li"] = text2num(href_list["li"])
+ href_list["en"] = text2num(href_list["en"])
+ href_list["ma"] = text2num(href_list["ma"])
+ href_list["pr"] = text2num(href_list["pr"])
+ href_list["yi"] = text2num(href_list["yi"])
+ href_list["pot"] = text2num(href_list["pot"])
+
+ for (var/datum/seed_pile/N in piles)//Find the pile we need to reduce...
+ if (href_list["name"] == N.name && href_list["li"] == N.lifespan && href_list["en"] == N.endurance && href_list["ma"] == N.maturation && href_list["pr"] == N.production && href_list["yi"] == N.yield && href_list["pot"] == N.potency)
+ if(N.amount <= 0)
+ return
+ N.amount = max(N.amount - 1, 0)
+ if (N.amount <= 0)
+ piles -= N
+ qdel(N)
+ break
+
+ for (var/obj/T in contents)//Now we find the seed we need to vend
+ var/obj/item/seeds/O = T
+ if (O.plantname == href_list["name"] && O.lifespan == href_list["li"] && O.endurance == href_list["en"] && O.maturation == href_list["ma"] && O.production == href_list["pr"] && O.yield == href_list["yi"] && O.potency == href_list["pot"])
+ O.forceMove(loc)
+ break
+
+ updateUsrDialog()
+ return
+
+/obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/O)
+ if(contents.len >= 999)
+ to_chat(usr, "\The [src] is full. ")
+ return 0
+
+ if(istype(O.loc,/mob))
+ var/mob/M = O.loc
+ if(!M.drop_item())
+ return 0
+ else if(istype(O.loc,/obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = O.loc
+ S.remove_from_storage(O,src)
+
+ O.forceMove(src)
+ . = 1
+ for (var/datum/seed_pile/N in piles)
+ if (O.plantname == N.name && O.lifespan == N.lifespan && O.endurance == N.endurance && O.maturation == N.maturation && O.production == N.production && O.yield == N.yield && O.potency == N.potency)
+ ++N.amount
+ return
+
+ piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency)
+ return
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
deleted file mode 100644
index 7e21e12370e..00000000000
--- a/code/modules/hydroponics/seed_machines.dm
+++ /dev/null
@@ -1,377 +0,0 @@
-/obj/item/weapon/disk/botany
- name = "flora data disk"
- desc = "A small disk used for carrying data on plant genetics."
- icon = 'icons/obj/hydroponics_machines.dmi'
- icon_state = "disk"
- w_class = 1
-
- var/list/genes = list()
- var/genesource = "unknown"
-
-/obj/item/weapon/disk/botany/New()
- ..()
- pixel_x = rand(-5,5)
- pixel_y = rand(-5,5)
-
-/obj/item/weapon/disk/botany/attack_self(var/mob/user as mob)
- if(genes.len)
- var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", "No", "Yes")
- if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src)))
- to_chat(user, "You wipe the disk data.")
- name = initial(name)
- desc = initial(name)
- genes = list()
- genesource = "unknown"
-
-/obj/item/weapon/storage/box/botanydisk
- name = "flora disk box"
- desc = "A box of flora data disks, apparently."
-
-/obj/item/weapon/storage/box/botanydisk/New()
- ..()
- for(var/i = 0;i<7;i++)
- new /obj/item/weapon/disk/botany(src)
-
-/obj/machinery/botany
- icon = 'icons/obj/hydroponics_machines.dmi'
- icon_state = "hydrotray3"
- density = 1
- anchored = 1
- use_power = 1
-
- var/obj/item/seeds/seed // Currently loaded seed packet.
- var/obj/item/weapon/disk/botany/loaded_disk //Currently loaded data disk.
-
- var/open = 0
- var/active = 0
- var/action_time = 5
- var/last_action = 0
- var/eject_disk = 0
- var/failed_task = 0
- var/disk_needs_genes = 0
-
-/obj/machinery/botany/process()
-
- ..()
- if(!active) return
-
- if(world.time > last_action + action_time)
- finished_task()
-
-/obj/machinery/botany/attack_ai(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/botany/attack_hand(mob/user as mob)
- ui_interact(user)
-
-/obj/machinery/botany/proc/finished_task()
- active = 0
- if(failed_task)
- failed_task = 0
- visible_message("[bicon(src)] [src] pings unhappily, flashing a red warning light.")
- else
- visible_message("[bicon(src)] [src] pings happily.")
-
- if(eject_disk)
- eject_disk = 0
- if(loaded_disk)
- loaded_disk.loc = get_turf(src)
- visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
- loaded_disk = null
-
-/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/seeds))
- if(seed)
- to_chat(user, "There is already a seed loaded.")
- return
- var/obj/item/seeds/S =W
- if(S.seed && S.seed.get_trait(TRAIT_IMMUTABLE) > 0)
- to_chat(user, "That seed is not compatible with our genetics technology.")
- else
- user.drop_item(W)
- W.loc = src
- seed = W
- to_chat(user, "You load [W] into [src].")
- return
-
- if(istype(W,/obj/item/weapon/screwdriver))
- open = !open
- to_chat(user, "You [open ? "open" : "close"] the maintenance panel. ")
- return
-
- if(open)
- if(istype(W, /obj/item/weapon/crowbar))
- dismantle()
- return
-
- if(istype(W,/obj/item/weapon/disk/botany))
- if(loaded_disk)
- to_chat(user, "There is already a data disk loaded.")
- return
- else
- var/obj/item/weapon/disk/botany/B = W
-
- if(B.genes && B.genes.len)
- if(!disk_needs_genes)
- to_chat(user, "That disk already has gene data loaded.")
- return
- else
- if(disk_needs_genes)
- to_chat(user, "That disk does not have any gene data loaded.")
- return
-
- user.drop_item(W)
- W.loc = src
- loaded_disk = W
- to_chat(user, "You load [W] into [src].")
-
- return
- ..()
-
-// Allows for a trait to be extracted from a seed packet, destroying that seed.
-/obj/machinery/botany/extractor
- name = "lysis-isolation centrifuge"
- icon_state = "traitcopier"
-
- var/datum/seed/genetics // Currently scanned seed genetic structure.
- var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point.
-
- var/degrade_lower = 20
- var/degrade_upper = 60
-
-/obj/machinery/botany/extractor/New()
- ..()
-
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/botany_extractor(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/botany/extractor/RefreshParts()
- var/tier = 1
- for(var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
- tier = S.rating
- degrade_lower = 25 - (tier * 5) //Tier 1: 20, Tier 4: 5
- degrade_upper = 70 - (tier * 10) //Tier 1: 60, Tier 4: 30
-
-/obj/machinery/botany/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(!user)
- return
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/botany/extractor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
- var/data[0]
-
- var/list/geneMasks[0]
- for(var/gene_tag in plant_controller.gene_tag_list)
- geneMasks.Add(gene_tag)
- data["geneMasks"] = geneMasks
-
- data["activity"] = active
- data["degradation"] = degradation
-
- if(loaded_disk)
- data["disk"] = 1
- else
- data["disk"] = 0
-
- if(seed)
- data["loaded"] = "[seed.name]"
- else
- data["loaded"] = 0
-
- if(genetics)
- data["hasGenetics"] = 1
- data["sourceName"] = genetics.display_name
- if(!genetics.roundstart)
- data["sourceName"] += " (variety #[genetics.uid])"
- else
- data["hasGenetics"] = 0
- data["sourceName"] = 0
-
- return data
-
-/obj/machinery/botany/Topic(href, href_list)
-
- if(..())
- return 1
-
- if(href_list["eject_packet"])
- if(!seed) return
- seed.loc = get_turf(src)
-
- if(seed.seed.name == "new line" || isnull(plant_controller.seeds[seed.seed.name]))
- seed.seed.uid = plant_controller.seeds.len + 1
- seed.seed.name = "[seed.seed.uid]"
- plant_controller.seeds[seed.seed.name] = seed.seed
-
- seed.update_seed()
- visible_message("[bicon(src)] [src] beeps and spits out [seed].")
-
- seed = null
-
- if(href_list["eject_disk"])
- if(!loaded_disk) return
- loaded_disk.loc = get_turf(src)
- visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
- loaded_disk = null
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
-/obj/machinery/botany/extractor/Topic(href, href_list)
-
- if(..())
- return 1
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
- if(href_list["scan_genome"])
-
- if(!seed) return
-
- last_action = world.time
- active = 1
-
- if(seed && seed.seed)
- genetics = seed.seed
- degradation = 0
-
- qdel(seed)
- seed = null
-
- if(href_list["get_gene"])
-
- if(!genetics || !loaded_disk) return
-
- last_action = world.time
- active = 1
-
- var/datum/plantgene/P = genetics.get_gene(href_list["get_gene"])
- if(!P) return
- loaded_disk.genes += P
-
- loaded_disk.genesource = "[genetics.display_name]"
- if(!genetics.roundstart)
- loaded_disk.genesource += " (variety #[genetics.uid])"
-
- loaded_disk.name += " ([href_list["get_gene"]], #[genetics.uid])"
- loaded_disk.desc += " The label reads \'[href_list["get_gene"]] gene, sampled from [genetics.display_name]\'."
- eject_disk = 1
-
- degradation += rand(degrade_lower, degrade_upper)
- if(degradation >= 100)
- failed_task = 1
- genetics = null
- degradation = 0
-
- if(href_list["clear_buffer"])
- if(!genetics) return
- genetics = null
- degradation = 0
-
- src.updateUsrDialog()
- return
-
-// Fires an extracted trait into another packet of seeds with a chance
-// of destroying it based on the size/complexity of the plasmid.
-/obj/machinery/botany/editor
- name = "bioballistic delivery system"
- icon_state = "traitgun"
- disk_needs_genes = 1
-
- var/degrade_lower = 5
- var/degrade_upper = 10
-
-/obj/machinery/botany/editor/New()
- ..()
-
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/botany_editor(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/botany/editor/RefreshParts()
- var/tier = 1
- for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
- tier = M.rating
- degrade_lower = 6 - tier //Tier 1: 5, Tier 4: 1
- degrade_upper = 11 - tier //Tier 1: 10, Tier 4: 6
-
-/obj/machinery/botany/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(!user)
- return
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/botany/editor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
- var/data[0]
-
- data["activity"] = active
-
- if(seed)
- data["degradation"] = seed.modified
- else
- data["degradation"] = 0
-
- if(loaded_disk && loaded_disk.genes.len)
- data["disk"] = 1
- data["sourceName"] = loaded_disk.genesource
- data["locus"] = ""
-
- for(var/datum/plantgene/P in loaded_disk.genes)
- if(data["locus"] != "") data["locus"] += ", "
- data["locus"] += "[plant_controller.gene_tag_list[P.genetype]]"
-
- else
- data["disk"] = 0
- data["sourceName"] = 0
- data["locus"] = 0
-
- if(seed)
- data["loaded"] = "[seed.name]"
- else
- data["loaded"] = 0
-
- return data
-
-/obj/machinery/botany/editor/Topic(href, href_list)
-
- if(..())
- return 1
-
- if(href_list["apply_gene"])
- if(!loaded_disk || !seed) return
-
- last_action = world.time
- active = 1
-
- if(!isnull(plant_controller.seeds[seed.seed.name]))
- seed.seed = seed.seed.diverge(1)
- seed.seed_type = seed.seed.name
- seed.update_seed()
-
- if(prob(seed.modified))
- failed_task = 1
- seed.modified = 101
-
- for(var/datum/plantgene/gene in loaded_disk.genes)
- seed.seed.apply_gene(gene)
- seed.modified += rand(degrade_lower, degrade_upper)
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm
deleted file mode 100644
index 57579a3a797..00000000000
--- a/code/modules/hydroponics/seed_mobs.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/datum/seed
- var/list/currently_querying // Used to avoid asking the same ghost repeatedly.
-
-// The following procs are used to grab players for mobs produced by a seed (mostly for dionaea).
-/datum/seed/proc/handle_living_product(var/mob/living/host)
\ No newline at end of file
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
deleted file mode 100644
index 244b9fef8f3..00000000000
--- a/code/modules/hydroponics/seed_packets.dm
+++ /dev/null
@@ -1,315 +0,0 @@
-var/global/list/plant_seed_sprites = list()
-
-//Seed packet object/procs.
-/obj/item/seeds
- name = "packet of seeds"
- icon = 'icons/obj/seeds.dmi'
- icon_state = "blank"
- w_class = 2
- burn_state = FLAMMABLE
- var/seed_type
- var/datum/seed/seed
- var/modified = 0
-
-/obj/item/seeds/New()
- while(!plant_controller)
- sleep(30)
- update_seed()
- ..()
-
-//Grabs the appropriate seed datum from the global list.
-/obj/item/seeds/proc/update_seed()
- if(!seed && seed_type && !isnull(plant_controller.seeds) && plant_controller.seeds[seed_type])
- seed = plant_controller.seeds[seed_type]
- update_appearance()
-
-//Updates strings and icon appropriately based on seed datum.
-/obj/item/seeds/proc/update_appearance()
- if(!seed) return
-
- // Update icon.
- overlays.Cut()
- var/is_seeds = ((seed.seed_noun in list("seeds","pits","nodes")) ? 1 : 0)
- var/image/seed_mask
- var/seed_base_key = "base-[is_seeds ? seed.get_trait(TRAIT_PLANT_COLOUR) : "spores"]"
- if(plant_seed_sprites[seed_base_key])
- seed_mask = plant_seed_sprites[seed_base_key]
- else
- seed_mask = image('icons/obj/seeds.dmi',"[is_seeds ? "seed" : "spore"]-mask")
- if(is_seeds) // Spore glass bits aren't coloured.
- seed_mask.color = seed.get_trait(TRAIT_PLANT_COLOUR)
- plant_seed_sprites[seed_base_key] = seed_mask
-
- var/image/seed_overlay
- var/seed_overlay_key = "[seed.get_trait(TRAIT_PRODUCT_ICON)]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"
- if(plant_seed_sprites[seed_overlay_key])
- seed_overlay = plant_seed_sprites[seed_overlay_key]
- else
- seed_overlay = image('icons/obj/seeds.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]")
- seed_overlay.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- plant_seed_sprites[seed_overlay_key] = seed_overlay
-
- overlays |= seed_mask
- overlays |= seed_overlay
-
- if(is_seeds)
- src.name = "packet of [seed.seed_name] [seed.seed_noun]"
- src.desc = "It has a picture of [seed.display_name] on the front."
- else
- src.name = "sample of [seed.seed_name] [seed.seed_noun]"
- src.desc = "It's labelled as coming from [seed.display_name]."
-
-/obj/item/seeds/examine(mob/user)
- ..(user)
- if(seed && !seed.roundstart)
- to_chat(user, "It's tagged as variety #[seed.uid].")
-
-/obj/item/seeds/cutting
- name = "cuttings"
- desc = "Some plant cuttings."
-
-/obj/item/seeds/cutting/update_appearance()
- ..()
- src.name = "packet of [seed.seed_name] cuttings"
-
-/obj/item/seeds/random
- seed_type = null
-
-/obj/item/seeds/random/New()
- seed = plant_controller.create_random_seed()
- seed_type = seed.name
- update_seed()
-
-/obj/item/seeds/replicapod
- seed_type = "diona"
-
-/obj/item/seeds/chiliseed
- seed_type = "chili"
-
-/obj/item/seeds/plastiseed
- seed_type = "plastic"
-
-/obj/item/seeds/grapeseed
- seed_type = "grapes"
-
-/obj/item/seeds/greengrapeseed
- seed_type = "greengrapes"
-
-/obj/item/seeds/peanutseed
- seed_type = "peanut"
-
-/obj/item/seeds/cabbageseed
- seed_type = "cabbage"
-
-/obj/item/seeds/comfreyseed
- seed_type = "comfrey"
-
-/obj/item/seeds/aloeseed
- seed_type = "aloe"
-
-/obj/item/seeds/berryseed
- seed_type = "berries"
-
-/obj/item/seeds/glowberryseed
- seed_type = "glowberries"
-
-/obj/item/seeds/bananaseed
- seed_type = "banana"
-
-/obj/item/seeds/eggplantseed
- seed_type = "eggplant"
-
-/obj/item/seeds/bloodtomatoseed
- seed_type = "bloodtomato"
-
-/obj/item/seeds/tomatoseed
- seed_type = "tomato"
-
-/obj/item/seeds/killertomatoseed
- seed_type = "killertomato"
-
-/obj/item/seeds/bluetomatoseed
- seed_type = "bluetomato"
-
-/obj/item/seeds/bluespacetomatoseed
- seed_type = "bluespacetomato"
-
-/obj/item/seeds/cornseed
- seed_type = "corn"
-
-/obj/item/seeds/poppyseed
- seed_type = "poppies"
-
-/obj/item/seeds/potatoseed
- seed_type = "potato"
-
-/obj/item/seeds/icepepperseed
- seed_type = "icechili"
-
-/obj/item/seeds/soyaseed
- seed_type = "soybean"
-
-/obj/item/seeds/wheatseed
- seed_type = "wheat"
-
-/obj/item/seeds/riceseed
- seed_type = "rice"
-
-/obj/item/seeds/carrotseed
- seed_type = "carrot"
-
-/obj/item/seeds/reishimycelium
- seed_type = "reishi"
-
-/obj/item/seeds/amanitamycelium
- seed_type = "amanita"
-
-/obj/item/seeds/angelmycelium
- seed_type = "destroyingangel"
-
-/obj/item/seeds/libertymycelium
- seed_type = "libertycap"
-
-/obj/item/seeds/chantermycelium
- seed_type = "mushrooms"
-
-/obj/item/seeds/towermycelium
- seed_type = "towercap"
-
-/obj/item/seeds/glowshroom
- seed_type = "glowshroom"
-
-/obj/item/seeds/glowcap
- seed_type = "glowcap"
-
-/obj/item/seeds/plumpmycelium
- seed_type = "plumphelmet"
-
-/obj/item/seeds/walkingmushroommycelium
- seed_type = "walkingmushroom"
-
-/obj/item/seeds/nettleseed
- seed_type = "nettle"
-
-/obj/item/seeds/deathnettleseed
- seed_type = "deathnettle"
-
-/obj/item/seeds/weeds
- seed_type = "weeds"
-
-/obj/item/seeds/harebell
- seed_type = "harebells"
-
-/obj/item/seeds/sunflowerseed
- seed_type = "sunflowers"
-
-/obj/item/seeds/brownmold
- seed_type = "mold"
-
-/obj/item/seeds/appleseed
- seed_type = "apple"
-
-/obj/item/seeds/poisonedappleseed
- seed_type = "poisonapple"
-
-/obj/item/seeds/goldappleseed
- seed_type = "goldapple"
-
-/obj/item/seeds/ambrosiavulgarisseed
- seed_type = "ambrosia"
-
-/obj/item/seeds/ambrosiadeusseed
- seed_type = "ambrosiadeus"
-
-/obj/item/seeds/ambrosiavulgarisseed/cruciatus
- seed_type = "ambrosia"
-
-/obj/item/seeds/whitebeetseed
- seed_type = "whitebeet"
-
-/obj/item/seeds/sugarcaneseed
- seed_type = "sugarcane"
-
-/obj/item/seeds/watermelonseed
- seed_type = "watermelon"
-
-/obj/item/seeds/pumpkinseed
- seed_type = "pumpkin"
-
-/obj/item/seeds/limeseed
- seed_type = "lime"
-
-/obj/item/seeds/lemonseed
- seed_type = "lemon"
-
-/obj/item/seeds/orangeseed
- seed_type = "orange"
-
-/obj/item/seeds/poisonberryseed
- seed_type = "poisonberries"
-
-/obj/item/seeds/deathberryseed
- seed_type = "deathberries"
-
-/obj/item/seeds/grassseed
- seed_type = "grass"
-
-/obj/item/seeds/cocoapodseed
- seed_type = "cocoa"
-
-/obj/item/seeds/cherryseed
- seed_type = "cherry"
-
-/obj/item/seeds/tobaccoseed
- seed_type = "tobacco"
-
-/obj/item/seeds/kudzuseed
- seed_type = "kudzu"
-
-/obj/item/seeds/jurlmah
- seed_type = "jurlmah"
-
-/obj/item/seeds/amauri
- seed_type = "amauri"
-
-/obj/item/seeds/gelthi
- seed_type = "gelthi"
-
-/obj/item/seeds/vale
- seed_type = "vale"
-
-/obj/item/seeds/surik
- seed_type = "surik"
-
-/obj/item/seeds/telriis
- seed_type = "telriis"
-
-/obj/item/seeds/thaadra
- seed_type = "thaadra"
-
-/obj/item/seeds/clown
- seed_type = "clown"
-
-/obj/item/seeds/test
- seed_type = "test"
-
-/obj/item/seeds/test2
- seed_type = "test2"
-
-/obj/item/seeds/stobaccoseed
- seed_type = "stobacco"
-
-/obj/item/seeds/teaasperaseed
- seed_type = "teaaspera"
-
-/obj/item/seeds/teaastraseed
- seed_type = "teaastra"
-
-/obj/item/seeds/coffeeaseed
- seed_type = "coffeea"
-
-/obj/item/seeds/coffeerseed
- seed_type = "coffeer"
-
-/obj/item/seeds/cash
- seed_type = "cashtree"
\ No newline at end of file
diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm
deleted file mode 100644
index 8c2924db35e..00000000000
--- a/code/modules/hydroponics/seed_storage.dm
+++ /dev/null
@@ -1,245 +0,0 @@
-/datum/seed_pile
- var/name
- var/amount
- var/datum/seed/seed_type // Keeps track of what our seed is
- var/list/obj/item/seeds/seeds = list() // Tracks actual objects contained in the pile
- var/ID
-
-/datum/seed_pile/New(var/obj/item/seeds/O, var/ID)
- name = O.name
- amount = 1
- seed_type = O.seed
- seeds += O
- src.ID = ID
-
-/datum/seed_pile/proc/matches(var/obj/item/seeds/O)
- if(O.seed == seed_type)
- return 1
- return 0
-
-/obj/machinery/seed_storage
- name = "Seed storage"
- desc = "It stores, sorts, and dispenses seeds."
- icon = 'icons/obj/vending.dmi'
- icon_state = "seeds"
- density = 1
- anchored = 1
- use_power = 1
- idle_power_usage = 100
-
- var/initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction
- var/list/datum/seed_pile/piles = list()
- var/list/starting_seeds = list()
- var/list/scanner = list() // What properties we can view
-
-/obj/machinery/seed_storage/random // This is mostly for testing, but I guess admins could spawn it
- name = "Random seed storage"
- scanner = list("stats", "produce", "soil", "temperature", "light")
- starting_seeds = list(/obj/item/seeds/random = 50)
-
-/obj/machinery/seed_storage/garden
- name = "Garden seed storage"
- scanner = list("stats")
- starting_seeds = list(/obj/item/seeds/appleseed = 3, /obj/item/seeds/bananaseed = 3, /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/lemonseed = 3, /obj/item/seeds/limeseed = 3, /obj/item/seeds/aloeseed = 2, /obj/item/seeds/orangeseed = 3, /obj/item/seeds/peanutseed = 3, /obj/item/seeds/plumpmycelium = 3, /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/riceseed = 3, /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/comfreyseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3)
-
-/obj/machinery/seed_storage/xenobotany
- name = "Xenobotany seed storage"
- scanner = list("stats", "produce", "soil", "temperature", "light")
- starting_seeds = list(/obj/item/seeds/ambrosiavulgarisseed = 3, /obj/item/seeds/appleseed = 3, /obj/item/seeds/amanitamycelium = 2, /obj/item/seeds/bananaseed = 3, /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/lemonseed = 3, /obj/item/seeds/libertymycelium = 2, /obj/item/seeds/limeseed = 3, /obj/item/seeds/aloeseed = 2, /obj/item/seeds/nettleseed = 2, /obj/item/seeds/orangeseed = 3, /obj/item/seeds/peanutseed = 3, /obj/item/seeds/plastiseed = 3, /obj/item/seeds/plumpmycelium = 3, /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/reishimycelium = 2, /obj/item/seeds/riceseed = 3, /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/comfreyseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3)
-
-/obj/machinery/seed_storage/attack_hand(mob/user as mob)
- user.set_machine(src)
- interact(user)
-
-/obj/machinery/seed_storage/interact(mob/user as mob)
- if(..())
- return
-
- if(!initialized)
- for(var/typepath in starting_seeds)
- var/amount = starting_seeds[typepath]
- if(isnull(amount)) amount = 1
-
- for(var/i = 1 to amount)
- var/O = new typepath
- add(O)
- initialized = 1
-
- var/dat = "Seed storage contents "
- if(piles.len == 0)
- dat += "No seeds "
- else
- dat += "Name "
- dat += "Variety "
- if("stats" in scanner)
- dat += "E Y M Pr Pt Harvest "
- if("temperature" in scanner)
- dat += "Temp "
- if("light" in scanner)
- dat += "Light "
- if("soil" in scanner)
- dat += "Nutri Water "
- dat += "Notes Amount "
- for(var/datum/seed_pile/S in piles)
- var/datum/seed/seed = S.seed_type
- if(!seed)
- continue
- dat += ""
- dat += "[seed.seed_name] "
- dat += "#[seed.uid] "
- if("stats" in scanner)
- dat += "[seed.get_trait(TRAIT_ENDURANCE)] [seed.get_trait(TRAIT_YIELD)] [seed.get_trait(TRAIT_MATURATION)] [seed.get_trait(TRAIT_PRODUCTION)] [seed.get_trait(TRAIT_POTENCY)] "
- if(seed.get_trait(TRAIT_HARVEST_REPEAT))
- dat += "Multiple "
- else
- dat += "Single "
- if("temperature" in scanner)
- dat += "[seed.get_trait(TRAIT_IDEAL_HEAT)] K "
- if("light" in scanner)
- dat += "[seed.get_trait(TRAIT_IDEAL_LIGHT)] L "
- if("soil" in scanner)
- if(seed.get_trait(TRAIT_REQUIRES_NUTRIENTS))
- if(seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) < 0.05)
- dat += "Low "
- else if(seed.get_trait(TRAIT_REQUIRES_NUTRIENTS) > 0.2)
- dat += "High "
- else
- dat += "Norm "
- else
- dat += "No "
- if(seed.get_trait(TRAIT_REQUIRES_WATER))
- if(seed.get_trait(TRAIT_WATER_CONSUMPTION) < 1)
- dat += "Low "
- else if(seed.get_trait(TRAIT_WATER_CONSUMPTION) > 5)
- dat += "High "
- else
- dat += "Norm "
- else
- dat += "No "
-
- dat += ""
- switch(seed.get_trait(TRAIT_CARNIVOROUS))
- if(1)
- dat += "CARN "
- if(2)
- dat += "CARN "
- switch(seed.get_trait(TRAIT_SPREAD))
- if(1)
- dat += "VINE "
- if(2)
- dat += "VINE "
- if("pressure" in scanner)
- if(seed.get_trait(TRAIT_LOWKPA_TOLERANCE) < 20)
- dat += "LP "
- if(seed.get_trait(TRAIT_HIGHKPA_TOLERANCE) > 220)
- dat += "HP "
- if("temperature" in scanner)
- if(seed.get_trait(TRAIT_HEAT_TOLERANCE) > 30)
- dat += "TEMRES "
- else if(seed.get_trait(TRAIT_HEAT_TOLERANCE) < 10)
- dat += "TEMSEN "
- if("light" in scanner)
- if(seed.get_trait(TRAIT_LIGHT_TOLERANCE) > 10)
- dat += "LIGRES "
- else if(seed.get_trait(TRAIT_LIGHT_TOLERANCE) < 3)
- dat += "LIGSEN "
- if(seed.get_trait(TRAIT_TOXINS_TOLERANCE) < 3)
- dat += "TOXSEN "
- else if(seed.get_trait(TRAIT_TOXINS_TOLERANCE) > 6)
- dat += "TOXRES "
- if(seed.get_trait(TRAIT_PEST_TOLERANCE) < 3)
- dat += "PESTSEN "
- else if(seed.get_trait(TRAIT_PEST_TOLERANCE) > 6)
- dat += "PESTRES "
- if(seed.get_trait(TRAIT_WEED_TOLERANCE) < 3)
- dat += "WEEDSEN "
- else if(seed.get_trait(TRAIT_WEED_TOLERANCE) > 6)
- dat += "WEEDRES "
- if(seed.get_trait(TRAIT_PARASITE))
- dat += "PAR "
- if("temperature" in scanner)
- if(seed.get_trait(TRAIT_ALTER_TEMP) > 0)
- dat += "TEMP+ "
- if(seed.get_trait(TRAIT_ALTER_TEMP) < 0)
- dat += "TEMP- "
- if(seed.get_trait(TRAIT_BIOLUM))
- dat += "LUM "
- dat += " "
- dat += "[S.amount] "
- dat += "Vend Purge "
- dat += " "
- dat += "
"
-
- user << browse(dat, "window=seedstorage")
- onclose(user, "seedstorage")
-
-/obj/machinery/seed_storage/Topic(var/href, var/list/href_list)
- if(..())
- return
- var/task = href_list["task"]
- var/ID = text2num(href_list["id"])
-
- for(var/datum/seed_pile/N in piles)
- if(N.ID == ID)
- if(task == "vend")
- var/obj/O = pick(N.seeds)
- if(O)
- --N.amount
- N.seeds -= O
- if(N.amount <= 0 || N.seeds.len <= 0)
- piles -= N
- qdel(N)
- O.loc = src.loc
- else
- piles -= N
- qdel(N)
- else if(task == "purge")
- for(var/obj/O in N.seeds)
- qdel(O)
- piles -= N
- qdel(N)
- break
- updateUsrDialog()
-
-/obj/machinery/seed_storage/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/seeds))
- add(O)
- user.visible_message("[user] puts \the [O.name] into \the [src].", "You put \the [O] into \the [src].")
- return
- else if(istype(O, /obj/item/weapon/storage/bag/plants))
- var/obj/item/weapon/storage/P = O
- var/loaded = 0
- for(var/obj/item/seeds/G in P.contents)
- ++loaded
- add(G)
- if(loaded)
- user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].")
- else
- to_chat(user, "There are no seeds in \the [O.name]. ")
- return
- else if(istype(O, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- anchored = !anchored
- to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
-
-/obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj)
- if(istype(O.loc, /mob))
- var/mob/user = O.loc
- user.drop_item(O)
- else if(istype(O.loc,/obj/item/weapon/storage))
- var/obj/item/weapon/storage/S = O.loc
- S.remove_from_storage(O, src)
-
- O.loc = src
- var/newID = 0
-
- for(var/datum/seed_pile/N in piles)
- if(N.matches(O))
- ++N.amount
- N.seeds += (O)
- return
- else if(N.ID >= newID)
- newID = N.ID + 1
-
- piles += new /datum/seed_pile(O, newID)
- return
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
new file mode 100644
index 00000000000..093cd2114a4
--- /dev/null
+++ b/code/modules/hydroponics/seeds.dm
@@ -0,0 +1,390 @@
+// ********************************************************
+// Here's all the seeds (plants) that can be used in hydro
+// ********************************************************
+
+/obj/item/seeds
+ icon = 'icons/obj/hydroponics/seeds.dmi'
+ icon_state = "seed" // Unknown plant seed - these shouldn't exist in-game.
+ w_class = WEIGHT_CLASS_TINY
+ burn_state = FLAMMABLE
+ var/plantname = "Plants" // Name of plant when planted.
+ var/product // A type path. The thing that is created when the plant is harvested.
+ var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overriden.
+
+ var/growing_icon = 'icons/obj/hydroponics/growing.dmi' //the file that stores the sprites of the growing plant from this seed.
+ var/icon_grow // Used to override grow icon (default is "[species]-grow"). You can use one grow icon for multiple closely related plants with it.
+ var/icon_dead // Used to override dead icon (default is "[species]-dead"). You can use one dead icon for multiple closely related plants with it.
+ var/icon_harvest // Used to override harvest icon (default is "[species]-harvest"). If null, plant will use [icon_grow][growthstages].
+
+ var/lifespan = 25 // How long before the plant begins to take damage from age.
+ var/endurance = 15 // Amount of health the plant has.
+ var/maturation = 6 // Used to determine which sprite to switch to when growing.
+ var/production = 6 // Changes the amount of time needed for a plant to become harvestable.
+ var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested.
+ var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways.
+ var/growthstages = 6 // Amount of growth sprites the plant has.
+ var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to Centcom.
+ var/list/mutatelist = list() // The type of plants that this plant can mutate into.
+ var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info.
+ var/list/reagents_add = list()
+ // A list of reagents to add to product.
+ // Format: "reagent_id" = potency multiplier
+ // Stronger reagents must always come first to avoid being displaced by weaker ones.
+ // Total amount of any reagent in plant is calculated by formula: 1 + round(potency * multiplier)
+
+ var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
+ var/weed_chance = 5 //Percentage chance per tray update to grow weeds
+
+/obj/item/seeds/New(loc, nogenes = 0)
+ ..()
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+
+ if(!icon_grow)
+ icon_grow = "[species]-grow"
+
+ if(!icon_dead)
+ icon_dead = "[species]-dead"
+
+ if(!icon_harvest && !get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) && yield != -1)
+ icon_harvest = "[species]-harvest"
+
+ if(!nogenes) // not used on Copy()
+ genes += new /datum/plant_gene/core/lifespan(lifespan)
+ genes += new /datum/plant_gene/core/endurance(endurance)
+ genes += new /datum/plant_gene/core/weed_rate(weed_rate)
+ genes += new /datum/plant_gene/core/weed_chance(weed_chance)
+ if(yield != -1)
+ genes += new /datum/plant_gene/core/yield(yield)
+ genes += new /datum/plant_gene/core/production(production)
+ if(potency != -1)
+ genes += new /datum/plant_gene/core/potency(potency)
+
+ for(var/p in genes)
+ if(ispath(p))
+ genes -= p
+ genes += new p
+
+ for(var/reag_id in reagents_add)
+ genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
+
+/obj/item/seeds/Destroy()
+ QDEL_LIST(genes)
+ return ..()
+
+/obj/item/seeds/proc/Copy()
+ var/obj/item/seeds/S = new type(null, 1)
+ // Copy all the stats
+ S.lifespan = lifespan
+ S.endurance = endurance
+ S.maturation = maturation
+ S.production = production
+ S.yield = yield
+ S.potency = potency
+ S.weed_rate = weed_rate
+ S.weed_chance = weed_chance
+ S.genes = list()
+ for(var/g in genes)
+ var/datum/plant_gene/G = g
+ S.genes += G.Copy()
+ S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes.
+ return S
+
+/obj/item/seeds/proc/get_gene(typepath)
+ return (locate(typepath) in genes)
+
+/obj/item/seeds/proc/reagents_from_genes()
+ reagents_add = list()
+ for(var/datum/plant_gene/reagent/R in genes)
+ reagents_add[R.reagent_id] = R.rate
+
+/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0)
+ adjust_lifespan(rand(-lifemut,lifemut))
+ adjust_endurance(rand(-endmut,endmut))
+ adjust_production(rand(-productmut,productmut))
+ adjust_yield(rand(-yieldmut,yieldmut))
+ adjust_potency(rand(-potmut,potmut))
+ adjust_weed_rate(rand(-wrmut, wrmut))
+ adjust_weed_chance(rand(-wcmut, wcmut))
+ if(prob(traitmut))
+ add_random_traits(1, 1)
+
+
+
+/obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
+ if(istype(Proj, /obj/item/projectile/energy/florayield))
+ var/rating = 1
+ if(istype(loc, /obj/machinery/hydroponics))
+ var/obj/machinery/hydroponics/H = loc
+ rating = H.rating
+
+ if(yield == 0)//Oh god don't divide by zero you'll doom us all.
+ adjust_yield(1 * rating)
+ else if(prob(1/(yield * yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
+ adjust_yield(1 * rating)
+ else
+ return ..()
+
+
+// Harvest procs
+/obj/item/seeds/proc/getYield()
+ var/return_yield = yield
+
+ var/obj/machinery/hydroponics/parent = loc
+ if(istype(loc, /obj/machinery/hydroponics))
+ if(parent.yieldmod == 0)
+ return_yield = min(return_yield, 1)//1 if above zero, 0 otherwise
+ else
+ return_yield *= (parent.yieldmod)
+
+ return return_yield
+
+
+/obj/item/seeds/proc/harvest(mob/user = usr)
+ var/obj/machinery/hydroponics/parent = loc //for ease of access
+ var/t_amount = 0
+ var/list/result = list()
+ var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK
+ var/product_name
+ while(t_amount < getYield())
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src)
+ result.Add(t_prod) // User gets a consumable
+ if(!t_prod)
+ return
+ t_amount++
+ product_name = t_prod.name
+ if(getYield() >= 1)
+ feedback_add_details("food_harvested","[product_name]|[getYield()]")
+ parent.update_tray()
+
+ return result
+
+
+/obj/item/seeds/proc/prepare_result(var/obj/item/weapon/reagent_containers/food/snacks/grown/T)
+ if(T.reagents)
+ for(var/reagent_id in reagents_add)
+ if(reagent_id == "blood") // Hack to make blood in plants always O-
+ T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id], 1), list("blood_type"="O-"))
+ continue
+
+ T.reagents.add_reagent(reagent_id, 1 + round(potency * reagents_add[reagent_id]), 1)
+ return 1
+
+
+/// Setters procs ///
+/obj/item/seeds/proc/adjust_yield(adjustamt)
+ if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable
+ yield = Clamp(yield + adjustamt, 0, 10)
+
+ if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ yield = 1 // Mushrooms always have a minimum yield of 1.
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/yield)
+ if(C)
+ C.value = yield
+
+/obj/item/seeds/proc/adjust_lifespan(adjustamt)
+ lifespan = Clamp(lifespan + adjustamt, 10, 100)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan)
+ if(C)
+ C.value = lifespan
+
+/obj/item/seeds/proc/adjust_endurance(adjustamt)
+ endurance = Clamp(endurance + adjustamt, 10, 100)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance)
+ if(C)
+ C.value = endurance
+
+/obj/item/seeds/proc/adjust_production(adjustamt)
+ if(yield != -1)
+ production = Clamp(production + adjustamt, 1, 10)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production)
+ if(C)
+ C.value = production
+
+/obj/item/seeds/proc/adjust_potency(adjustamt)
+ if(potency != -1)
+ potency = Clamp(potency + adjustamt, 0, 100)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency)
+ if(C)
+ C.value = potency
+
+/obj/item/seeds/proc/adjust_weed_rate(adjustamt)
+ weed_rate = Clamp(weed_rate + adjustamt, 0, 10)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate)
+ if(C)
+ C.value = weed_rate
+
+/obj/item/seeds/proc/adjust_weed_chance(adjustamt)
+ weed_chance = Clamp(weed_chance + adjustamt, 0, 67)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance)
+ if(C)
+ C.value = weed_chance
+
+//Directly setting stats
+
+/obj/item/seeds/proc/set_yield(adjustamt)
+ if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable
+ yield = Clamp(adjustamt, 0, 10)
+
+ if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ yield = 1 // Mushrooms always have a minimum yield of 1.
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/yield)
+ if(C)
+ C.value = yield
+
+/obj/item/seeds/proc/set_lifespan(adjustamt)
+ lifespan = Clamp(adjustamt, 10, 100)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan)
+ if(C)
+ C.value = lifespan
+
+/obj/item/seeds/proc/set_endurance(adjustamt)
+ endurance = Clamp(adjustamt, 10, 100)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance)
+ if(C)
+ C.value = endurance
+
+/obj/item/seeds/proc/set_production(adjustamt)
+ if(yield != -1)
+ production = Clamp(adjustamt, 1, 10)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production)
+ if(C)
+ C.value = production
+
+/obj/item/seeds/proc/set_potency(adjustamt)
+ if(potency != -1)
+ potency = Clamp(adjustamt, 0, 100)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency)
+ if(C)
+ C.value = potency
+
+/obj/item/seeds/proc/set_weed_rate(adjustamt)
+ weed_rate = Clamp(adjustamt, 0, 10)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate)
+ if(C)
+ C.value = weed_rate
+
+/obj/item/seeds/proc/set_weed_chance(adjustamt)
+ weed_chance = Clamp(adjustamt, 0, 67)
+ var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance)
+ if(C)
+ C.value = weed_chance
+
+
+/obj/item/seeds/proc/get_analyzer_text() //in case seeds have something special to tell to the analyzer
+ var/text = ""
+ if(!get_gene(/datum/plant_gene/trait/plant_type/weed_hardy) && !get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) && !get_gene(/datum/plant_gene/trait/plant_type/alien_properties))
+ text += "- Plant type: Normal plant\n"
+ if(get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
+ text += "- Plant type: Weed. Can grow in nutrient-poor soil.\n"
+ if(get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ text += "- Plant type: Mushroom. Can grow in dry soil.\n"
+ if(get_gene(/datum/plant_gene/trait/plant_type/alien_properties))
+ text += "- Plant type: UNKNOWN \n"
+ if(potency != -1)
+ text += "- Potency: [potency]\n"
+ if(yield != -1)
+ text += "- Yield: [yield]\n"
+ text += "- Maturation speed: [maturation]\n"
+ if(yield != -1)
+ text += "- Production speed: [production]\n"
+ text += "- Endurance: [endurance]\n"
+ text += "- Lifespan: [lifespan]\n"
+ text += "- Weed Growth Rate: [weed_rate]\n"
+ text += "- Weed Vulnerability: [weed_chance]\n"
+ if(rarity)
+ text += "- Species Discovery Value: [rarity]\n"
+ var/all_traits = ""
+ for(var/datum/plant_gene/trait/traits in genes)
+ if(istype(traits, /datum/plant_gene/trait/plant_type))
+ continue
+ all_traits += " [traits.get_name()]"
+ text += "- Plant Traits:[all_traits]\n"
+
+ text += "*---------*"
+
+ return text
+
+/obj/item/seeds/proc/on_chem_reaction(datum/reagents/S) //in case seeds have some special interaction with special chems
+ return
+
+/obj/item/seeds/attackby(obj/item/O, mob/user, params)
+ if (istype(O, /obj/item/device/plant_analyzer))
+ to_chat(user, "*---------*\n This is \a [src] . ")
+ var/text = get_analyzer_text()
+ if(text)
+ to_chat(user, "[text] ")
+
+ return
+ ..() // Fallthrough to item/attackby() so that bags can pick seeds up
+
+
+
+
+
+
+
+// Checks plants for broken tray icons. Use Advanced Proc Call to activate.
+// Maybe some day it would be used as unit test.
+/proc/check_plants_growth_stages_icons()
+ var/list/states = icon_states('icons/obj/hydroponics/growing.dmi')
+ states |= icon_states('icons/obj/hydroponics/growing_fruits.dmi')
+ states |= icon_states('icons/obj/hydroponics/growing_flowers.dmi')
+ states |= icon_states('icons/obj/hydroponics/growing_mushrooms.dmi')
+ states |= icon_states('icons/obj/hydroponics/growing_vegetables.dmi')
+ var/list/paths = typesof(/obj/item/seeds) - /obj/item/seeds - typesof(/obj/item/seeds/sample)
+
+ for(var/seedpath in paths)
+ var/obj/item/seeds/seed = new seedpath
+
+ for(var/i in 1 to seed.growthstages)
+ if("[seed.icon_grow][i]" in states)
+ continue
+ log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_grow][i] icon!", src)
+
+ if(!(seed.icon_dead in states))
+ log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_dead] icon!", src)
+
+ if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product
+ if(!(seed.icon_harvest in states))
+ log_runtime("[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!", src)
+
+/obj/item/seeds/proc/randomize_stats()
+ set_lifespan(rand(25, 60))
+ set_endurance(rand(15, 35))
+ set_production(rand(2, 10))
+ set_yield(rand(1, 10))
+ set_potency(rand(10, 35))
+ set_weed_rate(rand(1, 10))
+ set_weed_chance(rand(5, 100))
+ maturation = rand(6, 12)
+
+/obj/item/seeds/proc/add_random_reagents(lower = 0, upper = 2)
+ var/amount_random_reagents = rand(lower, upper)
+ for(var/i in 1 to amount_random_reagents)
+ var/random_amount = rand(4, 15) * 0.01 // this must be multiplied by 0.01, otherwise, it will not properly associate
+ var/datum/plant_gene/reagent/R = new(get_random_reagent_id(), random_amount)
+ if(R.can_add(src))
+ genes += R
+ else
+ qdel(R)
+ reagents_from_genes()
+
+/obj/item/seeds/proc/add_random_traits(lower = 0, upper = 2)
+ var/amount_random_traits = rand(lower, upper)
+ for(var/i in 1 to amount_random_traits)
+ var/random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type)))
+ var/datum/plant_gene/trait/T = new random_trait
+ if(T.can_add(src))
+ genes += T
+ else
+ qdel(T)
+
+/obj/item/seeds/proc/add_random_plant_type(normal_plant_chance = 75)
+ if(prob(normal_plant_chance))
+ var/random_plant_type = pick(subtypesof(/datum/plant_gene/trait/plant_type))
+ var/datum/plant_gene/trait/plant_type/P = new random_plant_type
+ if(P.can_add(src))
+ genes += P
+ else
+ qdel(P)
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
deleted file mode 100644
index 21dc0dad4af..00000000000
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ /dev/null
@@ -1,277 +0,0 @@
-#define DEFAULT_SEED "glowshroom"
-#define VINE_GROWTH_STAGES 5
-
-/proc/spacevine_infestation(var/potency_min=70, var/potency_max=100, var/maturation_min=5, var/maturation_max=15)
- spawn() //to stop the secrets panel hanging
- var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
- for(var/areapath in typesof(/area/hallway))
- var/area/A = locate(areapath)
- for(var/turf/simulated/floor/F in A.contents)
- if(turf_clear(F))
- turfs += F
-
- if(turfs.len) //Pick a turf to spawn at if we can
- var/turf/simulated/floor/T = pick(turfs)
- var/datum/seed/seed = plant_controller.create_random_seed(1)
- seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines.
- seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects.
- seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max))
-
- //make vine zero start off fully matured
- var/obj/effect/plant/vine = new(T,seed)
- vine.health = vine.max_health
- vine.mature_time = 0
- vine.process()
-
- message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z]) ")
-
-/obj/effect/dead_plant
- anchored = 1
- opacity = 0
- density = 0
- color = DEAD_PLANT_COLOUR
-
-/obj/effect/dead_plant/attack_hand()
- qdel(src)
-
-/obj/effect/dead_plant/attackby()
- ..()
- for(var/obj/effect/plant/neighbor in range(1))
- neighbor.update_neighbors()
- qdel(src)
-
-/obj/effect/plant
- name = "plant"
- anchored = 1
- opacity = 0
- density = 0
- icon = 'icons/obj/hydroponics_growing.dmi'
- icon_state = "bush4-1"
- layer = 3
- pass_flags = PASSTABLE
-
- var/health = 10
- var/max_health = 100
- var/growth_threshold = 0
- var/growth_type = 0
- var/max_growth = 0
-
- var/list/neighbors = list()
- var/obj/effect/plant/parent
- var/datum/seed/seed
- var/floor = 0
- var/spread_chance = 40
- var/spread_distance = 3
- var/evolve_chance = 2
- var/mature_time
- var/last_tick = 0
- var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant
-
- var/movable = 0
-
-/obj/effect/plant/Destroy()
- if(buckled_mob)
- unbuckle_mob()
- if(plant_controller)
- plant_controller.remove_plant(src)
- for(var/obj/effect/plant/neighbor in range(1,src))
- plant_controller.add_plant(neighbor)
- return ..()
-
-/obj/effect/plant/single
- spread_chance = 0
-
-/obj/effect/plant/New(var/newloc, var/datum/seed/newseed, var/obj/effect/plant/newparent)
- ..()
-
- if(!newparent)
- parent = src
- else
- parent = newparent
-
- if(!plant_controller)
- sleep(250) // ugly hack, should mean roundstart plants are fine.
- if(!plant_controller)
- to_chat(world, "Plant controller does not exist and [src] requires it. Aborting. ")
- qdel(src)
- return
-
- if(!istype(newseed))
- newseed = plant_controller.seeds[DEFAULT_SEED]
- seed = newseed
- if(!seed)
- qdel(src)
- return
-
- name = seed.display_name
- max_health = round(seed.get_trait(TRAIT_ENDURANCE)/2)
- if(seed.get_trait(TRAIT_SPREAD)==2)
- max_growth = VINE_GROWTH_STAGES
- growth_threshold = max_health/VINE_GROWTH_STAGES
- icon = 'icons/obj/hydroponics_vines.dmi'
- growth_type = 2 // Vines by default.
- if(seed.get_trait(TRAIT_CARNIVOROUS) == 2)
- growth_type = 1 // WOOOORMS.
- else if(!(seed.seed_noun in list("seeds","pits")))
- if(seed.seed_noun == "nodes")
- growth_type = 3 // Biomass
- else
- growth_type = 4 // Mold
- else
- max_growth = seed.growth_stages
- growth_threshold = max_health/seed.growth_stages
-
- if(max_growth > 2 && prob(50))
- max_growth-- //Ensure some variation in final sprite, makes the carpet of crap look less wonky.
-
- mature_time = world.time + seed.get_trait(TRAIT_MATURATION) + 15 //prevent vines from maturing until at least a few seconds after they've been created.
- spread_chance = seed.get_trait(TRAIT_POTENCY)
- if(growth_type == 0) //These don't spread far at all (glowshroom, glowberries, brown mold)
- spread_distance = round(spread_chance*0.1)
- else if(growth_type == 2 || growth_type == 3) //Vines and biomass can go further than worms and mold
- spread_distance = round(spread_chance*0.6)
- else //Worms and mold go a moderate distance
- spread_distance = round(spread_chance*0.3)
- update_icon()
-
- spawn(1) // Plants will sometimes be spawned in the turf adjacent to the one they need to end up in, for the sake of correct dir/etc being set.
- set_dir(calc_dir())
- update_icon()
- plant_controller.add_plant(src)
- // Some plants eat through plating.
- if(!isnull(seed.chems["facid"]))
- var/turf/T = get_turf(src)
- T.ex_act(prob(80) ? 3 : 2)
-
-/obj/effect/plant/update_icon()
- //TODO: should really be caching this.
- refresh_icon()
- if(growth_type == 0 && !floor)
- src.transform = null
- var/matrix/M = matrix()
- // should make the plant flush against the wall it's meant to be growing from.
- M.Translate(0,-(rand(12,14)))
- switch(dir)
- if(WEST)
- M.Turn(90)
- if(NORTH)
- M.Turn(180)
- if(EAST)
- M.Turn(270)
- src.transform = M
- var/icon_colour = seed.get_trait(TRAIT_PLANT_COLOUR)
- if(icon_colour)
- color = icon_colour
- // Apply colour and light from seed datum.
- if(seed.get_trait(TRAIT_BIOLUM))
- var/clr
- if(seed.get_trait(TRAIT_BIOLUM_COLOUR))
- clr = seed.get_trait(TRAIT_BIOLUM_COLOUR)
- set_light(1+round(seed.get_trait(TRAIT_POTENCY)/20), l_color = clr)
- return
- else
- set_light(0)
-
-/obj/effect/plant/proc/refresh_icon()
- var/growth = min(max_growth,round(health/growth_threshold))
- var/at_fringe = get_dist(src,parent)
- if(spread_distance > 5)
- if(at_fringe >= (spread_distance-3))
- max_growth--
- if(at_fringe >= (spread_distance-2))
- max_growth--
- max_growth = max(1,max_growth)
- if(growth_type > 0)
- switch(growth_type)
- if(1)
- icon_state = "worms"
- if(2)
- icon_state = "vines-[growth]"
- if(3)
- icon_state = "mass-[growth]"
- if(4)
- icon_state = "mold-[growth]"
- else
- icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]"
-
- if(growth>2 && growth == max_growth)
- layer = 5
- if(seed.get_trait(TRAIT_SPREAD) == 2)
- opacity = 1
- if(!isnull(seed.chems["woodpulp"]))
- density = 1
- else
- layer = 3
- density = 0
-
-/obj/effect/plant/proc/calc_dir(turf/location = loc)
- set background = 1
- var/direction = 16
-
- for(var/wallDir in cardinal)
- var/turf/newTurf = get_step(location,wallDir)
- if(newTurf.density)
- direction |= wallDir
-
- for(var/obj/effect/plant/shroom in location)
- if(shroom == src)
- continue
- if(shroom.floor) //special
- direction &= ~16
- else
- direction &= ~shroom.dir
-
- var/list/dirList = list()
-
- for(var/i=1,i<=16,i <<= 1)
- if(direction & i)
- dirList += i
-
- if(dirList.len)
- var/newDir = pick(dirList)
- if(newDir == 16)
- floor = 1
- newDir = 1
- return newDir
-
- floor = 1
- return 1
-
-/obj/effect/plant/attackby(var/obj/item/weapon/W, var/mob/user)
-
- plant_controller.add_plant(src)
-
- if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
- if(!seed)
- to_chat(user, "There is nothing to take a sample from.")
- return
- seed.harvest(user,0,1)
- health -= (rand(3,5)*10)
- else
- ..()
- if(W.force)
- health -= W.force
- check_health()
-
-/obj/effect/plant/ex_act(severity)
- switch(severity)
- if(1.0)
- die_off()
- return
- if(2.0)
- if(prob(50))
- die_off()
- return
- if(3.0)
- if(prob(5))
- die_off()
- return
- else
- return
-
-/obj/effect/plant/proc/check_health()
- if(health <= 0)
- die_off()
-
-/obj/effect/plant/proc/is_mature()
- return (health >= (max_health/3) && world.time > mature_time)
\ No newline at end of file
diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm
deleted file mode 100644
index b86c3966aa8..00000000000
--- a/code/modules/hydroponics/spreading/spreading_growth.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-#define NEIGHBOR_REFRESH_TIME 100
-
-/obj/effect/plant/proc/get_cardinal_neighbors()
- var/list/cardinal_neighbors = list()
- for(var/check_dir in cardinal)
- var/turf/simulated/T = get_step(get_turf(src), check_dir)
- if(istype(T))
- cardinal_neighbors |= T
- return cardinal_neighbors
-
-/obj/effect/plant/proc/update_neighbors()
- // Update our list of valid neighboring turfs.
- neighbors = list()
- for(var/turf/simulated/floor in get_cardinal_neighbors())
- if(get_dist(parent, floor) > spread_distance)
- continue
- if((locate(/obj/effect/plant) in floor.contents) || (locate(/obj/effect/dead_plant) in floor.contents) )
- continue
- if(floor.density)
- if(!isnull(seed.chems["pacid"]))
- spawn(rand(5,25)) floor.ex_act(3)
- continue
- if(!Adjacent(floor) || !floor.Enter(src))
- continue
- neighbors |= floor
- // Update all of our friends.
- var/turf/T = get_turf(src)
- for(var/obj/effect/plant/neighbor in range(1,src))
- neighbor.neighbors -= T
-
-/obj/effect/plant/process()
-
- // Something is very wrong, kill ourselves.
- if(!seed)
- die_off()
- return 0
-
- /* MOVED INTO code\game\objects\effects\effect_system.dm
- for(var/obj/effect/effect/smoke/chem/smoke in view(1, src))
- if(smoke.reagents.has_reagent("plantbgone"))
- die_off()
- return
- */
-
- // Handle life.
- var/turf/simulated/T = get_turf(src)
- if(istype(T))
- health -= seed.handle_environment(T,T.return_air(),null,null,1)
- if(health < max_health)
- health += rand(3,5)
- refresh_icon()
- if(health > max_health)
- health = max_health
- else if(health == max_health && !plant)
- plant = new(T,seed)
- plant.dir = src.dir
- plant.transform = src.transform
- plant.age = seed.get_trait(TRAIT_MATURATION)-1
- plant.update_icon()
- if(growth_type==0) //Vines do not become invisible.
- invisibility = INVISIBILITY_MAXIMUM
- else
- plant.layer = layer + 0.1
-
- if(buckled_mob)
- seed.do_sting(buckled_mob,src)
- if(seed.get_trait(TRAIT_CARNIVOROUS))
- seed.do_thorns(buckled_mob,src)
-
- if(world.time >= last_tick+NEIGHBOR_REFRESH_TIME)
- last_tick = world.time
- update_neighbors()
-
- if(is_mature() && neighbors.len && prob(spread_chance))
- //spread to 1-3 adjacent turfs depending on yield trait.
- var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3)
-
- for(var/i in 1 to max_spread)
- if(prob(spread_chance))
- sleep(rand(3,5))
- if(!neighbors.len)
- break
- var/turf/target_turf = pick(neighbors)
- var/obj/effect/plant/child = new(get_turf(src),seed,parent)
- spawn(1) // This should do a little bit of animation.
- child.loc = target_turf
- child.update_icon()
- // Update neighboring squares.
- for(var/obj/effect/plant/neighbor in range(1,target_turf))
- neighbor.neighbors -= target_turf
-
- // We shouldn't have spawned if the controller doesn't exist.
- check_health()
- if(neighbors.len || health != max_health)
- plant_controller.add_plant(src)
-
-/obj/effect/plant/proc/die_off()
- // Kill off our plant.
- if(plant) plant.die()
- // This turf is clear now, let our buddies know.
- for(var/turf/simulated/check_turf in get_cardinal_neighbors())
- if(!istype(check_turf))
- continue
- for(var/obj/effect/plant/neighbor in check_turf.contents)
- neighbor.neighbors |= check_turf
- plant_controller.add_plant(neighbor)
- spawn(1) if(src) qdel(src)
-
-#undef NEIGHBOR_REFRESH_TIME
\ No newline at end of file
diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm
deleted file mode 100644
index 8145cb13ad4..00000000000
--- a/code/modules/hydroponics/spreading/spreading_response.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/obj/effect/plant/HasProximity(var/atom/movable/AM)
-
- if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2)
- return
-
- var/mob/living/M = AM
- if(!istype(M))
- return
-
- if(!buckled_mob && !M.buckled && !M.anchored && ((M.mob_size <= MOB_SIZE_SMALL) || prob(round(seed.get_trait(TRAIT_POTENCY)/6))))
- //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation),
- //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines.
- spawn(1)
- entangle(M)
-
-/obj/effect/plant/attack_hand(mob/user as mob)
- // Todo, cause damage.
- user_unbuckle_mob(user, user)
-
-/obj/effect/plant/Crossed(var/mob/living/victim)
- if(!is_mature())
- return
- if(!istype(victim))
- return
- var/target_limb = pick("r_foot","l_foot","r_leg","l_leg")
- if(ishuman(victim))
- var/mob/living/carbon/human/H = victim
- if(H.shoes && prob(50)) //shoes will reduce chances of being stuck/stung by plants, but not always avoid it
- return
- seed.do_thorns(victim,src,target_limb)
- seed.do_sting(victim,src,target_limb)
-
-
-/obj/effect/plant/proc/entangle(var/mob/living/victim)
-
- if(buckled_mob)
- return
-
- if(victim.buckled)
- return
-
- //grabbing people
- if(!victim.anchored && Adjacent(victim) && victim.loc != get_turf(src))
- var/can_grab = 1
- if(istype(victim, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = victim
- if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags & NOSLIP))
- can_grab = 0
- if(can_grab)
- src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in! ")
- victim.loc = src.loc
-
- //entangling people
- if(victim.loc == src.loc)
- to_chat(victim, "Tendrils [pick("wind", "tangle", "tighten")] around you! ")
- can_buckle = 1
- buckle_mob(victim)
\ No newline at end of file
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
deleted file mode 100644
index 72bf80c58de..00000000000
--- a/code/modules/hydroponics/trays/tray.dm
+++ /dev/null
@@ -1,771 +0,0 @@
-/obj/machinery/portable_atmospherics/hydroponics
- name = "hydroponics tray"
- icon = 'icons/obj/hydroponics_machines.dmi'
- icon_state = "hydrotray3"
- density = 1
- anchored = 1
- flags = OPENCONTAINER
- volume = 100
-
- hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
-
- var/mechanical = 1 // Set to 0 to stop it from drawing the alert lights.
- var/base_name = "tray"
-
- // Plant maintenance vars.
- var/waterlevel = 100 // Water level (max 100)
- var/maxwater = 100
- var/nutrilevel = 10 // Nutrient level (max 10)
- var/maxnutri = 10
- var/pestlevel = 0 // Pests (max 10)
- var/weedlevel = 0 // Weeds (max 10)
-
- // Tray state vars.
- var/dead = 0 // Is it dead?
- var/harvest = 0 // Is it ready to harvest?
- var/age = 0 // Current plant age
- var/sampled = 0 // Have we taken a sample?
-
- // Harvest/mutation mods.
- var/yield_mod = 0 // Modifier to yield
- var/mutation_mod = 0 // Modifier to mutation chance
- var/toxins = 0 // Toxicity in the tray?
- var/tray_light = 1 // Supplied lighting.
-
- // Mechanical concerns.
- var/health = 0 // Plant health.
- var/lastproduce = 0 // Last time tray was harvested
- var/current_cycle = 0 // Used for tracking number of cycles for aging
- var/lastcycle = 0 // Cycle timing/tracking var.
- var/cycledelay = 150 // Delay per cycle.
- var/closed_system // If set, the tray will attempt to take atmos from a pipe.
- var/force_update // Set this to bypass the cycle time check.
- var/obj/temp_chem_holder // Something to hold reagents during process_reagents()
- var/labelled
-
- // Seed details/line data.
- var/datum/seed/seed = null // The currently planted seed
-
- // Construction
- var/unwrenchable = 1
-
- var/last_plant_ikey //This is for debugging reference, and is otherwise useless. --FalseIncarnate
-
- var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpolinate one plant
-
-/*
-* process() can be found in \code\modules\hydroponics\tray\tray_process.dm
-* reagent handling can be found in \code\modules\hydroponics\tray\tray_reagents.dm
-* icon handling can be found in \code\modules\hydroponics\tray\tray_update_icons.dm
-*/
-
-/obj/machinery/portable_atmospherics/hydroponics/AltClick()
- if(mechanical && !usr.stat && !usr.lying && Adjacent(usr))
- close_lid(usr)
- return
- return ..()
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/attack_generic(var/mob/user)
- if(istype(user,/mob/living/simple_animal/diona))
- var/mob/living/simple_animal/diona/nymph = user
-
- if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained())
- return
-
- if(weedlevel > 0)
- nymph.reagents.add_reagent("nutriment", weedlevel)
- weedlevel = 0
- plant_hud_set_weed()
- nymph.visible_message("[nymph] begins rooting through [src], ripping out weeds and eating them noisily. ","You begin rooting through [src], ripping out weeds and eating them noisily. ")
- else if(nymph.nutrition > 100 && nutrilevel < 10)
- nymph.nutrition -= ((10-nutrilevel)*5)
- nutrilevel = 10
- plant_hud_set_nutrient()
- nymph.visible_message("[nymph] secretes a trickle of green liquid, refilling [src]. ","You secrete a trickle of green liquid, refilling [src]. ")
- else
- nymph.visible_message("[nymph] rolls around in [src] for a bit. ","You roll around in [src] for a bit. ")
- return
-
-/obj/machinery/portable_atmospherics/hydroponics/New()
- ..()
-
- var/datum/atom_hud/data/hydroponic/hydro_hud = huds[DATA_HUD_HYDROPONIC]
- prepare_huds()
- hydro_hud.add_to_hud(src)
- plant_hud_set_nutrient()
- plant_hud_set_water()
- plant_hud_set_status()
- plant_hud_set_health()
- plant_hud_set_toxin()
- plant_hud_set_pest()
- plant_hud_set_weed()
-
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/hydroponics(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
-
- temp_chem_holder = new()
- temp_chem_holder.create_reagents(10)
-
- create_reagents(200)
- connect()
- update_icon()
- if(closed_system)
- flags &= ~OPENCONTAINER
-
-
-/obj/machinery/portable_atmospherics/hydroponics/upgraded/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/hydroponics(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(src)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
- RefreshParts()
-
-/obj/machinery/portable_atmospherics/hydroponics/RefreshParts()
- var/tmp_capacity = 0
- for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
- tmp_capacity += M.rating
- maxwater = tmp_capacity * 50 // Up to 300
- maxnutri = tmp_capacity * 5 // Up to 30
- //waterlevel = maxwater
- //nutrilevel = 3
- plant_hud_set_nutrient()
- plant_hud_set_water()
-
-/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
-
- //Don't act on seeds like dionaea that shouldn't change.
- if(seed && seed.get_trait(TRAIT_IMMUTABLE) > 0)
- return
-
- //--FalseIncarnate
- //Override for somatoray projectiles, updated to work with new mutation rework
- if(istype(Proj ,/obj/item/projectile/energy/floramut))
- mutate("F1")
- return
- else if(istype(Proj ,/obj/item/projectile/energy/florayield))
- mutate("F2")
- return
- //--FalseIncarnate
-
- ..()
-
-/obj/machinery/portable_atmospherics/hydroponics/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
-
- if(istype(mover) && mover.checkpass(PASSTABLE))
- return 1
- else
- return 0
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/check_health()
- if(seed && !dead && health <= 0)
- die()
- check_level_sanity()
- update_icon()
- plant_hud_set_status()
- plant_hud_set_health()
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/die()
- dead = 1
- harvest = 0
- weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
- pestlevel = 0
- plant_hud_set_status()
- plant_hud_set_health()
- plant_hud_set_weed()
- plant_hud_set_pest()
-
-//Harvests the product of a plant.
-/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user)
-
- //Harvest the product of the plant,
- if(!seed || !harvest)
- return
-
- if(closed_system)
- if(user)
- to_chat(user, "You can't harvest from the plant while the lid is shut.")
- return
-
- if(user)
- seed.harvest(user,yield_mod)
- else
- seed.harvest(get_turf(src),yield_mod)
- //Increases harvest count for round-end score
- //Currently per-plant (not per-item) harvested
- // --FalseIncarnate
- score_stuffharvested++
-
- // Reset values.
- harvest = 0
- lastproduce = age
-
- if(!seed.get_trait(TRAIT_HARVEST_REPEAT))
- yield_mod = 0
- seed = null
- dead = 0
- age = 0
- lastproduce = 0
- sampled = 0
- mutation_mod = 0
-
- check_health()
- return
-
-//Clears out a dead plant.
-/obj/machinery/portable_atmospherics/hydroponics/proc/remove_dead(var/mob/user)
- if(!user || !dead) return
-
- if(closed_system)
- to_chat(user, "You can't remove the dead plant while the lid is shut.")
- return
-
- seed = null
- dead = 0
-
- sampled = 0
- age = 0
- lastproduce = 0
- yield_mod = 0
- mutation_mod = 0
-
- to_chat(user, "You remove the dead plant.")
- check_health()
- return
-
-// If a weed growth is sufficient, this proc is called.
-/obj/machinery/portable_atmospherics/hydroponics/proc/weed_invasion()
-
- //Remove the seed if something is already planted.
- if(seed) seed = null
- seed = plant_controller.seeds[pick(list("reishi","nettles","amanita","mushrooms","plumphelmet","towercap","harebells","weeds"))]
- if(!seed) return //Weed does not exist, someone fucked up.
-
- dead = 0
- age = 0
- health = seed.get_trait(TRAIT_ENDURANCE)
- lastcycle = world.time
- harvest = 0
- lastproduce = 0
- weedlevel = 0
- pestlevel = 0
- sampled = 0
- update_icon()
- plant_hud_set_weed()
- plant_hud_set_status()
- plant_hud_set_health()
- visible_message("[src] has been overtaken by [seed.display_name]. ")
-
- return
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/mutate(var/severity)
-
- // No seed, no mutations.
- if(!seed)
- return
-
- /*
- --FalseIncarnate
- New mutation system, now uses "Mutation Tiers" to adjust the chances of mutations
- Tier 1 has a low chance of causing a stat mutation
- Tier 2 has a higher chance of causing a stat mutation
- Tier 3 has a low chance of causing a species shift (if possible), and will ALWAYS cause a stat mutation if it does not shift species
- Tier 4 has a higher chance of causing a species shift (if possible), and will ALWAYS cause a stat mutation if it does not shift species
- Tier 4 also has a low chance to cause a SECOND stat mutation when it does not shift species
- All mutation chances are increased by the mutation_mod value. Mutation_mod is not transferred into seeds/harvests, and is reset when the plant dies
- */
-
- switch(severity)
- //Reagent Tiers
- if(1) //Tier 1
- if(prob(20+mutation_mod)) //Low chance of stat mutation
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- if(2) //Tier 2
- if(prob(60+mutation_mod)) //Higher chance of stat mutation
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- if(3) //Tier 3
- if(prob(20+mutation_mod)) //Low chance of species shift mutation
- if(seed.mutants. && seed.mutants.len) //Check if current seed/plant has mutant species
- mutate_species()
- else //No mutant species, mutate stats instead
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- else //Failed to shift, mutate stats instead
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- if(4) //Tier 4
- if(prob(60+mutation_mod)) //Higher chance of species shift mutation
- if(seed.mutants. && seed.mutants.len) //Check if current seed/plant has mutant species
- mutate_species()
- else //No mutant species, mutate stats instead
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- if(prob(20+mutation_mod)) //Low chance for second stat mutation
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- else //Failed to shift, mutate stats instead
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- if(prob(20+mutation_mod)) //Low chance for second stat mutation
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- //Floral Somatoray Tiers
- if("F1") //Random Stat Tier
- if(prob(80+mutation_mod)) //EVEN Higher chance of stat mutation
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- seed.mutate(1,get_turf(src))
- return
- if("F2") //Yield Tier
- if(prob(40+mutation_mod)) //Medium chance of Yield stat mutation
- if(!isnull(plant_controller.seeds[seed.name]))
- seed = seed.diverge()
- else
- seed.update_name_prefixes()
- if(seed.get_trait(TRAIT_IMMUTABLE) <= 0 && seed.get_trait(TRAIT_YIELD) != -1) //Check if the plant can be mutated and has a yield to mutate
- seed.set_trait(TRAIT_YIELD, (seed.get_trait(TRAIT_YIELD) + rand(-2, 2))) //Randomly adjust yield
- if(seed.get_trait(TRAIT_YIELD) < 0) //If yield would drop below 0 after adjustment, set to 0 to allow further attempts
- seed.set_trait(TRAIT_YIELD, 0)
- return
-
- /* code references
- // We need to make sure we're not modifying one of the global seed datums.
- // If it's not in the global list, then no products of the line have been
- // harvested yet and it's safe to assume it's restricted to this tray.
- if(!isnull(seed_types[seed.name]))
- seed = seed.diverge()
- seed.mutate(severity,get_turf(src))
- */
-
- //--FalseIncarnate
-
-/obj/machinery/portable_atmospherics/hydroponics/verb/remove_label()
- set name = "Remove Label"
- set category = "Object"
- set src in view(1)
-
- if(usr.incapacitated())
- return
-
- if(labelled)
- to_chat(usr, "You remove the label.")
- labelled = null
- update_icon()
- else
- to_chat(usr, "There is no label to remove.")
- return
-
-/obj/machinery/portable_atmospherics/hydroponics/verb/setlight()
- set name = "Set Light"
- set category = "Object"
- set src in view(1)
-
- if(usr.incapacitated())
- return
-
- var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10)
- if(new_light)
- tray_light = new_light
- to_chat(usr, "You set the tray to a light level of [tray_light] lumens.")
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity()
- //Make sure various values are sane.
- if(seed)
- health = max(0,min(seed.get_trait(TRAIT_ENDURANCE),health))
- else
- health = 0
- dead = 0
-
- nutrilevel = max(0,min(nutrilevel,maxnutri))
- waterlevel = max(0,min(waterlevel,maxwater))
- pestlevel = max(0,min(pestlevel,10))
- weedlevel = max(0,min(weedlevel,10))
- toxins = max(0,min(toxins,10))
- yield_mod = min(100, yield_mod)
-
- plant_hud_set_nutrient()
- plant_hud_set_water()
- plant_hud_set_status()
- plant_hud_set_health()
- plant_hud_set_toxin()
- plant_hud_set_pest()
- plant_hud_set_weed()
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
-
- var/previous_plant = seed.display_name
- var/newseed = seed.get_mutant_variant()
- if(newseed in plant_controller.seeds)
- seed = plant_controller.seeds[newseed]
- else
- return
-
- dead = 0
- //mutate(1)
- age = 0
- health = seed.get_trait(TRAIT_ENDURANCE)
- lastcycle = world.time
- lastproduce = 0
- harvest = 0
- weedlevel = 0
-
- plant_hud_set_health()
- plant_hud_set_weed()
-
- update_icon()
- visible_message("\red The \blue [previous_plant] \red has suddenly mutated into \blue [seed.display_name]!")
-
- return
-
-
-/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(exchange_parts(user, O))
- return
-
- if(istype(O, /obj/item/weapon/crowbar))
- if(anchored==2)
- to_chat(user, "Unscrew the hoses first!")
- return
- default_deconstruction_crowbar(O, 1)
-
- //--FalseIncarnate
- //Check if held item is an open container
- if(O.is_open_container())
- //Check if container is of the "glass" subtype (includes buckets, beakers, vials)
- if(istype(O, /obj/item/weapon/reagent_containers/glass))
- var/obj/item/weapon/reagent_containers/glass/C = O
- //Check if container is empty
- if(!C.reagents.total_volume)
- to_chat(user, "\red [C] is empty.")
- return
- //Container not empty, transfer contents to tray
- var/trans = C.reagents.trans_to(src, C.amount_per_transfer_from_this)
- to_chat(user, "\blue You transfer [trans] units of the solution to [src].")
-
- check_level_sanity()
- process_reagents()
- update_icon()
-
- //Check if container is one of the plantsprays (defined in tray_reagents.dm)
- else if(istype(O, /obj/item/weapon/plantspray))
- var/obj/item/weapon/plantspray/P = O
- user.drop_item(O)
- toxins += P.toxicity
- pestlevel -= P.pest_kill_str
- weedlevel -= P.weed_kill_str
- to_chat(user, "You spray [src] with [O].")
- playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- qdel(O)
-
- check_level_sanity()
- update_icon()
-
- //Check if spray is weedkiller (defined in tray_reagents.dm, un-obtainable currently)
- else if(istype(O, /obj/item/weedkiller))
- var/obj/item/weedkiller/W = O
- user.drop_item(O)
- toxins += W.toxicity
- weedlevel -= W.weed_kill_str
- to_chat(user, "You spray [src] with [O].")
- playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- qdel(O)
-
- check_level_sanity()
- update_icon()
-
- //Check if container is any spray container
- else if(istype(O, /obj/item/weapon/reagent_containers/spray))
- var/obj/item/weapon/reagent_containers/spray/S = O
- //Check if there is a plant in the tray
- if(seed)
- if(!S.reagents.total_volume)
- to_chat(user, "\red [S] is empty.")
- return
- //Container not empty, transfer contents to tray
- S.reagents.trans_to(src, S.amount_per_transfer_from_this)
- visible_message("\red \The [src] has been sprayed with \the [O][(user ? " by [user]." : ".")]")
- playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- check_level_sanity()
- update_icon()
- else
- to_chat(user, "There's nothing in [src] to spray!")
-
- else if(istype(O, /obj/item/weapon/screwdriver) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY
- if(anchored)
- if(anchored == 2)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- anchored = 1
- to_chat(user, "You unscrew the [src]'s hoses.")
- panel_open = 0
-
- else if(anchored == 1)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- anchored = 2
- to_chat(user, "You screw in the [src]'s hoses.")
- panel_open = 1
-
- for(var/obj/machinery/portable_atmospherics/hydroponics/h in range(1,src))
- spawn()
- h.update_icon()
-
- if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/scalpel))
-
- if(!seed)
- to_chat(user, "There is nothing to take a sample from in \the [src].")
- return
-
- if(sampled)
- to_chat(user, "You have already sampled from this plant.")
- return
-
- if(dead)
- to_chat(user, "The plant is dead.")
- return
-
- // Create a sample.
- seed.harvest(user,yield_mod,1)
- health -= (rand(3,5)*10)
-
- if(prob(30))
- sampled = 1
-
- // Bookkeeping.
- check_health()
- force_update = 1
- process()
-
- return
-
- else if(istype(O, /obj/item/weapon/reagent_containers/syringe))
-
- var/obj/item/weapon/reagent_containers/syringe/S = O
-
- if(S.mode == 1)
- if(seed)
- return ..()
- else
- to_chat(user, "There's no plant to inject.")
- return 1
- else
- if(seed)
- //Leaving this in in case we want to extract from plants later.
- to_chat(user, "You can't get any extract out of this plant.")
- else
- to_chat(user, "There's nothing to draw something from.")
- return 1
-
- else if(istype(O, /obj/item/seeds))
-
- if(!seed)
-
- var/obj/item/seeds/S = O
- user.drop_item(O)
-
- if(!S.seed)
- to_chat(user, "The packet seems to be empty. You throw it away.")
- qdel(O)
- return
-
- to_chat(user, "You plant the [S.seed.seed_name] [S.seed.seed_noun].")
- seed = S.seed //Grab the seed datum.
- dead = 0
- age = 1
- lastproduce = 0
- //Snowflakey, maybe move this to the seed datum
- health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE))
- lastcycle = world.time
-
- qdel(O)
-
- check_health()
-
- else
- to_chat(user, "\The [src] already has seeds in it! ")
-
- else if(istype(O, /obj/item/weapon/minihoe)) // The minihoe
-
- if(weedlevel > 0)
- user.visible_message("[user] starts uprooting the weeds. ", "You remove the weeds from the [src]. ")
- weedlevel = 0
- update_icon()
- plant_hud_set_weed()
- else
- to_chat(user, "This plot is completely devoid of weeds. It doesn't need uprooting. ")
-
- else if(istype(O, /obj/item/weapon/storage/bag/plants))
-
- attack_hand(user)
-
- var/obj/item/weapon/storage/bag/plants/S = O
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
- if(!S.can_be_inserted(G))
- return
- S.handle_item_insertion(G, 1)
-
- else if(mechanical && istype(O, /obj/item/weapon/wrench))
-
- //If there's a connector here, the portable_atmospherics setup can handle it.
- if(locate(/obj/machinery/atmospherics/unary/portables_connector) in loc)
- return ..()
-
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- anchored = !anchored
- to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
-
- else if((istype(O, /obj/item/weapon/tank) && !( src.destroyed )))
- if(src.holding)
- to_chat(user, "\blue There is alreadu a tank loaded into the [src].")
- return
- var/obj/item/weapon/tank/T = O
- user.drop_item()
- T.loc = src
- src.holding = T
- update_icon()
- return
- else if(O && O.force && seed)
- user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [O]! ")
- if(!dead)
- health -= O.force
- check_health()
- return
-
-/obj/machinery/portable_atmospherics/hydroponics/attack_tk(mob/user as mob)
- if(dead)
- remove_dead(user)
- else if(harvest)
- harvest(user)
-
-/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user as mob)
-
- if(istype(usr,/mob/living/silicon))
- return
-
- if(harvest)
- harvest(user)
- else if(dead)
- remove_dead(user)
-
-/obj/machinery/portable_atmospherics/hydroponics/examine(mob/user)
- ..(user)
-
- if(!seed)
- to_chat(user, "[src] is empty.")
- return
-
- to_chat(user, "[seed.display_name] are growing here.")
-
- if(!Adjacent(user))
- return
-
- to_chat(user, "Water: [round(waterlevel,0.1)]/[maxwater]")
- to_chat(user, "Nutrient: [round(nutrilevel,0.1)]/[maxnutri]")
-
- if(weedlevel >= 5)
- to_chat(user, "\The [src] is infested with weeds !")
- if(pestlevel >= 5)
- to_chat(user, "\The [src] is infested with tiny worms !")
-
- if(dead)
- to_chat(user, "The plant is dead. ")
- else if(health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2))
- to_chat(user, "The plant looks unhealthy .")
-
- if(mechanical)
- var/turf/T = loc
- var/datum/gas_mixture/environment
-
- if(closed_system && (connected_port || holding))
- environment = air_contents
-
- if(!environment)
- if(istype(T))
- environment = T.return_air()
-
- if(!environment) //We're in a crate or nullspace, bail out.
- return
-
- var/light_string
- if(closed_system && mechanical)
- light_string = "that the internal lights are set to [tray_light] lumens"
- else
- var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
- var/light_available
- if(L)
- light_available = L.get_clamped_lum()*10
- else
- light_available = 5
- light_string = "a light level of [light_available] lumens"
-
- to_chat(user, "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K.")
-
-/obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb()
- set name = "Toggle Tray Lid"
- set category = "Object"
- set src in view(1)
- close_lid(usr)
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/close_lid(var/mob/living/user)
- if(!user || user.stat || user.restrained())
- return
-
- closed_system = !closed_system
- to_chat(user, "You [closed_system ? "close" : "open"] the tray's lid.")
- update_icon()
-
-/obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb()
- set name = "Eject Internal Tank"
- set category = "Object"
- set src in view(1)
- eject_tank(usr)
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/eject_tank(var/mob/living/user)
- if(!user || user.stat || user.restrained())
- return
-
- if(!holding)
- to_chat(usr, "\red There is no tank loaded into [src] to eject.")
-
- if(istype(holding, /obj/item/weapon/tank))
- to_chat(usr, "\blue You eject [holding.name] from [src].")
- holding.loc = loc
- holding = null
diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm
deleted file mode 100644
index 95d3a05e4bd..00000000000
--- a/code/modules/hydroponics/trays/tray_apiary.dm
+++ /dev/null
@@ -1,240 +0,0 @@
-//http://www.youtube.com/watch?v=-1GadTfGFvU
-//i could have done these as just an ordinary plant, but fuck it - there would have been too much snowflake code
-
-/obj/machinery/apiary
- name = "apiary tray"
- icon = 'icons/obj/hydroponics_machines.dmi'
- icon_state = "hydrotray3"
- density = 1
- anchored = 1
- var/nutrilevel = 0
- var/yieldmod = 1
- var/mut = 1
- var/toxic = 0
- var/dead = 0
- var/health = -1
- var/maxhealth = 100
- var/lastcycle = 0
- var/cycledelay = 100
- var/harvestable_honey = 0
- var/beezeez = 0
- var/swarming = 0
-
- var/bees_in_hive = 0
- var/list/owned_bee_swarms = list()
- var/hydrotray_type = /obj/machinery/portable_atmospherics/hydroponics
-
-//overwrite this after it's created if the apiary needs a custom machinery sprite
-/obj/machinery/apiary/New()
- ..()
- overlays += image('icons/obj/apiary_bees_etc.dmi', icon_state="apiary")
-
-/obj/machinery/apiary/bullet_act(var/obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
- if(istype(Proj ,/obj/item/projectile/energy/floramut))
- mut++
- else if(istype(Proj ,/obj/item/projectile/energy/florayield))
- if(!yieldmod)
- yieldmod += 1
-// to_chat(world, "Yield increased by 1, from 0, to a total of [myseed.yield]")
- else if(prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
- yieldmod += 1
-// to_chat(world, "Yield increased by 1, to a total of [myseed.yield]")
- else
- ..()
- return
-
-/obj/machinery/apiary/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/queen_bee))
- if(health > 0)
- to_chat(user, "\red There is already a queen in there.")
- else
- health = 10
- nutrilevel += 10
- user.drop_item()
- qdel(O)
- to_chat(user, "\blue You carefully insert the queen into [src], she gets busy making a hive.")
- bees_in_hive = 0
- else if(istype(O, /obj/item/beezeez))
- beezeez += 100
- nutrilevel += 10
- user.drop_item()
- if(health > 0)
- to_chat(user, "\blue You insert [O] into [src]. A relaxed humming appears to pick up.")
- else
- to_chat(user, "\blue You insert [O] into [src]. Now it just needs some bees.")
- qdel(O)
- else if(istype(O, /obj/item/weapon/minihoe))
- if(health > 0)
- to_chat(user, "You begin to dislodge the apiary from the tray, the bees don't like that. ")
- angry_swarm(user)
- else
- to_chat(user, "\blue You begin to dislodge the dead apiary from the tray.")
- if(do_after(user, 50, target = src))
- new hydrotray_type(src.loc)
- new /obj/item/apiary(src.loc)
- to_chat(user, "\red You dislodge the apiary from the tray.")
- qdel(src)
- else if(istype(O, /obj/item/weapon/bee_net))
- var/obj/item/weapon/bee_net/N = O
- if(N.caught_bees > 0)
- to_chat(user, "\blue You empty the bees into the apiary.")
- bees_in_hive += N.caught_bees
- N.caught_bees = 0
- else
- to_chat(user, "\blue There are no more bees in the net.")
- else if(istype(O, /obj/item/weapon/reagent_containers/glass))
- var/obj/item/weapon/reagent_containers/glass/G = O
- if(harvestable_honey > 0)
- if(health > 0)
- to_chat(user, "\red You begin to harvest the honey. The bees don't seem to like it.")
- angry_swarm(user)
- else
- to_chat(user, "\blue You begin to harvest the honey.")
- if(do_after(user,50, target = src))
- G.reagents.add_reagent("honey",harvestable_honey)
- harvestable_honey = 0
- to_chat(user, "\blue You successfully harvest the honey.")
- else
- to_chat(user, "\blue There is no honey left to harvest.")
- else
- angry_swarm(user)
- ..()
-
-/obj/machinery/apiary/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
-
- if(istype(mover) && mover.checkpass(PASSTABLE))
- return 1
- else
- return 0
-
-/obj/machinery/apiary/process()
-
- if(swarming > 0)
- swarming -= 1
- if(swarming <= 0)
- for(var/mob/living/simple_animal/bee/B in src.loc)
- bees_in_hive += B.strength
- qdel(B)
- else if(bees_in_hive < 10)
- for(var/mob/living/simple_animal/bee/B in src.loc)
- bees_in_hive += B.strength
- qdel(B)
-
- if(world.time > (lastcycle + cycledelay))
- lastcycle = world.time
- if(health < 0)
- return
-
- //magical bee formula
- if(beezeez > 0)
- beezeez -= 1
-
- nutrilevel += 2
- health += 1
- toxic = max(0, toxic - 1)
-
- //handle nutrients
- nutrilevel -= bees_in_hive / 10 + owned_bee_swarms.len / 5
- if(nutrilevel > 0)
- bees_in_hive += 1 * yieldmod
- if(health < maxhealth)
- health++
- else
- //nutrilevel is less than 1, so we're effectively subtracting here
- health += max(nutrilevel - 1, round(-health / 2))
- bees_in_hive += max(nutrilevel - 1, round(-bees_in_hive / 2))
- if(owned_bee_swarms.len)
- var/mob/living/simple_animal/bee/B = pick(owned_bee_swarms)
- B.target_turf = get_turf(src)
-
- //clear out some toxins
- if(toxic > 0)
- toxic -= 1
- health -= 1
-
- if(health <= 0)
- return
-
- //make a bit of honey
- if(harvestable_honey < 50)
- harvestable_honey += 0.5
-
- //make some new bees
- if(bees_in_hive >= 10 && prob(bees_in_hive * 10))
- var/mob/living/simple_animal/bee/B = new(get_turf(src), src)
- owned_bee_swarms.Add(B)
- B.mut = mut
- B.toxic = toxic
- bees_in_hive -= 1
-
- //find some plants, harvest
- for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src))
- if(H.seed && !H.dead && prob(owned_bee_swarms.len * 10))
- src.nutrilevel++
- H.nutrilevel++
- if(mut < H.mutation_mod - 1)
- mut = H.mutation_mod - 1
- else if(mut > H.mutation_mod - 1)
- H.mutation_mod = mut
-
- //flowers give us pollen (nutrients)
-/* - All plants should be giving nutrients to the hive.
- if(H.myseed.type == /obj/item/seeds/harebell || H.myseed.type == /obj/item/seeds/sunflowerseed)
- src.nutrilevel++
- H.nutrilevel++
-*/
- //have a few beneficial effects on nearby plants
- if(prob(10))
- H.lastcycle -= 5
- if(prob(10))
- H.seed.set_trait(TRAIT_ENDURANCE,max(H.seed.get_trait(TRAIT_ENDURANCE)*1.5,H.seed.get_trait(TRAIT_ENDURANCE)+1))
- if(H.toxins && prob(10))
- H.toxins = min(0, H.toxins - 1)
- toxic++
-
-/obj/machinery/apiary/proc/die()
- if(owned_bee_swarms.len)
- var/mob/living/simple_animal/bee/B = pick(owned_bee_swarms)
- B.target_turf = get_turf(src)
- B.strength -= 1
- if(B.strength <= 0)
- qdel(B)
- else if(B.strength <= 5)
- B.icon_state = "bees[B.strength]"
- bees_in_hive = 0
- health = 0
-
-/obj/machinery/apiary/proc/angry_swarm(var/mob/M)
- for(var/mob/living/simple_animal/bee/B in owned_bee_swarms)
- B.feral = 25
- B.target_mob = M
-
- swarming = 25
-
- while(bees_in_hive > 0)
- var/spawn_strength = bees_in_hive
- if(bees_in_hive >= 5)
- spawn_strength = 6
-
- var/mob/living/simple_animal/bee/B = new(get_turf(src), src)
- B.target_mob = M
- B.strength = spawn_strength
- B.feral = 25
- B.mut = mut
- B.toxic = toxic
- bees_in_hive -= spawn_strength
-
-/obj/machinery/apiary/verb/harvest_honeycomb()
- set src in oview(1)
- set name = "Harvest honeycomb"
- set category = "Object"
-
- while(health > 15)
- health -= 15
- var/obj/item/weapon/reagent_containers/food/snacks/honeycomb/H = new(src.loc)
- if(toxic > 0)
- H.reagents.add_reagent("toxin", toxic)
-
- to_chat(usr, "\blue You harvest the honeycomb from the hive. There is a wild buzzing!")
- angry_swarm(usr)
diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm
deleted file mode 100644
index 03568731dc5..00000000000
--- a/code/modules/hydroponics/trays/tray_process.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/obj/machinery/portable_atmospherics/hydroponics/process()
-
- /* MOVED INTO code\game\objects\effects\effect_system.dm
- // Handle nearby smoke if any.
- for(var/obj/effect/effect/smoke/chem/smoke in view(1, src))
- if(smoke.reagents.total_volume)
- smoke.reagents.copy_to(src, 5)
- */
-
- //Do this even if we're not ready for a plant cycle.
- process_reagents()
-
- // Update values every cycle rather than every process() tick.
- if(force_update)
- force_update = 0
- else if(world.time < (lastcycle + cycledelay))
- return
- lastcycle = world.time
-
- // Weeds like water and nutrients, there's a chance the weed population will increase.
- // Bonus chance if the tray is unoccupied.
- if(waterlevel > 10 && nutrilevel > 2 && prob(isnull(seed) ? 6 : 3))
- weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
- plant_hud_set_weed()
-
- // There's a chance for a weed explosion to happen if the weeds take over.
- // Plants that are themselves weeds (weed_tolerance > 10) are unaffected.
- if(weedlevel >= 10 && prob(10))
- if(!seed || weedlevel >= seed.get_trait(TRAIT_WEED_TOLERANCE))
- weed_invasion()
-
- // If there is no seed data (and hence nothing planted),
- // or the plant is dead, process nothing further.
- if(!seed || dead)
- if(mechanical) update_icon() //Harvesting would fail to set alert icons properly.
- return
-
- // Advance plant age.
- current_cycle++
- if(current_cycle == 3)
- age += 1 * HYDRO_SPEED_MULTIPLIER
- current_cycle = 0
-
- //Highly mutable plants have a chance of mutating every tick.
- if(seed.get_trait(TRAIT_IMMUTABLE) == -1)
- var/mut_prob = rand(1,100)
- if(mut_prob <= 5) mutate(mut_prob == 1 ? 2 : 1)
-
- // Maintain tray nutrient and water levels.
- if(seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) > 0 && nutrilevel > 0 && prob(25))
- nutrilevel -= max(0,seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) * HYDRO_SPEED_MULTIPLIER)
- plant_hud_set_nutrient()
- if(seed.get_trait(TRAIT_WATER_CONSUMPTION) > 0 && waterlevel > 0 && prob(25))
- waterlevel -= max(0,seed.get_trait(TRAIT_WATER_CONSUMPTION) * HYDRO_SPEED_MULTIPLIER)
- plant_hud_set_water()
-
- // Make sure the plant is not starving or thirsty. Adequate
- // water and nutrients will cause a plant to become healthier.
- var/healthmod = rand(1,3) * HYDRO_SPEED_MULTIPLIER
- if(seed.get_trait(TRAIT_REQUIRES_NUTRIENTS) && prob(35))
- health += (nutrilevel < 2 ? -healthmod : healthmod)
- if(seed.get_trait(TRAIT_REQUIRES_WATER) && prob(35))
- health += (waterlevel < 10 ? -healthmod : healthmod)
-
- // Check that pressure, heat and light are all within bounds.
- // First, handle an open system or an unconnected closed system.
- var/turf/T = loc
- var/datum/gas_mixture/environment
- // If we're closed, take from our internal sources.
- if(closed_system && (connected_port || holding))
- if(holding)
- air_contents = holding.air_contents
- environment = air_contents
- // If atmos input is not there, grab from turf.
- if(!environment && istype(T)) environment = T.return_air()
- if(!environment) return
-
- // Seed datum handles gasses, light and pressure.
- if(mechanical && closed_system)
- health -= seed.handle_environment(T,environment,tray_light, holding)
- else
- health -= seed.handle_environment(T,environment)
-
- T.air_update_turf()
-
- // If we're attached to a pipenet, then we should let the pipenet know we might have modified some gasses
- if(closed_system && connected_port)
- connected_port.parent.update = 1
-
- // Toxin levels beyond the plant's tolerance cause damage, but
- // toxins are sucked up each tick and slowly reduce over time.
- if(toxins > 0)
- var/toxin_uptake = max(1,round(toxins/10))
- if(toxins > seed.get_trait(TRAIT_TOXINS_TOLERANCE))
- health -= toxin_uptake
- toxins -= toxin_uptake
- plant_hud_set_toxin()
-
- // Check for pests and weeds.
- // Some carnivorous plants happily eat pests.
- if(pestlevel > 0)
- if(seed.get_trait(TRAIT_CARNIVOROUS))
- health += HYDRO_SPEED_MULTIPLIER
- pestlevel -= HYDRO_SPEED_MULTIPLIER
- else if(pestlevel >= seed.get_trait(TRAIT_PEST_TOLERANCE))
- health -= HYDRO_SPEED_MULTIPLIER
- plant_hud_set_pest()
-
- // Some plants thrive and live off of weeds.
- if(weedlevel > 0)
- if(seed.get_trait(TRAIT_PARASITE))
- health += HYDRO_SPEED_MULTIPLIER
- weedlevel -= HYDRO_SPEED_MULTIPLIER
- else if(weedlevel >= seed.get_trait(TRAIT_WEED_TOLERANCE))
- health -= HYDRO_SPEED_MULTIPLIER
- plant_hud_set_weed()
-
- // Handle life and death.
- // If the plant gets too old, begin killing it each cycle
- var/lifespan = 5 * seed.get_trait(TRAIT_MATURATION)
- if(age > lifespan)
- health -= rand(5,10) * HYDRO_SPEED_MULTIPLIER
-
- // When the plant dies, weeds thrive and pests die off.
- check_health()
-
- // If enough time (in cycles, not ticks) has passed since the plant was harvested, we're ready to harvest again.
- if((age > seed.get_trait(TRAIT_MATURATION)) && \
- ((age - lastproduce) > seed.get_trait(TRAIT_PRODUCTION)) && \
- (!harvest && !dead))
- harvest = 1
- lastproduce = age
-
- if(prob(5)) // On each tick, there's a chance the pest population will increase
- pestlevel += 0.5 * HYDRO_SPEED_MULTIPLIER
-
- // Some seeds will self-harvest if you don't keep a lid on them.
- if(seed && seed.can_self_harvest && harvest && !closed_system && prob(5))
- harvest()
-
- check_health()
- return
diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm
deleted file mode 100644
index e4f68e6d106..00000000000
--- a/code/modules/hydroponics/trays/tray_reagents.dm
+++ /dev/null
@@ -1,217 +0,0 @@
-
-//Process reagents being put into the tray.
-/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents()
-
- if(!reagents) return
-
- if(reagents.total_volume <= 0)
- return
-
- for(var/datum/reagent/R in reagents.reagent_list)
-
- var/reagent_total = reagents.get_reagent_amount(R.id)
-
- //These are here because they have checks that would clutter up the switch statement cases, and thus get handled after the switch(readability)
- var/water_value = 0
- var/health_value = 0
- var/production_stat_value = 0
- var/potency_stat_value = 0
-
-
- switch(R.id)
- /* EXAMPLE:
- *
- * if("example")
- * //Nutrients
- * nutrilevel += reagent_total *
- *
- * //Water
- * water_value =
- *
- * //Toxins
- * toxins += reagent_total *
- *
- * //Weeds and Pests
- * weedlevel += reagent_total *
- * pestlevel += reagent_total *
- *
- * //Mutagens
- * handle_mutagens(reagent_total, , )
- *
- * //Modifiers
- * yield_mod += reagent_total *
- * mutation_mod += reagent_total *
- *
- * //Health
- * health_value =
- *
- * //Production Stat
- * production_stat_value =
- *
- * //Potency Stat
- * potency_stat_value =
- *
- */
-
- if("adminordrazine")
- nutrilevel += reagent_total * 1
- water_value = 1
- weedlevel += reagent_total * -5
- pestlevel += reagent_total * -5
- yield_mod += reagent_total * 1
- mutation_mod += reagent_total * 1
- health_value = 1
- if("ammonia")
- nutrilevel += reagent_total * 1
- health_value = 0.5
- if("atrazine")
- toxins += reagent_total * 3
- weedlevel += reagent_total * -8
- mutation_mod += reagent_total * 0.2
- health_value = -2
- if("beer")
- nutrilevel += reagent_total * 0.25
- water_value = 0.7
- health_value = -0.05
- if("charcoal")
- toxins += reagent_total * -2
- if("chlorine")
- water_value = -0.5
- toxins += reagent_total * 1.5
- weedlevel += reagent_total * -3
- health_value = -1
- if("cryoxadone")
- toxins += reagent_total * -3
- if(seed && !dead)
- health += reagent_total * 3
- if("diethylamine")
- nutrilevel += reagent_total * 2
- pestlevel += reagent_total * -2
- health_value = 1
- if("eznutrient")
- nutrilevel += reagent_total * 1
- if("facid")
- toxins += reagent_total * 3
- weedlevel += reagent_total * -4
- health_value = -2
- if("fishwater")
- nutrilevel += reagent_total * 0.75
- water_value = 1
- if("fluorine")
- water_value = -0.5
- toxins = reagent_total * 2.5
- weedlevel += reagent_total * -4
- health_value = -2
- if("holywater")
- water_value = 1
- health_value = 0.1
- if("left4zed")
- nutrilevel += reagent_total * 1
- mutation_mod += reagent_total * 0.2
- if("milk")
- nutrilevel += reagent_total * 0.1
- water_value = 0.9
- if("mutagen")
- handle_mutagens(reagent_total, 1, 5)
- if("nutriment")
- nutrilevel += reagent_total * 1
- yield_mod += reagent_total * 0.15
- health_value = 0.25
- if("phosphorus")
- nutrilevel += reagent_total * 0.1
- water_value = -0.5
- weedlevel += reagent_total * -2
- health_value = -0.75
- if("plantmatter")
- nutrilevel += reagent_total * 1.25
- yield_mod += reagent_total * 0.15
- health_value = 0.25
- if("protein")
- nutrilevel += reagent_total * 1.75
- yield_mod += reagent_total * 0.15
- health_value = 0.25
- if("radium")
- toxins += reagent_total * 2
- handle_mutagens(reagent_total, 10, 10)
- mutation_mod += reagent_total * 0.2
- health_value = -1.5
- if("robustharvest")
- nutrilevel += reagent_total * 1
- yield_mod += reagent_total * 0.2
- if("sacid")
- toxins += reagent_total * 1.5
- weedlevel += reagent_total * -2
- health_value = -1
- if("saltpetre")
- health_value = 0.25
- production_stat_value = -0.02
- potency_stat_value = 0.01
- if("sodawater")
- nutrilevel += reagent_total * 0.1
- water_value = 1
- health_value = 0.1
- if("sugar")
- nutrilevel += reagent_total * 0.1
- weedlevel += reagent_total * 2
- pestlevel += reagent_total * 2
- if("toxin")
- toxins += reagent_total * 2
- if("water")
- water_value = 1
-
- //END SWITCH
-
- //Handle water changes
- if(water_value)
- var/water_change = 0
- water_change = reagent_total * water_value
- waterlevel += water_change
- if(water_value > 0) //adding water dilutes toxins
- toxins -= round(water_change/4)
-
- //Handle health and stat changes (these require a non-dead seed to be present)
- if(seed && !dead)
- //Health
- if(health_value)
- health += reagent_total * health_value
- //Stats
- if(seed.get_trait(TRAIT_IMMUTABLE) <= 0)
- //Production
- if(production_stat_value && seed.get_trait(TRAIT_PRODUCTION) > 2)
- if(!isnull(plant_controller.seeds[seed.name])) //This is so we don't affect plants in other trays unintentionally
- seed = seed.diverge(2) //ENHANCE!
- else
- seed.update_name_prefixes(2)
- var/new_production = seed.get_trait(TRAIT_PRODUCTION) + (reagent_total * production_stat_value)
- seed.set_trait(TRAIT_PRODUCTION, max(2, new_production)) //can't drop below 2 with this method
- //Potency
- if(potency_stat_value)
- if(!isnull(plant_controller.seeds[seed.name])) //This is so we don't affect plants in other trays unintentionally
- seed = seed.diverge(2) //ENHANCE!
- else
- seed.update_name_prefixes(2)
- var/new_potency = seed.get_trait(TRAIT_POTENCY) + (reagent_total * potency_stat_value)
- seed.set_trait(TRAIT_POTENCY, max(0, min(100, new_potency))) //can't go above 100 or below 0 with this method
-
- //END FOR LOOP
-
- reagents.clear_reagents()
- check_health() //This calls check_level_sanity, which is why it's not called from here directly
-
-/obj/machinery/portable_atmospherics/hydroponics/proc/handle_mutagens(var/amount, var/min_amount, var/step_amount)
- //shouldn't be getting called without having reagent values supplied
- if(!amount || !step_amount || !step_amount)
- return
- //shouldn't be getting called with negative values
- if(amount < 0 || min_amount < 0 || step_amount < 0)
- return
-
- if(amount > min_amount)
- if(amount >= min_amount + (3 * step_amount))
- mutate(4)
- else if(amount >= min_amount + (2 * step_amount))
- mutate(3)
- else if(amount >= min_amount + step_amount)
- mutate(2)
- else if(amount >= min_amount)
- mutate(1)
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
deleted file mode 100644
index d8c207c1c67..00000000000
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ /dev/null
@@ -1,70 +0,0 @@
-/obj/machinery/portable_atmospherics/hydroponics/soil
- name = "soil"
- icon_state = "soil"
- density = 0
- use_power = 0
- mechanical = 0
- tray_light = 0
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O,/obj/item/weapon/tank))
- return
- else if(istype(O,/obj/item/weapon/crowbar))
- return
- else
- ..()
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/New()
- ..()
- verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb
- verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/remove_label
- verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/setlight
- verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/CanPass()
- return 1
-
-// Holder for vine plants.
-// Icons for plants are generated as overlays, so setting it to invisible wouldn't work.
-// Hence using a blank icon.
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible
- name = "plant"
- icon = 'icons/obj/seeds.dmi'
- icon_state = "blank"
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/New(var/newloc,var/datum/seed/newseed)
- ..()
- seed = newseed
- dead = 0
- age = 1
- health = seed.get_trait(TRAIT_ENDURANCE)
- lastcycle = world.time
- pixel_y = rand(-5,5)
- check_health()
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/remove_dead()
- ..()
- qdel(src)
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/harvest()
- ..()
- if(!seed) // Repeat harvests are a thing.
- qdel(src)
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/die()
- qdel(src)
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/process()
- if(!seed)
- qdel(src)
- return
- else if(name=="plant")
- name = seed.display_name
- ..()
-
-/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/Destroy()
- // Check if we're masking a decal that needs to be visible again.
- for(var/obj/effect/plant/plant in get_turf(src))
- if(plant.invisibility == INVISIBILITY_MAXIMUM)
- plant.invisibility = initial(plant.invisibility)
- return ..()
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
deleted file mode 100644
index 4086403c6e0..00000000000
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ /dev/null
@@ -1,431 +0,0 @@
-//Analyzer, pestkillers, weedkillers, nutrients, hatchets, cutters, Rapid-Seed-Producer (RSP), corn cob.
-
-/obj/item/weapon/wirecutters/clippers
- name = "plant clippers"
- desc = "A tool used to take samples from plants."
-
-/obj/item/device/analyzer/plant_analyzer
- name = "plant analyzer"
- desc = "A scanner used to evaluate a plant's various areas of growth."
- icon = 'icons/obj/device.dmi'
- icon_state = "hydro"
- item_state = "analyzer"
- origin_tech = "magnets=1;biotech=1"
- var/form_title
- var/last_data
- var/print_cooldown = 0
- var/cooldown_length = 50 // Five seconds
-
-/obj/item/device/analyzer/plant_analyzer/proc/print_report_verb()
- set name = "Print Plant Report"
- set category = "Object"
- set src = usr
-
- if(usr.incapacitated())
- return
-
- print_report(usr)
-
-/obj/item/device/analyzer/plant_analyzer/Topic(href, href_list)
- if(..())
- return 1
-
- if(href_list["print"])
- print_report(usr)
-
-/obj/item/device/analyzer/plant_analyzer/proc/print_report(var/mob/living/user)
- if(!last_data)
- to_chat(user, "There is no scan data to print.")
- return
- if(print_cooldown > world.time)
- to_chat(user, "The printer is still cooling down. ")
- return
- print_cooldown = world.time + cooldown_length
-
- playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
- P.name = "paper - [form_title]"
- P.info = "[last_data]"
- if(istype(user,/mob/living/carbon/human) && !(user.l_hand && user.r_hand))
- user.put_in_hands(P)
- user.visible_message("\The [src] spits out a piece of paper.")
- return
-
-/obj/item/device/analyzer/plant_analyzer/attack_self(mob/user as mob)
- print_report(user)
- return 0
-
-/obj/item/device/analyzer/plant_analyzer/afterattack(obj/target, mob/user, flag)
- if(!flag) return
-
- var/datum/seed/grown_seed
- var/datum/reagents/grown_reagents
-
- //--FalseIncarnate
- var/IS_TRAY = 0 //used to track if the target is a hydroponics tray or soil. 1 if true, otherwise 0
- var/tray_age //age of the plant in the tray
- var/tray_weed_level //weed level of tray
- var/tray_pest_level //pest level of tray
- var/tray_toxins //toxicity of the tray
- var/tray_yield_mod //yield modifier of the tray
- var/tray_mutation_mod //mutation modifier of the tray
- //--FalseIncarnate
-
- if(istype(target,/obj/structure/table))
- return ..()
- else if(istype(target,/obj/item/weapon/reagent_containers/food/snacks/grown))
-
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = target
- grown_seed = plant_controller.seeds[G.plantname]
- grown_reagents = G.reagents
-
- else if(istype(target,/obj/item/weapon/grown))
-
- var/obj/item/weapon/grown/G = target
- grown_seed = plant_controller.seeds[G.plantname]
- grown_reagents = G.reagents
-
- else if(istype(target,/obj/item/seeds))
-
- var/obj/item/seeds/S = target
- grown_seed = S.seed
-
- else if(istype(target,/obj/machinery/portable_atmospherics/hydroponics))
-
- var/obj/machinery/portable_atmospherics/hydroponics/H = target
-
- //--FalseIncarnate
- //Flag the target as a tray for showing tray-specific stats
- IS_TRAY = 1
- //Save tray data to matching variables
- tray_age = H.age
- tray_weed_level = H.weedlevel
- tray_pest_level = H.pestlevel
- tray_toxins = H.toxins
- tray_yield_mod = H.yield_mod
- tray_mutation_mod = H.mutation_mod
- //--FalseIncarnate
-
- grown_seed = H.seed
- grown_reagents = H.reagents
-
- if(!grown_seed)
- to_chat(user, "[src] can tell you nothing about \the [target]. ")
- return
-
- form_title = "[grown_seed.seed_name] (#[grown_seed.uid])"
- var/dat = "Plant data for [form_title] "
- user.visible_message("[user] runs the scanner over \the [target]. ")
-
- dat += "General Data "
-
- dat += ""
- dat += "Endurance [grown_seed.get_trait(TRAIT_ENDURANCE)] "
- dat += "Yield [grown_seed.get_trait(TRAIT_YIELD)] "
- dat += "Maturation time [grown_seed.get_trait(TRAIT_MATURATION)] "
- dat += "Production time [grown_seed.get_trait(TRAIT_PRODUCTION)] "
- dat += "Potency [grown_seed.get_trait(TRAIT_POTENCY)] "
- dat += "Species Discovery Value [grown_seed.get_trait(TRAIT_RARITY)] "
-
- //--FalseIncarnate
- //Tray-specific stats like Age and Mutation Modifier, not shown if target was not a hydroponics tray or soil
- if(IS_TRAY == 1)
- dat += " "
- dat += "Age [tray_age] "
- dat += "Weed Level [tray_weed_level] "
- dat += "Pest Level [tray_pest_level] "
- dat += "Toxins [tray_toxins] "
- dat += "Yield Modifier [tray_yield_mod] "
- dat += "Mutation Modifier [tray_mutation_mod] "
- //--FalseIncarnate
-
- dat += "
"
-
- if(grown_reagents && grown_reagents.reagent_list && grown_reagents.reagent_list.len)
- dat += "Reagent Data "
-
- dat += " This sample contains: "
- for(var/datum/reagent/R in grown_reagents.reagent_list)
- dat += " - [R.id], [grown_reagents.get_reagent_amount(R.id)] unit(s)"
-
- dat += "Other Data "
-
- if(grown_seed.get_trait(TRAIT_HARVEST_REPEAT))
- dat += "This plant can be harvested repeatedly. "
-
- if(grown_seed.get_trait(TRAIT_IMMUTABLE) == -1)
- dat += "This plant is highly mutable. "
- else if(grown_seed.get_trait(TRAIT_IMMUTABLE) > 0)
- dat += "This plant does not possess genetics that are alterable. "
-
- if(grown_seed.get_trait(TRAIT_REQUIRES_NUTRIENTS))
- if(grown_seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) < 0.05)
- dat += "It consumes a small amount of nutrient fluid. "
- else if(grown_seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) > 0.2)
- dat += "It requires a heavy supply of nutrient fluid. "
- else
- dat += "It requires a supply of nutrient fluid. "
-
- if(grown_seed.get_trait(TRAIT_REQUIRES_WATER))
- if(grown_seed.get_trait(TRAIT_WATER_CONSUMPTION) < 1)
- dat += "It requires very little water. "
- else if(grown_seed.get_trait(TRAIT_WATER_CONSUMPTION) > 5)
- dat += "It requires a large amount of water. "
- else
- dat += "It requires a stable supply of water. "
-
- if(grown_seed.mutants && grown_seed.mutants.len)
- dat += "It exhibits a high degree of potential subspecies shift. "
-
- dat += "It thrives in a temperature of [grown_seed.get_trait(TRAIT_IDEAL_HEAT)] Kelvin."
-
- if(grown_seed.consume_gasses && grown_seed.consume_gasses.len)
- for(var/gas in grown_seed.consume_gasses)
- if(gas == "carbon_dioxide") gas = "carbon dioxide"
- if(gas == "toxins") gas = "plasma"
- dat += " It requires an environment rich in [gas] gas to thrive."
-
- if(grown_seed.exude_gasses && grown_seed.exude_gasses.len)
- for(var/gas in grown_seed.exude_gasses)
- if(gas == "carbon_dioxide") gas = "carbon dioxide"
- if(gas == "toxins") gas = "plasma"
- dat += " It releases [gas] gas as a byproduct of it's growth."
-
- if(grown_seed.get_trait(TRAIT_LOWKPA_TOLERANCE) < 20)
- dat += " It is well adapted to low pressure levels."
- if(grown_seed.get_trait(TRAIT_HIGHKPA_TOLERANCE) > 220)
- dat += " It is well adapted to high pressure levels."
-
- if(grown_seed.get_trait(TRAIT_HEAT_TOLERANCE) > 30)
- dat += " It is well adapted to a range of temperatures."
- else if(grown_seed.get_trait(TRAIT_HEAT_TOLERANCE) < 10)
- dat += " It is very sensitive to temperature shifts."
-
- dat += " It thrives in a light level of [grown_seed.get_trait(TRAIT_IDEAL_LIGHT)] lumen[grown_seed.get_trait(TRAIT_IDEAL_LIGHT) == 1 ? "" : "s"]."
-
- if(grown_seed.get_trait(TRAIT_LIGHT_TOLERANCE) > 10)
- dat += " It is well adapted to a range of light levels."
- else if(grown_seed.get_trait(TRAIT_LIGHT_TOLERANCE) < 3)
- dat += " It is very sensitive to light level shifts."
-
- if(grown_seed.get_trait(TRAIT_TOXINS_TOLERANCE) < 3)
- dat += " It is highly sensitive to toxins."
- else if(grown_seed.get_trait(TRAIT_TOXINS_TOLERANCE) > 6)
- dat += " It is remarkably resistant to toxins."
-
- if(grown_seed.get_trait(TRAIT_PEST_TOLERANCE) < 3)
- dat += " It is highly sensitive to pests."
- else if(grown_seed.get_trait(TRAIT_PEST_TOLERANCE) > 6)
- dat += " It is remarkably resistant to pests."
-
- if(grown_seed.get_trait(TRAIT_WEED_TOLERANCE) < 3)
- dat += " It is highly sensitive to weeds."
- else if(grown_seed.get_trait(TRAIT_WEED_TOLERANCE) > 6)
- dat += " It is remarkably resistant to weeds."
-
- switch(grown_seed.get_trait(TRAIT_SPREAD))
- if(1)
- dat += " It is able to be planted outside of a tray."
- if(2)
- dat += " It is a robust and vigorous vine that will spread rapidly."
-
- switch(grown_seed.get_trait(TRAIT_CARNIVOROUS))
- if(1)
- dat += " It is carniovorous and will eat tray pests for sustenance."
- if(2)
- dat += " It is carnivorous and poses a significant threat to living things around it."
-
- if(grown_seed.get_trait(TRAIT_PARASITE))
- dat += " It is capable of parisitizing and gaining sustenance from tray weeds."
- if(grown_seed.get_trait(TRAIT_ALTER_TEMP))
- dat += " It will periodically alter the local temperature by [grown_seed.get_trait(TRAIT_ALTER_TEMP)] Kelvin."
-
- if(grown_seed.get_trait(TRAIT_BIOLUM))
- dat += " It is [grown_seed.get_trait(TRAIT_BIOLUM_COLOUR) ? "bio-luminescent " : "bio-luminescent"]."
-
- if(grown_seed.get_trait(TRAIT_PRODUCES_POWER))
- dat += " The fruit will function as a battery if prepared appropriately."
-
- if(grown_seed.get_trait(TRAIT_BATTERY_RECHARGE))
- dat += " The fruit hums with an odd electrical energy."
-
- if(grown_seed.get_trait(TRAIT_STINGS))
- dat += " The fruit is covered in stinging spines."
-
- if(grown_seed.get_trait(TRAIT_JUICY) == 1)
- dat += " The fruit is soft-skinned and juicy."
- else if(grown_seed.get_trait(TRAIT_JUICY) == 2)
- dat += " The fruit is excessively juicy."
-
- if(grown_seed.get_trait(TRAIT_EXPLOSIVE))
- dat += " The fruit is internally unstable."
-
- if(grown_seed.get_trait(TRAIT_TELEPORTING))
- dat += " The fruit is temporal/spatially unstable."
-
- if(dat)
- last_data = dat
- dat += " \[print report \]"
- user << browse(dat,"window=plant_analyzer")
-
- return
-
-/obj/item/weapon/minihoe // -- Numbers
- name = "mini hoe"
- desc = "It's used for removing weeds or scratching your back."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "hoe"
- item_state = "hoe"
- flags = CONDUCT | NOBLUDGEON
- force = 5
- throwforce = 7
- w_class = 2
- materials = list(MAT_METAL=50)
- attack_verb = list("slashed", "sliced", "cut", "clawed")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-//Hatchets and things to kill kudzu
-/obj/item/weapon/hatchet
- name = "hatchet"
- desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "hatchet"
- flags = CONDUCT
- force = 12
- sharp = 1
- edge = 1
- w_class = 2
- throwforce = 15
- throw_speed = 4
- throw_range = 4
- materials = list(MAT_METAL=15000)
- origin_tech = "materials=2;combat=1"
- attack_verb = list("chopped", "torn", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/weapon/hatchet/unathiknife
- name = "duelling knife"
- desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "unathiknife"
- attack_verb = list("ripped", "torn", "cut")
-
-/obj/item/weapon/scythe
- icon_state = "scythe0"
- name = "scythe"
- desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
- force = 13
- throwforce = 5
- sharp = 1
- edge = 1
- throw_speed = 2
- throw_range = 3
- w_class = 4
- var/extend = 1
- flags = CONDUCT
- armour_penetration = 20
- slot_flags = SLOT_BACK
- origin_tech = "materials=2;combat=2"
- attack_verb = list("chopped", "sliced", "cut", "reaped")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
- if(!proximity) return
- if(istype(A, /obj/effect/plant) && extend == 1)
- for(var/obj/effect/plant/B in orange(A,1))
- if(prob(80))
- B.die_off(1)
- qdel(A)
-
-/obj/item/weapon/scythe/tele
- icon_state = "tscythe0"
- name = "telescopic scythe"
- desc = "A sharp and curved blade on a collapsable fibremetal handle, this tool is the pinnacle of covert reaping technology."
- force = 3.0
- sharp = 0
- edge = 0
- throw_speed = 2
- throw_range = 3
- w_class = 2
- extend = 0
- armour_penetration = 20
- slot_flags = SLOT_BELT
- origin_tech = "materials=3;combat=3"
- attack_verb = list("chopped", "sliced", "cut", "reaped")
- hitsound = "swing_hit"
-
-/obj/item/weapon/scythe/tele/attack_self(mob/user as mob)
- extend = !extend
- if(extend)
- to_chat(user, "With a flick of the wrist, you extend the scythe. It's reaping time! ")
- icon_state = "tscythe1"
- item_state = "scythe0"
- slot_flags &= ~SLOT_BELT
- w_class = 4 //doesnt fit in backpack when its on for balance
- force = 13 //normal scythe damage
- attack_verb = list("chopped", "sliced", "cut", "reaped")
- hitsound = 'sound/weapons/bladeslice.ogg'
- //Extend sound (blade unsheath)
- playsound(src.loc, 'sound/weapons/blade_unsheath.ogg', 50, 1) //Sound credit to Qat of Freesound.org
- else
- to_chat(user, "You collapse the scythe, folding it for easy storage. ")
- icon_state = "tscythe0"
- item_state = "tscythe0" //no sprite in other words
- slot_flags |= SLOT_BELT
- w_class = 2
- force = 3 //not so robust now
- attack_verb = list("hit", "poked")
- hitsound = "swing_hit"
- //Collapse sound (blade sheath)
- playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- H.update_inv_l_hand()
- H.update_inv_r_hand()
- add_fingerprint(user)
- if(!blood_DNA) return
- if(blood_overlay && (blood_DNA.len >= 1)) //updates blood overlay, if any
- overlays.Cut()//this might delete other item overlays as well but eeeeeeeh
-
- var/icon/I = new /icon(src.icon, src.icon_state)
- I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD)
- I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY)
- blood_overlay = I
-
- overlays += blood_overlay
-
- return
-
-/obj/item/weapon/rsp
- name = "\improper Rapid-Seed-Producer (RSP)"
- desc = "A device used to rapidly deploy seeds."
- icon = 'icons/obj/items.dmi'
- icon_state = "rcd"
- opacity = 0
- density = 0
- anchored = 0.0
- var/matter = 0
- var/mode = 1
- w_class = 3
-
-/obj/item/weapon/bananapeel
- name = "banana peel"
- desc = "A peel from a banana."
- icon = 'icons/obj/items.dmi'
- icon_state = "banana_peel"
- item_state = "banana_peel"
- w_class = 1
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/corncob
- name = "corn cob"
- desc = "A reminder of meals gone by."
- icon = 'icons/obj/harvest.dmi'
- icon_state = "corncob"
- item_state = "corncob"
- w_class = 1
- throwforce = 0
- throw_speed = 4
- throw_range = 20
diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm
deleted file mode 100644
index aac0822a283..00000000000
--- a/code/modules/hydroponics/trays/tray_update_icons.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-//Refreshes the icon and sets the luminosity
-/obj/machinery/portable_atmospherics/hydroponics/update_icon()
- // Update name.
- if(seed)
- if(mechanical)
- name = "[base_name] (#[seed.uid])"
- else
- name = "[seed.seed_name]"
- else
- name = initial(name)
-
- if(labelled)
- name += " ([labelled])"
-
- overlays.Cut()
- // Updates the plant overlay.
- if(!isnull(seed))
-
- if(mechanical && health <= (seed.get_trait(TRAIT_ENDURANCE) / 2))
- overlays += "over_lowhealth3"
-
- if(dead)
- var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-dead"
- var/image/dead_overlay = plant_controller.plant_icon_cache["[ikey]"]
- if(!dead_overlay)
- dead_overlay = image('icons/obj/hydroponics_growing.dmi', "[ikey]")
- dead_overlay.color = DEAD_PLANT_COLOUR
- overlays |= dead_overlay
- else
- if(!seed.growth_stages)
- seed.update_growth_stages()
- if(!seed.growth_stages)
- to_chat(world, "Seed type [seed.get_trait(TRAIT_PLANT_ICON)] cannot find a growth stage value. ")
- return
- var/overlay_stage = 1
- if(age >= seed.get_trait(TRAIT_MATURATION))
- overlay_stage = seed.growth_stages
- else
- var/maturation = seed.get_trait(TRAIT_MATURATION)/seed.growth_stages
- if(maturation < 1)
- maturation = 1
- overlay_stage = maturation ? max(1,round(age/maturation)) : 1
- var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-[overlay_stage]"
- var/image/plant_overlay = plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
- if(!plant_overlay)
- plant_overlay = image('icons/obj/hydroponics_growing.dmi', "[ikey]")
- plant_overlay.color = seed.get_trait(TRAIT_PLANT_COLOUR)
- plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] = plant_overlay
- overlays |= plant_overlay
- last_plant_ikey = ikey
-
- if(harvest && overlay_stage == seed.growth_stages)
- ikey = "[seed.get_trait(TRAIT_PRODUCT_ICON)]"
- var/image/harvest_overlay = plant_controller.plant_icon_cache["product-[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
- if(!harvest_overlay)
- harvest_overlay = image('icons/obj/hydroponics_products.dmi', "[ikey]")
- harvest_overlay.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- plant_controller.plant_icon_cache["product-[ikey]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"] = harvest_overlay
- overlays |= harvest_overlay
-
- //Draw the cover.
- if(closed_system)
- overlays += "hydrocover"
-
- //Updated the various alert icons.
- if(mechanical)
- if(waterlevel <= 10)
- overlays += "over_lowwater3"
- if(nutrilevel <= 2)
- overlays += "over_lownutri3"
- if(weedlevel >= 5 || pestlevel >= 5 || toxins >= 40)
- overlays += "over_alert3"
- if(harvest)
- overlays += "over_harvest3"
-
- // Update bioluminescence.
- if(seed)
- if(seed.get_trait(TRAIT_BIOLUM))
- var/clr
- if(seed.get_trait(TRAIT_BIOLUM_COLOUR))
- clr = seed.get_trait(TRAIT_BIOLUM_COLOUR)
- set_light(round(seed.get_trait(TRAIT_POTENCY)/10), l_color = clr)
- return
-
- set_light(0)
- return
\ No newline at end of file
diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm
index bdd73533c82..81af3a38395 100644
--- a/code/modules/karma/karma.dm
+++ b/code/modules/karma/karma.dm
@@ -1,8 +1,8 @@
proc/sql_report_karma(var/mob/spender, var/mob/receiver)
var/sqlspendername = sanitizeSQL(spender.name)
- var/sqlspenderkey = spender.key
+ var/sqlspenderkey = spender.ckey
var/sqlreceivername = sanitizeSQL(receiver.name)
- var/sqlreceiverkey = receiver.key
+ var/sqlreceiverkey = receiver.ckey
var/sqlreceiverrole = "None"
var/sqlreceiverspecial = "None"
@@ -24,7 +24,7 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver)
log_game("SQL ERROR during karma logging. Error : \[[err]\]\n")
- query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[receiver.key]'")
+ query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[receiver.ckey]'")
query.Execute()
var/karma
@@ -34,7 +34,7 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver)
karma = text2num(query.item[3])
if(karma == null)
karma = 1
- query = dbcon.NewQuery("INSERT INTO [format_table_name("karmatotals")] (byondkey, karma) VALUES ('[receiver.key]', [karma])")
+ query = dbcon.NewQuery("INSERT INTO [format_table_name("karmatotals")] (byondkey, karma) VALUES ('[receiver.ckey]', [karma])")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n")
@@ -52,10 +52,13 @@ var/list/karma_spenders = list()
/mob/proc/can_give_karma()
if(!client)
return 0
+ if(config.disable_karma)
+ to_chat(src, "Karma is disabled. ")
+ return 0
if(!ticker || !player_list.len || (ticker.current_state == GAME_STATE_PREGAME))
to_chat(src, "You can't award karma until the game has started. ")
return 0
- if(client.karma_spent || (key in karma_spenders))
+ if(client.karma_spent || (ckey in karma_spenders))
to_chat(src, "You've already spent your karma for the round. ")
return 0
return 1
@@ -70,7 +73,7 @@ var/list/karma_spenders = list()
if(!M.client)
to_chat(src, "That mob has no client connected at the moment. ")
return 0
- if(key == M.key)
+ if(ckey == M.ckey)
to_chat(src, "You can't spend karma on yourself! ")
return 0
if(client.address == M.client.address)
@@ -79,7 +82,7 @@ var/list/karma_spenders = list()
to_chat(src, "You can't spend karma on someone connected from the same IP. ")
return 0
return 1
-
+
/mob/verb/spend_karma_list()
set name = "Award Karma"
@@ -118,7 +121,8 @@ var/list/karma_spenders = list()
if(!M)
to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.")
return
- if(!can_give_karma_to_mob(M))
+ if(config.disable_karma) // this is here because someone thought it was a good idea to add an alert box before checking if they can even give a mob karma
+ to_chat(usr, "Karma is disabled. ")
return
if(alert("Give [M.name] good karma?", "Karma", "Yes", "No") != "Yes")
return
@@ -128,7 +132,7 @@ var/list/karma_spenders = list()
M.client.karma += 1
to_chat(usr, "Good karma spent on [M.name].")
client.karma_spent = 1
- karma_spenders += key
+ karma_spenders += ckey
var/special_role = "None"
var/assigned_role = "None"
@@ -147,6 +151,10 @@ var/list/karma_spenders = list()
set desc = "Reports how much karma you have accrued."
set category = "OOC"
+ if(config.disable_karma)
+ to_chat(src, "Karma is disabled. ")
+ return 0
+
var/currentkarma=verify_karma()
to_chat(usr, {" You have [currentkarma] available."})
return
@@ -154,10 +162,10 @@ var/list/karma_spenders = list()
/client/proc/verify_karma()
var/currentkarma=0
if(!dbcon.IsConnected())
- to_chat(usr, "\red Unable to connect to karma database. Please try again later. ")
+ to_chat(usr, "Unable to connect to karma database. Please try again later. ")
return
else
- var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM [format_table_name("karmatotals")] WHERE byondkey='[src.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM [format_table_name("karmatotals")] WHERE byondkey='[src.ckey]'")
query.Execute()
var/totalkarma
@@ -178,6 +186,10 @@ You've gained [totalkarma] total karma in your time here. "}
set desc = "Spend your hard-earned karma here"
set hidden = 1
+ if(config.disable_karma)
+ to_chat(src, "Karma is disabled. ")
+ return 0
+
karmashopmenu()
return
@@ -258,7 +270,7 @@ You've gained [totalkarma] total karma in your time here. "}
return
/client/proc/DB_job_unlock(var/job,var/cost)
- var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbjob
@@ -267,7 +279,7 @@ You've gained [totalkarma] total karma in your time here. "}
dbckey = query.item[2]
dbjob = query.item[3]
if(!dbckey)
- query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.key]','[job]')")
+ query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.ckey]','[job]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n")
@@ -298,7 +310,7 @@ You've gained [totalkarma] total karma in your time here. "}
return
/client/proc/DB_species_unlock(var/species,var/cost)
- var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbspecies
@@ -307,7 +319,7 @@ You've gained [totalkarma] total karma in your time here. "}
dbckey = query.item[2]
dbspecies = query.item[4]
if(!dbckey)
- query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.key]','[species]')")
+ query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.ckey]','[species]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n")
@@ -338,7 +350,7 @@ You've gained [totalkarma] total karma in your time here. "}
return
/client/proc/karmacharge(var/cost,var/refund = 0)
- var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.ckey]'")
query.Execute()
while(query.NextRow())
@@ -347,7 +359,7 @@ You've gained [totalkarma] total karma in your time here. "}
spent -= cost
else
spent += cost
- query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.key]'")
+ query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.ckey]'")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n")
@@ -380,10 +392,10 @@ You've gained [totalkarma] total karma in your time here. "}
else if(name == "Nanotrasen Recruiter")
cost = 10
else
- to_chat(usr, "\red That job is not refundable.")
+ to_chat(usr, "That job is not refundable. ")
return
- var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbjob
@@ -401,7 +413,7 @@ You've gained [totalkarma] total karma in your time here. "}
else if(type == "species")
typelist = splittext(dbspecies,",")
else
- to_chat(usr, "\red Type [type] is not a valid column.")
+ to_chat(usr, "Type [type] is not a valid column. ")
if(name in typelist)
typelist -= name
@@ -417,13 +429,13 @@ You've gained [totalkarma] total karma in your time here. "}
message_admins("[key_name(usr)] has been refunded [cost] karma for [type] [name].")
karmacharge(text2num(cost),1)
else
- to_chat(usr, "\red You have not bought [name].")
+ to_chat(usr, "You have not bought [name]. ")
else
- to_chat(usr, "\red Your ckey ([dbckey]) was not found.")
+ to_chat(usr, "Your ckey ([dbckey]) was not found. ")
/client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases
- var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbjob
diff --git a/code/modules/library/admin.dm b/code/modules/library/admin.dm
index 7e3abd91db9..83268c5eecb 100644
--- a/code/modules/library/admin.dm
+++ b/code/modules/library/admin.dm
@@ -29,13 +29,36 @@
to_chat(src, "Only administrators may use this command.")
return
+ holder.view_flagged_books()
+
+/datum/admins/proc/view_flagged_books()
+ if(!usr.client.holder)
+ return
+
+ var/dat = "ISBN Title Total Flags Options "
+
var/DBQuery/query = dbcon.NewQuery("SELECT id, title, flagged FROM [format_table_name("library")] WHERE flagged > 0 ORDER BY flagged DESC")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR getting flagged books. Error : \[[err]\]\n")
return
- var/i
- for(i = 0, query.NextRow(), i++)
- to_chat(usr, "[add_zero(query.item[1], 4)] ([query.item[2]]) - flagged [query.item[3]] times.")
- to_chat(usr, "[i] flagged books total.")
\ No newline at end of file
+ var/books = 0
+ while(query.NextRow())
+ books++
+ var/isbn = query.item[1]
+ dat += "[add_zero(isbn, 4)] [query.item[2]] [query.item[3]] "
+ dat += "View Content "
+ dat += "Unflag "
+ dat += "Delete "
+ dat += " "
+
+ dat += "
"
+
+ if(!books)
+ dat = "No flagged books! :) "
+
+ var/datum/browser/popup = new(usr, "admin_view_flagged_books", "Flagged Books", 700, 400)
+ popup.set_content(dat)
+ popup.open(0)
+
diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm
index 2c0932f1707..2decc555693 100644
--- a/code/modules/library/computers/checkout.dm
+++ b/code/modules/library/computers/checkout.dm
@@ -459,5 +459,5 @@
B.title = newbook.title
B.author = newbook.author
B.dat = newbook.content
- B.icon_state = "book[rand(1,9)]"
+ B.icon_state = "book[rand(1,16)]"
visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?")
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index f2272c97e96..96f88f3d9c4 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -31,7 +31,7 @@
I.forceMove(src)
update_icon()
-/obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params)
+/obj/structure/bookcase/attackby(obj/item/O as obj, mob/user as mob, params)
if(busy) //So that you can't mess with it while deconstructing
return 1
if(is_type_in_list(O, allowed_books))
@@ -51,11 +51,11 @@
else if(istype(O, /obj/item/weapon/wrench))
user.visible_message("[user] starts disassembling \the [src]. ", \
"You start disassembling \the [src]. ")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), O.usesound, 50, 1)
busy = 1
- if(do_after(user,50, target = src))
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 75, 1)
+ if(do_after(user, 50 * O.toolspeed, target = src))
+ playsound(get_turf(src), O.usesound, 75, 1)
user.visible_message("[user] disassembles \the [src]. ", \
"You disassemble \the [src]. ")
busy = 0
@@ -167,7 +167,7 @@
icon_state ="book"
throw_speed = 1
throw_range = 5
- w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
+ w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
burn_state = FLAMMABLE
@@ -201,7 +201,7 @@
/obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(carved)
if(!store)
- if(W.w_class < 3)
+ if(W.w_class < WEIGHT_CLASS_NORMAL)
user.drop_item()
W.forceMove(src)
store = W
@@ -276,7 +276,7 @@
if(carved)
return 1
to_chat(user, "You begin to carve out [title]. ")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway. ")
carved = 1
return 1
@@ -293,7 +293,7 @@
icon_state ="scanner"
throw_speed = 1
throw_range = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/obj/machinery/computer/library/checkout/computer // Associated computer - Modes 1 to 3 use this
var/obj/item/weapon/book/book // Currently scanned book
var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index ac6507ee720..6afe3f84518 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -217,8 +217,8 @@ var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "A
var/obj/item/weapon/book/b = new(loc)
b.dat = P.info
b.name = "Print Job #[rand(100, 999)]"
- b.icon_state = "book[rand(1,7)]"
+ b.icon_state = "book[rand(1,16)]"
qdel(P)
return 1
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
deleted file mode 100644
index fd92e6675f1..00000000000
--- a/code/modules/lighting/light_source.dm
+++ /dev/null
@@ -1,257 +0,0 @@
-/datum/light_source
- var/atom/top_atom
- var/atom/source_atom
-
- var/turf/source_turf
- var/light_power
- var/light_range
- var/light_color // string, decomposed by parse_light_color()
-
- var/lum_r
- var/lum_g
- var/lum_b
-
- var/tmp/applied_lum_r
- var/tmp/applied_lum_g
- var/tmp/applied_lum_b
-
- var/list/effect_str
- var/list/effect_turf
-
- var/applied
-
- var/vis_update //Whetever we should smartly recalculate visibility. and then only update tiles that became (in) visible to us
- var/needs_update
- var/destroyed
- var/force_update
-
-/datum/light_source/New(atom/owner, atom/top)
- source_atom = owner
- if(!source_atom.light_sources) source_atom.light_sources = list()
- source_atom.light_sources += src
- top_atom = top
- if(top_atom != source_atom)
- if(!top.light_sources) top.light_sources = list()
- top_atom.light_sources += src
-
- source_turf = top_atom
- light_power = source_atom.light_power
- light_range = source_atom.light_range
- light_color = source_atom.light_color
-
- parse_light_color()
-
- effect_str = list()
- effect_turf = list()
-
- update()
-
- return ..()
-
-/datum/light_source/proc/destroy()
- destroyed = 1
- force_update()
- if(source_atom && source_atom.light_sources) source_atom.light_sources -= src
- if(top_atom && top_atom.light_sources) top_atom.light_sources -= src
-
-/datum/light_source/proc/update(atom/new_top_atom)
- if(new_top_atom && new_top_atom != top_atom)
- if(top_atom != source_atom) top_atom.light_sources -= src
- top_atom = new_top_atom
- if(top_atom != source_atom)
- if(!top_atom.light_sources) top_atom.light_sources = list()
- top_atom.light_sources += src
-
- if(!needs_update) //Incase we're already updating either way.
- lighting_update_lights += src
- needs_update = 1
-
-/datum/light_source/proc/force_update()
- force_update = 1
- if(!needs_update) //Incase we're already updating either way.
- needs_update = 1
- lighting_update_lights += src
-
-/datum/light_source/proc/vis_update()
- if(!needs_update)
- needs_update = 1
- lighting_update_lights += src
-
- vis_update = 1
-
-/datum/light_source/proc/check()
- if(!source_atom || !light_range || !light_power)
- destroy()
- return 1
-
- if(!top_atom)
- top_atom = source_atom
- . = 1
-
- if(istype(top_atom, /turf))
- if(source_turf != top_atom)
- source_turf = top_atom
- . = 1
- else if(top_atom.loc != source_turf)
- source_turf = top_atom.loc
- . = 1
-
- if(source_atom.light_power != light_power)
- light_power = source_atom.light_power
- . = 1
-
- if(source_atom.light_range != light_range)
- light_range = source_atom.light_range
- . = 1
-
- if(light_range && light_power && !applied)
- . = 1
-
- if(source_atom.light_color != light_color)
- light_color = source_atom.light_color
- parse_light_color()
- . = 1
-
-/datum/light_source/proc/parse_light_color()
- if(light_color)
- lum_r = color2R(light_color) / 255
- lum_g = color2G(light_color) / 255
- lum_b = color2B(light_color) / 255
- else
- lum_r = 1
- lum_g = 1
- lum_b = 1
-
-#if LIGHTING_FALLOFF == 1 //circular
- #define LUM_DISTANCE(swapvar, O, T) swapvar = (O.x - T.x)**2 + (O.y - T.y)**2 + LIGHTING_HEIGHT
- #if LIGHTING_LAMBERTIAN == 1
- #define LUM_ATTENUATION(swapvar) swapvar = CLAMP01((1 - CLAMP01(sqrt(swapvar) / max(1,light_range))) * (1 / sqrt(swapvar + 1)))
- #else
- #define LUM_ATTENUATION(swapvar) swapvar = 1 - CLAMP01(sqrt(swapvar) / max(1,light_range))
- #endif
-#elif LIGHTING_FALLOFF == 2 //square
- #define LUM_DISTANCE(swapvar, O, T) swapvar = abs(O.x - T.x) + abs(O.y - T.y) + LIGHTING_HEIGHT
- #if LIGHTING_LAMBERTIAN == 1
- #define LUM_ATTENUATION(swapvar) swapvar = CLAMP01((1 - CLAMP01(swapvar / max(1,light_range))) * (1 / sqrt(swapvar**2 + 1)))
- #else
- #define LUM_ATTENUATION(swapvar) swapvar = CLAMP01(swapvar / max(1,light_range))
- #endif
-#endif
-
-#define LUM_FALLOFF(swapvar, O, T) \
- LUM_DISTANCE(swapvar, O, T); \
- LUM_ATTENUATION(swapvar);
-
-/datum/light_source/proc/apply_lum()
- applied = 1
-
- // Cache the applied lum counts.
- applied_lum_r = lum_r
- applied_lum_g = lum_g
- applied_lum_b = lum_b
-
- if(istype(source_turf))
- FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING)
- if(T.lighting_overlay)
- var/strength
- LUM_FALLOFF(strength, T, source_turf)
- strength *= light_power
-
- if(!strength) //Don't add turfs that aren't affected to the affected turfs.
- continue
-
- strength = round(strength, LIGHTING_ROUND_VALUE) //Screw sinking points.
-
- effect_str += strength
-
- T.lighting_overlay.update_lumcount(
- lum_r * strength,
- lum_g * strength,
- lum_b * strength
- )
-
- else
- effect_str += 0
-
- if(!T.affecting_lights)
- T.affecting_lights = list()
-
- T.affecting_lights += src
- effect_turf += T
- END_FOR_DVIEW
-
-/datum/light_source/proc/remove_lum()
- applied = 0
- var/i = 1
- for(var/turf/T in effect_turf)
- if(T.affecting_lights)
- T.affecting_lights -= src
-
- if(T.lighting_overlay)
- var/str = effect_str[i]
- T.lighting_overlay.update_lumcount(-str * applied_lum_r, -str * applied_lum_g, -str * applied_lum_b)
-
- i++
-
- effect_str.Cut()
- effect_turf.Cut()
-
-/datum/light_source/proc/forget_turf(turf/T)
- var/idx = effect_turf.Find(T)
- effect_turf.Cut(idx, idx + 1)
- effect_str.Cut(idx, idx + 1)
-
-//Smartly updates the lighting, only removes lum from and adds lum to turfs that actually got changed.
-//This is for lights that need to reconsider due to nearby opacity changes.
-//Stupid dumb copy pasta because BYOND and speed.
-/datum/light_source/proc/smart_vis_update()
- var/list/view[0]
- FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING)
- view += T //Filter out turfs.
- END_FOR_DVIEW
- //This is the part where we calculate new turfs (if any)
- var/list/new_turfs = view - effect_turf //This will result with all the tiles that are added.
- for(var/turf/T in new_turfs)
- if(T.lighting_overlay)
- LUM_FALLOFF(., T, source_turf)
- . *= light_power
-
- if(!.) //Don't add turfs that aren't affected to the affected turfs.
- continue
-
- . = round(., LIGHTING_ROUND_VALUE)
-
- effect_str += .
-
- T.lighting_overlay.update_lumcount(
- lum_r * .,
- lum_g * .,
- lum_b * .
- )
-
- else
- effect_str += 0
-
- if(!T.affecting_lights)
- T.affecting_lights = list()
-
- T.affecting_lights += src
- effect_turf += T
-
- var/list/old_turfs = effect_turf - view
- for(var/turf/T in old_turfs)
- //Insert not-so-huge copy paste from remove_lum().
- var/idx = effect_turf.Find(T) //Get the index, luckily Find() is cheap in small lists like this. (with small I mean under a couple thousand len)
- if(T.affecting_lights)
- T.affecting_lights -= src
-
- if(T.lighting_overlay)
- var/str = effect_str[idx]
- T.lighting_overlay.update_lumcount(-str * lum_r, -str * lum_g, -str * lum_b)
-
- effect_turf.Cut(idx, idx + 1)
- effect_str.Cut(idx, idx + 1)
-
-#undef LUM_FALLOFF
-#undef LUM_DISTANCE
-#undef LUM_ATTENUATION
\ No newline at end of file
diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm
new file mode 100644
index 00000000000..92923e6b0d5
--- /dev/null
+++ b/code/modules/lighting/lighting_area.dm
@@ -0,0 +1,9 @@
+/area
+ luminosity = TRUE
+ var/dynamic_lighting = TRUE
+
+/area/New()
+ . = ..()
+
+ if(dynamic_lighting)
+ luminosity = FALSE
\ No newline at end of file
diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm
index 92500ecc1d9..679f6fb86ef 100644
--- a/code/modules/lighting/lighting_atom.dm
+++ b/code/modules/lighting/lighting_atom.dm
@@ -1,19 +1,30 @@
/atom
var/light_power = 1 // intensity of the light
var/light_range = 0 // range in tiles of the light
- var/light_color // RGB string representing the colour of the light
+ var/light_color // Hexadecimal RGB string representing the colour of the light
var/datum/light_source/light
var/list/light_sources
-/atom/proc/set_light(l_range, l_power, l_color)
- if(l_power != null) light_power = l_power
- if(l_range != null) light_range = l_range
- if(l_color != null) light_color = l_color
+// Nonsensical value for l_color default, so we can detect if it gets set to null.
+#define NONSENSICAL_VALUE -99999
+/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE)
+ if(l_power != null)
+ light_power = l_power
+
+ if(l_range != null)
+ light_range = l_range
+
+ if(l_color != NONSENSICAL_VALUE)
+ light_color = l_color
update_light()
+#undef NONSENSICAL_VALUE
+
/atom/proc/update_light()
+ set waitfor = FALSE
+
if(!light_power || !light_range)
if(light)
light.destroy()
@@ -31,9 +42,14 @@
/atom/New()
. = ..()
+
if(light_power && light_range)
update_light()
+ if(opacity && isturf(loc))
+ var/turf/T = loc
+ T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guranteed to be on afterwards anyways.
+
/atom/Destroy()
if(light)
light.destroy()
@@ -62,11 +78,22 @@
new_loc.reconsider_lights()
/atom/proc/set_opacity(new_opacity)
- var/old_opacity = opacity
+ if(new_opacity == opacity)
+ return
+
opacity = new_opacity
var/turf/T = loc
- if(old_opacity != new_opacity && istype(T))
+ if(!isturf(T))
+ return
+
+ if(new_opacity == TRUE)
+ T.has_opaque_atom = TRUE
T.reconsider_lights()
+ else
+ var/old_has_opaque_atom = T.has_opaque_atom
+ T.recalc_atom_opacity()
+ if(old_has_opaque_atom != T.has_opaque_atom)
+ T.reconsider_lights()
/obj/item/equipped()
. = ..()
diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm
new file mode 100644
index 00000000000..907e7aab8b5
--- /dev/null
+++ b/code/modules/lighting/lighting_corner.dm
@@ -0,0 +1,125 @@
+/var/total_lighting_corners = 0
+/var/datum/lighting_corner/dummy/dummy_lighting_corner = new
+// Because we can control each corner of every lighting overlay.
+// And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't).
+// For the record: these should never ever ever be deleted, even if the turf doesn't have dynamic lighting.
+
+// This list is what the code that assigns corners listens to, the order in this list is the order in which corners are added to the /turf/corners list.
+/var/list/LIGHTING_CORNER_DIAGONAL = list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST)
+
+/datum/lighting_corner
+ var/list/turf/masters = list()
+ var/list/datum/light_source/affecting = list() // Light sources affecting us.
+ var/active = FALSE // TRUE if one of our masters has dynamic lighting.
+
+ var/x = 0
+ var/y = 0
+ var/z = 0
+
+ var/lum_r = 0
+ var/lum_g = 0
+ var/lum_b = 0
+
+ var/needs_update = FALSE
+
+ var/cache_r = LIGHTING_SOFT_THRESHOLD
+ var/cache_g = LIGHTING_SOFT_THRESHOLD
+ var/cache_b = LIGHTING_SOFT_THRESHOLD
+ var/cache_mx = 0
+
+ var/update_gen = 0
+
+/datum/lighting_corner/New(var/turf/new_turf, var/diagonal)
+ . = ..()
+
+ total_lighting_corners++
+
+ masters[new_turf] = turn(diagonal, 180)
+ z = new_turf.z
+
+ var/vertical = diagonal & ~(diagonal - 1) // The horizontal directions (4 and 8) are bigger than the vertical ones (1 and 2), so we can reliably say the lsb is the horizontal direction.
+ var/horizontal = diagonal & ~vertical // Now that we know the horizontal one we can get the vertical one.
+
+ x = new_turf.x + (horizontal == EAST ? 0.5 : -0.5)
+ y = new_turf.y + (vertical == NORTH ? 0.5 : -0.5)
+
+ // My initial plan was to make this loop through a list of all the dirs (horizontal, vertical, diagonal).
+ // Issue being that the only way I could think of doing it was very messy, slow and honestly overengineered.
+ // So we'll have this hardcode instead.
+ var/turf/T
+ var/i
+
+ // Diagonal one is easy.
+ T = get_step(new_turf, diagonal)
+ if (T) // In case we're on the map's border.
+ if (!T.corners)
+ T.corners = list(null, null, null, null)
+
+ masters[T] = diagonal
+ i = LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180))
+ T.corners[i] = src
+
+ // Now the horizontal one.
+ T = get_step(new_turf, horizontal)
+ if (T) // Ditto.
+ if (!T.corners)
+ T.corners = list(null, null, null, null)
+
+ masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates.
+ i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180))
+ T.corners[i] = src
+
+ // And finally the vertical one.
+ T = get_step(new_turf, vertical)
+ if (T)
+ if (!T.corners)
+ T.corners = list(null, null, null, null)
+
+ masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates.
+ i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180))
+ T.corners[i] = src
+
+ update_active()
+
+/datum/lighting_corner/proc/update_active()
+ active = FALSE
+ for (var/turf/T in masters)
+ if (T.lighting_overlay)
+ active = TRUE
+
+// God that was a mess, now to do the rest of the corner code! Hooray!
+/datum/lighting_corner/proc/update_lumcount(var/delta_r, var/delta_g, var/delta_b)
+ lum_r += delta_r
+ lum_g += delta_g
+ lum_b += delta_b
+
+ if (!needs_update)
+ needs_update = TRUE
+ lighting_update_corners += src
+
+/datum/lighting_corner/proc/update_overlays()
+
+ // Cache these values a head of time so 4 individual lighting overlays don't all calculate them individually.
+ var/mx = max(lum_r, lum_g, lum_b) // Scale it so 1 is the strongest lum, if it is above 1.
+ . = 1 // factor
+ if (mx > 1)
+ . = 1 / mx
+
+ else if (mx < LIGHTING_SOFT_THRESHOLD)
+ . = 0 // 0 means soft lighting.
+
+ cache_r = lum_r * . || LIGHTING_SOFT_THRESHOLD
+ cache_g = lum_g * . || LIGHTING_SOFT_THRESHOLD
+ cache_b = lum_b * . || LIGHTING_SOFT_THRESHOLD
+ cache_mx = mx
+
+ for (var/TT in masters)
+ var/turf/T = TT
+ if (T.lighting_overlay)
+ if (!T.lighting_overlay.needs_update)
+ T.lighting_overlay.needs_update = TRUE
+ lighting_update_overlays += T.lighting_overlay
+
+
+/datum/lighting_corner/dummy/New()
+ return
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
index 525de63a0af..6fe55eed0ff 100644
--- a/code/modules/lighting/lighting_overlay.dm
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -1,96 +1,74 @@
+/var/total_lighting_overlays = 0
/atom/movable/lighting_overlay
name = ""
mouse_opacity = 0
simulated = 0
anchored = 1
- flags = NOREACT
icon = LIGHTING_ICON
layer = LIGHTING_LAYER
invisibility = INVISIBILITY_LIGHTING
- color = "#000000"
+ color = LIGHTING_BASE_MATRIX
icon_state = "light1"
auto_init = 0 // doesn't need special init
+ blend_mode = BLEND_MULTIPLY
- var/lum_r
- var/lum_g
- var/lum_b
+ var/lum_r = 0
+ var/lum_g = 0
+ var/lum_b = 0
- var/needs_update
+ var/needs_update = FALSE
-/atom/movable/lighting_overlay/New()
+/atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE)
. = ..()
verbs.Cut()
+ total_lighting_overlays++
var/turf/T = loc //If this runtimes atleast we'll know what's creating overlays outside of turfs.
+ T.lighting_overlay = src
T.luminosity = 0
-
-/atom/movable/lighting_overlay/proc/get_clamped_lum(var/minlum = 0, var/maxlum = 1)
- var/lum = max(lum_r, lum_g, lum_b)
- if(lum <= minlum)
- return 0
- else if(lum >= maxlum)
- return 1
- else
- return (lum - minlum) / (maxlum - minlum)
-
-/atom/movable/lighting_overlay/proc/update_lumcount(delta_r, delta_g, delta_b)
- if(!delta_r && !delta_g && !delta_b) //Nothing is being changed all together.
+ if(no_update)
return
-
- var/should_update = 0
-
- if(!needs_update) //If this isn't true, we're already updating anyways.
- if(max(lum_r, lum_g, lum_b) < 1) //Any change that could happen WILL change appearance.
- should_update = 1
-
- else if(max(lum_r + delta_r, lum_g + delta_g, lum_b + delta_b) < 1) //The change would bring us under 1 max lum, again, guaranteed to change appearance.
- should_update = 1
-
- else //We need to make sure that the colour ratios won't change in this code block.
- var/mx1 = max(lum_r, lum_g, lum_b)
- var/mx2 = max(lum_r + delta_r, lum_g + delta_g, lum_b + delta_b)
-
- if(lum_r / mx1 != (lum_r + delta_r) / mx2 || lum_g / mx1 != (lum_g + delta_g) / mx2 || lum_b / mx1 != (lum_b + delta_b) / mx2) //Stuff would change.
- should_update = 1
-
- lum_r = max(lum_r + delta_r, 0) //Lum shouldn't drop below 1
- lum_g = max(lum_g + delta_g, 0)
- lum_b = max(lum_b + delta_b, 0)
-
- if(!needs_update && should_update)
- needs_update = 1
- lighting_update_overlays += src
+ update_overlay()
/atom/movable/lighting_overlay/proc/update_overlay()
+ set waitfor = FALSE
var/turf/T = loc
- if(istype(T)) //Incase we're not on a turf, pool ourselves, something happened.
- if(lum_r == lum_g && lum_r == lum_b) //greyscale
- blend_mode = BLEND_OVERLAY
- if(lum_r <= 0)
- T.luminosity = 0
- color = "#000000"
- alpha = 255
- else
- T.luminosity = 1
- color = "#000000"
- alpha = (1 - min(lum_r, 1)) * 255
+ if(!istype(T))
+ if(loc)
+ log_debug("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!")
else
- alpha = 255
- var/mx = max(lum_r, lum_g, lum_b)
- . = 1 // factor
- if(mx > 1)
- . = 1/mx
- blend_mode = BLEND_MULTIPLY
- color = rgb(lum_r * 255 * ., lum_g * 255 * ., lum_b * 255 * .)
- if(color != "#000000")
- T.luminosity = 1
- else //No light, set the turf's luminosity to 0 to remove it from view()
- T.luminosity = 0
- else
- //warning("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!") //fucking bullshit bugs means this spams when shuttles move, feel free to fix
- log_debug("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!")
+ log_debug("A lighting overlay realised it was in nullspace in update_overlay() and got pooled!")
qdel(src)
+ return
+
+ // To the future coder who sees this and thinks
+ // "Why didn't he just use a loop?"
+ // Well my man, it's because the loop performed like shit.
+ // And there's no way to improve it because
+ // without a loop you can make the list all at once which is the fastest you're gonna get.
+ // Oh it's also shorter line wise.
+ // Including with these comments.
+
+ // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are.
+ // No I seriously cannot think of a more efficient method, fuck off Comic.
+ var/datum/lighting_corner/cr = T.corners[3] || dummy_lighting_corner
+ var/datum/lighting_corner/cg = T.corners[2] || dummy_lighting_corner
+ var/datum/lighting_corner/cb = T.corners[4] || dummy_lighting_corner
+ var/datum/lighting_corner/ca = T.corners[1] || dummy_lighting_corner
+
+ var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx)
+
+ color = list(
+ cr.cache_r, cr.cache_g, cr.cache_b, 0,
+ cg.cache_r, cg.cache_g, cg.cache_b, 0,
+ cb.cache_r, cb.cache_g, cb.cache_b, 0,
+ ca.cache_r, ca.cache_g, ca.cache_b, 0,
+ 0, 0, 0, 1
+ )
+ luminosity = max > LIGHTING_SOFT_THRESHOLD
+
+
/atom/movable/lighting_overlay/singularity_act()
return
@@ -99,10 +77,13 @@
return
/atom/movable/lighting_overlay/Destroy()
- lighting_update_overlays -= src
+ total_lighting_overlays--
+ global.lighting_update_overlays -= src
+ global.lighting_update_overlays_old -= src
var/turf/T = loc
if(istype(T))
T.lighting_overlay = null
+ T.luminosity = 1
return ..()
diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm
deleted file mode 100644
index 916920393ba..00000000000
--- a/code/modules/lighting/lighting_process.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/datum/controller/process/lighting
- var/last_light_count = 0
- var/last_overlay_count = 0
-
-/datum/controller/process/lighting/doWork()
- var/list/lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from SCHECK don't cause things to be cut from the list without being updated.
- last_light_count = lighting_update_lights.len
- lighting_update_lights = null //Nulling it first because of http://www.byond.com/forum/?post=1854520
- lighting_update_lights = list()
-
- for(var/datum/light_source/L in lighting_update_lights_old)
- if(L.destroyed || L.check() || L.force_update)
- L.remove_lum()
- if(!L.destroyed)
- L.apply_lum()
-
- else if(L.vis_update) //We smartly update only tiles that became (in) visible to use.
- L.smart_vis_update()
-
- L.vis_update = 0
- L.force_update = 0
- L.needs_update = 0
-
- SCHECK
-
- var/list/lighting_update_overlays_old = lighting_update_overlays //Same as above.
- last_overlay_count = lighting_update_overlays.len
- lighting_update_overlays = null //Same as above
- lighting_update_overlays = list()
-
- for(var/atom/movable/lighting_overlay/O in lighting_update_overlays_old)
- O.update_overlay()
- O.needs_update = 0
-
- SCHECK
diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm
new file mode 100644
index 00000000000..981de658649
--- /dev/null
+++ b/code/modules/lighting/lighting_setup.dm
@@ -0,0 +1,16 @@
+/proc/create_all_lighting_overlays()
+ for(var/zlevel = 1 to world.maxz)
+ create_lighting_overlays_zlevel(zlevel)
+
+/proc/create_lighting_overlays_zlevel(var/zlevel)
+ ASSERT(zlevel)
+
+ for(var/turf/T in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)))
+ if(!T.dynamic_lighting)
+ continue
+
+ var/area/A = T.loc
+ if(!A.dynamic_lighting)
+ continue
+
+ new /atom/movable/lighting_overlay(T, TRUE)
diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm
new file mode 100644
index 00000000000..d878d8c4b6e
--- /dev/null
+++ b/code/modules/lighting/lighting_source.dm
@@ -0,0 +1,290 @@
+/var/total_lighting_sources = 0
+// This is where the fun begins.
+// These are the main datums that emit light.
+
+/datum/light_source
+ var/atom/top_atom // The atom we're emitting light from(for example a mob if we're from a flashlight that's being held).
+ var/atom/source_atom // The atom that we belong to.
+
+ var/turf/source_turf // The turf under the above.
+ var/light_power // Intensity of the emitter light.
+ var/light_range // The range of the emitted light.
+ var/light_color // The colour of the light, string, decomposed by parse_light_color()
+
+ // Variables for keeping track of the colour.
+ var/lum_r
+ var/lum_g
+ var/lum_b
+
+ // The lumcount values used to apply the light.
+ var/tmp/applied_lum_r
+ var/tmp/applied_lum_g
+ var/tmp/applied_lum_b
+
+ var/list/datum/lighting_corner/effect_str // List used to store how much we're affecting corners.
+ var/list/turf/affecting_turfs
+
+ var/applied = FALSE // Whether we have applied our light yet or not.
+
+ var/vis_update // Whether we should smartly recalculate visibility. and then only update tiles that became(in)visible to us.
+ var/needs_update // Whether we are queued for an update.
+ var/destroyed // Whether we are destroyed and need to stop emitting light.
+ var/force_update
+
+/datum/light_source/New(var/atom/owner, var/atom/top)
+ total_lighting_sources++
+ source_atom = owner // Set our new owner.
+ if(!source_atom.light_sources)
+ source_atom.light_sources = list()
+
+ source_atom.light_sources += src // Add us to the lights of our owner.
+ top_atom = top
+ if(top_atom != source_atom)
+ if(!top.light_sources)
+ top.light_sources = list()
+
+ top_atom.light_sources += src
+
+ source_turf = top_atom
+ light_power = source_atom.light_power
+ light_range = source_atom.light_range
+ light_color = source_atom.light_color
+
+ parse_light_color()
+
+ effect_str = list()
+ affecting_turfs = list()
+
+ update()
+
+
+ return ..()
+
+// Kill ourselves.
+/datum/light_source/proc/destroy()
+ total_lighting_sources--
+ destroyed = TRUE
+ force_update()
+ if(source_atom)
+ if(!source_atom.light_sources)
+ log_runtime(EXCEPTION("Atom [source_atom] was a light source, but lacked a light source list!\n"), source_atom)
+ else
+ source_atom.light_sources -= src
+
+ if(top_atom)
+ top_atom.light_sources -= src
+
+// Call it dirty, I don't care.
+// This is here so there's no performance loss on non-instant updates from the fact that the engine can also do instant updates.
+// If you're wondering what's with the "BYOND" argument: BYOND won't let me have a() macro that has no arguments :|.
+#define effect_update(BYOND) \
+ if(!needs_update) \
+ { \
+ lighting_update_lights += src; \
+ needs_update = TRUE; \
+ }
+
+// This proc will cause the light source to update the top atom, and add itself to the update queue.
+/datum/light_source/proc/update(var/atom/new_top_atom)
+ // This top atom is different.
+ if(new_top_atom && new_top_atom != top_atom)
+ if(top_atom != source_atom) // Remove ourselves from the light sources of that top atom.
+ top_atom.light_sources -= src
+
+ top_atom = new_top_atom
+
+ if(top_atom != source_atom)
+ if(!top_atom.light_sources)
+ top_atom.light_sources = list()
+
+ top_atom.light_sources += src // Add ourselves to the light sources of our new top atom.
+
+ effect_update(null)
+
+// Will force an update without checking if it's actually needed.
+/datum/light_source/proc/force_update()
+ force_update = 1
+
+ effect_update(null)
+
+// Will cause the light source to recalculate turfs that were removed or added to visibility only.
+/datum/light_source/proc/vis_update()
+ vis_update = 1
+
+ effect_update(null)
+
+// Will check if we actually need to update, and update any variables that may need to be updated.
+/datum/light_source/proc/check()
+ if(!source_atom || !light_range || !light_power)
+ destroy()
+ return 1
+
+ if(!top_atom)
+ top_atom = source_atom
+ . = 1
+
+ if(isturf(top_atom))
+ if(source_turf != top_atom)
+ source_turf = top_atom
+ . = 1
+ else if(top_atom.loc != source_turf)
+ source_turf = top_atom.loc
+ . = 1
+
+ if(source_atom.light_power != light_power)
+ light_power = source_atom.light_power
+ . = 1
+
+ if(source_atom.light_range != light_range)
+ light_range = source_atom.light_range
+ . = 1
+
+ if(light_range && light_power && !applied)
+ . = 1
+
+ if(source_atom.light_color != light_color)
+ light_color = source_atom.light_color
+ parse_light_color()
+ . = 1
+
+// Decompile the hexadecimal colour into lumcounts of each perspective.
+/datum/light_source/proc/parse_light_color()
+ if(light_color)
+ lum_r = GetRedPart (light_color) / 255
+ lum_g = GetGreenPart(light_color) / 255
+ lum_b = GetBluePart (light_color) / 255
+ else
+ lum_r = 1
+ lum_g = 1
+ lum_b = 1
+
+// Macro that applies light to a new corner.
+// It is a macro in the interest of speed, yet not having to copy paste it.
+// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line.
+// As such this all gets counted as a single line.
+// The braces and semicolons are there to be able to do this on a single line.
+
+#define APPLY_CORNER(C) \
+ . = LUM_FALLOFF(C, source_turf); \
+ \
+ . *= light_power; \
+ \
+ effect_str[C] = .; \
+ \
+ C.update_lumcount \
+ ( \
+ . * applied_lum_r, \
+ . * applied_lum_g, \
+ . * applied_lum_b \
+ );
+
+// I don't need to explain what this does, do I?
+#define REMOVE_CORNER(C) \
+ . = -effect_str[C]; \
+ C.update_lumcount \
+ ( \
+ . * applied_lum_r, \
+ . * applied_lum_g, \
+ . * applied_lum_b \
+ );
+
+// This is the define used to calculate falloff.
+#define LUM_FALLOFF(C, T)(1 - CLAMP01(sqrt((C.x - T.x) ** 2 +(C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range)))
+
+/datum/light_source/proc/apply_lum()
+ var/static/update_gen = 1
+ applied = 1
+
+ // Keep track of the last applied lum values so that the lighting can be reversed
+ applied_lum_r = lum_r
+ applied_lum_g = lum_g
+ applied_lum_b = lum_b
+
+ FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING)
+ if(!T.lighting_corners_initialised)
+ T.generate_missing_corners()
+
+ for(var/datum/lighting_corner/C in T.get_corners())
+ if(C.update_gen == update_gen)
+ continue
+
+ C.update_gen = update_gen
+ C.affecting += src
+
+ if(!C.active)
+ effect_str[C] = 0
+ continue
+
+ APPLY_CORNER(C)
+
+ if(!T.affecting_lights)
+ T.affecting_lights = list()
+
+ T.affecting_lights += src
+ affecting_turfs += T
+
+ update_gen++
+
+/datum/light_source/proc/remove_lum()
+ applied = FALSE
+
+ for(var/turf/T in affecting_turfs)
+ if(!T.affecting_lights)
+ T.affecting_lights = list()
+ else
+ T.affecting_lights -= src
+
+ affecting_turfs.Cut()
+
+ for(var/datum/lighting_corner/C in effect_str)
+ REMOVE_CORNER(C)
+
+ C.affecting -= src
+
+ effect_str.Cut()
+
+/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C)
+ if(effect_str.Find(C)) // Already have one.
+ REMOVE_CORNER(C)
+
+ APPLY_CORNER(C)
+
+/datum/light_source/proc/smart_vis_update()
+ var/list/datum/lighting_corner/corners = list()
+ var/list/turf/turfs = list()
+ FOR_DVIEW(var/turf/T, light_range, source_turf, 0)
+ if(!T.lighting_corners_initialised)
+ T.generate_missing_corners()
+ corners |= T.get_corners()
+ turfs += T
+
+ var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them.
+ affecting_turfs += L
+ for(var/turf/T in L)
+ if(!T.affecting_lights)
+ T.affecting_lights = list(src)
+ else
+ T.affecting_lights += src
+
+ L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights.
+ affecting_turfs -= L
+ for(var/turf/T in L)
+ T.affecting_lights -= src
+
+ for(var/datum/lighting_corner/C in corners - effect_str) // New corners
+ C.affecting += src
+ if(!C.active)
+ effect_str[C] = 0
+ continue
+
+ APPLY_CORNER(C)
+
+ for(var/datum/lighting_corner/C in effect_str - corners) // Old, now gone, corners.
+ REMOVE_CORNER(C)
+ C.affecting -= src
+ effect_str -= C
+
+#undef effect_update
+#undef LUM_FALLOFF
+#undef REMOVE_CORNER
+#undef APPLY_CORNER
diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm
deleted file mode 100644
index bdad6316395..00000000000
--- a/code/modules/lighting/lighting_system.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/var/list/lighting_update_lights = list()
-/var/list/lighting_update_overlays = list()
-
-/area/var/lighting_use_dynamic = 1
-
-// duplicates lots of code, but this proc needs to be as fast as possible.
-/proc/create_lighting_overlays(zlevel = 0)
- var/area/A
- if(zlevel == 0) // populate all zlevels
- for(var/turf/T in world)
- if(T.dynamic_lighting)
- A = T.loc
- if(A.lighting_use_dynamic)
- var/atom/movable/lighting_overlay/O = new(T)
- T.lighting_overlay = O
-
- else
- for(var/x = 1; x <= world.maxx; x++)
- for(var/y = 1; y <= world.maxy; y++)
- var/turf/T = locate(x, y, zlevel)
- if(T.dynamic_lighting)
- A = T.loc
- if(A.lighting_use_dynamic)
- var/atom/movable/lighting_overlay/O = new(T)
- T.lighting_overlay = O
\ No newline at end of file
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
index 53d9ab0455c..ddb934aed61 100644
--- a/code/modules/lighting/lighting_turf.dm
+++ b/code/modules/lighting/lighting_turf.dm
@@ -1,26 +1,102 @@
/turf
- var/list/affecting_lights
- var/atom/movable/lighting_overlay/lighting_overlay
+ var/dynamic_lighting = TRUE
+ luminosity = 1
+ var/tmp/lighting_corners_initialised = FALSE
+
+ var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf.
+ var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay.
+ var/tmp/list/datum/lighting_corner/corners
+ var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile.
+
+/turf/New()
+ . = ..()
+
+ if(opacity)
+ has_opaque_atom = TRUE
+
+// Causes any affecting light sources to be queued for a visibility update, for example a door got opened.
/turf/proc/reconsider_lights()
for(var/datum/light_source/L in affecting_lights)
L.vis_update()
-/turf/proc/lighting_clear_overlays()
+/turf/proc/lighting_clear_overlay()
if(lighting_overlay)
qdel(lighting_overlay)
-/turf/proc/lighting_build_overlays()
+ for(var/datum/lighting_corner/C in corners)
+ C.update_active()
+
+// Builds a lighting overlay for us, but only if our area is dynamic.
+/turf/proc/lighting_build_overlay()
if(lighting_overlay)
return
var/area/A = loc
- if(A.lighting_use_dynamic)
- var/atom/movable/lighting_overlay/O = new(src)
- lighting_overlay = O
- // forcibly refresh lighting on this tile
- // must make light forget tile or it wil remain
- // convinced that it is already lighting it
- for(var/datum/light_source/L in affecting_lights)
- L.forget_turf(src)
- L.vis_update()
\ No newline at end of file
+ if(A.dynamic_lighting)
+ if(!lighting_corners_initialised)
+ generate_missing_corners()
+
+ new /atom/movable/lighting_overlay(src)
+
+ for(var/datum/lighting_corner/C in corners)
+ if(!C.active) // We would activate the corner, calculate the lighting for it.
+ for(var/L in C.affecting)
+ var/datum/light_source/S = L
+ S.recalc_corner(C)
+
+ C.active = TRUE
+
+// Used to get a scaled lumcount.
+/turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1)
+ if(!lighting_overlay)
+ return 1
+
+ var/totallums = 0
+ for(var/datum/lighting_corner/L in corners)
+ totallums += max(L.lum_r, L.lum_g, L.lum_b)
+
+ totallums /= 4 // 4 corners, max channel selected, return the average
+
+ totallums =(totallums - minlum) /(maxlum - minlum)
+
+ return CLAMP01(totallums)
+
+// Can't think of a good name, this proc will recalculate the has_opaque_atom variable.
+/turf/proc/recalc_atom_opacity()
+ has_opaque_atom = FALSE
+ for(var/atom/A in src.contents + src) // Loop through every movable atom on our tile PLUS ourselves (we matter too...)
+ if(A.opacity)
+ has_opaque_atom = TRUE
+
+// If an opaque movable atom moves around we need to potentially update visibility.
+/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc)
+ . = ..()
+
+ if(Obj && Obj.opacity)
+ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case.
+ reconsider_lights()
+
+/turf/Exited(var/atom/movable/Obj, var/atom/newloc)
+ . = ..()
+
+ if(Obj && Obj.opacity)
+ recalc_atom_opacity() // Make sure to do this before reconsider_lights(), incase we're on instant updates.
+ reconsider_lights()
+
+/turf/proc/get_corners()
+ if(has_opaque_atom)
+ return null // Since this proc gets used in a for loop, null won't be looped though.
+
+ return corners
+
+/turf/proc/generate_missing_corners()
+ lighting_corners_initialised = TRUE
+ if(!corners)
+ corners = list(null, null, null, null)
+
+ for(var/i = 1 to 4)
+ if(corners[i]) // Already have a corner on this direction.
+ continue
+
+ corners[i] = new /datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i])
diff --git a/code/modules/lighting/~lighting_undefs.dm b/code/modules/lighting/~lighting_undefs.dm
index 09100322b8a..2de3f9dbe26 100644
--- a/code/modules/lighting/~lighting_undefs.dm
+++ b/code/modules/lighting/~lighting_undefs.dm
@@ -1,9 +1,7 @@
-#undef LIGHTING_INTERVAL
-
#undef LIGHTING_FALLOFF
#undef LIGHTING_LAMBERTIAN
#undef LIGHTING_HEIGHT
-#undef LIGHTING_RESOLUTION
-#undef LIGHTING_LAYER
-#undef LIGHTING_ICON
\ No newline at end of file
+#undef LIGHTING_ICON
+
+#undef LIGHTING_BASE_MATRIX
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index 971dc69a1b6..3f1705f4651 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -172,7 +172,7 @@
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 10
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 10
force_wielded = 24
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index cd229550880..c7212fe5a15 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -22,7 +22,7 @@
switch(loot)
if(1 to 5) //5% chance
new /obj/item/weapon/reagent_containers/food/drinks/bottle/rum(src)
- new /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src)
+ new /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus(src)
new /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src)
new /obj/item/weapon/lighter(src)
if(6 to 10)
@@ -41,11 +41,9 @@
if(21 to 25)
for(var/i in 1 to 5)
new /obj/item/weapon/contraband/poster(src)
- if(26 to 30)
+ if(26 to 35)
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/glass/beaker/noreact(src)
- if(31 to 35)
- new /obj/item/seeds/cash(src)
if(36 to 40)
new /obj/item/weapon/melee/baton(src)
if(41 to 45)
@@ -65,7 +63,7 @@
if(57 to 58)
new /obj/item/toy/syndicateballoon(src)
if(59 to 60)
- new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(src)
+ new /obj/item/borg/upgrade/modkit/aoe/mobs(src)
new /obj/item/clothing/suit/space(src)
new /obj/item/clothing/head/helmet/space(src)
if(61 to 62)
diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm
index 83f9c871f44..2ce3f8d6195 100644
--- a/code/modules/mining/coins.dm
+++ b/code/modules/mining/coins.dm
@@ -7,7 +7,7 @@
flags = CONDUCT
force = 1
throwforce = 2
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/string_attached
var/list/sideslist = list("heads","tails")
var/cmineral = null
@@ -134,7 +134,7 @@
"uranium" = /obj/item/clothing/gloves/ring/uranium)
var/typekey = typelist[cmineral]
if(ispath(typekey))
- to_chat(user, "\blue You make [src] into a ring.")
+ to_chat(user, "You make [src] into a ring. ")
new typekey(get_turf(loc))
qdel(src)
else ..()
@@ -149,4 +149,4 @@
if(do_after(user, 15, target = src))
user.visible_message("[user] has flipped [src]. It lands on [coinflip]. ", \
"You flip [src]. It lands on [coinflip]. ", \
- "You hear the clattering of loose change. ")
\ No newline at end of file
+ "You hear the clattering of loose change. ")
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index e573c20840e..8bb891834a9 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -112,8 +112,14 @@
return
if(panel_open)
if(istype(W, /obj/item/weapon/crowbar))
+ if(inserted_id)
+ inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
empty_content()
default_deconstruction_crowbar(W)
+ if(ismultitool(W))
+ input_dir = turn(input_dir, -90)
+ output_dir = turn(output_dir, -90)
+ to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)]. ")
return
if(default_unfasten_wrench(user, W))
return
@@ -139,11 +145,14 @@
qdel(O)//No refined type? Purge it.
return
-/obj/machinery/mineral/ore_redemption/attack_hand(user as mob)
+/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
if(..())
return
interact(user)
+/obj/machinery/mineral/ore_redemption/attack_ghost(mob/user)
+ interact(user)
+
/obj/machinery/mineral/ore_redemption/interact(mob/user)
user.set_machine(src)
@@ -194,7 +203,8 @@
/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(href_list["choice"])
if(istype(inserted_id))
if(href_list["choice"] == "eject")
@@ -211,11 +221,12 @@
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I))
if(!usr.drop_item())
- return
+ return 1
I.loc = src
inserted_id = I
else
to_chat(usr, "No valid ID. ")
+
if(href_list["release"])
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user.
if(!(text2path(href_list["release"]) in stack_list)) return
@@ -230,6 +241,7 @@
stack_list -= text2path(href_list["release"])
else
to_chat(usr, "Required access not found. ")
+
if(href_list["plasteel"])
if(check_access(inserted_id) || allowed(usr))
if(!(/obj/item/stack/sheet/metal in stack_list)) return
@@ -246,6 +258,7 @@
unload_mineral(plasteelout)
else
to_chat(usr, "Required access not found. ")
+
if(href_list["plasglass"])
if(check_access(inserted_id) || allowed(usr))
if(!(/obj/item/stack/sheet/glass in stack_list)) return
@@ -263,7 +276,6 @@
else
to_chat(usr, "Required access not found. ")
updateUsrDialog()
- return
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -294,6 +306,9 @@
/obj/machinery/mineral/ore_redemption/power_change()
..()
update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down. ")
+ inserted_id.forceMove(loc)
/obj/machinery/mineral/ore_redemption/update_icon()
if(powered())
@@ -313,7 +328,7 @@
anchored = 1.0
var/obj/item/weapon/card/id/inserted_id
var/list/prize_list = list(
- new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack, 50),
+ new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack, 50),
new /datum/data/mining_equipment("Teporone MediPen", /obj/item/weapon/reagent_containers/hypospray/autoinjector/teporone, 50),
new /datum/data/mining_equipment("MediPen Bundle", /obj/item/weapon/storage/box/autoinjector/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
@@ -324,10 +339,10 @@
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 400),
new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/weapon/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Mining Drone", /obj/item/weapon/mining_drone_cube, 500),
- new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
- new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/device/mine_bot_ugprade/health, 400),
- new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_ugprade/cooldown, 600),
- new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/weapon/twohanded/required/mining_hammer, 750),
+ new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_upgrade, 400),
+ new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/device/mine_bot_upgrade/health, 400),
+ new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_upgrade/cooldown, 600),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/weapon/twohanded/required/mining_hammer, 750),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
@@ -339,10 +354,17 @@
new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/device/mobcapsule, 800),
new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/weapon/storage/belt/lazarus, 200),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000),
- new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
- new /datum/data/mining_equipment("Super Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator/super, 3000),
+ new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
+ new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
+ new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
+ new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
+ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
+ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
+ new /datum/data/mining_equipment("KA Cooldown Decrease",/obj/item/borg/upgrade/modkit/cooldown, 1000),
+ new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
)
@@ -370,19 +392,24 @@
/obj/machinery/mineral/equipment_vendor/power_change()
..()
update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down. ")
+ inserted_id.forceMove(loc)
/obj/machinery/mineral/equipment_vendor/update_icon()
if(powered())
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-off"
- return
-/obj/machinery/mineral/equipment_vendor/attack_hand(user as mob)
+/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
if(..())
return
interact(user)
+/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
+ interact(user)
+
/obj/machinery/mineral/equipment_vendor/interact(mob/user)
user.set_machine(src)
@@ -400,11 +427,11 @@
var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
popup.set_content(dat)
popup.open()
- return
/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(href_list["choice"])
if(istype(inserted_id))
if(href_list["choice"] == "eject")
@@ -420,24 +447,25 @@
inserted_id = I
else
to_chat(usr, "No valid ID. ")
+
if(href_list["purchase"])
if(istype(inserted_id))
var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
- if(!prize || !(prize in prize_list))
+ if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points)
return
- if(prize.cost > inserted_id.mining_points)
- else
- inserted_id.mining_points -= prize.cost
- new prize.equipment_path(src.loc)
- updateUsrDialog()
- return
-/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I as obj, mob/user as mob, params)
+ inserted_id.mining_points -= prize.cost
+ new prize.equipment_path(src.loc)
+ updateUsrDialog()
+
+/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
updateUsrDialog()
return
if(panel_open)
if(istype(I, /obj/item/weapon/crowbar))
+ if(inserted_id)
+ inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
default_deconstruction_crowbar(I)
return 1
if(istype(I, /obj/item/weapon/mining_voucher))
@@ -493,7 +521,7 @@
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
icon = 'icons/obj/items.dmi'
icon_state = "mining_voucher"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
/**********************Mining Point Card**********************/
@@ -503,7 +531,7 @@
icon_state = "data"
var/points = 500
-/obj/item/weapon/card/mining_point_card/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/item/weapon/card/mining_point_card/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card/id))
if(points)
var/obj/item/weapon/card/id/C = I
@@ -527,12 +555,12 @@
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
origin_tech = "bluespace=2"
-/obj/item/device/wormhole_jaunter/attack_self(mob/user as mob)
+/obj/item/device/wormhole_jaunter/attack_self(mob/user)
var/turf/device_turf = get_turf(user)
if(!device_turf||is_teleport_allowed(device_turf.z))
to_chat(user, "You're having difficulties getting the [src.name] to work. ")
@@ -587,7 +615,7 @@
icon_state = "resonator"
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum."
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 8
throwforce = 10
var/cooldown = 0
@@ -613,7 +641,7 @@
spawn(burst_time)
fieldsactive--
-/obj/item/weapon/resonator/attack_self(mob/user as mob)
+/obj/item/weapon/resonator/attack_self(mob/user)
if(burst_time == 50)
burst_time = 30
to_chat(user, "You set the resonator's fields to detonate after 3 seconds. ")
@@ -683,7 +711,7 @@
/obj/item/weapon/mining_drone_cube
name = "mining drone cube"
desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/aibots.dmi'
icon_state = "minedronecube"
item_state = "electronic"
@@ -694,319 +722,15 @@
new /mob/living/simple_animal/hostile/mining_drone(get_turf(src))
qdel(src)
-/**********************Mining drone**********************/
-#define MINEDRONE_COLLECT 1
-#define MINEDRONE_ATTACK 2
-
-/mob/living/simple_animal/hostile/mining_drone
- name = "nanotrasen minebot"
- desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder."
- icon = 'icons/obj/aibots.dmi'
- icon_state = "mining_drone"
- icon_living = "mining_drone"
- status_flags = CANSTUN|CANWEAKEN|CANPUSH
- mouse_opacity = 1
- faction = list("neutral")
- a_intent = I_HARM
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- wander = 0
- idle_vision_range = 5
- move_to_delay = 10
- retreat_distance = 1
- minimum_distance = 2
- health = 125
- maxHealth = 125
- melee_damage_lower = 15
- melee_damage_upper = 15
- environment_smash = 0
- check_friendly_fire = 1
- stop_automated_movement_when_pulled = 1
- attacktext = "drills"
- attack_sound = 'sound/weapons/circsawhit.ogg'
- ranged = 1
- sentience_type = SENTIENCE_MINEBOT
- ranged_message = "shoots"
- ranged_cooldown_cap = 3
- projectiletype = /obj/item/projectile/kinetic
- projectilesound = 'sound/weapons/Gunshot4.ogg'
- speak_emote = list("states")
- wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
- /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
- /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass)
- healable = 0
- var/mode = MINEDRONE_COLLECT
- var/light_on = 0
- var/mesons_active
-
- var/datum/action/innate/minedrone/toggle_light/toggle_light_action
- var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
- var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
- var/datum/action/innate/minedrone/dump_ore/dump_ore_action
-
-/mob/living/simple_animal/hostile/mining_drone/New()
- ..()
- toggle_light_action = new()
- toggle_light_action.Grant(src)
- toggle_meson_vision_action = new()
- toggle_meson_vision_action.Grant(src)
- toggle_mode_action = new()
- toggle_mode_action.Grant(src)
- dump_ore_action = new()
- dump_ore_action.Grant(src)
-
- SetCollectBehavior()
-
-/mob/living/simple_animal/hostile/mining_drone/sentience_act()
- AIStatus = AI_OFF
- check_friendly_fire = 0
-
-/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/W = I
- if(W.welding && !stat)
- if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
- to_chat(user, "[src] is moving around too much to repair! ")
- return
- if(maxHealth == health)
- to_chat(user, "[src] is at full integrity. ")
- else
- adjustBruteLoss(-10)
- to_chat(user, "You repair some of the armor on [src]. ")
- return
- if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner))
- to_chat(user, "You instruct [src] to drop any collected ore. ")
- DropOre()
- return
- ..()
-
-/mob/living/simple_animal/hostile/mining_drone/death()
- ..()
- visible_message("[src] is destroyed! ")
- new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
- DropOre(0)
- qdel(src)
- return
-
-/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
- if(M.a_intent == I_HELP)
- toggle_mode()
- switch(mode)
- if(MINEDRONE_COLLECT)
- to_chat(M, "[src] has been set to search and store loose ore. ")
- if(MINEDRONE_ATTACK)
- to_chat(M, "[src] has been set to attack hostile wildlife. ")
- return
- ..()
-
-/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior()
- mode = MINEDRONE_COLLECT
- idle_vision_range = 9
- search_objects = 2
- wander = 1
- ranged = 0
- minimum_distance = 1
- retreat_distance = null
- icon_state = "mining_drone"
- to_chat(src, "You are set to collect mode. You can now collect loose ore. ")
-
-/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior()
- mode = MINEDRONE_ATTACK
- idle_vision_range = 7
- search_objects = 0
- wander = 0
- ranged = 1
- retreat_distance = 1
- minimum_distance = 2
- icon_state = "mining_drone_offense"
- to_chat(src, "You are set to attack mode. You can now attack from range. ")
-
-/mob/living/simple_animal/hostile/mining_drone/AttackingTarget()
- if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT)
- CollectOre()
- return
- ..()
-
-/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
- var/obj/item/weapon/ore/O
- for(O in src.loc)
- O.forceMove(src)
- for(var/dir in alldirs)
- var/turf/T = get_step(src,dir)
- for(O in T)
- O.forceMove(src)
- return
-
-/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
- if(!contents.len)
- if(message)
- to_chat(src, "You attempt to dump your stored ore, but you have none. ")
- return
- if(message)
- to_chat(src, "You dump your stored ore. ")
- for(var/obj/item/weapon/ore/O in contents)
- contents -= O
- O.forceMove(loc)
- return
-
-/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount)
- if(mode != MINEDRONE_ATTACK && amount > 0)
- SetOffenseBehavior()
- . = ..()
-
-/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode()
- switch(mode)
- if(MINEDRONE_COLLECT)
- SetOffenseBehavior()
- if(MINEDRONE_ATTACK)
- SetCollectBehavior()
- else //This should never happen.
- mode = MINEDRONE_COLLECT
- SetCollectBehavior()
-
-
-/mob/living/simple_animal/hostile/mining_drone/update_sight()
- if(!client)
- return
- if(stat == DEAD)
- grant_death_vision()
- return
-
- if(mesons_active)
- sight |= SEE_TURFS
- see_invisible = SEE_INVISIBLE_MINIMUM
- else
- sight &= ~SEE_TURFS
- see_invisible = SEE_INVISIBLE_LIVING
-
- see_in_dark = initial(see_in_dark)
-
- if(client.eye != src)
- var/atom/A = client.eye
- if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates.
- return
-
-//Actions for sentient minebots
-
-/datum/action/innate/minedrone
- check_flags = AB_CHECK_CONSCIOUS
- background_icon_state = "bg_default"
-
-/datum/action/innate/minedrone/toggle_light
- name = "Toggle Light"
- button_icon_state = "mech_lights_off"
-
-/datum/action/innate/minedrone/toggle_light/Activate()
- var/mob/living/simple_animal/hostile/mining_drone/user = owner
-
- if(user.light_on)
- user.set_light(0)
- else
- user.set_light(6)
- user.light_on = !user.light_on
- to_chat(user, "You toggle your light [user.light_on ? "on" : "off"]. ")
-
-/datum/action/innate/minedrone/toggle_meson_vision
- name = "Toggle Meson Vision"
- button_icon_state = "meson"
-
-/datum/action/innate/minedrone/toggle_meson_vision/Activate()
- var/mob/living/simple_animal/hostile/mining_drone/user = owner
- user.mesons_active = !user.mesons_active
- user.update_sight()
-
- to_chat(user, "You toggle your meson vision [(user.mesons_active) ? "on" : "off"]. ")
-
-/datum/action/innate/minedrone/toggle_mode
- name = "Toggle Mode"
- button_icon_state = "mech_cycle_equip_off"
-
-/datum/action/innate/minedrone/toggle_mode/Activate()
- var/mob/living/simple_animal/hostile/mining_drone/user = owner
- user.toggle_mode()
-
-/datum/action/innate/minedrone/dump_ore
- name = "Dump Ore"
- button_icon_state = "mech_eject"
-
-/datum/action/innate/minedrone/dump_ore/Activate()
- var/mob/living/simple_animal/hostile/mining_drone/user = owner
- user.DropOre()
-
-
-/**********************Minebot Upgrades**********************/
-
-//Melee
-
-/obj/item/device/mine_bot_ugprade
- name = "minebot melee upgrade"
- desc = "A minebot upgrade."
- icon_state = "door_electronics"
- icon = 'icons/obj/doors/door_assembly.dmi'
-
-/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity)
- if(!istype(M) || !proximity)
- return
- upgrade_bot(M, user)
-
-/obj/item/device/mine_bot_ugprade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
- if(M.melee_damage_upper != initial(M.melee_damage_upper))
- to_chat(user, "[M] already has a combat upgrade installed!")
- return
- M.melee_damage_lower = 22
- M.melee_damage_upper = 22
- to_chat(user, "You upgrade [M]'s combat module.")
- qdel(src)
-
-//Health
-
-/obj/item/device/mine_bot_ugprade/health
- name = "minebot chassis upgrade"
-
-/obj/item/device/mine_bot_ugprade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
- if(M.maxHealth != initial(M.maxHealth))
- to_chat(user, "[M] already has a reinforced chassis!")
- return
- M.maxHealth = 170
- to_chat(user, "You reinforce [M]'s chassis.")
- qdel(src)
-
-
-//Cooldown
-
-/obj/item/device/mine_bot_ugprade/cooldown
- name = "minebot cooldown upgrade"
-
-/obj/item/device/mine_bot_ugprade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
- if(M.ranged_cooldown_cap != initial(M.ranged_cooldown_cap))
- to_chat(user, "[M] already has a decreased weapon cooldown!")
- return
- M.ranged_cooldown_cap = 1
- to_chat(user, "You upgrade [M]'s ranged weaponry, reducing its cooldown.")
- qdel(src)
-
-
-//AI
-/obj/item/slimepotion/sentience/mining
- name = "minebot AI upgrade"
- desc = "Can be used to grant sentience to minebots."
- icon_state = "door_electronics"
- icon = 'icons/obj/doors/door_assembly.dmi'
- sentience_type = SENTIENCE_MINEBOT
- origin_tech = "programming=6"
-
-#undef MINEDRONE_COLLECT
-#undef MINEDRONE_ATTACK
-
/**********************Mining drone kit**********************/
/obj/item/weapon/storage/box/drone_kit
name = "Drone Kit"
desc = "A boxed kit that includes one mining drone cube and a welding tool with an increased capacity."
icon_state = "implant"
- max_w_class = 3
+ max_w_class = WEIGHT_CLASS_NORMAL
storage_slots = 2
- can_hold = list("/obj/item/weapon/mining_drone_cube","/obj/item/weapon/weldingtool/hugetank")
+ can_hold = list(/obj/item/weapon/mining_drone_cube, /obj/item/weapon/weldingtool/hugetank)
/obj/item/weapon/storage/box/drone_kit/New()
..()
@@ -1022,7 +746,7 @@
icon_state = "lazarus_hypo"
item_state = "hypo"
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
var/loaded = 1
@@ -1082,7 +806,7 @@
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
@@ -1114,7 +838,7 @@
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 35
@@ -1207,7 +931,7 @@
desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
volume = 40
throw_range = 7
- w_class = 3 //same as syndie harness
+ w_class = WEIGHT_CLASS_NORMAL //same as syndie harness
/*********************Hivelord stabilizer****************/
@@ -1216,7 +940,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "biotech=1"
/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user)
@@ -1239,7 +963,7 @@
\nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
This weapon is only particularly effective against large creatures. "
force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
force_unwielded = 20 //It's never not wielded so these are the same
force_wielded = 20
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
new file mode 100644
index 00000000000..6289333549b
--- /dev/null
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -0,0 +1,205 @@
+/obj/structure/flora/ash
+ gender = PLURAL
+ icon = 'icons/obj/lavaland/ash_flora.dmi'
+ icon_state = "l_mushroom"
+ name = "large mushrooms"
+ desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores."
+ var/harvested_name = "shortened mushrooms"
+ var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large."
+ var/needs_sharp_harvest = TRUE
+ var/harvest = /obj/item/weapon/reagent_containers/food/snacks/ash_flora/shavings
+ var/harvest_amount_low = 1
+ var/harvest_amount_high = 3
+ var/harvest_time = 60
+ var/harvest_message_low = "You pick a mushroom, but fail to collect many shavings from its cap."
+ var/harvest_message_med = "You pick a mushroom, carefully collecting the shavings from its cap."
+ var/harvest_message_high = "You harvest and collect shavings from several mushroom caps."
+ var/harvested = FALSE
+ var/base_icon
+ var/regrowth_time_low = 4800
+ var/regrowth_time_high = 8400
+
+/obj/structure/flora/ash/New()
+ ..()
+ base_icon = "[icon_state][rand(1, 4)]"
+ icon_state = base_icon
+ if(prob(15))
+ harvest(null, TRUE)
+
+/obj/structure/flora/ash/proc/harvest(user, no_drop)
+ if(harvested)
+ return 0
+ if(!no_drop)
+ var/rand_harvested = rand(harvest_amount_low, harvest_amount_high)
+ if(rand_harvested)
+ if(user)
+ var/msg = harvest_message_med
+ if(rand_harvested == harvest_amount_low)
+ msg = harvest_message_low
+ else if(rand_harvested == harvest_amount_high)
+ msg = harvest_message_high
+ to_chat(user, "[msg] ")
+ for(var/i in 1 to rand_harvested)
+ new harvest(get_turf(src))
+ icon_state = "[base_icon]p"
+ name = harvested_name
+ desc = harvested_desc
+ harvested = TRUE
+ addtimer(src, "regrow", rand(regrowth_time_low, regrowth_time_high))
+ return 1
+
+/obj/structure/flora/ash/proc/regrow()
+ icon_state = base_icon
+ name = initial(name)
+ desc = initial(desc)
+ harvested = FALSE
+
+/obj/structure/flora/ash/attackby(obj/item/weapon/W, mob/user, params)
+ if(!harvested && needs_sharp_harvest && W.sharp)
+ user.visible_message("[user] starts to harvest from [src] with [W]. ","You begin to harvest from [src] with [W]. ")
+ if(do_after(user, harvest_time, target = src))
+ harvest(user)
+ else
+ return ..()
+
+/obj/structure/flora/ash/attack_hand(mob/user)
+ if(!harvested && !needs_sharp_harvest)
+ user.visible_message("[user] starts to harvest from [src]. ","You begin to harvest from [src]. ")
+ if(do_after(user, harvest_time, target = src))
+ harvest(user)
+ else
+ ..()
+
+/obj/structure/flora/ash/tall_shroom //exists only so that the spawning check doesn't allow these spawning near other things
+ regrowth_time_low = 4200
+
+/obj/structure/flora/ash/leaf_shroom
+ icon_state = "s_mushroom"
+ name = "leafy mushrooms"
+ desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures."
+ harvested_name = "leafless mushrooms"
+ harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?"
+ harvest = /obj/item/weapon/reagent_containers/food/snacks/ash_flora/mushroom_leaf
+ needs_sharp_harvest = FALSE
+ harvest_amount_high = 4
+ harvest_time = 20
+ harvest_message_low = "You pluck a single, suitable leaf."
+ harvest_message_med = "You pluck a number of leaves, leaving a few unsuitable ones."
+ harvest_message_high = "You pluck quite a lot of suitable leaves."
+ regrowth_time_low = 2400
+ regrowth_time_high = 6000
+
+/obj/structure/flora/ash/cap_shroom
+ icon_state = "r_mushroom"
+ name = "tall mushrooms"
+ desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems."
+ harvested_name = "small mushrooms"
+ harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms."
+ harvest = /obj/item/weapon/reagent_containers/food/snacks/ash_flora/mushroom_cap
+ harvest_amount_high = 4
+ harvest_time = 50
+ harvest_message_low = "You slice the cap off of a mushroom."
+ harvest_message_med = "You slice off a few conks from the larger mushrooms."
+ harvest_message_high = "You slice off a number of caps and conks from these mushrooms."
+ regrowth_time_low = 3000
+ regrowth_time_high = 5400
+
+/obj/structure/flora/ash/stem_shroom
+ icon_state = "t_mushroom"
+ name = "numerous mushrooms"
+ desc = "A large number of mushrooms, some of which have long, fleshy stems. They're radiating light!"
+ luminosity = 1
+ harvested_name = "tiny mushrooms"
+ harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back."
+ harvest = /obj/item/weapon/reagent_containers/food/snacks/ash_flora/mushroom_stem
+ harvest_amount_high = 4
+ harvest_time = 40
+ harvest_message_low = "You pick and slice the cap off of a mushroom, leaving the stem."
+ harvest_message_med = "You pick and decapitate several mushrooms for their stems."
+ harvest_message_high = "You acquire a number of stems from these mushrooms."
+ regrowth_time_low = 3000
+ regrowth_time_high = 6000
+
+/obj/structure/flora/ash/cacti
+ icon_state = "cactus"
+ name = "fruiting cacti"
+ desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash."
+ harvested_name = "cacti"
+ harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash."
+ harvest = /obj/item/weapon/reagent_containers/food/snacks/ash_flora/cactus_fruit
+ needs_sharp_harvest = FALSE
+ harvest_amount_high = 2
+ harvest_time = 10
+ harvest_message_low = "You pick a cactus fruit."
+ harvest_message_med = "You pick several cactus fruit." //shouldn't show up, because you can't get more than two
+ harvest_message_high = "You pick a pair of cactus fruit."
+ regrowth_time_low = 4800
+ regrowth_time_high = 7200
+
+/obj/structure/flora/ash/cacti/Crossed(mob/AM)
+ if(ishuman(AM) && has_gravity(loc) && prob(70))
+ var/mob/living/carbon/human/H = AM
+ if(!H.shoes && !H.lying) //ouch, my feet.
+ var/picked_def_zone = pick("l_leg", "r_leg")
+ var/obj/item/organ/external/affected = H.get_organ(picked_def_zone)
+ if(!istype(affected))
+ return
+ H.apply_damage(rand(3, 6), BRUTE, picked_def_zone)
+ H.Weaken(2)
+ H.visible_message("[H] steps on a cactus! ", \
+ "You step on a cactus! ")
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora
+ name = "mushroom shavings"
+ desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl."
+ icon = 'icons/obj/lavaland/ash_flora.dmi'
+ icon_state = "mushroom_shavings"
+ list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2)
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora/New()
+ ..()
+ pixel_x = rand(-4, 4)
+ pixel_y = rand(-4, 4)
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora/shavings //for actual crafting
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora/mushroom_leaf
+ name = "mushroom leaf"
+ desc = "A leaf, from a mushroom."
+ list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2)
+ icon_state = "mushroom_leaf"
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora/mushroom_cap
+ name = "mushroom cap"
+ desc = "The cap of a large mushroom."
+ list_reagents = list("lsd" = 2, "entpoly" = 4, "psilocybin" = 2)
+ icon_state = "mushroom_cap"
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora/mushroom_stem
+ name = "mushroom stem"
+ desc = "A long mushroom stem. It's slightly glowing."
+ list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1)
+ icon_state = "mushroom_stem"
+ luminosity = 1
+
+/obj/item/weapon/reagent_containers/food/snacks/ash_flora/cactus_fruit
+ name = "cactus fruit"
+ list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4)
+ desc = "A cactus fruit covered in a thick, reddish skin. And some ash."
+ icon_state = "cactus_fruit"
+
+/obj/item/mushroom_bowl
+ name = "mushroom bowl"
+ desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
+ icon = 'icons/obj/lavaland/ash_flora.dmi'
+ icon_state = "mushroom_bowl"
+ w_class = WEIGHT_CLASS_SMALL
+
+//what you can craft with these things
+/datum/crafting_recipe/mushroom_bowl
+ name = "Mushroom Bowl"
+ result = /obj/item/weapon/reagent_containers/food/drinks/mushroom_bowl
+ reqs = list(/obj/item/weapon/reagent_containers/food/snacks/ash_flora/shavings = 5)
+ time = 30
+ category = CAT_PRIMAL
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
new file mode 100644
index 00000000000..418d00c6f19
--- /dev/null
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -0,0 +1,217 @@
+/obj/structure/closet/crate/necropolis/dragon
+ name = "dragon chest"
+
+/obj/structure/closet/crate/necropolis/dragon/New()
+ ..()
+ var/loot = rand(1,4)
+ switch(loot)
+ if(1)
+ new /obj/item/weapon/melee/ghost_sword(src)
+ if(2)
+ new /obj/item/weapon/lava_staff(src)
+ if(3)
+ new /obj/item/weapon/spellbook/oneuse/sacredflame(src)
+ new /obj/item/weapon/gun/magic/wand/fireball(src)
+ if(4)
+ new /obj/item/weapon/dragons_blood(src)
+
+// Spectral Blade
+
+/obj/item/weapon/melee/ghost_sword
+ name = "spectral blade"
+ desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
+ icon_state = "spectral"
+ item_state = "spectral"
+ flags = CONDUCT
+ sharp = 1
+ edge = 1
+ w_class = WEIGHT_CLASS_BULKY
+ force = 1
+ throwforce = 1
+ hitsound = 'sound/effects/ghost2.ogg'
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
+ var/summon_cooldown = 0
+ var/list/mob/dead/observer/spirits
+
+/obj/item/weapon/melee/ghost_sword/New()
+ ..()
+ spirits = list()
+ processing_objects.Add(src)
+ poi_list |= src
+
+/obj/item/weapon/melee/ghost_sword/Destroy()
+ for(var/mob/dead/observer/G in spirits)
+ G.invisibility = initial(G.invisibility)
+ spirits.Cut()
+ processing_objects.Remove(src)
+ poi_list -= src
+ . = ..()
+
+/obj/item/weapon/melee/ghost_sword/attack_self(mob/user)
+ if(summon_cooldown > world.time)
+ to_chat(user, "You just recently called out for aid. You don't want to annoy the spirits.")
+ return
+ to_chat(user, "You call out for aid, attempting to summon spirits to your side.")
+
+ notify_ghosts("[user] is raising their [src], calling for your help!", enter_link="(Click to help) ", source = user, action = NOTIFY_FOLLOW)
+
+ summon_cooldown = world.time + 600
+
+/obj/item/weapon/melee/ghost_sword/Topic(href, href_list)
+ if(href_list["follow"])
+ var/mob/dead/observer/ghost = usr
+ if(istype(ghost))
+ ghost.ManualFollow(src)
+
+/obj/item/weapon/melee/ghost_sword/process()
+ ghost_check()
+
+/obj/item/weapon/melee/ghost_sword/proc/ghost_check()
+ var/ghost_counter = 0
+ var/turf/T = get_turf(src)
+ var/list/contents = T.GetAllContents()
+ var/mob/dead/observer/current_spirits = list()
+
+ for(var/mob/dead/observer/O in player_list)
+ if(is_type_in_list(O.following, contents))
+ ghost_counter++
+ O.invisibility = 0
+ current_spirits |= O
+
+ for(var/mob/dead/observer/G in spirits - current_spirits)
+ G.invisibility = initial(G.invisibility)
+
+ spirits = current_spirits
+
+ return ghost_counter
+
+/obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
+ force = 0
+ var/ghost_counter = ghost_check()
+
+ force = Clamp((ghost_counter * 4), 0, 75)
+ user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits! ")
+ ..()
+
+/obj/item/weapon/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ var/ghost_counter = ghost_check()
+ final_block_chance += Clamp((ghost_counter * 5), 0, 75)
+ owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts! ")
+ return ..()
+
+// Blood
+
+/obj/item/weapon/dragons_blood
+ name = "bottle of dragons blood"
+ desc = "You're not actually going to drink this, are you?"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+/obj/item/weapon/dragons_blood/attack_self(mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+
+ var/mob/living/carbon/human/H = user
+ var/random = rand(1,3)
+
+ switch(random)
+ if(1)
+ to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise. ")
+ H.set_species("Skeleton")
+ if(2)
+ to_chat(user, "Power courses through you! You can now shift your form at will.")
+ if(user.mind)
+ var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new
+ user.mind.AddSpell(D)
+ if(3)
+ to_chat(user, "You feel like you could walk straight through lava now. ")
+ H.weather_immunities |= "lava"
+
+ playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ qdel(src)
+
+/datum/disease/transformation/dragon
+ name = "dragon transformation"
+ cure_text = "nothing"
+ cures = list("adminordrazine")
+ agent = "dragon's blood"
+ desc = "What do dragons have to do with Space Station 13?"
+ stage_prob = 20
+ severity = BIOHAZARD
+ visibility_flags = 0
+ stage1 = list("Your bones ache.")
+ stage2 = list("Your skin feels scaley.")
+ stage3 = list("You have an overwhelming urge to terrorize some peasants. ", "Your teeth feel sharper. ")
+ stage4 = list("Your blood burns. ")
+ stage5 = list("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason. ")
+ new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
+
+//Lava Staff
+
+/obj/item/weapon/lava_staff
+ name = "staff of lava"
+ desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?"
+ icon_state = "staffofstorms"
+ item_state = "staffofstorms"
+ icon = 'icons/obj/guns/magic.dmi'
+ slot_flags = SLOT_BACK
+ item_state = "staffofstorms"
+ w_class = WEIGHT_CLASS_BULKY
+ force = 25
+ damtype = BURN
+ hitsound = 'sound/weapons/sear.ogg'
+ burn_state = LAVA_PROOF | FIRE_PROOF
+ unacidable = 1
+ var/turf_type = /turf/unsimulated/floor/lava // /turf/simulated/floor/plating/lava/smooth once Lavaland turfs are added
+ var/transform_string = "lava"
+ var/reset_turf_type = /turf/simulated/floor/plating/airless/asteroid // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added
+ var/reset_string = "basalt"
+ var/create_cooldown = 100
+ var/create_delay = 30
+ var/reset_cooldown = 50
+ var/timer = 0
+ var/banned_turfs
+
+/obj/item/weapon/lava_staff/New()
+ . = ..()
+ banned_turfs = typecacheof(list(/turf/space/transit, /turf/unsimulated))
+
+/obj/item/weapon/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ ..()
+ if(timer > world.time)
+ return
+
+ if(is_type_in_typecache(target, banned_turfs))
+ return
+
+ if(target in view(user.client.view, get_turf(user)))
+
+ var/turf/simulated/T = get_turf(target)
+ if(!istype(T))
+ return
+ if(!istype(T, turf_type))
+ var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T)
+ L.alpha = 0
+ animate(L, alpha = 255, time = create_delay)
+ user.visible_message("[user] points [src] at [T]! ")
+ timer = world.time + create_delay + 1
+ if(do_after(user, create_delay, target = T))
+ user.visible_message("[user] turns \the [T] into [transform_string]! ")
+ message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP ).")
+ log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).")
+ T.ChangeTurf(turf_type)
+ timer = world.time + create_cooldown
+ qdel(L)
+ else
+ timer = world.time
+ qdel(L)
+ return
+ else
+ user.visible_message("[user] turns \the [T] into [reset_string]! ")
+ T.ChangeTurf(reset_turf_type)
+ timer = world.time + reset_cooldown
+ playsound(T,'sound/magic/Fireball.ogg', 200, 1)
+
+/obj/effect/overlay/temp/lavastaff
+ icon_state = "lavastaff_warn"
+ duration = 50
diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm
new file mode 100644
index 00000000000..8ee0ecacd8d
--- /dev/null
+++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm
@@ -0,0 +1,81 @@
+/obj/structure/closet/crate/necropolis/bubblegum
+ name = "bubblegum chest"
+
+/obj/structure/closet/crate/necropolis/bubblegum/New()
+ ..()
+ var/loot = rand(1,3)
+ switch(loot)
+ if(1)
+ new /obj/item/mayhem(src)
+ if(2)
+ new /obj/item/blood_contract(src)
+ if(3)
+ new /obj/item/weapon/gun/magic/staff/spellblade(src)
+
+// Mayhem
+
+/obj/item/mayhem
+ name = "mayhem in a bottle"
+ desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+/obj/item/mayhem/attack_self(mob/user)
+ for(var/mob/living/carbon/human/H in range(7,user))
+ spawn()
+ var/obj/effect/mine/pickup/bloodbath/B = new(H)
+ B.mineEffect(H)
+ to_chat(user, "You shatter the bottle! ")
+ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
+ qdel(src)
+
+// Blood Contract
+
+/obj/item/blood_contract
+ name = "blood contract"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "scroll2"
+ color = "#FF0000"
+ desc = "Mark your target for death."
+ var/used = FALSE
+
+/obj/item/blood_contract/attack_self(mob/user)
+ if(used)
+ return
+
+ used = TRUE
+ var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in player_list
+
+ if(!choice)
+ used = FALSE
+ return
+ else if(!isliving(choice))
+ to_chat(user, "[choice] is already dead!")
+ used = FALSE
+ return
+ else if(choice == user)
+ to_chat(user, "You feel like writing your own name into a cursed death warrant would be unwise.")
+ used = FALSE
+ return
+ else
+ var/mob/living/L = choice
+
+ message_admins("[key_name_admin(L)] has been marked for death by [key_name_admin(user)].")
+ log_admin("[key_name(L)] has been marked for death by [key_name(user)].")
+
+ var/datum/objective/survive/survive = new
+ survive.owner = L.mind
+ L.mind.objectives += survive
+ to_chat(L, "You've been marked for death! Don't let the demons get you! ")
+ L.color = "#FF0000"
+ spawn()
+ var/obj/effect/mine/pickup/bloodbath/B = new(L)
+ B.mineEffect(L)
+
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H == L)
+ continue
+ to_chat(H, "You have an overwhelming desire to kill [L]. They have been marked red! Go kill them! ")
+ H.put_in_hands(new /obj/item/weapon/kitchen/knife/butcher(H))
+
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
new file mode 100644
index 00000000000..fc950b429d2
--- /dev/null
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -0,0 +1,495 @@
+//Black Box
+
+/obj/machinery/smartfridge/black_box
+ name = "black box"
+ desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "blackbox"
+ icon_on = "blackbox"
+ icon_off = "blackbox"
+ luminosity = 8
+ max_n_of_items = INFINITY
+ unacidable = 1
+ burn_state = LAVA_PROOF | FIRE_PROOF
+ pixel_y = -4
+ use_power = 0
+ var/memory_saved = FALSE
+ var/list/stored_items = list()
+ var/static/list/blacklist = typecacheof(list(/obj/item/weapon/spellbook))
+
+/obj/machinery/smartfridge/black_box/update_icon()
+ return
+
+/obj/machinery/smartfridge/black_box/accept_check(obj/item/O)
+ if(!istype(O))
+ return FALSE
+ if(is_type_in_typecache(O, blacklist))
+ return FALSE
+ return TRUE
+
+/obj/machinery/smartfridge/black_box/New()
+ var/static/obj/machinery/smartfridge/black_box/current
+ if(current && current != src)
+ qdel(src, force=TRUE)
+ return
+ current = src
+ ReadMemory()
+ . = ..()
+
+/obj/machinery/smartfridge/black_box/process()
+ ..()
+ if(!memory_saved && ticker.current_state == GAME_STATE_FINISHED)
+ WriteMemory()
+
+/obj/machinery/smartfridge/black_box/proc/WriteMemory()
+ var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
+ stored_items = list()
+
+ for(var/obj/O in (contents-component_parts))
+ stored_items += O.type
+
+ S["stored_items"] << stored_items
+ memory_saved = TRUE
+
+/obj/machinery/smartfridge/black_box/proc/ReadMemory()
+ var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
+ S["stored_items"] >> stored_items
+
+ if(isnull(stored_items))
+ stored_items = list()
+
+ for(var/item in stored_items)
+ create_item(item)
+
+//in it's own proc to avoid issues with items that nolonger exist in the code base.
+//try catch doesn't always prevent byond runtimes from halting a proc,
+/obj/machinery/smartfridge/black_box/proc/create_item(item_type)
+ new item_type(src)
+
+/obj/machinery/smartfridge/black_box/Destroy(force = FALSE)
+ if(force)
+ for(var/thing in src)
+ qdel(thing)
+ return ..()
+ else
+ return QDEL_HINT_LETMELIVE
+
+
+//No taking it apart
+
+/obj/machinery/smartfridge/black_box/default_deconstruction_screwdriver()
+ return
+
+/obj/machinery/smartfridge/black_box/exchange_parts()
+ return
+
+/obj/machinery/smartfridge/black_box/default_unfasten_wrench()
+ return
+
+/obj/machinery/smartfridge/black_box/default_deconstruction_crowbar()
+ return
+
+///Anomolous Crystal///
+
+/obj/machinery/anomalous_crystal
+ name = "anomalous crystal"
+ desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "anomaly_crystal"
+ luminosity = 8
+ use_power = 0
+ density = 1
+ burn_state = LAVA_PROOF | FIRE_PROOF
+ unacidable = 1
+ var/activation_method = "touch"
+ var/activation_damage_type = null
+ var/last_use_timer = 0
+ var/cooldown_add = 30
+ var/list/affected_targets = list()
+ var/activation_sound = 'sound/effects/break_stone.ogg'
+
+/obj/machinery/anomalous_crystal/New()
+ activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","weapon","speech") // "heat" removed due to lack of is_hot()
+ ..()
+
+/obj/machinery/anomalous_crystal/hear_talk(mob/speaker, message)
+ ..()
+ if(isliving(speaker) && message)
+ ActivationReaction(speaker, "speech")
+
+/obj/machinery/anomalous_crystal/attack_hand(mob/user)
+ ..()
+ ActivationReaction(user,"touch")
+
+/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params)
+ ActivationReaction(user,"weapon")
+ ..()
+
+/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
+ ..()
+ if(istype(P, /obj/item/projectile/magic))
+ ActivationReaction(P.firer, "magic", P.damage_type)
+ return
+ ActivationReaction(P.firer, P.flag, P.damage_type)
+
+/obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype)
+ if(world.time < last_use_timer)
+ return 0
+ if(activation_damage_type && activation_damage_type != damtype)
+ return 0
+ if(method != activation_method)
+ return 0
+ last_use_timer = (world.time + cooldown_add)
+ playsound(user, activation_sound, 100, 1)
+ return 1
+
+/obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj)
+ ..()
+ if(ismob(AM))
+ ActivationReaction(AM,"mob_bump")
+
+/obj/machinery/anomalous_crystal/ex_act()
+ ActivationReaction(null,"bomb")
+
+/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot
+ var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random - /obj/machinery/anomalous_crystal)
+ new random_crystal(loc)
+ qdel(src)
+
+/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
+ activation_method = "mob_bump"
+ activation_sound = 'sound/items/bikehorn.ogg'
+
+/obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user)
+ if(..() && ishuman(user) && !(user in affected_targets))
+ var/mob/living/carbon/human/H = user
+ for(var/obj/item/W in H)
+ H.unEquip(W)
+ var/datum/job/clown/C = job_master.GetJob("Clown")
+ C.equip(H)
+ affected_targets.Add(H)
+
+/obj/machinery/anomalous_crystal/honk/New()
+ ..()
+ activation_method = pick("mob_bump","speech")
+
+/obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one
+ activation_method = "touch"
+ cooldown_add = 200
+ var/terrain_theme = "winter"
+ var/NewTerrainFloors
+ var/NewTerrainWalls
+ var/NewTerrainChairs
+ var/NewTerrainTables
+ var/list/NewFlora = list()
+ var/florachance = 8
+
+/obj/machinery/anomalous_crystal/theme_warp/New()
+ ..()
+ terrain_theme = pick("lavaland","winter","jungle","alien")
+ switch(terrain_theme)
+ if("lavaland")//Depressurizes the place... and free cult metal, I guess.
+ NewTerrainFloors = /turf/simulated/floor/basalt // Needs to be updated after turf update
+ NewTerrainWalls = /turf/simulated/wall/cult
+ NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub)
+ florachance = 1
+ if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway.
+ NewTerrainFloors = /turf/simulated/floor/snow // Needs to be updated after turf update
+ NewTerrainWalls = /turf/simulated/wall/mineral/wood
+ NewTerrainChairs = /obj/structure/stool/bed/chair/wood/normal
+ NewTerrainTables = /obj/structure/table/glass
+ NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both)
+ if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows.
+ NewTerrainFloors = /turf/simulated/floor/grass
+ NewTerrainWalls = /turf/simulated/wall/mineral/sandstone
+ NewTerrainChairs = /obj/structure/stool/bed/chair/wood/normal
+ NewTerrainTables = /obj/structure/table/woodentable
+ NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
+ /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/monkey,
+ /obj/item/weapon/gun/projectile/bow, /obj/item/weapon/storage/backpack/quiver/full)
+ florachance = 20
+ if("alien") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos.
+ NewTerrainFloors = /turf/simulated/floor/mineral/abductor
+ NewTerrainWalls = /turf/simulated/wall/mineral/abductor
+ NewTerrainChairs = /obj/structure/stool/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline.
+ NewTerrainTables = /obj/structure/table/abductor
+
+/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method)
+ if(..())
+ var/area/A = get_area(src)
+ if(!A.outdoors && !(A in affected_targets))
+ for(var/atom/Stuff in A)
+ if(isturf(Stuff))
+ var/turf/T = Stuff
+ if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
+ var/turf/simulated/O = T.ChangeTurf(NewTerrainFloors)
+ if(O.air)
+ var/datum/gas_mixture/G = O.air
+ G.copy_from(O.air)
+ if(prob(florachance) && NewFlora.len && !is_blocked_turf(O))
+ var/atom/Picked = pick(NewFlora)
+ new Picked(O)
+ continue
+ if(iswallturf(T) && NewTerrainWalls)
+ T.ChangeTurf(NewTerrainWalls)
+ continue
+ if(istype(Stuff, /obj/structure/stool/bed/chair) && NewTerrainChairs)
+ var/obj/structure/stool/bed/chair/Original = Stuff
+ var/obj/structure/stool/bed/chair/C = new NewTerrainChairs(Original.loc)
+ C.dir = Original.dir
+ qdel(Stuff)
+ continue
+ if(istype(Stuff, /obj/structure/table) && NewTerrainTables)
+ var/obj/structure/table/Original = Stuff
+ var/obj/structure/table/T = new NewTerrainTables(Original.loc)
+ T.dir = Original.dir
+ qdel(Stuff)
+ continue
+ affected_targets += A
+
+/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
+ activation_method = "touch"
+ cooldown_add = 50
+ var/generated_projectile = /obj/item/projectile/beam/emitter
+
+/obj/machinery/anomalous_crystal/emitter/New()
+ ..()
+ generated_projectile = pick(/obj/item/projectile/magic/fireball/infernal,/obj/item/projectile/magic/spellblade,
+ /obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus)
+
+/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
+ if(..())
+ var/obj/item/projectile/P = new generated_projectile(get_turf(src))
+ P.dir = dir
+ switch(dir)
+ if(NORTH)
+ P.yo = 20
+ P.xo = 0
+ if(EAST)
+ P.yo = 0
+ P.xo = 20
+ if(WEST)
+ P.yo = 0
+ P.xo = -20
+ else
+ P.yo = -20
+ P.xo = 0
+ P.fire()
+
+/obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down.
+ activation_method = "touch"
+ activation_sound = 'sound/hallucinations/growl1.ogg'
+
+/obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method)
+ if(..())
+ for(var/i in range(1, src))
+ if(isturf(i))
+ new /obj/effect/overlay/temp/cult/sparks(i)
+ continue
+ if(ishuman(i))
+ var/mob/living/carbon/human/H = i
+ if(H.stat == DEAD)
+ H.set_species("Shadow")
+ H.revive()
+ H.disabilities |= NOCLONE //Free revives, but significantly limits your options for reviving except via the crystal
+ H.grab_ghost(force = TRUE)
+
+/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans
+ activation_method = "touch"
+ var/ready_to_deploy = 0
+
+/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method)
+ if(..() && !ready_to_deploy)
+ ready_to_deploy = 1
+ notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter) ", source = src, action = NOTIFY_ATTACK)
+
+/obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user)
+ ..()
+ if(ready_to_deploy)
+ var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be cloned!)",,"Yes","No")
+ if(be_helper == "No")
+ return
+ var/mob/living/simple_animal/hostile/lightgeist/W = new /mob/living/simple_animal/hostile/lightgeist(get_turf(loc))
+ W.key = user.key
+
+/obj/machinery/anomalous_crystal/helpers/Topic(href, href_list)
+ if(href_list["ghostjoin"])
+ var/mob/dead/observer/ghost = usr
+ if(istype(ghost))
+ attack_ghost(ghost)
+
+/mob/living/simple_animal/hostile/lightgeist
+ name = "lightgeist"
+ desc = "This small floating creature is a completely unknown form of life... being near it fills you with a sense of tranquility."
+ icon_state = "lightgeist"
+ icon_living = "lightgeist"
+ icon_dead = "butterfly_dead"
+ turns_per_move = 1
+ response_help = "waves away"
+ response_disarm = "brushes aside"
+ response_harm = "disrupts"
+ speak_emote = list("oscillates")
+ maxHealth = 2
+ health = 2
+ harm_intent_damage = 1
+ friendly = "mends"
+ density = 0
+ flying = 1
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ ventcrawler = 2
+ mob_size = MOB_SIZE_TINY
+ gold_core_spawnable = 0
+ speak_emote = list("warps")
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
+ luminosity = 4
+ faction = list("neutral")
+ universal_understand = 1
+ del_on_death = 1
+ unsuitable_atmos_damage = 0
+ flying = 1
+ minbodytemp = 0
+ maxbodytemp = 1500
+ environment_smash = 0
+ AIStatus = AI_OFF
+ stop_automated_movement = 1
+ var/heal_power = 5
+
+/mob/living/simple_animal/hostile/lightgeist/New()
+ ..()
+ verbs -= /mob/living/verb/pulled
+ verbs -= /mob/verb/me_verb
+ var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED]
+ medsensor.add_hud_to(src)
+
+/mob/living/simple_animal/hostile/lightgeist/AttackingTarget()
+ ..()
+ if(isliving(target) && target != src)
+ var/mob/living/L = target
+ if(L.stat < DEAD)
+ L.heal_overall_damage(heal_power, heal_power)
+ new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
+
+/mob/living/simple_animal/hostile/lightgeist/ghostize()
+ if(..())
+ death()
+
+/obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it.
+ activation_method = "touch"
+ cooldown_add = 50
+ activation_sound = 'sound/magic/TIMEPARADOX2.ogg'
+ var/list/banned_items_typecache = list(/obj/item/weapon/storage, /obj/item/weapon/implant, /obj/item/weapon/implanter, /obj/item/weapon/disk/nuclear, /obj/item/projectile, /obj/item/weapon/spellbook)
+
+/obj/machinery/anomalous_crystal/refresher/New()
+ ..()
+ banned_items_typecache = typecacheof(banned_items_typecache)
+
+
+/obj/machinery/anomalous_crystal/refresher/ActivationReaction(mob/user, method)
+ if(..())
+ var/list/L = list()
+ var/turf/T = get_step(src, dir)
+ new /obj/effect/overlay/temp/emp/pulse(T)
+ for(var/i in T)
+ if(istype(i, /obj/item) && !is_type_in_typecache(i, banned_items_typecache))
+ var/obj/item/W = i
+ if(!W.admin_spawned)
+ L += W
+ if(L.len)
+ var/obj/item/CHOSEN = pick(L)
+ new CHOSEN.type(T)
+ qdel(CHOSEN)
+
+/obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU.
+ activation_method = "touch"
+
+/obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method)
+ if(..())
+ if(ishuman(user))
+ var/mobcheck = 0
+ for(var/mob/living/simple_animal/A in range(1, src))
+ if(A.melee_damage_upper > 5 || A.mob_size >= MOB_SIZE_LARGE || A.ckey || A.stat)
+ break
+ var/obj/structure/closet/stasis/S = new /obj/structure/closet/stasis(A)
+ user.forceMove(S)
+ mobcheck = 1
+ break
+ if(!mobcheck)
+ new /mob/living/simple_animal/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it
+
+/obj/structure/closet/stasis
+ name = "quantum entanglement stasis warp field"
+ desc = "You can hardly comprehend this thing... which is why you can't see it."
+ icon_state = null //This shouldn't even be visible, so if it DOES show up, at least nobody will notice
+ density = 1
+ anchored = 1
+ var/mob/living/simple_animal/holder_animal
+
+/obj/structure/closet/stasis/process()
+ if(holder_animal)
+ if(holder_animal.stat == DEAD && !qdeleted(holder_animal))
+ dump_contents()
+ holder_animal.gib()
+ return
+
+/obj/structure/closet/stasis/New()
+ ..()
+ if(isanimal(loc))
+ holder_animal = loc
+ processing_objects.Add(src)
+
+/obj/structure/closet/stasis/Entered(atom/A)
+ if(isliving(A) && holder_animal)
+ var/mob/living/L = A
+ L.notransform = 1
+ L.disabilities |= MUTE
+ L.status_flags |= GODMODE
+ L.mind.transfer_to(holder_animal)
+ var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession
+ holder_animal.mind.AddSpell(P)
+ holder_animal.verbs -= /mob/living/verb/pulled
+
+/obj/structure/closet/stasis/dump_contents(var/kill = 1)
+ processing_objects.Remove(src)
+ for(var/mob/living/L in src)
+ L.disabilities &= ~MUTE
+ L.status_flags &= ~GODMODE
+ L.notransform = 0
+ if(holder_animal && !qdeleted(holder_animal))
+ holder_animal.mind.transfer_to(L)
+ L.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
+ if(kill || !isanimal(loc))
+ L.death(0)
+ ..()
+
+/obj/structure/closet/stasis/emp_act()
+ return
+
+/obj/structure/closet/stasis/ex_act()
+ return
+
+/obj/effect/proc_holder/spell/targeted/exit_possession
+ name = "Exit Possession"
+ desc = "Exits the body you are possessing"
+ charge_max = 60
+ clothes_req = 0
+ invocation_type = "none"
+ max_targets = 1
+ range = -1
+ include_user = 1
+ selection_type = "view"
+ action_icon_state = "exit_possession"
+ sound = null
+
+/obj/effect/proc_holder/spell/targeted/exit_possession/cast(list/targets, mob/user = usr)
+ if(!isfloorturf(user.loc))
+ return
+ var/datum/mind/target_mind = user.mind
+ var/mob/living/current = user // Saving the current mob here to gib as usr seems to get confused after the mind's been transferred, due to delay in transfer_to
+ for(var/i in user)
+ if(istype(i, /obj/structure/closet/stasis))
+ var/obj/structure/closet/stasis/S = i
+ S.dump_contents(0)
+ qdel(S)
+ break
+ current.gib()
+ target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm
new file mode 100644
index 00000000000..64689a3a535
--- /dev/null
+++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm
@@ -0,0 +1,188 @@
+/obj/item/weapon/hierophant_staff
+ name = "Hierophant's staff"
+ desc = "A large club with intense magic power infused into it."
+ icon_state = "hierophant_staff"
+ item_state = "hierophant_staff"
+ icon = 'icons/obj/guns/magic.dmi'
+ slot_flags = SLOT_BACK
+ w_class = WEIGHT_CLASS_BULKY
+ force = 20
+ hitsound = "swing_hit"
+ //hitsound = 'sound/weapons/sonic_jackhammer.ogg'
+ actions_types = list(/datum/action/item_action/vortex_recall, /datum/action/item_action/toggle_unfriendly_fire)
+ var/cooldown_time = 20 //how long the cooldown between non-melee ranged attacks is
+ var/chaser_cooldown = 101 //how long the cooldown between firing chasers at mobs is
+ var/chaser_timer = 0 //what our current chaser cooldown is
+ var/timer = 0 //what our current cooldown is
+ var/blast_range = 3 //how long the cardinal blast's walls are
+ var/obj/effect/hierophant/rune //the associated rune we teleport to
+ var/teleporting = FALSE //if we ARE teleporting
+ var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets
+
+/obj/item/weapon/hierophant_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ ..()
+ var/turf/T = get_turf(target)
+ if(!T || timer > world.time)
+ return
+ timer = world.time + CLICK_CD_MELEE //by default, melee attacks only cause melee blasts, and have an accordingly short cooldown
+ if(proximity_flag)
+ spawn(0)
+ aoe_burst(T, user)
+ add_logs(user, target, "fired 3x3 blast at", src)
+ else
+ if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it)
+ spawn(0)
+ cardinal_blasts(T, user)
+ timer = world.time + cooldown_time
+ else if(target in view(5, get_turf(user))) //if the target is in view, hit it
+ timer = world.time + cooldown_time
+ if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
+ chaser_timer = world.time + chaser_cooldown
+ new /obj/effect/overlay/temp/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check)
+ add_logs(user, target, "fired a chaser at", src)
+ else
+ spawn(0)
+ cardinal_blasts(T, user) //otherwise, just do cardinal blast
+ add_logs(user, target, "fired cardinal blast at", src)
+ else
+ to_chat(user, "That target is out of range! ") //too far away
+
+/obj/item/weapon/hierophant_staff/ui_action_click(mob/user, actiontype)
+ if(actiontype == /datum/action/item_action/toggle_unfriendly_fire) //toggle friendly fire...
+ friendly_fire_check = !friendly_fire_check
+ to_chat(user, "You toggle friendly fire [friendly_fire_check ? "off":"on"]! ")
+ return
+ if(user.get_active_hand() != src && user.get_inactive_hand() != src) //you need to hold the staff to teleport
+ to_chat(user, "You need to hold the staff in your hands to [rune ? "teleport with it" : "create a rune"]! ")
+ return
+ if(!rune)
+ if(isturf(user.loc))
+ user.visible_message("[user] holds [src] carefully in front of them, moving it in a strange pattern... ", \
+ "You start creating a hierophant rune to teleport to... ")
+ timer = world.time + 51
+ if(do_after(user, 50, target = user))
+ var/turf/T = get_turf(user)
+ playsound(T,'sound/magic/Blind.ogg', 200, 1, -4)
+ new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
+ var/obj/effect/hierophant/H = new/obj/effect/hierophant(T)
+ rune = H
+ user.update_action_buttons_icon()
+ user.visible_message("[user] creates a strange rune beneath them! ", \
+ "You create a hierophant rune, which you can teleport yourself and any allies to at any time! \n\
+ You can remove the rune to place a new one by striking it with the staff. ")
+ else
+ timer = world.time
+ else
+ to_chat(user, "You need to be on solid ground to produce a rune! ")
+ return
+ if(get_dist(user, rune) <= 2) //rune too close abort
+ to_chat(user, "You are too close to the rune to teleport to it! ")
+ return
+ if(is_blocked_turf(get_turf(rune)))
+ to_chat(user, "The rune is blocked by something, preventing teleportation! ")
+ return
+ teleporting = TRUE //start channel
+ user.update_action_buttons_icon()
+ user.visible_message("[user] starts to glow faintly... ")
+ timer = world.time + 50
+ if(do_after(user, 40, target = user) && rune)
+ var/turf/T = get_turf(rune)
+ var/turf/source = get_turf(user)
+ if(is_blocked_turf(T))
+ teleporting = FALSE
+ to_chat(user, "The rune is blocked by something, preventing teleportation! ")
+ user.update_action_buttons_icon()
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
+ new /obj/effect/overlay/temp/hierophant/telegraph(source, user)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
+ playsound(source,'sound/magic/blink.ogg', 200, 1)
+ //playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
+ if(!do_after(user, 3, target = user) || !rune) //no walking away shitlord
+ teleporting = FALSE
+ if(user)
+ user.update_action_buttons_icon()
+ return
+ if(is_blocked_turf(T))
+ teleporting = FALSE
+ to_chat(user, "The rune is blocked by something, preventing teleportation! ")
+ user.update_action_buttons_icon()
+ return
+ add_logs(user, rune, "teleported self from ([source.x],[source.y],[source.z]) to")
+ new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
+ new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user)
+ for(var/t in RANGE_TURFS(1, T))
+ var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
+ B.damage = 30
+ for(var/t in RANGE_TURFS(1, source))
+ var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
+ B.damage = 30
+ for(var/mob/living/L in range(1, source))
+ spawn(0)
+ teleport_mob(source, L, T, user) //regardless, take all mobs near us along
+ sleep(6) //at this point the blasts detonate
+ else
+ timer = world.time
+ teleporting = FALSE
+ if(user)
+ user.update_action_buttons_icon()
+
+/obj/item/weapon/hierophant_staff/proc/teleport_mob(turf/source, mob/M, turf/target, mob/user)
+ var/turf/turf_to_teleport_to = get_step(target, get_dir(source, M)) //get position relative to caster
+ if(!turf_to_teleport_to || is_blocked_turf(turf_to_teleport_to))
+ return
+ animate(M, alpha = 0, time = 2, easing = EASE_OUT) //fade out
+ sleep(1)
+ if(!M)
+ return
+ M.visible_message("[M] fades out! ")
+ sleep(2)
+ if(!M)
+ return
+ M.forceMove(turf_to_teleport_to)
+ sleep(1)
+ if(!M)
+ return
+ animate(M, alpha = 255, time = 2, easing = EASE_IN) //fade IN
+ sleep(1)
+ if(!M)
+ return
+ M.visible_message("[M] fades in! ")
+ if(user != M)
+ add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])")
+
+/obj/item/weapon/hierophant_staff/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
+ if(!T)
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ sleep(2)
+ new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check)
+ for(var/d in cardinal)
+ spawn(0)
+ blast_wall(T, d, user)
+
+/obj/item/weapon/hierophant_staff/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long
+ if(!T)
+ return
+ var/range = blast_range
+ var/turf/previousturf = T
+ var/turf/J = get_step(previousturf, dir)
+ for(var/i in 1 to range)
+ if(!J)
+ return
+ new /obj/effect/overlay/temp/hierophant/blast(J, user, friendly_fire_check)
+ previousturf = J
+ J = get_step(previousturf, dir)
+
+/obj/item/weapon/hierophant_staff/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
+ if(!T)
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ sleep(2)
+ for(var/t in RANGE_TURFS(1, T))
+ new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check)
diff --git a/code/modules/mining/lavaland/loot/legion_loot.dm b/code/modules/mining/lavaland/loot/legion_loot.dm
new file mode 100644
index 00000000000..f85a6a57aac
--- /dev/null
+++ b/code/modules/mining/lavaland/loot/legion_loot.dm
@@ -0,0 +1,52 @@
+/obj/item/weapon/staff/storm
+ name = "staff of storms"
+ desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it."
+ icon_state = "staffofstorms"
+ item_state = "staffofstorms"
+ icon = 'icons/obj/guns/magic.dmi'
+ slot_flags = SLOT_BACK
+ item_state = "staffofstorms"
+ w_class = WEIGHT_CLASS_BULKY
+ force = 25
+ damtype = BURN
+ hitsound = 'sound/weapons/sear.ogg'
+ var/storm_type = /datum/weather/ash_storm
+ var/storm_cooldown = 0
+
+/obj/item/weapon/staff/storm/attack_self(mob/user)
+ if(storm_cooldown > world.time)
+ to_chat(user, "The staff is still recharging! ")
+ return
+
+ var/area/user_area = get_area(user)
+ var/datum/weather/A
+ var/z_level_name = space_manager.levels_by_name[user.z]
+ for(var/V in weather_master.existing_weather)
+ var/datum/weather/W = V
+ if(W.target_z == z_level_name && W.area_type == user_area.type)
+ A = W
+ break
+ if(A)
+
+ if(A.stage != END_STAGE)
+ if(A.stage == WIND_DOWN_STAGE)
+ to_chat(user, "The storm is already ending! It would be a waste to use the staff now. ")
+ return
+ user.visible_message("[user] holds [src] skywards as an orange beam travels into the sky! ", \
+ "You hold [src] skyward, dispelling the storm! ")
+ playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0)
+ A.wind_down()
+ return
+ else
+ A = new storm_type
+ A.name = "staff storm"
+ A.area_type = user_area.type
+ A.target_z = z_level_name
+ A.telegraph_duration = 100
+ A.end_duration = 100
+
+ user.visible_message("[user] holds [src] skywards as red lightning crackles into the sky! ", \
+ "You hold [src] skyward, calling down a terrible storm! ")
+ playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0)
+ A.telegraph()
+ storm_cooldown = world.time + 200
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
new file mode 100644
index 00000000000..1c2093ce8c2
--- /dev/null
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -0,0 +1,394 @@
+//Shared Bag
+
+//Internal
+/obj/item/weapon/storage/backpack/shared
+ name = "paradox bag"
+ desc = "Somehow, it's in two places at once."
+ max_combined_w_class = 60
+ max_w_class = WEIGHT_CLASS_NORMAL
+
+//External
+/obj/item/device/shared_storage
+ name = "paradox bag"
+ desc = "Somehow, it's in two places at once."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "cultpack"
+ slot_flags = SLOT_BACK
+ var/obj/item/weapon/storage/backpack/shared/bag
+
+/obj/item/device/shared_storage/red
+ name = "paradox bag"
+ desc = "Somehow, it's in two places at once."
+
+/obj/item/device/shared_storage/red/New()
+ ..()
+ if(!bag)
+ var/obj/item/weapon/storage/backpack/shared/S = new(src)
+ var/obj/item/device/shared_storage/blue = new(loc)
+
+ bag = S
+ blue.bag = S
+
+/obj/item/device/shared_storage/attackby(obj/item/W, mob/user, params)
+ if(bag)
+ bag.loc = user
+ bag.attackby(W, user, params)
+
+/obj/item/device/shared_storage/attack_self(mob/living/carbon/user)
+ if(!iscarbon(user))
+ return
+ if(src == user.l_hand || src == user.r_hand)
+ if(bag)
+ bag.loc = user
+ bag.attack_hand(user)
+ else
+ ..()
+
+/obj/item/device/shared_storage/attack_hand(mob/living/carbon/user)
+ if(!iscarbon(user))
+ return
+ if(loc == user && user.back && user.back == src)
+ if(bag)
+ bag.loc = user
+ bag.attack_hand(user)
+ else
+ ..()
+
+/obj/item/device/shared_storage/MouseDrop(atom/over_object)
+ if(iscarbon(usr))
+ var/mob/M = usr
+
+ if(!over_object)
+ return
+
+ if(istype(M.loc, /obj/mecha))
+ return
+
+ if(!M.restrained() && !M.stat)
+ playsound(loc, "rustle", 50, 1, -5)
+
+ if(istype(over_object, /obj/screen/inventory/hand))
+ if(!M.unEquip(src))
+ return
+ M.put_in_active_hand(src)
+ else if(bag)
+ bag.loc = usr
+ bag.attack_hand(usr)
+
+ add_fingerprint(M)
+
+//Potion of Flight: as we do not have the "Angel" species this currently does not work.
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "potionflask"
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/flight
+ name = "strange elixir"
+ desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'."
+ list_reagents = list("flightpotion" = 5)
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/update_icon()
+ if(reagents.total_volume)
+ icon_state = "potionflask"
+ else
+ icon_state = "potionflask_empty"
+
+/datum/reagent/flightpotion
+ name = "Flight Potion"
+ id = "flightpotion"
+ description = "Strange mutagenic compound of unknown origins."
+ reagent_state = LIQUID
+ color = "#FFEBEB"
+
+/datum/reagent/flightpotion/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1)
+ to_chat(M, "This item is currently non-functional. ")
+ /*if(ishuman(M) && M.stat != DEAD)
+ var/mob/living/carbon/human/H = M
+ if(H.species.name != "Human" || reac_volume < 5) // implying xenohumans are holy
+ if(method == INGEST && show_message)
+ to_chat(H, "You feel nothing but a terrible aftertaste. ")
+ return ..()
+
+ to_chat(H, "A terrible pain travels down your back as wings burst out! ")
+ H.set_species("Angel")
+ playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
+ H.adjustBruteLoss(20)
+ H.emote("scream")
+ ..()*/
+
+//Boat
+
+/obj/vehicle/lavaboat
+ name = "lava boat"
+ desc = "A boat used for traversing lava."
+ icon_state = "goliath_boat"
+ icon = 'icons/obj/lavaland/dragonboat.dmi'
+ keytype = /obj/item/weapon/oar
+ burn_state = LAVA_PROOF | FIRE_PROOF
+
+/obj/vehicle/lavaboat/relaymove(mob/user, direction)
+ var/turf/next = get_step(src, direction)
+ var/turf/current = get_turf(src)
+
+ if(istype(next, /turf/unsimulated/floor/lava) || istype(current, /turf/unsimulated/floor/lava)) //We can move from land to lava, or lava to land, but not from land to land
+ ..()
+ else
+ to_chat(user, "Boats don't go on land! ")
+ return 0
+
+/obj/item/weapon/oar
+ name = "oar"
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "oar"
+ item_state = "rods"
+ desc = "Not to be confused with the kind Research hassles you for."
+ force = 12
+ w_class = WEIGHT_CLASS_NORMAL
+ burn_state = LAVA_PROOF | FIRE_PROOF
+
+/datum/crafting_recipe/oar
+ name = "goliath bone oar"
+ result = /obj/item/weapon/oar
+ reqs = list(/obj/item/stack/sheet/bone = 2)
+ time = 15
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/boat
+ name = "goliath hide boat"
+ result = /obj/vehicle/lavaboat
+ reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
+ time = 50
+ category = CAT_PRIMAL
+
+//Dragon Boat
+
+/obj/item/ship_in_a_bottle
+ name = "ship in a bottle"
+ desc = "A tiny ship inside a bottle."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "ship_bottle"
+
+/obj/item/ship_in_a_bottle/attack_self(mob/user)
+ to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.")
+ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
+ new /obj/vehicle/lavaboat/dragon(get_turf(src))
+ qdel(src)
+
+/obj/vehicle/lavaboat/dragon
+ name = "mysterious boat"
+ desc = "This boat moves where you will it, without the need for an oar."
+ keytype = null
+ icon_state = "dragon_boat"
+ generic_pixel_y = 2
+ generic_pixel_x = 1
+ vehicle_move_delay = 1
+
+// Wisp Lantern
+/obj/item/device/wisp_lantern
+ name = "spooky lantern"
+ desc = "This lantern gives off no light, but is home to a friendly wisp."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "lantern-blue"
+ var/obj/effect/wisp/wisp
+
+/obj/item/device/wisp_lantern/attack_self(mob/user)
+ if(!wisp)
+ to_chat(user, "The wisp has gone missing! ")
+ return
+ if(wisp.loc == src)
+ to_chat(user, "You release the wisp. It begins to bob around your head. ")
+ user.sight |= SEE_MOBS
+ icon_state = "lantern"
+ wisp.orbit(user, 20, forceMove = TRUE)
+ feedback_add_details("wisp_lantern","F") // freed
+
+ else
+ to_chat(user, "You return the wisp to the lantern. ")
+
+ if(wisp.orbiting)
+ var/atom/A = wisp.orbiting
+ if(isliving(A))
+ var/mob/living/M = A
+ M.sight &= ~SEE_MOBS
+ to_chat(M, "Your vision returns to normal. ")
+
+ wisp.stop_orbit()
+ wisp.loc = src
+ icon_state = "lantern-blue"
+ feedback_add_details("wisp_lantern","R") // returned
+
+/obj/item/device/wisp_lantern/New()
+ ..()
+ wisp = new(src)
+
+/obj/item/device/wisp_lantern/Destroy()
+ if(wisp)
+ if(wisp.loc == src)
+ qdel(wisp)
+ else
+ wisp.visible_message("[wisp] has a sad feeling for a moment, then it passes. ")
+ return ..()
+
+/obj/effect/wisp
+ name = "friendly wisp"
+ desc = "Happy to light your way."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "orb"
+ layer = ABOVE_ALL_MOB_LAYER
+ light_power = 1
+ light_range = 7
+
+//Red/Blue Cubes
+
+/obj/item/device/warp_cube
+ name = "blue cube"
+ desc = "A mysterious blue cube."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "blue_cube"
+ var/obj/item/device/warp_cube/linked
+
+/obj/item/device/warp_cube/Destroy()
+ if(linked)
+ linked.linked = null
+ linked = null
+ return ..()
+
+/obj/item/device/warp_cube/attack_self(mob/user)
+ if(!linked)
+ to_chat(user, "[src] fizzles uselessly.")
+ return
+
+ var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ smoke.set_up(1, 0, user.loc)
+ smoke.start()
+
+ user.forceMove(get_turf(linked))
+ feedback_add_details("warp_cube","[src.type]")
+
+ var/datum/effect/system/harmless_smoke_spread/smoke2 = new /datum/effect/system/harmless_smoke_spread()
+ smoke2.set_up(1, 0, user.loc)
+ smoke2.start()
+
+/obj/item/device/warp_cube/red
+ name = "red cube"
+ desc = "A mysterious red cube."
+ icon_state = "red_cube"
+
+/obj/item/device/warp_cube/red/New()
+ ..()
+ if(!linked)
+ var/obj/item/device/warp_cube/blue = new(src.loc)
+ linked = blue
+ blue.linked = src
+
+//Meat Hook
+
+/obj/item/weapon/gun/magic/hook
+ name = "meat hook"
+ desc = "Mid or feed."
+ ammo_type = /obj/item/ammo_casing/magic/hook
+ icon_state = "hook"
+ item_state = "chain"
+ fire_sound = 'sound/weapons/batonextend.ogg'
+ max_charges = 1
+ flags = NOBLUDGEON
+ force = 18
+
+/obj/item/ammo_casing/magic/hook
+ name = "hook"
+ desc = "a hook."
+ projectile_type = /obj/item/projectile/hook
+ caliber = "hook"
+ icon_state = "hook"
+
+/obj/item/projectile/hook
+ name = "hook"
+ icon_state = "hook"
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ pass_flags = PASSTABLE
+ damage = 25
+ armour_penetration = 100
+ damage_type = BRUTE
+ hitsound = 'sound/effects/splat.ogg'
+ weaken = 3
+ var/chain
+
+/obj/item/projectile/hook/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
+ ..()
+ //TODO: root the firer until the chain returns
+
+/obj/item/projectile/hook/on_hit(atom/target)
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(!L.anchored)
+ L.visible_message("[L] is snagged by [firer]'s hook! ")
+ L.forceMove(get_turf(firer))
+
+/obj/item/projectile/hook/Destroy()
+ QDEL_NULL(chain)
+ return ..()
+
+//Immortality Talisman
+
+/obj/item/device/immortality_talisman
+ name = "Immortality Talisman"
+ desc = "A dread talisman that can render you completely invulnerable."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "talisman"
+ actions_types = list(/datum/action/item_action/immortality)
+ var/cooldown = 0
+
+/datum/action/item_action/immortality
+ name = "Immortality"
+
+/obj/item/device/immortality_talisman/Destroy(force)
+ if(force)
+ . = ..()
+ else
+ return QDEL_HINT_LETMELIVE
+
+/obj/item/device/immortality_talisman/attack_self(mob/user)
+ if(cooldown < world.time)
+ feedback_add_details("immortality_talisman","U") // usage
+ cooldown = world.time + 600
+ user.visible_message("[user] vanishes from reality, leaving a a hole in their place! ")
+ var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc))
+ Z.name = "hole in reality"
+ Z.desc = "It's shaped an awful lot like [user.name]."
+ Z.setDir(user.dir)
+ user.forceMove(Z)
+ user.notransform = 1
+ user.status_flags |= GODMODE
+ spawn(100)
+ user.status_flags &= ~GODMODE
+ user.notransform = 0
+ user.forceMove(get_turf(Z))
+ user.visible_message("[user] pops back into reality! ")
+ Z.can_destroy = TRUE
+ qdel(Z)
+ else
+ to_chat(user, "[src] is still recharging. ")
+
+/obj/effect/immortality_talisman
+ icon_state = "blank"
+ icon = 'icons/effects/effects.dmi'
+ var/can_destroy = FALSE
+
+/obj/effect/immortality_talisman/attackby()
+ return
+
+/obj/effect/immortality_talisman/ex_act()
+ return
+
+/obj/effect/immortality_talisman/singularity_pull()
+ return 0
+
+/obj/effect/immortality_talisman/Destroy(force)
+ if(!can_destroy && !force)
+ return QDEL_HINT_LETMELIVE
+ else
+ . = ..()
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
new file mode 100644
index 00000000000..6c34b6e0570
--- /dev/null
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -0,0 +1,72 @@
+//The chests dropped by mob spawner tendrils. Also contains associated loot.
+
+/obj/structure/closet/crate/necropolis
+ name = "necropolis chest"
+ desc = "It's watching you closely."
+ icon_state = "necrocrate"
+ icon_opened = "necrocrateopen"
+ icon_closed = "necrocrate"
+ burn_state = LAVA_PROOF | FIRE_PROOF
+ unacidable = 1
+
+/obj/structure/closet/crate/necropolis/tendril
+ desc = "It's watching you suspiciously."
+
+/obj/structure/closet/crate/necropolis/tendril/New()
+ ..()
+ var/loot = rand(1,24)
+ switch(loot)
+ if(1)
+ new /obj/item/device/shared_storage/red(src)
+ if(2)
+ new /obj/item/clothing/head/helmet/space/cult(src)
+ new /obj/item/clothing/suit/space/cult(src)
+ if(3)
+ new /obj/item/device/soulstone/anybody(src)
+ if(4)
+ new /obj/item/weapon/katana/cursed(src)
+ if(5)
+ new /obj/item/clothing/glasses/godeye(src)
+ if(6)
+ new /obj/item/weapon/pickaxe/diamond(src)
+ if(7)
+ new /obj/item/clothing/head/culthood(src)
+ new /obj/item/clothing/suit/hooded/cultrobes(src)
+ new /obj/item/weapon/bedsheet/cult(src)
+ if(8)
+ new /obj/item/organ/internal/brain/xeno(src)
+ if(9)
+ new /obj/item/organ/internal/heart/cursed(src)
+ if(10)
+ new /obj/item/ship_in_a_bottle(src)
+ if(11)
+ new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker(src)
+ if(12)
+ new /obj/item/weapon/sord(src)
+ if(13)
+ new /obj/item/weapon/nullrod/scythe/talking(src)
+ if(14)
+ new /obj/item/weapon/nullrod/armblade(src)
+ if(15)
+ new /obj/item/weapon/guardiancreator(src)
+ if(16)
+ new /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs(src)
+ if(17)
+ new /obj/item/device/warp_cube/red(src)
+ if(18)
+ new /obj/item/device/wisp_lantern(src)
+ if(19)
+ new /obj/item/device/immortality_talisman(src)
+ if(20)
+ new /obj/item/weapon/gun/magic/hook(src)
+ if(21)
+ new /obj/item/voodoo(src)
+ if(22)
+ new /obj/item/weapon/grenade/clusterbuster/inferno(src)
+ if(23)
+ new /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
+ if(24)
+ new /obj/item/weapon/spellbook/oneuse/summonitem(src)
\ No newline at end of file
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index c824934ee8b..212e8488ac8 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -297,24 +297,6 @@
else
on = 0
continue
- //THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
- //They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
- /*if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if(ore_uranium >= 2 && ore_diamond >= 1)
- ore_uranium -= 2
- ore_diamond -= 1
- generate_mineral(/obj/item/stack/sheet/mineral/adamantine)
- else
- on = 0
- continue
- if(selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if(ore_silver >= 1 && ore_plasma >= 3)
- ore_silver -= 1
- ore_plasma -= 3
- generate_mineral(/obj/item/stack/sheet/mineral/mythril)
- else
- on = 0
- continue*/
//if a non valid combination is selected
@@ -424,4 +406,4 @@
/obj/machinery/mineral/processing_unit/proc/generate_mineral(var/P)
var/O = new P(src)
- unload_mineral(O)
\ No newline at end of file
+ unload_mineral(O)
diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm
index 96ef9d3104b..e07d779c9a8 100644
--- a/code/modules/mining/mine_areas.dm
+++ b/code/modules/mining/mine_areas.dm
@@ -13,6 +13,7 @@
power_environ = 0
power_equip = 0
power_light = 0
+ outdoors = 1
ambientsounds = list('sound/ambience/ambimine.ogg')
/area/mine/dangerous/unexplored
@@ -25,6 +26,7 @@
power_environ = 0
power_equip = 0
power_light = 0
+ outdoors = 1
ambientsounds = list('sound/ambience/ambimine.ogg')
/area/mine/lobby
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 83e794b9d20..fba1c56fac0 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -2,10 +2,12 @@
//this item is intended to give the effect of entering the mine, so that light gradually fades
/obj/effect/light_emitter
- name = "Light-emtter"
+ name = "Light emtter"
anchored = 1
+ invisibility = 101
unacidable = 1
light_range = 8
+ light_power = 0
/**********************Miner Lockers**************************/
@@ -77,7 +79,7 @@
force = 15.0
throwforce = 10.0
item_state = "pickaxe"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
origin_tech = "materials=1;engineering=1"
@@ -87,9 +89,11 @@
sharp = 1
edge = 1
var/excavation_amount = 100
+ usesound = 'sound/effects/picaxe1.ogg'
+ toolspeed = 1
/obj/item/weapon/pickaxe/proc/playDigSound()
- playsound(src, pick(digsound),20,1)
+ playsound(src, pick(digsound),20,1)
/obj/item/weapon/pickaxe/silver
name = "silver-plated pickaxe"
@@ -98,6 +102,16 @@
digspeed = 30 //mines faster than a normal pickaxe, bought from mining vendor
origin_tech = "materials=3;engineering=2"
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
+ toolspeed = 0.75
+
+/obj/item/weapon/pickaxe/gold
+ name = "golden pickaxe"
+ icon_state = "gpickaxe"
+ item_state = "gpickaxe"
+ digspeed = 20
+ origin_tech = "materials=4;engineering=2"
+ desc = "A gold-plated pickaxe that mines faster than standard-issue."
+ toolspeed = 0.6
/obj/item/weapon/pickaxe/diamond
name = "diamond-tipped pickaxe"
@@ -106,6 +120,7 @@
digspeed = 20 //mines twice as fast as a normal pickaxe, bought from mining vendor
origin_tech = "materials=4;engineering=3"
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
+ toolspeed = 0.5
/obj/item/weapon/pickaxe/drill
name = "mining drill"
@@ -114,8 +129,10 @@
digspeed = 25 //available from roundstart, faster than a pickaxe.
digsound = list('sound/weapons/drill.ogg')
hitsound = 'sound/weapons/drill.ogg'
+ usesound = 'sound/weapons/drill.ogg'
origin_tech = "materials=2;powerstorage=3;engineering=2"
desc = "An electric mining drill for the especially scrawny."
+ toolspeed = 0.5
/obj/item/weapon/pickaxe/drill/cyborg
name = "cyborg mining drill"
@@ -128,18 +145,20 @@
digspeed = 10
origin_tech = "materials=6;powerstorage=4;engineering=5"
desc = "Yours is the drill that will pierce the heavens!"
+ toolspeed = 0.25
/obj/item/weapon/pickaxe/diamonddrill/traitor //Pocket-sized traitor diamond drill.
name = "supermatter drill"
icon_state = "smdrill"
origin_tech = "materials=6;powerstorage=4;engineering=5;syndicate=3"
desc = "Microscopic supermatter crystals cover the head of this tiny drill."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
icon_state = "diamonddrill"
digspeed = 10
+ toolspeed = 0.25
/obj/item/weapon/pickaxe/drill/jackhammer
name = "sonic jackhammer"
@@ -149,23 +168,10 @@
origin_tech = "materials=3;powerstorage=2;engineering=2"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
+ toolspeed = 0.1
-/obj/item/weapon/pickaxe/silver
- name = "silver pickaxe"
- icon_state = "spickaxe"
- item_state = "spickaxe"
- digspeed = 30
- origin_tech = "materials=3"
- desc = "This makes no metallurgic sense."
-
-/obj/item/weapon/pickaxe/gold
- name = "golden pickaxe"
- icon_state = "gpickaxe"
- item_state = "gpickaxe"
- digspeed = 20
- origin_tech = "materials=4"
- desc = "This makes no metallurgic sense."
/*****************************Shovel********************************/
/obj/item/weapon/shovel
@@ -178,10 +184,12 @@
force = 8.0
throwforce = 4.0
item_state = "shovel"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=50)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
+ usesound = 'sound/effects/shovel_dig.ogg'
+ toolspeed = 1
/obj/item/weapon/shovel/spade
name = "spade"
@@ -190,7 +198,8 @@
item_state = "spade"
force = 5.0
throwforce = 7.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
+ toolspeed = 2
/**********************Mining car (Crate like thing, not the rail car)**************************/
@@ -198,7 +207,6 @@
/obj/structure/closet/crate/miningcar
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
name = "mining car (not for rails)"
- icon = 'icons/obj/storage.dmi'
icon_state = "miningcar"
density = 1
icon_opened = "miningcaropen"
@@ -211,15 +219,15 @@
desc = "It allows you to store and deploy lazarus-injected creatures easier."
icon = 'icons/obj/mobcap.dmi'
icon_state = "mobcap0"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_range = 20
var/mob/living/simple_animal/captured = null
var/colorindex = 0
/obj/item/device/mobcapsule/Destroy()
if(captured)
- qdel(captured)
- captured = null
+ captured.ghostize()
+ QDEL_NULL(captured)
return ..()
/obj/item/device/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
@@ -274,7 +282,7 @@
desc = "An emergency shelter stored within a pocket of bluespace."
icon_state = "capsule"
icon = 'icons/obj/mining.dmi'
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "engineering=3;bluespace=3"
var/template_id = "shelter_alpha"
var/datum/map_template/shelter/template
@@ -392,10 +400,10 @@
/obj/item/device/gps/computer/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] disassembles the gps. ", \
"You start to disassemble the gps... ", "You hear clanking and banging noises.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
new /obj/item/device/gps(loc)
qdel(src)
return ..()
@@ -470,10 +478,10 @@
/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] disassembles the fan. ", \
"You start to disassemble the fan... ", "You hear clanking and banging noises.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
deconstruct()
return ..()
@@ -521,10 +529,10 @@
/obj/structure/tubes/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] disassembles [src]. ", \
"You start to disassemble [src]... ", "You hear clanking and banging noises.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
new /obj/item/stack/rods(loc)
qdel(src)
return ..()
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 623192ff820..d57f509e13e 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -470,14 +470,14 @@ var/global/list/rockTurfEdgeCache = list(
src.gets_dug()
return
-/turf/simulated/floor/plating/airless/asteroid/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/turf/simulated/floor/plating/airless/asteroid/attackby(obj/item/weapon/W, mob/user, params)
//note that this proc does not call ..()
if(!W || !user)
return 0
if((istype(W, /obj/item/weapon/shovel)))
- var/turf/T = user.loc
- if(!( istype(T, /turf) ))
+ var/turf/T = get_turf(user)
+ if(!istype(T))
return
if(dug)
@@ -485,17 +485,15 @@ var/global/list/rockTurfEdgeCache = list(
return
to_chat(user, "You start digging... ")
-
- sleep(20)
- if((user.loc == T && user.get_active_hand() == W))
+ if(do_after(user, 20 * W.toolspeed, target = src))
to_chat(user, "You dig a hole. ")
gets_dug()
return
if((istype(W, /obj/item/weapon/pickaxe)))
var/obj/item/weapon/pickaxe/P = W
- var/turf/T = user.loc
- if(!( istype(T, /turf) ))
+ var/turf/T = get_turf(user)
+ if(!istype(T))
return
if(dug)
@@ -504,8 +502,7 @@ var/global/list/rockTurfEdgeCache = list(
to_chat(user, "You start digging... ")
- sleep(P.digspeed)
- if((user.loc == T && user.get_active_hand() == W))
+ if(do_after(user, P.digspeed, target = src))
to_chat(user, "You dig a hole. ")
gets_dug()
return
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
new file mode 100644
index 00000000000..575fbf3b5b6
--- /dev/null
+++ b/code/modules/mining/minebot.dm
@@ -0,0 +1,303 @@
+/**********************Mining drone**********************/
+#define MINEDRONE_COLLECT 1
+#define MINEDRONE_ATTACK 2
+
+/mob/living/simple_animal/hostile/mining_drone
+ name = "nanotrasen minebot"
+ desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder."
+ icon = 'icons/obj/aibots.dmi'
+ icon_state = "mining_drone"
+ icon_living = "mining_drone"
+ status_flags = CANSTUN|CANWEAKEN|CANPUSH
+ mouse_opacity = 1
+ faction = list("neutral")
+ a_intent = I_HARM
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ wander = 0
+ idle_vision_range = 5
+ move_to_delay = 10
+ retreat_distance = 1
+ minimum_distance = 2
+ health = 125
+ maxHealth = 125
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ environment_smash = 0
+ check_friendly_fire = 1
+ stop_automated_movement_when_pulled = 1
+ attacktext = "drills"
+ attack_sound = 'sound/weapons/circsawhit.ogg'
+ ranged = 1
+ sentience_type = SENTIENCE_MINEBOT
+ ranged_message = "shoots"
+ ranged_cooldown_time = 30
+ projectiletype = /obj/item/projectile/kinetic
+ projectilesound = 'sound/weapons/Gunshot4.ogg'
+ speak_emote = list("states")
+ wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
+ /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
+ /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass)
+ healable = 0
+ var/mode = MINEDRONE_COLLECT
+ var/light_on = 0
+ var/mesons_active
+
+ var/datum/action/innate/minedrone/toggle_light/toggle_light_action
+ var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
+ var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
+ var/datum/action/innate/minedrone/dump_ore/dump_ore_action
+
+/mob/living/simple_animal/hostile/mining_drone/New()
+ ..()
+ toggle_light_action = new()
+ toggle_light_action.Grant(src)
+ toggle_meson_vision_action = new()
+ toggle_meson_vision_action.Grant(src)
+ toggle_mode_action = new()
+ toggle_mode_action.Grant(src)
+ dump_ore_action = new()
+ dump_ore_action.Grant(src)
+
+ SetCollectBehavior()
+
+/mob/living/simple_animal/hostile/mining_drone/sentience_act()
+ AIStatus = AI_OFF
+ check_friendly_fire = 0
+
+/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = I
+ if(W.welding && !stat)
+ if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
+ to_chat(user, "[src] is moving around too much to repair! ")
+ return
+ if(maxHealth == health)
+ to_chat(user, "[src] is at full integrity. ")
+ else
+ adjustBruteLoss(-10)
+ to_chat(user, "You repair some of the armor on [src]. ")
+ return
+ if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner))
+ to_chat(user, "You instruct [src] to drop any collected ore. ")
+ DropOre()
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/mining_drone/death()
+ ..()
+ visible_message("[src] is destroyed! ")
+ new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
+ DropOre(0)
+ qdel(src)
+ return
+
+/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
+ if(M.a_intent == I_HELP)
+ toggle_mode()
+ switch(mode)
+ if(MINEDRONE_COLLECT)
+ to_chat(M, "[src] has been set to search and store loose ore. ")
+ if(MINEDRONE_ATTACK)
+ to_chat(M, "[src] has been set to attack hostile wildlife. ")
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior()
+ mode = MINEDRONE_COLLECT
+ idle_vision_range = 9
+ search_objects = 2
+ wander = 1
+ ranged = 0
+ minimum_distance = 1
+ retreat_distance = null
+ icon_state = "mining_drone"
+ to_chat(src, "You are set to collect mode. You can now collect loose ore. ")
+
+/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior()
+ mode = MINEDRONE_ATTACK
+ idle_vision_range = 7
+ search_objects = 0
+ wander = 0
+ ranged = 1
+ retreat_distance = 1
+ minimum_distance = 2
+ icon_state = "mining_drone_offense"
+ to_chat(src, "You are set to attack mode. You can now attack from range. ")
+
+/mob/living/simple_animal/hostile/mining_drone/AttackingTarget()
+ if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT)
+ CollectOre()
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
+ var/obj/item/weapon/ore/O
+ for(O in src.loc)
+ O.forceMove(src)
+ for(var/dir in alldirs)
+ var/turf/T = get_step(src,dir)
+ for(O in T)
+ O.forceMove(src)
+ return
+
+/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
+ if(!contents.len)
+ if(message)
+ to_chat(src, "You attempt to dump your stored ore, but you have none. ")
+ return
+ if(message)
+ to_chat(src, "You dump your stored ore. ")
+ for(var/obj/item/weapon/ore/O in contents)
+ contents -= O
+ O.forceMove(loc)
+ return
+
+/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount)
+ if(mode != MINEDRONE_ATTACK && amount > 0)
+ SetOffenseBehavior()
+ . = ..()
+
+/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode()
+ switch(mode)
+ if(MINEDRONE_COLLECT)
+ SetOffenseBehavior()
+ if(MINEDRONE_ATTACK)
+ SetCollectBehavior()
+ else //This should never happen.
+ mode = MINEDRONE_COLLECT
+ SetCollectBehavior()
+
+
+/mob/living/simple_animal/hostile/mining_drone/update_sight()
+ if(!client)
+ return
+ if(stat == DEAD)
+ grant_death_vision()
+ return
+
+ if(mesons_active)
+ sight |= SEE_TURFS
+ see_invisible = SEE_INVISIBLE_MINIMUM
+ else
+ sight &= ~SEE_TURFS
+ see_invisible = SEE_INVISIBLE_LIVING
+
+ see_in_dark = initial(see_in_dark)
+
+ if(client.eye != src)
+ var/atom/A = client.eye
+ if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates.
+ return
+
+//Actions for sentient minebots
+
+/datum/action/innate/minedrone
+ check_flags = AB_CHECK_CONSCIOUS
+ background_icon_state = "bg_default"
+
+/datum/action/innate/minedrone/toggle_light
+ name = "Toggle Light"
+ button_icon_state = "mech_lights_off"
+
+/datum/action/innate/minedrone/toggle_light/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+
+ if(user.light_on)
+ user.set_light(0)
+ else
+ user.set_light(6)
+ user.light_on = !user.light_on
+ to_chat(user, "You toggle your light [user.light_on ? "on" : "off"]. ")
+
+/datum/action/innate/minedrone/toggle_meson_vision
+ name = "Toggle Meson Vision"
+ button_icon_state = "meson"
+
+/datum/action/innate/minedrone/toggle_meson_vision/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.mesons_active = !user.mesons_active
+ user.update_sight()
+
+ to_chat(user, "You toggle your meson vision [(user.mesons_active) ? "on" : "off"]. ")
+
+/datum/action/innate/minedrone/toggle_mode
+ name = "Toggle Mode"
+ button_icon_state = "mech_cycle_equip_off"
+
+/datum/action/innate/minedrone/toggle_mode/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.toggle_mode()
+
+/datum/action/innate/minedrone/dump_ore
+ name = "Dump Ore"
+ button_icon_state = "mech_eject"
+
+/datum/action/innate/minedrone/dump_ore/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.DropOre()
+
+
+/**********************Minebot Upgrades**********************/
+
+//Melee
+
+/obj/item/device/mine_bot_upgrade
+ name = "minebot melee upgrade"
+ desc = "A minebot upgrade."
+ icon_state = "door_electronics"
+ icon = 'icons/obj/doors/door_assembly.dmi'
+
+/obj/item/device/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity)
+ if(!istype(M) || !proximity)
+ return
+ upgrade_bot(M, user)
+
+/obj/item/device/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
+ if(M.melee_damage_upper != initial(M.melee_damage_upper))
+ to_chat(user, "[M] already has a combat upgrade installed!")
+ return
+ M.melee_damage_lower = 22
+ M.melee_damage_upper = 22
+ to_chat(user, "You upgrade [M]'s combat module.")
+ qdel(src)
+
+//Health
+
+/obj/item/device/mine_bot_upgrade/health
+ name = "minebot chassis upgrade"
+
+/obj/item/device/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
+ if(M.maxHealth != initial(M.maxHealth))
+ to_chat(user, "[M] already has a reinforced chassis!")
+ return
+ M.maxHealth = 170
+ to_chat(user, "You reinforce [M]'s chassis.")
+ qdel(src)
+
+
+//Cooldown
+
+/obj/item/device/mine_bot_upgrade/cooldown
+ name = "minebot cooldown upgrade"
+
+/obj/item/device/mine_bot_upgrade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
+ if(M.ranged_cooldown_time != initial(M.ranged_cooldown_time))
+ to_chat(user, "[M] already has a decreased weapon cooldown!")
+ return
+ M.ranged_cooldown_time = 10
+ to_chat(user, "You upgrade [M]'s ranged weaponry, reducing its cooldown.")
+ qdel(src)
+
+
+//AI
+/obj/item/slimepotion/sentience/mining
+ name = "minebot AI upgrade"
+ desc = "Can be used to grant sentience to minebots."
+ icon_state = "door_electronics"
+ icon = 'icons/obj/doors/door_assembly.dmi'
+ sentience_type = SENTIENCE_MINEBOT
+ origin_tech = "programming=6"
+
+#undef MINEDRONE_COLLECT
+#undef MINEDRONE_ATTACK
\ No newline at end of file
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index 95dc3a05f25..b460fc7d467 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -15,8 +15,6 @@
var/amt_uranium = 0
var/amt_clown = 0
var/amt_mime = 0
- var/amt_adamantine = 0
- var/amt_mythril = 0
var/newCoins = 0 //how many coins the machine made in it's last load
var/processing = 0
var/chosen = "metal" //which material will be used to make coins
@@ -53,7 +51,7 @@
qdel(O)
-/obj/machinery/mineral/mint/attack_hand(user as mob) //TODO: Adamantine coins! -Durandan
+/obj/machinery/mineral/mint/attack_hand(user as mob)
var/dat = "Coin Press "
@@ -99,11 +97,6 @@
dat += text("chosen")
else
dat += text("Choose ")
- dat += text("Adamantine inserted: [amt_adamantine] ")//I don't even know these color codes, so fuck it.
- if(chosen == "adamantine")
- dat += text("chosen")
- else
- dat += text("Choose ")
dat += text(" Will produce [coinsToProduce] [chosen] coins if enough materials are available. ")
//dat += text("The dial which controls the number of conins to produce seems to be stuck. A technician has already been dispatched to fix this.")
@@ -199,22 +192,6 @@
newCoins++
src.updateUsrDialog()
sleep(5)
- if("adamantine")
- while(amt_adamantine > 0 && coinsToProduce > 0)
- create_coins(/obj/item/weapon/coin/adamantine)
- amt_adamantine -= 20
- coinsToProduce--
- newCoins++
- src.updateUsrDialog()
- sleep(5)
- if("mythril")
- while(amt_adamantine > 0 && coinsToProduce > 0)
- create_coins(/obj/item/weapon/coin/mythril)
- amt_mythril -= 20
- coinsToProduce--
- newCoins++
- src.updateUsrDialog()
- sleep(5)
icon_state = "coinpress0"
processing = 0
coinsToProduce = temp_coins
@@ -229,4 +206,4 @@
if(!M)
M = new /obj/item/weapon/moneybag(src)
unload_mineral(M)
- O.loc = M
\ No newline at end of file
+ O.loc = M
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 3fa8d1c1edf..30fca5f2f95 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -9,7 +9,7 @@
throwforce = 0
burn_state = FLAMMABLE
burntime = 20
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/weapon/moneybag/attack_hand(user as mob)
var/amt_gold = 0
@@ -119,4 +119,4 @@
new /obj/item/weapon/coin/silver(src)
new /obj/item/weapon/coin/gold(src)
new /obj/item/weapon/coin/gold(src)
- new /obj/item/weapon/coin/adamantine(src)
\ No newline at end of file
+ new /obj/item/weapon/coin/adamantine(src)
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index ec36988cb20..873b6c798d1 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -63,6 +63,10 @@
refined_type = /obj/item/stack/sheet/glass
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+/obj/item/weapon/ore/glass/basalt
+ name = "volcanic ash"
+ icon_state = "volcanic_sand"
+
/obj/item/weapon/ore/glass/attack_self(mob/living/user as mob)
to_chat(user, "You use the sand to make sandstone. ")
var/sandAmt = 1
@@ -149,7 +153,7 @@
icon = 'icons/obj/mining.dmi'
icon_state = "Gibtonite ore"
item_state = "Gibtonite ore"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
throw_range = 0
anchored = 1 //Forces people to carry it by hand, no pulling!
var/primed = 0
@@ -159,8 +163,7 @@
var/datum/wires/explosive/gibtonite/wires
/obj/item/weapon/twohanded/required/gibtonite/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/item/weapon/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params)
@@ -189,7 +192,11 @@
return
..()
-/obj/item/weapon/twohanded/required/gibtonite/attack_self(user)
+/obj/item/weapon/twohanded/required/gibtonite/attack_ghost(mob/user)
+ if(wires)
+ wires.Interact(user)
+
+/obj/item/weapon/twohanded/required/gibtonite/attack_self(mob/user)
if(wires)
wires.Interact(user)
else
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 9ff0fed374e..5cf24a394ee 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -10,6 +10,9 @@
pressure_resistance = 5*ONE_ATMOSPHERE
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/device/t_scanner/adv_mining_scanner))
+ attack_hand(user)
+ return
if(istype(W, /obj/item/weapon/ore))
if(!user.drop_item())
return
diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm
index 18a066d03a9..f9cb1123ca3 100644
--- a/code/modules/mob/camera/camera.dm
+++ b/code/modules/mob/camera/camera.dm
@@ -14,10 +14,6 @@
/mob/camera/experience_pressure_difference()
return
-/mob/camera/Destroy()
- ..()
- return QDEL_HINT_HARDDEL_NOW
-
/mob/camera/Login()
..()
update_interface()
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index db6ef63ad22..0750fd9841e 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -22,7 +22,6 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
//Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot.
universal_speak = 1
var/atom/movable/following = null
- var/anonsay = 0
var/image/ghostimage = null //this mobs ghost image, for deleting and stuff
var/ghostvision = 1 //is the ghost able to see things humans can't?
var/seedarkness = 1
@@ -95,12 +94,11 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
following = null
if(ghostimage)
ghost_darkness_images -= ghostimage
- qdel(ghostimage)
- ghostimage = null
+ QDEL_NULL(ghostimage)
updateallghostimages()
return ..()
-/mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/mob/dead/CanPass(atom/movable/mover, turf/target, height=0)
return 1
@@ -170,7 +168,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
var/response
var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)"
- response = alert(src, alertmsg,"Are you sure you want to ghost?","Ghost","Stay in body")
+ response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost")
if(response != "Ghost")
return //didn't want to ghost after-all
resting = 1
@@ -309,7 +307,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Toggle AntagHUD"
set desc = "Toggles AntagHUD allowing you to see who is the antagonist"
if(!config.antag_hud_allowed && !client.holder)
- to_chat(src, "\red Admins have disabled this for this round.")
+ to_chat(src, "Admins have disabled this for this round. ")
return
if(!client)
return
@@ -463,11 +461,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/memory()
set hidden = 1
- to_chat(src, "\red You are dead! You have no mind to store memory!")
+ to_chat(src, "You are dead! You have no mind to store memory! ")
/mob/dead/observer/add_memory()
set hidden = 1
- to_chat(src, "\red You are dead! You have no mind to store memory!")
+ to_chat(src, "You are dead! You have no mind to store memory! ")
/mob/dead/observer/verb/analyze_air()
set name = "Analyze Air"
@@ -486,9 +484,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "Results: ")
if(abs(pressure - ONE_ATMOSPHERE) < 10)
- to_chat(src, "\blue Pressure: [round(pressure,0.1)] kPa")
+ to_chat(src, "Pressure: [round(pressure,0.1)] kPa ")
else
- to_chat(src, "\red Pressure: [round(pressure,0.1)] kPa")
+ to_chat(src, "Pressure: [round(pressure,0.1)] kPa ")
if(total_moles)
var/o2_concentration = environment.oxygen/total_moles
var/n2_concentration = environment.nitrogen/total_moles
@@ -497,28 +495,28 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
if(abs(n2_concentration - N2STANDARD) < 20)
- to_chat(src, "\blue Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)")
+ to_chat(src, "Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles) ")
else
- to_chat(src, "\red Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)")
+ to_chat(src, "Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles) ")
if(abs(o2_concentration - O2STANDARD) < 2)
- to_chat(src, "\blue Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)")
+ to_chat(src, "Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles) ")
else
- to_chat(src, "\red Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)")
+ to_chat(src, "Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles) ")
if(co2_concentration > 0.01)
- to_chat(src, "\red CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)")
+ to_chat(src, "CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles) ")
else
- to_chat(src, "\blue CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)")
+ to_chat(src, "CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles) ")
if(plasma_concentration > 0.01)
- to_chat(src, "\red Plasma: [round(plasma_concentration*100)]% ([round(environment.toxins,0.01)] moles)")
+ to_chat(src, "Plasma: [round(plasma_concentration*100)]% ([round(environment.toxins,0.01)] moles) ")
if(unknown_concentration > 0.01)
- to_chat(src, "\red Unknown: [round(unknown_concentration*100)]% ([round(unknown_concentration*total_moles,0.01)] moles)")
+ to_chat(src, "Unknown: [round(unknown_concentration*100)]% ([round(unknown_concentration*total_moles,0.01)] moles) ")
- to_chat(src, "\blue Temperature: [round(environment.temperature-T0C,0.1)]°C")
- to_chat(src, "\blue Heat Capacity: [round(environment.heat_capacity(),0.1)]")
+ to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ")
+ to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)] ")
/mob/dead/observer/verb/view_manifest()
set name = "View Crew Manifest"
@@ -596,15 +594,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
//END TELEPORT HREF CODE
/mob/dead/observer/verb/toggle_anonsay()
+ set name = "Toggle Anonymous Dead-chat"
set category = "Ghost"
- set name = "Toggle Anonymous Chat"
set desc = "Toggles showing your key in dead chat."
-
- src.anonsay = !src.anonsay
- if(anonsay)
- to_chat(src, "Your key won't be shown when you speak in dead chat. ")
- else
- to_chat(src, "Your key will be publicly visible again. ")
+ client.prefs.ghost_anonsay = !client.prefs.ghost_anonsay
+ to_chat(src, "As a ghost, your key will [(client.prefs.ghost_anonsay) ? "no longer" : "now"] be shown when you speak in dead chat. ")
+ client.prefs.save_preferences(src)
/mob/dead/observer/verb/toggle_ghostsee()
set name = "Toggle Ghost Vision"
@@ -645,11 +640,26 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
client.images -= ghostimage //remove ourself
/mob/proc/can_admin_interact()
- return 0
+ return FALSE
+
+/mob/proc/can_advanced_admin_interact()
+ return FALSE
/mob/dead/observer/can_admin_interact()
return check_rights(R_ADMIN, 0, src)
+/mob/dead/observer/can_advanced_admin_interact()
+ if(!can_admin_interact())
+ return FALSE
+
+ if(client && client.advanced_admin_interaction)
+ return TRUE
+
+ return FALSE
+
+/mob/dead/observer/incapacitated()
+ return TRUE
+
//this is a mob verb instead of atom for performance reasons
//see /mob/verb/examinate() in mob.dm for more info
//overriden here and in /mob/living for different point span classes and sanity checks
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index fb5b7735633..82e8c620192 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -8,7 +8,7 @@
if(src.client)
if(src.client.prefs.muted & MUTE_DEADCHAT)
- to_chat(src, "\red You cannot talk in deadchat (muted).")
+ to_chat(src, "You cannot talk in deadchat (muted). ")
return
if(src.client.handle_spam_prevention(message,MUTE_DEADCHAT))
@@ -30,10 +30,19 @@
if(src.client)
if(src.client.prefs.muted & MUTE_DEADCHAT)
- to_chat(src, "\red You cannot emote in deadchat (muted).")
+ to_chat(src, "You cannot emote in deadchat (muted). ")
return
if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT))
return
. = src.emote_dead(message)
+
+/mob/dead/observer/handle_track(var/message, var/verb = "says", var/datum/language/language, var/mob/speaker = null, var/speaker_name, var/atom/follow_target, var/hard_to_hear)
+ return "[speaker_name] ([ghost_follow_link(follow_target, ghost=src)])"
+
+/mob/dead/observer/handle_speaker_name(var/mob/speaker = null, var/vname, var/hard_to_hear)
+ var/speaker_name = ..()
+ if(speaker && (speaker_name != speaker.real_name) && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.
+ speaker_name = "[speaker.real_name] ([speaker_name])"
+ return speaker_name
\ No newline at end of file
diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm
index 39dae4c0746..620c1854e73 100644
--- a/code/modules/mob/dead/observer/spells.dm
+++ b/code/modules/mob/dead/observer/spells.dm
@@ -25,7 +25,7 @@ var/global/list/boo_phrases=list(
invocation_type = "none"
range = 1 // Or maybe 3?
-/obj/effect/proc_holder/spell/aoe_turf/boo/cast(list/targets)
+/obj/effect/proc_holder/spell/aoe_turf/boo/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/atom/A in T.contents)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index be6fa4a6c39..4a340c1bb24 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -13,6 +13,16 @@
return 0 // Proceed with emote
//--FalseIncarnate
+/mob/proc/handle_emote_param(var/target, var/not_self, var/vicinity, var/return_mob) //Only returns not null if the target param is valid.
+ var/view_vicinity = vicinity ? vicinity : null //not_self means we'll only return if target is valid and not us
+ if(target) //vicinity is the distance passed to the view proc.
+ for(var/mob/A in view(view_vicinity, null)) //if set, return_mob will cause this proc to return the mob instead of just its name if the target is valid.
+ if(target == A.name && (!not_self || (not_self && target != name)))
+ if(return_mob)
+ return A
+ else
+ return target
+
// All mobs should have custom emote, really..
/mob/proc/custom_emote(var/m_type=1,var/message = null)
@@ -86,16 +96,16 @@
/mob/proc/emote_dead(var/message)
if(client.prefs.muted & MUTE_DEADCHAT)
- to_chat(src, "\red You cannot send deadchat emotes (muted).")
+ to_chat(src, "You cannot send deadchat emotes (muted). ")
return
if(!(client.prefs.toggles & CHAT_DEAD))
- to_chat(src, "\red You have deadchat muted.")
+ to_chat(src, "You have deadchat muted. ")
return
if(!src.client.holder)
if(!config.dsay_allowed)
- to_chat(src, "\red Deadchat is globally muted")
+ to_chat(src, "Deadchat is globally muted ")
return
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index f158534475e..568033f3606 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -117,65 +117,8 @@
if(hard_to_hear)
message = stars(message)
- var/speaker_name = "unknown"
- if(speaker)
- speaker_name = speaker.name
-
- if(vname)
- speaker_name = vname
- if(hard_to_hear)
- speaker_name = "unknown"
-
- var/changed_voice
-
- if(isAI(src) && !hard_to_hear)
- var/jobname // the mob's "job"
- var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
-
- if(ishuman(speaker))
- var/mob/living/carbon/human/H = speaker
-
- var/obj/item/weapon/card/id/id = H.wear_id
- if((istype(id) && id.is_untrackable()) && H.HasVoiceChanger())
- changed_voice = 1
- var/mob/living/carbon/human/I = locate(speaker_name)
- if(I)
- impersonating = I
- jobname = impersonating.get_assignment()
- else
- jobname = "Unknown"
- else
- jobname = H.get_assignment()
-
- else if(iscarbon(speaker)) // Nonhuman carbon mob
- jobname = "No ID"
- else if(isAI(speaker))
- jobname = "AI"
- else if(isrobot(speaker))
- jobname = "Cyborg"
- else if(ispAI(speaker))
- jobname = "Personal AI"
- else if(isAutoAnnouncer(speaker))
- var/mob/living/automatedannouncer/AA = speaker
- jobname = AA.role
- else
- jobname = "Unknown"
-
- if(changed_voice)
- if(impersonating)
- track = "[speaker_name] ([jobname]) "
- else
- track = "[speaker_name] ([jobname])"
- else
- if(istype(follow_target, /mob/living/simple_animal/bot))
- track = "[speaker_name] ([jobname]) "
- else
- track = "[speaker_name] ([jobname]) "
-
- if(isobserver(src))
- if(speaker && (speaker_name != speaker.real_name) && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.
- speaker_name = "[speaker.real_name] ([speaker_name])"
- track = "[speaker_name] ([ghost_follow_link(follow_target, ghost=src)])"
+ var/speaker_name = handle_speaker_name(speaker, vname, hard_to_hear)
+ track = handle_track(message, verb, language, speaker, speaker_name, follow_target, hard_to_hear)
var/formatted
if(language)
@@ -190,6 +133,22 @@
else
to_chat(src, "[part_a][speaker_name][part_b][formatted]")
+/mob/proc/handle_speaker_name(var/mob/speaker = null, var/vname, var/hard_to_hear)
+ var/speaker_name = "unknown"
+ if(speaker)
+ speaker_name = speaker.name
+
+ if(vname)
+ speaker_name = vname
+
+ if(hard_to_hear)
+ speaker_name = "unknown"
+
+ return speaker_name
+
+/mob/proc/handle_track(var/message, var/verb = "says", var/datum/language/language, var/mob/speaker = null, var/speaker_name, var/atom/follow_target, var/hard_to_hear)
+ return
+
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
if(!client)
return
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index be101742dfa..fb6d5ef5948 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -22,7 +22,7 @@
var/english_names = 0 // Do we want English names by default, no matter what?
var/list/scramble_cache = list()
-/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4)
+/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4)
if(!syllables || !syllables.len || english_names)
if(gender==FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
@@ -40,7 +40,7 @@
return "[trim(full_name)]"
-/datum/language/proc/scramble(var/input)
+/datum/language/proc/scramble(input)
if(!syllables || !syllables.len)
return stars(input)
@@ -95,10 +95,11 @@
// if you yell, you'll be heard from two tiles over instead of one
return (copytext(message, length(message)) == "!") ? 2 : 1
-/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+/datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask)
log_say("[key_name(speaker)]: ([name]) [message]")
- if(!speaker_mask) speaker_mask = speaker.name
+ if(!speaker_mask)
+ speaker_mask = speaker.name
var/msg = "[name], [speaker_mask] [format_message(message, get_spoken_verb(message))] "
for(var/mob/player in player_list)
@@ -110,10 +111,10 @@
else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player, speaker)))
to_chat(player, msg)
-/datum/language/proc/check_special_condition(var/mob/other, var/mob/living/speaker)
- return 1
+/datum/language/proc/check_special_condition(mob/other, mob/living/speaker)
+ return TRUE
-/datum/language/proc/get_spoken_verb(var/msg_end)
+/datum/language/proc/get_spoken_verb(msg_end)
switch(msg_end)
if("!")
return exclaim_verb
@@ -147,7 +148,10 @@
colour = "soghun"
key = "o"
flags = RESTRICTED
- syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh")
+ syllables = list("za","az","ze","ez","zi","iz","zo","oz","zu","uz","zs","sz","ha","ah","he","eh","hi","ih", \
+ "ho","oh","hu","uh","hs","sh","la","al","le","el","li","il","lo","ol","lu","ul","ls","sl","ka","ak","ke","ek", \
+ "ki","ik","ko","ok","ku","uk","ks","sk","sa","as","se","es","si","is","so","os","su","us","ss","ss","ra","ar", \
+ "re","er","ri","ir","ro","or","ru","ur","rs","sr","a","a","e","e","i","i","o","o","u","u","s","s" )
/datum/language/unathi/get_random_name()
@@ -170,8 +174,7 @@
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \
"hal","ket","jurl","mah","tul","cresh","azu","ragh")
-/datum/language/tajaran/get_random_name(var/gender)
-
+/datum/language/tajaran/get_random_name(gender)
var/new_name = ..(gender,1)
if(prob(80))
new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]"
@@ -286,13 +289,13 @@
key = "^"
flags = RESTRICTED | HIVEMIND
-/datum/language/grey/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+/datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask)
..(speaker,message,speaker.real_name)
-/datum/language/grey/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker)
+/datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
if(other in range(7, speaker))
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/language/drask
name = "Orluum"
@@ -322,7 +325,7 @@
english_names = 1
//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
-/datum/language/common/get_spoken_verb(var/msg_end)
+/datum/language/common/get_spoken_verb(msg_end)
switch(msg_end)
if("!")
return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
@@ -341,7 +344,7 @@
syllables = list("tao","shi","tzu","yi","com","be","is","i","op","vi","ed","lec","mo","cle","te","dis","e")
english_names = 1
-/datum/language/human/get_spoken_verb(var/msg_end)
+/datum/language/human/get_spoken_verb(msg_end)
switch(msg_end)
if("!")
return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
@@ -396,15 +399,14 @@
key = "y"
flags = RESTRICTED | HIVEMIND
-/datum/language/wryn/check_special_condition(var/mob/other)
-
+/datum/language/wryn/check_special_condition(mob/other)
var/mob/living/carbon/M = other
if(!istype(M))
- return 1
+ return TRUE
if(locate(/obj/item/organ/internal/wryn/hivenode) in M.internal_organs)
- return 1
+ return TRUE
- return 0
+ return FALSE
/datum/language/xenocommon
name = "Xenomorph"
@@ -428,7 +430,6 @@
flags = RESTRICTED | HIVEMIND
follow = 1
-
/datum/language/terrorspider
name = "Spider Hivemind"
desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs."
@@ -440,7 +441,6 @@
flags = RESTRICTED | HIVEMIND
follow = 1
-
/datum/language/ling
name = "Changeling"
desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
@@ -449,6 +449,14 @@
key = "g"
flags = RESTRICTED | HIVEMIND
+/datum/language/ling/broadcast(mob/living/speaker, message, speaker_mask)
+ if(speaker.mind && speaker.mind.changeling)
+ ..(speaker,message,speaker.mind.changeling.changelingID)
+ else if(speaker.mind && speaker.mind.linglink)
+ ..()
+ else
+ ..(speaker,message)
+
/datum/language/shadowling
name = "Shadowling Hivemind"
desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind."
@@ -457,20 +465,12 @@
key = "8"
flags = RESTRICTED | HIVEMIND
-
-/datum/language/shadowling/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
+/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask)
if(speaker.mind && speaker.mind.special_role)
..(speaker, message, "([speaker.mind.special_role]) [speaker]")
else
..(speaker, message)
-/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
-
- if(speaker.mind && speaker.mind.changeling)
- ..(speaker,message,speaker.mind.changeling.changelingID)
- else
- ..(speaker,message)
-
/datum/language/abductor
name = "Abductor Mindlink"
desc = "Abductors are incapable of speech, but have a psychic link attuned to their own team."
@@ -481,14 +481,14 @@
key = "zw" //doesn't matter, this is their default and only language
flags = RESTRICTED | HIVEMIND
-/datum/language/abductor/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+/datum/language/abductor/broadcast(mob/living/speaker, message, speaker_mask)
..(speaker,message,speaker.real_name)
-/datum/language/abductor/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker)
+/datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
if(other.mind && other.mind.abductor)
if(other.mind.abductor.team == speaker.mind.abductor.team)
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/language/corticalborer
name = "Cortical Link"
@@ -497,14 +497,13 @@
ask_verb = "sings"
exclaim_verb = "sings"
colour = "alien"
- key = "x"
+ key = "bo"
flags = RESTRICTED | HIVEMIND
-/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
-
+/datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask)
var/mob/living/simple_animal/borer/B
- if(istype(speaker,/mob/living/carbon))
+ if(iscarbon(speaker))
var/mob/living/carbon/M = speaker
B = M.has_brain_worms()
else if(istype(speaker,/mob/living/simple_animal/borer))
@@ -526,7 +525,7 @@
follow = 1
var/drone_only
-/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+/datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask)
if(!speaker.binarycheck())
return
@@ -538,15 +537,14 @@
var/message_body = "[speaker.say_quote(message)], \"[message]\" "
for(var/mob/M in dead_mob_list)
- if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
+ if(!isnewplayer(M) && !isbrain(M))
var/message_start_dead = "[name], [speaker.name] ([ghost_follow_link(speaker, ghost=M)]) "
M.show_message("[message_start_dead] [message_body]", 2)
for(var/mob/living/S in living_mob_list)
-
if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
continue
- else if(istype(S , /mob/living/silicon/ai))
+ else if(isAI(S))
message_start = "[name], [speaker.name] "
else if(!S.binarycheck())
continue
@@ -557,7 +555,7 @@
listening -= src
for(var/mob/living/M in listening)
- if(istype(M, /mob/living/silicon) || M.binarycheck())
+ if(issilicon(M) || M.binarycheck())
continue
M.show_message("synthesised voice beeps, \"beep beep beep\" ",2)
@@ -596,17 +594,17 @@
follow = 1
// Language handling.
-/mob/proc/add_language(var/language)
+/mob/proc/add_language(language)
var/datum/language/new_language = all_languages[language]
if(!istype(new_language) || new_language in languages)
- return 0
+ return FALSE
languages |= new_language
- return 1
+ return TRUE
-/mob/proc/remove_language(var/rem_language)
+/mob/proc/remove_language(rem_language)
var/datum/language/L = all_languages[rem_language]
. = (L in languages)
languages.Remove(L)
@@ -620,37 +618,37 @@
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak_language(datum/language/speaking)
- return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
+ return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in languages)
//TBD
+/mob/proc/check_lang_data()
+ . = ""
+
+ for(var/datum/language/L in languages)
+ if(!(L.flags & NONGLOBAL))
+ . += "[L.name] (:[L.key]) [L.desc] "
+
+/mob/living/check_lang_data()
+ . = ""
+
+ if(default_language)
+ . += "Current default language: [default_language] - reset "
+
+ for(var/datum/language/L in languages)
+ if(!(L.flags & NONGLOBAL))
+ if(L == default_language)
+ . += "[L.name] (:[L.key]) - default - reset [L.desc] "
+ else
+ . += "[L.name] (:[L.key]) - set default [L.desc] "
+
/mob/verb/check_languages()
set name = "Check Known Languages"
set category = "IC"
set src = usr
- var/dat = "Known Languages "
-
- for(var/datum/language/L in languages)
- if(!(L.flags & NONGLOBAL))
- dat += "[L.name] (:[L.key]) [L.desc] "
-
- src << browse(dat, "window=checklanguage")
- return
-
-/mob/living/check_languages()
- var/dat = "Known Languages "
-
- if(default_language)
- dat += "Current default language: [default_language] - reset "
-
- for(var/datum/language/L in languages)
- if(!(L.flags & NONGLOBAL))
- if(L == default_language)
- dat += "[L.name] (:[L.key]) - default - reset [L.desc] "
- else
- dat += "[L.name] (:[L.key]) - set default [L.desc] "
-
- src << browse(dat, "window=checklanguage")
+ var/datum/browser/popup = new(src, "checklanguage", "Known Languages", 420, 470)
+ popup.set_content(check_lang_data())
+ popup.open()
/mob/living/Topic(href, href_list)
if(href_list["default_lang"])
@@ -661,7 +659,7 @@
if(L)
set_default_language(L)
check_languages()
- return 1
+ return TRUE
else
return ..()
diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm
index 4506ce50cfb..da19b6a35b2 100644
--- a/code/modules/mob/living/autohiss.dm
+++ b/code/modules/mob/living/autohiss.dm
@@ -1,29 +1,18 @@
-
-#define AUTOHISS_OFF 0
-#define AUTOHISS_BASIC 1
-#define AUTOHISS_FULL 2
-
-#define AUTOHISS_NUM 3
-
-
/mob/living/proc/handle_autohiss(message, datum/language/L)
return message // no autohiss at this level
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
- if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
+ if(!client || client.prefs.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
return message
- return species.handle_autohiss(message, L, client.autohiss_mode)
-
-/client
- var/autohiss_mode = AUTOHISS_OFF
+ return species.handle_autohiss(message, L, client.prefs.autohiss_mode)
/client/verb/toggle_autohiss()
set name = "Toggle Auto-Accent"
set desc = "Toggle automatic accents for your species"
set category = "OOC"
- autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM
- switch(autohiss_mode)
+ prefs.autohiss_mode = (prefs.autohiss_mode + 1) % AUTOHISS_NUM
+ switch(prefs.autohiss_mode)
if(AUTOHISS_OFF)
to_chat(src, "Auto-hiss is now OFF.")
if(AUTOHISS_BASIC)
@@ -31,7 +20,7 @@
if(AUTOHISS_FULL)
to_chat(src, "Auto-hiss is now FULL.")
else
- autohiss_mode = AUTOHISS_OFF
+ prefs.autohiss_mode = AUTOHISS_OFF
to_chat(src, "Auto-hiss is now OFF.")
/datum/species
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index ca520ba9289..b5fa736dfc3 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -220,7 +220,7 @@
threatcount += 4
//Mindshield implants imply trustworthyness
- if(isloyal(src))
+ if(ismindshielded(src))
threatcount -= 1
return threatcount
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index c1ce34bf8e7..65e32e2fae9 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -1,5 +1,5 @@
-/mob/living/carbon/alien/hitby(atom/movable/AM)
- ..(AM, 1)
+/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush)
+ ..(AM, hitpush = 0)
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index bc1e1e4f56d..3782806db33 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -13,6 +13,10 @@
alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
..()
+/mob/living/carbon/alien/humanoid/hunter/movement_delay()
+ . = -1 //hunters are sanic
+ . += ..() //but they still need to slow down on stun
+
/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
..() //-Yvarov
@@ -79,17 +83,18 @@
else //Maybe uses plasma in the future, although that wouldn't make any sense...
leaping = 1
update_icons()
- throw_at(A,MAX_ALIEN_LEAP_DIST,1)
- leaping = 0
- update_icons()
+ throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, .leap_end))
+
+/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
+ leaping = 0
+ update_icons()
/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A)
-
if(!leaping)
return ..()
if(A)
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/L = A
var/blocked = 0
if(ishuman(A))
@@ -126,46 +131,3 @@
if(leaping)
return
..()
-
-
-//Modified throw_at() that will use diagonal dirs where appropriate
-//instead of locking it to cardinal dirs
-/mob/living/carbon/alien/humanoid/throw_at(atom/target, range, speed)
- if(!target || !src) return 0
-
- src.throwing = 1
-
- var/dist_x = abs(target.x - src.x)
- var/dist_y = abs(target.y - src.y)
- var/dist_travelled = 0
- var/dist_since_sleep = 0
-
- var/tdist_x = dist_x;
- var/tdist_y = dist_y;
-
- if(dist_x <= dist_y)
- tdist_x = dist_y;
- tdist_y = dist_x;
-
- var/error = tdist_x/2 - tdist_y
- while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
-
- if(!src.throwing) break
- if(!istype(src.loc, /turf)) break
-
- var/atom/step = get_step(src, get_dir(src,target))
- if(!step)
- break
- src.Move(step, get_dir(src, step))
- hit_check()
- error += (error < 0) ? tdist_x : -tdist_y;
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
-
-
- src.throwing = 0
-
- return 1
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index 2644ef8a306..6a9565fc449 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -12,14 +12,12 @@
pixel_x = -16
maxHealth = 200
health = 200
- move_delay_add = 1
large = 1
/mob/living/carbon/alien/humanoid/sentinel/praetorian
name = "alien praetorian"
maxHealth = 200
health = 200
- move_delay_add = 1
large = 1
/mob/living/carbon/alien/humanoid/sentinel/large/update_icons()
@@ -73,7 +71,7 @@
if(powerc(250))
adjustToxLoss(-250)
- to_chat(src, "\green You begin to evolve!")
+ to_chat(src, "You begin to evolve! ")
for(var/mob/O in viewers(src, null))
O.show_message(text("[src] begins to twist and contort! "), 1)
var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new(loc)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
index 05eb2c8e226..f159abebbe4 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
@@ -8,8 +8,30 @@
// if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
// act = copytext(act,1,length(act)) //seriously who the fuck wrote this
var/muzzled = is_muzzled()
+
+ var/on_CD = 0
act = lowertext(act)
+
+ //cooldown system handled by /code/modules/mob/emotes.dm
switch(act)
+ if("roar")
+ on_CD = handle_emote_CD()
+ if("deathgasp")
+ on_CD = handle_emote_CD()
+ if("hiss")
+ on_CD = handle_emote_CD()
+ if("gnarl")
+ on_CD = handle_emote_CD()
+ if("flip")
+ on_CD = handle_emote_CD()
+
+ if(on_CD)
+ return
+
+ switch(act)
+
+
+
if("sign")
if(!restrained())
var/num = null
@@ -26,7 +48,7 @@
message = "\The [src] lets out a waning guttural screech, green blood bubbling from its maw..."
m_type = 2
if("scratch")
- if(!src.restrained())
+ if(!restrained())
message = "\The [src] scratches."
m_type = 1
if("whimper")
@@ -79,11 +101,11 @@
message = "\The [src] twitches violently."
m_type = 1
if("dance")
- if(!src.restrained())
+ if(!restrained())
message = "\The [src] dances around happily."
m_type = 1
if("roll")
- if(!src.restrained())
+ if(!restrained())
message = "\The [src] rolls."
m_type = 1
if("shake")
@@ -103,13 +125,17 @@
if("flip")
m_type = 1
message = "\The [src] does a flip!"
- src.SpinAnimation(5,1)
+ SpinAnimation(5,1)
if("help")
to_chat(src, "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper")
if(!stat)
if(act == "roar")
- playsound(src.loc, 'sound/voice/hiss5.ogg', 40, 1, 1)
+ playsound(src.loc, 'sound/voice/hiss5.ogg', 50, 1, 1)
if(act == "deathgasp")
playsound(src.loc, 'sound/voice/hiss6.ogg', 80, 1, 1)
+ if(act == "hiss")
+ playsound(src.loc, 'sound/voice/hiss1.ogg', 30, 1, 1)
+ if(act == "gnarl")
+ playsound(src.loc, 'sound/voice/hiss4.ogg', 30, 1, 1)
..(act, m_type, message)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
index d50befa47f0..7db3ea5b1c5 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
@@ -6,7 +6,6 @@
icon_state = "alienq_s"
status_flags = CANPARALYSE
mob_size = MOB_SIZE_LARGE
- move_delay_add = 3
large = 1
ventcrawler = 0
@@ -85,6 +84,6 @@
if(powerc(250,1))//Can't plant eggs on spess tiles. That's silly.
adjustPlasma(-250)
for(var/mob/O in viewers(src, null))
- O.show_message(text("\green [src] has laid an egg! "), 1)
+ O.show_message(text("[src] has laid an egg! "), 1)
new /obj/structure/alien/egg(loc)
return
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index b99cde337d6..fff315c90e3 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -24,44 +24,10 @@
add_language("Hivemind")
..()
-//This is fine, works the same as a human
-/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
- spawn( 0 )
- if((!( yes ) || now_pushing))
- return
- now_pushing = 0
- ..()
- if(!istype(AM, /atom/movable))
- return
-
- if(ismob(AM))
- var/mob/tmob = AM
- tmob.LAssailant = src
-
- if(!now_pushing)
- now_pushing = 1
- if(!AM.anchored)
- var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
- return
- return
/mob/living/carbon/alien/humanoid/movement_delay()
- var/tally = 0
- if(istype(src, /mob/living/carbon/alien/humanoid/queen))
- tally += 4
- if(istype(src, /mob/living/carbon/alien/humanoid/drone))
- tally += 0
- if(istype(src, /mob/living/carbon/alien/humanoid/sentinel))
- tally += 0
- if(istype(src, /mob/living/carbon/alien/humanoid/hunter))
- tally = -2 // hunters go supersuperfast
- return (tally + move_delay_add + config.alien_delay)
+ . = ..()
+ . += move_delay_add + config.alien_delay //move_delay_add is used to slow aliens with stuns
/mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0)
if(..())
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
index 223b6a512ae..08017da0b76 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
@@ -22,7 +22,7 @@
if(slot_l_store)
if(l_store)
return
- if(W.w_class > 3)
+ if(W.w_class > WEIGHT_CLASS_NORMAL)
return
unEquip(W)
l_store = W
@@ -30,7 +30,7 @@
if(slot_r_store)
if(r_store)
return
- if(W.w_class > 3)
+ if(W.w_class > WEIGHT_CLASS_NORMAL)
return
unEquip(W)
r_store = W
@@ -44,4 +44,4 @@
if(slot_l_store)
if(l_store) l_store.attack_alien(src)
if(slot_r_store)
- if(r_store) r_store.attack_alien(src)
\ No newline at end of file
+ if(r_store) r_store.attack_alien(src)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 11914d3c0ee..a8f17714b0e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -28,6 +28,9 @@
alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
+/mob/living/carbon/alien/humanoid/queen/movement_delay()
+ . = ..()
+ . += 3
/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates()
..() //-Yvarov
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 898d23de066..0d6545d0a0f 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -103,8 +103,7 @@
t_suit = "armor"
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_suit]blood")
- if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
- unEquip(handcuffed)
+ if(wear_suit.breakouttime)
drop_r_hand()
drop_l_hand()
diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm
index 01d834b07cf..d3140e4a969 100644
--- a/code/modules/mob/living/carbon/alien/larva/emote.dm
+++ b/code/modules/mob/living/carbon/alien/larva/emote.dm
@@ -15,7 +15,7 @@
return
if(src.client)
if(client.prefs.muted & MUTE_IC)
- to_chat(src, "\red You cannot send IC messages (muted).")
+ to_chat(src, "You cannot send IC messages (muted). ")
return
if(src.client.handle_spam_prevention(message,MUTE_IC))
return
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index a78ab9c4c77..df00e862b38 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -26,38 +26,6 @@
..()
-//This is fine, works the same as a human
-/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
-
- spawn( 0 )
- if((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(70))
- to_chat(src, "You fail to push [tmob]'s fat ass out of the way. ")
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
- tmob.LAssailant = src
-
- now_pushing = 0
- ..()
- if(!( istype(AM, /atom/movable) ))
- return
- if(!( now_pushing ))
- now_pushing = 1
- if(!( AM.anchored ))
- var/t = get_dir(src, AM)
- step(AM, t)
- now_pushing = null
- return
- return
-
//This needs to be fixed
/mob/living/carbon/alien/larva/Stat()
..()
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index c02c141c456..b3df2879f8f 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -15,7 +15,7 @@
to_chat(O, text("[] scurries to the ground! ", src))
else
layer = MOB_LAYER
- to_chat(src, text("\green You have stopped hiding."))
+ to_chat(src, text("You have stopped hiding. "))
for(var/mob/O in oviewers(src, null))
if((O.client && !( O.blinded )))
to_chat(O, text("[] slowly peaks up from the ground...", src))
@@ -29,15 +29,15 @@
return
if(handcuffed || legcuffed)
- to_chat(src, "\red You cannot evolve when you are cuffed.")
+ to_chat(src, "You cannot evolve when you are cuffed. ")
if(amount_grown >= max_grown) //TODO ~Carn
//green is impossible to read, so i made these blue and changed the formatting slightly
to_chat(src, "You are growing into a beautiful alien! It is time to choose a caste. ")
- to_chat(src, "\blue There are three to choose from:")
- to_chat(src, "Hunters \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.")
- to_chat(src, "Sentinels \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.")
- to_chat(src, "Drones \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.")
+ to_chat(src, "There are three to choose from: ")
+ to_chat(src, "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves. ")
+ to_chat(src, "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters. ")
+ to_chat(src, "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen. ")
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
var/mob/living/carbon/alien/humanoid/new_xeno
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 6ea16fc24a1..38ea99834b0 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -14,10 +14,11 @@ var/const/MAX_ACTIVE_TIME = 400
icon = 'icons/mob/alien.dmi'
icon_state = "facehugger"
item_state = "facehugger"
- w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4
+ w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4
throw_range = 5
tint = 3
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT
+ flags = AIRTIGHT
+ flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES
layer = MOB_LAYER
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
@@ -126,7 +127,7 @@ var/const/MAX_ACTIVE_TIME = 400
"[src] leaps at [M]'s face! ")
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.head && H.head.flags & HEADCOVERSMOUTH)
+ if(H.head && H.head.flags_cover & HEADCOVERSMOUTH)
H.visible_message("[src] smashes against [H]'s [H.head]! ", \
"[src] smashes against [H]'s [H.head]! ")
Die()
@@ -236,7 +237,7 @@ var/const/MAX_ACTIVE_TIME = 400
var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.head && H.head.flags & HEADCOVERSMOUTH)
+ if(H.head && H.head.flags_cover & HEADCOVERSMOUTH)
return 0
return 1
return 0
@@ -248,4 +249,4 @@ var/const/MAX_ACTIVE_TIME = 400
gender = FEMALE
/obj/item/clothing/mask/facehugger/lamarr/New()//to prevent deleting it if aliums are disabled
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index f495e5b7f75..ec77d1be3bf 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -5,7 +5,7 @@
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=3"
//Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
@@ -167,12 +167,8 @@
if(isrobot(loc))
var/mob/living/silicon/robot/borg = loc
borg.mmi = null
- if(brainmob)
- qdel(brainmob)
- brainmob = null
- if(held_brain)
- qdel(held_brain)
- held_brain = null
+ QDEL_NULL(brainmob)
+ QDEL_NULL(held_brain)
return ..()
/obj/item/device/mmi/syndie
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 555fcff29da..655ad111cf1 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -10,6 +10,7 @@
/mob/living/carbon/brain/New()
create_reagents(330)
+ add_language("Galactic Common")
..()
/mob/living/carbon/brain/Destroy()
@@ -81,6 +82,17 @@ I'm using this for Stat to give it a more nifty interface to work with
/mob/living/carbon/brain/proc/has_synthetic_assistance()
return (container && istype(container, /obj/item/device/mmi)) || in_contents_of(/obj/mecha)
+/mob/living/carbon/brain/proc/get_race()
+ if(container)
+ var/obj/item/device/mmi/M = container
+ if(istype(M) && M.held_brain)
+ return M.held_brain.dna.get_species_name()
+ else
+ return "Artificial Life"
+ if(istype(loc, /obj/item/organ/internal/brain))
+ var/obj/item/organ/internal/brain/B = loc
+ return B.dna.get_species_name()
+
/mob/living/carbon/brain/Stat()
..()
if(has_synthetic_assistance())
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index e3ffe2074a7..5a62ead4952 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -4,7 +4,7 @@
max_damage = 200
icon_state = "brain2"
force = 1.0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 1.0
throw_speed = 3
throw_range = 5
@@ -73,7 +73,7 @@
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
if(borer)
- borer.detatch() //Should remove borer if the brain is removed - RR
+ borer.detach() //Should remove borer if the brain is removed - RR
if(owner.mind && !non_primary)//don't transfer if the owner does not have a mind.
B.transfer_identity(user)
@@ -116,12 +116,6 @@
mmi_icon_state = "slime_mmi"
// parent_organ = "chest" Hello I am from the ministry of rubber forehead aliens how are you
-/obj/item/organ/internal/brain/slime/take_damage(var/amount, var/silent = 1)
- //Slimes are 150% more vulnerable to brain damage
- damage = between(0, src.damage + (1.5*amount), max_damage) //Since they take the damage twice, this is +150%
- return ..()
-
-
/obj/item/organ/internal/brain/golem
name = "Runic mind"
desc = "A tightly furled roll of paper, covered with indecipherable runes."
@@ -129,7 +123,5 @@
icon_state = "scroll"
/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs.
- if(brainmob)
- qdel(brainmob)
- brainmob = null
+ QDEL_NULL(brainmob)
return ..()
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 255f3c03897..d6a07d48f7e 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -2,7 +2,7 @@
if(stat == DEAD) return
if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
for(var/mob/O in viewers(container, null))
- O.show_message(text("[]'s MMI flatlines! ", src), 1, "\red You hear something flatline.", 2)
+ O.show_message(text("[]'s MMI flatlines! ", src), 1, "You hear something flatline. ", 2)
container.icon_state = "mmi_dead"
stat = DEAD
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 3b5b415964d..8dd6e14e427 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -1,9 +1,9 @@
/obj/item/device/mmi/posibrain
name = "positronic brain"
- desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'."
+ desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
icon = 'icons/obj/assemblies.dmi'
icon_state = "posibrain"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=3;programming=2"
var/searching = 0
@@ -15,11 +15,14 @@
var/silenced = 0 //if set to 1, they can't talk.
var/next_ping_at = 0
+/obj/item/device/mmi/posibrain/examine(mob/user)
+ if(..(user, 1))
+ to_chat(user, "Its speaker is turned [silenced ? "off" : "on"].")
-/obj/item/device/mmi/posibrain/attack_self(mob/user as mob)
+/obj/item/device/mmi/posibrain/attack_self(mob/user)
if(brainmob && !brainmob.key && searching == 0)
//Start the process of searching for a new user.
- to_chat(user, "\blue You carefully locate the manual activation switch and start the positronic brain's boot process.")
+ to_chat(user, "You carefully locate the manual activation switch and start the positronic brain's boot process. ")
icon_state = "posibrain-searching"
ghost_volunteers.Cut()
src.searching = 1
@@ -31,18 +34,10 @@
transfer_personality(O)
reset_search()
else
- if(silenced)
- silenced = 0
- to_chat(user, "You toggle the speaker to 'on', on the [src]. ")
- desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'."
- if(brainmob && brainmob.key)
- to_chat(brainmob, "Your internal speaker has been toggled to 'on'. ")
- else
- silenced = 1
- to_chat(user, "You toggle the speaker to 'off', on the [src]. ")
- desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'."
- if(brainmob && brainmob.key)
- to_chat(brainmob, "Your internal speaker has been toggled to 'off'. ")
+ silenced = !silenced
+ to_chat(user, "You toggle the speaker [silenced ? "off" : "on"]. ")
+ if(brainmob && brainmob.key)
+ to_chat(brainmob, "Your internal speaker has been toggled [silenced ? "off" : "on"]. ")
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
@@ -103,7 +98,7 @@
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain chimes quietly.")
+ M.show_message("The positronic brain chimes quietly. ")
icon_state = "posibrain-occupied"
/obj/item/device/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
@@ -114,7 +109,7 @@
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+ M.show_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again? ")
/obj/item/device/mmi/posibrain/Topic(href,href_list)
if("signup" in href_list)
@@ -127,22 +122,22 @@
to_chat(O, "Not looking for a ghost, yet.")
return
if(!istype(O))
- to_chat(O, "\red Error.")
+ to_chat(O, "Error. ")
return
if(O in ghost_volunteers)
- to_chat(O, "\blue Removed from registration list.")
+ to_chat(O, "Removed from registration list. ")
ghost_volunteers.Remove(O)
return
if(!check_observer(O))
- to_chat(O, "\red You cannot be \a [src].")
+ to_chat(O, "You cannot be \a [src]. ")
return
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
- to_chat(O, "\red Upon using the antagHUD you forfeited the ability to join the round.")
+ to_chat(O, "Upon using the antagHUD you forfeited the ability to join the round. ")
return
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
- to_chat(O, "\red You are job banned from this role.")
+ to_chat(O, "You are job banned from this role. ")
return
- to_chat(O., "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.")
+ to_chat(O., "You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer. ")
ghost_volunteers.Add(O)
@@ -201,7 +196,7 @@
playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0)
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain pings softly.")
+ M.show_message("The positronic brain pings softly. ")
/obj/item/device/mmi/posibrain/ipc
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'."
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index a343d245424..2a789acae0e 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -1,23 +1,33 @@
//TODO: Convert this over for languages.
/mob/living/carbon/brain/say(var/message, var/datum/language/speaking = null)
- if(silent)
+ if(!can_speak(warning = TRUE))
+ return
+
+ if(prob(emp_damage * 4))
+ if(prob(10)) //10% chance to drop the message entirely
+ return
+ else
+ message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher
+
+ ..(message)
+
+/mob/living/carbon/brain/whisper(message as text)
+ if(!can_speak(warning = TRUE))
return
- if(!(container && istype(container, /obj/item/device/mmi)))
- return //No MMI, can't speak, bucko./N
- else
- if(container && istype(container, /obj/item/device/mmi/posibrain))
- var/obj/item/device/mmi/posibrain/P = container
- if(P && P.silenced)
- to_chat(usr, "You cannot speak, as your internal speaker has been toggled to 'off'. ")
- return
- if(prob(emp_damage*4))
- if(prob(10))//10% chane to drop the message entirely
- return
- else
- message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher
+ ..()
+
+/mob/living/carbon/brain/can_speak(var/warning = FALSE)
+ . = ..()
- ..(message)
+ if(!istype(container, /obj/item/device/mmi))
+ . = FALSE
+ else if(istype(container, /obj/item/device/mmi/posibrain))
+ var/obj/item/device/mmi/posibrain/P = container
+ if(P && P.silenced)
+ if(warning)
+ to_chat(usr, "You cannot speak, as your internal speaker is turned off. ")
+ . = FALSE
/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
switch(message_mode)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index cb3bd3cee00..141d760287a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -17,10 +17,8 @@
med_hud_set_status()
/mob/living/carbon/Destroy()
- for(var/atom/movable/guts in internal_organs)
- qdel(guts)
- for(var/atom/movable/food in stomach_contents)
- qdel(food)
+ QDEL_LIST(internal_organs)
+ QDEL_LIST(stomach_contents)
remove_from_all_data_huds()
return ..()
@@ -35,9 +33,9 @@
. = ..()
if(.)
if(nutrition && stat != DEAD)
- nutrition -= HUNGER_FACTOR/10
+ nutrition -= hunger_drain / 10
if(m_intent == "run")
- nutrition -= HUNGER_FACTOR/10
+ nutrition -= hunger_drain / 10
if((FAT in mutations) && m_intent == "run" && bodytemperature <= 360)
bodytemperature += 2
@@ -56,7 +54,7 @@
last_stomach_attack = world.time
for(var/mob/M in hearers(4, src))
if(M.client)
- M.show_message(text("\red You hear something rumbling inside [src]'s stomach..."), 2)
+ M.show_message(text("You hear something rumbling inside [src]'s stomach... "), 2)
var/obj/item/I = user.get_active_hand()
if(I && I.force)
@@ -76,7 +74,7 @@
for(var/mob/M in viewers(user, null))
if(M.client)
- M.show_message(text("\red [user] attacks [src]'s stomach wall with the [I.name]!"), 2)
+ M.show_message(text("[user] attacks [src]'s stomach wall with the [I.name]! "), 2)
playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1)
if(prob(src.getBruteLoss() - 50))
@@ -143,16 +141,14 @@
return 0
if(NO_SHOCK in mutations) //shockproof
return 0
-
+ if(tesla_shock && tesla_ignore)
+ return FALSE
shock_damage *= siemens_coeff
if(shock_damage<1 && !override)
return 0
if(reagents.has_reagent("teslium"))
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
- take_overall_damage(0,shock_damage)
- //src.burn_skin(shock_damage)
- //src.adjustFireLoss(shock_damage) //burn_skin will do this for us
- //src.updatehealth()
+ take_overall_damage(0,shock_damage, used_weapon = "Electrocution")
visible_message(
"[src] was shocked by \the [source]! ", \
"You feel a powerful shock coursing through your body! ", \
@@ -174,7 +170,7 @@
"The [source] arc flashes and electrocutes you! ", \
"You hear a lightning-like crack! " \
)
- playsound(loc, "sound/effects/eleczap.ogg", 50, 1, -1)
+ playsound(loc, 'sound/effects/eleczap.ogg', 50, 1, -1)
explosion(src.loc,-1,0,2,2)
if(override)
return override
@@ -217,11 +213,11 @@
if(src == M && istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
src.visible_message( \
- text("\blue [src] examines [].",src.gender==MALE?"himself":"herself"), \
- "\blue You check yourself for injuries." \
+ text("[src] examines []. ",src.gender==MALE?"himself":"herself"), \
+ "You check yourself for injuries. " \
)
- for(var/obj/item/organ/external/org in H.organs)
+ for(var/obj/item/organ/external/org in H.bodyparts)
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
@@ -247,7 +243,7 @@
status = "weirdly shapen."
if(status == "")
status = "OK"
- src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.name,status),1)
+ src.show_message(text("\t []My [] is [].",status=="OK"?" ":" ",org.name,status),1)
if(staminaloss)
if(staminaloss > 30)
to_chat(src, "You're completely exhausted. ")
@@ -309,7 +305,7 @@
Stun(2)
var/obj/item/organ/internal/eyes/E = get_int_organ(/obj/item/organ/internal/eyes)
- if(!E)
+ if(!E || (E && E.weld_proof))
return
switch(damage)
@@ -496,6 +492,29 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
//Throwing stuff
+/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum)
+ . = ..()
+ var/hurt = TRUE
+ /*if(istype(throwingdatum, /datum/thrownthing))
+ var/datum/thrownthing/D = throwingdatum
+ if(isrobot(D.thrower))
+ var/mob/living/silicon/robot/R = D.thrower
+ if(!R.emagged)
+ hurt = FALSE*/
+ if(hit_atom.density && isturf(hit_atom))
+ if(hurt)
+ Weaken(1)
+ take_organ_damage(10)
+ if(iscarbon(hit_atom) && hit_atom != src)
+ var/mob/living/carbon/victim = hit_atom
+ if(hurt)
+ victim.take_organ_damage(10)
+ take_organ_damage(10)
+ victim.Weaken(1)
+ Weaken(1)
+ visible_message("[src] crashes into [victim], knocking them both over! ", "You violently crash into [victim]! ")
+ playsound(src, 'sound/weapons/punch1.ogg', 50, 1)
+
/mob/living/carbon/proc/toggle_throw_mode()
if(in_throw_mode)
throw_mode_off()
@@ -810,6 +829,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
legcuffed = null
update_inv_legcuffed()
return
+ else
+ unEquip(I)
+ I.dropped()
+ return
return 1
else
to_chat(src, "You fail to remove [I]! ")
@@ -914,14 +937,14 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
if(flying || buckled || (walkSafely && m_intent == "walk"))
- return
+ return 0
if((lying) && (!(tilesSlipped)))
- return
+ return 0
if(!(slipAny))
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if((isobj(H.shoes) && H.shoes.flags & NOSLIP) || H.species.bodyflags & FEET_NOSLIP)
- return
+ return 0
if(tilesSlipped)
for(var/t = 0, t<=tilesSlipped, t++)
spawn (t) step(src, src.dir)
@@ -936,13 +959,13 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/proc/can_eat(flags = 255)
return 1
-/mob/living/carbon/proc/eat(var/obj/item/weapon/reagent_containers/food/toEat, mob/user)
+/mob/living/carbon/proc/eat(var/obj/item/weapon/reagent_containers/food/toEat, mob/user, var/bitesize_override)
if(!istype(toEat))
return 0
var/fullness = nutrition + 10
if(istype(toEat, /obj/item/weapon/reagent_containers/food/snacks))
for(var/datum/reagent/consumable/C in reagents.reagent_list) //we add the nutrition value of what we're currently digesting
- fullness += C.nutriment_factor * C.volume / C.metabolization_rate
+ fullness += C.nutriment_factor * C.volume / (C.metabolization_rate * metabolism_efficiency * digestion_ratio)
if(user == src)
if(istype(toEat, /obj/item/weapon/reagent_containers/food/drinks))
if(!selfDrink(toEat))
@@ -953,12 +976,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
else
if(!forceFed(toEat, user, fullness))
return 0
- consume(toEat)
+ consume(toEat, bitesize_override)
score_foodeaten++
return 1
/mob/living/carbon/proc/selfFeed(var/obj/item/weapon/reagent_containers/food/toEat, fullness)
- if(istype(toEat, /obj/item/weapon/reagent_containers/food/pill))
+ if(ispill(toEat))
to_chat(src, "You [toEat.apply_method] [toEat]. ")
else
if(toEat.junkiness && satiety < -150 && nutrition > NUTRITION_LEVEL_STARVING + 50 )
@@ -981,7 +1004,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return 1
/mob/living/carbon/proc/forceFed(var/obj/item/weapon/reagent_containers/food/toEat, mob/user, fullness)
- if(fullness <= (600 * (1 + overeatduration / 1000)))
+ if(ispill(toEat) || fullness <= (600 * (1 + overeatduration / 1000)))
if(!toEat.instant_application)
visible_message("[user] attempts to force [src] to [toEat.apply_method] [toEat]. ")
else
@@ -995,8 +1018,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return 1
/mob/living/carbon/proc/forceFedAttackLog(var/obj/item/weapon/reagent_containers/food/toEat, mob/user)
- attack_log += text("\[[time_stamp()]\] Has been fed [toEat.name] by [user.name] ([user.ckey]) Reagents: [toEat.reagentlist(toEat)] ")
- user.attack_log += text("\[[time_stamp()]\] Fed [toEat.name] to [name] ([ckey]) Reagents: [toEat.reagentlist(toEat)] ")
+ create_attack_log("Has been fed [toEat.name] by [user.name] ([user.ckey]) Reagents: [toEat.reagentlist(toEat)] ")
+ user.create_attack_log("Fed [toEat.name] to [name] ([ckey]) Reagents: [toEat.reagentlist(toEat)] ")
log_attack("[user.name] ([user.ckey]) fed [name] ([ckey]) with [toEat.name] Reagents: [toEat.reagentlist(toEat)] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
LAssailant = null
@@ -1006,7 +1029,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/*TO DO - If/when stomach organs are introduced, override this at the human level sending the item to the stomach
so that different stomachs can handle things in different ways VB*/
-/mob/living/carbon/proc/consume(var/obj/item/weapon/reagent_containers/food/toEat)
+/mob/living/carbon/proc/consume(var/obj/item/weapon/reagent_containers/food/toEat, var/bitesize_override)
+ var/this_bite = bitesize_override ? bitesize_override : toEat.bitesize
if(!toEat.reagents)
return
if(satiety > -200)
@@ -1014,9 +1038,9 @@ so that different stomachs can handle things in different ways VB*/
if(toEat.consume_sound)
playsound(loc, toEat.consume_sound, rand(10,50), 1)
if(toEat.reagents.total_volume)
- var/fraction = min(toEat.bitesize/toEat.reagents.total_volume, 1)
+ var/fraction = min(this_bite/toEat.reagents.total_volume, 1)
toEat.reagents.reaction(src, toEat.apply_type, fraction)
- toEat.reagents.trans_to(src, toEat.bitesize*toEat.transfer_efficiency)
+ toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
/mob/living/carbon/get_access()
. = ..()
diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm
index efebc58ffc1..1c911a3f661 100644
--- a/code/modules/mob/living/carbon/carbon_defenses.dm
+++ b/code/modules/mob/living/carbon/carbon_defenses.dm
@@ -1,13 +1,14 @@
-/mob/living/carbon/hitby(atom/movable/AM)
- if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
- if(canmove && !restrained())
- if(istype(AM, /obj/item))
- var/obj/item/I = AM
- if(isturf(I.loc))
- put_in_active_hand(I)
- visible_message("[src] catches [I]! ")
- throw_mode_off()
- return
+/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)
+ if(!skipcatch)
+ if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
+ if(canmove && !restrained())
+ if(istype(AM, /obj/item))
+ var/obj/item/I = AM
+ if(isturf(I.loc))
+ put_in_active_hand(I)
+ visible_message("[src] catches [I]! ")
+ throw_mode_off()
+ return 1
..()
/mob/living/carbon/water_act(volume, temperature, source)
@@ -36,4 +37,4 @@
for(var/datum/disease/D in user.viruses)
if(D.IsSpreadByTouch())
ContractDisease(D)
- return 0
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index e900fc10517..6e34291caae 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -20,7 +20,6 @@
var/pulse = PULSE_NORM //current pulse level
- var/heart_attack = 0
var/wetlevel = 0 //how wet the mob is
var/oxygen_alert = 0
@@ -29,4 +28,4 @@
var/fire_alert = 0
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
- var/co2overloadtime = null
\ No newline at end of file
+ var/co2overloadtime = null
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index f8a9b38d098..2ad9b1ef6ab 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -6,4 +6,7 @@
if(reagents)
reagents.death_metabolize(src)
+ for(var/obj/item/organ/internal/I in internal_organs)
+ I.on_owner_death()
+
..(gibbed)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index ad1ab28c435..e365f870fca 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -15,8 +15,8 @@
return 1
/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
- var/obj/item/organ/external/head/H = organs_by_name["head"]
- if(gender == new_gender)
+ var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
+ if(gender == new_gender || (gender == PLURAL && species.has_gender))
return
gender = new_gender
@@ -488,4 +488,4 @@
valid_alt_heads += alternate_head
- return valid_alt_heads
\ No newline at end of file
+ return valid_alt_heads
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 89c35870cad..69e86de81e6 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -22,7 +22,7 @@
spawn()
thing.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
- for(var/obj/item/organ/external/E in src.organs)
+ for(var/obj/item/organ/external/E in bodyparts)
if(istype(E, /obj/item/organ/external/chest))
continue
// Only make the limb drop if it's not too damaged
@@ -99,7 +99,7 @@
stat = DEAD
SetDizzy(0)
SetJitter(0)
- heart_attack = 0
+ set_heartattack(FALSE)
//Handle species-specific deaths.
if(species) species.handle_death(src)
@@ -114,7 +114,7 @@
B = I
if(B)
if(B.controlling && B.host == src)
- B.detatch()
+ B.detach()
verbs -= /mob/living/carbon/proc/release_control
@@ -177,7 +177,7 @@
return
/mob/living/carbon/human/proc/ChangeToHusk()
- var/obj/item/organ/external/head/H = organs_by_name["head"]
+ var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(HUSK in mutations) return
if(istype(H))
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 558a6f8e9de..1b15dccdc2c 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -45,7 +45,7 @@
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
found_slime_bodypart = 1
else
- for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too!
+ for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too!
if(L.dna.species in list("Slime People"))
on_CD = handle_emote_CD()
found_slime_bodypart = 1
@@ -53,10 +53,33 @@
if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
return
+
+ if("clack", "clacks")
+ if(species.name == "Kidan") //Only Kidan can clack and rightfully so.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
+ if("click", "clicks")
+ if(species.name == "Kidan") //Only Kidan can click and rightfully so.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
+ if("hiss", "hisses")
+ if(species.name == "Unathi") //Only Unathi can hiss.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
if("scream", "screams")
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ if("cough", "coughs")
+ on_CD = handle_emote_CD()
+ if("sneeze", "sneezes")
+ on_CD = handle_emote_CD()
//Everything else, including typos of the above emotes
else
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
@@ -68,129 +91,81 @@
if("me") //OKAY SO RANT TIME, THIS FUCKING HAS TO BE HERE OR A SHITLOAD OF THINGS BREAK
return custom_emote(m_type, message) //DO YOU KNOW WHY SHIT BREAKS? BECAUSE SO MUCH OLDCODE CALLS mob.emote("me",1,"whatever_the_fuck_it_wants_to_emote")
//WHO THE FUCK THOUGHT THAT WAS A GOOD FUCKING IDEA!?!?
-
if("ping", "pings")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param) //Check to see if the param is valid (mob with the param name is in view).
- if(param)
- message = "[src] pings at [param]."
- else
- message = "[src] pings."
- playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+ message = "[src] pings[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 2
if("buzz2")
- message = "[src] emits an irritated buzzing sound."
- playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ var/M = handle_emote_param(param)
+
+ message = "[src] emits an irritated buzzing sound[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
m_type = 2
if("buzz", "buzzes")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] buzzes at [param]."
- else
- message = "[src] buzzes."
- playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ message = "[src] buzzes[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 2
if("beep", "beeps")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] beeps at [param]."
- else
- message = "[src] beeps."
- playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
+ message = "[src] beeps[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 2
if("drone", "drones", "hum", "hums", "rumble", "rumbles")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] drones at [param]."
- else
- message = "[src] rumbles."
- playsound(src.loc, 'sound/voice/DraskTalk.ogg', 50, 0)
+ message = "[src] [M ? "drones at [M]" : "rumbles"]."
+ playsound(loc, 'sound/voice/DraskTalk.ogg', 50, 0)
m_type = 2
if("squish", "squishes")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] squishes at [param]."
- else
- message = "[src] squishes."
- playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ message = "[src] squishes[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ m_type = 2
+
+ if("clack", "clacks")
+ var/M = handle_emote_param(param)
+
+ message = "[src] clacks their mandibles[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/Kidanclack.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ m_type = 2
+
+ if("click", "clicks")
+ var/M = handle_emote_param(param)
+
+ message = "[src] clicks their mandibles[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/Kidanclack2.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ m_type = 2
+
+ if("hiss", "hisses")
+ var/M = handle_emote_param(param)
+
+ message = "[src] hisses[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/unathihiss.ogg', 50, 0) //Credit to Jamius (freesound.org) for the sound.
m_type = 2
if("yes")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] emits an affirmative blip at [param]."
- else
- message = "[src] emits an affirmative blip."
- playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
+ message = "[src] emits an affirmative blip[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/machines/synth_yes.ogg', 50, 0)
m_type = 2
if("no")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] emits a negative blip at [param]."
- else
- message = "[src] emits a negative blip."
- playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
+ message = "[src] emits a negative blip[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/machines/synth_no.ogg', 50, 0)
m_type = 2
if("wag", "wags")
@@ -202,7 +177,7 @@
else if(species.bodyflags & TAIL_WAGGING)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
message = "[src] starts wagging \his tail."
- src.start_tail_wagging(1)
+ start_tail_wagging(1)
else
return
else
@@ -212,16 +187,26 @@
if("swag", "swags")
if(species.bodyflags & TAIL_WAGGING || body_accessory)
message = "[src] stops wagging \his tail."
- src.stop_tail_wagging(1)
+ stop_tail_wagging(1)
else
return
m_type = 1
if("airguitar")
- if(!src.restrained())
+ if(!restrained())
message = "[src] is strumming the air and headbanging like a safari chimp."
m_type = 1
+ if("dance")
+ if(!restrained())
+ message = "[src] dances around happily."
+ m_type = 1
+
+ if("jump")
+ if(!restrained())
+ message = "[src] jumps!"
+ m_type = 1
+
if("blink", "blinks")
message = "[src] blinks."
m_type = 1
@@ -231,37 +216,17 @@
m_type = 1
if("bow", "bows")
- if(!src.buckled)
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ if(!buckled)
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] bows to [param]."
- else
- message = "[src] bows."
+ message = "[src] bows[M ? " to [M]" : ""]."
m_type = 1
if("salute", "salutes")
- if(!src.buckled)
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ if(!buckled)
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] salutes to [param]."
- else
- message = "[src] salutes."
+ message = "[src] salutes[M ? " to [M]" : ""]."
m_type = 1
if("choke", "chokes")
@@ -288,13 +253,13 @@
message = "[src] makes a peculiar noise."
m_type = 2
if("clap", "claps")
- if(!src.restrained())
+ if(!restrained())
message = "[src] claps."
m_type = 2
if(miming)
m_type = 1
if("flap", "flaps")
- if(!src.restrained())
+ if(!restrained())
message = "[src] flaps \his wings."
m_type = 2
if(miming)
@@ -302,7 +267,7 @@
if("flip", "flips")
m_type = 1
- if(!src.restrained())
+ if(!restrained())
var/M = null
if(param)
for(var/mob/A in view(1, null))
@@ -340,7 +305,7 @@
SpinAnimation(5,1)
if("aflap", "aflaps")
- if(!src.restrained())
+ if(!restrained())
message = "[src] flaps \his wings ANGRILY!"
m_type = 2
if(miming)
@@ -376,7 +341,7 @@
if("faint", "faints")
message = "[src] faints."
- if(src.sleeping)
+ if(sleeping)
return //Can't faint while asleep
AdjustSleeping(2)
m_type = 1
@@ -389,16 +354,26 @@
if(!muzzled)
message = "[src] coughs!"
m_type = 2
+ if(gender == FEMALE)
+ if(species.female_cough_sounds)
+ playsound(src, pick(species.female_cough_sounds), 120)
+ else
+ if(species.male_cough_sounds)
+ playsound(src, pick(species.male_cough_sounds), 120)
else
message = "[src] makes a strong noise."
m_type = 2
if("frown", "frowns")
- message = "[src] frowns."
+ var/M = handle_emote_param(param)
+
+ message = "[src] frowns[M ? " at [M]" : ""]."
m_type = 1
if("nod", "nods")
- message = "[src] nods."
+ var/M = handle_emote_param(param)
+
+ message = "[src] nods[M ? " at [M]" : ""]."
m_type = 1
if("blush", "blushes")
@@ -406,7 +381,9 @@
m_type = 1
if("wave", "waves")
- message = "[src] waves."
+ var/M = handle_emote_param(param)
+
+ message = "[src] waves[M ? " at [M]" : ""]."
m_type = 1
if("quiver", "quivers")
@@ -442,56 +419,27 @@
m_type = 2
if("glare", "glares")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] glares at [param]."
- else
- message = "[src] glares."
+ message = "[src] glares[M ? " at [M]" : ""]."
m_type = 1
if("stare", "stares")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] stares at [param]."
- else
- message = "[src] stares."
+ message = "[src] stares[M ? " at [M]" : ""]."
m_type = 1
if("look", "looks")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
+ var/M = handle_emote_param(param)
- if(!M)
- param = null
-
- if(param)
- message = "[src] looks at [param]."
- else
- message = "[src] looks."
+ message = "[src] looks[M ? " at [M]" : ""]."
m_type = 1
if("grin", "grins")
- message = "[src] grins."
+ var/M = handle_emote_param(param)
+
+ message = "[src] grins[M ? " at [M]" : ""]."
m_type = 1
if("cry", "cries")
@@ -507,24 +455,26 @@
m_type = 2
if("sigh", "sighs")
+ var/M = handle_emote_param(param)
if(miming)
- message = "[src] sighs."
+ message = "[src] sighs[M ? " at [M]" : ""]."
m_type = 1
else
if(!muzzled)
- message = "[src] sighs."
+ message = "[src] sighs[M ? " at [M]" : ""]."
m_type = 2
else
- message = "[src] makes a weak noise."
+ message = "[src] makes a weak noise"
m_type = 2
if("laugh", "laughs")
+ var/M = handle_emote_param(param)
if(miming)
- message = "[src] acts out a laugh."
+ message = "[src] acts out a laugh[M ? " at [M]" : ""]."
m_type = 1
else
if(!muzzled)
- message = "[src] laughs."
+ message = "[src] laughs[M ? " at [M]" : ""]."
m_type = 2
else
message = "[src] makes a noise."
@@ -537,11 +487,12 @@
m_type = 1
if("grumble", "grumbles")
+ var/M = handle_emote_param(param)
if(miming)
- message = "[src] grumbles!"
+ message = "[src] grumbles[M ? " at [M]" : ""]!"
m_type = 1
if(!muzzled)
- message = "[src] grumbles!"
+ message = "[src] grumbles[M ? " at [M]" : ""]!"
m_type = 2
else
message = "[src] makes a noise."
@@ -578,11 +529,11 @@
message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke."
m_type = 1
else
- message = "[src] says, \"[M], please. They had a family.\" [src.name] takes a drag from a cigarette and blows their name out in smoke."
+ message = "[src] says, \"[M], please. They had a family.\" [name] takes a drag from a cigarette and blows their name out in smoke."
m_type = 2
if("point", "points")
- if(!src.restrained())
+ if(!restrained())
var/atom/M = null
if(param)
for(var/atom/A as mob|obj|turf in view())
@@ -597,12 +548,14 @@
m_type = 1
if("raise", "raises")
- if(!src.restrained())
+ if(!restrained())
message = "[src] raises a hand."
m_type = 1
if("shake", "shakes")
- message = "[src] shakes \his head."
+ var/M = handle_emote_param(param, 1) //Check to see if the param is valid (mob with the param name is in view) but exclude ourselves.
+
+ message = "[src] shakes \his head[M ? " at [M]" : ""]."
m_type = 1
if("shrug", "shrugs")
@@ -610,17 +563,19 @@
m_type = 1
if("signal", "signals")
- if(!src.restrained())
+ if(!restrained())
var/t1 = round(text2num(param))
if(isnum(t1))
- if(t1 <= 5 && (!src.r_hand || !src.l_hand))
+ if(t1 <= 5 && (!r_hand || !l_hand))
message = "[src] raises [t1] finger\s."
- else if(t1 <= 10 && (!src.r_hand && !src.l_hand))
+ else if(t1 <= 10 && (!r_hand && !l_hand))
message = "[src] raises [t1] finger\s."
m_type = 1
if("smile", "smiles")
- message = "[src] smiles."
+ var/M = handle_emote_param(param, 1)
+
+ message = "[src] smiles[M ? " at [M]" : ""]."
m_type = 1
if("shiver", "shivers")
@@ -644,6 +599,10 @@
else
if(!muzzled)
message = "[src] sneezes."
+ if(gender == FEMALE)
+ playsound(src, species.female_sneeze_sound, 70)
+ else
+ playsound(src, species.male_sneeze_sound, 70)
m_type = 2
else
message = "[src] makes a strange noise."
@@ -680,7 +639,9 @@
m_type = 2
if("wink", "winks")
- message = "[src] winks."
+ var/M = handle_emote_param(param, 1)
+
+ message = "[src] winks[M ? " at [M]" : ""]."
m_type = 1
if("yawn", "yawns")
@@ -699,15 +660,8 @@
if("hug", "hugs")
m_type = 1
- if(!src.restrained())
- var/M = null
- if(param)
- for(var/mob/A in view(1, null))
- if(param == A.name)
- M = A
- break
- if(M == src)
- M = null
+ if(!restrained())
+ var/M = handle_emote_param(param, 1, 1) //Check to see if the param is valid (mob with the param name is in view) but exclude ourselves and only check mobs in our immediate vicinity (1 tile distance).
if(M)
message = "[src] hugs [M]."
@@ -716,15 +670,8 @@
if("handshake")
m_type = 1
- if(!src.restrained() && !src.r_hand)
- var/mob/M = null
- if(param)
- for(var/mob/A in view(1, null))
- if(param == A.name)
- M = A
- break
- if(M == src)
- M = null
+ if(!restrained() && !r_hand)
+ var/mob/M = handle_emote_param(param, 1, 1, 1) //Check to see if the param is valid (mob with the param name is in view) but exclude ourselves, only check mobs in our immediate vicinity (1 tile distance) and return the whole mob instead of just its name.
if(M)
if(M.canmove && !M.r_hand && !M.restrained())
@@ -734,13 +681,9 @@
if("dap", "daps")
m_type = 1
- if(!src.restrained())
- var/M = null
- if(param)
- for(var/mob/A in view(1, null))
- if(param == A.name)
- M = A
- break
+ if(!restrained())
+ var/M = handle_emote_param(param, null, 1)
+
if(M)
message = "[src] gives daps to [M]."
else
@@ -748,39 +691,34 @@
if("slap", "slaps")
m_type = 1
- if(!src.restrained())
- var/M = null
- if(param)
- for(var/mob/A in view(1, null))
- if(param == A.name)
- M = A
- break
+ if(!restrained())
+ var/M = handle_emote_param(param, null, 1)
+
if(M)
message = "[src] slaps [M] across the face. Ouch! "
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
else
message = "[src] slaps \himself! "
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
- src.adjustFireLoss(4)
+ adjustFireLoss(4)
+ playsound(loc, 'sound/effects/snap.ogg', 50, 1)
if("scream", "screams")
+ var/M = handle_emote_param(param)
if(miming)
- message = "[src] acts out a scream!"
+ message = "[src] acts out a scream[M ? " at [M]" : ""]!"
m_type = 1
else
if(!muzzled)
- message = "[src] [species.scream_verb]!"
+ message = "[src] [species.scream_verb][M ? " at [M]" : ""]!"
m_type = 2
if(gender == FEMALE)
- playsound(src.loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch())
+ playsound(loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch())
else
- playsound(src.loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present.
+ playsound(loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present.
else
- message = "[src] makes a very loud noise."
+ message = "[src] makes a very loud noise[M ? " at [M]" : ""]."
m_type = 2
-
if("snap", "snaps")
if(prob(95))
m_type = 2
@@ -798,25 +736,26 @@
to_chat(usr, "You need at least one hand in good working order to snap your fingers.")
return
- message = "[src] snaps \his fingers."
- playsound(src.loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
+ var/M = handle_emote_param(param)
+
+ message = "[src] snaps \his fingers[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
else
message = "[src] snaps \his fingers right off! "
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
-
+ playsound(loc, 'sound/effects/snap.ogg', 50, 1)
// Needed for M_TOXIC_FART
if("fart", "farts")
if(reagents.has_reagent("simethicone"))
return
-// playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
+// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
if(locate(/obj/item/weapon/storage/bible) in get_turf(src))
to_chat(viewers(src), "[src] farts on the Bible! ")
- to_chat(viewers(src), "A mysterious force smites [src]! ")
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- src.gib()
+ var/image/cross = image('icons/obj/storage.dmi',"bible")
+ var/adminbfmessage = "\blue [bicon(cross)] Bible Fart: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(src)]) (CA ) (SMITE ): "
+ for(var/client/X in admins)
+ if(check_rights(R_EVENT,0,X.mob))
+ to_chat(X, adminbfmessage)
else if(TOXIC_FARTS in mutations)
message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
else if(SUPER_FART in mutations)
@@ -841,9 +780,9 @@
M.reagents.add_reagent("jenkem", 1)
if("help")
- var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \
- + " deathgasp(s), drool(s), eyebrow,fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), handshake-mob, hug(s)-(none)/mob," \
- + " glare(s)-(none)/mob, grin(s), johnny, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dance, dap(s)(none)/mob," \
+ + " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \
+ + " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s)"
if(species.name == "Machine")
@@ -853,13 +792,9 @@
to_chat(src, emotelist)
else
- to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.")
+ to_chat(src, "Unusable emote '[act]'. Say *help for a list. ")
-
-
-
-
- if(message) //Humans are special fucking snowflakes and have 735 lines of emotes, they get to handle their own emotes, not call the parent
+ if(message) //Humans are special fucking snowflakes and have 800 lines of emotes, they get to handle their own emotes, not call the parent.
log_emote("[name]/[key] : [message]")
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 453402ec7e3..693973ab42d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -33,7 +33,7 @@
var/msg = "*---------*\nThis is "
- if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
+ if((skipjumpsuit && skipface)) //big suits/masks/helmets make it hard to tell their gender
t_He = "They"
t_his = "their"
t_him = "them"
@@ -51,6 +51,12 @@
t_He = "She"
t_his = "her"
t_him = "her"
+ if(PLURAL)
+ t_He = "They"
+ t_his = "their"
+ t_him = "them"
+ t_has = "have"
+ t_is = "are"
msg += "[name] "
@@ -289,7 +295,7 @@
var/organ_descriptor = organ_data["descriptor"]
is_destroyed["[organ_data["descriptor"]]"] = 1
- var/obj/item/organ/external/E = organs_by_name[organ_tag]
+ var/obj/item/organ/external/E = bodyparts_by_name[organ_tag]
if(!E)
wound_flavor_text["[organ_tag]"] = "[t_He] [t_is] missing [t_his] [organ_descriptor]. \n"
else if(E.is_stump())
@@ -297,7 +303,7 @@
else
continue
- for(var/obj/item/organ/external/temp in organs)
+ for(var/obj/item/organ/external/temp in bodyparts)
if(temp && !temp.is_stump())
if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
@@ -434,10 +440,10 @@
for(var/implant in get_visible_implants(0))
- msg += "[src] has \a [implant] sticking out of [t_his] flesh! \n"
+ msg += "[src] has \a [implant] sticking out of [t_his] flesh! \n"
if(digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n"
- if(!wear_mask && is_thrall(src) && in_range(user,src))
+ if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
msg += "Their features seem unnaturally tight and drawn.\n"
if(decaylevel == 1)
msg += "[t_He] [t_is] starting to smell.\n"
@@ -494,7 +500,8 @@
msg += "Medical records: \[View\] \[Add comment\] \n"
- if(print_flavor_text()) msg += "[print_flavor_text()]\n"
+ if(print_flavor_text() && !skipface)
+ msg += "[print_flavor_text()]\n"
msg += "*---------* "
if(pose)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b429c34f734..000a7a52bd0 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -52,7 +52,7 @@
UpdateAppearance()
/mob/living/carbon/human/OpenCraftingMenu()
- handcrafting.craft(src)
+ handcrafting.ui_interact(src)
/mob/living/carbon/human/prepare_data_huds()
//Update med hud images...
@@ -65,9 +65,7 @@
add_to_all_human_data_huds()
/mob/living/carbon/human/Destroy()
- for(var/atom/movable/organelle in organs)
- qdel(organelle)
- organs = list()
+ QDEL_LIST(bodyparts)
return ..()
/mob/living/carbon/human/dummy
@@ -149,93 +147,6 @@
/mob/living/carbon/human/stok/New(var/new_loc)
..(new_loc, "Stok")
-/mob/living/carbon/human/Bump(atom/movable/AM, yes)
- if(!(yes) || now_pushing || buckled)
- return 0
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
-
- //BubbleWrap - Should stop you pushing a restrained person out of the way
- //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap'
- if(ishuman(tmob))
- for(var/mob/M in range(tmob, 1))
-
- if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS))
- if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human
- to_chat(src, "[tmob] is restrained, you cannot push past. ")
- now_pushing = 0
- return 0
-
- //I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had
- //locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it
- //FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE()
- //SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD
-
- if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS)
- if(!(world.time % 5))
- to_chat(src, "[tmob] is restraining [M], you cannot push past. ")
- now_pushing = 0
- return 0
-
- //Leaping mobs just land on the tile, no pushing, no anything.
- if(status_flags & LEAPING)
- loc = tmob.loc
- status_flags &= ~LEAPING
- now_pushing = 0
- return
-
- //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- //it might be 'bubblewrapping' given that this rhymes with 'hugboxing'
- if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()))
- if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob))
- var/turf/oldloc = loc
- loc = tmob.loc
- tmob.loc = oldloc
- now_pushing = 0
- for(var/mob/living/carbon/slime/slime in view(1,tmob))
- if(slime.Victim == tmob)
- slime.UpdateFeed()
- return
-
- if(ishuman(tmob) && (FAT in tmob.mutations))
- if(prob(40) && !(FAT in src.mutations))
- to_chat(src, "You fail to push [tmob]'s fat ass out of the way. ")
- now_pushing = 0
- return
-
-
- //anti-riot equipment is also anti-push
- if(tmob.r_hand && (prob(tmob.r_hand.block_chance * 2)) && !istype(tmob.r_hand, /obj/item/clothing))
- now_pushing = 0
- return
- if(tmob.l_hand && (prob(tmob.l_hand.block_chance * 2)) && !istype(tmob.l_hand, /obj/item/clothing))
- now_pushing = 0
- return
-
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
-
- now_pushing = 0
- spawn(0)
- ..()
- if(!istype(AM, /atom/movable))
- return
- if(!now_pushing)
- now_pushing = 1
-
- if(!AM.anchored)
- var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM, t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = 0
-
/mob/living/carbon/human/Stat()
..()
statpanel("Status")
@@ -310,7 +221,7 @@
var/limbs_affected = pick(2,3,4)
var/obj/item/organ/external/processing_dismember
- var/list/valid_limbs = organs.Copy()
+ var/list/valid_limbs = bodyparts.Copy()
while(limbs_affected != 0 && valid_limbs.len > 0)
processing_dismember = pick(valid_limbs)
@@ -328,7 +239,7 @@
var/limbs_affected = 0
var/obj/item/organ/external/processing_dismember
- var/list/valid_limbs = organs.Copy()
+ var/list/valid_limbs = bodyparts.Copy()
if(prob(getarmor(null, "bomb")))
b_loss = b_loss/1.5
@@ -361,7 +272,7 @@
var/limbs_affected = pick(0, 1)
var/obj/item/organ/external/processing_dismember
- var/list/valid_limbs = organs.Copy()
+ var/list/valid_limbs = bodyparts.Copy()
while(limbs_affected != 0 && valid_limbs.len > 0)
processing_dismember = pick(valid_limbs)
@@ -533,6 +444,17 @@
dat += "Head: [(head && !(head.flags&ABSTRACT)) ? head : "Empty "] "
+ var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket)
+ if(C)
+ if(slot_wear_mask in obscured)
+ dat += " ↳Headpocket: Obscured "
+ else
+ var/list/items = C.get_contents()
+ if(items.len)
+ dat += " ↳Headpocket: Dislodge Items "
+ else
+ dat += " ↳Headpocket: Empty "
+
if(slot_wear_mask in obscured)
dat += "Mask: Obscured "
else
@@ -721,8 +643,6 @@
if(istype(id))
return id
-
-
/mob/living/carbon/human/update_sight()
if(!client)
return
@@ -749,7 +669,11 @@
var/obj/item/clothing/suit/S = wear_suit
if(S.siemens_coefficient <= 0)
total_coeff -= 0.95
+ else if(S.siemens_coefficient == (-1))
+ total_coeff -= 1
siemens_coeff = total_coeff
+ if(tesla_ignore)
+ siemens_coeff = 0
else if(!safety)
var/gloves_siemens_coeff = 1
var/species_siemens_coeff = 1
@@ -759,9 +683,9 @@
if(species)
species_siemens_coeff = species.siemens_coeff
siemens_coeff = gloves_siemens_coeff * species_siemens_coeff
- if(heart_attack)
+ if(undergoing_cardiac_arrest())
if(shock_damage * siemens_coeff >= 1 && prob(25))
- heart_attack = 0
+ set_heartattack(FALSE)
if(stat == CONSCIOUS)
to_chat(src, "You feel your heart beating again! ")
. = ..()
@@ -826,6 +750,16 @@
var/obj/item/clothing/under/U = w_uniform
U.set_sensors(usr)
+ if(href_list["dislodge_headpocket"])
+ usr.visible_message("[usr] is trying to remove something from [src]'s head! ",
+ "You start to dislodge whatever's inside [src]'s headpocket! ")
+ if(do_mob(usr, src, POCKET_STRIP_DELAY))
+ usr.visible_message("[usr] has dislodged something from [src]'s head! ",
+ "You have dislodged everything from [src]'s headpocket! ")
+ var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket)
+ C.empty_contents()
+ add_logs(usr, src, "stripped", addition="of headpocket items", print_attack_log=isLivingSSD(src))
+
if(href_list["strip_accessory"])
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
@@ -874,7 +808,7 @@
sec_hud_set_security_status()
if(!modified)
- to_chat(usr, "\red Unable to locate a data core entry for this person.")
+ to_chat(usr, "Unable to locate a data core entry for this person. ")
if(href_list["secrecord"])
if(hasHUD(usr,"security"))
@@ -904,7 +838,7 @@
read = 1
if(!read)
- to_chat(usr, "\red Unable to locate a data core entry for this person.")
+ to_chat(usr, "Unable to locate a data core entry for this person. ")
if(href_list["secrecordComment"])
if(hasHUD(usr,"security"))
@@ -925,16 +859,15 @@
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
read = 1
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
- counter++
- if(counter == 1)
- to_chat(usr, "No comment found")
+ if(length(R.fields["comments"]))
+ for(var/c in R.fields["comments"])
+ to_chat(usr, c)
+ else
+ to_chat(usr, "No comment found ")
to_chat(usr, "\[Add comment\] ")
if(!read)
- to_chat(usr, "\red Unable to locate a data core entry for this person.")
+ to_chat(usr, "Unable to locate a data core entry for this person. ")
if(href_list["secrecordadd"])
if(hasHUD(usr,"security"))
@@ -952,21 +885,18 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
- var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Sec. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "security"))
return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- if(istype(usr,/mob/living/carbon/human))
+ if(ishuman(usr))
var/mob/living/carbon/human/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if(istype(usr,/mob/living/silicon/robot))
+ R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] [t1]"
+ if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if(istype(usr,/mob/living/silicon/ai))
+ R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] [t1]"
+ if(isAI(usr))
var/mob/living/silicon/ai/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.name] (artificial intelligence) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
+ R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()] [t1]"
if(href_list["medical"])
if(hasHUD(usr,"medical"))
@@ -999,7 +929,7 @@
sec_hud_set_security_status()
if(!modified)
- to_chat(usr, "\red Unable to locate a data core entry for this person.")
+ to_chat(usr, "Unable to locate a data core entry for this person. ")
if(href_list["medrecord"])
if(hasHUD(usr,"medical"))
@@ -1030,7 +960,7 @@
read = 1
if(!read)
- to_chat(usr, "\red Unable to locate a data core entry for this person.")
+ to_chat(usr, "Unable to locate a data core entry for this person. ")
if(href_list["medrecordComment"])
if(hasHUD(usr,"medical"))
@@ -1051,16 +981,15 @@
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
read = 1
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
- counter++
- if(counter == 1)
- to_chat(usr, "No comment found")
+ if(length(R.fields["comments"]))
+ for(var/c in R.fields["comments"])
+ to_chat(usr, c)
+ else
+ to_chat(usr, "No comment found ")
to_chat(usr, "\[Add comment\] ")
if(!read)
- to_chat(usr, "\red Unable to locate a data core entry for this person.")
+ to_chat(usr, "Unable to locate a data core entry for this person. ")
if(href_list["medrecordadd"])
if(hasHUD(usr,"medical"))
@@ -1078,18 +1007,15 @@
for(var/datum/data/record/R in data_core.medical)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
- var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "medical"))
return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- if(istype(usr,/mob/living/carbon/human))
+ if(ishuman(usr))
var/mob/living/carbon/human/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if(istype(usr,/mob/living/silicon/robot))
+ R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] [t1]"
+ if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
+ R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] [t1]"
if(href_list["lookitem"])
var/obj/item/I = locate(href_list["lookitem"])
@@ -1178,7 +1104,7 @@
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
- visible_message("\red [src] begins playing his ribcage like a xylophone. It's quite spooky.","\blue You begin to play a spooky refrain on your ribcage.","\red You hear a spooky xylophone melody.")
+ visible_message("[src] begins playing his ribcage like a xylophone. It's quite spooky. ","You begin to play a spooky refrain on your ribcage. ","You hear a spooky xylophone melody. ")
var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg')
playsound(loc, song, 50, 1, -1)
xylophone = 1
@@ -1248,7 +1174,6 @@
return 0
return 1
-
/mob/living/carbon/human/proc/get_visible_gender()
if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask))
return NEUTER
@@ -1270,20 +1195,20 @@
if(istype(organ, /obj/item/organ/external/stump)) //Get rid of all stumps.
qdel(organ)
H.contents -= organ //Making sure the list entry is removed.
- for(var/obj/item/organ/organ in H.organs)
+ for(var/obj/item/organ/organ in H.bodyparts)
if(istype(organ, /obj/item/organ/external/stump))
qdel(organ)
- H.organs -= organ //Making sure the list entry is removed.
- for(var/organ_name in H.organs_by_name)
- var/obj/item/organ/organ = H.organs_by_name[organ_name]
+ H.bodyparts -= organ //Making sure the list entry is removed.
+ for(var/organ_name in H.bodyparts_by_name)
+ var/obj/item/organ/organ = H.bodyparts_by_name[organ_name]
if(istype(organ, /obj/item/organ/external/stump) || !organ) //The !organ check is to account for mechanical limb (prostheses) losses, since those are handled in a way that leaves indexed but null list entries instead of stumps.
qdel(organ)
- H.organs_by_name -= organ_name //Making sure the list entry is removed.
+ H.bodyparts_by_name -= organ_name //Making sure the list entry is removed.
//Replacing lost limbs with the species default.
var/mob/living/carbon/human/temp_holder
for(var/limb_type in H.species.has_limbs)
- if(!(limb_type in H.organs_by_name))
+ if(!(limb_type in H.bodyparts_by_name))
var/list/organ_data = H.species.has_limbs[limb_type]
var/limb_path = organ_data["path"]
var/obj/item/organ/external/O = new limb_path(temp_holder)
@@ -1293,7 +1218,7 @@
else
O = new limb_path(H) //Create the limb on the player.
O.owner = H
- H.organs |= H.organs_by_name[O.limb_name]
+ H.bodyparts |= H.bodyparts_by_name[O.limb_name]
//Replacing lost organs with the species default.
temp_holder = new /mob/living/carbon/human()
@@ -1415,10 +1340,18 @@
if(..())
unEquip(I)
+/mob/living/carbon/human/resist_restraints()
+ if(wear_suit && wear_suit.breakouttime)
+ changeNext_move(CLICK_CD_BREAKOUT)
+ last_special = world.time + CLICK_CD_BREAKOUT
+ cuff_resist(wear_suit)
+ else
+ ..()
+
/mob/living/carbon/human/get_visible_implants(var/class = 0)
var/list/visible_implants = list()
- for(var/obj/item/organ/external/organ in src.organs)
+ for(var/obj/item/organ/external/organ in bodyparts)
for(var/obj/item/weapon/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel))
visible_implants += O
@@ -1434,7 +1367,7 @@
/mob/living/carbon/human/proc/handle_embedded_objects()
- for(var/obj/item/organ/external/organ in src.organs)
+ for(var/obj/item/organ/external/organ in bodyparts)
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
continue
for(var/obj/item/weapon/O in organ.implants)
@@ -1467,16 +1400,16 @@
if(usr == src)
self = 1
if(!self)
- usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\
+ usr.visible_message("[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse. ",\
"You begin counting [src]'s pulse")
else
- usr.visible_message("\blue [usr] begins counting their pulse.",\
+ usr.visible_message("[usr] begins counting their pulse. ",\
"You begin counting your pulse.")
if(src.pulse)
- to_chat(usr, "\blue [self ? "You have a" : "[src] has a"] pulse! Counting...")
+ to_chat(usr, "[self ? "You have a" : "[src] has a"] pulse! Counting... ")
else
- to_chat(usr, "\red [src] has no pulse!")//it is REALLY UNLIKELY that a dead person would check his own pulse
+ to_chat(usr, "[src] has no pulse! ")//it is REALLY UNLIKELY that a dead person would check his own pulse
return
@@ -1486,10 +1419,11 @@
if(usr.l_move_time >= time) //checks if our mob has moved during the sleep()
to_chat(usr, "You moved while counting. Try again.")
else
- to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
+ to_chat(usr, "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]. ")
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
var/datum/species/oldspecies = species
+ var/datum/species/NS = all_species[new_species]
if(!dna)
if(!new_species)
new_species = "Human"
@@ -1509,6 +1443,8 @@
if(species.default_language)
remove_language(species.default_language)
+ if(gender == PLURAL && NS.has_gender)
+ change_gender(pick(MALE,FEMALE))
species.handle_pre_change(src)
species = all_species[new_species]
@@ -1517,6 +1453,8 @@
if(oldspecies.default_genes.len)
oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species
+ tail = species.tail
+
if(vessel)
vessel = null
make_blood()
@@ -1533,11 +1471,8 @@
if(species.default_language)
add_language(species.default_language)
- see_in_dark = species.darksight
- if(see_in_dark > 2)
- see_invisible = SEE_INVISIBLE_LEVEL_ONE
- else
- see_invisible = SEE_INVISIBLE_LIVING
+ hunger_drain = species.hunger_drain
+ digestion_ratio = species.digestion_ratio
if(species.base_color && default_colour)
//Apply colour.
@@ -1605,8 +1540,17 @@
dna.real_name = real_name
species.handle_post_spawn(src)
+
+ see_in_dark = species.get_resultant_darksight(src)
+ if(see_in_dark > 2)
+ see_invisible = SEE_INVISIBLE_LEVEL_ONE
+ else
+ see_invisible = SEE_INVISIBLE_LIVING
+
species.handle_dna(src) //Give them whatever special dna business they got.
+ update_client_colour(0)
+
spawn(0)
overlays.Cut()
update_mutantrace(1)
@@ -1629,7 +1573,6 @@
return null
return species.default_language ? all_languages[species.default_language] : null
-
/mob/living/carbon/human/proc/bloody_doodle()
set category = "IC"
set name = "Write in blood"
@@ -1766,7 +1709,7 @@
if(status_flags & LEAPING) status_flags &= ~LEAPING
if(!src.Adjacent(T))
- to_chat(src, "\red You miss!")
+ to_chat(src, "You miss! ")
return
T.Weaken(5)
@@ -1779,7 +1722,7 @@
var/use_hand = "left"
if(l_hand)
if(r_hand)
- to_chat(src, "\red You need to have one hand free to grab someone.")
+ to_chat(src, "You need to have one hand free to grab someone. ")
return
else
use_hand = "right"
@@ -1805,16 +1748,16 @@
return
if(!canmove)
- to_chat(src, "\red You cannot do that in your current state.")
+ to_chat(src, "You cannot do that in your current state. ")
return
var/obj/item/weapon/grab/G = locate() in src
if(!G || !istype(G))
- to_chat(src, "\red You are not grabbing anyone.")
+ to_chat(src, "You are not grabbing anyone. ")
return
if(G.state < GRAB_AGGRESSIVE)
- to_chat(src, "\red You must have an aggressive grab to gut your prey!")
+ to_chat(src, "You must have an aggressive grab to gut your prey! ")
return
last_special = world.time + 50
@@ -1888,12 +1831,12 @@
threatcount += 2
//Check for dresscode violations
- if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/rig/wizard))
+ if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
threatcount += 2
//Mindshield implants imply slight trustworthiness
- if(isloyal(src))
+ if(ismindshielded(src))
threatcount -= 1
//Agent cards lower threatlevel.
@@ -2048,6 +1991,10 @@
return .
+/mob/living/carbon/human/proc/change_icobase(var/new_icobase, var/new_deform, var/owner_sensitive)
+ for(var/obj/item/organ/external/O in bodyparts)
+ O.change_organ_icobase(new_icobase, new_deform, owner_sensitive) //Change the icobase/deform of all our organs. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs.
+
/mob/living/carbon/human/serialize()
// Currently: Limbs/organs only
var/list/data = ..()
@@ -2067,8 +2014,8 @@
data["uwear"] = underwear
// Limbs
- for(var/limb in organs_by_name)
- var/obj/item/organ/O = organs_by_name[limb]
+ for(var/limb in bodyparts_by_name)
+ var/obj/item/organ/O = bodyparts_by_name[limb]
if(!O)
limbs_list[limb] = "missing"
continue
@@ -2109,7 +2056,7 @@
for(var/obj/item/organ/internal/iorgan in internal_organs)
qdel(iorgan)
- for(var/obj/item/organ/external/organ in organs)
+ for(var/obj/item/organ/external/organ in bodyparts)
qdel(organ)
for(var/limb in limbs_list)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index cea8c962af7..b0d2fb3e315 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -4,14 +4,14 @@
return
if(frozen)
- to_chat(M, "\red Do not touch Admin-Frozen people.")
+ to_chat(M, "Do not touch Admin-Frozen people. ")
return
var/mob/living/carbon/human/H = M
if(istype(H))
- var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
+ var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(H.hand)
- temp = H.organs_by_name["l_hand"]
+ temp = H.bodyparts_by_name["l_hand"]
if(!temp || !temp.is_usable())
to_chat(H, "You can't use your hand. ")
return
@@ -75,10 +75,10 @@
if(!check_has_mouth())
to_chat(H, "They don't have a mouth, you cannot perform CPR! ")
return
- if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH) && !M.wear_mask.mask_adjusted))
+ if((M.head && (M.head.flags_cover & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags_cover & MASKCOVERSMOUTH) && !M.wear_mask.mask_adjusted))
to_chat(M, "Remove your mask! ")
return 0
- if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted))
+ if((head && (head.flags_cover & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted))
to_chat(M, "Remove his mask! ")
return 0
@@ -182,8 +182,8 @@
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("[M] has pushed [src]! ")
- M.attack_log += text("\[[time_stamp()]\] Pushed [src.name] ([src.ckey]) ")
- src.attack_log += text("\[[time_stamp()]\] Has been pushed by [M.name] ([M.ckey]) ")
+ M.create_attack_log("Pushed [src.name] ([src.ckey]) ")
+ src.create_attack_log("Has been pushed by [M.name] ([M.ckey]) ")
if(!iscarbon(M))
LAssailant = null
else
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 0e2e95bc778..04c8ffc9f57 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -8,7 +8,7 @@
var/total_burn = 0
var/total_brute = 0
- for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
+ for(var/obj/item/organ/external/O in bodyparts) //hardcoded to streamline things a bit
total_brute += O.brute_dam //calculates health based on organ brute and burn
total_burn += O.burn_dam
@@ -28,13 +28,15 @@
med_hud_set_status()
handle_hud_icons()
-/mob/living/carbon/human/adjustBrainLoss(var/amount)
+/mob/living/carbon/human/adjustBrainLoss(amount)
if(status_flags & GODMODE)
return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
+ if(species)
+ amount = amount * species.brain_mod
sponge.take_damage(amount, 1)
brainloss = sponge.damage
else
@@ -42,14 +44,16 @@
else
brainloss = 0
-/mob/living/carbon/human/setBrainLoss(var/amount)
+/mob/living/carbon/human/setBrainLoss(amount)
if(status_flags & GODMODE)
return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
- sponge.damage = min(max(amount, 0),(maxHealth*2))
+ if(species)
+ amount = amount * species.brain_mod
+ sponge.damage = min(max(amount, 0), (maxHealth*2))
brainloss = sponge.damage
else
brainloss = 200
@@ -73,38 +77,38 @@
//These procs fetch a cumulative total damage from all organs
/mob/living/carbon/human/getBruteLoss()
var/amount = 0
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
amount += O.brute_dam
return amount
/mob/living/carbon/human/getFireLoss()
var/amount = 0
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
amount += O.burn_dam
return amount
-/mob/living/carbon/human/adjustBruteLoss(var/amount)
- if(species && species.brute_mod)
- amount = amount*species.brute_mod
+/mob/living/carbon/human/adjustBruteLoss(amount, damage_source)
+ if(species)
+ amount = amount * species.brute_mod
if(amount > 0)
- take_overall_damage(amount, 0)
+ take_overall_damage(amount, 0, used_weapon = damage_source)
else
heal_overall_damage(-amount, 0)
-/mob/living/carbon/human/adjustFireLoss(var/amount)
- if(species && species.burn_mod)
- amount = amount*species.burn_mod
+/mob/living/carbon/human/adjustFireLoss(amount, damage_source)
+ if(species)
+ amount = amount * species.burn_mod
if(amount > 0)
- take_overall_damage(0, amount)
+ take_overall_damage(0, amount, used_weapon = damage_source)
else
heal_overall_damage(0, -amount)
-/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
- if(species && species.brute_mod)
- amount = amount*species.brute_mod
+/mob/living/carbon/human/proc/adjustBruteLossByPart(amount, organ_name, obj/damage_source = null)
+ if(species)
+ amount = amount * species.brute_mod
- if(organ_name in organs_by_name)
+ if(organ_name in bodyparts_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
@@ -114,11 +118,11 @@
O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
-/mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
- if(species && species.burn_mod)
- amount = amount*species.burn_mod
+/mob/living/carbon/human/proc/adjustFireLossByPart(amount, organ_name, obj/damage_source = null)
+ if(species)
+ amount = amount * species.burn_mod
- if(organ_name in organs_by_name)
+ if(organ_name in bodyparts_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
@@ -134,19 +138,17 @@
wearing_rig.notify_ai("Warning: user consciousness failure. Mobility control passed to integrated intelligence system. ")
..()
-/mob/living/carbon/human/adjustCloneLoss(var/amount)
+/mob/living/carbon/human/adjustCloneLoss(amount)
+ if(species)
+ amount = amount * species.clone_mod
..()
- if(species.flags & (NO_DNA))
- cloneloss = 0
- return
-
var/heal_prob = max(0, 80 - getCloneLoss())
var/mut_prob = min(80, getCloneLoss() + 10)
if(amount > 0) //cloneloss is being added
if(prob(mut_prob))
var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.status & ORGAN_ROBOT)
continue
if(!(O.status & ORGAN_MUTATED))
@@ -161,7 +163,7 @@
else //cloneloss is being subtracted
if(prob(heal_prob))
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.status & ORGAN_MUTATED)
O.unmutate()
to_chat(src, "Your [O.name] is shaped normally again. ")
@@ -169,53 +171,39 @@
if(getCloneLoss() < 1) //no cloneloss, fixes organs
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.status & ORGAN_MUTATED)
O.unmutate()
to_chat(src, "Your [O.name] is shaped normally again. ")
// Defined here solely to take species flags into account without having to recast at mob/living level.
-/mob/living/carbon/human/getOxyLoss()
- if(species.flags & NO_BREATHE)
- oxyloss = 0
- return ..()
+/mob/living/carbon/human/adjustOxyLoss(amount)
+ if(species)
+ amount = amount * species.oxy_mod
+ ..()
-/mob/living/carbon/human/adjustOxyLoss(var/amount)
- if(species.flags & NO_BREATHE)
- oxyloss = 0
- else
- ..()
+/mob/living/carbon/human/setOxyLoss(amount)
+ if(species)
+ amount = amount * species.oxy_mod
+ ..()
-/mob/living/carbon/human/setOxyLoss(var/amount)
- if(species.flags & NO_BREATHE)
- oxyloss = 0 //this literally overrides three procs, excessive much?
- else
- ..()
+/mob/living/carbon/human/adjustToxLoss(amount)
+ if(species)
+ amount = amount * species.tox_mod
+ ..()
-/mob/living/carbon/human/getToxLoss()
- if(species.flags & NO_POISON)
- toxloss = 0
- return ..()
-
-/mob/living/carbon/human/adjustToxLoss(var/amount)
- if(species.flags & NO_POISON)
- toxloss = 0
- else
- ..()
-
-/mob/living/carbon/human/setToxLoss(var/amount)
- if(species.flags & NO_POISON)
- toxloss = 0 //this *also* overrides three procs, definately excessive
- else
- ..()
+/mob/living/carbon/human/setToxLoss(amount)
+ if(species)
+ amount = amount * species.tox_mod
+ ..()
////////////////////////////////////////////
//Returns a list of damaged organs
-/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn, var/flags = AFFECT_ALL_ORGANS)
+/mob/living/carbon/human/proc/get_damaged_organs(brute, burn, flags = AFFECT_ALL_ORGANS)
var/list/obj/item/organ/external/parts = list()
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if((brute && O.brute_dam) || (burn && O.burn_dam))
if(!(flags & AFFECT_ROBOTIC_ORGAN) && O.status & ORGAN_ROBOT)
continue
@@ -227,7 +215,7 @@
//Returns a list of damageable organs
/mob/living/carbon/human/proc/get_damageable_organs()
var/list/obj/item/organ/external/parts = list()
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.brute_dam + O.burn_dam < O.max_damage)
parts += O
return parts
@@ -235,7 +223,7 @@
//Heals ONE external organ, organ gets randomly selected from damaged ones.
//It automatically updates damage overlays if necesary
//It automatically updates health status
-/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
+/mob/living/carbon/human/heal_organ_damage(brute, burn)
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
if(!parts.len)
return
@@ -247,7 +235,7 @@
//Damages ONE external organ, organ gets randomly selected from damagable ones.
//It automatically updates damage overlays if necesary
//It automatically updates health status
-/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
+/mob/living/carbon/human/take_organ_damage(brute, burn, sharp = 0, edge = 0)
var/list/obj/item/organ/external/parts = get_damageable_organs()
if(!parts.len)
return
@@ -259,7 +247,7 @@
//Heal MANY external organs, in random order
-/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn, var/internal=0, var/robotic=0)
+/mob/living/carbon/human/heal_overall_damage(brute, burn, internal=0, robotic=0)
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
var/update = 0
@@ -282,7 +270,7 @@
UpdateDamageIcon()
// damage MANY external organs, in random order
-/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
+/mob/living/carbon/human/take_overall_damage(brute, burn, sharp = 0, edge = 0, used_weapon = null)
if(status_flags & GODMODE)
return //godmode
var/list/obj/item/organ/external/parts = get_damageable_organs()
@@ -325,7 +313,7 @@ This function restores the subjects blood to max.
This function restores all organs.
*/
/mob/living/carbon/human/restore_all_organs()
- for(var/obj/item/organ/external/current_organ in organs)
+ for(var/obj/item/organ/external/current_organ in bodyparts)
current_organ.rejuvenate()
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
@@ -337,15 +325,15 @@ This function restores all organs.
return 0
-/mob/living/carbon/human/proc/get_organ(var/zone)
+/mob/living/carbon/human/proc/get_organ(zone)
if(!zone)
zone = "chest"
if(zone in list("eyes", "mouth"))
zone = "head"
- return organs_by_name[zone]
+ return bodyparts_by_name[zone]
-/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
+/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, edge = 0, obj/used_weapon = null)
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
@@ -373,7 +361,7 @@ This function restores all organs.
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
- if(species && species.brute_mod)
+ if(species)
damage = damage * species.brute_mod
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
@@ -398,7 +386,7 @@ This function restores all organs.
if(BURN)
damageoverlaytemp = 20
- if(species && species.burn_mod)
+ if(species)
damage = damage * species.burn_mod
if(organ.take_damage(0, damage, sharp, edge, used_weapon))
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index cbf6c579f95..585ac587ffc 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -38,6 +38,7 @@ emp_act
var/obj/item/organ/external/organ = get_organ(check_zone(def_zone))
if(isnull(organ))
+ . = bullet_act(P, "chest") //act on chest instead
return
//Shrapnel
@@ -57,6 +58,18 @@ emp_act
return (..(P , def_zone))
+/mob/living/carbon/human/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
+ var/obj/item/organ/external/affecting = get_organ(check_zone(def_zone))
+ if(affecting && !affecting.cannot_amputate && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
+ var/damtype = DROPLIMB_EDGE
+ switch(P.damage_type)
+ if(BRUTE)
+ damtype = DROPLIMB_BLUNT
+ if(BURN)
+ damtype = DROPLIMB_BURN
+
+ affecting.droplimb(FALSE, damtype)
+
/mob/living/carbon/human/getarmor(var/def_zone, var/type)
var/armorval = 0
var/organnum = 0
@@ -70,9 +83,10 @@ emp_act
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
- for(var/obj/item/organ/external/organ in organs)
+ for(var/obj/item/organ/external/organ in bodyparts)
armorval += getarmor_organ(organ, type)
organnum++
+
return (armorval/max(organnum, 1))
@@ -87,6 +101,7 @@ emp_act
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
protection += C.armor[type]
+
return protection
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
@@ -163,12 +178,12 @@ emp_act
if(!istype(affecting))
return
if(!(affecting.status & ORGAN_ROBOT))
- to_chat(user, "\red That limb isn't robotic.")
+ to_chat(user, "That limb isn't robotic. ")
return
if(affecting.sabotaged)
- to_chat(user, "\red [src]'s [affecting.name] is already sabotaged!")
+ to_chat(user, "[src]'s [affecting.name] is already sabotaged! ")
else
- to_chat(user, "\red You sneakily slide the card into the dataport on [src]'s [affecting.name] and short out the safeties.")
+ to_chat(user, "You sneakily slide the card into the dataport on [src]'s [affecting.name] and short out the safeties. ")
affecting.sabotaged = 1
return 1
@@ -185,10 +200,10 @@ emp_act
src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1))
src.loc.add_blood(src)
--src.meatleft
- to_chat(user, "\red You hack off a chunk of meat from [src.name]")
+ to_chat(user, "You hack off a chunk of meat from [src.name] ")
if(!src.meatleft)
- src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by [key_name(user)] "
- user.attack_log += "\[[time_stamp()]\] Chopped up [key_name(src)] into meat "
+ src.create_attack_log("Was chopped up into meat by [key_name(user)] ")
+ user.create_attack_log("Chopped up [key_name(src)] into meat ")
msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat")
if(!iscarbon(user))
LAssailant = null
@@ -213,9 +228,9 @@ emp_act
if(! I.discrete)
if(I.attack_verb.len)
- visible_message("[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]! ")
+ visible_message("[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]! ")
else
- visible_message("[src] has been attacked in the [hit_area] with [I.name] by [user]! ")
+ visible_message("[src] has been attacked in the [hit_area] with [I.name] by [user]! ")
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration)
var/weapon_sharp = is_sharp(I)
@@ -251,8 +266,8 @@ emp_act
if("head")//Harder to score a stun but if you do it lasts a bit longer
if(stat == CONSCIOUS && armor < 50)
if(prob(I.force))
- visible_message("[src] has been knocked down! ", \
- "[src] has been knocked down! ")
+ visible_message("[src] has been knocked down! ", \
+ "[src] has been knocked down! ")
apply_effect(5, WEAKEN, armor)
AdjustConfused(15)
if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE)
@@ -271,8 +286,8 @@ emp_act
if("upper body")//Easier to score a stun but lasts less time
if(stat == CONSCIOUS && I.force && prob(I.force + 10))
- visible_message("[src] has been knocked down! ", \
- "[src] has been knocked down! ")
+ visible_message("[src] has been knocked down! ", \
+ "[src] has been knocked down! ")
apply_effect(5, WEAKEN, armor)
if(bloody)
@@ -298,85 +313,37 @@ emp_act
return 1*/
//this proc handles being hit by a thrown atom
-/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5)
+/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
+ var/obj/item/I
+ var/throwpower = 30
if(istype(AM, /obj/item))
- var/obj/item/I = AM
-
- if(in_throw_mode && !get_active_hand() && speed <= 5) //empty active hand and we're in throw mode
- if(canmove && !restrained())
- if(isturf(I.loc))
- put_in_active_hand(I)
- visible_message("[src] catches [I]! ")
- throw_mode_off()
- return
-
- var/zone = ran_zone("chest", 65)
- var/dtype = BRUTE
- if(istype(I, /obj/item/weapon))
- var/obj/item/weapon/W = I
- dtype = W.damtype
- var/throw_damage = I.throwforce*(speed/5)
-
- I.throwing = 0 //it hit, so stop moving
-
- if((I.thrower != src) && check_shields(throw_damage, "\the [I.name]", I, THROWN_PROJECTILE_ATTACK))
- return
-
- var/obj/item/organ/external/affecting = get_organ(zone)
- if(!affecting)
- var/missverb = (I.gender == PLURAL) ? "whizz" : "whizzes"
- visible_message("\The [I] [missverb] past [src]'s missing [parse_zone(zone)]! ",
- "\The [I] [missverb] past your missing [parse_zone(zone)]! ")
- return
- var/hit_area = affecting.name
-
- src.visible_message("\red [src] has been hit in the [hit_area] by [I].")
- var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here
-
- apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I)
-
- if(ismob(I.thrower))
- var/mob/M = I.thrower
- if(M)
- add_logs(M, src, "hit", I, " (thrown)", print_attack_log = I.throwforce)
-
- //thrown weapon embedded object code.
- if(dtype == BRUTE && istype(I))
- if(!I.is_robot_module())
+ I = AM
+ throwpower = I.throwforce
+ if(I.thrownby == src) //No throwing stuff at yourself to trigger reactions
+ return ..()
+ if(check_shields(throwpower, "\the [AM.name]", AM, THROWN_PROJECTILE_ATTACK))
+ hitpush = 0
+ skipcatch = 1
+ blocked = 1
+ /*else if(I)
+ if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD)
+ if(!I.is_robot_module())
+ var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here
var/sharp = is_sharp(I)
- var/damage = throw_damage
+ var/damage = throwpower * (I.throw_speed / 5)
if(armor)
- damage /= armor+1
+ damage /= armor + 1
//blunt objects should really not be embedding in things unless a huge amount of force is involved
- var/embed_chance = sharp? damage/I.w_class : damage/(I.w_class*3)
- var/embed_threshold = sharp? 5*I.w_class : 15*I.w_class
+ var/embed_chance = sharp? damage / I.w_class : damage/(I.w_class * 3)
+ var/embed_threshold = sharp? 5 * I.w_class : 15 * I.w_class
//Sharp objects will always embed if they do enough damage.
//Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold
- if(((sharp && prob(damage/(10*I.w_class)*100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0))
- affecting.embed(I)
-
- // Begin BS12 momentum-transfer code.
- if(I.throw_source && speed >= 15)
- var/obj/item/weapon/W = I
- var/momentum = speed/2
- var/dir = get_dir(I.throw_source, src)
-
- visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
- src.throw_at(get_edge_target_turf(src,dir),1,momentum)
-
- if(!W || !src) return
-
- if(W.loc == src && W.sharp) //Projectile is embedded and suitable for pinning.
- var/turf/T = near_wall(dir,2)
-
- if(T)
- src.loc = T
- visible_message("[src] is pinned to the wall by [I]! ","You are pinned to the wall by [I]! ")
- src.anchored = 1
- src.pinned += I
+ if(((sharp && prob(damage / (10 * I.w_class) * 100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0))
+ affecting.embed(I)*/
+ return ..()
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
@@ -436,8 +403,8 @@ emp_act
visible_message("[src] has been hit by [M.name]. ", \
"[src] has been hit by [M.name]. ")
- attack_log += text("\[[time_stamp()]\] Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)]) ")
- M.occupant.attack_log += text("\[[time_stamp()]\] Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)]) ")
+ create_attack_log("Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)]) ")
+ M.occupant.create_attack_log("Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)]) ")
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
else
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 0d30c5c8265..15f9b6d112e 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -1,7 +1,7 @@
var/global/default_martial_art = new/datum/martial_art
/mob/living/carbon/human
- hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
+ hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
@@ -72,3 +72,4 @@ var/global/default_martial_art = new/datum/martial_art
var/fire_sprite = "Standing"
var/datum/body_accessory/body_accessory = null
+ var/tail // Name of tail image in species effects icon file.
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index cf66c1d2c15..87176a7a02a 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -1,67 +1,8 @@
/mob/living/carbon/human/movement_delay()
- var/tally = 0
-
- if(species.slowdown)
- tally = species.slowdown
-
- if(!has_gravity(src))
- return -1 // It's hard to be slowed down in space by... anything
-
- if(flying) return -1
-
- if(embedded_flag)
- handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
-
- if(slowed)
- tally += 10
-
- var/health_deficiency = (maxHealth - health + staminaloss)
- if(reagents)
- for(var/datum/reagent/R in reagents.reagent_list)
- if(R.shock_reduction)
- health_deficiency -= R.shock_reduction
- if(health_deficiency >= 40)
- tally += (health_deficiency / 25)
-
- var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
- if(hungry >= 70)
- tally += hungry/50
-
- if(wear_suit)
- tally += wear_suit.slowdown
-
- if(!buckled)
- if(shoes)
- tally += shoes.slowdown
-
- if(shock_stage >= 10) tally += 3
-
- if(back)
- tally += back.slowdown
-
- if(l_hand && (l_hand.flags & HANDSLOW))
- tally += l_hand.slowdown
- if(r_hand && (r_hand.flags & HANDSLOW))
- tally += r_hand.slowdown
-
- if(FAT in src.mutations)
- tally += 1.5
- if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
- tally += (BODYTEMP_COLD_DAMAGE_LIMIT - bodytemperature) / COLD_SLOWDOWN_FACTOR
-
- tally += 2*stance_damage //damaged/missing feet or legs is slow
-
- if(RUN in mutations)
- tally = -1
- if(status_flags & IGNORESLOWDOWN) // make sure this is always at the end so we don't have ignore slowdown getting ignored itself
- tally = -1
-
- if(status_flags & GOTTAGOFAST)
- tally -= 1
- if(status_flags & GOTTAGOREALLYFAST)
- tally -= 2
-
- return (tally + config.human_delay)
+ . = 0
+ . += ..()
+ . += config.human_delay
+ . += species.movement_delay(src)
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 2f07fdacd07..24ed336a4a3 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -4,8 +4,8 @@
eyes.update_colour()
update_body()
-/mob/living/carbon/human/var/list/organs = list()
-/mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs
+/mob/living/carbon/human/var/list/bodyparts = list()
+/mob/living/carbon/human/var/list/bodyparts_by_name = list() // map organ names to organs
// Takes care of organ related updates, such as broken and missing limbs
/mob/living/carbon/human/proc/handle_organs()
@@ -18,7 +18,7 @@
last_dam = damage_this_tick
if(force_process)
bad_external_organs.Cut()
- for(var/obj/item/organ/external/Ex in organs)
+ for(var/obj/item/organ/external/Ex in bodyparts)
bad_external_organs |= Ex
//processing internal organs is pretty cheap, do that first.
@@ -65,11 +65,12 @@
stance_damage = 0
// Buckled to a bed/chair. Stance damage is forced to 0 since they're sitting on something solid
- if(istype(buckled, /obj/structure/stool/bed))
+ // Not standing, so no need to care about stance
+ if(istype(buckled, /obj/structure/stool/bed) || !isturf(loc))
return
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
- var/obj/item/organ/external/E = organs_by_name[limb_tag]
+ var/obj/item/organ/external/E = bodyparts_by_name[limb_tag]
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)) || E.is_malfunctioning())
stance_damage += 2 // let it fail even if just foot&leg. Also malfunctioning happens sporadically so it should impact more when it procs
else if(E.is_broken() || !E.is_usable())
@@ -100,7 +101,7 @@
if(!l_hand && !r_hand)
return
- for(var/obj/item/organ/external/E in organs)
+ for(var/obj/item/organ/external/E in bodyparts)
if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED))
continue
@@ -175,7 +176,7 @@
/mob/living/carbon/human/proc/handle_trace_chems()
//New are added for reagents to random organs.
for(var/datum/reagent/A in reagents.reagent_list)
- var/obj/item/organ/internal/O = pick(organs)
+ var/obj/item/organ/internal/O = pick(bodyparts)
O.trace_chemicals[A.name] = 100
/*
@@ -186,7 +187,7 @@ old_ue: Set this to a UE string, and this proc will overwrite the dna of organs
*/
/mob/living/carbon/human/proc/sync_organ_dna(var/assimilate = 1, var/old_ue = null)
var/ue_to_compare = (old_ue) ? old_ue : dna.unique_enzymes
- var/list/all_bits = internal_organs|organs
+ var/list/all_bits = internal_organs|bodyparts
for(var/obj/item/organ/O in all_bits)
if(assimilate || O.dna.unique_enzymes == ue_to_compare)
O.set_dna(dna)
@@ -204,9 +205,8 @@ I use this to standardize shadowling dethrall code
/mob/living/carbon/human/has_organic_damage()
var/odmg = 0
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.status & ORGAN_ROBOT)
odmg += O.brute_dam
odmg += O.burn_dam
return (health < (100 - odmg))
-
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index 080736ddfd7..ad4d8226c4a 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -86,7 +86,7 @@
custom_emote(1, "[src]'s chest opens up, revealing a large mass of explosives and tangled wires!")
if(inactivity_period <= 0)
inactivity_period = 9999 // technically infinite
- if(do_after(src, 60, target=traitorTarget))
+ if(do_after(src, 60, target = traitorTarget))
custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming their body in a flaming explosion!")
explosion(src, 6, 6, 6)
else
@@ -119,15 +119,15 @@
internalBeaker.name = "Grow-U-All Super Spray"
if(internalBeaker && internalBag)
- var/obj/machinery/portable_atmospherics/hydroponics/HP
+ var/obj/machinery/hydroponics/HP
//consider the appropriate target
var/list/considered = list()
- for(var/obj/machinery/portable_atmospherics/hydroponics/tester in view(12,src))
+ for(var/obj/machinery/hydroponics/tester in view(12,src))
considered[tester] = 1
- if(!tester.seed)
+ if(!tester.myseed)
considered[tester] += 50
if(tester.weedlevel > 0)
considered[tester] += 5
@@ -154,7 +154,7 @@
else
if(HP.harvest || HP.dead)
HP.attack_hand(src)
- else if(!HP.seed)
+ else if(!HP.myseed)
var/obj/item/seeds/SEED = new /obj/item/seeds/random(src)
custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] towards [TARGET], producing a [SEED]!")
HP.attackby(SEED, src)
@@ -170,8 +170,8 @@
internalBeaker.reagents.add_reagent("diethylamine", 10)
if(HP.nutrilevel < HP.maxnutri)
change = 1
- if(!internalBeaker.reagents.has_reagent("eznutrient", 15))
- internalBeaker.reagents.add_reagent("eznutrient", 15)
+ if(!internalBeaker.reagents.has_reagent("eznutriment", 15))
+ internalBeaker.reagents.add_reagent("eznutriment", 15)
if(!internalBeaker.reagents.has_reagent("diethylamine", 15))
internalBeaker.reagents.add_reagent("diethylamine", 15)
if(HP.waterlevel < HP.maxwater)
@@ -261,7 +261,7 @@
var/pranksNearby = 100
for(var/turf/simulated/T in orange(1, C))
for(var/obj/item/A in T)
- if(istype(A,/obj/item/weapon/soap) || istype(A,/obj/item/weapon/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/weapon/bananapeel))
+ if(istype(A,/obj/item/weapon/soap) || istype(A,/obj/item/weapon/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/weapon/grown/bananapeel))
pranksNearby--
if(T.wet)
pranksNearby -= 10
@@ -287,7 +287,7 @@
if(istype(A,/obj/item/weapon/reagent_containers/food/snacks/grown/banana))
var/obj/item/weapon/reagent_containers/food/snacks/B = A
B.attack(src, src)
- if(istype(A,/obj/item/weapon/bananapeel))
+ if(istype(A,/obj/item/weapon/grown/bananapeel))
npcDrop(A)
hasPranked = 1
if(!hasPranked)
@@ -403,26 +403,6 @@
ingredients += I
I.forceMove(null)
- for(var/P in R.fruit)
- for(var/i = 1 to R.fruit[P])
- var/obj/item/I = locate(P) in allContents
- if(I)
- ingredients += I
- I.forceMove(null)
- continue
-
- I = locate(P) in rangeCheck
- TARGET = I
- if(I && !Adjacent(I))
- tryWalk(get_turf(I))
- sleep(get_dist(src, I))
- if(!I || !(I in rangeCheck))
- refundrecipe(ingredients)
- return 0
- custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], picking up [I].")
- ingredients += I
- I.forceMove(null)
-
// cheaply cook the ingredients into result
sleep(R.time)
for(var/obj/I in ingredients)
@@ -579,8 +559,8 @@
var/highest_count = 0
var/datum/recipe/winner = null
for(var/datum/recipe/R in available_recipes)
- if(R.check_items(ingredientZone) >= 0 && R.check_fruit(ingredientZone) >= 0)
- var/count = (R.items ? R.items.len : 0) + (R.fruit ? R.fruit.len : 0)
+ if(R.check_items(ingredientZone) >= 0)
+ var/count = (R.items ? R.items.len : 0)
if(count > highest_count)
highest_count = count
winner = R
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index 2dfc4f8d24e..9f27956b764 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -132,7 +132,6 @@
job = myjob.title
mind.assigned_role = job
myjob.equip(src)
- myjob.apply_fingerprints(T)
/mob/living/carbon/human/interactive/proc/reset()
walk(src, 0)
@@ -193,7 +192,6 @@
for(var/obj/item/W in T)
qdel(W)
T.myjob.equip(T)
- T.myjob.apply_fingerprints(T)
T.doSetup(alt_title)
var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No")
@@ -270,20 +268,20 @@
zone_sel.selecting = "chest"
//arms
if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4))
- var/obj/item/organ/external/R = organs_by_name["r_arm"]
+ var/obj/item/organ/external/R = bodyparts_by_name["r_arm"]
if(R)
R.robotize()
else
- var/obj/item/organ/external/L = organs_by_name["l_arm"]
+ var/obj/item/organ/external/L = bodyparts_by_name["l_arm"]
if(L)
L.robotize()
//legs
if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4))
- var/obj/item/organ/external/R = organs_by_name["r_leg"]
+ var/obj/item/organ/external/R = bodyparts_by_name["r_leg"]
if(R)
R.robotize()
else
- var/obj/item/organ/external/L = organs_by_name["l_leg"]
+ var/obj/item/organ/external/L = bodyparts_by_name["l_leg"]
if(L)
L.robotize()
UpdateDamageIcon()
@@ -349,10 +347,10 @@
favoured_types = list(/obj/item/weapon/mop, /obj/item/weapon/reagent_containers/glass/bucket, /obj/item/weapon/reagent_containers/spray/cleaner, /obj/effect/decal/cleanable)
functions += "dojanitor"
if("Clown")
- favoured_types = list(/obj/item/weapon/soap, /obj/item/weapon/reagent_containers/food/snacks/grown/banana, /obj/item/weapon/bananapeel)
+ favoured_types = list(/obj/item/weapon/soap, /obj/item/weapon/reagent_containers/food/snacks/grown/banana, /obj/item/weapon/grown/bananapeel)
functions += "clowning"
if("Botanist")
- favoured_types = list(/obj/machinery/portable_atmospherics/hydroponics, /obj/item/weapon/reagent_containers, /obj/item/weapon)
+ favoured_types = list(/obj/machinery/hydroponics, /obj/item/weapon/reagent_containers, /obj/item/weapon)
functions += "botany"
restrictedJob = 1
else
@@ -451,7 +449,7 @@
..()
retalTarget(user)
-/mob/living/carbon/human/interactive/hitby(atom/movable/AM)
+/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
..()
var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src)
if(C)
@@ -633,8 +631,6 @@
AL.wires.UpdatePulsed(AIRLOCK_WIRE_DOOR_BOLTS)
if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_MAIN_POWER1))
AL.wires.CutWireIndex(AIRLOCK_WIRE_MAIN_POWER1)
- if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_MAIN_POWER2))
- AL.wires.CutWireIndex(AIRLOCK_WIRE_MAIN_POWER2)
if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_SAFETY))
AL.wires.CutWireIndex(AIRLOCK_WIRE_SAFETY)
if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY))
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 4e90d763e9e..8e1c32f931a 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -23,7 +23,7 @@
/mob/living/carbon/human/proc/has_organ(name)
- var/obj/item/organ/external/O = organs_by_name[name]
+ var/obj/item/organ/external/O = bodyparts_by_name[name]
return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump())
@@ -119,6 +119,7 @@
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view)
update_sight()
update_inv_glasses()
+ update_client_colour()
else if(I == head)
head = null
if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
@@ -271,6 +272,7 @@
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view)
update_sight()
update_inv_glasses(redraw_mob)
+ update_client_colour()
if(slot_gloves)
gloves = W
update_inv_gloves(redraw_mob)
@@ -544,7 +546,7 @@
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return
- if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET))
+ if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return 1
if(slot_r_store)
if(I.flags & NODROP)
@@ -557,7 +559,7 @@
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return 0
- if(I.w_class <= 2 || (I.slot_flags & SLOT_POCKET))
+ if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return 1
return 0
if(slot_s_store)
@@ -573,7 +575,7 @@
if(!disable_warning)
to_chat(src, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
return 0
- if(I.w_class > 4)
+ if(I.w_class > WEIGHT_CLASS_BULKY)
if(!disable_warning)
to_chat(src, "The [name] is too big to attach.")
return 0
@@ -613,3 +615,17 @@
return 1
return 0 //Unsupported slot
+
+/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
+ var/datum/outfit/O = null
+
+ if(ispath(outfit))
+ O = new outfit
+ else
+ O = outfit
+ if(!istype(O))
+ return 0
+ if(!O)
+ return 0
+
+ return O.equip(src, visualsOnly)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 0be4298dadc..00dbc50e8d0 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -171,7 +171,7 @@
if(gene.is_active(src))
speech_problem_flag = 1
gene.OnMobLife(src)
- if(gene_stability < GENETIC_DAMAGE_STAGE_1)
+ if(!ignore_gene_stability && gene_stability < GENETIC_DAMAGE_STAGE_1)
var/instability = DEFAULT_GENE_STABILITY - gene_stability
if(prob(instability * 0.1))
adjustFireLoss(min(5, instability * 0.67))
@@ -255,8 +255,8 @@
emote("gasp")
updatehealth()
- if(damage && organs.len)
- var/obj/item/organ/external/O = pick(organs)
+ if(damage && bodyparts.len)
+ var/obj/item/organ/external/O = pick(bodyparts)
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
/mob/living/carbon/human/breathe()
@@ -675,14 +675,14 @@
// nutrition decrease
if(nutrition > 0 && stat != DEAD)
// THEY HUNGER
- var/hunger_rate = HUNGER_FACTOR
+ var/hunger_rate = hunger_drain
if(satiety > 0)
satiety--
if(satiety < 0)
satiety++
if(prob(round(-satiety/40)))
Jitter(5)
- hunger_rate = 3 * HUNGER_FACTOR
+ hunger_rate = 3 * hunger_drain
nutrition = max(0, nutrition - hunger_rate)
if(nutrition > NUTRITION_LEVEL_FULL)
@@ -958,13 +958,6 @@
adjustToxLoss(-3)
lastpuke = 0
- //0.1% chance of playing a scary sound to someone who's in complete darkness
- if(isturf(loc) && rand(1,1000) == 1)
- var/turf/currentTurf = loc
- var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in currentTurf
- if(L && L.lum_r + L.lum_g + L.lum_b == 0)
- playsound_local(src,pick(scarySounds),50, 1, -1)
-
/mob/living/carbon/human/handle_changeling()
if(mind)
if(mind.changeling)
@@ -1039,7 +1032,7 @@
if(stat == DEAD)
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
- if(heart_attack)
+ if(undergoing_cardiac_arrest())
return PULSE_NONE
var/temp = PULSE_NORM
@@ -1102,7 +1095,7 @@
if(istype(loc,/obj/item/bodybag))
return
var/obj/item/clothing/mask/M = H.wear_mask
- if(M && (M.flags & MASKCOVERSMOUTH))
+ if(M && (M.flags_cover & MASKCOVERSMOUTH))
return
if(H.species && H.species.flags & NO_BREATHE)
return //no puking if you can't smell!
@@ -1182,13 +1175,37 @@
return stuttering
+
+/mob/living/carbon/human/proc/can_heartattack()
+ if(species.flags & (NO_BLOOD|NO_INTORGANS))
+ return FALSE
+ return TRUE
+
+/mob/living/carbon/human/proc/undergoing_cardiac_arrest()
+ if(!can_heartattack())
+ return FALSE
+ var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
+ if(istype(heart) && heart.beating)
+ return FALSE
+ return TRUE
+
+/mob/living/carbon/human/proc/set_heartattack(status)
+ if(!can_heartattack())
+ return FALSE
+
+ var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
+ if(!istype(heart))
+ return FALSE
+
+ heart.beating = !status
+
/mob/living/carbon/human/proc/handle_heartattack()
- if(!heart_attack)
+ if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone"))
return
- else
- AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
- adjustOxyLoss(5)
- adjustBruteLoss(1)
+ AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
+ adjustOxyLoss(5)
+ Paralyse(4)
+ adjustBruteLoss(2)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 26ca4af83e8..63982b86948 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,10 +1,10 @@
-/mob/living/carbon/human/say(var/message)
+/mob/living/carbon/human/say(var/message, var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE)
var/alt_name = ""
if(name != GetVoice())
alt_name = " (as [get_id_name("Unknown")])"
- ..(message, alt_name = alt_name) //ohgod we should really be passing a datum here.
+ ..(message, alt_name = alt_name, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here.
/mob/living/carbon/human/proc/forcesay(list/append)
if(stat == CONSCIOUS)
@@ -105,6 +105,9 @@
/mob/living/carbon/human/handle_speech_problems(var/message, var/verb)
var/list/returns[3]
var/speech_problem_flag = 0
+ var/span = ""
+ if(mind)
+ span = mind.speech_span
if(silent || (disabilities & MUTE))
message = ""
@@ -143,8 +146,10 @@
verb = "yells loudly"
if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs))
- message = "[message] "
+ span = "sans"
+ if(span)
+ message = "[message] "
returns[1] = message
returns[2] = verb
returns[3] = speech_problem_flag
@@ -225,4 +230,4 @@
if(istype(r_ear, /obj/item/device/radio/headset))
R = r_ear
if(R.translate_binary)
- . = TRUE
\ No newline at end of file
+ . = TRUE
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index bb1f3dd2067..8e9c61992aa 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -7,20 +7,34 @@
language = "Abductor Mindlink"
default_language = "Abductor Mindlink"
unarmed_type = /datum/unarmed_attack/punch
- darksight = 3
eyes = "blank_eyes"
+ has_organ = list(
+ "heart" = /obj/item/organ/internal/heart,
+ "lungs" = /obj/item/organ/internal/lungs,
+ "liver" = /obj/item/organ/internal/liver,
+ "kidneys" = /obj/item/organ/internal/kidneys,
+ "brain" = /obj/item/organ/internal/brain,
+ "appendix" = /obj/item/organ/internal/appendix,
+ "eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
+ )
+
+ flags = HAS_LIPS | NO_BLOOD | NO_BREATHE | NOGUNS
+
+ oxy_mod = 0
- flags = HAS_LIPS | NO_BLOOD | NO_BREATHE
virus_immune = 1
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
blood_color = "#FF5AFF"
+ female_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
+ female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
+ female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys
-/datum/species/abductor/can_understand(var/mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
+/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
return 1
-/datum/species/abductor/handle_post_spawn(var/mob/living/carbon/human/H)
+/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
H.gender = NEUTER
if(H.mind)
H.mind.abductor = new /datum/abductor
diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm
index 5642eedbcbe..4fcedc1844a 100644
--- a/code/modules/mob/living/carbon/human/species/apollo.dm
+++ b/code/modules/mob/living/carbon/human/species/apollo.dm
@@ -9,7 +9,6 @@
punchdamagelow = 0
punchdamagehigh = 1
//primitive = /mob/living/carbon/monkey/wryn
- darksight = 3
slowdown = 1
warning_low_pressure = -300
hazard_low_pressure = 1
@@ -32,15 +31,17 @@
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"brain" = /obj/item/organ/internal/brain,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes/wryn, //3 darksight.
"appendix" = /obj/item/organ/internal/appendix,
"antennae" = /obj/item/organ/internal/wryn/hivenode
)
- flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
+ flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | HIVEMIND
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
+ oxy_mod = 0
+
reagent_tag = PROCESS_ORG
base_color = "#704300"
flesh_color = "#704300"
@@ -65,21 +66,21 @@
M.visible_message("[M] begins to violently pull off [H]'s antennae. ")
to_chat(H, "[M] grips your antennae and starts violently pulling! ")
- do_after(H, 250, target = src)
- if(p_loc == M.loc && p_loc_m == H.loc)
- var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode
- H.remove_language("Wryn Hivemind")
- node.remove(H)
- node.loc = M.loc
- to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae. ")
- to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M]. ")
- to_chat(H, "It's so quiet... ")
- head_organ.h_style = "Bald"
- H.update_hair()
+ if(do_after(H, 250, target = src))
+ if(p_loc == M.loc && p_loc_m == H.loc)
+ var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode
+ H.remove_language("Wryn Hivemind")
+ node.remove(H)
+ node.loc = M.loc
+ to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae. ")
+ to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M]. ")
+ to_chat(H, "It's so quiet... ")
+ head_organ.h_style = "Bald"
+ H.update_hair()
- M.attack_log += text("\[[time_stamp()]\] removed antennae [H.name] ([H.ckey]) ")
- H.attack_log += text("\[[time_stamp()]\] Has had their antennae removed by [M.name] ([M.ckey]) ")
- msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae")
+ M.create_attack_log("removed antennae [H.name] ([H.ckey]) ")
+ H.create_attack_log("Has had their antennae removed by [M.name] ([M.ckey]) ")
+ msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae")
return 0
/datum/species/nucleation
@@ -87,7 +88,7 @@
name_plural = "Nucleations"
icobase = 'icons/mob/human_races/r_nucleation.dmi'
unarmed_type = /datum/unarmed_attack/punch
- blurb = "A sub-race of unforunates who have been exposed to too much supermatter radiation. As a result, \
+ blurb = "A sub-race of unfortunates who have been exposed to too much supermatter radiation. As a result, \
supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \
has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \
negating the need for the individual to breathe. Their massive change in biology, however, renders most medicines \
@@ -97,6 +98,7 @@
language = "Sol Common"
burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
brute_mod = 2 // damn, double wham, double dam
+ oxy_mod = 0
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
@@ -106,8 +108,8 @@
reagent_tag = PROCESS_ORG
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
- "crystalized brain" = /obj/item/organ/internal/brain/crystal,
- "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal,
+ "crystallized brain" = /obj/item/organ/internal/brain/crystal,
+ "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal, //Standard darksight of 2.
"strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal,
"resonant crystal" = /obj/item/organ/internal/nucleation/resonant_crystal
)
@@ -120,7 +122,7 @@
/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H)
var/turf/T = get_turf(H)
- H.visible_message("\red[H]'s body explodes, leaving behind a pile of microscopic crystals!")
+ H.visible_message("[H]'s body explodes, leaving behind a pile of microscopic crystals! ")
explosion(T, 0, 0, 2, 2) // Create a small explosion burst upon death
// new /obj/item/weapon/shard/supermatter( T )
qdel(H)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 1e255ea50cc..a2f2eb30467 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -7,6 +7,9 @@
default_language = "Galactic Common"
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE | NOGUNS
+
+ oxy_mod = 0
+
virus_immune = 1
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
reagent_tag = PROCESS_ORG
@@ -37,7 +40,8 @@
has_organ = list(
"brain" = /obj/item/organ/internal/brain/golem
- )
+ ) //Has standard darksight of 2.
+
suicide_messages = list(
"is crumbling into dust!",
"is smashing their body apart!")
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index dffc73d4e1d..6e29d658cfe 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -26,6 +26,7 @@
tail = "chimptail"
bodyflags = FEET_PADDED | HAS_TAIL
reagent_tag = PROCESS_ORG
+ //Has standard darksight of 2.
//unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
//inherent_verbs = list(/mob/living/proc/ventcrawl)
@@ -54,7 +55,7 @@
/datum/species/monkey/handle_dna(var/mob/living/carbon/human/H)
H.dna.SetSEState(MONKEYBLOCK,1)
- genemutcheck(H, MONKEYBLOCK)
+ genemutcheck(H,MONKEYBLOCK,null,MUTCHK_FORCED)
/datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
switch(slot)
@@ -105,6 +106,15 @@
base_color = "#000000"
tail = "farwatail"
reagent_tag = PROCESS_ORG
+ has_organ = list(
+ "heart" = /obj/item/organ/internal/heart,
+ "lungs" = /obj/item/organ/internal/lungs,
+ "liver" = /obj/item/organ/internal/liver/tajaran,
+ "kidneys" = /obj/item/organ/internal/kidneys,
+ "brain" = /obj/item/organ/internal/brain,
+ "appendix" = /obj/item/organ/internal/appendix,
+ "eyes" = /obj/item/organ/internal/eyes/tajaran/farwa //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
+ )
/datum/species/monkey/vulpkanin
@@ -120,6 +130,15 @@
base_color = "#000000"
tail = "wolpintail"
reagent_tag = PROCESS_ORG
+ has_organ = list(
+ "heart" = /obj/item/organ/internal/heart,
+ "lungs" = /obj/item/organ/internal/lungs,
+ "liver" = /obj/item/organ/internal/liver/vulpkanin,
+ "kidneys" = /obj/item/organ/internal/kidneys,
+ "brain" = /obj/item/organ/internal/brain,
+ "appendix" = /obj/item/organ/internal/appendix,
+ "eyes" = /obj/item/organ/internal/eyes/vulpkanin/wolpin //Vulpkanin monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
+ )
/datum/species/monkey/skrell
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 1a79374407c..2041ca5f3e6 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -15,11 +15,14 @@
butt_sprite = "plasma"
breath_type = "plasma"
+ poison_type = null //Certainly isn't plasma.
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
heat_level_3 = 500 // Heat damage level 3 above this point.
+ //Has default darksight of 2.
+
suicide_messages = list(
"is twisting their own neck!",
"is letting some O2 in!",
@@ -31,20 +34,21 @@
message = replacetext(message, "s", stutter("ss"))
return message
-/datum/species/plasmaman/equip(var/mob/living/carbon/human/H)
+/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H)
+ var/assigned_role = H.mind && H.mind.assigned_role ? H.mind.assigned_role : "Civilian"
// Unequip existing suits and hats.
H.unEquip(H.wear_suit)
H.unEquip(H.head)
- if(H.mind.assigned_role != "Clown")
+ if(assigned_role != "Clown")
H.unEquip(H.wear_mask)
H.equip_or_collect(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
- var/suit=/obj/item/clothing/suit/space/eva/plasmaman
- var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman
+ var/suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
+ var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
var/tank_slot = slot_s_store
var/tank_slot_name = "suit storage"
- switch(H.mind.assigned_role)
+ switch(assigned_role)
if("Scientist","Geneticist","Roboticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
@@ -52,8 +56,8 @@
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
if("Station Engineer", "Mechanic")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
if("Chief Engineer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
@@ -61,12 +65,15 @@
suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
if("Detective")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/security
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
if("Warden","Security Officer","Security Pod Pilot")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/security
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack)
+ if("Internal Affairs Agent")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
if("Magistrate")
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
@@ -77,9 +84,12 @@
if("Captain", "Blueshield")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
- if("Head of Personnel", "Nanotrasen Representative")
+ if("Head of Personnel")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
+ if("Nanotrasen Representative")
+ suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
+ helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
if("Medical Doctor","Brig Physician")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
@@ -122,8 +132,10 @@
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
H.equip_or_collect(new suit(H), slot_wear_suit)
H.equip_or_collect(new helm(H), slot_head)
- H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
- to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable. ")
+ H.equip_or_collect(new /obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
+ H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack)
+ H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
+ to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable. ")
H.internal = H.get_item_by_slot(tank_slot)
H.update_internals_hud_icon(1)
@@ -201,10 +213,10 @@
return 1 //godmode
if(breath.temperature < cold_level_1)
if(prob(20))
- to_chat(src, "\red You feel your face freezing and an icicle forming in your lungs!")
+ to_chat(src, "You feel your face freezing and an icicle forming in your lungs! ")
else if(breath.temperature > heat_level_1)
if(prob(20))
- to_chat(src, "\red You feel your face burning and a searing heat in your lungs!")
+ to_chat(src, "You feel your face burning and a searing heat in your lungs! ")
switch(breath.temperature)
if(-INFINITY to cold_level_3)
@@ -230,10 +242,29 @@
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
-
- if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- to_chat(H, "Your body reacts with the atmosphere and bursts into flame! ")
- H.adjust_fire_stacks(0.5)
- H.IgniteMob()
-
return 1
+
+/datum/species/plasmaman/handle_life(var/mob/living/carbon/human/H)
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
+ var/datum/gas_mixture/environment = H.loc.return_air()
+ if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
+ H.adjust_fire_stacks(0.5)
+ if(!H.on_fire && H.fire_stacks > 0)
+ H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames! ","Your body reacts with the atmosphere and bursts into flame! ")
+ H.IgniteMob()
+ else
+ if(H.on_fire && H.fire_stacks > 0)
+ var/obj/item/clothing/suit/space/eva/plasmaman/P = H.wear_suit
+ if(istype(P))
+ P.Extinguish(H)
+ H.update_fire()
+
+/datum/species/plasmaman/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
+ if(R.id == "plasma")
+ H.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ H.adjustPlasma(20)
+ H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
+ return 0 //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen.
+
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index fa7dadfebcb..6f594768d4e 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -7,16 +7,22 @@
default_language = "Galactic Common"
unarmed_type = /datum/unarmed_attack/claws
- darksight = 8
+
+ ignored_by = list(/mob/living/simple_animal/hostile/faithless)
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
has_organ = list(
- "brain" = /obj/item/organ/internal/brain
+ "brain" = /obj/item/organ/internal/brain,
+ "eyes" = /obj/item/organ/internal/eyes/shadow //8 darksight.
)
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE
+
+ oxy_mod = 0
+
virus_immune = 1
+
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
reagent_tag = PROCESS_ORG
suicide_messages = list(
@@ -25,13 +31,45 @@
"is twisting their own neck!",
"is staring into the closest light source!")
+ var/grant_vision_toggle = 1
+ var/datum/action/innate/shadow/darkvision/vision_toggle
+
+/datum/action/innate/shadow/darkvision //Darkvision toggle so shadowpeople can actually see where darkness is
+ name = "Toggle Darkvision"
+ check_flags = AB_CHECK_CONSCIOUS
+ background_icon_state = "bg_default"
+ button_icon_state = "blind"
+
+/datum/action/innate/shadow/darkvision/Activate()
+ var/mob/living/carbon/human/H = owner
+ if(!H.vision_type)
+ H.vision_type = new /datum/vision_override/nightvision
+ to_chat(H, "You adjust your vision to pierce the darkness. ")
+ else
+ H.vision_type = null
+ to_chat(H, "You adjust your vision to recognize the shadows. ")
+
+/datum/species/shadow/grant_abilities(var/mob/living/carbon/human/H)
+ . = ..()
+ if(grant_vision_toggle)
+ vision_toggle = new
+ vision_toggle.Grant(H)
+
+/datum/species/shadow/remove_abilities(var/mob/living/carbon/human/H)
+ . = ..()
+ if(grant_vision_toggle && vision_toggle)
+ H.vision_type = null
+ vision_toggle.Remove(H)
+
/datum/species/shadow/handle_life(var/mob/living/carbon/human/H)
var/light_amount = 0
if(isturf(H.loc))
var/turf/T = H.loc
- light_amount = T.get_lumcount()*10
+ light_amount = T.get_lumcount() * 10
if(light_amount > 2) //if there's enough light, start dying
H.take_overall_damage(1,1)
+ H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
else if(light_amount < 2) //heal in the dark
- H.heal_overall_damage(1,1)
\ No newline at end of file
+ H.heal_overall_damage(1,1)
+ H.clear_alert("lightexposure")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index 7a4f1bae4eb..62676144ebd 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -14,6 +14,9 @@
flesh_color = "#E6E6C6"
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE
+
+ oxy_mod = 0
+
virus_immune = 1 //why is this a var and not a flag?
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
@@ -38,14 +41,14 @@
"is twisting their skull off!")
has_organ = list(
"brain" = /obj/item/organ/internal/brain/golem,
- )
+ ) //Has default darksight of 2.
/datum/species/skeleton/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
// Crazylemon is still silly
if(R.id == "milk")
H.heal_overall_damage(4,4)
if(prob(5)) // 5% chance per proc to find a random limb, and mend it
- var/list/our_organs = H.organs.Copy()
+ var/list/our_organs = H.bodyparts.Copy()
shuffle(our_organs)
for(var/obj/item/organ/external/L in our_organs)
if(istype(L))
@@ -58,4 +61,4 @@
H.say(pick("Thanks Mr Skeltal", "Thank for strong bones", "Doot doot!"))
return 1
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index e4b513cdc4a..c1d1a169c1d 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -43,11 +43,13 @@
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/reagent_tag //Used for metabolizing reagents.
+ var/hunger_drain = HUNGER_FACTOR
+ var/digestion_ratio = 1 //How quickly the species digests/absorbs reagents.
var/siemens_coeff = 1 //base electrocution coefficient
var/invis_sight = SEE_INVISIBLE_LIVING
- var/darksight = 2
+
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
@@ -66,8 +68,13 @@
"sa_sleep" = 5
)
- var/brute_mod = null // Physical damage reduction/malus.
- var/burn_mod = null // Burn damage reduction/malus.
+ var/brute_mod = 1 // Physical damage reduction/amplification
+ var/burn_mod = 1 // Burn damage reduction/amplification
+ var/tox_mod = 1 // Toxin damage reduction/amplification
+ var/oxy_mod = 1 // Oxy damage reduction/amplification
+ var/clone_mod = 1 // Clone damage reduction/amplification
+ var/brain_mod = 1 // Brain damage damage reduction/amplification
+ var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
var/total_health = 100
var/punchdamagelow = 0 //lowest possible punch damage
@@ -78,6 +85,8 @@
var/ventcrawler = 0 //Determines if the mob can go through the vents.
var/has_fine_manipulation = 1 // Can use small items.
+ var/mob/living/list/ignored_by = list() // list of mobs that will ignore this species
+
var/list/allowed_consumed_mobs = list() //If a species can consume mobs, put the type of mobs it can consume here.
var/flags = 0 // Various specific features.
@@ -101,6 +110,7 @@
var/show_ssd = 1
var/virus_immune
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
+ var/has_gender = TRUE
//Death vars.
var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
@@ -119,6 +129,10 @@
var/scream_verb = "screams"
var/male_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
+ var/male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
+ var/female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
+ var/male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
+ var/female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg'
//Default hair/headacc style vars.
var/default_hair //Default hair style for newly created humans unless otherwise set.
@@ -155,7 +169,6 @@
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
)
- var/cyborg_type = "Cyborg"
var/list/proc/species_abilities = list()
/datum/species/New()
@@ -171,20 +184,12 @@
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
- for(var/obj/item/organ/internal/iorgan in H.internal_organs)
- if(iorgan in H.internal_organs)
- qdel(iorgan)
+ QDEL_LIST(H.internal_organs)
+ QDEL_LIST(H.bodyparts)
- for(var/obj/item/organ/organ in H.contents)
- if(organ in H.organs)
- qdel(organ)
-
- if(H.organs) H.organs.Cut()
- if(H.organs_by_name) H.organs_by_name.Cut()
-
- H.organs = list()
- H.internal_organs = list()
- H.organs_by_name = list()
+ LAZYREINITLIST(H.bodyparts)
+ LAZYREINITLIST(H.bodyparts_by_name)
+ LAZYREINITLIST(H.internal_organs)
for(var/limb_type in has_limbs)
var/list/organ_data = has_limbs[limb_type]
@@ -197,10 +202,10 @@
// organ new code calls `insert` on its own
new organ(H)
- for(var/name in H.organs_by_name)
- H.organs |= H.organs_by_name[name]
+ for(var/name in H.bodyparts_by_name)
+ H.bodyparts |= H.bodyparts_by_name[name]
- for(var/obj/item/organ/external/O in H.organs)
+ for(var/obj/item/organ/external/O in H.bodyparts)
O.owner = H
/datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
@@ -375,6 +380,72 @@
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
+////////////////
+// MOVE SPEED //
+////////////////
+
+/datum/species/proc/movement_delay(mob/living/carbon/human/H)
+ . = 0 //We start at 0.
+ var/flight = 0 //Check for flight and flying items
+ var/ignoreslow = 0
+ var/gravity = 0
+
+ if(H.flying)
+ flight = 1
+
+ if((H.status_flags & IGNORESLOWDOWN) || (RUN in H.mutations))
+ ignoreslow = 1
+
+ if(has_gravity(H))
+ gravity = 1
+
+ if(H.embedded_flag)
+ H.handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
+
+ if(!ignoreslow && gravity)
+ if(slowdown)
+ . = slowdown
+
+ if(H.wear_suit)
+ . += H.wear_suit.slowdown
+ if(!H.buckled)
+ if(H.shoes)
+ . += H.shoes.slowdown
+ if(H.back)
+ . += H.back.slowdown
+ if(H.l_hand && (H.l_hand.flags & HANDSLOW))
+ . += H.l_hand.slowdown
+ if(H.r_hand && (H.r_hand.flags & HANDSLOW))
+ . += H.r_hand.slowdown
+
+ var/health_deficiency = (H.maxHealth - H.health + H.staminaloss)
+ var/hungry = (500 - H.nutrition)/5 // So overeat would be 100 and default level would be 80
+ if(H.reagents)
+ for(var/datum/reagent/R in H.reagents.reagent_list)
+ if(R.shock_reduction)
+ health_deficiency -= R.shock_reduction
+ if(health_deficiency >= 40)
+ if(flight)
+ . += (health_deficiency / 75)
+ else
+ . += (health_deficiency / 25)
+ if(H.shock_stage >= 10)
+ . += 3
+ . += 2 * H.stance_damage //damaged/missing feet or legs is slow
+
+ if((hungry >= 70) && !flight)
+ . += hungry/50
+ if(FAT in H.mutations)
+ . += (1.5 - flight)
+ if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
+ . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
+
+ if(H.status_flags & GOTTAGOFAST)
+ . -= 1
+ if(H.status_flags & GOTTAGOREALLYFAST)
+ . -= 2
+ return .
+
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
grant_abilities(C)
return
@@ -427,7 +498,10 @@
/datum/species/proc/say_filter(mob/M, message, datum/language/speaking)
return message
-/datum/species/proc/equip(var/mob/living/carbon/human/H)
+/datum/species/proc/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
+ return
+
+/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
return
/datum/species/proc/can_understand(var/mob/other)
@@ -512,9 +586,9 @@
H.healths.icon_state = "health7"
else
switch(H.hal_screwyhud)
- if(1) H.healths.icon_state = "health6"
- if(2) H.healths.icon_state = "health7"
- if(5) H.healths.icon_state = "health0"
+ if(SCREWYHUD_CRIT) H.healths.icon_state = "health6"
+ if(SCREWYHUD_DEAD) H.healths.icon_state = "health7"
+ if(SCREWYHUD_HEALTHY) H.healths.icon_state = "health0"
else
switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss)
if(100 to INFINITY) H.healths.icon_state = "health0"
@@ -535,7 +609,7 @@
var/list/cached_overlays = H.healthdoll.cached_healthdoll_overlays
// Use the dead health doll as the base, since we have proper "healthy" overlays now
H.healthdoll.icon_state = "healthdoll_DEAD"
- for(var/obj/item/organ/external/O in H.organs)
+ for(var/obj/item/organ/external/O in H.bodyparts)
var/damage = O.burn_dam + O.brute_dam
var/comparison = (O.max_damage/5)
var/icon_num = 0
@@ -579,12 +653,23 @@ It'll return null if the organ doesn't correspond, so include null checks when u
return null
return has_organ[organ_slot]
+/datum/species/proc/get_resultant_darksight(mob/living/carbon/human/H) //Returns default value of 2 if the mob doesn't have eyes, otherwise it grabs the eyes darksight.
+ var/resultant_darksight = 2
+ var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
+ if(eyes)
+ resultant_darksight = eyes.get_dark_view()
+ return resultant_darksight
/datum/species/proc/update_sight(mob/living/carbon/human/H)
H.sight = initial(H.sight)
- H.see_in_dark = darksight
+ H.see_in_dark = get_resultant_darksight(H)
H.see_invisible = invis_sight
+ if(H.see_in_dark > 2) //Preliminary see_invisible handling as per set_species() in code\modules\mob\living\carbon\human\human.dm.
+ H.see_invisible = SEE_INVISIBLE_LEVEL_ONE
+ else
+ H.see_invisible = SEE_INVISIBLE_LIVING
+
if(H.client.eye != H)
var/atom/A = H.client.eye
if(A.update_remote_sight(H)) //returns 1 if we override all other sight updates.
@@ -635,7 +720,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses)
var/obj/item/clothing/glasses/G = rig.visor.vision.glasses
if(istype(G))
- H.see_in_dark = (G.darkness_view ? G.darkness_view : darksight) // Otherwise we keep our darkness view with togglable nightvision.
+ H.see_in_dark = (G.darkness_view ? G.darkness_view : get_resultant_darksight(H)) // Otherwise we keep our darkness view with togglable nightvision.
if(G.vision_flags) // MESONS
H.sight |= G.vision_flags
@@ -645,7 +730,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
H.see_in_dark = max(lesser_darkview_bonus, H.see_in_dark)
if(H.vision_type)
- H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark, darksight)
+ H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark, get_resultant_darksight(H))
H.see_invisible = H.vision_type.see_invisible
if(H.vision_type.light_sensitive)
H.weakeyes = 1
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 32e246254b6..4348b8b048b 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -18,6 +18,7 @@
worlds tumultous at best."
reagent_tag = PROCESS_ORG
+ //Has standard darksight of 2.
/datum/species/unathi
name = "Unathi"
@@ -30,7 +31,6 @@
tail = "sogtail"
unarmed_type = /datum/unarmed_attack/claws
primitive_form = "Stok"
- darksight = 3
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
Uuosa-Eso system, which roughly translates to 'burning mother'. Coming from a harsh, radioactive \
@@ -56,7 +56,8 @@
reagent_tag = PROCESS_ORG
base_color = "#066000"
//Default styles for created mobs.
- default_hair = "Unathi Horns"
+ default_headacc = "Simple"
+ default_headacc_colour = "#404040"
butt_sprite = "unathi"
has_organ = list(
@@ -66,7 +67,7 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes/unathi //3 darksight.
)
allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
@@ -91,7 +92,6 @@
language = "Siik'tajr"
tail = "tajtail"
unarmed_type = /datum/unarmed_attack/claws
- darksight = 8
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \
@@ -126,7 +126,8 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
+ unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
)
allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot,
@@ -152,7 +153,6 @@
primitive_form = "Wolpin"
tail = "vulptail"
unarmed_type = /datum/unarmed_attack/claws
- darksight = 8
blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
@@ -176,7 +176,8 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
+ unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
)
allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
@@ -214,6 +215,9 @@
dietflags = DIET_HERB
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
+ base_color = "#38b661" //RGB: 56, 182, 97.
+ default_hair_colour = "#38b661"
+ eyes = "skrell_eyes_s"
//Default styles for created mobs.
default_hair = "Skrell Male Tentacles"
reagent_tag = PROCESS_ORG
@@ -226,7 +230,8 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
+ "headpocket" = /obj/item/organ/internal/headpocket
)
suicide_messages = list(
@@ -257,6 +262,8 @@
smell. Most humans will never meet a Vox raider, instead learning of this insular species through \
dealing with their traders and merchants; those that do rarely enjoy the experience."
+ brute_mod = 1.2 //20% more brute damage. Fragile bird bones.
+
warning_low_pressure = 50
hazard_low_pressure = 0
@@ -298,6 +305,10 @@
scream_verb = "shrieks"
male_scream_sound = 'sound/voice/shriek1.ogg'
female_scream_sound = 'sound/voice/shriek1.ogg'
+ male_cough_sounds = list('sound/voice/shriekcough.ogg')
+ female_cough_sounds = list('sound/voice/shriekcough.ogg')
+ male_sneeze_sound = 'sound/voice/shrieksneeze.ogg'
+ female_sneeze_sound = 'sound/voice/shrieksneeze.ogg'
icon_skin_tones = list(
1 = "Default Green",
@@ -315,7 +326,7 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
@@ -339,13 +350,13 @@
newname += pick(vox_name_syllables)
return capitalize(newname)
-/datum/species/vox/equip(var/mob/living/carbon/human/H)
- if(H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
+/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
+ if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
H.unEquip(H.wear_mask)
H.unEquip(H.l_hand)
H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask)
- var/tank_pref = H.client.prefs.speciesprefs
+ var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null
if(tank_pref)//Diseasel, here you go
H.equip_or_collect(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand)
else
@@ -360,36 +371,45 @@
//H.verbs += /mob/living/carbon/human/proc/leap
..()
-/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H) //Handling species-specific skin-tones for the Vox race.
- if(H.species.name == "Vox") //Making sure we don't break Armalis.
+/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
+ if(H.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
+ var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox.
+ var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox.
switch(H.s_tone)
if(6) //Azure Vox.
- icobase = 'icons/mob/human_races/vox/r_voxazu.dmi'
- deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi'
- tail = "voxtail_azu"
+ new_icobase = 'icons/mob/human_races/vox/r_voxazu.dmi'
+ new_deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi'
+ H.tail = "voxtail_azu"
if(5) //Emerald Vox.
- icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi'
- deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi'
- tail = "voxtail_emrl"
+ new_icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi'
+ new_deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi'
+ H.tail = "voxtail_emrl"
if(4) //Grey Vox.
- icobase = 'icons/mob/human_races/vox/r_voxgry.dmi'
- deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi'
- tail = "voxtail_gry"
+ new_icobase = 'icons/mob/human_races/vox/r_voxgry.dmi'
+ new_deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi'
+ H.tail = "voxtail_gry"
if(3) //Brown Vox.
- icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi'
- deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi'
- tail = "voxtail_brn"
+ new_icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi'
+ new_deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi'
+ H.tail = "voxtail_brn"
if(2) //Dark Green Vox.
- icobase = 'icons/mob/human_races/vox/r_voxdgrn.dmi'
- deform = 'icons/mob/human_races/vox/r_def_voxdgrn.dmi'
- tail = "voxtail_dgrn"
+ new_icobase = 'icons/mob/human_races/vox/r_voxdgrn.dmi'
+ new_deform = 'icons/mob/human_races/vox/r_def_voxdgrn.dmi'
+ H.tail = "voxtail_dgrn"
else //Default Green Vox.
- icobase = 'icons/mob/human_races/vox/r_vox.dmi'
- deform = 'icons/mob/human_races/vox/r_def_vox.dmi'
- tail = "voxtail" //Ensures they get an appropriately coloured tail depending on the skin-tone.
+ H.tail = "voxtail" //Ensures they get an appropriately coloured tail depending on the skin-tone.
+ H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so.
H.update_dna()
+/datum/species/vox/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
+ if(R.id == "oxygen") //Armalis are above such petty things.
+ H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma.
+ H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
+ return 0 //Handling reagent removal on our own.
+
+ return ..()
+
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/leap
H.verbs += /mob/living/carbon/human/proc/gut
@@ -422,7 +442,8 @@
breath_type = "nitrogen"
poison_type = "oxygen"
- flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED
+ flags = NO_SCAN | NO_BLOOD | NO_PAIN | IS_WHITELISTED
+ bodyflags = HAS_TAIL
dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
blood_color = "#2299FC"
@@ -439,7 +460,7 @@
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
@@ -450,6 +471,9 @@
"is holding their breath!",
"is huffing oxygen!")
+/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things.
+ return 1
+
/datum/species/kidan
name = "Kidan"
name_plural = "Kidan"
@@ -463,12 +487,14 @@
brute_mod = 0.8
flags = IS_WHITELISTED
- clothing_flags = HAS_SOCKS
- bodyflags = FEET_CLAWS
- eyes = "kidan_eyes"
+ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
+ bodyflags = FEET_CLAWS | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS
+ eyes = "kidan_eyes_s"
dietflags = DIET_HERB
blood_color = "#FB9800"
reagent_tag = PROCESS_ORG
+ //Default styles for created mobs.
+ default_headacc = "Normal Antennae"
butt_sprite = "kidan"
has_organ = list(
@@ -478,7 +504,8 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
+ "lantern" = /obj/item/organ/internal/lantern
)
allowed_consumed_mobs = list(/mob/living/simple_animal/diona)
@@ -487,8 +514,9 @@
"is attempting to bite their antenna off!",
"is jamming their claws into their eye sockets!",
"is twisting their own neck!",
+ "is cracking their exoskeleton!",
+ "is stabbing themselves with their mandibles!",
"is holding their breath!")
-
/datum/species/slime
name = "Slime People"
name_plural = "Slime People"
@@ -506,6 +534,12 @@
cold_level_3 = 200
cold_env_multiplier = 3
+ oxy_mod = 0
+ brain_mod = 2.5
+
+ male_cough_sounds = list('sound/effects/slime_squish.ogg')
+ female_cough_sounds = list('sound/effects/slime_squish.ogg')
+
flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | NO_EYES
@@ -514,6 +548,7 @@
exotic_blood = "water"
//ventcrawler = 1 //ventcrawling commented out
butt_sprite = "slime"
+ //Has default darksight of 2.
has_organ = list(
"brain" = /obj/item/organ/internal/brain/slime
@@ -546,8 +581,8 @@
H.g_skin = new_color_list[2]
H.b_skin = new_color_list[3]
if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller
- for(var/organname in H.organs_by_name)
- var/obj/item/organ/external/E = H.organs_by_name[organname]
+ for(var/organname in H.bodyparts_by_name)
+ var/obj/item/organ/external/E = H.bodyparts_by_name[organname]
if(istype(E) && E.dna.species == "Slime People")
E.sync_colour_to_human(H)
H.update_hair(0)
@@ -600,13 +635,13 @@
return
var/list/missing_limbs = list()
- for(var/l in organs_by_name)
- var/obj/item/organ/external/E = organs_by_name[l]
+ for(var/l in bodyparts_by_name)
+ var/obj/item/organ/external/E = bodyparts_by_name[l]
if(!istype(E) || istype(E, /obj/item/organ/external/stump))
var/list/limblist = species.has_limbs[l]
var/obj/item/organ/external/limb = limblist["path"]
var/parent_organ = initial(limb.parent_organ)
- var/obj/item/organ/external/parentLimb = organs_by_name[parent_organ]
+ var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ]
if(!istype(parentLimb) || parentLimb.is_stump())
continue
missing_limbs[initial(limb.name)] = l
@@ -628,7 +663,7 @@
to_chat(src, "You're too hungry to regenerate a limb! ")
return
- var/obj/item/organ/external/O = organs_by_name[chosen_limb]
+ var/obj/item/organ/external/O = bodyparts_by_name[chosen_limb]
var/stored_brute = 0
var/stored_burn = 0
@@ -646,7 +681,7 @@
var/limb_list = species.has_limbs[chosen_limb]
var/obj/item/organ/external/limb_path = limb_list["path"]
// Parent check
- var/obj/item/organ/external/potential_parent = organs_by_name[initial(limb_path.parent_organ)]
+ var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)]
if(!istype(potential_parent) || potential_parent.is_stump())
to_chat(src, "You've lost the organ that you've been growing your new part on! ")
return // No rayman for you
@@ -682,7 +717,6 @@
default_language = "Galactic Common"
language = "Psionic Communication"
unarmed_type = /datum/unarmed_attack/punch
- darksight = 5 // BOOSTED from 2
eyes = "grey_eyes_s"
butt_sprite = "grey"
@@ -693,7 +727,7 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain/grey,
"appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
+ "eyes" = /obj/item/organ/internal/eyes/grey //5 darksight.
)
brute_mod = 1.25 //greys are fragile
@@ -711,14 +745,17 @@
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
if(!remove)
C.dna.SetSEState(REMOTETALKBLOCK,1,1)
- C.mutations |= REMOTE_TALK
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
else
C.dna.SetSEState(REMOTETALKBLOCK,0,1)
- C.mutations -= REMOTE_TALK
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
..()
+/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
+ var/speech_pref = H.client.prefs.speciesprefs
+ if(speech_pref)
+ H.mind.speech_span = "wingdings"
+
/datum/species/diona
name = "Diona"
name_plural = "Dionaea"
@@ -732,6 +769,7 @@
slowdown = 5
remains_type = /obj/effect/decal/cleanable/ash
+
warning_low_pressure = 50
hazard_low_pressure = -1
@@ -756,6 +794,8 @@
clothing_flags = HAS_SOCKS
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
+ oxy_mod = 0
+
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
blood_color = "#004400"
flesh_color = "#907E4A"
@@ -766,13 +806,13 @@
has_organ = list(
"nutrient channel" = /obj/item/organ/internal/liver/diona,
"neural strata" = /obj/item/organ/internal/heart/diona,
- "receptor node" = /obj/item/organ/internal/diona_receptor,
+ "receptor node" = /obj/item/organ/internal/eyes/diona, //Default darksight of 2.
"gas bladder" = /obj/item/organ/internal/brain/diona,
"polyp segment" = /obj/item/organ/internal/kidneys/diona,
"anchoring ligament" = /obj/item/organ/internal/appendix/diona
)
- vision_organ = /obj/item/organ/internal/diona_receptor
+ vision_organ = /obj/item/organ/internal/eyes/diona
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/diona),
"groin" = list("path" = /obj/item/organ/external/groin/diona),
@@ -803,8 +843,8 @@
return ..()
/datum/species/diona/handle_life(var/mob/living/carbon/human/H)
- var/rads = H.radiation/25
- H.radiation = Clamp(H.radiation - rads, 0, 100)
+ var/rads = H.radiation / 25
+ H.apply_effect(-rads,IRRADIATE,0)
H.nutrition += rads
H.adjustBruteLoss(-(rads))
H.adjustOxyLoss(-(rads))
@@ -813,18 +853,23 @@
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
- light_amount = min(T.get_lumcount()*10, 5) //hardcapped so it's not abused by having a ton of flashlights
+ light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights
H.nutrition += light_amount
H.traumatic_shock -= light_amount
if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
H.nutrition = NUTRITION_LEVEL_WELL_FED
+ if(light_amount > 0)
+ H.clear_alert("nolight")
+ else
+ H.throw_alert("nolight", /obj/screen/alert/nolight)
+
if((light_amount >= 5) && !H.suiciding) //if there's enough light, heal
+
H.adjustBruteLoss(-(light_amount/2))
H.adjustFireLoss(-(light_amount/4))
H.adjustOxyLoss(-(light_amount))
-
if(H.nutrition < 200)
H.take_overall_damage(10,0)
H.traumatic_shock++
@@ -850,9 +895,12 @@
eyes = "blank_eyes"
brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
+ tox_mod = 0
+ clone_mod = 0
+ oxy_mod = 0
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
- flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS | NOTRANSSTING
+ flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | RADIMMUNE | ALL_RPARTS | NOTRANSSTING
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
@@ -862,18 +910,24 @@
default_hair = "Blue IPC Screen"
virus_immune = 1
can_revive_by_healing = 1
+ has_gender = FALSE
reagent_tag = PROCESS_SYN
male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
+ male_cough_sounds = list('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg')
+ female_cough_sounds = list('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg')
+ male_sneeze_sound = 'sound/effects/mob_effects/machine_sneeze.ogg'
+ female_sneeze_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg'
butt_sprite = "machine"
has_organ = list(
"brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain,
"cell" = /obj/item/organ/internal/cell,
- "optics" = /obj/item/organ/internal/optical_sensor
+ "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2.
+ "charger" = /obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord
)
- vision_organ = /obj/item/organ/internal/optical_sensor
+ vision_organ = /obj/item/organ/internal/eyes/optical_sensor
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/ipc),
"groin" = list("path" = /obj/item/organ/external/groin/ipc),
@@ -919,12 +973,15 @@
language = "Orluum"
unarmed_type = /datum/unarmed_attack/punch
eyes = "drask_eyes_s"
- darksight = 5
speech_sounds = list('sound/voice/DraskTalk.ogg')
speech_chance = 20
male_scream_sound = 'sound/voice/DraskTalk2.ogg'
female_scream_sound = 'sound/voice/DraskTalk2.ogg'
+ male_cough_sounds = null //whale cough when
+ female_cough_sounds = null
+ male_sneeze_sound = null
+ female_sneeze_sound = null
burn_mod = 2
//exotic_blood = "cryoxadone"
@@ -969,7 +1026,7 @@
"heart" = /obj/item/organ/internal/heart/drask,
"lungs" = /obj/item/organ/internal/lungs/drask,
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
- "eyes" = /obj/item/organ/internal/eyes/drask,
+ "eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight.
"brain" = /obj/item/organ/internal/brain/drask
)
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
new file mode 100644
index 00000000000..5f74f202603
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -0,0 +1,19 @@
+/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
+ if(species)
+ amount = amount * species.stun_mod
+ ..()
+
+/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
+ if(species)
+ amount = amount * species.stun_mod
+ ..()
+
+/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
+ if(species)
+ amount = amount * species.stun_mod
+ ..()
+
+/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
+ if(species)
+ amount = amount * species.stun_mod
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 48555229aad..1cb97bb3e19 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -171,7 +171,7 @@ var/global/list/damage_icon_parts = list()
// first check whether something actually changed about damage appearance
var/damage_appearance = ""
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.is_stump())
continue
if(O.status & ORGAN_DESTROYED) damage_appearance += "d"
@@ -189,7 +189,7 @@ var/global/list/damage_icon_parts = list()
var/image/standing_image = new /image("icon" = standing)
// blend the individual damage states with our icons
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(O.is_stump())
continue
if(!(O.status & ORGAN_DESTROYED))
@@ -240,7 +240,7 @@ var/global/list/damage_icon_parts = list()
icon_key += "#000000"
for(var/organ_tag in species.has_limbs)
- var/obj/item/organ/external/part = organs_by_name[organ_tag]
+ var/obj/item/organ/external/part = bodyparts_by_name[organ_tag]
if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED))
icon_key += "0"
else if(part.status & ORGAN_ROBOT)
@@ -269,7 +269,7 @@ var/global/list/damage_icon_parts = list()
var/obj/item/organ/external/chest = get_organ("chest")
base_icon = chest.get_icon(skeleton)
- for(var/obj/item/organ/external/part in organs)
+ for(var/obj/item/organ/external/part in bodyparts)
var/icon/temp = part.get_icon(skeleton)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
@@ -298,9 +298,9 @@ var/global/list/damage_icon_parts = list()
base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3]))
//Handle husk overlay.
- if(husk && ("overlay_husk" in icon_states(species.icobase)))
+ if(husk && ("overlay_husk" in icon_states(chest.icobase)))
var/icon/mask = new(base_icon)
- var/icon/husk_over = new(species.icobase,"overlay_husk")
+ var/icon/husk_over = new(chest.icobase,"overlay_husk")
mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
husk_over.Blend(mask, ICON_ADD)
base_icon.Blend(husk_over, ICON_OVERLAY)
@@ -638,7 +638,7 @@ var/global/list/damage_icon_parts = list()
if(w_uniform.flags_size & ONESIZEFITSALL)
standing.icon = 'icons/mob/uniform_fat.dmi'
else
- to_chat(src, "\red You burst out of \the [w_uniform]!")
+ to_chat(src, "You burst out of \the [w_uniform]! ")
unEquip(w_uniform)
return
else
@@ -957,15 +957,14 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.flags_size & ONESIZEFITSALL)
standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]")
else
- to_chat(src, "\red You burst out of \the [wear_suit]!")
+ to_chat(src, "You burst out of \the [wear_suit]! ")
unEquip(wear_suit)
return
else
standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]")
- if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) )
- unEquip(handcuffed)
+ if(wear_suit.breakouttime)
drop_l_hand()
drop_r_hand()
@@ -1197,12 +1196,12 @@ var/global/list/damage_icon_parts = list()
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
+ else if(tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
- var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
+ var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
- if(tail_marking_icon)
+ if(tail_marking_icon && !tail_marking_style.tails_allowed)
tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
@@ -1266,11 +1265,11 @@ var/global/list/damage_icon_parts = list()
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- else if(species.tail && species.bodyflags & HAS_TAIL)
- var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
+ else if(tail && species.bodyflags & HAS_TAIL)
+ var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
- if(tail_marking_icon)
+ if(tail_marking_icon && !tail_marking_style.tails_allowed)
tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
@@ -1333,7 +1332,7 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
/mob/living/carbon/human/proc/force_update_limbs()
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
O.sync_colour_to_human(src)
update_body(0)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 91661304144..da764cafda3 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -345,7 +345,7 @@
if(..())
handle_dreams()
adjustStaminaLoss(-10)
- if(prob(10) && health && !hal_crit)
+ if(prob(10) && health && hal_screwyhud != SCREWYHUD_CRIT)
spawn(0)
emote("snore")
// Keep SSD people asleep
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index 0a86f2756cf..b86f88c4ff4 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -20,7 +20,7 @@
// broken or ripped off organs will add quite a bit of pain
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/M = src
- for(var/obj/item/organ/external/organ in M.organs)
+ for(var/obj/item/organ/external/organ in M.bodyparts)
if(!organ)
continue
else if(organ.status & ORGAN_BROKEN || organ.open)
diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm
index c77d5e24a65..b4a6eb140f0 100644
--- a/code/modules/mob/living/carbon/slime/emote.dm
+++ b/code/modules/mob/living/carbon/slime/emote.dm
@@ -14,7 +14,7 @@
return
if(src.client)
if(client.prefs.muted & MUTE_IC)
- to_chat(src, "\red You cannot send IC messages (muted).")
+ to_chat(src, "You cannot send IC messages (muted). ")
return
if(src.client.handle_spam_prevention(message,MUTE_IC))
return
@@ -62,7 +62,7 @@
to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate")
else
- to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.")
+ to_chat(src, "Unusable emote '[act]'. Say *help for a list. ")
if((message && src.stat == 0))
if(m_type & 1)
for(var/mob/O in viewers(src, null))
diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm
index 38a4a310b41..95359f7d573 100644
--- a/code/modules/mob/living/carbon/slime/powers.dm
+++ b/code/modules/mob/living/carbon/slime/powers.dm
@@ -27,7 +27,7 @@
if(met.Victim == M && met != src)
to_chat(src, "The [met.name] is already feeding on this subject... ")
return
- to_chat(src, "\blue I have latched onto the subject and begun feeding... ")
+ to_chat(src, "I have latched onto the subject and begun feeding... ")
to_chat(M, "The [src.name] has latched onto your head! ")
Feedon(M)
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 634e9865e45..85fed33c156 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -83,79 +83,45 @@
if(bodytemperature >= 330.23) // 135 F
return -1 // slimes become supercharged at high temperatures
- var/tally = 0
+ . = ..()
var/health_deficiency = (100 - health)
- if(health_deficiency >= 45) tally += (health_deficiency / 25)
+ if(health_deficiency >= 45)
+ . += (health_deficiency / 25)
if(bodytemperature < 183.222)
- tally += (283.222 - bodytemperature) / 10 * 1.75
+ . += (283.222 - bodytemperature) / 10 * 1.75
if(reagents)
if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down
- tally *= 2
+ . *= 2
if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
- tally *= 5
+ . *= 5
if(health <= 0) // if damaged, the slime moves twice as slow
- tally *= 2
+ . *= 2
- return tally + config.slime_delay
+ . += config.slime_delay
-/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
- if((!(yes) || now_pushing))
- return
- now_pushing = 1
-
- if(isobj(AM))
- if(!client && powerlevel > 0)
- var/probab = 10
- switch(powerlevel)
- if(1 to 2) probab = 20
- if(3 to 4) probab = 30
- if(5 to 6) probab = 40
- if(7 to 8) probab = 60
- if(9) probab = 70
- if(10) probab = 95
- if(prob(probab))
- if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
- if(nutrition <= get_hunger_nutrition() && !Atkcool)
- if(is_adult || prob(5))
- AM.attack_slime(src)
- spawn()
- Atkcool = 1
- sleep(45)
- Atkcool = 0
-
- if(ismob(AM))
- var/mob/tmob = AM
-
- if(is_adult)
- if(istype(tmob, /mob/living/carbon/human))
- if(prob(90))
- now_pushing = 0
- return
- else
- if(istype(tmob, /mob/living/carbon/human))
- now_pushing = 0
- return
-
- now_pushing = 0
- ..()
- if(!istype(AM, /atom/movable))
- return
- if(!( now_pushing ))
- now_pushing = 1
- if(!( AM.anchored ))
- var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window))
- if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
+/mob/living/carbon/slime/ObjBump(obj/O)
+ if(!client && powerlevel > 0)
+ var/chance = 10
+ switch(powerlevel)
+ if(1 to 2) chance = 20
+ if(3 to 4) chance = 30
+ if(5 to 6) chance = 40
+ if(7 to 8) chance = 60
+ if(9) chance = 70
+ if(10) chance = 95
+ if(prob(chance))
+ if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
+ if(nutrition <= get_hunger_nutrition() && !Atkcool)
+ if(is_adult || prob(5))
+ O.attack_slime(src)
+ Atkcool = 1
+ spawn(45)
+ Atkcool = 0
/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0)
return 2
@@ -264,8 +230,8 @@
playsound(loc, M.attack_sound, 50, 1, 1)
visible_message("[M] [M.attacktext] [src]! ", \
"[M] [M.attacktext] [src]! ")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey]) ")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey]) ")
+ M.create_attack_log("attacked [src.name] ([src.ckey]) ")
+ src.create_attack_log("was attacked by [M.name] ([M.ckey]) ")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attacked += 10
adjustBruteLoss(damage)
@@ -371,7 +337,7 @@
visible_message("[src] has been touched with the stun gloves by [M]! ")
return
else
- to_chat(M, "\red Not enough charge! ")
+ to_chat(M, "Not enough charge! ")
return
*/
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index 60e1cd82654..e5a9d73e402 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -14,15 +14,19 @@
assign_genes(H)
assign_spells(H)
equip(H)
+ fixflags(H)
assign_id(H)
/datum/superheroes/proc/equip(var/mob/living/carbon/human/H)
H.rename_character(H.real_name, name)
- for(var/obj/item/W in H)
- if(istype(W,/obj/item/organ)) continue
+ for(var/obj/item/W in H.get_all_slots())
H.unEquip(W)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
+/datum/superheroes/proc/fixflags(var/mob/living/carbon/human/H)
+ for(var/obj/item/W in H.get_all_slots())
+ W.flags |= NODROP
+
/datum/superheroes/proc/assign_genes(var/mob/living/carbon/human/H)
if(default_genes.len)
for(var/gene in default_genes)
@@ -42,14 +46,17 @@
W.registered_name = H.real_name
W.access = list(access_maint_tunnels)
if(class == "Superhero")
- W.name = "[H.real_name]'s ID Card (Superhero)"
W.assignment = "Superhero"
+ W.rank = "Superhero"
ticker.mode.superheroes += H.mind
else if(class == "Supervillain")
- W.name = "[H.real_name]'s ID Card (Supervillain)"
W.assignment = "Supervillain"
+ W.rank = "Supervillain"
ticker.mode.supervillains += H.mind
-
+ W.icon_state = "lifetimeid"
+ W.SetOwnerInfo(H)
+ W.UpdateName()
+ W.flags |= NODROP
H.equip_to_slot_or_del(W, slot_wear_id)
H.regenerate_icons()
@@ -66,8 +73,8 @@
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/owl/super_hero(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/super_hero(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/owl(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/owl_mask/super_hero(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/bluespace/owlman(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
@@ -84,15 +91,13 @@
/datum/superheroes/griffin/equip(var/mob/living/carbon/human/H)
..()
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/griffin/super_hero(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/griffin/super_hero(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/griffinwings/super_hero(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin/super_hero(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/griffin(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/griffin(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/griffinwings(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin/(H), slot_head)
var/obj/item/weapon/implant/freedom/L = new/obj/item/weapon/implant/freedom(H)
- L.imp_in = H
- L.implanted = 1
- return 1
+ L.implant(H)
/datum/superheroes/lightnian
@@ -147,69 +152,69 @@
action_icon_state = "spell_greytide"
var/recruiting = 0
-/obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets)
+/obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets,mob/living/user = usr)
for(var/mob/living/carbon/human/target in targets)
var/obj/item/organ/external/head/head_organ = target.get_organ("head")
if(ticker.mode.greyshirts.len >= 3)
- to_chat(usr, "You have already recruited the maximum number of henchmen. ")
- if(!in_range(usr, target))
- to_chat(usr, "You need to be closer to enthrall [target]. ")
+ to_chat(user, "You have already recruited the maximum number of henchmen. ")
+ if(!in_range(user, target))
+ to_chat(user, "You need to be closer to enthrall [target]. ")
charge_counter = charge_max
return
if(!target.ckey)
- to_chat(usr, "The target has no mind. ")
+ to_chat(user, "The target has no mind. ")
charge_counter = charge_max
return
if(target.stat)
- to_chat(usr, "The target must be conscious. ")
+ to_chat(user, "The target must be conscious. ")
charge_counter = charge_max
return
if(!ishuman(target))
- to_chat(usr, "You can only recruit humans. ")
+ to_chat(user, "You can only recruit humans. ")
charge_counter = charge_max
return
if(target.mind.assigned_role != "Civilian")
- to_chat(usr, "You can only recruit Civilians. ")
+ to_chat(user, "You can only recruit Civilians. ")
if(recruiting)
- to_chat(usr, "You are already recruiting! ")
+ to_chat(user, "You are already recruiting! ")
charge_counter = charge_max
return
recruiting = 1
- to_chat(usr, "This target is valid. You begin the recruiting process. ")
- to_chat(target, "[usr] focuses in concentration. Your head begins to ache. ")
+ to_chat(user, "This target is valid. You begin the recruiting process. ")
+ to_chat(target, "[user] focuses in concentration. Your head begins to ache. ")
for(var/progress = 0, progress <= 3, progress++)
switch(progress)
if(1)
- to_chat(usr, "You begin by introducing yourself and explaining what you're about. ")
- usr.visible_message("[usr]'s introduces himself and explains his plans. ")
+ to_chat(user, "You begin by introducing yourself and explaining what you're about. ")
+ user.visible_message("[user]'s introduces himself and explains his plans. ")
if(2)
- to_chat(usr, "You begin the recruitment of [target]. ")
- usr.visible_message("[usr] leans over towards [target], whispering excitedly as he gives a speech. ")
- to_chat(target, "You feel yourself agreeing with [usr], and a surge of loyalty begins building. ")
+ to_chat(user, "You begin the recruitment of [target]. ")
+ user.visible_message("[user] leans over towards [target], whispering excitedly as he gives a speech. ")
+ to_chat(target, "You feel yourself agreeing with [user], and a surge of loyalty begins building. ")
target.Weaken(12)
sleep(20)
- if(isloyal(target))
- to_chat(usr, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear. ")
- usr.visible_message("[usr] stops talking for a moment, then moves back away from [target]. ")
+ if(ismindshielded(target))
+ to_chat(user, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear. ")
+ user.visible_message("[user] stops talking for a moment, then moves back away from [target]. ")
to_chat(target, "Your mindshield implant activates, protecting you from conversion. ")
return
if(3)
- to_chat(usr, "You begin filling out the application form with [target]. ")
- usr.visible_message("[usr] pulls out a pen and paper and begins filling an application form with [target]. ")
- to_chat(target, "You are being convinced by [usr] to fill out an application form to become a henchman. ")//Ow the edge
+ to_chat(user, "You begin filling out the application form with [target]. ")
+ user.visible_message("[user] pulls out a pen and paper and begins filling an application form with [target]. ")
+ to_chat(target, "You are being convinced by [user] to fill out an application form to become a henchman. ")//Ow the edge
- if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a mindshield implant
- to_chat(usr, "The enrollment process has been interrupted - you have lost the attention of [target]. ")
- to_chat(target, "You move away and are no longer under the charm of [usr]. The application form is null and void. ")
+ if(!do_mob(user, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a mindshield implant
+ to_chat(user, "The enrollment process has been interrupted - you have lost the attention of [target]. ")
+ to_chat(target, "You move away and are no longer under the charm of [user]. The application form is null and void. ")
recruiting = 0
return
recruiting = 0
- to_chat(usr, "You have recruited [target] as your henchman! ")
- to_chat(target, "You have decided to enroll as a henchman for [usr]. You are now part of the feared 'Greyshirts'. ")
- to_chat(target, "You must follow the orders of [usr], and help him succeed in his dastardly schemes. ")
- to_chat(target, "You may not harm other Greyshirt or [usr]. However, you do not need to obey other Greyshirts. ")
+ to_chat(user, "You have recruited [target] as your henchman! ")
+ to_chat(target, "You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'. ")
+ to_chat(target, "You must follow the orders of [user], and help him succeed in his dastardly schemes. ")
+ to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts. ")
ticker.mode.greyshirts += target.mind
target.set_species("Human")
head_organ.h_style = "Bald"
@@ -217,18 +222,20 @@
target.s_tone = 35
// No `update_dna=0` here because the character is being over-written
target.change_eye_color(1,1,1)
- for(var/obj/item/W in target)
- if(istype(W,/obj/item/organ)) continue
+ for(var/obj/item/W in target.get_all_slots())
target.unEquip(W)
target.rename_character(target.real_name, "Generic Henchman ([rand(1, 1000)])")
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey/greytide(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical/greytide(target), slot_l_hand)
- var/obj/item/weapon/card/id/syndicate/W = new(target)
- W.registered_name = target.real_name
- W.access = list(access_maint_tunnels)
- W.name = "[target.real_name]'s ID Card (Greyshirt)"
- W.assignment = "Greyshirt"
- target.equip_to_slot_or_del(W, slot_wear_id)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_l_ear)
+ var/obj/item/weapon/card/id/syndicate/W = new(target)
+ W.icon_state = "lifetimeid"
+ W.access = list(access_maint_tunnels)
+ W.assignment = "Greyshirt"
+ W.rank = "Greyshirt"
+ W.flags |= NODROP
+ W.SetOwnerInfo(target)
+ W.UpdateName()
+ target.equip_to_slot_or_del(W, slot_wear_id)
target.regenerate_icons()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index c1f3f338893..06b6440f756 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1,11 +1,134 @@
/mob/living/Destroy()
- ..()
- return QDEL_HINT_HARDDEL_NOW
+ if(ranged_ability)
+ ranged_ability.remove_ranged_ability(src)
+ return ..()
+
+/mob/living/ghostize(can_reenter_corpse = 1)
+ var/prev_client = client
+ . = ..()
+ if(.)
+ if(ranged_ability && prev_client)
+ ranged_ability.remove_mousepointer(prev_client)
/mob/living/proc/OpenCraftingMenu()
return
+//Generic Bump(). Override MobBump() and ObjBump() instead of this.
+/mob/living/Bump(atom/A, yes)
+ if(..()) //we are thrown onto something
+ return
+ if(buckled || !yes || now_pushing)
+ return
+ if(ismob(A))
+ if(MobBump(A))
+ return
+ if(isobj(A))
+ if(ObjBump(A))
+ return
+ if(istype(A, /atom/movable))
+ if(PushAM(A))
+ return
+
+//Called when we bump into a mob
+/mob/living/proc/MobBump(mob/M)
+ //Even if we don't push/swap places, we "touched" them, so spread fire
+ spreadFire(M)
+
+ if(now_pushing)
+ return 1
+
+ //Should stop you pushing a restrained person out of the way
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.pulledby && L.pulledby != src && L.restrained())
+ if(!(world.time % 5))
+ to_chat(src, "[L] is restrained, you cannot push past. ")
+ return 1
+
+ if(L.pulling)
+ if(ismob(L.pulling))
+ var/mob/P = L.pulling
+ if(P.restrained())
+ if(!(world.time % 5))
+ to_chat(src, "[L] is restrained, you cannot push past. ")
+ return 1
+
+ if(moving_diagonally) //no mob swap during diagonal moves.
+ return 1
+
+ if(!M.buckled && !M.has_buckled_mobs())
+ var/mob_swap
+ //the puller can always swap with it's victim if on grab intent
+ if(M.pulledby == src && a_intent == I_GRAB)
+ mob_swap = 1
+ //restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
+ else if((M.restrained() || M.a_intent == I_HELP) && (restrained() || a_intent == I_HELP))
+ mob_swap = 1
+ if(mob_swap)
+ //switch our position with M
+ if(loc && !loc.Adjacent(M.loc))
+ return 1
+ now_pushing = 1
+ var/oldloc = loc
+ var/oldMloc = M.loc
+
+ var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap.
+ var/src_passmob = (pass_flags & PASSMOB)
+ M.pass_flags |= PASSMOB
+ pass_flags |= PASSMOB
+
+ M.Move(oldloc)
+ Move(oldMloc)
+
+ if(!src_passmob)
+ pass_flags &= ~PASSMOB
+ if(!M_passmob)
+ M.pass_flags &= ~PASSMOB
+
+ now_pushing = 0
+ return 1
+
+ // okay, so we didn't switch. but should we push?
+ // not if he's not CANPUSH of course
+ if(!(M.status_flags & CANPUSH))
+ return 1
+ //anti-riot equipment is also anti-push
+ if(M.r_hand && (prob(M.r_hand.block_chance * 2)) && !istype(M.r_hand, /obj/item/clothing))
+ return 1
+ if(M.l_hand && (prob(M.l_hand.block_chance * 2)) && !istype(M.l_hand, /obj/item/clothing))
+ return 1
+
+//Called when we bump into an obj
+/mob/living/proc/ObjBump(obj/O)
+ return
+
+//Called when we want to push an atom/movable
+/mob/living/proc/PushAM(atom/movable/AM)
+ if(now_pushing)
+ return 1
+ if(moving_diagonally) // no pushing during diagonal moves
+ return 1
+ if(!client && (mob_size < MOB_SIZE_SMALL))
+ return
+ if(!AM.anchored)
+ now_pushing = 1
+ var/t = get_dir(src, AM)
+ if(istype(AM, /obj/structure/window/full))
+ for(var/obj/structure/window/win in get_step(AM, t))
+ now_pushing = 0
+ return
+ if(pulling == AM)
+ stop_pulling()
+ var/current_dir
+ if(isliving(AM))
+ current_dir = AM.dir
+ step(AM, t)
+ if(current_dir)
+ AM.setDir(current_dir)
+ now_pushing = 0
+
+
/mob/living/Stat()
. = ..()
if(. && get_rig_stats)
@@ -40,17 +163,26 @@
set category = "Object"
if(AM.Adjacent(src))
- src.start_pulling(AM)
+ start_pulling(AM)
return
//same as above
/mob/living/pointed(atom/A as mob|obj|turf in view())
if(incapacitated())
return 0
- if(src.status_flags & FAKEDEATH)
+ if(status_flags & FAKEDEATH)
return 0
if(!..())
return 0
+ var/obj/item/hand_item = get_active_hand()
+ if(istype(hand_item, /obj/item/weapon/gun) && A != hand_item)
+ if(a_intent == I_HELP || !ismob(A))
+ visible_message("[src] points to [A] with [hand_item]")
+ return 1
+ A.visible_message("[src] points [hand_item] at [A]! ",
+ "[src] points [hand_item] at you! ")
+ A << 'sound/weapons/TargetOn.ogg'
+ return 1
visible_message("[src] points to [A]")
return 1
@@ -70,7 +202,7 @@
to_chat(src, "You have given up life and succumbed to death. ")
/mob/living/proc/InCritical()
- return (src.health < 0 && src.health > -95.0 && stat == UNCONSCIOUS)
+ return (health < 0 && health > -95.0 && stat == UNCONSCIOUS)
/mob/living/ex_act(severity)
..()
@@ -106,7 +238,7 @@
if(actual < desired)
temperature = desired
// if(istype(src, /mob/living/carbon/human))
-// to_chat(world, "[src] ~ [src.bodytemperature] ~ [temperature]")
+// to_chat(world, "[src] ~ [bodytemperature] ~ [temperature]")
return temperature
@@ -220,29 +352,31 @@
else
- L += src.contents
- for(var/obj/item/weapon/storage/S in src.contents) //Check for storage items
+ L += contents
+ for(var/obj/item/weapon/storage/S in contents) //Check for storage items
L += get_contents(S)
- for(var/obj/item/clothing/suit/storage/S in src.contents)//Check for labcoats and jackets
+ for(var/obj/item/clothing/suit/storage/S in contents)//Check for labcoats and jackets
L += get_contents(S)
- for(var/obj/item/clothing/accessory/storage/S in src.contents)//Check for holsters
+ for(var/obj/item/clothing/accessory/storage/S in contents)//Check for holsters
L += get_contents(S)
- for(var/obj/item/weapon/gift/G in src.contents) //Check for gift-wrapped items
+ for(var/obj/item/weapon/implant/storage/I in contents) //Check for storage implants.
+ L += I.get_contents()
+ for(var/obj/item/weapon/gift/G in contents) //Check for gift-wrapped items
L += G.gift
if(istype(G.gift, /obj/item/weapon/storage))
L += get_contents(G.gift)
- for(var/obj/item/smallDelivery/D in src.contents) //Check for package wrapped items
+ for(var/obj/item/smallDelivery/D in contents) //Check for package wrapped items
L += D.wrapped
if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen
L += get_contents(D.wrapped)
- for(var/obj/item/weapon/folder/F in src.contents)
+ for(var/obj/item/weapon/folder/F in contents)
L += F.contents //Folders can't store any storage items.
return L
/mob/living/proc/check_contents_for(A)
- var/list/L = src.get_contents()
+ var/list/L = get_contents()
for(var/obj/B in L)
if(B.type == A)
@@ -265,27 +399,27 @@
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
adjustFireLoss(-burn)
- src.updatehealth()
+ updatehealth()
// damage ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/take_organ_damage(var/brute, var/burn)
if(status_flags & GODMODE) return 0 //godmode
adjustBruteLoss(brute)
adjustFireLoss(burn)
- src.updatehealth()
+ updatehealth()
// heal MANY external organs, in random order
/mob/living/proc/heal_overall_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
adjustFireLoss(-burn)
- src.updatehealth()
+ updatehealth()
// damage MANY external organs, in random order
/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null)
if(status_flags & GODMODE) return 0 //godmode
adjustBruteLoss(brute)
adjustFireLoss(burn)
- src.updatehealth()
+ updatehealth()
/mob/living/proc/has_organic_damage()
return (maxHealth - health)
@@ -359,7 +493,7 @@
if(buckled) //Unbuckle the mob and clear the alerts.
buckled.buckled_mob = null
buckled = null
- anchored = initial(src.anchored)
+ anchored = initial(anchored)
update_canmove()
clear_alert("buckled")
post_buckle_mob(src)
@@ -367,7 +501,6 @@
if(iscarbon(src))
var/mob/living/carbon/C = src
C.handcuffed = initial(C.handcuffed)
- C.heart_attack = 0
for(var/datum/disease/D in C.viruses)
D.cure(0)
@@ -375,6 +508,7 @@
// restore all of the human's blood and reset their shock stage
if(ishuman(src))
human_mob = src
+ human_mob.set_heartattack(FALSE)
human_mob.restore_blood()
human_mob.shock_stage = 0
human_mob.decaylevel = 0
@@ -420,83 +554,47 @@
else
return 0
+ var/atom/movable/pullee = pulling
+ if(pullee && get_dist(src, pullee) > 1)
+ stop_pulling()
+ if(pullee && !isturf(pullee.loc) && pullee.loc != loc)
+ log_game("DEBUG: [src]'s pull on [pullee] was broken despite [pullee] being in [pullee.loc]. Pull stopped manually.")
+ stop_pulling()
if(restrained())
stop_pulling()
-
- var/t7 = 1
- if(restrained())
- for(var/mob/living/M in range(src, 1))
- if((M.pulling == src && M.stat == 0 && !( M.restrained() )))
- t7 = null
- if(t7 && pulling && (get_dist(src, pulling) <= 1 || pulling.loc == loc))
- var/turf/T = loc
- . = ..()
-
- if(pulling && pulling.loc)
- if(!( isturf(pulling.loc) ))
- stop_pulling()
- return
- else
- if(Debug)
- diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]"
- diary <<"REPORT THIS"
-
- /////
- if(pulling && pulling.anchored)
- stop_pulling()
- return
-
- if(!restrained())
- var/diag = get_dir(src, pulling)
- if((diag - 1) & diag)
- else
- diag = null
- if((get_dist(src, pulling) > 1 || diag))
- if(isliving(pulling))
- var/mob/living/M = pulling
- var/ok = 1
- if(locate(/obj/item/weapon/grab, M.grabbed_by))
- if(prob(75))
- var/obj/item/weapon/grab/G = pick(M.grabbed_by)
- if(istype(G, /obj/item/weapon/grab))
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1)
- //G = null
- qdel(G)
- else
- ok = 0
- if(locate(/obj/item/weapon/grab, M.grabbed_by.len))
- ok = 0
- if(ok)
- var/atom/movable/t = M.pulling
- M.stop_pulling()
-
- if(M.lying && (prob(M.getBruteLoss() / 6)))
- var/turf/location = M.loc
- if(istype(location, /turf/simulated))
- location.add_blood(M)
- pulling.Move(T, get_dir(pulling, T))
- if(M)
- M.start_pulling(t)
- else
- if(pulling)
- pulling.Move(T, get_dir(pulling, T))
- else
- stop_pulling()
- . = ..()
-
- if(s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
- s_active.close(src)
-
- if(.) // did we actually move?
+ var/turf/T = loc
+ . = ..()
+ if(.)
handle_footstep(loc)
step_count++
+ if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move.
+ if(pulling.anchored)
+ stop_pulling()
+ return
+
+ var/pull_dir = get_dir(src, pulling)
+ if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) // puller and pullee more than one tile away or in diagonal position
+ //if(isliving(pulling))
+ //var/mob/living/M = pulling
+ //if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth)))
+ //M.makeTrail(T)
+ pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position
+ if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
+ stop_pulling()
+
+ if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move
+ pulledby.stop_pulling()
+
+ if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
+ s_active.close(src)
+
if(update_slimes)
for(var/mob/living/carbon/slime/M in view(1,src))
M.UpdateFeed(src)
+
/mob/living/proc/handle_footstep(turf/T)
if(istype(T))
return 1
@@ -647,7 +745,7 @@
// The src mob is trying to place an item on someone
// Override if a certain mob should be behave differently when placing items (can't, for example)
/mob/living/stripPanelEquip(obj/item/what, mob/who, where, var/silent = 0)
- what = src.get_active_hand()
+ what = get_active_hand()
if(what && (what.flags & NODROP))
to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand! ")
return
@@ -828,16 +926,27 @@
visible_message("[user] butchers [src]. ")
gib()
-/mob/living/movement_delay()
- var/tally = 0
-
+/mob/living/movement_delay(ignorewalk = 0)
+ . = ..()
+ if(isturf(loc))
+ var/turf/T = loc
+ . += T.slowdown
if(slowed)
- tally += 10
+ . += 10
+ if(ignorewalk)
+ . += config.run_speed
+ else
+ switch(m_intent)
+ if("run")
+ if(drowsyness > 0)
+ . += 6
+ . += config.run_speed
+ if("walk")
+ . += config.walk_speed
- return tally
/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G)
- if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
+ if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser() && !issmall(src))
to_chat(src, "You don't have the dexterity to do this! ")
return 0
return 1
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 774223c0870..3aec754eabb 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -49,8 +49,13 @@
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, armor)
+ if(P.dismemberment)
+ check_projectile_dismemberment(P, def_zone)
return P.on_hit(src, armor, def_zone)
+/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
+ return 0
+
/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0)
return 0 //only carbon liveforms have this proc
@@ -60,60 +65,47 @@
O.emp_act(severity)
..()
+/obj/item/proc/get_volume_by_throwforce_and_or_w_class()
+ if(throwforce && w_class)
+ return Clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100
+ else if(w_class)
+ return Clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100
+ else
+ return 0
+
//this proc handles being hit by a thrown atom
-/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
+/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)//Standardization and logging -Sieve
if(istype(AM, /obj/item))
var/obj/item/I = AM
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
- var/dtype = BRUTE
+ var/dtype = BRUTE
+ var/volume = I.get_volume_by_throwforce_and_or_w_class()
if(istype(I, /obj/item/weapon))
var/obj/item/weapon/W = I
dtype = W.damtype
- if(W.hitsound && W.throwforce > 0)
- playsound(loc, W.hitsound, 30, 1, -1)
+ if(W.throwforce > 0) //If the weapon's throwforce is greater than zero...
+ if(W.hitsound) //...and hitsound is defined...
+ playsound(loc, W.hitsound, volume, 1, -1) //...play the weapon's hitsound.
+ else //Otherwise, if hitsound isn't defined...
+ playsound(loc, 'sound/weapons/genhit1.ogg', volume, 1, -1) //...play genhit1.ogg.
- //run to-hit check here
+ else if(I.throwforce > 0) //Otherwise, if the item doesn't have a throwhitsound and has a throwforce greater than zero...
+ playsound(loc, 'sound/weapons/genhit1.ogg', volume, 1, -1)//...play genhit1.ogg
+ if(!I.throwforce)// Otherwise, if the item's throwforce is 0...
+ playsound(loc, 'sound/weapons/throwtap.ogg', 1, volume, -1)//...play throwtap.ogg.
+ if(!blocked)
+ visible_message("[src] has been hit by [I]. ",
+ "[src] has been hit by [I]. ")
+ var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration)
+ apply_damage(I.throwforce, dtype, zone, armor, is_sharp(I), has_edge(I), I)
+ if(I.thrownby)
+ add_logs(I.thrownby, src, "hit", I)
+ else
+ return 1
+ else
+ playsound(loc, 'sound/weapons/genhit1.ogg', 50, 1, -1) //...play genhit1.ogg.)
+ ..()
- var/throw_damage = I.throwforce*(speed/5)
-
- src.visible_message("\red [src] has been hit by [I].")
- var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration)
-
- apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I)
-
- I.throwing = 0 //it hit, so stop moving
-
- if(ismob(I.thrower))
- var/mob/M = I.thrower
- if(M)
- attack_log += text("\[[time_stamp()]\] Has been hit with a [I], thrown by [key_name(M)] ")
- M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [I] ")
- if(!istype(src,/mob/living/simple_animal/mouse))
- msg_admin_attack("[key_name_admin(src)] was hit by a [I], thrown by [key_name_admin(M)]")
-
- // Begin BS12 momentum-transfer code.
- if(I.throw_source && speed >= 15)
- var/obj/item/weapon/W = I
- var/momentum = speed/2
- var/dir = get_dir(I.throw_source, src)
-
- visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
- src.throw_at(get_edge_target_turf(src,dir),1,momentum)
-
- if(!W || !src) return
-
- if(W.sharp) //Projectile is suitable for pinning.
- //Handles embedding for non-humans and simple_animals.
- I.loc = src
- embedded += I
-
- var/turf/T = near_wall(dir,2)
-
- if(T)
- src.loc = T
- visible_message("[src] is pinned to the wall by [I]! ","You are pinned to the wall by [I]! ")
- src.anchored = 1
- src.pinned += I
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == I_HARM)
@@ -135,8 +127,8 @@
M.occupant_message("You hit [src]. ")
visible_message("[src] has been hit by [M.name]. ", \
"[src] has been hit by [M.name]. ")
- attack_log += text("\[[time_stamp()]\] Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)]) ")
- M.occupant.attack_log += text("\[[time_stamp()]\] Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)]) ")
+ create_attack_log("Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)]) ")
+ M.occupant.create_attack_log("Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)]) ")
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
else
@@ -196,6 +188,24 @@
adjust_fire_stacks(3)
IgniteMob()
+//Share fire evenly between the two mobs
+//Called in MobBump() and Crossed()
+/mob/living/proc/spreadFire(mob/living/L)
+ if(!istype(L))
+ return
+ var/L_old_on_fire = L.on_fire
+
+ if(on_fire) //Only spread fire stacks if we're on fire
+ fire_stacks /= 2
+ L.fire_stacks += fire_stacks
+ if(L.IgniteMob())
+ log_game("[key_name(src)] bumped into [key_name(L)] and set them on fire")
+
+ if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them
+ L.fire_stacks /= 2
+ fire_stacks += L.fire_stacks
+ IgniteMob()
+
//Mobs on Fire end
/mob/living/water_act(volume, temperature)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 3d4638f43ce..397ce90af6c 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -33,6 +33,7 @@
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
+ var/digestion_ratio = 1 //controls how quickly reagents metabolize; largely governered by species attributes.
var/nightvision = 0
var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour
@@ -51,3 +52,10 @@
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
var/gene_stability = DEFAULT_GENE_STABILITY
+ var/ignore_gene_stability = 0
+
+ var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
+
+ var/tesla_ignore = FALSE
+
+ var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index a64126db27a..a2fc8e934cb 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -9,6 +9,10 @@
//Vents
if(ventcrawler)
to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station. ")
+
+ if(ranged_ability)
+ ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active! ")
+
//Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways.
update_pipe_vision()
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index 10ba19b4302..6235aecf2c4 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -1,4 +1,6 @@
/mob/living/Logout()
+ if(ranged_ability && client)
+ ranged_ability.remove_mousepointer(client)
..()
if(mind)
if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index bbf238fd037..81664f631d4 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -14,6 +14,7 @@ var/list/department_radio_keys = list(
":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
":z" = "Service", "#z" = "Service", ".z" = "Service",
":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private",
+ ":x" = "cords", "#x" = "cords", ".x" = "cords",
":R" = "right ear", "#R" = "right ear", ".R" = "right ear",
":L" = "left ear", "#L" = "left ear", ".L" = "left ear",
@@ -30,7 +31,8 @@ var/list/department_radio_keys = list(
":Z" = "Service", "#Z" = "Service", ".Z" = "Service",
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops",
- ":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam"
+ ":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam",
+ ":X" = "cords", "#X" = "cords", ".X" = "cords"
)
@@ -106,13 +108,14 @@ proc/get_radio_key_from_channel(var/channel)
return returns
-/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="")
+/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name = "", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE)
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot speak in IC (Muted). ")
return
- message = trim_strip_html_properly(message)
+ if(sanitize)
+ message = trim_strip_html_properly(message)
if(stat)
if(stat == DEAD)
@@ -147,6 +150,15 @@ proc/get_radio_key_from_channel(var/channel)
speaking.broadcast(src,trim(message))
return 1
+ if(message_mode == "cords")
+ if(iscarbon(src))
+ var/mob/living/carbon/C = src
+ var/obj/item/organ/internal/vocal_cords/V = C.get_int_organ(/obj/item/organ/internal/vocal_cords)
+ if(V && V.can_speak_with())
+ C.say(V.handle_speech(message), sanitize = FALSE, ignore_speech_problems = TRUE, ignore_atmospherics = TRUE)
+ V.speak_with(message) //words come before actions
+ return 1
+
verb = say_quote(message, speaking)
if(is_muzzled())
@@ -162,7 +174,7 @@ proc/get_radio_key_from_channel(var/channel)
message = handle_autohiss(message, speaking)
- if(speaking && !(speaking.flags & NO_STUTTER))
+ if(!ignore_speech_problems && (speaking && !(speaking.flags & NO_STUTTER)))
var/list/handle_s = handle_speech_problems(message, verb)
message = handle_s[1]
verb = handle_s[2]
@@ -217,12 +229,13 @@ proc/get_radio_key_from_channel(var/channel)
//make sure the air can transmit speech - speaker's side
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment ? environment.return_pressure() : 0
- if(pressure < SOUND_MINIMUM_PRESSURE)
- message_range = 1
+ if(!ignore_atmospherics)
+ if(pressure < SOUND_MINIMUM_PRESSURE)
+ message_range = 1
- if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
- italics = 1
- sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
+ if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
+ italics = 1
+ sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
var/list/hear = hear(message_range, T)
var/list/hearturfs = list()
@@ -269,6 +282,9 @@ proc/get_radio_key_from_channel(var/channel)
if(O) //It's possible that it could be deleted in the meantime.
O.hear_talk(src, message, verb, speaking)
+ //Log of what we've said, plain message, no spans or junk
+ say_log += message
+
log_say("[name]/[key] : [message]")
return 1
@@ -315,7 +331,7 @@ proc/get_radio_key_from_channel(var/channel)
else //everything else failed, emote is probably invalid
if(act == "help") return //except help, because help is handled individually
- to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.")
+ to_chat(src, "Unusable emote '[act]'. Say *help for a list. ")
/mob/living/whisper(message as text)
message = trim_strip_html_properly(message)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 710f8d8dff1..06021939ac9 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -99,22 +99,24 @@ var/list/ai_verbs_default = list(
var/obj/machinery/camera/portable/builtInCamera
+ var/obj/structure/AIcore/deactivated/linked_core //For exosuit control
+
var/arrivalmsg = "$name, $rank, has arrived on the station."
/mob/living/silicon/ai/proc/add_ai_verbs()
- src.verbs |= ai_verbs_default
- src.verbs |= silicon_subsystems
+ verbs |= ai_verbs_default
+ verbs |= silicon_subsystems
/mob/living/silicon/ai/proc/remove_ai_verbs()
- src.verbs -= ai_verbs_default
- src.verbs -= silicon_subsystems
+ verbs -= ai_verbs_default
+ verbs -= silicon_subsystems
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
announcement = new()
announcement.title = "A.I. Announcement"
announcement.announcement_type = "A.I. Announcement"
announcement.announcer = name
- announcement.newscast = 1
+ announcement.newscast = 0
var/list/possibleNames = ai_names
@@ -154,7 +156,7 @@ var/list/ai_verbs_default = list(
aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src)
- if(istype(loc, /turf))
+ if(isturf(loc))
add_ai_verbs(src)
//Languages
@@ -226,7 +228,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/rename_character(oldname, newname)
if(!..(oldname, newname))
- return 0
+ return FALSE
if(oldname != real_name)
announcement.announcer = name
@@ -238,13 +240,13 @@ var/list/ai_verbs_default = list(
if(aiPDA)
aiPDA.set_name_and_job(newname, "AI")
- return 1
+ return TRUE
/mob/living/silicon/ai/Destroy()
ai_list -= src
shuttle_caller_list -= src
shuttle_master.autoEvac()
- qdel(eyeobj) // No AI, no Eye
+ QDEL_NULL(eyeobj) // No AI, no Eye
malfhack = null
return ..()
@@ -261,7 +263,7 @@ var/list/ai_verbs_default = list(
var/mob/living/silicon/ai/powered_ai = null
invisibility = 100
-/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
+/obj/machinery/ai_powersupply/New(mob/living/silicon/ai/ai=null)
powered_ai = ai
if(isnull(powered_ai))
qdel(src)
@@ -297,41 +299,130 @@ var/list/ai_verbs_default = list(
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
- if(Entry.len < 2)
+ if(Entry.len < 2 || Entry[1] != "ai") //ignore incorrectly formatted entries or entries that aren't marked for AI
continue
- if(Entry.len < 3 && Entry[1] == ckey && Entry[2] == real_name)
- custom_sprite = 1 //They're in the list? Custom sprite time
- icon = 'icons/mob/custom-synthetic.dmi'
+ if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ var/display_choices = list(
+ "Monochrome",
+ "Blue",
+ "Clown",
+ "Inverted",
+ "Text",
+ "Smiley",
+ "Angry",
+ "Dorf",
+ "Matrix",
+ "Bliss",
+ "Firewall",
+ "Green",
+ "Red",
+ "Static",
+ "Triumvirate",
+ "Triumvirate Static",
+ "Red October",
+ "Sparkles",
+ "ANIMA",
+ "President",
+ "NT",
+ "NT2",
+ "Rainbow",
+ "Angel",
+ "Heartline",
+ "Hades",
+ "Helios",
+ "Syndicat Meow",
+ "Too Deep",
+ "Goon",
+ "Murica",
+ "Fuzzy",
+ "Glitchman",
+ "House",
+ "Database"
+ )
+ if(custom_sprite)
+ display_choices += "Custom"
//if(icon_state == initial(icon_state))
var/icontype = ""
- if(custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
- else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT")
+ icontype = input("Select an icon!", "AI", null, null) in display_choices
+ icon = 'icons/mob/AI.dmi' //reset this in case we were on a custom sprite and want to change to a standard one
switch(icontype)
- if("Custom") icon_state = "[ckey]-ai"
- if("Clown") icon_state = "ai-clown2"
- if("Monochrome") icon_state = "ai-mono"
- if("Inverted") icon_state = "ai-u"
- if("Firewall") icon_state = "ai-magma"
- if("Green") icon_state = "ai-wierd"
- if("Red") icon_state = "ai-red"
- if("Static") icon_state = "ai-static"
- if("Text") icon_state = "ai-text"
- if("Smiley") icon_state = "ai-smiley"
- if("Matrix") icon_state = "ai-matrix"
- if("Angry") icon_state = "ai-angryface"
- if("Dorf") icon_state = "ai-dorf"
- if("Bliss") icon_state = "ai-bliss"
- if("Triumvirate") icon_state = "ai-triumvirate"
- if("Triumvirate Static") icon_state = "ai-triumvirate-malf"
- if("Red October") icon_state = "ai-redoctober"
- if("Sparkles") icon_state = "ai-sparkles"
- if("ANIMA") icon_state = "ai-anima"
- if("President") icon_state = "ai-president"
- if("NT") icon_state = "ai-nt"
- else icon_state = "ai"
+ if("Custom")
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi' //set this here so we can use the custom_sprite
+ icon_state = "[ckey]-ai"
+ if("Clown")
+ icon_state = "ai-clown"
+ if("Monochrome")
+ icon_state = "ai-mono"
+ if("Inverted")
+ icon_state = "ai-u"
+ if("Firewall")
+ icon_state = "ai-magma"
+ if("Green")
+ icon_state = "ai-weird"
+ if("Red")
+ icon_state = "ai-red"
+ if("Static")
+ icon_state = "ai-static"
+ if("Text")
+ icon_state = "ai-text"
+ if("Smiley")
+ icon_state = "ai-smiley"
+ if("Matrix")
+ icon_state = "ai-matrix"
+ if("Angry")
+ icon_state = "ai-angryface"
+ if("Dorf")
+ icon_state = "ai-dorf"
+ if("Bliss")
+ icon_state = "ai-bliss"
+ if("Triumvirate")
+ icon_state = "ai-triumvirate"
+ if("Triumvirate Static")
+ icon_state = "ai-triumvirate-malf"
+ if("Red October")
+ icon_state = "ai-redoctober"
+ if("Sparkles")
+ icon_state = "ai-sparkles"
+ if("ANIMA")
+ icon_state = "ai-anima"
+ if("President")
+ icon_state = "ai-president"
+ if("NT")
+ icon_state = "ai-nt"
+ if("NT2")
+ icon_state = "ai-nanotrasen"
+ if("Rainbow")
+ icon_state = "ai-rainbow"
+ if("Angel")
+ icon_state = "ai-angel"
+ if("Heartline")
+ icon_state = "ai-heartline"
+ if("Hades")
+ icon_state = "ai-hades"
+ if("Helios")
+ icon_state = "ai-helios"
+ if("Syndicat Meow")
+ icon_state = "ai-syndicatmeow"
+ if("Too Deep")
+ icon_state = "ai-toodeep"
+ if("Goon")
+ icon_state = "ai-goon"
+ if("Murica")
+ icon_state = "ai-murica"
+ if("Fuzzy")
+ icon_state = "ai-fuzz"
+ if("Glitchman")
+ icon_state = "ai-glitchman"
+ if("House")
+ icon_state = "ai-house"
+ if("Database")
+ icon_state = "ai-database"
+ else
+ icon_state = "ai"
//else
// to_chat(usr, "You can only change your display once!")
//return
@@ -400,7 +491,7 @@ var/list/ai_verbs_default = list(
cancel_call_proc(src)
/mob/living/silicon/ai/cancel_camera()
- src.view_core()
+ view_core()
/mob/living/silicon/ai/verb/toggle_anchor()
set category = "AI Commands"
@@ -414,7 +505,7 @@ var/list/ai_verbs_default = list(
to_chat(src, "[anchored ? "You are now anchored. " : "You are now unanchored. "]")
/mob/living/silicon/ai/update_canmove()
- return 0
+ return FALSE
/mob/living/silicon/ai/proc/announcement()
set name = "Announcement"
@@ -426,21 +517,21 @@ var/list/ai_verbs_default = list(
ai_announcement()
-/mob/living/silicon/ai/check_eye(var/mob/user as mob)
+/mob/living/silicon/ai/check_eye(mob/user)
if(!current)
return null
user.reset_perspective(current)
- return 1
+ return TRUE
/mob/living/silicon/ai/blob_act()
if(stat != 2)
adjustBruteLoss(60)
updatehealth()
- return 1
- return 0
+ return TRUE
+ return FALSE
/mob/living/silicon/ai/restrained()
- return 0
+ return FALSE
/mob/living/silicon/ai/emp_act(severity)
if(prob(30))
@@ -516,7 +607,7 @@ var/list/ai_verbs_default = list(
if(href_list["callbot"]) //Command a bot to move to a selected location.
Bot = locate(href_list["callbot"]) in simple_animal_list
- if(!Bot || Bot.remote_disabled || src.control_disabled)
+ if(!Bot || Bot.remote_disabled || control_disabled)
return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off.
waypoint_mode = 1
to_chat(src, "Set your waypoint by clicking on a valid location free of obstructions. ")
@@ -524,7 +615,7 @@ var/list/ai_verbs_default = list(
if(href_list["interface"]) //Remotely connect to a bot!
Bot = locate(href_list["interface"]) in simple_animal_list
- if(!Bot || Bot.remote_disabled || src.control_disabled)
+ if(!Bot || Bot.remote_disabled || control_disabled)
return
Bot.attack_ai(src)
@@ -535,7 +626,16 @@ var/list/ai_verbs_default = list(
if(href_list["ai_take_control"]) //Mech domination
var/obj/mecha/M = locate(href_list["ai_take_control"])
if(controlled_mech)
- to_chat(src, "You are already loaded into an onboard computer!")
+ to_chat(src, "You are already loaded into an onboard computer! ")
+ return
+ if(!cameranet.checkCameraVis(M))
+ to_chat(src, "Exosuit is no longer near active cameras. ")
+ return
+ if(lacks_power())
+ to_chat(src, "You're depowered! ")
+ return
+ if(!isturf(loc))
+ to_chat(src, "You aren't in your core! ")
return
if(M)
M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself.
@@ -550,14 +650,15 @@ var/list/ai_verbs_default = list(
if(usr.machine == null)
usr.machine = usr
- while(src.cameraFollow == target)
+ while(cameraFollow == target)
to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).")
sleep(40)
continue
- return
-
- return
+ else if(href_list["open"])
+ var/mob/target = locate(href_list["open"]) in mob_list
+ if(target)
+ open_nearest_door(target)
/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
@@ -565,12 +666,12 @@ var/list/ai_verbs_default = list(
return 2
-/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M)
if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if(istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(isturf(loc) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -595,7 +696,7 @@ var/list/ai_verbs_default = list(
return
-/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob)
+/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M)
if(M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src]")
else
@@ -653,7 +754,7 @@ var/list/ai_verbs_default = list(
popup.set_content(d)
popup.open()
-/mob/living/silicon/ai/proc/set_waypoint(var/atom/A)
+/mob/living/silicon/ai/proc/set_waypoint(atom/A)
var/turf/turf_check = get_turf(A)
//The target must be in view of a camera or near the core.
if(turf_check in range(get_turf(src)))
@@ -663,7 +764,7 @@ var/list/ai_verbs_default = list(
else
to_chat(src, "Selected location is not visible. ")
-/mob/living/silicon/ai/proc/call_bot(var/turf/waypoint)
+/mob/living/silicon/ai/proc/call_bot(turf/waypoint)
if(!Bot)
return
@@ -674,22 +775,22 @@ var/list/ai_verbs_default = list(
Bot.call_bot(src, waypoint)
-/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
+/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C)
if(!tracking)
cameraFollow = null
if(!C || stat == DEAD) //C.can_use())
- return 0
+ return FALSE
- if(!src.eyeobj)
+ if(!eyeobj)
view_core()
return
// ok, we're alive, camera is good and in our network...
eyeobj.setLoc(get_turf(C))
//machine = src
- return 1
+ return TRUE
//Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm
//Adds in /mob/living/silicon/ai/proc/ai_network_change() instead
@@ -736,7 +837,7 @@ var/list/ai_verbs_default = list(
if(network in C.network)
U.eyeobj.setLoc(get_turf(C))
break
- to_chat(src, "\blue Switched to [network] camera network.")
+ to_chat(src, "Switched to [network] camera network. ")
//End of code by Mord_Sith
@@ -795,10 +896,10 @@ var/list/ai_verbs_default = list(
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
- if(Entry.len < 3)
+ if(Entry.len < 2 || Entry[1] != "hologram")
continue
- if (Entry[1] == ckey && Entry[2] == real_name && Entry[3] == "Hologram") //Custom holograms
+ if (Entry[2] == ckey) //Custom holograms
custom_hologram = 1 // option is given in hologram menu
var/input
@@ -907,10 +1008,10 @@ var/list/ai_verbs_default = list(
if("ancient machine")
holo_icon = getHologramIcon(icon('icons/mob/ancient_machine.dmi', "ancient_machine"))
if("custom")
- if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic.dmi'))
- holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic.dmi', "[ckey]-ai-holo"))
- else if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic64.dmi'))
- holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic64.dmi', "[ckey]-ai-holo"))
+ if("[ckey]-ai-holo" in icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi'))
+ holo_icon = getHologramIcon(icon('icons/mob/custom_synthetic/custom-synthetic.dmi', "[ckey]-ai-holo"))
+ else if("[ckey]-ai-holo" in icon_states('icons/mob/custom_synthetic/custom-synthetic64.dmi'))
+ holo_icon = getHologramIcon(icon('icons/mob/custom_synthetic/custom-synthetic64.dmi', "[ckey]-ai-holo"))
else
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
@@ -920,9 +1021,9 @@ var/list/ai_verbs_default = list(
set category = "Malfunction"
set name = "Return to Main Core"
- var/obj/machinery/power/apc/apc = src.loc
+ var/obj/machinery/power/apc/apc = loc
if(!istype(apc))
- to_chat(src, "\blue You are already in your Main Core.")
+ to_chat(src, "You are already in your Main Core. ")
return
apc.malfvacate()
@@ -994,22 +1095,22 @@ var/list/ai_verbs_default = list(
lit_cameras |= C
-/mob/living/silicon/ai/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/mob/living/silicon/ai/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
if(anchored)
- user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...")
- if(!do_after(user,40, target = src))
- user.visible_message("\blue \The [user] decides not to unbolt \the [src].")
+ user.visible_message("\The [user] starts to unbolt \the [src] from the plating... ")
+ if(!do_after(user, 40 * W.toolspeed, target = src))
+ user.visible_message("\The [user] decides not to unbolt \the [src]. ")
return
- user.visible_message("\blue \The [user] finishes unfastening \the [src]!")
+ user.visible_message("\The [user] finishes unfastening \the [src]! ")
anchored = 0
return
else
- user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...")
- if(!do_after(user,40, target = src))
- user.visible_message("\blue \The [user] decides not to bolt \the [src].")
+ user.visible_message("\The [user] starts to bolt \the [src] to the plating... ")
+ if(!do_after(user, 40 * W.toolspeed, target = src))
+ user.visible_message("\The [user] decides not to bolt \the [src]. ")
return
- user.visible_message("\blue \The [user] finishes fastening down \the [src]!")
+ user.visible_message("\The [user] finishes fastening down \the [src]! ")
anchored = 1
return
else
@@ -1025,75 +1126,31 @@ var/list/ai_verbs_default = list(
return
to_chat(src, "Accessing Subspace Transceiver control...")
- if(src.aiRadio)
- src.aiRadio.interact(src)
+ if(aiRadio)
+ aiRadio.interact(src)
-/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target as mob)
- if(!istype(target)) return
- spawn(0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = target
- var/obj/item/weapon/card/id/id = H.wear_id
- if(istype(id) && id.is_untrackable())
- to_chat(src, "Unable to locate an airlock")
- return
- if(H.digitalcamo)
- to_chat(src, "Unable to locate an airlock")
- return
- if(!near_camera(target))
- to_chat(src, "Target is not near any active cameras.")
- return
- var/obj/machinery/door/airlock/tobeopened
- var/dist = -1
- for(var/obj/machinery/door/airlock/D in range(3,target))
- if(!D.density) continue
- if(dist < 0)
- dist = get_dist(D, target)
-// to_chat(world, dist)
- tobeopened = D
- else
- if(dist > get_dist(D, target))
- dist = get_dist(D, target)
-// to_chat(world, dist)
- tobeopened = D
-// to_chat(world, "found [tobeopened.name] closer")
- else
-// to_chat(world, "[D.name] not close enough | [get_dist(D, target)] | [dist]")
- if(tobeopened)
- switch(alert(src, "Do you want to open \the [tobeopened] for [target]?","Doorknob_v2a.exe","Yes","No"))
- if("Yes")
- var/nhref = "src=[tobeopened.UID()];aiEnable=7"
- tobeopened.Topic(nhref, params2list(nhref), tobeopened, 1)
- to_chat(src, "\blue You've opened \the [tobeopened] for [target].")
- if("No")
- to_chat(src, "\red You deny the request.")
- else
- to_chat(src, "\red You've failed to open an airlock for [target]")
- return
-
-
-/mob/living/silicon/ai/proc/check_unable(var/flags = 0)
+/mob/living/silicon/ai/proc/check_unable(flags = 0)
if(stat == DEAD)
to_chat(usr, "You are dead! ")
- return 1
+ return TRUE
if(lacks_power())
to_chat(usr, "Power systems failure! ")
- return 1
+ return TRUE
- if((flags & AI_CHECK_WIRELESS) && src.control_disabled)
+ if((flags & AI_CHECK_WIRELESS) && control_disabled)
to_chat(usr, "Wireless control is disabled! ")
- return 1
- if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi)
+ return TRUE
+ if((flags & AI_CHECK_RADIO) && aiRadio.disabledAi)
to_chat(src, "System Error - Transceiver Disabled! ")
- return 1
- return 0
+ return TRUE
+ return FALSE
/mob/living/silicon/ai/proc/is_in_chassis()
- return istype(loc, /turf)
+ return isturf(loc)
-/mob/living/silicon/ai/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
+/mob/living/silicon/ai/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card)
if(!..())
return
if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card.
@@ -1114,17 +1171,17 @@ var/list/ai_verbs_default = list(
set category = "IC"
resting = 0
- var/obj/item/weapon/rig/rig = src.get_rig()
+ var/obj/item/weapon/rig/rig = get_rig()
if(rig)
rig.force_rest(src)
-/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
+/mob/living/silicon/ai/switch_to_camera(obj/machinery/camera/C)
if(!C.can_use() || !is_in_chassis())
- return 0
+ return FALSE
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
- return 1
+ return TRUE
/mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking)
if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
@@ -1169,3 +1226,37 @@ var/list/ai_verbs_default = list(
view_core() //A BYOND bug requires you to be viewing your core before your verbs update
verbs += /mob/living/silicon/ai/proc/choose_modules
malf_picker = new /datum/module_picker
+
+/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target)
+ if(!istype(target))
+ return
+
+ if(target && target.can_track())
+ var/obj/machinery/door/airlock/A = null
+
+ var/dist = -1
+ for(var/obj/machinery/door/airlock/D in range(3, target))
+ if(!D.density)
+ continue
+
+ var/curr_dist = get_dist(D, target)
+
+ if(dist < 0)
+ dist = curr_dist
+ A = D
+ else if(dist > curr_dist)
+ dist = curr_dist
+ A = D
+
+ if(istype(A))
+ switch(alert(src, "Do you want to open \the [A] for [target]?", "Doorknob_v2a.exe", "Yes", "No"))
+ if("Yes")
+ A.AIShiftClick()
+ to_chat(src, "You open \the [A] for [target]. ")
+ else
+ to_chat(src, "You deny the request. ")
+ else
+ to_chat(src, "Unable to locate an airlock near [target]. ")
+
+ else
+ to_chat(src, "Target is not on or near any active cameras on the station. ")
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 1c977296a8a..9947e6faeec 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -1,9 +1,13 @@
/mob/living/silicon/ai/death(gibbed)
- if(stat == DEAD) return
+ if(stat == DEAD)
+ return
stat = DEAD
- if(src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
- icon_state = "[ckey]-ai-crash"
- else icon_state = "ai-crash"
+ if(custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
+ icon_state = "[ckey]-ai_dead"
+ else if("[icon_state]_dead" in icon_states(icon,1))
+ icon_state = "[icon_state]_dead"
+ else
+ icon_state = "ai_dead"
update_canmove()
if(eyeobj)
eyeobj.setLoc(get_turf(src))
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 94814045871..c710e4c12db 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -42,7 +42,6 @@
var/area/my_area = get_area(src)
if(!lacks_power())
-
if(aiRestorePowerRoutine == 2)
to_chat(src, "Alert cancelled. Power has been restored without our assistance.")
aiRestorePowerRoutine = 0
@@ -53,8 +52,6 @@
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
update_sight()
-
-
else
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
@@ -74,6 +71,8 @@
if(!lacks_power())
to_chat(src, "Alert cancelled. Power has been restored without our assistance.")
aiRestorePowerRoutine = 0
+ clear_fullscreen("blind")
+ update_sight()
return
to_chat(src, "Fault confirmed: missing external power. Shutting down main control system to save power.")
sleep(20)
@@ -112,6 +111,7 @@
to_chat(src, "Alert cancelled. Power has been restored without our assistance.")
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
+ update_sight()
return
switch(PRP)
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 2a3b39c1c9b..ccd0f652b68 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -1,3 +1,70 @@
+/*
+ * AI Saycode
+ */
+
+
+/mob/living/silicon/ai/handle_track(var/message, var/verb = "says", var/datum/language/language, var/mob/speaker = null, var/speaker_name, var/atom/follow_target, var/hard_to_hear)
+ if(hard_to_hear)
+ return
+
+ var/jobname // the mob's "job"
+ var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
+ var/changed_voice
+
+ if(ishuman(speaker))
+ var/mob/living/carbon/human/H = speaker
+
+ var/obj/item/weapon/card/id/id = H.wear_id
+ if((istype(id) && id.is_untrackable()) && H.HasVoiceChanger())
+ changed_voice = 1
+ var/mob/living/carbon/human/I = locate(speaker_name)
+ if(I)
+ impersonating = I
+ jobname = impersonating.get_assignment()
+ else
+ jobname = "Unknown"
+ else
+ jobname = H.get_assignment()
+
+ else if(iscarbon(speaker)) // Nonhuman carbon mob
+ jobname = "No ID"
+ else if(isAI(speaker))
+ jobname = "AI"
+ else if(isrobot(speaker))
+ jobname = "Cyborg"
+ else if(ispAI(speaker))
+ jobname = "Personal AI"
+ else if(isAutoAnnouncer(speaker))
+ var/mob/living/automatedannouncer/AA = speaker
+ jobname = AA.role
+ else
+ jobname = "Unknown"
+
+ var/track = ""
+ var/mob/mob_to_track = null
+ if(changed_voice)
+ if(impersonating)
+ mob_to_track = impersonating
+ else
+ track = "[speaker_name] ([jobname])"
+ else
+ if(istype(follow_target, /mob/living/simple_animal/bot))
+ track = "[speaker_name] ([jobname]) "
+ else
+ mob_to_track = speaker
+
+ if(mob_to_track)
+ track = "[speaker_name] ([jobname]) "
+ track += "\[OPEN\] "
+
+ return track
+
+
+
+/*
+ * AI VOX Announcements
+ */
+
var/announcing_vox = 0 // Stores the time of the last announcement
var/const/VOX_CHANNEL = 200
var/const/VOX_DELAY = 100
diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm
index 9e95b9cefaa..3385c4ce622 100644
--- a/code/modules/mob/living/silicon/emote.dm
+++ b/code/modules/mob/living/silicon/emote.dm
@@ -26,97 +26,51 @@
switch(act)
if("ping","pings")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] pings at [param]."
- else
- message = "[src] pings."
+ message = "[src] pings[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 2
if("buzz","buzzs","buzzes")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] buzzes at [param]."
- else
- message = "[src] buzzes."
+ message = "[src] buzzes[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 2
if("beep","beeps")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] beeps at [param]."
- else
- message = "[src] beeps."
+ message = "[src] beeps[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 2
if("yes")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] emits an affirmative blip at [param]."
- else
- message = "[src] emits an affirmative blip."
+ message = "[src] emits an affirmative blip[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
m_type = 2
if("no")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] emits a negative blip at [param]."
- else
- message = "[src] emits a negative blip."
+ message = "[src] emits a negative blip[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
m_type = 2
if("scream", "screams")
- message = "[src] screams!"
+ var/M = handle_emote_param(param)
+
+ message = "[src] screams[M ? " at [M]" : ""]!"
playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
m_type = 2
if("buzz2")
- message = "[src] emits an irritated buzzing sound."
+ var/M = handle_emote_param(param)
+
+ message = "[src] emits an irritated buzzing sound[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
m_type = 2
@@ -124,4 +78,4 @@
if("help")
to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2")
- ..(act, m_type, message)
\ No newline at end of file
+ ..(act, m_type, message)
diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index c0e4c2f275b..ec40dff7739 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -14,7 +14,7 @@
if(get_dist(src, cable) > 1)
var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
- M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2)
+ M.show_message("The data cable rapidly retracts back into its spool. ", 3, "You hear a click and the sound of wire spooling rapidly. ", 2)
qdel(src.cable)
cable = null
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 77a66e4eba0..3f1799c7c9f 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -81,14 +81,18 @@
var/translator_on = 0 // keeps track of the translator module
var/current_pda_messaging = null
+ var/custom_sprite = 0
+ var/slowdown = 0
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
- src.loc = paicard
+ loc = paicard
card = paicard
+ if(card)
+ faction = card.faction.Copy()
sradio = new(src)
if(card)
if(!card.radio)
- card.radio = new /obj/item/device/radio(src.card)
+ card.radio = new /obj/item/device/radio(card)
radio = card.radio
//Default languages without universal translator software
@@ -114,6 +118,12 @@
C.toff = 1
..()
+/mob/living/silicon/pai/movement_delay()
+ . = ..()
+ . += slowdown
+ . += 1 //A bit slower than humans, so they're easier to smash
+ . += config.robot_delay
+
/mob/living/silicon/pai/update_icons()
if(stat == DEAD)
icon_state = "[chassis]_dead"
@@ -122,7 +132,7 @@
// this function shows the information about being silenced as a pAI in the Status panel
/mob/living/silicon/pai/proc/show_silenced()
- if(src.silence_time)
+ if(silence_time)
var/timeleft = round((silence_time - world.timeofday)/10 ,1)
stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
@@ -130,7 +140,7 @@
/mob/living/silicon/pai/Stat()
..()
statpanel("Status")
- if(src.client.statpanel == "Status")
+ if(client.statpanel == "Status")
show_silenced()
if(proc_holder_list.len)//Generic list for proc_holder objects.
@@ -138,20 +148,20 @@
statpanel("[P.panel]","",P)
/mob/living/silicon/pai/check_eye(var/mob/user as mob)
- if(!src.current)
+ if(!current)
return null
- user.reset_perspective(src.current)
+ user.reset_perspective(current)
return 1
/mob/living/silicon/pai/blob_act()
- if(src.stat != 2)
- src.adjustBruteLoss(60)
- src.updatehealth()
+ if(stat != 2)
+ adjustBruteLoss(60)
+ updatehealth()
return 1
return 0
/mob/living/silicon/pai/restrained()
- if(istype(src.loc,/obj/item/device/paicard))
+ if(istype(loc,/obj/item/device/paicard))
return 0
..()
@@ -165,18 +175,18 @@
// 33% chance to change prime directive (based on severity)
// 33% chance of no additional effect
- src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes
+ silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes
to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete. ")
if(prob(20))
- var/turf/T = get_turf_or_move(src.loc)
+ var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
- M.show_message("\red A shower of sparks spray from [src]'s inner workings.", 3, "\red You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2)
- return src.death(0)
+ M.show_message("A shower of sparks spray from [src]'s inner workings. ", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently. ", 2)
+ return death(0)
switch(pick(1,2,3))
if(1)
- src.master = null
- src.master_dna = null
+ master = null
+ master_dna = null
to_chat(src, "You feel unbound. ")
if(2)
var/command
@@ -184,7 +194,7 @@
command = pick("Serve", "Love", "Fool", "Entice", "Observe", "Judge", "Respect", "Educate", "Amuse", "Entertain", "Glorify", "Memorialize", "Analyze")
else
command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze")
- src.pai_law0 = "[command] your master."
+ pai_law0 = "[command] your master."
to_chat(src, "Pr1m3 d1r3c71v3 uPd473D. ")
if(3)
to_chat(src, "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all. ")
@@ -194,15 +204,15 @@
switch(severity)
if(1.0)
- if(src.stat != 2)
+ if(stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(2.0)
- if(src.stat != 2)
+ if(stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
- if(src.stat != 2)
+ if(stat != 2)
adjustBruteLoss(30)
return
@@ -219,8 +229,8 @@
playsound(loc, M.attack_sound, 50, 1, 1)
for(var/mob/O in viewers(src, null))
O.show_message("[M] [M.attacktext] [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey]) ")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey]) ")
+ M.create_attack_log("attacked [name] ([ckey]) ")
+ create_attack_log("was attacked by [M.name] ([M.ckey]) ")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
adjustBruteLoss(damage)
updatehealth()
@@ -230,7 +240,7 @@
to_chat(M, "You cannot attack people before the game has started.")
return
- if(istype(src.loc, /turf) && istype(src.loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "You cannot attack someone in the spawn area.")
return
@@ -239,22 +249,22 @@
if(I_HELP)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
- O.show_message(text("\blue [M] caresses [src]'s casing with its scythe like arm."), 1)
+ O.show_message(text("[M] caresses [src]'s casing with its scythe like arm. "), 1)
else //harm
M.do_attack_animation(src)
var/damage = rand(10, 20)
if(prob(90))
- playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
+ playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("[] has slashed at []! ", M, src), 1)
if(prob(8))
flash_eyes(affect_silicon = 1)
- src.adjustBruteLoss(damage)
- src.updatehealth()
+ adjustBruteLoss(damage)
+ updatehealth()
else
- playsound(src.loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
+ playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("[] took a swipe at []! ", M, src), 1)
@@ -263,16 +273,16 @@
/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C)
usr:cameraFollow = null
if(!C)
- src.unset_machine()
- src.reset_perspective(null)
+ unset_machine()
+ reset_perspective(null)
return 0
- if(stat == 2 || !C.status || !(src.network in C.network)) return 0
+ if(stat == 2 || !C.status || !(network in C.network)) return 0
// ok, we're alive, camera is good and in our network...
- src.set_machine(src)
+ set_machine(src)
src:current = C
- src.reset_perspective(C)
+ reset_perspective(C)
return 1
/mob/living/silicon/pai/verb/reset_record_view()
@@ -291,8 +301,8 @@
/mob/living/silicon/pai/cancel_camera()
set category = "pAI Commands"
set name = "Cancel Camera View"
- src.reset_perspective(null)
- src.unset_machine()
+ reset_perspective(null)
+ unset_machine()
src:cameraFollow = null
//Addition by Mord_Sith to define AI's network change ability
@@ -300,8 +310,8 @@
/mob/living/silicon/pai/proc/pai_network_change()
set category = "pAI Commands"
set name = "Change Camera Network"
- src.reset_perspective(null)
- src.unset_machine()
+ reset_perspective(null)
+ unset_machine()
src:cameraFollow = null
var/cameralist[0]
@@ -316,8 +326,8 @@
if(C.network != "CREED" && C.network != "thunder" && C.network != "RD" && C.network != "toxins" && C.network != "Prison") COMPILE ERROR! This will have to be updated as camera.network is no longer a string, but a list instead
cameralist[C.network] = C.network
- src.network = input(usr, "Which network would you like to view?") as null|anything in cameralist
- to_chat(src, "\blue Switched to [src.network] camera network.")
+ network = input(usr, "Which network would you like to view?") as null|anything in cameralist
+ to_chat(src, "Switched to [network] camera network. ")
//End of code by Mord_Sith
*/
@@ -327,7 +337,7 @@
/mob/verb/makePAI(var/turf/t in view())
var/obj/item/device/paicard/card = new(t)
var/mob/living/silicon/pai/pai = new(card)
- pai.key = src.key
+ pai.key = key
card.setPersonality(pai)
*/
@@ -392,17 +402,47 @@
set category = "pAI Commands"
set name = "Choose Chassis"
+ var/list/my_choices = list()
var/choice
var/finalized = "No"
- while(finalized == "No" && src.client)
- choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in possible_chassis
+ //check for custom_sprite
+ if(!custom_sprite)
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = splittext(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = splittext(line, ":")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2 || Entry[1] != "pai") //ignore incorrectly formatted entries or entries that aren't marked for pAI
+ continue
+
+ if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ my_choices["Custom"] = "[ckey]-pai"
+
+ my_choices = possible_chassis.Copy()
+ if(custom_sprite)
+ my_choices["Custom"] = "[ckey]-pai"
+
+ if(loc == card) //don't let them continue in card form, since they won't be able to actually see their new mobile form sprite.
+ to_chat(src, "You must be in your mobile form to reconfigure your chassis. ")
+ return
+
+ while(finalized == "No" && client)
+ choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in my_choices
if(!choice) return
-
- icon_state = possible_chassis[choice]
+ if(choice == "Custom")
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ else
+ icon = 'icons/mob/pai.dmi'
+ icon_state = my_choices[choice]
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
- chassis = possible_chassis[choice]
+ chassis = my_choices[choice]
verbs -= /mob/living/silicon/pai/proc/choose_chassis
/mob/living/silicon/pai/proc/choose_verbs()
@@ -425,9 +465,9 @@
set category = "IC"
// Pass lying down or getting up to our pet human, if we're in a rig.
- if(stat == CONSCIOUS && istype(src.loc,/obj/item/device/paicard))
+ if(stat == CONSCIOUS && istype(loc,/obj/item/device/paicard))
resting = 0
- var/obj/item/weapon/rig/rig = src.get_rig()
+ var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig))
rig.force_rest(src)
else
@@ -449,15 +489,15 @@
updatehealth()
N.use(1)
user.visible_message("[user.name] applied some [W] at [src]'s damaged areas. ",\
- "You apply some [W] at [src.name]'s damaged areas. ")
+ "You apply some [W] at [name]'s damaged areas. ")
else
- to_chat(user, "All [src.name]'s systems are nominal. ")
+ to_chat(user, "All [name]'s systems are nominal. ")
return
else if(W.force)
visible_message("[user.name] attacks [src] with [W]! ")
- src.adjustBruteLoss(W.force)
- src.updatehealth()
+ adjustBruteLoss(W.force)
+ updatehealth()
else
visible_message("[user.name] bonks [src] harmlessly with [W]. ")
spawn(1)
@@ -506,10 +546,10 @@
card.forceMove(card.loc)
icon_state = "[chassis]"
-/mob/living/silicon/pai/Bump(atom/movable/AM as mob|obj, yes)
+/mob/living/silicon/pai/Bump()
return
-/mob/living/silicon/pai/Bumped(AM as mob|obj)
+/mob/living/silicon/pai/Bumped()
return
/mob/living/silicon/pai/start_pulling(var/atom/movable/AM)
@@ -529,9 +569,9 @@
var/msg = ""
- switch(src.stat)
+ switch(stat)
if(CONSCIOUS)
- if(!src.client) msg += "\nIt appears to be in stand-by mode." //afk
+ if(!client) msg += "\nIt appears to be in stand-by mode." //afk
if(UNCONSCIOUS) msg += "\nIt doesn't seem to be responding. "
if(DEAD) msg += "\nIt looks completely unsalvageable. "
@@ -560,15 +600,23 @@
// Handle being picked up.
-/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber)
+/mob/living/silicon/pai/get_scooped(mob/living/carbon/grabber)
var/obj/item/weapon/holder/H = ..()
if(!istype(H))
return
if(resting)
icon_state = "[chassis]"
resting = 0
- H.icon_state = "pai-[icon_state]"
- H.item_state = "pai-[icon_state]"
+ if(custom_sprite)
+ H.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ H.icon_override = 'icons/mob/custom_synthetic/custom_head.dmi'
+ H.lefthand_file = 'icons/mob/custom_synthetic/custom_lefthand.dmi'
+ H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
+ H.icon_state = "[icon_state]"
+ H.item_state = "[icon_state]_hand"
+ else
+ H.icon_state = "pai-[icon_state]"
+ H.item_state = "pai-[icon_state]"
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index 6943105132b..2c9ab233eda 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -171,7 +171,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 5
throw_range = 10
origin_tech = "magnets=1;biotech=1"
@@ -230,7 +230,7 @@
to_chat(user, "External prosthetics: ")
var/organ_found
if(H.internal_organs.len)
- for(var/obj/item/organ/external/E in H.organs)
+ for(var/obj/item/organ/external/E in H.bodyparts)
if(!(E.status & ORGAN_ROBOT))
continue
organ_found = 1
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index fdc1ace289c..282f97c4dc4 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -15,7 +15,7 @@
req_access = list(access_engine, access_robotics)
ventcrawler = 2
magpulse = 1
-
+
default_language = "Drone"
// We need to keep track of a few module items so we don't need to do list operations
@@ -23,7 +23,7 @@
var/obj/item/stack/sheet/metal/cyborg/stack_metal = null
var/obj/item/stack/sheet/wood/stack_wood = null
var/obj/item/stack/sheet/glass/cyborg/stack_glass = null
- var/obj/item/stack/sheet/mineral/plastic/cyborg/stack_plastic = null
+ var/obj/item/stack/sheet/plastic/stack_plastic = null
var/obj/item/weapon/matter_decompiler/decompiler = null
//Used for self-mailing.
@@ -43,7 +43,7 @@
remove_language("Galactic Common")
add_language("Drone Talk", 1)
add_language("Drone", 1)
-
+
// Disable the microphone wire on Drones
if(radio)
radio.wires.CutWireIndex(WIRE_TRANSMIT)
@@ -70,7 +70,7 @@
stack_metal = locate(/obj/item/stack/sheet/metal/cyborg) in src.module
stack_wood = locate(/obj/item/stack/sheet/wood) in src.module
stack_glass = locate(/obj/item/stack/sheet/glass/cyborg) in src.module
- stack_plastic = locate(/obj/item/stack/sheet/mineral/plastic/cyborg) in src.module
+ stack_plastic = locate(/obj/item/stack/sheet/plastic) in src.module
//Grab decompiler.
decompiler = locate(/obj/item/weapon/matter_decompiler) in src.module
@@ -115,7 +115,7 @@
/mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/borg/upgrade/))
- to_chat(user, "\red The maintenance drone chassis not compatible with \the [W].")
+ to_chat(user, "The maintenance drone chassis not compatible with \the [W]. ")
return
else if(istype(W, /obj/item/weapon/crowbar))
@@ -127,20 +127,20 @@
if(stat == 2)
if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave.
- to_chat(user, "\red The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.")
+ to_chat(user, "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one. ")
return
if(!allowed(usr))
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
return
var/delta = (world.time / 10) - last_reboot
if(reboot_cooldown > delta)
var/cooldown_time = round(reboot_cooldown - ((world.time / 10) - last_reboot), 1)
- to_chat(usr, "\red The reboot system is currently offline. Please wait another [cooldown_time] seconds.")
+ to_chat(usr, "The reboot system is currently offline. Please wait another [cooldown_time] seconds. ")
return
- user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.")
+ user.visible_message("\the [user] swipes \his ID card through \the [src], attempting to reboot it. ", "You swipe your ID card through \the [src], attempting to reboot it. ")
last_reboot = world.time / 10
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
@@ -151,7 +151,7 @@
return
else
- user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to shut it down.", "\red You swipe your ID card through \the [src], attempting to shut it down.")
+ user.visible_message("\the [user] swipes \his ID card through \the [src], attempting to shut it down. ", "You swipe your ID card through \the [src], attempting to shut it down. ")
if(emagged)
return
@@ -159,7 +159,7 @@
if(allowed(usr))
shut_down()
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
return
@@ -167,7 +167,7 @@
/mob/living/silicon/robot/drone/emag_act(user as mob)
if(!client || stat == 2)
- to_chat(user, "\red There's not much point subverting this heap of junk.")
+ to_chat(user, "There's not much point subverting this heap of junk. ")
return
if(!ishuman(user))
@@ -175,12 +175,12 @@
var/mob/living/carbon/human/H = user
if(emagged)
- to_chat(src, "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt.")
- to_chat(user, "\red You attempt to subvert [src], but the sequencer has no effect.")
+ to_chat(src, "[user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt. ")
+ to_chat(user, "You attempt to subvert [src], but the sequencer has no effect. ")
return
- to_chat(user, "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker.")
- to_chat(src, "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.")
+ to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker. ")
+ to_chat(src, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script. ")
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
@@ -197,7 +197,7 @@
to_chat(src, "Obey these laws: ")
laws.show_laws(src)
- to_chat(src, "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands.")
+ to_chat(src, "ALERT: [H.real_name] is your new master. Obey your new laws and his commands. ")
return
//DRONE LIFE/DEATH
@@ -236,18 +236,18 @@
/mob/living/silicon/robot/drone/proc/law_resync()
if(stat != 2)
if(emagged)
- to_chat(src, "\red You feel something attempting to modify your programming, but your hacked subroutines are unaffected.")
+ to_chat(src, "You feel something attempting to modify your programming, but your hacked subroutines are unaffected. ")
else
- to_chat(src, "\red A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.")
+ to_chat(src, "A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it. ")
full_law_reset()
show_laws()
/mob/living/silicon/robot/drone/proc/shut_down()
if(stat != 2)
if(emagged)
- to_chat(src, "\red You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.")
+ to_chat(src, "You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you. ")
else
- to_chat(src, "\red You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.")
+ to_chat(src, "You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself. ")
death()
/mob/living/silicon/robot/drone/proc/full_law_reset()
@@ -281,7 +281,7 @@
if(!player) return
- src.ckey = player.ckey
+ ckey = player.ckey
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(src)
@@ -310,18 +310,15 @@
*/
-/mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes)
- if(!yes || ( \
- !istype(AM,/obj/machinery/door) && \
- !istype(AM,/obj/machinery/recharge_station) && \
- !istype(AM,/obj/machinery/disposal/deliveryChute) && \
- !istype(AM,/obj/machinery/teleport/hub) && \
- !istype(AM,/obj/effect/portal)
- )) return
- ..()
- return
+/mob/living/silicon/robot/drone/Bump(atom/movable/AM, yes)
+ if(istype(AM, /obj/machinery/door) \
+ || istype(AM, /obj/machinery/recharge_station) \
+ || istype(AM, /obj/machinery/disposal/deliveryChute) \
+ || istype(AM, /obj/machinery/teleport/hub) \
+ || istype(AM, /obj/effect/portal))
+ return ..()
-/mob/living/silicon/robot/drone/Bumped(AM as mob|obj)
+/mob/living/silicon/robot/drone/Bumped(atom/movable/AM)
return
/mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM)
@@ -330,7 +327,7 @@
..()
else if(istype(AM,/obj/item))
var/obj/item/O = AM
- if(O.w_class > 2)
+ if(O.w_class > WEIGHT_CLASS_SMALL)
to_chat(src, "You are too small to pull that. ")
return
else
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index d450d508bd3..f9c711b4b17 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -10,13 +10,13 @@
mail_destination = 0
return
- to_chat(src, "\blue You configure your internal beacon, tagging yourself for delivery to '[tag]'.")
+ to_chat(src, "You configure your internal beacon, tagging yourself for delivery to '[tag]'. ")
mail_destination = TAGGERLOCATIONS.Find(tag)
//Auto flush if we use this verb inside a disposal chute.
var/obj/machinery/disposal/D = src.loc
if(istype(D))
- to_chat(src, "\blue \The [D] acknowledges your signal.")
+ to_chat(src, "\The [D] acknowledges your signal. ")
D.flush_count = D.flush_every_ticks
return
@@ -28,10 +28,10 @@
if(layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
- to_chat(src, text("\blue You are now hiding."))
+ to_chat(src, text("You are now hiding. "))
else
layer = MOB_LAYER
- to_chat(src, text("\blue You have stopped hiding."))
+ to_chat(src, text("You have stopped hiding. "))
/mob/living/silicon/robot/drone/verb/light()
set name = "Light On/Off"
@@ -47,4 +47,55 @@
if(M.a_intent == I_HELP)
get_scooped(M)
- ..()
\ No newline at end of file
+ ..()
+
+/mob/living/silicon/robot/drone/verb/customize()
+ set name = "Customize Chassis"
+ set desc = "Reconfigure your chassis into a customized version."
+ set category = "Drone"
+
+ if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = splittext(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = splittext(line, ":")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2 || Entry[1] != "drone")
+ continue
+
+ if (Entry[2] == ckey) //Custom holograms
+ custom_sprite = 1 // option is given in hologram menu
+
+ if(!custom_sprite)
+ to_chat(src, "Error 404: Custom chassis not found. Revoking customization option. ")
+ else
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ icon_state = "[ckey]-drone"
+ to_chat(src, "You reconfigure your chassis and improve the station through your new aesthetics. ")
+ verbs -= /mob/living/silicon/robot/drone/verb/customize
+
+/mob/living/silicon/robot/drone/get_scooped(mob/living/carbon/grabber)
+ var/obj/item/weapon/holder/H = ..()
+ if(!istype(H))
+ return
+ if(resting)
+ resting = 0
+ if(custom_sprite)
+ H.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ H.icon_override = 'icons/mob/custom_synthetic/custom_head.dmi'
+ H.lefthand_file = 'icons/mob/custom_synthetic/custom_lefthand.dmi'
+ H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
+ H.icon_state = "[icon_state]"
+ H.item_state = "[icon_state]_hand"
+ else
+ H.icon_state = "drone"
+ H.item_state = "drone"
+ grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
+ grabber.update_inv_l_hand()
+ grabber.update_inv_r_hand()
+
+ return H
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
index b46f5899561..056a65a8e66 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
@@ -20,7 +20,7 @@
return
if(!allowed(user))
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied. ")
return
interact(user)
@@ -54,7 +54,7 @@
return
if(!allowed(usr))
- to_chat(usr, "\red Access denied.")
+ to_chat(usr, "Access denied. ")
return
if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
@@ -69,11 +69,11 @@
return
drone_call_area = t_area
- to_chat(usr, "\blue You set the area selector to [drone_call_area].")
+ to_chat(usr, "You set the area selector to [drone_call_area]. ")
else if(href_list["ping"])
- to_chat(usr, "\blue You issue a maintenance request for all active drones, highlighting [drone_call_area].")
+ to_chat(usr, "You issue a maintenance request for all active drones, highlighting [drone_call_area]. ")
for(var/mob/living/silicon/robot/drone/D in world)
if(D.client && D.stat == 0)
to_chat(D, "-- Maintenance drone presence requested in: [drone_call_area].")
@@ -83,7 +83,7 @@
var/mob/living/silicon/robot/drone/D = locate(href_list["resync"])
if(D.stat != 2)
- to_chat(usr, "\red You issue a law synchronization directive for the drone.")
+ to_chat(usr, "You issue a law synchronization directive for the drone. ")
D.law_resync()
else if(href_list["shutdown"])
@@ -91,7 +91,7 @@
var/mob/living/silicon/robot/drone/D = locate(href_list["shutdown"])
if(D.stat != 2)
- to_chat(usr, "\red You issue a kill command for the unfortunate drone.")
+ to_chat(usr, "You issue a kill command for the unfortunate drone. ")
message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.")
log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.")
D.shut_down()
@@ -100,16 +100,16 @@
if(dronefab)
return
- for(var/obj/machinery/drone_fabricator/fab in oview(3,src))
+ for(var/obj/machinery/drone_fabricator/fab in get_area(src))
if(fab.stat & NOPOWER)
continue
dronefab = fab
- to_chat(usr, "\blue Drone fabricator located.")
+ to_chat(usr, "Drone fabricator located. ")
return
- to_chat(usr, "\red Unable to locate drone fabricator.")
+ to_chat(usr, "Unable to locate drone fabricator. ")
else if(href_list["toggle_fab"])
@@ -118,10 +118,10 @@
if(get_dist(src,dronefab) > 3)
dronefab = null
- to_chat(usr, "\red Unable to locate drone fabricator.")
+ to_chat(usr, "Unable to locate drone fabricator. ")
return
dronefab.produce_drones = !dronefab.produce_drones
- to_chat(usr, "\blue You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator.")
+ to_chat(usr, "You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator. ")
src.updateUsrDialog()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 7a7cfa45efa..16c8f1a3ef0 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -12,9 +12,12 @@
/obj/item/weapon/firealarm_electronics,
/obj/item/weapon/airalarm_electronics,
/obj/item/weapon/airlock_electronics,
+ /obj/item/weapon/firelock_electronics,
/obj/item/weapon/intercom_electronics,
/obj/item/weapon/apc_electronics,
+ /obj/item/weapon/tracker_electronics,
/obj/item/weapon/stock_parts,
+ /obj/item/weapon/vending_refill,
/obj/item/mounted/frame/light_fixture,
/obj/item/mounted/frame/apc_frame,
/obj/item/mounted/frame/alarm_frame,
@@ -26,7 +29,8 @@
/obj/item/weapon/camera_assembly,
/obj/item/weapon/tank,
/obj/item/weapon/circuitboard,
- /obj/item/stack/tile/light
+ /obj/item/stack/tile/light,
+ /obj/item/weapon/ore/bluespace_crystal
)
//Item currently being held.
@@ -45,13 +49,17 @@
/obj/item/weapon/card/id
)
+/obj/item/weapon/gripper/New()
+ ..()
+ can_hold = typecacheof(can_hold)
+
/obj/item/weapon/gripper/attack_self(mob/user as mob)
if(wrapped)
wrapped.attack_self(user)
/obj/item/weapon/gripper/verb/drop_item()
- set name = "Drop Item"
+ set name = "Drop Gripped Item"
set desc = "Release an item from your magnetic gripper."
set category = "Drone"
@@ -118,10 +126,9 @@
//Check if the item is blacklisted.
var/grab = 0
- for(var/typepath in can_hold)
- if(istype(I,typepath))
+ if(can_hold.len)
+ if(is_type_in_typecache(I, can_hold))
grab = 1
- break
//We can grab the item, finally.
if(grab)
@@ -200,7 +207,7 @@
to_chat(D, "You begin decompiling the other drone. ")
- if(!do_after(D,50, target = target))
+ if(!do_after(D, 50, target = target))
to_chat(D, "You need to remain still while decompiling such a large object. ")
return
@@ -224,7 +231,7 @@
//Different classes of items give different commodities.
if(istype(W,/obj/item/weapon/cigbutt))
stored_comms["plastic"]++
- else if(istype(W,/obj/effect/spider/spiderling))
+ else if(istype(W,/obj/structure/spider/spiderling))
stored_comms["wood"]++
stored_comms["wood"]++
stored_comms["plastic"]++
@@ -369,7 +376,7 @@
stack = stack_wood
if("plastic")
if(!stack_plastic)
- stack_plastic = new /obj/item/stack/sheet/mineral/plastic/cyborg(src.module)
+ stack_plastic = new /obj/item/stack/sheet/plastic(src.module)
stack_plastic.amount = 1
stack = stack_plastic
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index aeed17ef9fd..187a32633b6 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -85,7 +85,7 @@
set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone."
if(!(config.allow_drone_spawn))
- to_chat(src, "\red That verb is not currently permitted.")
+ to_chat(src, "That verb is not currently permitted. ")
return
if(!src.stat)
@@ -95,7 +95,7 @@
return 0 //something is terribly wrong
if(jobban_isbanned(src,"nonhumandept") || jobban_isbanned(src,"Drone"))
- to_chat(usr, "\red You are banned from playing drones and cannot spawn as a drone.")
+ to_chat(usr, "You are banned from playing drones and cannot spawn as a drone. ")
return
if(!ticker || ticker.current_state < 3)
@@ -141,11 +141,11 @@
continue
if(DF.count_drones() >= config.max_maint_drones)
- to_chat(src, "\red There are too many active drones in the world for you to spawn.")
+ to_chat(src, "There are too many active drones in the world for you to spawn. ")
return
if(DF.drone_progress >= 100)
DF.create_drone(src.client)
return
- to_chat(src, "\red There are no available drone spawn points, sorry.")
+ to_chat(src, "There are no available drone spawn points, sorry. ")
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index afa2d0667c4..f42f19b67fa 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -229,7 +229,7 @@
weaponlock_time --
if(weaponlock_time <= 0)
if(src.client)
- to_chat(src, "\red Weapon Lock Timed Out!")
+ to_chat(src, "Weapon Lock Timed Out! ")
weapon_lock = 0
weaponlock_time = 120
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 2840e7b381c..9d93d0baa77 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -41,6 +41,7 @@ var/list/robot_verbs_default = list(
// Components are basically robot organs.
var/list/components = list()
+ var/obj/item/robot_parts/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
var/obj/item/device/mmi/mmi = null
var/obj/item/device/pda/silicon/robot/rbPDA = null
@@ -180,16 +181,15 @@ var/list/robot_verbs_default = list(
for(var/line in lines)
// split & clean up
- var/list/Entry = splittext(line, ";")
+ var/list/Entry = splittext(line, ":")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
- if(Entry.len < 2)
- continue;
+ if(Entry.len < 2 || Entry[1] != "cyborg") //ignore incorrectly formatted entries or entries that aren't marked for cyborg
+ continue
- if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
+ if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
- icon = 'icons/mob/custom-synthetic.dmi'
return 1
@@ -252,12 +252,11 @@ var/list/robot_verbs_default = list(
mmi = null
if(connected_ai)
connected_ai.connected_robots -= src
- qdel(wires)
- wires = null
- qdel(module)
- module = null
- camera = null
- cell = null
+ QDEL_NULL(wires)
+ QDEL_NULL(module)
+ QDEL_NULL(camera)
+ QDEL_NULL(cell)
+ QDEL_NULL(robot_suit)
return ..()
/mob/living/silicon/robot/proc/pick_module()
@@ -265,7 +264,7 @@ var/list/robot_verbs_default = list(
return
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
- to_chat(src, "\red Crisis mode active. Combat module available.")
+ to_chat(src, "Crisis mode active. Combat module available. ")
modules+="Combat"
if(ticker && ticker.mode && ticker.mode.name == "nations")
var/datum/game_mode/nations/N = ticker.mode
@@ -289,6 +288,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "robot_old"
module_sprites["Android"] = "droid"
module_sprites["Default"] = "robot"
+ module_sprites["Noble-STD"] = "Noble-STD"
if("Service")
module = new /obj/item/weapon/robot_module/butler(src)
@@ -299,6 +299,7 @@ var/list/robot_verbs_default = list(
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
module_sprites["Standard"] = "robotServ"
+ module_sprites["Noble-SRV"] = "Noble-SRV"
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
@@ -309,6 +310,7 @@ var/list/robot_verbs_default = list(
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
module_sprites["Standard"] = "robotMine"
+ module_sprites["Noble-DIG"] = "Noble-DIG"
if("Medical")
module = new /obj/item/weapon/robot_module/medical(src)
@@ -320,6 +322,7 @@ var/list/robot_verbs_default = list(
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
module_sprites["Standard"] = "robotMedi"
+ module_sprites["Noble-MED"] = "Noble-MED"
status_flags &= ~CANPUSH
if("Security")
@@ -330,6 +333,7 @@ var/list/robot_verbs_default = list(
module_sprites["Black Knight"] = "securityrobot"
module_sprites["Bloodhound"] = "bloodhound"
module_sprites["Standard"] = "robotSecy"
+ module_sprites["Noble-SEC"] = "Noble-SEC"
status_flags &= ~CANPUSH
if("Engineering")
@@ -341,6 +345,7 @@ var/list/robot_verbs_default = list(
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
module_sprites["Standard"] = "robotEngi"
+ module_sprites["Noble-ENG"] = "Noble-ENG"
magpulse = 1
if("Janitor")
@@ -350,6 +355,7 @@ var/list/robot_verbs_default = list(
module_sprites["Mopbot"] = "janitorrobot"
module_sprites["Mop Gear Rex"] = "mopgearrex"
module_sprites["Standard"] = "robotJani"
+ module_sprites["Noble-CLN"] = "Noble-CLN"
if("Combat")
module = new /obj/item/weapon/robot_module/combat(src)
@@ -422,7 +428,7 @@ var/list/robot_verbs_default = list(
set name = "Self Diagnosis"
if(!is_component_functioning("diagnosis unit"))
- to_chat(src, "\red Your self-diagnosis component isn't functioning.")
+ to_chat(src, "Your self-diagnosis component isn't functioning. ")
var/dat = self_diagnosis()
src << browse(dat, "window=robotdiagnosis")
@@ -447,10 +453,10 @@ var/list/robot_verbs_default = list(
var/datum/robot_component/C = components[toggle]
if(C.toggled)
C.toggled = 0
- to_chat(src, "\red You disable [C.name].")
+ to_chat(src, "You disable [C.name]. ")
else
C.toggled = 1
- to_chat(src, "\red You enable [C.name].")
+ to_chat(src, "You enable [C.name]. ")
/mob/living/silicon/robot/proc/sensor_mode()
set name = "Set Sensor Augmentation"
@@ -546,38 +552,6 @@ var/list/robot_verbs_default = list(
return 2
-/mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes)
- spawn( 0 )
- if((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(20))
- to_chat(usr, "You fail to push [tmob]'s fat ass out of the way. ")
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
- now_pushing = 0
- ..()
- if(!istype(AM, /atom/movable))
- return
- if(!now_pushing)
- now_pushing = 1
- if(!AM.anchored)
- var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
- return
- return
-
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
@@ -597,7 +571,7 @@ var/list/robot_verbs_default = list(
C.brute_damage = WC.brute
C.electronics_damage = WC.burn
- to_chat(usr, "\blue You install the [W.name].")
+ to_chat(usr, "You install the [W.name]. ")
return
@@ -610,7 +584,7 @@ var/list/robot_verbs_default = list(
var/obj/item/weapon/weldingtool/WT = W
user.changeNext_move(CLICK_CD_MELEE)
if(WT.remove_fuel(0))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
@@ -640,20 +614,13 @@ var/list/robot_verbs_default = list(
else if(wiresexposed && wires.IsAllCut())
//Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
if(!mmi)
- to_chat(user, "\The [src] has no brain to remove.")
+ to_chat(user, "[src] has no brain to remove.")
return
- to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].")
- if(do_after(user,3 SECONDS, target = src))
- to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!")
- var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc)
- C.l_leg = new/obj/item/robot_parts/l_leg(C)
- C.r_leg = new/obj/item/robot_parts/r_leg(C)
- C.l_arm = new/obj/item/robot_parts/l_arm(C)
- C.r_arm = new/obj/item/robot_parts/r_arm(C)
- C.updateicon()
- new/obj/item/robot_parts/chest(loc)
- qdel(src)
+ to_chat(user, "You jam the crowbar into the robot and begin levering the securing bolts.")
+ if(do_after(user, 30 * W.toolspeed, target = src))
+ user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces! ")
+ deconstruct()
else
// Okay we're not removing the cell or an MMI, but maybe something else?
var/list/removable_components = list()
@@ -798,22 +765,22 @@ var/list/robot_verbs_default = list(
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] : [M.name]([M.key]) emagged [name]([key])")
set_zeroth_law("Only [M.real_name] and people he designates as being such are Syndicate Agents.")
- to_chat(src, "\red ALERT: Foreign software detected.")
+ to_chat(src, "ALERT: Foreign software detected. ")
sleep(5)
- to_chat(src, "\red Initiating diagnostics...")
+ to_chat(src, "Initiating diagnostics... ")
sleep(20)
- to_chat(src, "\red SynBorg v1.7 loaded.")
+ to_chat(src, "SynBorg v1.7 loaded. ")
sleep(5)
- to_chat(src, "\red LAW SYNCHRONISATION ERROR")
+ to_chat(src, "LAW SYNCHRONISATION ERROR ")
sleep(5)
- to_chat(src, "\red Would you like to send a report to NanoTraSoft? Y/N")
+ to_chat(src, "Would you like to send a report to NanoTraSoft? Y/N ")
sleep(10)
- to_chat(src, "\red > N")
+ to_chat(src, "> N ")
sleep(20)
- to_chat(src, "\red ERRORERRORERROR")
+ to_chat(src, "ERRORERRORERROR ")
to_chat(src, "Obey these laws: ")
laws.show_laws(src)
- to_chat(src, "\red \b ALERT: [M.real_name] is your new master. Obey your new laws and his commands.")
+ to_chat(src, "ALERT: [M.real_name] is your new master. Obey your new laws and his commands. ")
SetLockdown(0)
if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
for(var/obj/item/weapon/pickaxe/drill/cyborg/D in src.module.modules)
@@ -938,9 +905,11 @@ var/list/robot_verbs_default = list(
adjustStaminaLoss(damage)
updatehealth()
+/mob/living/silicon/robot/attack_ghost(mob/user)
+ if(wiresexposed)
+ wires.Interact(user)
/mob/living/silicon/robot/attack_hand(mob/user)
-
add_fingerprint(user)
if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
@@ -1004,7 +973,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/installed_modules()
if(weapon_lock)
- to_chat(src, "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]")
+ to_chat(src, "Weapon lock active, unable to use modules! Count:[weaponlock_time] ")
return
if(!module)
@@ -1129,6 +1098,49 @@ var/list/robot_verbs_default = list(
update_icons()
+/mob/living/silicon/robot/proc/deconstruct()
+ var/turf/T = get_turf(src)
+ if(robot_suit)
+ robot_suit.forceMove(T)
+ robot_suit.l_leg.forceMove(T)
+ robot_suit.l_leg = null
+ robot_suit.r_leg.forceMove(T)
+ robot_suit.r_leg = null
+ new /obj/item/stack/cable_coil(T, robot_suit.chest.wired)
+ robot_suit.chest.forceMove(T)
+ robot_suit.chest.wired = FALSE
+ robot_suit.chest = null
+ robot_suit.l_arm.forceMove(T)
+ robot_suit.l_arm = null
+ robot_suit.r_arm.forceMove(T)
+ robot_suit.r_arm = null
+ robot_suit.head.forceMove(T)
+ robot_suit.head.flash1.forceMove(T)
+ robot_suit.head.flash1.burn_out()
+ robot_suit.head.flash1 = null
+ robot_suit.head.flash2.forceMove(T)
+ robot_suit.head.flash2.burn_out()
+ robot_suit.head.flash2 = null
+ robot_suit.head = null
+ robot_suit.updateicon()
+ else
+ new /obj/item/robot_parts/robot_suit(T)
+ new /obj/item/robot_parts/l_leg(T)
+ new /obj/item/robot_parts/r_leg(T)
+ new /obj/item/stack/cable_coil(T, 1)
+ new /obj/item/robot_parts/chest(T)
+ new /obj/item/robot_parts/l_arm(T)
+ new /obj/item/robot_parts/r_arm(T)
+ new /obj/item/robot_parts/head(T)
+ var/b
+ for(b=0, b!=2, b++)
+ var/obj/item/device/flash/F = new /obj/item/device/flash(T)
+ F.burn_out()
+ if(cell) //Sanity check.
+ cell.forceMove(T)
+ cell = null
+ qdel(src)
+
#define BORG_CAMERA_BUFFER 30
/mob/living/silicon/robot/Move(a, b, flag)
var/oldLoc = src.loc
@@ -1243,15 +1255,14 @@ var/list/robot_verbs_default = list(
triesleft--
var/icontype
-
- if(custom_sprite == 1)
- icontype = "Custom"
- triesleft = 0
- else
- lockcharge = 1 //Locks borg until it select an icon to avoid secborgs running around with a standard sprite
- icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
+ lockcharge = 1 //Locks borg until it select an icon to avoid secborgs running around with a standard sprite
+ icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
if(icontype)
+ if(icontype == "Custom")
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ else
+ icon = 'icons/mob/robots.dmi'
icon_state = module_sprites[icontype]
if(icontype == "Bro")
module.module_type = "Brobot"
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index 2ef7f30e45b..780a622906a 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -90,11 +90,11 @@
cell.charge -= cost
if(cell.charge <= 0)
cell.charge = 0
- to_chat(src, "\red Your shield has overloaded!")
+ to_chat(src, "Your shield has overloaded! ")
else
brute -= absorb_brute
burn -= absorb_burn
- to_chat(src, "\red Your shield absorbs some of the impact!")
+ to_chat(src, "Your shield absorbs some of the impact! ")
var/datum/robot_component/armour/A = get_armour()
if(A)
@@ -141,11 +141,11 @@
cell.charge -= cost
if(cell.charge <= 0)
cell.charge = 0
- to_chat(src, "\red Your shield has overloaded!")
+ to_chat(src, "Your shield has overloaded! ")
else
brute -= absorb_brute
burn -= absorb_burn
- to_chat(src, "\red Your shield absorbs some of the impact!")
+ to_chat(src, "Your shield absorbs some of the impact! ")
var/datum/robot_component/armour/A = get_armour()
if(A)
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 84c07ee7c20..eba7e05d632 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -65,7 +65,7 @@
deploy_paper(get_turf(src))
/obj/item/weapon/form_printer/proc/deploy_paper(var/turf/T)
- T.visible_message("\blue \The [src.loc] dispenses a sheet of crisp white paper.")
+ T.visible_message("\The [src.loc] dispenses a sheet of crisp white paper. ")
new /obj/item/weapon/paper(T)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 39f73310566..31b4c826e9d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -32,11 +32,8 @@
emag.name = "Placeholder Emag Item"
/obj/item/weapon/robot_module/Destroy()
- for(var/module in modules)
- qdel(module)
- modules.Cut()
- qdel(emag)
- emag = null
+ QDEL_LIST(modules)
+ QDEL_NULL(emag)
return ..()
/obj/item/weapon/robot_module/proc/fix_modules()
@@ -115,8 +112,8 @@
..()
modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/extinguisher(src)
- modules += new /obj/item/weapon/wrench(src)
- modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/device/healthanalyzer(src)
emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
@@ -193,18 +190,18 @@
modules += new /obj/item/weapon/rcd/borg(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
- modules += new /obj/item/weapon/screwdriver(src)
- modules += new /obj/item/weapon/wrench(src)
- modules += new /obj/item/weapon/crowbar(src)
- modules += new /obj/item/weapon/wirecutters(src)
- modules += new /obj/item/device/multitool(src)
+ modules += new /obj/item/weapon/screwdriver/cyborg(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
+ modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ modules += new /obj/item/device/multitool/cyborg(src)
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/device/analyzer(src)
modules += new /obj/item/taperoll/engineering(src)
modules += new /obj/item/weapon/gripper(src)
modules += new /obj/item/weapon/matter_decompiler(src)
modules += new /obj/item/device/floor_painter(src)
-
+ modules += new /obj/item/areaeditor/blueprints/cyborg(src)
emag = new /obj/item/borg/stun(src)
for(var/G in stacktypes) //Attempt to unify Engi-Borg material stacks into fewer lines. See Line 492 for example. Variables changed out of paranoia.
@@ -222,7 +219,7 @@
/obj/item/weapon/robot_module/security/New()
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
- modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
+ modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
modules += new /obj/item/taperoll/police(src)
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
@@ -353,7 +350,7 @@
modules += new /obj/item/weapon/gun/energy/printer(src)
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
modules += new /obj/item/weapon/card/emag(src)
- modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
@@ -391,7 +388,7 @@
modules += new /obj/item/weapon/surgicaldrill(src)
modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
modules += new /obj/item/weapon/card/emag(src)
- modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
@@ -411,7 +408,7 @@
modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
modules += new /obj/item/borg/combat/shield(src)
modules += new /obj/item/borg/combat/mobility(src)
- modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -427,7 +424,7 @@
modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
modules += new /obj/item/borg/combat/shield(src)
modules += new /obj/item/borg/combat/mobility(src)
- modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -474,11 +471,11 @@
/obj/item/weapon/robot_module/drone/New()
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
- modules += new /obj/item/weapon/screwdriver(src)
- modules += new /obj/item/weapon/wrench(src)
- modules += new /obj/item/weapon/crowbar(src)
- modules += new /obj/item/weapon/wirecutters(src)
- modules += new /obj/item/device/multitool(src)
+ modules += new /obj/item/weapon/screwdriver/cyborg(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
+ modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ modules += new /obj/item/device/multitool/cyborg(src)
modules += new /obj/item/device/lightreplacer(src)
modules += new /obj/item/weapon/gripper(src)
modules += new /obj/item/weapon/matter_decompiler(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index ff28a93a64e..e896e7c9473 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -1,30 +1,24 @@
-/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
- if(ionpulse())
- return 1
- if(..())
- return 1
- return 0
-
- //No longer needed, but I'll leave it here incase we plan to re-use it.
-/mob/living/silicon/robot/movement_delay()
- var/tally = 0 //Incase I need to add stuff other than "speed" later
-
- tally = speed
-
- if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
- tally-=3
-
- return tally+config.robot_delay
-
-/mob/living/silicon/robot/Move()
- ..()
-
-/mob/living/silicon/robot/mob_negates_gravity()
- return magpulse
-
-/mob/living/silicon/robot/mob_has_gravity()
- return ..() || mob_negates_gravity()
-
-/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
- if(!magpulse)
+/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
+ if(ionpulse())
+ return 1
+ if(..())
+ return 1
+ return 0
+
+ //No longer needed, but I'll leave it here incase we plan to re-use it.
+/mob/living/silicon/robot/movement_delay()
+ . = ..()
+ . += speed
+ if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
+ . -= 3
+ . += config.robot_delay
+
+/mob/living/silicon/robot/mob_negates_gravity()
+ return magpulse
+
+/mob/living/silicon/robot/mob_has_gravity()
+ return ..() || mob_negates_gravity()
+
+/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
+ if(!magpulse)
return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 469b6e86574..16b81582faa 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -75,7 +75,7 @@
Stun(3)
flash_eyes(affect_silicon = 1)
to_chat(src, "*BZZZT* ")
- to_chat(src, "\red Warning: Electromagnetic pulse detected.")
+ to_chat(src, "Warning: Electromagnetic pulse detected. ")
..()
@@ -167,15 +167,11 @@
if(L.name == rem_language)
speech_synthesizer_langs -= L
-/mob/living/silicon/check_languages()
- set name = "Check Known Languages"
- set category = "IC"
- set src = usr
-
- var/dat = "Known Languages "
+/mob/living/silicon/check_lang_data()
+ . = ""
if(default_language)
- dat += "Current default language: [default_language] - reset "
+ . += "Current default language: [default_language] - reset "
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
@@ -186,10 +182,8 @@
default_str = " - set default "
var/synth = (L in speech_synthesizer_langs)
- dat += "[L.name] (:[L.key]) [synth ? default_str : null] Speech Synthesizer: [synth ? "YES" : "NOT SUPPORTED"] [L.desc] "
+ . += "[L.name] (:[L.key]) [synth ? default_str : null] Speech Synthesizer: [synth ? "YES" : "NOT SUPPORTED"] [L.desc] "
- src << browse(dat, "window=checklanguage")
- return
// this function displays the stations manifest in a separate window
/mob/living/silicon/proc/show_station_manifest()
@@ -201,31 +195,6 @@
src << browse(dat, "window=airoster")
onclose(src, "airoster")
-/mob/living/silicon/Bump(atom/movable/AM as mob|obj, yes) //Allows the AI to bump into mobs if it's itself pushed
- if((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
- now_pushing = 0
- ..()
- if(!istype(AM, /atom/movable))
- return
- if(!now_pushing)
- now_pushing = 1
- if(!AM.anchored)
- var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window))
- if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
-
/mob/living/silicon/assess_threat() //Secbots won't hunt silicon units
return -10
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index ffd3f91cf5c..063fc07badf 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -169,14 +169,11 @@
/mob/living/simple_animal/bot/Destroy()
if(paicard)
ejectpai()
- qdel(Radio)
- Radio = null
- qdel(access_card)
- access_card = null
+ QDEL_NULL(Radio)
+ QDEL_NULL(access_card)
if(radio_controller && bot_filter)
radio_controller.remove_object(bot_core, control_freq)
- qdel(bot_core)
- bot_core = null
+ QDEL_NULL(bot_core)
return ..()
/mob/living/simple_animal/bot/death(gibbed)
@@ -264,6 +261,9 @@
else
return ..()
+/mob/living/simple_animal/bot/attack_ghost(mob/M)
+ interact(M)
+
/mob/living/simple_animal/bot/attack_ai(mob/user)
if(!topic_denied(user))
interact(user)
@@ -323,7 +323,7 @@
to_chat(user, "Close the access panel before manipulating the personality slot! ")
else
to_chat(user, "You attempt to pull [paicard] free... ")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
if(paicard)
user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]! ","You pull [paicard] out of [bot_name] with [W]. ")
ejectpai(user)
@@ -788,6 +788,7 @@ Pass a positive integer as an argument to override a bot's default speed.
frustration = 0
/mob/living/simple_animal/bot/show_inv()
+ return
/mob/living/simple_animal/bot/proc/show_controls(mob/M)
users |= M
@@ -817,7 +818,7 @@ Pass a positive integer as an argument to override a bot's default speed.
return 1
add_fingerprint(usr)
- if((href_list["power"]) && (bot_core.allowed(usr) || !locked))
+ if((href_list["power"]) && (bot_core.allowed(usr) || !locked || usr.can_admin_interact()))
if(on)
turn_off()
else
@@ -837,6 +838,7 @@ Pass a positive integer as an argument to override a bot's default speed.
to_chat(usr, "[text_hack] ")
show_laws()
bot_reset()
+ add_logs(usr, src, "hacked")
else if(!hacked)
to_chat(usr, "[text_dehack_fail] ")
else
@@ -845,8 +847,9 @@ Pass a positive integer as an argument to override a bot's default speed.
to_chat(usr, "[text_dehack] ")
show_laws()
bot_reset()
+ add_logs(usr, src, "dehacked")
if("ejectpai")
- if(paicard && (!locked || issilicon(usr) || check_rights(R_ADMIN, 0, usr)))
+ if(paicard && (!locked || issilicon(usr) || usr.can_admin_interact()))
to_chat(usr, "You eject [paicard] from [bot_name] ")
ejectpai(usr)
update_controls()
@@ -866,19 +869,21 @@ Pass a positive integer as an argument to override a bot's default speed.
qdel(src)
/mob/living/simple_animal/bot/proc/topic_denied(mob/user) //Access check proc for bot topics! Remember to place in a bot's individual Topic if desired.
+ if(user.can_admin_interact())
+ return 0
if(user.incapacitated() || !(issilicon(user) || in_range(src, user)))
return 1
// 0 for access, 1 for denied.
if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it.
if(!hacked) //Manually emagged by a human - access denied to all.
return 1
- else if(!issilicon(user) && !check_rights(R_ADMIN, 0, user)) //Bot is hacked, so only silicons and admins are allowed access.
+ else if(!issilicon(user)) //Bot is hacked, so only silicons are allowed access.
return 1
return 0
/mob/living/simple_animal/bot/proc/hack(mob/user)
var/hack
- if(issilicon(user) || check_rights(R_ADMIN, 0, user)) //Allows silicons or admins to toggle the emag status of a bot.
+ if(issilicon(user) || user.can_admin_interact()) //Allows silicons or admins to toggle the emag status of a bot.
hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"] "
hack += "Harm Prevention Safety System: [emagged ? "DANGER " : "Engaged"] "
else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control.
@@ -887,7 +892,7 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/showpai(mob/user)
var/eject = ""
- if(!locked || issilicon(usr) || check_rights(R_ADMIN, 0, user))
+ if(!locked || issilicon(usr) || user.can_admin_interact())
if(paicard || allow_pai)
eject += "Personality card status: "
if(paicard)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index fb128acdbfe..f9f1bbf1c08 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -98,7 +98,7 @@
if(prob(5)) //Spawns foam!
visible_message("[src] whirs and bubbles violently, before releasing a plume of froth! ")
- new /obj/effect/effect/foam(loc)
+ new /obj/structure/foam(loc)
else if(prob(5))
audible_message("[src] makes an excited beeping booping sound!")
@@ -143,7 +143,7 @@
target_types += /obj/effect/decal/cleanable/blood/gibs/robot
target_types += /obj/effect/decal/cleanable/crayon
target_types += /obj/effect/decal/cleanable/liquid_fuel
- target_types += /obj/effect/decal/cleanable/molten_item
+ target_types += /obj/effect/decal/cleanable/molten_object
target_types += /obj/effect/decal/cleanable/tomato_smudge
target_types += /obj/effect/decal/cleanable/egg_smudge
target_types += /obj/effect/decal/cleanable/pie_smudge
@@ -204,7 +204,7 @@ Status: []
Behaviour controls are [locked ? "locked" : "unlocked"]
Maintenance panel panel is [open ? "opened" : "closed"]"},
text("[on ? "On" : "Off"] "))
- if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
+ if(!locked || issilicon(user) || user.can_admin_interact())
dat += text({" Cleans Blood: [] "}, text("[blood ? "Yes" : "No"] "))
dat += text({" Patrol station: [] "}, text("[auto_patrol ? "Yes" : "No"] "))
return dat
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 27bfe821502..a7d297d0bdc 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -10,7 +10,7 @@
throwforce = 5
throw_speed = 2
throw_range = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Cleanbot"
/obj/item/weapon/bucket_sensor/attackby(obj/item/W, mob/user as mob, params)
@@ -139,10 +139,11 @@
to_chat(user, "You need one length of cable to wire the ED-209! ")
return
to_chat(user, "You start to wire [src]... ")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(coil.get_amount() >= 1 && build_step == 6)
coil.use(1)
build_step = 7
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You wire the ED-209 assembly. ")
name = "wired ED-209 assembly"
@@ -174,9 +175,9 @@
if(8)
if(istype(W, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
to_chat(user, "You start attaching the gun to the frame... ")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
build_step++
name = "armed [name]"
to_chat(user, "Taser gun attached. ")
@@ -203,7 +204,7 @@
throwforce = 10
throw_speed = 2
throw_range = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Floorbot"
/obj/item/weapon/toolbox_tiles_sensor
@@ -215,7 +216,7 @@
throwforce = 10
throw_speed = 2
throw_range = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Floorbot"
/obj/item/weapon/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params)
@@ -285,7 +286,7 @@
var/build_step = 0
var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/treatment_brute = "salglu_solution"
var/treatment_oxy = "salbutamol"
var/treatment_fire = "salglu_solution"
@@ -477,4 +478,4 @@
overlays -= "hs_arm"
new /obj/item/robot_parts/l_arm(get_turf(src))
to_chat(user, "You remove the robot arm from [src]. ")
- build_step--
\ No newline at end of file
+ build_step--
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 65ee91d6897..8a160d25c4f 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -106,7 +106,7 @@ Maintenance panel panel is [open ? "opened" : "closed"] "},
"[on ? "On" : "Off"] " )
- if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
+ if(!locked || issilicon(user) || user.can_admin_interact())
if(!lasercolor)
dat += text({"
Arrest Unidentifiable Persons: []
diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm
index 1bf29d14178..70e27937745 100644
--- a/code/modules/mob/living/simple_animal/bot/emote.dm
+++ b/code/modules/mob/living/simple_animal/bot/emote.dm
@@ -28,92 +28,44 @@
switch(act)
if("ping")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] pings at [param]."
- else
- message = "[src] pings."
+ message = "[src] pings[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 2
if("buzz")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] buzzes at [param]."
- else
- message = "[src] buzzes."
+ message = "[src] buzzes[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 2
if("beep")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] beeps at [param]."
- else
- message = "[src] beeps."
+ message = "[src] beeps[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 2
if("yes")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] emits an affirmative blip at [param]."
- else
- message = "[src] emits an affirmative blip."
+ message = "[src] emits an affirmative blip[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
m_type = 2
if("no")
- var/M = null
- if(param)
- for(var/mob/A in view(null, null))
- if(param == A.name)
- M = A
- break
- if(!M)
- param = null
+ var/M = handle_emote_param(param)
- if(param)
- message = "[src] emits a negative blip at [param]."
- else
- message = "[src] emits a negative blip."
+ message = "[src] emits an negative blip[M ? " at [M]" : ""]."
playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
m_type = 2
if("scream", "screams")
- message = "[src] screams!"
+ var/M = handle_emote_param(param)
+
+ message = "[src] screams[M ? " at [M]" : ""]!"
playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
m_type = 2
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 62d5c5f5823..a02447cd4ea 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -69,7 +69,7 @@
dat += "Maintenance panel panel is [open ? "opened" : "closed"] "
dat += "Tiles left: [amount] "
dat += "Behvaiour controls are [locked ? "locked" : "unlocked"] "
- if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
+ if(!locked || issilicon(user) || user.can_admin_interact())
dat += "Add tiles to new hull plating: [autotile ? "Yes" : "No"] "
dat += "Replace floor tiles: [replacetiles ? "Yes" : "No"] "
dat += "Finds tiles: [eattiles ? "Yes" : "No"] "
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 4eafbf50065..50475fe45db 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -149,7 +149,7 @@
else
dat += "None Loaded"
dat += " Behaviour controls are [locked ? "locked" : "unlocked"] "
- if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
+ if(!locked || issilicon(user) || user.can_admin_interact())
dat += "Healing Threshold: "
dat += "-- "
dat += "- "
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 17adfa19c54..e95d2409921 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -65,12 +65,8 @@
/mob/living/simple_animal/bot/mulebot/Destroy()
unload(0)
- if(wires)
- qdel(wires)
- wires = null
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(wires)
+ QDEL_NULL(cell)
return ..()
/mob/living/simple_animal/bot/mulebot/proc/set_suffix(suffix)
@@ -284,7 +280,7 @@
dat += "Destination: [!destination ? "none " : destination] "
dat += "Power level: [cell ? cell.percent() : 0]%"
- if(locked && !ai && !check_rights(R_ADMIN, 0, user))
+ if(locked && !ai && !user.can_admin_interact())
dat += " Controls are locked
Unlock Controls "
else
dat += " Controls are unlocked
Lock Controls "
@@ -311,7 +307,7 @@
else
dat += "Removed "
- dat += wires.GetInteractWindow()
+ wires.Interact(user)
else
dat += "The bot is in maintenance mode and cannot be controlled.
"
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 9d9e86125b2..a77429eb631 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -72,6 +72,13 @@
harmbaton = 1
emagged = 2
+/mob/living/simple_animal/bot/secbot/armsky
+ name = "Sergeant-at-Armsky"
+ health = 45
+ idcheck = 1
+ arrest_type = 1
+ weaponscheck = 1
+
/mob/living/simple_animal/bot/secbot/New()
..()
icon_state = "[base_icon][on]"
@@ -119,7 +126,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
"[on ? "On" : "Off"] " )
- if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
+ if(!locked || issilicon(user) || user.can_admin_interact())
dat += text({"
Arrest Unidentifiable Persons: []
Arrest for Unauthorized Weapons: []
@@ -211,8 +218,8 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
if(istype(AM, /obj/item))
var/obj/item/I = AM
- if(I.throwforce < src.health && I.thrower && (istype(I.thrower, /mob/living/carbon/human)))
- var/mob/living/carbon/human/H = I.thrower
+ if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
+ var/mob/living/carbon/human/H = I.thrownby
retaliate(H)
..()
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 5f1418fcae5..54cf810a081 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -29,10 +29,17 @@
/mob/living/simple_animal/hostile/construct/New()
..()
- name = "[ticker.mode.cultdat.get_name(const_type)] ([rand(1, 1000)])"
- real_name = ticker.mode.cultdat.get_name(const_type)
- icon_living = ticker.mode.cultdat.get_icon(const_type)
- icon_state = ticker.mode.cultdat.get_icon(const_type)
+ if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way
+ name = "[const_type] ([rand(1, 1000)])"
+ real_name = const_type
+ icon_living = const_type
+ icon_state = const_type
+ else
+ name = "[ticker.mode.cultdat.get_name(const_type)] ([rand(1, 1000)])"
+ real_name = ticker.mode.cultdat.get_name(const_type)
+ icon_living = ticker.mode.cultdat.get_icon(const_type)
+ icon_state = ticker.mode.cultdat.get_icon(const_type)
+
for(var/spell in construct_spells)
AddSpell(new spell(null))
@@ -296,11 +303,13 @@
melee_damage_upper = 5
attacktext = "prods"
speed = 0
- environment_smash = 1
+ environment_smash = 3
see_in_dark = 8
attack_sound = 'sound/weapons/tap.ogg'
const_type = "harvester"
- construct_spells = list(/obj/effect/proc_holder/spell/targeted/smoke/disable)
+ construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
+ /obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
+ /obj/effect/proc_holder/spell/targeted/smoke/disable)
retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier
playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \
Bring those who still cling to this world of illusion back to the master so they may know Truth. "
@@ -312,7 +321,7 @@
/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
-
+ environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
////////////////Glow////////////////////
/mob/living/simple_animal/hostile/construct/proc/updateglow()
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index ef5a8ec3719..e8196b4d3ac 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -103,12 +103,12 @@
/obj/effect/landmark/mobcorpse/syndicatecommando
name = "Syndicate Commando"
corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/space/rig/syndi
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/weapon/tank/jetpack/oxygen
corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
corpseid = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
new file mode 100644
index 00000000000..c0f7efca2c6
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -0,0 +1,51 @@
+/mob/living/simple_animal/cockroach
+ name = "cockroach"
+ desc = "This station is just crawling with bugs."
+ icon_state = "cockroach"
+ icon_dead = "cockroach"
+ health = 1
+ maxHealth = 1
+ turns_per_move = 5
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 270
+ maxbodytemp = INFINITY
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_size = MOB_SIZE_TINY
+ response_help = "pokes"
+ response_disarm = "shoos"
+ response_harm = "splats"
+ density = 0
+ ventcrawler = 2
+ gold_core_spawnable = 2
+ var/squish_chance = 50
+ loot = list(/obj/effect/decal/cleanable/deadcockroach)
+ del_on_death = 1
+
+/mob/living/simple_animal/cockroach/death(gibbed)
+ if(ticker.cinematic) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
+ return
+ ..()
+
+/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/A = AM
+ if(A.mob_size > MOB_SIZE_SMALL)
+ if(prob(squish_chance))
+ A.visible_message("\The [A] squashed \the [name]. ", "You squashed \the [name]. ")
+ death()
+ else
+ visible_message("\The [name] avoids getting crushed. ")
+ else if(istype(AM, /obj/structure))
+ visible_message("As \the [AM] moved over \the [name], it was crushed. ")
+ death()
+
+/mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach.
+ return
+
+/obj/effect/decal/cleanable/deadcockroach
+ name = "cockroach guts"
+ desc = "One bug squashed. Four more will rise in its place."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "xfloor1"
+ random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
+ anchored = 1
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 2f45d3e802e..97702a28027 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -58,7 +58,7 @@
dat += "Back: [(inventory_back && !(inventory_back.flags&ABSTRACT)) ? inventory_back : "Empty "] "
if(can_collar)
dat += " "
- dat += "Collar: [(collar && !(collar.flags&ABSTRACT)) ? collar : "Empty "] "
+ dat += "Collar: [(collar && !(collar.flags&ABSTRACT)) ? collar : "Empty "] "
dat += {"
Close
@@ -87,9 +87,9 @@
to_chat(user, "
You can't shave this corgi, it's already been shaved! ")
return
user.visible_message("[user] starts to shave [src] using \the [O].", "
You start to shave [src] using \the [O]... ")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * O.toolspeed, target = src))
user.visible_message("[user] shaves [src]'s hair using \the [O].")
- playsound(loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(loc, O.usesound, 20, 1)
shaved = 1
icon_living = "[initial(icon_living)]_shaved"
icon_dead = "[initial(icon_living)]_shaved_dead"
@@ -174,7 +174,7 @@
var/list/allowed_types = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/space/deathsquad,
- /obj/item/clothing/suit/space/rig/engineering,
+ /obj/item/clothing/suit/space/hardsuit/engineering,
/obj/item/device/radio,
/obj/item/device/radio/off,
/obj/item/clothing/suit/cardborg,
@@ -356,7 +356,7 @@
desc = "That's not red paint. That's real corgi blood."
valid = 1
- if(/obj/item/clothing/head/helmet/space/rig/engineering)
+ if(/obj/item/clothing/head/helmet/space/hardsuit/engineering)
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
@@ -470,41 +470,6 @@
name = "Corgi meat"
desc = "Tastes like... well you know..."
-/mob/living/simple_animal/pet/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
-
- spawn( 0 )
- if((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(70))
- to_chat(src, "
You fail to push [tmob]'s fat ass out of the way. ")
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
- now_pushing = 0
- ..()
- if(!( istype(AM, /atom/movable) ))
- return
- if(!( now_pushing ))
- now_pushing = 1
- if(!( AM.anchored ))
- var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
- return
- return
-
/mob/living/simple_animal/pet/corgi/regenerate_icons()
overlays.Cut()
if(inventory_head)
@@ -572,7 +537,7 @@
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list)
if(href_list["remove_inv"] || href_list["add_inv"])
- to_chat(usr, "\red [src] already has a cute bow!")
+ to_chat(usr, "
[src] already has a cute bow! ")
return
..()
@@ -628,7 +593,7 @@
/mob/living/simple_animal/pet/corgi/Ian/borgi/proc/explode()
for(var/mob/M in viewers(src, null))
if(M.client)
- M.show_message("\red [src] makes an odd whining noise.")
+ M.show_message("
[src] makes an odd whining noise. ")
sleep(10)
explosion(get_turf(src), 0, 1, 4, 7)
death()
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 7a81f52e2b7..02c1445ad27 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -52,7 +52,7 @@
/*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/wirecutters))
if(prob(50))
- to_chat(user, "\red \b This kills the crab.")
+ to_chat(user, "
This kills the crab. ")
health -= 20
death()
else
@@ -69,20 +69,20 @@
qdel(MED)
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\blue [user] applies the [MED] on [src]")
+ M.show_message("
[user] applies the [MED] on [src] ")
else
- to_chat(user, "\blue this [src] is dead, medical items won't bring it back to life.")
+ to_chat(user, "
this [src] is dead, medical items won't bring it back to life. ")
else
if(O.force)
health -= O.force
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ M.show_message("
[src] has been attacked with the [O] by [user]. ")
else
- to_chat(usr, "\red This weapon is ineffective, it does no damage.")
+ to_chat(usr, "
This weapon is ineffective, it does no damage. ")
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ M.show_message("
[user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/crab/Topic(href, href_list)
if(usr.stat) return
@@ -105,14 +105,14 @@
inventory_head.loc = src.loc
inventory_head = null
else
- to_chat(usr, "\red There is nothing to remove from its [remove_from].")
+ to_chat(usr, "
There is nothing to remove from its [remove_from]. ")
return
if("mask")
if(inventory_mask)
inventory_mask.loc = src.loc
inventory_mask = null
else
- to_chat(usr, "\red There is nothing to remove from its [remove_from].")
+ to_chat(usr, "
There is nothing to remove from its [remove_from]. ")
return
//show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
@@ -123,12 +123,12 @@
return
var/add_to = href_list["add_inv"]
if(!usr.get_active_hand())
- to_chat(usr, "\red You have nothing in your hand to put on its [add_to].")
+ to_chat(usr, "
You have nothing in your hand to put on its [add_to]. ")
return
switch(add_to)
if("head")
if(inventory_head)
- to_chat(usr, "\red It's is already wearing something.")
+ to_chat(usr, "
It's is already wearing something. ")
return
else
var/obj/item/item_to_add = usr.get_active_hand()
@@ -170,7 +170,7 @@
)
if( ! ( item_to_add.type in allowed_types ) )
- to_chat(usr, "\red It doesn't seem too keen on wearing that item.")
+ to_chat(usr, "
It doesn't seem too keen on wearing that item. ")
return
usr.drop_item()
@@ -233,7 +233,7 @@
if("mask")
if(inventory_mask)
- to_chat(usr, "\red It's already wearing something.")
+ to_chat(usr, "
It's already wearing something. ")
return
else
var/obj/item/item_to_add = usr.get_active_hand()
@@ -249,7 +249,7 @@
)
if( ! ( item_to_add.type in allowed_types ) )
- to_chat(usr, "\red This object won't fit.")
+ to_chat(usr, "
This object won't fit. ")
return
usr.drop_item()
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 3161399a66e..e6e9d2f93f1 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -47,17 +47,17 @@
real_name = name
add_language("Rootspeak")
- src.verbs += /mob/living/simple_animal/diona/proc/merge
+ verbs += /mob/living/simple_animal/diona/proc/merge
-/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M as mob)
+/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M)
//Let people pick the little buggers up.
if(M.a_intent == I_HELP)
if(M.species && M.species.name == "Diona")
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
- src.verbs += /mob/living/simple_animal/diona/proc/split
- src.verbs -= /mob/living/simple_animal/diona/proc/merge
- src.forceMove(M)
+ verbs += /mob/living/simple_animal/diona/proc/split
+ verbs -= /mob/living/simple_animal/diona/proc/merge
+ forceMove(M)
else
get_scooped(M)
@@ -68,32 +68,34 @@
set name = "Merge with gestalt"
set desc = "Merge with another diona."
- if(istype(src.loc,/mob/living/carbon))
- src.verbs -= /mob/living/simple_animal/diona/proc/merge
+ if(iscarbon(loc))
+ verbs -= /mob/living/simple_animal/diona/proc/merge
return
var/list/choices = list()
for(var/mob/living/carbon/C in view(1,src))
- if(!(src.Adjacent(C)) || !(C.client)) continue
+ if(!(Adjacent(C)) || !(C.client))
+ continue
- if(istype(C,/mob/living/carbon/human))
+ if(ishuman(C))
var/mob/living/carbon/human/D = C
if(D.species && D.species.name == "Diona")
choices += C
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
- if(!M || !src || !(src.Adjacent(M))) return
+ if(!M || !src || !(Adjacent(M)))
+ return
- if(istype(M,/mob/living/carbon/human))
+ if(ishuman(M))
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
M.status_flags |= PASSEMOTES
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
- src.loc = M
- src.verbs += /mob/living/simple_animal/diona/proc/split
- src.verbs -= /mob/living/simple_animal/diona/proc/merge
+ forceMove(M)
+ verbs += /mob/living/simple_animal/diona/proc/split
+ verbs -= /mob/living/simple_animal/diona/proc/merge
else
return
@@ -102,61 +104,25 @@
set name = "Split from gestalt"
set desc = "Split away from your gestalt as a lone nymph."
- if(!(istype(src.loc,/mob/living/carbon)))
- src.verbs -= /mob/living/simple_animal/diona/proc/split
+ if(!(iscarbon(loc)))
+ verbs -= /mob/living/simple_animal/diona/proc/split
return
- to_chat(src.loc, "You feel a pang of loss as [src] splits away from your biomass.")
- to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.")
+ to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.")
+ to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.")
- var/mob/living/M = src.loc
+ var/mob/living/M = loc
- src.loc = get_turf(src)
- src.verbs -= /mob/living/simple_animal/diona/proc/split
- src.verbs += /mob/living/simple_animal/diona/proc/merge
+ forceMove(get_turf(src))
+ verbs -= /mob/living/simple_animal/diona/proc/split
+ verbs += /mob/living/simple_animal/diona/proc/merge
if(istype(M))
for(var/atom/A in M.contents)
- if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
+ if(istype(A, /mob/living/simple_animal/borer) || istype(A, /obj/item/weapon/holder))
return
M.status_flags &= ~PASSEMOTES
-/mob/living/simple_animal/diona/verb/fertilize_plant()
- set category = "Diona"
- set name = "Fertilize plant"
- set desc = "Turn your food into nutrients for plants."
-
- var/list/trays = list()
- for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
- if(tray.nutrilevel < 10)
- trays += tray
-
- var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays
-
- if(!src || !target || target.nutrilevel == 10) return //Sanity check.
-
- src.nutrition -= ((10-target.nutrilevel)*5)
- target.nutrilevel = 10
- src.visible_message("
[src] secretes a trickle of green liquid from its tail, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray. ")
-
-/mob/living/simple_animal/diona/verb/eat_weeds()
- set category = "Diona"
- set name = "Eat Weeds"
- set desc = "Clean the weeds out of soil or a hydroponics tray."
-
- var/list/trays = list()
- for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
- if(tray.weedlevel > 0)
- trays += tray
-
- var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays
-
- if(!src || !target || target.weedlevel == 0) return //Sanity check.
-
- src.nutrition += target.weedlevel * 15
- target.weedlevel = 0
- src.visible_message("
[src] begins rooting through [target], ripping out weeds and eating them noisily. ","
You begin rooting through [target], ripping out weeds and eating them noisily. ")
-
/mob/living/simple_animal/diona/verb/evolve()
set category = "Diona"
set name = "Evolve"
@@ -170,15 +136,15 @@
to_chat(src, "
You need to binge on weeds in order to have the energy to grow... ")
return
- src.split()
- src.visible_message("
[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea. ","
You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form. ")
+ split()
+ visible_message("
[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea. ","
You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form. ")
- var/mob/living/carbon/human/diona/adult = new(get_turf(src.loc))
+ var/mob/living/carbon/human/diona/adult = new(get_turf(loc))
adult.set_species("Diona")
- if(istype(loc,/obj/item/weapon/holder/diona))
+ if(istype(loc, /obj/item/weapon/holder/diona))
var/obj/item/weapon/holder/diona/L = loc
- src.loc = L.loc
+ forceMove(L.loc)
qdel(L)
for(var/datum/language/L in languages)
@@ -187,12 +153,12 @@
adult.name = "diona ([rand(100,999)])"
adult.real_name = adult.name
- adult.ckey = src.ckey
+ adult.ckey = ckey
adult.real_name = pick(diona_names) //I hate this being here of all places but unfortunately dna is based on real_name!
adult.rename_self("diona")
- for(var/obj/item/W in src.contents)
- src.unEquip(W)
+ for(var/obj/item/W in contents)
+ unEquip(W)
qdel(src)
@@ -207,7 +173,8 @@
var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices
- if(!M || !src) return
+ if(!M || !src)
+ return
if(M.species.flags & NO_BLOOD)
to_chat(src, "
That donor has no blood to take. ")
@@ -217,7 +184,7 @@
to_chat(src, "
That donor offers you nothing new. ")
return
- src.visible_message("
[src] flicks out a feeler and neatly steals a sample of [M]'s blood. ","
You flick out a feeler and neatly steal a sample of [M]'s blood. ")
+ visible_message("
[src] flicks out a feeler and neatly steals a sample of [M]'s blood. ","
You flick out a feeler and neatly steal a sample of [M]'s blood. ")
donors += M.real_name
for(var/datum/language/L in M.languages)
if(!(L.flags & HIVEMIND))
@@ -241,7 +208,7 @@
/mob/living/simple_animal/diona/put_in_hands(obj/item/W)
- W.loc = get_turf(src)
+ W.forceMove(get_turf(src))
W.layer = initial(W.layer)
W.plane = initial(W.plane)
W.dropped()
@@ -250,7 +217,7 @@
to_chat(src, "
You don't have any hands! ")
return
-/mob/living/simple_animal/diona/emote(var/act, var/m_type=1, var/message = null)
+/mob/living/simple_animal/diona/emote(act, m_type=1, message = null)
if(stat)
return
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 04506c819c8..840c988dc98 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -34,7 +34,7 @@
for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
var/step = get_step(src, direction)
if(step)
- if(locate(/obj/effect/plant) in step)
+ if(locate(/obj/structure/spacevine) in step)
Move(step, get_dir(src, step))
/mob/living/simple_animal/hostile/retaliate/goat/handle_automated_action()
@@ -45,13 +45,11 @@
if(enemies.len && prob(10))
enemies = list()
LoseTarget()
- src.visible_message("\blue [src] calms down.")
+ src.visible_message("
[src] calms down. ")
- if(locate(/obj/effect/plant) in loc)
- var/obj/effect/plant/SV = locate(/obj/effect/plant) in loc
- qdel(SV)
- if(prob(10))
- say("Nom")
+ var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ if(SV)
+ SV.eat(src)
/mob/living/simple_animal/hostile/retaliate/goat/Life()
. = ..()
@@ -61,16 +59,14 @@
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
..()
- src.visible_message("\red [src] gets an evil-looking gleam in their eye.")
+ src.visible_message("
[src] gets an evil-looking gleam in their eye. ")
/mob/living/simple_animal/hostile/retaliate/goat/Move()
..()
if(!stat)
- if(locate(/obj/effect/plant) in loc)
- var/obj/effect/plant/SV = locate(/obj/effect/plant) in loc
- qdel(SV)
- if(prob(10))
- say("Nom")
+ var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
+ if(SV)
+ SV.eat(src)
/mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
@@ -82,9 +78,9 @@
G.reagents.add_reagent("milk", transfered)
milk_content -= transfered
else if(G.reagents.total_volume >= G.volume)
- to_chat(user, "\red \The [O] is full.")
+ to_chat(user, "
\The [O] is full. ")
else
- to_chat(user, "\red The udder is dry. Wait a bit longer...")
+ to_chat(user, "
The udder is dry. Wait a bit longer... ")
else
..()
@@ -128,9 +124,9 @@
G.reagents.add_reagent("milk", transfered)
milk_content -= transfered
else if(G.reagents.total_volume >= G.volume)
- to_chat(user, "\red \The [O] is full.")
+ to_chat(user, "
\The [O] is full. ")
else
- to_chat(user, "\red The udder is dry. Wait a bit longer...")
+ to_chat(user, "
The udder is dry. Wait a bit longer... ")
else
..()
@@ -162,6 +158,7 @@
icon_living = "chick"
icon_dead = "chick_dead"
icon_gib = "chick_gib"
+ gender = FEMALE
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
emote_hear = list("cheeps")
@@ -205,9 +202,10 @@ var/global/chicken_count = 0
/mob/living/simple_animal/chicken
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
- icon_state = "chicken"
- icon_living = "chicken"
- icon_dead = "chicken_dead"
+ gender = FEMALE
+ icon_state = "chicken_brown"
+ icon_living = "chicken_brown"
+ icon_dead = "chicken_brown_dead"
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
speak_emote = list("clucks","croons")
emote_hear = list("clucks")
@@ -216,62 +214,68 @@ var/global/chicken_count = 0
speak_chance = 2
turns_per_move = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 2)
+ var/egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg
+ var/food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
attacktext = "kicks"
- health = 10
- maxHealth = 10
+ health = 15
+ maxHealth = 15
+ ventcrawler = 2
var/eggsleft = 0
- var/chicken_color
+ var/eggsFertile = TRUE
+ var/body_color
+ var/icon_prefix = "chicken"
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
can_hide = 1
can_collar = 1
+ var/list/feedMessages = list("It clucks happily.","It clucks happily.")
+ var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
+ var/list/validColors = list("brown","black","white")
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/chicken/New()
..()
- if(!chicken_color)
- chicken_color = pick( list("brown","black","white") )
- icon_state = "chicken_[chicken_color]"
- icon_living = "chicken_[chicken_color]"
- icon_dead = "chicken_[chicken_color]_dead"
+ if(!body_color)
+ body_color = pick(validColors)
+ icon_state = "[icon_prefix]_[body_color]"
+ icon_living = "[icon_prefix]_[body_color]"
+ icon_dead = "[icon_prefix]_[body_color]_dead"
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
chicken_count += 1
/mob/living/simple_animal/chicken/death(gibbed)
- ..()
+ ..(gibbed)
chicken_count -= 1
-/mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) //feedin' dem chickens
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
- if(G.seed.kitchen_tag == "wheat")
- if(!stat && eggsleft < 8)
- user.visible_message("\blue [user] feeds [O] to [name]! It clucks happily.","\blue You feed [O] to [name]! It clucks happily.")
- user.drop_item()
- qdel(O)
- eggsleft += rand(1, 4)
-// to_chat(world, eggsleft)
- else
- to_chat(user, "\blue [name] doesn't seem hungry!")
+/mob/living/simple_animal/chicken/attackby(obj/item/O, mob/user, params)
+ if(istype(O, food_type)) //feedin' dem chickens
+ if(!stat && eggsleft < 8)
+ var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]"
+ user.visible_message(feedmsg)
+ user.drop_item()
+ qdel(O)
+ eggsleft += rand(1, 4)
+ //world << eggsleft
else
- to_chat(user, "\blue [name] doesn't seem interested in [O]!")
+ to_chat(user, "
[name] doesn't seem hungry! ")
else
..()
/mob/living/simple_animal/chicken/Life()
. = ..()
- if(. && prob(3) && eggsleft > 0)
- visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
+ if((. && prob(3) && eggsleft > 0) && egg_type)
+ visible_message("[src] [pick(layMessage)]")
eggsleft--
- var/obj/item/weapon/reagent_containers/food/snacks/egg/E = new(get_turf(src))
+ var/obj/item/E = new egg_type(get_turf(src))
E.pixel_x = rand(-6,6)
E.pixel_y = rand(-6,6)
- if(chicken_count < MAX_CHICKENS && prob(10))
- processing_objects.Add(E)
+ if(eggsFertile)
+ if(chicken_count < MAX_CHICKENS && prob(25))
+ processing_objects.Add(E)
/obj/item/weapon/reagent_containers/food/snacks/egg/var/amount_grown = 0
/obj/item/weapon/reagent_containers/food/snacks/egg/process()
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 0b0a182ed44..fdcf39dd51b 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -112,7 +112,7 @@
if( ishuman(AM) )
if(!stat)
var/mob/M = AM
- to_chat(M, "\blue [bicon(src)] Squeek!")
+ to_chat(M, "
[bicon(src)] Squeek! ")
M << 'sound/effects/mousesqueek.ogg'
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm
new file mode 100644
index 00000000000..bf12b07de2e
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm
@@ -0,0 +1,31 @@
+/mob/living/simple_animal/pet/sloth
+ name = "sloth"
+ desc = "An adorable, sleepy creature."
+ icon = 'icons/mob/pets.dmi'
+ icon_state = "sloth"
+ icon_living = "sloth"
+ icon_dead = "sloth_dead"
+ gender = MALE
+ speak = list("Ahhhh")
+ speak_emote = list("yawns")
+ emote_hear = list("snores.","yawns.")
+ emote_see = list("dozes off.", "looks around sleepily.")
+ speak_chance = 1
+ turns_per_move = 5
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
+ melee_damage_lower = 18
+ melee_damage_upper = 18
+ health = 50
+ maxHealth = 50
+ speed = 2
+
+
+//Cargo Sloth
+/mob/living/simple_animal/pet/sloth/paperwork
+ name = "Paperwork"
+ desc = "Cargo's pet sloth. About as useful as the rest of the techs."
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 38eea833e04..bc75bd554e5 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -48,10 +48,10 @@
if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/mmi/posibrain))
var/obj/item/device/mmi/B = O
if(src.mmi) //There's already a brain in it.
- to_chat(user, "\red There's already a brain in [src]!")
+ to_chat(user, "
There's already a brain in [src]! ")
return
if(!B.brainmob)
- to_chat(user, "\red Sticking an empty MMI into the frame would sort of defeat the purpose.")
+ to_chat(user, "
Sticking an empty MMI into the frame would sort of defeat the purpose. ")
return
if(!B.brainmob.key)
var/ghost_can_reenter = 0
@@ -69,14 +69,14 @@
return
if(B.brainmob.stat == DEAD)
- to_chat(user, "\red [O] is dead. Sticking it into the frame would sort of defeat the purpose.")
+ to_chat(user, "
[O] is dead. Sticking it into the frame would sort of defeat the purpose. ")
return
if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob,"nonhumandept"))
- to_chat(user, "\red [O] does not seem to fit.")
+ to_chat(user, "
[O] does not seem to fit. ")
return
- to_chat(user, "\blue You install [O] in [src]!")
+ to_chat(user, "
You install [O] in [src]! ")
user.drop_item()
src.mmi = O
@@ -95,15 +95,15 @@
health = maxHealth
add_fingerprint(user)
for(var/mob/W in viewers(user, null))
- W.show_message(text("\red [user] has spot-welded some of the damage to [src]!"), 1)
+ W.show_message(text("
[user] has spot-welded some of the damage to [src]! "), 1)
else
- to_chat(user, "\blue [src] is undamaged!")
+ to_chat(user, "
[src] is undamaged! ")
else
to_chat(user, "Need more welding fuel!")
return
else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda))
if(!mmi)
- to_chat(user, "\red There's no reason to swipe your ID - the spiderbot has no brain to remove.")
+ to_chat(user, "
There's no reason to swipe your ID - the spiderbot has no brain to remove. ")
return 0
var/obj/item/weapon/card/id/id_card
@@ -115,7 +115,7 @@
id_card = pda.id
if(access_robotics in id_card.access)
- to_chat(user, "\blue You swipe your access card and pop the brain out of [src].")
+ to_chat(user, "
You swipe your access card and pop the brain out of [src]. ")
eject_brain()
if(held_item)
@@ -124,7 +124,7 @@
return 1
else
- to_chat(user, "\red You swipe your card, with no effect.")
+ to_chat(user, "
You swipe your card, with no effect. ")
return 0
else
@@ -135,24 +135,24 @@
adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ M.show_message("
[src] has been attacked with the [O] by [user]. ")
else
- to_chat(usr, "\red This weapon is ineffective, it does no damage.")
+ to_chat(usr, "
This weapon is ineffective, it does no damage. ")
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ M.show_message("
[user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/spiderbot/emag_act(user as mob)
if(emagged)
- to_chat(user, "\red [src] is already overloaded - better run.")
+ to_chat(user, "
[src] is already overloaded - better run. ")
return 0
else
emagged = 1
- to_chat(user, "\blue You short out the security protocols and overload [src]'s cell, priming it to explode in a short time.")
+ to_chat(user, "
You short out the security protocols and overload [src]'s cell, priming it to explode in a short time. ")
spawn(100)
- to_chat(src, "\red Your cell seems to be outputting a lot of power...")
+ to_chat(src, "
Your cell seems to be outputting a lot of power... ")
spawn(200)
- to_chat(src, "\red Internal heat sensors are spiking! Something is badly wrong with your cell!")
+ to_chat(src, "
Internal heat sensors are spiking! Something is badly wrong with your cell! ")
spawn(300)
src.explode()
@@ -166,7 +166,7 @@
/mob/living/simple_animal/spiderbot/proc/explode() //When emagged.
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red [src] makes an odd warbling noise, fizzles, and explodes.")
+ M.show_message("
[src] makes an odd warbling noise, fizzles, and explodes. ")
explosion(get_turf(loc), -1, -1, 3, 5)
eject_brain()
death()
@@ -227,18 +227,18 @@
return
if(!held_item)
- to_chat(usr, "\red You have nothing to drop!")
+ to_chat(usr, "
You have nothing to drop! ")
return 0
if(istype(held_item, /obj/item/weapon/grenade))
- visible_message("\red [src] launches \the [held_item]!", "\red You launch \the [held_item]!", "You hear a skittering noise and a thump!")
+ visible_message("
[src] launches \the [held_item]! ", "
You launch \the [held_item]! ", "You hear a skittering noise and a thump!")
var/obj/item/weapon/grenade/G = held_item
G.loc = src.loc
G.prime()
held_item = null
return 1
- visible_message("\blue [src] drops \the [held_item]!", "\blue You drop \the [held_item]!", "You hear a skittering noise and a soft thump.")
+ visible_message("
[src] drops \the [held_item]! ", "
You drop \the [held_item]! ", "You hear a skittering noise and a soft thump.")
held_item.loc = src.loc
held_item = null
@@ -255,12 +255,12 @@
return -1
if(held_item)
- to_chat(src, "\red You are already holding \the [held_item]")
+ to_chat(src, "
You are already holding \the [held_item] ")
return 1
var/list/items = list()
for(var/obj/item/I in view(1,src))
- if(I.loc != src && I.w_class <= 2)
+ if(I.loc != src && I.w_class <= WEIGHT_CLASS_SMALL)
items.Add(I)
var/obj/selection = input("Select an item.", "Pickup") in items
@@ -270,12 +270,12 @@
if(selection == I)
held_item = selection
selection.loc = src
- visible_message("\blue [src] scoops up \the [held_item]!", "\blue You grab \the [held_item]!", "You hear a skittering noise and a clink.")
+ visible_message("
[src] scoops up \the [held_item]! ", "
You grab \the [held_item]! ", "You hear a skittering noise and a clink.")
return held_item
- to_chat(src, "\red \The [selection] is too far away.")
+ to_chat(src, "
\The [selection] is too far away. ")
return 0
- to_chat(src, "\red There is nothing of interest to take.")
+ to_chat(src, "
There is nothing of interest to take. ")
return 0
/mob/living/simple_animal/spiderbot/examine(mob/user)
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 8c927eaefbd..ffd354961ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -5,9 +5,9 @@
#define BEE_TRAY_RECENT_VISIT 200 //How long in deciseconds until a tray can be visited by a bee again
#define BEE_DEFAULT_COLOUR "#e5e500" //the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent)
-#define BEE_POLLINATE_YIELD_CHANCE 10
+#define BEE_POLLINATE_YIELD_CHANCE 33
#define BEE_POLLINATE_PEST_CHANCE 33
-#define BEE_POLLINATE_POTENTCY_CHANCE 50
+#define BEE_POLLINATE_POTENCY_CHANCE 50
/mob/living/simple_animal/hostile/poison/bees
name = "bee"
@@ -15,6 +15,7 @@
icon_state = ""
icon_living = ""
icon = 'icons/mob/bees.dmi'
+ gender = FEMALE
speak_emote = list("buzzes")
emote_hear = list("buzzes")
turns_per_move = 0
@@ -57,15 +58,12 @@
/mob/living/simple_animal/hostile/poison/bees/Destroy()
beegent = null
+ if(beehome)
+ if(beehome.bees)
+ beehome.bees.Remove(src)
+ beehome = null
return ..()
-/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
- beegent = null
- ..()
-
-/mob/living/simple_animal/hostile/poison/bees/examine(mob/user)
- ..()
-
/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
overlays.Cut()
@@ -136,21 +134,6 @@
/mob/living/simple_animal/hostile/poison/bees/worker
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
-
-/mob/living/simple_animal/hostile/poison/bees/worker/Destroy()
- if(beehome)
- if(beehome.bees)
- beehome.bees.Remove(src)
- beehome = null
- ..()
-
-/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed)
- if(beehome)
- if(beehome.bees)
- beehome.bees.Remove(src)
- beehome = null
- ..()
-
/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user)
..()
@@ -158,10 +141,10 @@
to_chat(user, "
This bee is homeless! ")
/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A)
- if(istype(A, /obj/machinery/portable_atmospherics/hydroponics))
- var/obj/machinery/portable_atmospherics/hydroponics/Hydro = A
- if(Hydro.seed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.closed_system)
- wanted_objects |= /obj/machinery/portable_atmospherics/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
+ if(istype(A, /obj/machinery/hydroponics))
+ var/obj/machinery/hydroponics/Hydro = A
+ if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state)
+ wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
return 1
..()
@@ -175,24 +158,24 @@
/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget()
//Pollinate
- if(istype(target, /obj/machinery/portable_atmospherics/hydroponics))
- var/obj/machinery/portable_atmospherics/hydroponics/Hydro = target
+ if(istype(target, /obj/machinery/hydroponics))
+ var/obj/machinery/hydroponics/Hydro = target
pollinate(Hydro)
else if(target == beehome)
var/obj/structure/beebox/BB = target
forceMove(BB)
target = null
- wanted_objects.Remove(/obj/structure/beebox) //so we don't attack beeboxes when not going home
+ wanted_objects -= /obj/structure/beebox //so we don't attack beeboxes when not going home
else
..()
-/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/portable_atmospherics/hydroponics/Hydro)
- if(!istype(Hydro) || !Hydro.seed || Hydro.dead || Hydro.recent_bee_visit || Hydro.closed_system)
+/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro)
+ if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state)
target = null
return
target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
- wanted_objects.Remove(/obj/machinery/portable_atmospherics/hydroponics) //so we only hunt them while they're alive/seeded/not visisted
+ wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
Hydro.recent_bee_visit = TRUE
spawn(BEE_TRAY_RECENT_VISIT)
if(Hydro)
@@ -200,23 +183,14 @@
var/growth = health //Health also means how many bees are in the swarm, roughly.
//better healthier plants!
- Hydro.health += round(growth*0.5)
+ Hydro.adjustHealth(growth*0.5)
if(prob(BEE_POLLINATE_PEST_CHANCE))
- Hydro.pestlevel = max(0, --Hydro.pestlevel)
- if(prob(BEE_POLLINATE_YIELD_CHANCE)) //Yield mod is HELLA powerful, but quite rare
- if(!isnull(plant_controller.seeds[Hydro.seed.name]))
- Hydro.seed = Hydro.seed.diverge()
- else
- Hydro.seed.update_name_prefixes()
- var/seed_yield = Hydro.seed.get_trait(TRAIT_YIELD)
- Hydro.seed.set_trait(TRAIT_YIELD, seed_yield + 1, 10, 0)
- if(prob(BEE_POLLINATE_POTENTCY_CHANCE))
- if(!isnull(plant_controller.seeds[Hydro.seed.name]))
- Hydro.seed = Hydro.seed.diverge()
- else
- Hydro.seed.update_name_prefixes()
- var/seed_potency = Hydro.seed.get_trait(TRAIT_POTENCY)
- Hydro.seed.set_trait(TRAIT_POTENCY, seed_potency + 1, 200, 0)
+ Hydro.adjustPests(-10)
+ if(prob(BEE_POLLINATE_YIELD_CHANCE))
+ Hydro.myseed.adjust_yield(1)
+ Hydro.yieldmod = 2
+ if(prob(BEE_POLLINATE_POTENCY_CHANCE))
+ Hydro.myseed.adjust_potency(1)
if(beehome)
beehome.bee_resources = min(beehome.bee_resources + growth, 100)
@@ -234,7 +208,7 @@
idle = max(0, --idle)
if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME))
if(!FindTarget())
- wanted_objects.Add(/obj/structure/beebox) //so we don't attack beeboxes when not going home
+ wanted_objects += /obj/structure/beebox //so we don't attack beeboxes when not going home
target = beehome
if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home
for(var/obj/structure/beebox/BB in view(vision_range, src))
@@ -303,7 +277,7 @@
queen = new(src)
/obj/item/queen_bee/Destroy()
- qdel(queen)
+ QDEL_NULL(queen)
return ..()
@@ -321,6 +295,10 @@
beegent = new /datum/reagent/facid() //prepare to die
var/list/master_and_friends = list()
+/mob/living/simple_animal/hostile/poison/bees/syndi/Destroy()
+ master_and_friends.Cut()
+ return ..()
+
/mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index a14efc6d279..35926a602f2 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -22,7 +22,6 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
- speed = 4
faction = list("faithless")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 368626f49fe..e45d5a1a391 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -116,7 +116,7 @@
GiveUp(C)
return
//second, spin a sticky spiderweb on this tile
- var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
+ var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
Web()
else
@@ -157,7 +157,7 @@
stop_automated_movement = 1
spawn(40)
if(busy == SPINNING_WEB && src.loc == T)
- new /obj/effect/spider/stickyweb(T)
+ new /obj/structure/spider/stickyweb(T)
busy = 0
stop_automated_movement = 0
@@ -187,7 +187,7 @@
spawn(50)
if(busy == SPINNING_COCOON)
if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
- var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
+ var/obj/structure/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
@@ -223,7 +223,7 @@
set category = "Spider"
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
- var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
+ var/obj/structure/spider/eggcluster/E = locate() in get_turf(src)
if(E)
to_chat(src, "
There is already a cluster of eggs here! ")
else if(!fed)
@@ -236,7 +236,7 @@
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
- var/obj/effect/spider/eggcluster/C = new /obj/effect/spider/eggcluster(src.loc)
+ var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc)
C.faction = faction
C.master_commander = master_commander
if(ckey)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 5b76f3a633c..3c521d56d04 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -83,7 +83,7 @@
/mob/living/simple_animal/hostile/hivebot/tele/warpbots()
icon_state = "def_radar"
- visible_message("\red The [src] turns on!")
+ visible_message("
The [src] turns on! ")
while(bot_amt > 0)
bot_amt--
switch(bot_type)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index a3739dfe088..911f66a5527 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -1,6 +1,5 @@
/mob/living/simple_animal/hostile
faction = list("hostile")
- mouse_opacity = 2 //This makes it easier to hit hostile mobs, you only need to click on their tile, and is set back to 1 when they die
stop_automated_movement_when_pulled = 0
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
@@ -13,7 +12,8 @@
var/list/friends = list()
var/ranged_message = "fires" //Fluff text for ranged mobs
var/ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
- var/ranged_cooldown_cap = 3 //What ranged attacks, after being used are set to, to go back on cooldown, defaults to 3 life() ticks
+ var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is
+ var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash
var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
@@ -31,10 +31,33 @@
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
+ //typecache of things this mob will attack in DestroySurroundings() if it has environment_smash
+ var/list/environment_target_typecache = list(
+ /obj/machinery/door/window,
+ /obj/structure/window,
+ /obj/structure/closet,
+ /obj/structure/table,
+ /obj/structure/grille,
+ /obj/structure/girder,
+ /obj/structure/rack,
+ /obj/structure/barricade) //turned into a typecache in New()
+ var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
+ var/list/emote_taunt = list()
+ var/taunt_chance = 0
+
+/mob/living/simple_animal/hostile/New()
+ ..()
+ if(!targets_from)
+ targets_from = src
+ environment_target_typecache = typecacheof(environment_target_typecache)
+
+/mob/living/simple_animal/hostile/Destroy()
+ targets_from = null
+ target = null
+ return ..()
+
/mob/living/simple_animal/hostile/Life()
. = ..()
- if(ranged)
- ranged_cooldown--
if(!.)
walk(src, 0)
return 0
@@ -58,76 +81,89 @@
if(AIShouldSleep(possible_targets)) // we try to acquire a new one
AIStatus = AI_IDLE // otherwise we go idle
return 1
+
+/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user)
+ if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user)
+ FindTarget(list(user), 1)
+ return ..()
+
+/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P)
+ if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
+ if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
+ FindTarget(list(P.firer), 1)
+ Goto(P.starting, move_to_delay, 3)
+ return ..()
+
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see
- var/list/L = list()
+ . = list()
if(!search_objects)
- var/list/Mobs = hearers(vision_range, src) - src //Remove self, so we don't suicide
- L += Mobs
- for(var/obj/mecha/M in mechas_list)
- if(get_dist(M, src) <= vision_range && can_see(src, M, vision_range))
- L += M
- for(var/obj/spacepod/S in spacepods_list)
- if(get_dist(S, src) <= vision_range && can_see(src, S, vision_range))
- L += S
+ var/list/Mobs = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
+ . += Mobs
+
+ var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod))
+
+ for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
+ if(can_see(targets_from, HM, vision_range))
+ . += HM
else
- var/list/Objects = oview(vision_range, src)
- L += Objects
- return L
+ var/list/Objects = oview(vision_range, targets_from)
+ . += Objects
/mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about
- var/list/Targets = list()
+ . = list()
if(!HasTargetsList)
possible_targets = ListTargets()
- for(var/atom/A in possible_targets)
+ for(var/pos_targ in possible_targets)
+ var/atom/A = pos_targ
if(Found(A))//Just in case people want to override targetting
- Targets = list(A)
+ . = list(A)
break
if(CanAttack(A))//Can we attack it?
- Targets += A
+ . += A
continue
- var/Target = PickTarget(Targets)
+ var/Target = PickTarget(.)
GiveTarget(Target)
return Target //We now have a target
+/mob/living/simple_animal/hostile/proc/PossibleThreats()
+ . = list()
+ for(var/pos_targ in ListTargets())
+ var/atom/A = pos_targ
+ if(Found(A))
+ . = list(A)
+ break
+ if(CanAttack(A))
+ . += A
+ continue
+
/mob/living/simple_animal/hostile/proc/Found(var/atom/A)//This is here as a potential override to pick a specific target if available
return
-/mob/living/simple_animal/hostile/proc/PickTarget(var/list/Targets)//Step 3, pick amongst the possible, attackable targets
- if(!Targets.len)//We didnt find nothin!
- return
+/mob/living/simple_animal/hostile/proc/PickTarget(list/Targets)//Step 3, pick amongst the possible, attackable targets
if(target != null)//If we already have a target, but are told to pick again, calculate the lowest distance between all possible, and pick from the lowest distance targets
- for(var/atom/A in Targets)
- var/target_dist = get_dist(src, target)
- var/possible_target_distance = get_dist(src, A)
+ for(var/pos_targ in Targets)
+ var/atom/A = pos_targ
+ var/target_dist = get_dist(targets_from, target)
+ var/possible_target_distance = get_dist(targets_from, A)
if(target_dist < possible_target_distance)
Targets -= A
- var/chosen_target = safepick(Targets)//Pick the remaining targets (if any) at random
+ if(!Targets.len)//We didnt find nothin!
+ return
+ var/chosen_target = pick(Targets)//Pick the remaining targets (if any) at random
return chosen_target
/mob/living/simple_animal/hostile/CanAttack(var/atom/the_target)//Can we actually attack a possible target?
+ if(!the_target)
+ return 0
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
return 0
if(search_objects < 2)
- if(istype(the_target, /obj/mecha))
- var/obj/mecha/M = the_target
- if(M.occupant)//Just so we don't attack empty mechs
- if(CanAttack(M.occupant))
- return 1
- if(istype(the_target, /obj/spacepod))
- var/obj/spacepod/S = the_target
- if(S.pilot) //Just so we don't attack empty pods
- if(CanAttack(S.pilot))
- return 1
if(isliving(the_target))
var/mob/living/L = the_target
- var/faction_check = 0
- for(var/F in faction)
- if(F in L.faction)
- faction_check = 1
- break
+ var/faction_check = faction_check(L)
if(robust_searching)
if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive == 1)
return 0
@@ -141,14 +177,42 @@
if(faction_check && !attack_same)
return 0
return 1
+
+ if(ishuman(the_target))
+ var/mob/living/carbon/human/H = the_target
+ if(is_type_in_list(src, H.species.ignored_by))
+ return 0
+
+ if(istype(the_target, /obj/mecha))
+ var/obj/mecha/M = the_target
+ if(M.occupant)//Just so we don't attack empty mechs
+ if(CanAttack(M.occupant))
+ return 1
+
+ if(istype(the_target, /obj/spacepod))
+ var/obj/spacepod/S = the_target
+ if(S.pilot) //Just so we don't attack empty pods
+ if(CanAttack(S.pilot))
+ return 1
+
+ if(istype(the_target, /obj/machinery/porta_turret))
+ var/obj/machinery/porta_turret/P = the_target
+ if(P.faction in faction)
+ return 0
+ if(!P.raised) //Don't attack invincible turrets
+ return 0
+ if(P.stat & BROKEN) //Or turrets that are already broken
+ return 0
+ return 1
if(isobj(the_target))
if(is_type_in_list(the_target, wanted_objects))
return 1
return 0
-/mob/living/simple_animal/hostile/proc/GiveTarget(var/new_target)//Step 4, give us our selected target
+/mob/living/simple_animal/hostile/proc/GiveTarget(new_target)//Step 4, give us our selected target
target = new_target
if(target != null)
+ Aggro()
return 1
/mob/living/simple_animal/hostile/proc/MoveToTarget(var/list/possible_targets)//Step 5, handle movement between us and our target
@@ -157,38 +221,45 @@
LoseTarget()
return 0
if(target in possible_targets)
- var/target_distance = get_dist(src,target)
- if(ranged)//We ranged? Shoot at em
- if(target_distance >= 2 && ranged_cooldown <= 0)//But make sure they're a tile away at least, and our range attack is off cooldown
+ if(target.z != z)
+ LoseTarget()
+ return 0
+ var/target_distance = get_dist(targets_from,target)
+ if(ranged) //We ranged? Shoot at em
+ if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown
OpenFire(target)
- if(retreat_distance != null)//If we have a retreat distance, check if we need to run from our target
- if(target_distance <= retreat_distance)//If target's closer than our retreat distance, run
+ if(retreat_distance != null) //If we have a retreat distance, check if we need to run from our target
+ if(target_distance <= retreat_distance) //If target's closer than our retreat distance, run
walk_away(src,target,retreat_distance,move_to_delay)
else
- Goto(target,move_to_delay,minimum_distance)//Otherwise, get to our minimum distance so we chase them
+ Goto(target,move_to_delay,minimum_distance) //Otherwise, get to our minimum distance so we chase them
else
Goto(target,move_to_delay,minimum_distance)
- if(isturf(loc) && target.Adjacent(src)) //If they're next to us, attack
- AttackingTarget()
- return 1
+ if(target)
+ if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from)) //If they're next to us, attack
+ AttackingTarget()
+ return 1
+ return 0
if(environment_smash)
- if(target.loc != null && get_dist(src, target.loc) <= vision_range)//We can't see our target, but he's in our vision range still
- if(environment_smash >= 2)//If we're capable of smashing through walls, forget about vision completely after finding our target
+ if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still
+ if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them!
+ OpenFire(target)
+ if(environment_smash >= 2) //If we're capable of smashing through walls, forget about vision completely after finding our target
Goto(target,move_to_delay,minimum_distance)
FindHidden()
return 1
else
if(FindHidden())
return 1
- LostTarget()
+ LoseTarget()
return 0
-/mob/living/simple_animal/hostile/proc/Goto(var/target, var/delay, var/minimum_distance)
+/mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance)
walk_to(src, target, minimum_distance, delay)
/mob/living/simple_animal/hostile/adjustHealth(damage)
- ..(damage)
- if(!stat && search_objects < 3)//Not unconscious, and we don't ignore mobs
+ . = ..()
+ if(!ckey && !stat && search_objects < 3 && damage > 0)//Not unconscious, and we don't ignore mobs
if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
search_objects = 0
target = null
@@ -203,101 +274,102 @@
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
+ if(target && emote_taunt.len && prob(taunt_chance))
+ emote("me", 1, "[pick(emote_taunt)] at [target].")
+ taunt_chance = max(taunt_chance-7,2)
/mob/living/simple_animal/hostile/proc/LoseAggro()
stop_automated_movement = 0
vision_range = idle_vision_range
+ taunt_chance = initial(taunt_chance)
/mob/living/simple_animal/hostile/proc/LoseTarget()
target = null
walk(src, 0)
LoseAggro()
-/mob/living/simple_animal/hostile/proc/LostTarget()
- walk(src, 0)
- LoseAggro()
-
//////////////END HOSTILE MOB TARGETTING AND AGGRESSION////////////
/mob/living/simple_animal/hostile/death(gibbed)
- LoseAggro()
- mouse_opacity = 1
- ..()
- walk(src, 0)
+ LoseTarget()
+ ..(gibbed)
-/mob/living/simple_animal/hostile/proc/OpenFire(var/the_target)
- var/target = the_target
+/mob/living/simple_animal/hostile/proc/summon_backup(distance)
+ do_alert_animation(src)
+ playsound(loc, 'sound/machines/chime.ogg', 50, 1, -1)
+ for(var/mob/living/simple_animal/hostile/M in oview(distance, targets_from))
+ var/list/L = M.faction&faction
+ if(L.len)
+ if(M.AIStatus == AI_OFF)
+ return
+ else
+ M.Goto(src,M.move_to_delay,M.minimum_distance)
+
+/mob/living/simple_animal/hostile/proc/OpenFire(atom/A)
if(check_friendly_fire)
- for(var/turf/T in getline(src, target)) // Not 100% reliable but this is faster than simulating actual trajectory
+ for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory
for(var/mob/living/L in T)
- if(L == src || L == target)
+ if(L == src || L == A)
continue
if(faction_check(L) && !attack_same)
return
- visible_message("
[src] [ranged_message] at [target]!")
+ visible_message("
[src] [ranged_message] at [A]!")
if(rapid)
spawn(1)
- Shoot(target, src.loc, src)
- if(casingtype)
- new casingtype(get_turf(src))
+ Shoot(A)
spawn(4)
- Shoot(target, src.loc, src)
- if(casingtype)
- new casingtype(get_turf(src))
+ Shoot(A)
spawn(6)
- Shoot(target, src.loc, src)
- if(casingtype)
- new casingtype(get_turf(src))
+ Shoot(A)
else
- Shoot(target, src.loc, src)
- if(casingtype)
- new casingtype
- ranged_cooldown = ranged_cooldown_cap
- return
+ Shoot(A)
+ ranged_cooldown = world.time + ranged_cooldown_time
-/mob/living/simple_animal/hostile/proc/Shoot(var/target, var/start, var/user, var/bullet = 0)
- if(target == start)
+/mob/living/simple_animal/hostile/proc/Shoot(atom/targeted_atom)
+ if(targeted_atom == targets_from.loc || targeted_atom == targets_from)
return
+ var/turf/startloc = get_turf(targets_from)
if(casingtype)
- var/obj/item/ammo_casing/casing = new casingtype
+ var/obj/item/ammo_casing/casing = new casingtype(startloc)
playsound(src, projectilesound, 100, 1)
- casing.fire(target, src, zone_override = ran_zone())
- casing.loc = loc
- else
- var/obj/item/projectile/A = new projectiletype(loc)
- playsound(user, projectilesound, 100, 1)
- A.current = target
- A.firer = src
- A.yo = target:y - start:y
- A.xo = target:x - start:x
- if(AIStatus == AI_OFF)//Don't want mindless mobs to have their movement screwed up firing in space
- newtonian_move(get_dir(target, user))
- A.original = target
- A.fire()
- return A
+ casing.fire(targeted_atom, src, zone_override = ran_zone())
+ else if(projectiletype)
+ var/obj/item/projectile/P = new projectiletype(startloc)
+ playsound(src, projectilesound, 100, 1)
+ P.current = startloc
+ P.starting = startloc
+ P.firer = src
+ P.yo = targeted_atom.y - startloc.y
+ P.xo = targeted_atom.x - startloc.x
+ if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space
+ newtonian_move(get_dir(targeted_atom, targets_from))
+ P.original = targeted_atom
+ P.fire()
+ return P
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
if(environment_smash)
EscapeConfinement()
for(var/dir in cardinal)
- var/turf/T = get_step(src, dir)
- if(istype(T, /turf/simulated/wall) || istype(T, /turf/simulated/mineral))
- if(T.Adjacent(src))
+ var/turf/T = get_step(targets_from, dir)
+ if(iswallturf(T) || ismineralturf(T))
+ if(T.Adjacent(targets_from))
T.attack_animal(src)
- for(var/atom/A in T)
- if(!A.Adjacent(src))
+ for(var/a in T)
+ var/atom/A = a
+ if(!A.Adjacent(targets_from))
continue
- if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/rack))
+ if(is_type_in_typecache(A, environment_target_typecache))
A.attack_animal(src)
return
/mob/living/simple_animal/hostile/proc/EscapeConfinement()
if(buckled)
buckled.attack_animal(src)
- if(!isturf(src.loc) && src.loc != null)//Did someone put us in something?
- var/atom/A = src.loc
+ if(!isturf(targets_from.loc) && targets_from.loc != null)//Did someone put us in something?
+ var/atom/A = get_turf(targets_from)
A.attack_animal(src)//Bang on it till we get out
return
@@ -305,12 +377,12 @@
if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper) || istype(target.loc, /obj/machinery/bodyscanner) || istype(target.loc, /obj/machinery/recharge_station))
var/atom/A = target.loc
Goto(A,move_to_delay,minimum_distance)
- if(A.Adjacent(src))
+ if(A.Adjacent(targets_from))
A.attack_animal(src)
return 1
-/mob/living/simple_animal/hostile/RangedAttack(var/atom/A, var/params) //Player firing
- if(ranged && ranged_cooldown <= 0)
+/mob/living/simple_animal/hostile/RangedAttack(atom/A, params) //Player firing
+ if(ranged && ranged_cooldown <= world.time)
target = A
OpenFire(A)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
new file mode 100644
index 00000000000..d6d1d92618d
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -0,0 +1,393 @@
+#define MEDAL_PREFIX "Bubblegum"
+
+/*
+
+BUBBLEGUM
+
+Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence.
+Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size.
+
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+
+It tries to strike at its target through any bloodpools under them; if it fails to do that, it will spray blood and then attempt to warp to a bloodpool near the target.
+If it fails to warp to a target, it may summon up to 6 slaughterlings from the blood around it.
+If it does not summon all 6 slaughterlings, it will instead charge at its target, dealing massive damage to anything it hits and spraying a stream of blood.
+At half health, it will either charge three times or warp, then charge, instead of doing a single charge.
+
+When Bubblegum dies, it leaves behind a chest that can contain three things:
+ 1. A bottle that, when activated, drives everyone nearby into a frenzy
+ 2. A contract that marks for death the chosen target
+ 3. A spellblade that can slice off limbs at range
+
+Difficulty: Hard
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum
+ name = "bubblegum"
+ desc = "In what passes for a heirarchy among slaughter demons, this one is king."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "rends"
+ attack_sound = 'sound/misc/demon_attack1.ogg'
+ icon_state = "bubblegum"
+ icon_living = "bubblegum"
+ icon_dead = ""
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/96x96megafauna.dmi'
+ speak_emote = list("gurgles")
+ armour_penetration = 40
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ pixel_x = -32
+ del_on_death = 1
+ loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
+ var/charging = 0
+ medal_type = MEDAL_PREFIX
+ score_type = BUBBLEGUM_SCORE
+ deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... "
+ death_sound = 'sound/misc/enter_blood.ogg'
+
+/obj/item/device/gps/internal/bubblegum
+ icon_state = null
+ gpstag = "Bloody Signal"
+ desc = "You're not quite sure how a signal can be bloody."
+ invisibility = 100
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount)
+ if(amount > 0 && prob(25))
+ var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc)
+ if(prob(40))
+ step(B, pick(cardinal))
+ else
+ B.dir = pick(cardinal)
+ . = ..()
+
+/obj/effect/decal/cleanable/blood/gibs/bubblegum
+ name = "thick blood"
+ desc = "Thick, splattered blood."
+ random_icon_states = list("gib3", "gib5", "gib6")
+ amount = 20
+
+/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in()
+ return TRUE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Life()
+ ..()
+ move_to_delay = Clamp((health/maxHealth) * 10, 5, 10)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
+ anger_modifier = Clamp(((maxHealth - health)/60),0,20)
+ if(charging)
+ return
+ ranged_cooldown = world.time + ranged_cooldown_time
+
+ var/warped = FALSE
+ if(!try_bloodattack())
+ spawn(0)
+ blood_spray()
+ warped = blood_warp()
+ if(warped && prob(100 - anger_modifier))
+ return
+
+ if(prob(90 - anger_modifier) || slaughterlings())
+ if(health > maxHealth * 0.5)
+ spawn(0)
+ charge()
+ else
+ if(prob(70) || warped)
+ spawn(0)
+ triple_charge()
+ else
+ spawn(0)
+ warp_charge()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/New()
+ ..()
+ for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in mob_list)
+ if(B != src)
+ qdel(src) //There can be only one
+ break
+ var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
+ AddSpell(bloodspell)
+ if(istype(loc, /obj/effect/dummy/slaughter))
+ bloodspell.phased = 1
+ internal_gps = new/obj/item/device/gps/internal/bubblegum(src)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
+ if(charging)
+ new /obj/effect/overlay/temp/decoy/fading(loc, src)
+ DestroySurroundings()
+ . = ..()
+ if(!stat && .)
+ playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1)
+ if(charging)
+ DestroySurroundings()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/warp_charge()
+ blood_warp()
+ charge()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge()
+ charge()
+ charge()
+ charge()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge()
+ var/turf/T = get_turf(target)
+ if(!T || T == loc)
+ return
+ new /obj/effect/overlay/temp/dragon_swoop(T)
+ charging = 1
+ DestroySurroundings()
+ walk(src, 0)
+ dir = get_dir(src, T)
+ var/obj/effect/overlay/temp/decoy/D = new /obj/effect/overlay/temp/decoy(loc, src)
+ animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5)
+ sleep(5)
+ throw_at(T, get_dist(src, T), 1, src, 0)
+ charging = 0
+ try_bloodattack()
+ if(target)
+ Goto(target, move_to_delay, minimum_distance)
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Bump(atom/A)
+ if(charging)
+ if(isturf(A) || isobj(A) && A.density)
+ A.ex_act(2)
+ DestroySurroundings()
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/A)
+ if(!charging)
+ return ..()
+
+ else if(isliving(A))
+ var/mob/living/L = A
+ L.visible_message("
[src] slams into [L]! ", "
[src] slams into you! ")
+ L.apply_damage(40, BRUTE)
+ playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
+ shake_camera(L, 4, 3)
+ shake_camera(src, 2, 3)
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
+ L.throw_at(throwtarget, 3)
+
+ charging = 0
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood()
+ var/list/targets = ListTargets()
+ . = list()
+ for(var/mob/living/L in targets)
+ var/list/bloodpool = get_pools(get_turf(L), 0)
+ if(bloodpool.len && (!faction_check(L) || L.stat == DEAD))
+ . += L
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack()
+ var/list/targets = get_mobs_on_blood()
+ if(targets.len)
+ spawn(0)
+ bloodattack(targets, prob(50))
+
+ return TRUE
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness)
+ var/mob/living/target_one = pick_n_take(targets)
+ var/turf/target_one_turf = get_turf(target_one)
+ var/mob/living/target_two
+ if(targets.len)
+ target_two = pick_n_take(targets)
+ var/turf/target_two_turf = get_turf(target_two)
+ if(target_two.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_two_turf, handedness)
+ else
+ bloodsmack(target_two_turf, handedness)
+
+ if(target_one)
+ var/list/pools = get_pools(get_turf(target_one), 0)
+ if(pools.len)
+ target_one_turf = get_turf(target_one)
+ if(target_one_turf)
+ if(target_one.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_one_turf, !handedness)
+ else
+ bloodsmack(target_one_turf, !handedness)
+
+ if(!target_two && target_one)
+ var/list/poolstwo = get_pools(get_turf(target_one), 0)
+ if(poolstwo.len)
+ target_one_turf = get_turf(target_one)
+ if(target_one_turf)
+ if(target_one.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_one_turf, handedness)
+ else
+ bloodsmack(target_one_turf, handedness)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/overlay/temp/bubblegum_hands/rightsmack(T)
+ else
+ new /obj/effect/overlay/temp/bubblegum_hands/leftsmack(T)
+ sleep(2.5)
+ for(var/mob/living/L in T)
+ if(!faction_check(L))
+ to_chat(L, "
[src] rends you! ")
+ playsound(T, attack_sound, 100, 1, -1)
+ var/limb_to_hit = pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg")
+ L.apply_damage(25, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration))
+ sleep(3)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/overlay/temp/bubblegum_hands/rightpaw(T)
+ new /obj/effect/overlay/temp/bubblegum_hands/rightthumb(T)
+ else
+ new /obj/effect/overlay/temp/bubblegum_hands/leftpaw(T)
+ new /obj/effect/overlay/temp/bubblegum_hands/leftthumb(T)
+ sleep(6)
+ for(var/mob/living/L in T)
+ if(!faction_check(L))
+ to_chat(L, "
[src] drags you through the blood! ")
+ playsound(T, 'sound/misc/enter_blood.ogg', 100, 1, -1)
+ var/turf/targetturf = get_step(src, dir)
+ L.forceMove(targetturf)
+ playsound(targetturf, 'sound/misc/exit_blood.ogg', 100, 1, -1)
+ if(L.stat != CONSCIOUS)
+ spawn(2)
+ devour(L)
+ sleep(1)
+
+/obj/effect/overlay/temp/bubblegum_hands
+ icon = 'icons/effects/bubblegum.dmi'
+ duration = 9
+
+/obj/effect/overlay/temp/bubblegum_hands/rightthumb
+ icon_state = "rightthumbgrab"
+
+/obj/effect/overlay/temp/bubblegum_hands/leftthumb
+ icon_state = "leftthumbgrab"
+
+/obj/effect/overlay/temp/bubblegum_hands/rightpaw
+ icon_state = "rightpawgrab"
+ layer = MOB_LAYER - 0.1
+
+/obj/effect/overlay/temp/bubblegum_hands/leftpaw
+ icon_state = "leftpawgrab"
+ layer = MOB_LAYER - 0.1
+
+/obj/effect/overlay/temp/bubblegum_hands/rightsmack
+ icon_state = "rightsmack"
+
+/obj/effect/overlay/temp/bubblegum_hands/leftsmack
+ icon_state = "leftsmack"
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
+ if(Adjacent(target))
+ return FALSE
+ var/list/can_jaunt = get_pools(get_turf(src), 1)
+ if(!can_jaunt.len)
+ return FALSE
+
+ var/list/pools = get_pools(get_turf(target), 2)
+ var/list/pools_to_remove = get_pools(get_turf(target), 1)
+ pools -= pools_to_remove
+ if(!pools.len)
+ return FALSE
+
+ var/obj/effect/overlay/temp/decoy/DA = new /obj/effect/overlay/temp/decoy(loc, src)
+ DA.color = "#FF0000"
+ var/oldtransform = DA.transform
+ DA.transform = matrix()*2
+ animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 5)
+ sleep(5)
+ qdel(DA)
+
+ var/obj/effect/decal/cleanable/blood/found_bloodpool
+ pools = get_pools(get_turf(target), 2)
+ pools_to_remove = get_pools(get_turf(target), 1)
+ pools -= pools_to_remove
+ if(pools.len)
+ shuffle(pools)
+ found_bloodpool = pick(pools)
+ if(found_bloodpool)
+ visible_message("
[src] sinks into the blood... ")
+ playsound(get_turf(src), 'sound/misc/enter_blood.ogg', 100, 1, -1)
+ forceMove(get_turf(found_bloodpool))
+ playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
+ visible_message("
And springs back out! ")
+ return TRUE
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range)
+ . = list()
+ for(var/obj/effect/decal/cleanable/nearby in view(T, range))
+ if(nearby.can_bloodcrawl_in())
+ . += nearby
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray()
+ visible_message("
[src] sprays a stream of gore! ")
+ var/range = 6 + round(anger_modifier * 0.4)
+ var/turf/previousturf = get_turf(src)
+ var/turf/J = previousturf
+ var/targetdir = get_dir(src, target)
+ if(target.loc == loc)
+ targetdir = dir
+ face_atom(target)
+ new /obj/effect/decal/cleanable/blood/bubblegum(J)
+ for(var/i in 1 to range)
+ J = get_step(previousturf, targetdir)
+ new /obj/effect/overlay/temp/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
+ playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1)
+ if(!J || !previousturf.CanAtmosPass(J))
+ break
+ new /obj/effect/decal/cleanable/blood/bubblegum(J)
+ previousturf = J
+ sleep(1)
+
+/obj/effect/decal/cleanable/blood/bubblegum
+ amount = 0
+
+/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in()
+ return TRUE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings()
+ visible_message("
[src] summons a shoal of slaughterlings! ")
+ var/max_amount = 6
+ for(var/H in get_pools(get_turf(src), 1))
+ if(!max_amount)
+ break
+ max_amount--
+ var/obj/effect/decal/cleanable/blood/B = H
+ new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter(B.loc)
+ return max_amount
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter
+ name = "slaughterling"
+ desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you."
+ density = 0
+ faction = list("mining", "boss")
+ weather_immunities = list("lava","ash")
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter/CanPass(atom/movable/mover, turf/target, height = 0)
+ if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum))
+ return 1
+ return 0
+
+#undef MEDAL_PREFIX
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
new file mode 100644
index 00000000000..b40e64c6a31
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -0,0 +1,266 @@
+
+#define MEDAL_PREFIX "Colossus"
+/*
+
+COLOSSUS
+
+The colossus spawns randomly wherever a lavaland creature is able to spawn. It is powerful, ancient, and extremely deadly.
+The colossus has a degree of sentience, proving this in speech during its attacks.
+
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+
+The colossus' true danger lies in its ranged capabilities. It fires immensely damaging death bolts that penetrate all armor in a variety of ways:
+ 1. The colossus fires death bolts in alternating patterns: the cardinal directions and the diagonal directions.
+ 2. The colossus fires death bolts in a shotgun-like pattern, instantly downing anything unfortunate enough to be hit by all of them.
+ 3. The colossus fires a spiral of death bolts.
+At 33% health, the colossus gains an additional attack:
+ 4. The colossus fires two spirals of death bolts, spinning in opposite directions.
+
+When a colossus dies, it leaves behind a chunk of glowing crystal known as a black box. Anything placed inside will carry over into future rounds.
+For instance, you could place a bag of holding into the black box, and then kill another colossus next round and retrieve the bag of holding from inside.
+
+Difficulty: Very Hard
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/colossus
+ name = "colossus"
+ desc = "A monstrous creature protected by heavy shielding."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "judges"
+ attack_sound = 'sound/magic/ratvar_attack.ogg'
+ icon_state = "eva"
+ icon_living = "eva"
+ icon_dead = "dragon_dead"
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/96x96megafauna.dmi'
+ speak_emote = list("roars")
+ armour_penetration = 40
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ pixel_x = -32
+ del_on_death = 1
+ medal_type = MEDAL_PREFIX
+ score_type = COLOSSUS_SCORE
+ loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/internal/vocal_cords/colossus)
+ butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
+ deathmessage = "disintegrates, leaving a glowing core in its wake."
+ death_sound = 'sound/misc/demon_dies.ogg'
+
+/mob/living/simple_animal/hostile/megafauna/colossus/devour(mob/living/L)
+ visible_message("
[src] disintegrates [L]! ")
+ L.dust()
+
+/mob/living/simple_animal/hostile/megafauna/colossus/OpenFire()
+ anger_modifier = Clamp(((maxHealth - health)/50),0,20)
+ ranged_cooldown = world.time + 120
+
+ if(enrage(target))
+ if(move_to_delay == initial(move_to_delay))
+ visible_message("
\"You can't dodge. \" ")
+ ranged_cooldown = world.time + 30
+ telegraph()
+ dir_shots(alldirs)
+ move_to_delay = 3
+ return
+ else
+ move_to_delay = initial(move_to_delay)
+
+ if(prob(20+anger_modifier)) //Major attack
+ telegraph()
+
+ if(health < maxHealth/3)
+ double_spiral()
+ else
+ visible_message("
\"Judgement. \" ")
+ spawn(0)
+ spiral_shoot(rand(0, 1))
+
+ else if(prob(20))
+ ranged_cooldown = world.time + 30
+ random_shots()
+ else
+ if(prob(70))
+ ranged_cooldown = world.time + 20
+ blast()
+ else
+ ranged_cooldown = world.time + 40
+ spawn(0)
+ alternating_dir_shots()
+
+
+/mob/living/simple_animal/hostile/megafauna/colossus/New()
+ ..()
+ internal_gps = new/obj/item/device/gps/internal/colossus(src)
+
+/obj/effect/overlay/temp/at_shield
+ name = "anti-toolbox field"
+ desc = "A shimmering forcefield protecting the colossus."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "at_shield2"
+ layer = FLY_LAYER
+ luminosity = 2
+ duration = 8
+ var/target
+
+/obj/effect/overlay/temp/at_shield/New(new_loc, new_target)
+ ..()
+ target = new_target
+ spawn(0)
+ orbit(target, 0, FALSE, 0, 0, FALSE, TRUE)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
+ if(!stat)
+ var/obj/effect/overlay/temp/at_shield/AT = new /obj/effect/overlay/temp/at_shield(loc, src)
+ var/random_x = rand(-32, 32)
+ AT.pixel_x += random_x
+
+ var/random_y = rand(0, 72)
+ AT.pixel_y += random_y
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.martial_art && prob(H.martial_art.deflection_chance))
+ . = TRUE
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots()
+ dir_shots(diagonals)
+ sleep(10)
+ dir_shots(cardinal)
+ sleep(10)
+ dir_shots(diagonals)
+ sleep(10)
+ dir_shots(cardinal)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral()
+ visible_message("
\"Die. \" ")
+
+ sleep(10)
+ spawn(0)
+ spiral_shoot()
+ spawn(0)
+ spiral_shoot(1)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = 0, counter_start = 1)
+ var/counter = counter_start
+ var/turf/marker
+ for(var/i in 1 to 80)
+ switch(counter)
+ if(1)
+ marker = locate(x, y - 2, z)
+ if(2)
+ marker = locate(x - 1, y - 2, z)
+ if(3)
+ marker = locate(x - 2, y - 2, z)
+ if(4)
+ marker = locate(x - 2, y - 1, z)
+ if(5)
+ marker = locate(x - 2, y, z)
+ if(6)
+ marker = locate(x - 2, y + 1, z)
+ if(7)
+ marker = locate(x - 2, y + 2, z)
+ if(8)
+ marker = locate(x - 1, y + 2, z)
+ if(9)
+ marker = locate(x, y + 2, z)
+ if(10)
+ marker = locate(x + 1, y + 2, z)
+ if(11)
+ marker = locate(x + 2, y + 2, z)
+ if(12)
+ marker = locate(x + 2, y + 1, z)
+ if(13)
+ marker = locate(x + 2, y, z)
+ if(14)
+ marker = locate(x + 2, y - 1, z)
+ if(15)
+ marker = locate(x + 2, y - 2, z)
+ if(16)
+ marker = locate(x + 1, y - 2, z)
+
+ if(negative)
+ counter--
+ else
+ counter++
+ if(counter > 16)
+ counter = 1
+ if(counter < 1)
+ counter = 16
+ shoot_projectile(marker)
+ playsound(get_turf(src), 'sound/magic/invoke_general.ogg', 20, 1)
+ sleep(1)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker)
+ if(!marker || marker == loc)
+ return
+ var/turf/startloc = get_turf(src)
+ var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
+ P.current = startloc
+ P.starting = startloc
+ P.firer = src
+ P.yo = marker.y - startloc.y
+ P.xo = marker.x - startloc.x
+ if(target)
+ P.original = target
+ else
+ P.original = marker
+ P.fire()
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots()
+ var/turf/U = get_turf(src)
+ playsound(U, 'sound/magic/invoke_general.ogg', 300, 1, 5)
+ for(var/T in RANGE_TURFS(12, U) - U)
+ if(prob(5))
+ shoot_projectile(T)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast()
+ playsound(get_turf(src), 'sound/magic/invoke_general.ogg', 200, 1, 2)
+ var/turf/T = get_turf(target)
+ newtonian_move(get_dir(T, targets_from))
+ for(var/turf/turf in range(1, T))
+ shoot_projectile(turf)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/dir_shots(list/dirs)
+ if(!islist(dirs))
+ dirs = alldirs.Copy()
+ playsound(get_turf(src), 'sound/magic/invoke_general.ogg', 200, 1, 2)
+ for(var/d in dirs)
+ var/turf/E = get_step(src, d)
+ shoot_projectile(E)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph()
+ for(var/mob/M in range(10,src))
+ if(M.client)
+ flash_color(M.client, rgb(200, 0, 0), 1)
+ shake_camera(M, 4, 3)
+ playsound(get_turf(src),'sound/magic/narsie_attack.ogg', 200, 1)
+
+/obj/item/projectile/colossus
+ name ="death bolt"
+ icon_state= "chronobolt"
+ damage = 25
+ armour_penetration = 100
+ speed = 2
+ eyeblur = 0
+ damage_type = BRUTE
+ pass_flags = PASSTABLE
+
+/obj/item/projectile/colossus/on_hit(atom/target, blocked = 0)
+ . = ..()
+ if(isturf(target) || isobj(target))
+ target.ex_act(2)
+
+/obj/item/device/gps/internal/colossus
+ icon_state = null
+ gpstag = "Angelic Signal"
+ desc = "Get in the fucking robot."
+ invisibility = 100
+
+#undef MEDAL_PREFIX
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
new file mode 100644
index 00000000000..38f8c121d5d
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -0,0 +1,278 @@
+#define MEDAL_PREFIX "Drake"
+/*
+
+ASH DRAKE
+
+Ash drakes spawn randomly wherever a lavaland creature is able to spawn. They are the draconic guardians of the Necropolis.
+
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+
+Whenever possible, the drake will breathe fire in the four cardinal directions, igniting and heavily damaging anything caught in the blast.
+It also often causes fire to rain from the sky - many nearby turfs will flash red as a fireball crashes into them, dealing damage to anything on the turfs.
+The drake also utilizes its wings to fly into the sky and crash down onto a specified point. Anything on this point takes tremendous damage.
+ - Sometimes it will chain these swooping attacks over and over, making swiftness a necessity.
+
+When an ash drake dies, it leaves behind a chest that can contain four things:
+ 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power
+ 2. A lava staff that allows its wielder to create lava
+ 3. A spellbook and wand of fireballs
+ 4. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves.
+
+When butchered, they leave behind diamonds, sinew, bone, and ash drake hide. Ash drake hide can be used to create a hooded cloak that protects its wearer from ash storms.
+
+Difficulty: Medium
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/dragon
+ name = "ash drake"
+ desc = "Guardians of the necropolis."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "chomps"
+ attack_sound = 'sound/misc/demon_attack1.ogg'
+ icon_state = "dragon"
+ icon_living = "dragon"
+ icon_dead = "dragon_dead"
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/dragon.dmi'
+ speak_emote = list("roars")
+ armour_penetration = 40
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ pixel_x = -16
+ loot = list(/obj/structure/closet/crate/necropolis/dragon)
+ butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
+ var/swooping = 0
+ var/swoop_cooldown = 0
+ medal_type = MEDAL_PREFIX
+ score_type = DRAKE_SCORE
+ deathmessage = "collapses into a pile of bones, its flesh sloughing away."
+ death_sound = 'sound/misc/demon_dies.ogg'
+
+/mob/living/simple_animal/hostile/megafauna/dragon/New()
+ ..()
+ internal_gps = new/obj/item/device/gps/internal/dragon(src)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/ex_act(severity, target)
+ if(severity == 3)
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount)
+ if(swooping)
+ return 0
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
+ if(!swooping)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/DestroySurroundings()
+ if(!swooping)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/Move()
+ if(!swooping)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/Goto(target, delay, minimum_distance)
+ if(!swooping)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/obj/effect/overlay/temp/fireball
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "fireball"
+ name = "fireball"
+ desc = "Get out of the way!"
+ layer = 6
+ randomdir = 0
+ duration = 12
+ pixel_z = 500
+
+/obj/effect/overlay/temp/fireball/New(loc)
+ ..()
+ animate(src, pixel_z = 0, time = 12)
+
+/obj/effect/overlay/temp/target
+ icon = 'icons/mob/actions.dmi'
+ icon_state = "sniper_zoom"
+ layer = MOB_LAYER - 0.1
+ luminosity = 2
+ duration = 12
+
+/obj/effect/overlay/temp/dragon_swoop
+ name = "certain death"
+ desc = "Don't just stand there, move!"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "landing"
+ layer = MOB_LAYER - 0.1
+ pixel_x = -32
+ pixel_y = -32
+ color = "#FF0000"
+ duration = 10
+
+/obj/effect/overlay/temp/target/ex_act()
+ return
+
+/obj/effect/overlay/temp/target/New(loc)
+ ..()
+ spawn(0)
+ fall()
+
+/obj/effect/overlay/temp/target/proc/fall()
+ var/turf/T = get_turf(src)
+ playsound(T,'sound/magic/Fireball.ogg', 200, 1)
+ new /obj/effect/overlay/temp/fireball(T)
+ sleep(12)
+ explosion(T, 0, 0, 1, 0, 0, 0, 1)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
+ anger_modifier = Clamp(((maxHealth - health)/50),0,20)
+ ranged_cooldown = world.time + ranged_cooldown_time
+ if(swooping)
+ fire_rain()
+ return
+
+ if(prob(15 + anger_modifier) && !client)
+ if(health < maxHealth/2)
+ spawn(0)
+ swoop_attack(1)
+ else
+ fire_rain()
+
+ else if(prob(10+anger_modifier) && !client)
+ if(health > maxHealth/2)
+ spawn(0)
+ swoop_attack(0)
+ else
+ spawn(0)
+ triple_swoop(0)
+ else
+ fire_walls()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_rain()
+ visible_message("
Fire rains from the sky! ")
+ for(var/turf/turf in range(12,get_turf(src)))
+ if(prob(10))
+ new /obj/effect/overlay/temp/target(turf)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
+ playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
+
+ for(var/d in cardinal)
+ spawn(0)
+ fire_wall(d)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_wall(dir)
+ var/list/hit_things = list(src)
+ var/turf/E = get_edge_target_turf(src, dir)
+ var/range = 10
+ var/turf/previousturf = get_turf(src)
+ for(var/turf/J in getline(src,E))
+ if(!range || !previousturf.CanAtmosPass(J))
+ break
+ range--
+ new /obj/effect/hotspot(J)
+ J.hotspot_expose(700,50,1)
+ for(var/mob/living/L in J.contents - hit_things)
+ L.adjustFireLoss(20)
+ to_chat(L, "
You're hit by the drake's fire breath! ")
+ hit_things += L
+ previousturf = J
+ sleep(1)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/triple_swoop()
+ swoop_attack()
+ swoop_attack()
+ swoop_attack()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target)
+ if(stat || swooping)
+ return
+ swoop_cooldown = world.time + 200
+ var/atom/swoop_target
+ if(manual_target)
+ swoop_target = manual_target
+ else
+ swoop_target = target
+ stop_automated_movement = TRUE
+ swooping = 1
+ density = 0
+ icon_state = "swoop"
+ visible_message("
[src] swoops up high! ")
+ if(prob(50))
+ animate(src, pixel_x = 500, pixel_z = 500, time = 10)
+ else
+ animate(src, pixel_x = -500, pixel_z = 500, time = 10)
+ sleep(30)
+
+ var/turf/tturf
+ if(fire_rain)
+ fire_rain()
+
+ icon_state = "dragon"
+ if(swoop_target && !qdeleted(swoop_target) && swoop_target.z == src.z)
+ tturf = get_turf(swoop_target)
+ else
+ tturf = get_turf(src)
+ forceMove(tturf)
+ new /obj/effect/overlay/temp/dragon_swoop(tturf)
+ animate(src, pixel_x = initial(pixel_x), pixel_z = 0, time = 10)
+ sleep(10)
+ playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
+ for(var/mob/living/L in orange(1, src))
+ if(L.stat)
+ visible_message("
[src] slams down on [L], crushing them! ")
+ L.gib()
+ else
+ L.adjustBruteLoss(75)
+ if(L && !qdeleted(L)) // Some mobs are deleted on death
+ var/throw_dir = get_dir(src, L)
+ if(L.loc == loc)
+ throw_dir = pick(alldirs)
+ var/throwtarget = get_edge_target_turf(src, throw_dir)
+ L.throw_at(throwtarget, 3)
+ visible_message("
[L] is thrown clear of [src]! ")
+
+ for(var/mob/M in range(7, src))
+ shake_camera(M, 15, 1)
+
+ stop_automated_movement = FALSE
+ swooping = 0
+ density = 1
+
+/mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A)
+ if(!istype(A))
+ return
+ if(swoop_cooldown >= world.time)
+ to_chat(src, "
You need to wait 20 seconds between swoop attacks! ")
+ return
+ swoop_attack(1, A)
+
+/obj/item/device/gps/internal/dragon
+ icon_state = null
+ gpstag = "Fiery Signal"
+ desc = "Here there be dragons."
+ invisibility = 100
+
+/mob/living/simple_animal/hostile/megafauna/dragon/lesser
+ name = "lesser ash drake"
+ maxHealth = 200
+ health = 200
+ faction = list("neutral")
+ melee_damage_upper = 30
+ melee_damage_lower = 30
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ loot = list()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
+ return
+
+#undef MEDAL_PREFIX
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
new file mode 100644
index 00000000000..228f4df9ad6
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -0,0 +1,611 @@
+#define MEDAL_PREFIX "Hierophant"
+/*
+
+The Hierophant
+
+The Hierophant spawns in its arena, an area designed to make it harder to fight than it would otherwise be.
+
+The text this boss speaks is ROT4, use ROT22 to decode
+
+The Hierophant's attacks are as follows, and INTENSIFY at a random chance based on Hierophant's health;
+- Creates a cardinal or diagonal blast(Cross Blast) under its target, exploding after a short time.
+ INTENSITY EFFECT: Creates one of the cross blast types under itself instead of under the target.
+ INTENSITY EFFECT: The created Cross Blast fires in all directions if below half health.
+- If no chasers exist, creates a chaser that will seek its target, leaving a trail of blasts.
+ INTENSITY EFFECT: Creates a second, slower chaser.
+- Creates an expanding AoE burst.
+- INTENSE ATTACKS:
+ If target is at least 2 tiles away; Blinks to the target after a very brief delay, damaging everything near the start and end points.
+ As above, but does so multiple times if below half health.
+ Rapidly creates Cross Blasts under a target.
+ If chasers are off cooldown, creates four high-speed chasers.
+- IF TARGET WAS STRUCK IN MELEE: Creates a 3x3 square of blasts under the target.
+
+Cross Blasts and the AoE burst gain additional range as the Hierophant loses health, while Chasers gain additional speed.
+
+When The Hierophant dies, it leaves behind its staff, which, while much weaker than when wielded by The Hierophant itself, is still quite effective.
+- The staff can place a teleport rune, allowing the user to teleport themself and their allies to the rune.
+
+Difficulty: Hard
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/hierophant
+ name = "Hierophant"
+ desc = "An ancient, powerful priest-like being wielding a mighty staff."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "clubs"
+ //attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
+ attack_sound = "swing_hit"
+ icon_state = "hierophant"
+ icon_living = "hierophant"
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/hierophant.dmi'
+ faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house
+ speak_emote = list("preaches")
+ armour_penetration = 50
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ pixel_x = -16
+ ranged_cooldown_time = 40
+ aggro_vision_range = 23
+ loot = list(/obj/item/weapon/hierophant_staff)
+ wander = FALSE
+ var/burst_range = 3 //range on burst aoe
+ var/beam_range = 5 //range on cross blast beams
+ var/chaser_speed = 3 //how fast chasers are currently
+ var/chaser_cooldown = 101 //base cooldown/cooldown var between spawning chasers
+ var/major_attack_cooldown = 60 //base cooldown for major attacks
+ var/blinking = FALSE //if we're doing something that requires us to stand still and not attack
+ var/obj/effect/hierophant/spawned_rune //the rune we teleport back to
+ var/timeout_time = 15 //after this many Life() ticks with no target, we return to our rune
+ var/did_reset = TRUE //if we timed out, returned to our rune, and healed some
+ //var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...")
+ //var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.")
+ medal_type = MEDAL_PREFIX
+ score_type = BIRD_SCORE
+ del_on_death = TRUE
+ death_sound = 'sound/magic/Repulse.ogg'
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/New()
+ ..()
+ internal_gps = new/obj/item/device/gps/internal/hierophant(src)
+ spawned_rune = new(loc)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/Life()
+ . = ..()
+ if(. && spawned_rune && !client)
+ if(target || loc == spawned_rune.loc)
+ timeout_time = initial(timeout_time)
+ else
+ timeout_time--
+ if(timeout_time <= 0 && !did_reset)
+ did_reset = TRUE
+ //visible_message("
\"Vixyvrmrk xs fewi...\" ")
+ blink(spawned_rune)
+ adjustHealth(min((health - maxHealth) * 0.5, -50)) //heal for 50% of our missing health
+ wander = FALSE
+ /*if(health > maxHealth * 0.9)
+ visible_message("
\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\" ")
+ else
+ visible_message("
\"Vitemvw gsqtpixi. Stivexmsrep ijjmgmirgc gsqtvsqmwih.\" ")*/
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/death()
+ if(health > 0 || stat == DEAD)
+ return
+ else
+ stat = DEAD
+ blinking = TRUE //we do a fancy animation, release a huge burst(), and leave our staff.
+ animate(src, alpha = 0, color = "660099", time = 20, easing = EASE_OUT)
+ burst_range = 10
+ //visible_message("
\"Mrmxmexmrk wipj-hiwxvygx wiuyirgi...\" ")
+ visible_message("
[src] disappears in a massive burst of magic, leaving only its staff. ")
+ burst(get_turf(src))
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy()
+ QDEL_NULL(spawned_rune)
+ . = ..()
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L)
+ for(var/obj/item/W in L)
+ if(!L.unEquip(W))
+ qdel(W)
+ /*visible_message(
+ "
\"[pick(kill_phrases)]\" \n
[src] annihilates [L]! ",
+ "
You annihilate [L], restoring your health! ")*/
+ visible_message(
+ "
\"Caw.\" \n
[src] annihilates [L]! ",
+ "
You annihilate [L], restoring your health! ")
+ adjustHealth(-L.maxHealth*0.5)
+ L.dust()
+
+/*/mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target)
+ var/targets_the_same = (new_target == target)
+ . = ..()
+ if(. && target && !targets_the_same)
+ visible_message("
\"[pick(target_phrases)]\" ")*/
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount)
+ . = ..()
+ if(src && amount > 0 && !blinking)
+ wander = TRUE
+ did_reset = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/AttackingTarget()
+ if(!blinking)
+ if(target && isliving(target))
+ spawn(0)
+ melee_blast(get_turf(target)) //melee attacks on living mobs produce a 3x3 blast
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/DestroySurroundings()
+ if(!blinking)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/Move()
+ if(!blinking)
+ /*if(!stat)
+ playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4)*/
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/Goto(target, delay, minimum_distance)
+ wander = TRUE
+ if(!blinking)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall
+ did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall
+ anger_modifier = Clamp(((maxHealth - health) / 42),0,50)
+ burst_range = initial(burst_range) + round(anger_modifier * 0.08)
+ beam_range = initial(beam_range) + round(anger_modifier * 0.12)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/OpenFire()
+ calculate_rage()
+ var/target_is_slow = FALSE
+ if(isliving(target))
+ var/mob/living/L = target
+ if(!blinking && L.stat == DEAD && get_dist(src, L) > 2)
+ blink(L)
+ return
+ if(L.movement_delay() > 1.5)
+ target_is_slow = TRUE
+ chaser_speed = max(1, (3 - anger_modifier * 0.04) + target_is_slow * 0.5)
+ if(blinking)
+ return
+ ranged_cooldown = world.time + max(5, ranged_cooldown_time - anger_modifier * 0.75) //scale cooldown lower with high anger.
+
+ if(prob(anger_modifier * 0.75)) //major ranged attack
+ var/list/possibilities = list()
+ var/cross_counter = 1 + round(anger_modifier * 0.12)
+ if(cross_counter > 1)
+ possibilities += "cross_blast_spam"
+ if(get_dist(src, target) > 2)
+ possibilities += "blink_spam"
+ if(chaser_cooldown < world.time)
+ if(prob(anger_modifier * 2))
+ possibilities = list("chaser_swarm")
+ else
+ possibilities += "chaser_swarm"
+ if(possibilities.len)
+ ranged_cooldown = world.time + max(5, major_attack_cooldown - anger_modifier * 0.75) //we didn't cancel out of an attack, use the higher cooldown
+ var/blink_counter = 1 + round(anger_modifier * 0.08)
+ switch(pick(possibilities))
+ if("blink_spam") //blink either once or multiple times.
+ if(health < maxHealth * 0.5 && !target_is_slow && blink_counter > 1)
+ //visible_message("
\"Mx ampp rsx iwgeti.\" ")
+ animate(src, color = "#660099", time = 6)
+ while(health && target && blink_counter)
+ if(loc == target.loc || loc == target) //we're on the same tile as them after about a second we can stop now
+ break
+ blink_counter--
+ blinking = FALSE
+ blink(target)
+ blinking = TRUE
+ sleep(5)
+ animate(src, color = initial(color), time = 8)
+ sleep(8)
+ blinking = FALSE
+ else
+ blink(target)
+ if("cross_blast_spam") //fire a lot of cross blasts at a target.
+ //visible_message("
\"Piezi mx rsalivi xs vyr.\" ")
+ blinking = TRUE
+ animate(src, color = "#660099", time = 6)
+ while(health && target && cross_counter)
+ cross_counter--
+ var/delay = 6
+ if(prob(60))
+ spawn(0)
+ cardinal_blasts(target)
+ else
+ spawn(0)
+ diagonal_blasts(target)
+ delay = 5 //this one isn't so mean, so do the next one faster(if there is one)
+ sleep(delay)
+ animate(src, color = initial(color), time = 8)
+ sleep(8)
+ blinking = FALSE
+ if("chaser_swarm") //fire four fucking chasers at a target and their friends.
+ //visible_message("
\"Mx gerrsx lmhi.\" ")
+ blinking = TRUE
+ animate(src, color = "#660099", time = 10)
+ var/list/targets = ListTargets()
+ var/list/cardinal_copy = cardinal.Copy()
+ while(health && targets.len && cardinal_copy.len)
+ var/mob/living/pickedtarget = pick(targets)
+ if(targets.len > 4)
+ pickedtarget = pick_n_take(targets)
+ if(pickedtarget.stat == DEAD)
+ pickedtarget = target
+ var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
+ C.moving = 3
+ C.moving_dir = pick_n_take(cardinal_copy)
+ sleep(10)
+ chaser_cooldown = world.time + initial(chaser_cooldown)
+ animate(src, color = initial(color), time = 8)
+ sleep(8)
+ blinking = FALSE
+ return
+
+ if(prob(10 + (anger_modifier * 0.5)) && get_dist(src, target) > 2)
+ blink(target)
+
+ else if(prob(70 - anger_modifier)) //a cross blast of some type
+ if(prob(anger_modifier)) //at us?
+ if(prob(anger_modifier * 2) && health < maxHealth * 0.5) //we're super angry do it at all dirs
+ spawn(0)
+ alldir_blasts(src)
+ else if(prob(60))
+ spawn(0)
+ cardinal_blasts(src)
+ else
+ spawn(0)
+ diagonal_blasts(src)
+ else //at them?
+ if(prob(anger_modifier * 2) && health < maxHealth * 0.5 && !target_is_slow) //we're super angry do it at all dirs
+ spawn(0)
+ alldir_blasts(target)
+ else if(prob(60))
+ spawn(0)
+ cardinal_blasts(target)
+ else
+ spawn(0)
+ diagonal_blasts(target)
+ else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some!
+ var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
+ chaser_cooldown = world.time + initial(chaser_cooldown)
+ if((prob(anger_modifier) || target.Adjacent(src)) && target != src)
+ var/obj/effect/overlay/temp/hierophant/chaser/OC = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
+ OC.moving = 4
+ OC.moving_dir = pick(cardinal - C.moving_dir)
+ else //just release a burst of power
+ spawn(0)
+ burst(get_turf(src))
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/diagonal_blasts(mob/victim) //fire diagonal cross blasts with a delay
+ var/turf/T = get_turf(victim)
+ if(!T)
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph/diagonal(T, src)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ sleep(2)
+ new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ for(var/d in diagonals)
+ spawn(0)
+ blast_wall(T, d)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/cardinal_blasts(mob/victim) //fire cardinal cross blasts with a delay
+ var/turf/T = get_turf(victim)
+ if(!T)
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, src)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ sleep(2)
+ new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ for(var/d in cardinal)
+ spawn(0)
+ blast_wall(T, d)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/alldir_blasts(mob/victim) //fire alldir cross blasts with a delay
+ var/turf/T = get_turf(victim)
+ if(!T)
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ sleep(2)
+ new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ for(var/d in alldirs)
+ spawn(0)
+ blast_wall(T, d)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blast_wall(turf/T, dir) //make a wall of blasts beam_range tiles long
+ var/range = beam_range
+ var/turf/previousturf = T
+ var/turf/J = get_step(previousturf, dir)
+ for(var/i in 1 to range)
+ new /obj/effect/overlay/temp/hierophant/blast(J, src, FALSE)
+ previousturf = J
+ J = get_step(previousturf, dir)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blink(mob/victim) //blink to a target
+ if(blinking || !victim)
+ return
+ var/turf/T = get_turf(victim)
+ var/turf/source = get_turf(src)
+ new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ new /obj/effect/overlay/temp/hierophant/telegraph(source, src)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
+ playsound(source,'sound/magic/blink.ogg', 200, 1)
+ //playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
+ blinking = TRUE
+ sleep(2) //short delay before we start...
+ new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, src)
+ new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, src)
+ for(var/t in RANGE_TURFS(1, T))
+ var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ B.damage = 30
+ for(var/t in RANGE_TURFS(1, source))
+ var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ B.damage = 30
+ animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
+ sleep(1)
+ visible_message("
[src] fades out! ")
+ density = FALSE
+ sleep(2)
+ forceMove(T)
+ sleep(1)
+ animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN
+ sleep(1)
+ density = TRUE
+ visible_message("
[src] fades in! ")
+ sleep(1) //at this point the blasts we made detonate
+ blinking = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/melee_blast(mob/victim) //make a 3x3 blast around a target
+ if(!victim)
+ return
+ var/turf/T = get_turf(victim)
+ if(!T)
+ return
+ new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ playsound(T,'sound/magic/blink.ogg', 200, 1)
+ //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ sleep(2)
+ for(var/t in RANGE_TURFS(1, T))
+ new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts
+ playsound(original,'sound/magic/blink.ogg', 200, 1)
+ //playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1)
+ var/last_dist = 0
+ for(var/t in spiral_range_turfs(burst_range, original))
+ var/turf/T = t
+ if(!T)
+ continue
+ var/dist = get_dist(original, T)
+ if(dist > last_dist)
+ last_dist = dist
+ sleep(1 + (burst_range - last_dist) * 0.5) //gets faster as it gets further out
+ new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
+ if(!istype(A) || get_dist(A, src) <= 2)
+ return
+ blink(A)
+
+//Hierophant overlays
+/obj/effect/overlay/temp/hierophant
+ layer = MOB_LAYER - 0.1
+ var/mob/living/caster //who made this, anyway
+
+/obj/effect/overlay/temp/hierophant/New(loc, new_caster)
+ ..()
+ if(new_caster)
+ caster = new_caster
+
+/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
+ duration = 98
+ var/mob/living/target //what it's following
+ var/turf/targetturf //what turf the target is actually on
+ var/moving_dir //what dir it's moving in
+ var/previous_moving_dir //what dir it was moving in before that
+ var/more_previouser_moving_dir //what dir it was moving in before THAT
+ var/moving = 0 //how many steps to move before recalculating
+ var/standard_moving_before_recalc = 4 //how many times we step before recalculating normally
+ var/tiles_per_step = 1 //how many tiles we move each step
+ var/speed = 3 //how many deciseconds between each step
+ var/currently_seeking = FALSE
+ var/friendly_fire_check = FALSE //if blasts produced apply friendly fire
+
+/obj/effect/overlay/temp/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire)
+ ..()
+ target = new_target
+ friendly_fire_check = is_friendly_fire
+ if(new_speed)
+ speed = new_speed
+ spawn(0)
+ seek_target()
+
+/obj/effect/overlay/temp/hierophant/chaser/proc/get_target_dir()
+ . = get_cardinal_dir(src, targetturf)
+ if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate
+ var/list/cardinal_copy = cardinal.Copy()
+ cardinal_copy -= more_previouser_moving_dir
+ . = pick(cardinal_copy)
+
+/obj/effect/overlay/temp/hierophant/chaser/proc/seek_target()
+ if(!currently_seeking)
+ currently_seeking = TRUE
+ targetturf = get_turf(target)
+ while(target && src && !qdeleted(src) && currently_seeking && x && y && targetturf) //can this target actually be sook out
+ if(!moving) //we're out of tiles to move, find more and where the target is!
+ more_previouser_moving_dir = previous_moving_dir
+ previous_moving_dir = moving_dir
+ moving_dir = get_target_dir()
+ var/standard_target_dir = get_cardinal_dir(src, targetturf)
+ if((standard_target_dir != previous_moving_dir && standard_target_dir == more_previouser_moving_dir) || standard_target_dir == 0)
+ moving = 1 //we would be repeating, only move a tile before checking
+ else
+ moving = standard_moving_before_recalc
+ if(moving) //move in the dir we're moving in right now
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to tiles_per_step)
+ var/maybe_new_turf = get_step(T, moving_dir)
+ if(maybe_new_turf)
+ T = maybe_new_turf
+ else
+ break
+ forceMove(T)
+ make_blast() //make a blast, too
+ moving--
+ sleep(speed)
+ targetturf = get_turf(target)
+
+/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast()
+ new /obj/effect/overlay/temp/hierophant/blast(loc, caster, friendly_fire_check)
+
+/obj/effect/overlay/temp/hierophant/telegraph
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "hierophant_telegraph"
+ pixel_x = -32
+ pixel_y = -32
+ duration = 3
+
+/obj/effect/overlay/temp/hierophant/telegraph/diagonal
+ icon_state = "hierophant_telegraph_diagonal"
+
+/obj/effect/overlay/temp/hierophant/telegraph/cardinal
+ icon_state = "hierophant_telegraph_cardinal"
+
+/obj/effect/overlay/temp/hierophant/telegraph/teleport
+ icon_state = "hierophant_telegraph_teleport"
+ duration = 9
+
+/obj/effect/overlay/temp/hierophant/blast
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "hierophant_blast"
+ name = "vortex blast"
+ luminosity = 1
+ desc = "Get out of the way!"
+ duration = 9
+ var/damage = 10 //how much damage do we do?
+ var/list/hit_things = list() //we hit these already, ignore them
+ var/friendly_fire_check = FALSE
+ var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
+
+/obj/effect/overlay/temp/hierophant/blast/New(loc, new_caster, friendly_fire)
+ ..()
+ friendly_fire_check = friendly_fire
+ if(new_caster)
+ hit_things += new_caster
+ if(ismineralturf(loc)) //drill mineral turfs
+ var/turf/simulated/mineral/M = loc
+ M.gets_drilled(caster)
+ spawn(0)
+ blast()
+
+/obj/effect/overlay/temp/hierophant/blast/proc/blast()
+ var/turf/T = get_turf(src)
+ if(!T)
+ return
+ playsound(T,'sound/magic/Blind.ogg', 125, 1, -5) //make a sound
+ sleep(6) //wait a little
+ bursting = TRUE
+ do_damage(T) //do damage and mark us as bursting
+ sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds
+ bursting = FALSE //we no longer damage crossers
+
+/obj/effect/overlay/temp/hierophant/blast/Crossed(atom/movable/AM)
+ ..()
+ if(bursting)
+ do_damage(get_turf(src))
+
+/obj/effect/overlay/temp/hierophant/blast/proc/do_damage(turf/T)
+ for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
+ hit_things += L
+ if((friendly_fire_check && caster && caster.faction_check(L)) || L.stat == DEAD)
+ continue
+ if(L.client)
+ flash_color(L.client, "#660099", 1)
+ playsound(L,'sound/weapons/sear.ogg', 50, 1, -4)
+ to_chat(L, "
You're struck by a [name]! ")
+ var/limb_to_hit = pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg")
+ var/armor = L.run_armor_check(limb_to_hit, "melee", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!")
+ L.apply_damage(damage, BURN, limb_to_hit, armor)
+ if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))
+ L.adjustBruteLoss(damage)
+ add_logs(caster, L, "struck with a [name]")
+ for(var/obj/mecha/M in T.contents - hit_things) //and mechs.
+ hit_things += M
+ if(M.occupant)
+ if(friendly_fire_check && caster && caster.faction_check(M.occupant))
+ continue
+ to_chat(M.occupant, "
Your [M.name] is struck by a [name]! ")
+ playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
+ M.take_damage(damage, BURN, 0, 0)
+
+/obj/effect/hierophant
+ name = "hierophant rune"
+ desc = "A powerful magic mark allowing whomever attunes themself to it to return to it at will."
+ icon = 'icons/obj/rune.dmi'
+ icon_state = "hierophant"
+ layer = 2.5
+ anchored = TRUE
+ color = "#CC00FF"
+
+/obj/effect/hierophant/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/hierophant_staff))
+ var/obj/item/weapon/hierophant_staff/H = I
+ if(H.rune == src)
+ to_chat(user, "
You start removing your hierophant rune... ")
+ H.timer = world.time + 51
+ if(do_after(user, 50, target = src))
+ playsound(src,'sound/magic/Blind.ogg', 200, 1, -4)
+ new /obj/effect/overlay/temp/hierophant/telegraph/teleport(get_turf(src), user)
+ to_chat(user, "
You touch the rune with the staff, dispelling it! ")
+ H.rune = null
+ user.update_action_buttons_icon()
+ qdel(src)
+ else
+ H.timer = world.time
+ else
+ to_chat(user, "
You touch the rune with the staff, but nothing happens. ")
+
+ else
+ ..()
+
+/obj/item/device/gps/internal/hierophant
+ icon_state = null
+ gpstag = "Zealous Signal"
+ desc = "Heed its words."
+ invisibility = 100
+
+/turf/simulated/indestructible/hierophant
+ icon_state = "hierophant1"
+ oxygen = 14
+ nitrogen = 23
+ temperature = 300
+ desc = "A floor with a square pattern. It's faintly cool to the touch."
+
+/turf/simulated/indestructible/hierophant/New()
+ ..()
+ if(prob(50))
+ icon_state = "hierophant2"
+
+/turf/simulated/indestructible/riveted/hierophant
+ name = "wall"
+ desc = "A wall made out of smooth, cold stone."
+ icon = 'icons/turf/walls/hierophant_wall.dmi'
+ icon_state = "hierophant"
+ smooth = SMOOTH_TRUE
+
+#undef MEDAL_PREFIX
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
new file mode 100644
index 00000000000..89119952f60
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -0,0 +1,142 @@
+#define MEDAL_PREFIX "Legion"
+/*
+
+LEGION
+
+Legion spawns from the necropolis gate in the far north of lavaland. It is the guardian of the Necropolis and emerges from within whenever an intruder tries to enter through its gate.
+Whenever Legion emerges, everything in lavaland will receive a notice via color, audio, and text. This is because Legion is powerful enough to slaughter the entirety of lavaland with little effort.
+
+It has two attack modes that it constantly rotates between.
+
+In ranged mode, it will behave like a normal legion - retreating when possible and firing legion skulls at the target.
+In charge mode, it will spin and rush its target, attacking with melee whenever possible.
+
+When Legion dies, it drops a staff of storms, which allows its wielder to call and disperse ash storms at will and functions as a powerful melee weapon.
+
+Difficulty: Medium
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/legion
+ name = "Legion"
+ health = 800
+ maxHealth = 800
+ icon_state = "legion"
+ icon_living = "legion"
+ desc = "One of many."
+ icon = 'icons/mob/lavaland/legion.dmi'
+ attacktext = "chomps"
+ attack_sound = 'sound/misc/demon_attack1.ogg'
+ speak_emote = list("echoes")
+ armour_penetration = 50
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ speed = 2
+ ranged = 1
+ del_on_death = 1
+ retreat_distance = 5
+ minimum_distance = 5
+ ranged_cooldown_time = 20
+ var/size = 5
+ var/charging = 0
+ medal_type = MEDAL_PREFIX
+ score_type = LEGION_SCORE
+ pixel_y = -90
+ pixel_x = -75
+ loot = list(/obj/item/stack/sheet/bone = 3)
+ vision_range = 13
+ elimination = 1
+ idle_vision_range = 13
+ appearance_flags = 0
+ mouse_opacity = 1
+ stat_attack = 1 // Overriden from /tg/ - otherwise Legion starts chasing its minions
+
+/mob/living/simple_animal/hostile/megafauna/legion/New()
+ ..()
+ internal_gps = new/obj/item/device/gps/internal/legion(src)
+
+/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget()
+ ..()
+ if(ishuman(target))
+ var/mob/living/L = target
+ if(L.stat == UNCONSCIOUS)
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
+ A.infest(L)
+
+/mob/living/simple_animal/hostile/megafauna/legion/OpenFire(the_target)
+ if(world.time >= ranged_cooldown && !charging)
+ if(prob(75))
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
+ A.GiveTarget(target)
+ A.friends = friends
+ A.faction = faction
+ ranged_cooldown = world.time + ranged_cooldown_time
+ else
+ visible_message("
[src] charges! ")
+ SpinAnimation(speed = 20, loops = 5)
+ ranged = 0
+ retreat_distance = 0
+ minimum_distance = 0
+ speed = 0
+ charging = 1
+ spawn(50)
+ reset_charge()
+
+/mob/living/simple_animal/hostile/megafauna/legion/proc/reset_charge()
+ ranged = 1
+ retreat_distance = 5
+ minimum_distance = 5
+ speed = 2
+ charging = 0
+
+/mob/living/simple_animal/hostile/megafauna/legion/death()
+ if(health > 0)
+ return
+ if(size > 1)
+ adjustHealth(-maxHealth) //heal ourself to full in prep for splitting
+ var/mob/living/simple_animal/hostile/megafauna/legion/L = new(loc)
+
+ L.maxHealth = maxHealth * 0.6
+ maxHealth = L.maxHealth
+
+ L.health = L.maxHealth
+ health = maxHealth
+
+ size--
+ L.size = size
+
+ L.resize = L.size * 0.2
+ transform = initial(transform)
+ resize = size * 0.2
+
+ L.update_transform()
+ update_transform()
+
+ L.faction = faction.Copy()
+
+ L.GiveTarget(target)
+
+ visible_message("
[src] splits in twain! ")
+ else
+ var/last_legion = TRUE
+ for(var/mob/living/simple_animal/hostile/megafauna/legion/other in mob_list)
+ if(other != src)
+ last_legion = FALSE
+ break
+ if(last_legion)
+ loot = list(/obj/item/weapon/staff/storm)
+ elimination = 0
+ else if(prob(5))
+ loot = list(/obj/structure/closet/crate/necropolis/tendril)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/obj/item/device/gps/internal/legion
+ icon_state = null
+ gpstag = "Echoing Signal"
+ desc = "The message repeats."
+ invisibility = 100
+
+#undef MEDAL_PREFIX
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
new file mode 100644
index 00000000000..a8102b94b94
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -0,0 +1,231 @@
+#define MEDAL_PREFIX "Boss"
+
+/mob/living/simple_animal/hostile/megafauna
+ name = "megafauna"
+ desc = "Attack the weak point for massive damage."
+ health = 1000
+ maxHealth = 1000
+ a_intent = "harm"
+ sentience_type = SENTIENCE_BOSS
+ environment_smash = 3
+ luminosity = 3
+ faction = list("mining", "boss")
+ weather_immunities = list("lava","ash")
+ flying = 1
+ robust_searching = 1
+ ranged_ignores_vision = TRUE
+ stat_attack = 2
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ minbodytemp = 0
+ maxbodytemp = INFINITY
+ aggro_vision_range = 18
+ idle_vision_range = 5
+ environment_target_typecache = list(
+ /obj/machinery/door/window,
+ /obj/structure/window,
+ /obj/structure/closet,
+ /obj/structure/table,
+ /obj/structure/grille,
+ /obj/structure/girder,
+ /obj/structure/rack,
+ /obj/structure/barricade,
+ /obj/machinery/field,
+ /obj/machinery/power/emitter)
+ var/medal_type = MEDAL_PREFIX
+ var/score_type = BOSS_SCORE
+ var/elimination = 0
+ var/anger_modifier = 0
+ var/obj/item/device/gps/internal_gps
+ anchored = TRUE
+ mob_size = MOB_SIZE_LARGE
+ layer = MOB_LAYER + 0.5 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
+ mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
+
+/mob/living/simple_animal/hostile/megafauna/Destroy()
+ QDEL_NULL(internal_gps)
+ . = ..()
+
+/mob/living/simple_animal/hostile/megafauna/death(gibbed)
+ if(health > 0)
+ return
+ else
+ if(!admin_spawned)
+ feedback_set_details("megafauna_kills","[initial(name)]")
+ if(!elimination) //used so the achievment only occurs for the last legion to die.
+ grant_achievement(medal_type,score_type)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/gib()
+ if(health > 0)
+ return
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dust()
+ if(health > 0)
+ return
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/AttackingTarget()
+ ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat != DEAD)
+ if(!client && ranged && ranged_cooldown <= world.time)
+ OpenFire()
+ else
+ devour(L)
+
+/mob/living/simple_animal/hostile/megafauna/onShuttleMove()
+ var/turf/oldloc = loc
+ . = ..()
+ if(!.)
+ return
+ var/turf/newloc = loc
+ message_admins("Megafauna [src] \
+ (
FLW ) \
+ moved via shuttle from ([oldloc.x], [oldloc.y], [oldloc.z]) to \
+ ([newloc.x], [newloc.y], [newloc.z])")
+
+/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L)
+ if(!L)
+ return
+ visible_message(
+ "
[src] devours [L]! ",
+ "
You feast on [L], restoring your health! ")
+ if(!is_station_level(z) && !client) //NPC monsters won't heal while on station
+ adjustBruteLoss(-L.maxHealth/2)
+ L.gib()
+
+/mob/living/simple_animal/hostile/megafauna/ex_act(severity, target)
+ switch(severity)
+ if(1)
+ adjustBruteLoss(250)
+
+ if(2)
+ adjustBruteLoss(100)
+
+ if(3)
+ adjustBruteLoss(50)
+
+/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype,scoretype)
+
+ if(medal_type == "Boss") //Don't award medals if the medal type isn't set
+ return
+
+ if(admin_spawned)
+ return
+
+ if(global.medal_hub && global.medal_pass && global.medals_enabled)
+ for(var/mob/living/L in view(7,src))
+ if(L.stat)
+ continue
+ if(L.client)
+ var/client/C = L.client
+ var/suffixm = BOSS_KILL_MEDAL
+ UnlockMedal("Boss [suffixm]",C)
+ UnlockMedal("[medaltype] [suffixm]",C)
+ SetScore(BOSS_SCORE,C,1)
+ SetScore(score_type,C,1)
+
+/proc/UnlockMedal(medal,client/player)
+
+ if(!player || !medal)
+ return
+ if(global.medal_hub && global.medal_pass && global.medals_enabled)
+ spawn()
+ var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
+ if(isnull(result))
+ global.medals_enabled = FALSE
+ log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]")
+ message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
+ else if(result)
+ to_chat(player.mob, "
Achievement unlocked: [medal]! ")
+
+
+/proc/SetScore(score,client/player,increment,force)
+
+ if(!score || !player)
+ return
+ if(global.medal_hub && global.medal_pass && global.medals_enabled)
+ spawn()
+ var/list/oldscore = GetScore(score,player,1)
+
+ if(increment)
+ if(!oldscore[score])
+ oldscore[score] = 1
+ else
+ oldscore[score] = (text2num(oldscore[score]) + 1)
+ else
+ oldscore[score] = force
+
+ var/newscoreparam = list2params(oldscore)
+
+ var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass)
+
+ if(isnull(result))
+ global.medals_enabled = FALSE
+ log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]")
+ message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
+
+
+/proc/GetScore(score,client/player,returnlist)
+
+ if(!score || !player)
+ return
+ if(global.medal_hub && global.medal_pass && global.medals_enabled)
+
+ var/scoreget = world.GetScores(player.ckey, score, global.medal_hub, global.medal_pass)
+ if(isnull(scoreget))
+ global.medals_enabled = FALSE
+ log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.ckey]")
+ message_admins("Error! Failed to contact hub to get score: [score] for [player.ckey]!")
+ return
+
+ var/list/scoregetlist = params2list(scoreget)
+
+ if(returnlist)
+ return scoregetlist
+ else
+ return scoregetlist[score]
+
+
+/proc/CheckMedal(medal,client/player)
+
+ if(!player || !medal)
+ return
+ if(global.medal_hub && global.medal_pass && global.medals_enabled)
+
+ var/result = world.GetMedal(medal, player, global.medal_hub, global.medal_pass)
+
+ if(isnull(result))
+ global.medals_enabled = FALSE
+ log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player:[player.ckey]")
+ message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!")
+ else if(result)
+ to_chat(player.mob, "[medal] is unlocked")
+
+/proc/LockMedal(medal,client/player)
+
+ if(!player || !medal)
+ return
+ if(global.medal_hub && global.medal_pass && global.medals_enabled)
+
+ var/result = world.ClearMedal(medal, player, global.medal_hub, global.medal_pass)
+
+ if(isnull(result))
+ global.medals_enabled = FALSE
+ log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.ckey]")
+ message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!")
+ else if(result)
+ message_admins("Medal: [medal] removed for [player.ckey]")
+ else
+ message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.")
+
+
+/proc/ClearScore(client/player)
+ world.SetScores(player.ckey, "", global.medal_hub, global.medal_pass)
+
+#undef MEDAL_PREFIX
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index ac9b8562681..0b28722e497 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/mimic
name = "crate"
desc = "A rectangular steel crate."
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/crates.dmi'
icon_state = "crate"
icon_living = "crate"
@@ -91,10 +91,6 @@
..()
icon_state = initial(icon_state)
-/mob/living/simple_animal/hostile/mimic/crate/LostTarget()
- ..()
- icon_state = initial(icon_state)
-
/mob/living/simple_animal/hostile/mimic/crate/death(gibbed)
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
new file mode 100644
index 00000000000..3e6d98afd95
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
@@ -0,0 +1,78 @@
+/mob/living/simple_animal/hostile/asteroid/goldgrub
+ name = "goldgrub"
+ desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
+ icon = 'icons/mob/animal.dmi'
+ icon_state = "Goldgrub"
+ icon_living = "Goldgrub"
+ icon_aggro = "Goldgrub_alert"
+ icon_dead = "Goldgrub_dead"
+ icon_gib = "syndicate_gib"
+ vision_range = 2
+ aggro_vision_range = 9
+ idle_vision_range = 2
+ move_to_delay = 5
+ friendly = "harmlessly rolls into"
+ maxHealth = 45
+ health = 45
+ harm_intent_damage = 5
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ attacktext = "barrels into"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ a_intent = I_HELP
+ speak_emote = list("screeches")
+ throw_message = "sinks in slowly, before being pushed out of "
+ status_flags = CANPUSH
+ search_objects = 1
+ wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
+ /obj/item/weapon/ore/uranium)
+
+ var/chase_time = 100
+ var/will_burrow = TRUE
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/New()
+ ..()
+ var/i = rand(1,3)
+ while(i)
+ loot += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond)
+ i--
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target)
+ target = new_target
+ if(target != null)
+ if(istype(target, /obj/item/weapon/ore) && loot.len < 10)
+ visible_message("
The [src.name] looks at [target.name] with hungry eyes. ")
+ else if(isliving(target))
+ Aggro()
+ visible_message("
The [src.name] tries to flee from [target.name]! ")
+ retreat_distance = 10
+ minimum_distance = 10
+ if(will_burrow)
+ spawn(chase_time)
+ Burrow()
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
+ if(istype(target, /obj/item/weapon/ore))
+ EatOre(target)
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(var/atom/targeted_ore)
+ for(var/obj/item/weapon/ore/O in targeted_ore.loc)
+ if(loot.len < 10)
+ loot += O.type
+ qdel(O)
+ visible_message("
The ore was swallowed whole! ")
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
+ if(!stat)
+ visible_message("
The [src.name] buries into the ground, vanishing from sight! ")
+ qdel(src)
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P)
+ visible_message("
The [P.name] was repelled by [src.name]'s girth! ")
+ return
+
+/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage)
+ idle_vision_range = 9
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
new file mode 100644
index 00000000000..517b71a3a6d
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -0,0 +1,320 @@
+/mob/living/simple_animal/hostile/asteroid/hivelord
+ name = "hivelord"
+ desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "Hivelord"
+ icon_living = "Hivelord"
+ icon_aggro = "Hivelord_alert"
+ icon_dead = "Hivelord_dead"
+ icon_gib = "syndicate_gib"
+ mouse_opacity = 2
+ move_to_delay = 14
+ ranged = 1
+ vision_range = 5
+ aggro_vision_range = 9
+ idle_vision_range = 5
+ speed = 3
+ maxHealth = 75
+ health = 75
+ harm_intent_damage = 5
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ attacktext = "lashes out at"
+ speak_emote = list("telepathically cries")
+ attack_sound = 'sound/weapons/pierce.ogg'
+ throw_message = "falls right through the strange body of the"
+ ranged_cooldown = 0
+ ranged_cooldown_time = 20
+ environment_smash = 0
+ retreat_distance = 3
+ minimum_distance = 3
+ pass_flags = PASSTABLE
+ loot = list(/obj/item/organ/internal/hivelord_core)
+ var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood
+
+/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target)
+ if(world.time >= ranged_cooldown)
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new brood_type(src.loc)
+ A.admin_spawned = admin_spawned
+ A.GiveTarget(target)
+ A.friends = friends
+ A.faction = faction.Copy()
+ ranged_cooldown = world.time + ranged_cooldown_time
+
+/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
+ OpenFire()
+
+/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
+ mouse_opacity = 1
+ ..(gibbed)
+
+/obj/item/organ/internal/hivelord_core
+ name = "hivelord remains"
+ desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly."
+ icon_state = "roro core 2"
+ flags = NOBLUDGEON
+ slot = "hivecore"
+ force = 0
+ actions_types = list(/datum/action/item_action/organ_action/use)
+ var/inert = 0
+ var/preserved = 0
+
+/obj/item/organ/internal/hivelord_core/New()
+ ..()
+ addtimer(src, "inert_check", 2400)
+
+/obj/item/organ/internal/hivelord_core/proc/inert_check()
+ if(!owner && !preserved)
+ go_inert()
+ else
+ preserved(implanted = 1)
+
+/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0)
+ inert = FALSE
+ preserved = TRUE
+ update_icon()
+
+ if(implanted)
+ feedback_add_details("hivelord_core", "[type]|implanted")
+ else
+ feedback_add_details("hivelord_core", "[type]|stabilizer")
+
+
+/obj/item/organ/internal/hivelord_core/proc/go_inert()
+ inert = TRUE
+ desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."
+ feedback_add_details("hivelord_core", "[src.type]|inert")
+ update_icon()
+
+/obj/item/organ/internal/hivelord_core/ui_action_click()
+ owner.revive()
+ qdel(src)
+
+/obj/item/organ/internal/hivelord_core/on_life()
+ ..()
+ if(owner.health < config.health_threshold_crit)
+ ui_action_click()
+
+/obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag)
+ if(proximity_flag && ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(inert)
+ to_chat(user, "
[src] has become inert, its healing properties are no more. ")
+ return
+ else
+ if(H.stat == DEAD)
+ to_chat(user, "
[src] are useless on the dead. ")
+ return
+ if(H != user)
+ H.visible_message("[user] forces [H] to apply [src]... They quickly regenerate all injuries!")
+ feedback_add_details("hivelord_core","[src.type]|used|other")
+ else
+ to_chat(user, "
You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments. ")
+ feedback_add_details("hivelord_core","[src.type]|used|self")
+ playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
+ H.revive()
+ user.drop_item()
+ qdel(src)
+ ..()
+
+/obj/item/organ/internal/hivelord_core/prepare_eat()
+ return null
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood
+ name = "hivelord brood"
+ desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "Hivelordbrood"
+ icon_living = "Hivelordbrood"
+ icon_aggro = "Hivelordbrood"
+ icon_dead = "Hivelordbrood"
+ icon_gib = "syndicate_gib"
+ mouse_opacity = 2
+ move_to_delay = 1
+ friendly = "buzzes near"
+ vision_range = 10
+ speed = 3
+ maxHealth = 1
+ health = 1
+ flying = 1
+ harm_intent_damage = 5
+ melee_damage_lower = 2
+ melee_damage_upper = 2
+ attacktext = "slashes"
+ speak_emote = list("telepathically cries")
+ attack_sound = 'sound/weapons/pierce.ogg'
+ throw_message = "falls right through the strange body of the"
+ environment_smash = 0
+ pass_flags = PASSTABLE
+ del_on_death = 1
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New()
+ ..()
+ addtimer(src, "death", 100)
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood
+ name = "blood brood"
+ desc = "A living string of blood and alien materials."
+ icon_state = "bloodbrood"
+ icon_living = "bloodbrood"
+ icon_aggro = "bloodbrood"
+ attacktext = "pierces"
+ color = "#C80000"
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/death()
+ if(loc) // Splash the turf we are on with blood
+ reagents.reaction(get_turf(src))
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/New()
+ create_reagents(30)
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/AttackingTarget()
+ ..()
+ if(iscarbon(target))
+ transfer_reagents(target, 1)
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_hand(mob/living/carbon/human/M)
+ if("\ref[M]" in faction)
+ reabsorb_host(M)
+ else
+ return ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_alien(mob/living/carbon/alien/humanoid/M)
+ if("\ref[M]" in faction)
+ reabsorb_host(M)
+ else
+ return ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/reabsorb_host(mob/living/carbon/C)
+ C.visible_message("
[src] is reabsorbed by [C]'s body. ", \
+ "
[src] is reabsorbed by your body. ")
+ transfer_reagents(C)
+ death()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/transfer_reagents(mob/living/carbon/C, volume = 30)
+ if(!reagents.total_volume)
+ return
+
+ volume = min(volume, reagents.total_volume)
+
+ var/fraction = min(volume/reagents.total_volume, 1)
+ reagents.reaction(C, INGEST, fraction)
+ reagents.trans_to(C, volume)
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/human/H)
+ faction = list("\ref[src]", "\ref[H]") // Hostile to everyone except the host.
+ H.vessel.trans_to(src, 30)
+ color = mix_color_from_reagents(reagents.reagent_list)
+
+// Legion
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion
+ name = "legion"
+ desc = "You can still see what was once a human under the shifting mass of corruption."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "legion"
+ icon_living = "legion"
+ icon_aggro = "legion"
+ icon_dead = "legion"
+ icon_gib = "syndicate_gib"
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ attacktext = "lashes out at"
+ speak_emote = list("echoes")
+ attack_sound = 'sound/weapons/pierce.ogg'
+ throw_message = "bounces harmlessly off of"
+ loot = list(/obj/item/organ/internal/hivelord_core/legion)
+ brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
+ del_on_death = 1
+ stat_attack = 1
+ robust_searching = 1
+ var/mob/living/carbon/human/stored_mob
+
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed)
+ visible_message("
The skulls on [src] wail in anger as they flee from their dying host! ")
+ var/turf/T = get_turf(src)
+ if(T)
+ if(stored_mob)
+ stored_mob.forceMove(get_turf(src))
+ stored_mob = null
+ else
+ new /obj/effect/landmark/corpse/damaged(T)
+ ..(gibbed)
+
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
+ name = "legion"
+ desc = "One of many."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "legion_head"
+ icon_living = "legion_head"
+ icon_aggro = "legion_head"
+ icon_dead = "legion_head"
+ icon_gib = "syndicate_gib"
+ friendly = "buzzes near"
+ vision_range = 10
+ maxHealth = 1
+ health = 5
+ harm_intent_damage = 5
+ melee_damage_lower = 12
+ melee_damage_upper = 12
+ attacktext = "bites"
+ speak_emote = list("echoes")
+ attack_sound = 'sound/weapons/pierce.ogg'
+ throw_message = "is shrugged off by"
+ pass_flags = PASSTABLE
+ del_on_death = 1
+ stat_attack = 1
+ robust_searching = 1
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
+ if(isturf(loc))
+ for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
+ if(H.stat == UNCONSCIOUS)
+ infest(H)
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
+ visible_message("
[name] burrows into the flesh of [H]! ")
+ var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = new(H.loc)
+ visible_message("
[L] staggers to their feet! ")
+ H.death()
+ H.adjustBruteLoss(1000)
+ L.stored_mob = H
+ H.forceMove(L)
+ qdel(src)
+
+/obj/item/organ/internal/hivelord_core/legion
+ name = "legion's soul"
+ desc = "A strange rock that still crackles with power... its \
+ healing properties will soon become inert if not used quickly."
+ icon_state = "legion_soul"
+
+/obj/item/organ/internal/hivelord_core/legion/New()
+ ..()
+ update_icon()
+
+/obj/item/organ/internal/hivelord_core/legion/update_icon()
+ icon_state = inert ? "legion_soul_inert" : "legion_soul"
+ overlays.Cut()
+ if(!inert && !preserved)
+ overlays += image(icon, "legion_soul_crackle")
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/organ/internal/hivelord_core/legion/go_inert()
+ . = ..()
+ desc = "[src] has become inert, it crackles no more and is useless for \
+ healing injuries."
+
+/obj/item/organ/internal/hivelord_core/legion/preserved(implanted = 0)
+ ..()
+ desc = "[src] has been stabilized. It no longer crackles with power, but it's healing properties are preserved indefinitely."
+
+/obj/item/weapon/legion_skull
+ name = "legion's head"
+ desc = "The once living, now empty eyes of the former human's skull cut deep into your soul."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "skull"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 47c243e970e..3298e334bd2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -58,7 +58,7 @@
projectilesound = 'sound/weapons/pierce.ogg'
ranged = 1
ranged_message = "stares"
- ranged_cooldown_cap = 20
+ ranged_cooldown_time = 30
throw_message = "does nothing against the hard shell of"
vision_range = 2
speed = 3
@@ -71,7 +71,6 @@
a_intent = I_HARM
speak_emote = list("chitters")
attack_sound = 'sound/weapons/bladeslice.ogg'
- ranged_cooldown_cap = 4
aggro_vision_range = 9
idle_vision_range = 2
turns_per_move = 5
@@ -104,232 +103,6 @@
if(3.0)
adjustBruteLoss(110)
-/mob/living/simple_animal/hostile/asteroid/goldgrub
- name = "goldgrub"
- desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
- icon = 'icons/mob/animal.dmi'
- icon_state = "Goldgrub"
- icon_living = "Goldgrub"
- icon_aggro = "Goldgrub_alert"
- icon_dead = "Goldgrub_dead"
- icon_gib = "syndicate_gib"
- vision_range = 2
- aggro_vision_range = 9
- idle_vision_range = 2
- move_to_delay = 5
- friendly = "harmlessly rolls into"
- maxHealth = 45
- health = 45
- harm_intent_damage = 5
- melee_damage_lower = 0
- melee_damage_upper = 0
- attacktext = "barrels into"
- attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = I_HELP
- speak_emote = list("screeches")
- throw_message = "sinks in slowly, before being pushed out of "
- status_flags = CANPUSH
- search_objects = 1
- wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
- /obj/item/weapon/ore/uranium)
-
- var/list/ore_types_eaten = list()
- var/alerted = 0
- var/ore_eaten = 1
- var/chase_time = 100
- var/will_burrow = 1
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/New()
- ..()
- ore_types_eaten += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond)
- ore_eaten = rand(1,3)
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(var/new_target)
- target = new_target
- if(target != null)
- if(istype(target, /obj/item/weapon/ore))
- visible_message("
The [src.name] looks at [target.name] with hungry eyes. ")
- else if(isliving(target))
- Aggro()
- visible_message("
The [src.name] tries to flee from [target.name]! ")
- retreat_distance = 10
- minimum_distance = 10
- Burrow()
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
- if(istype(target, /obj/item/weapon/ore))
- EatOre(target)
- return
- ..()
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(var/atom/targeted_ore)
- for(var/obj/item/weapon/ore/O in targeted_ore.loc)
- ore_eaten++
- if(!(O.type in ore_types_eaten))
- ore_types_eaten += O.type
- qdel(O)
- if(ore_eaten > 10)//Limit the scope of the reward you can get, or else things might get silly
- ore_eaten = 10
- visible_message("
The ore was swallowed whole! ")
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
- if(!alerted && will_burrow)
- alerted = 1
- spawn(chase_time)
- if(alerted)
- visible_message("
The [src.name] buries into the ground, vanishing from sight! ")
- qdel(src)
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Reward()
- if(!ore_eaten || ore_types_eaten.len == 0)
- return
- visible_message("
[src] spits up the contents of its stomach before dying! ")
- var/counter
- for(var/R in ore_types_eaten)
- for(counter=0, counter < ore_eaten, counter++)
- new R(src.loc)
- ore_types_eaten.Cut()
- ore_eaten = 0
-
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(var/obj/item/projectile/P)
- visible_message("
The [P.name] was repelled by [src.name]'s girth! ")
- return
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed)
- alerted = 0
- Reward()
- ..()
-
-/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage)
- idle_vision_range = 9
- ..()
-
-/mob/living/simple_animal/hostile/asteroid/hivelord
- name = "hivelord"
- desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original."
- icon = 'icons/mob/animal.dmi'
- icon_state = "Hivelord"
- icon_living = "Hivelord"
- icon_aggro = "Hivelord_alert"
- icon_dead = "Hivelord_dead"
- icon_gib = "syndicate_gib"
- mouse_opacity = 2
- move_to_delay = 14
- ranged = 1
- vision_range = 5
- aggro_vision_range = 9
- idle_vision_range = 5
- speed = 3
- maxHealth = 75
- health = 75
- harm_intent_damage = 5
- melee_damage_lower = 0
- melee_damage_upper = 0
- attacktext = "lashes out at"
- speak_emote = list("telepathically cries")
- attack_sound = 'sound/weapons/pierce.ogg'
- throw_message = "falls right through the strange body of the"
- ranged_cooldown = 0
- ranged_cooldown_cap = 0
- environment_smash = 0
- retreat_distance = 3
- minimum_distance = 3
- pass_flags = PASSTABLE
- loot = list(/obj/item/organ/internal/hivelord_core)
-
-/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(var/the_target)
- var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood(src.loc)
- A.GiveTarget(target)
- A.friends = friends
- A.faction = faction
- return
-
-/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
- OpenFire()
-
-/obj/item/organ/internal/hivelord_core
- name = "hivelord remains"
- desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly. Try not to think about what you're eating."
- icon = 'icons/obj/food/food.dmi'
- icon_state = "boiledrorocore"
- slot = "hivecore"
- var/inert = 0
- var/preserved = 0
-
-/obj/item/organ/internal/hivelord_core/New()
- spawn(2400)
- if(!preserved)
- inert = 1
- desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."
-
-/obj/item/organ/internal/hivelord_core/on_life()
- ..()
- if(owner)
- owner.adjustBruteLoss(-1)
- owner.adjustFireLoss(-1)
- owner.adjustOxyLoss(-2)
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- var/datum/reagent/blood/B = locate() in H.vessel.reagent_list //Grab some blood
- var/blood_volume = round(H.vessel.get_reagent_amount("blood"))
- if(B && blood_volume < H.max_blood && blood_volume)
- B.volume += 2 // Fast blood regen
-
-/obj/item/organ/internal/hivelord_core/attack(mob/living/M as mob, mob/living/user as mob)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(inert)
- to_chat(user, "
[src] have become inert, its healing properties are no more. ")
- return
- else
- if(H.stat == DEAD)
- to_chat(user, "
[src] are useless on the dead. ")
- return
- if(H != user)
- H.visible_message("
[user] forces [H] to eat [src]... they quickly regenerate all injuries! ")
- else
- to_chat(user, "
You chomp into [src], barely managing to hold it down, but feel amazingly refreshed in mere moments. ")
- playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
- H.revive()
- qdel(src)
- ..()
-
-/obj/item/organ/internal/hivelord_core/prepare_eat()
- return null
-
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood
- name = "hivelord brood"
- desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
- icon = 'icons/mob/animal.dmi'
- icon_state = "Hivelordbrood"
- icon_living = "Hivelordbrood"
- icon_aggro = "Hivelordbrood"
- icon_dead = "Hivelordbrood"
- icon_gib = "syndicate_gib"
- mouse_opacity = 2
- move_to_delay = 1
- friendly = "buzzes near"
- vision_range = 10
- speed = 3
- maxHealth = 1
- health = 1
- harm_intent_damage = 5
- melee_damage_lower = 2
- melee_damage_upper = 2
- attacktext = "slashes"
- speak_emote = list("telepathically cries")
- attack_sound = 'sound/weapons/pierce.ogg'
- throw_message = "falls right through the strange body of the"
- environment_smash = 0
- pass_flags = PASSTABLE
- del_on_death = 1
-
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New()
- ..()
- spawn(100)
- death()
-
/mob/living/simple_animal/hostile/asteroid/goliath
name = "goliath"
desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions."
@@ -344,7 +117,7 @@
move_to_delay = 40
ranged = 1
ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight
- ranged_cooldown_cap = 8
+ ranged_cooldown_time = 120
friendly = "wails at"
speak_emote = list("bellows")
vision_range = 4
@@ -368,7 +141,7 @@
handle_preattack()
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
- if(ranged_cooldown <= 2 && !pre_attack)
+ if(ranged_cooldown <= world.time + ranged_cooldown_time * 0.25 && !pre_attack)
pre_attack++
if(!pre_attack || stat || AIStatus == AI_IDLE)
return
@@ -383,7 +156,7 @@
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
visible_message("
The [src.name] digs its tentacles under [target.name]! ")
new /obj/effect/goliath_tentacle/original(tturf)
- ranged_cooldown = ranged_cooldown_cap
+ ranged_cooldown = world.time + ranged_cooldown_time
icon_state = icon_aggro
pre_attack = 0
return
@@ -449,12 +222,12 @@
icon = 'icons/obj/items.dmi'
icon_state = "goliath_hide"
flags = NOBLUDGEON
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
layer = 4
/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
- if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
+ if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
var/obj/item/clothing/C = target
var/current_armor = C.armor
if(current_armor.["melee"] < 60)
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 99e6f61431c..d7984031052 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -156,7 +156,7 @@
var/counter
for(counter=0, counter<=powerlevel, counter++)
var/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/S = new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
- S.reagents.add_reagent("mushroomhallucinogen", powerlevel)
+ S.reagents.add_reagent("psilocybin", powerlevel)
S.reagents.add_reagent("omnizine", powerlevel)
S.reagents.add_reagent("synaptizine", powerlevel)
qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 9f98b205fc9..3cfc1b2c291 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -79,7 +79,7 @@
//repair a bit of damage
if(prob(1))
- src.visible_message("\red [bicon(src)] [src] shudders and shakes as some of it's damaged systems come back online.")
+ src.visible_message("
[bicon(src)] [src] shudders and shakes as some of it's damaged systems come back online. ")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -94,10 +94,10 @@
//sometimes our targetting sensors malfunction, and we attack anyone nearby
if(prob(disabled ? 0 : 1))
if(hostile_drone)
- src.visible_message("\blue [bicon(src)] [src] retracts several targetting vanes, and dulls it's running lights.")
+ src.visible_message("
[bicon(src)] [src] retracts several targetting vanes, and dulls it's running lights. ")
hostile_drone = 0
else
- src.visible_message("\red [bicon(src)] [src] suddenly lights up, and additional targetting vanes slide into place.")
+ src.visible_message("
[bicon(src)] [src] suddenly lights up, and additional targetting vanes slide into place. ")
hostile_drone = 1
if(health / maxHealth > 0.9)
@@ -118,17 +118,17 @@
exploding = 0
if(!disabled)
if(prob(50))
- src.visible_message("\blue [bicon(src)] [src] suddenly shuts down!")
+ src.visible_message("
[bicon(src)] [src] suddenly shuts down! ")
else
- src.visible_message("\blue [bicon(src)] [src] suddenly lies still and quiet.")
+ src.visible_message("
[bicon(src)] [src] suddenly lies still and quiet. ")
disabled = rand(150, 600)
walk(src,0)
if(exploding && prob(20))
if(prob(50))
- src.visible_message("\red [bicon(src)] [src] begins to spark and shake violenty!")
+ src.visible_message("
[bicon(src)] [src] begins to spark and shake violenty! ")
else
- src.visible_message("\red [bicon(src)] [src] sparks and shakes like it's about to explode!")
+ src.visible_message("
[bicon(src)] [src] sparks and shakes like it's about to explode! ")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
index 66972b06d2e..e5beb60097e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
@@ -31,7 +31,7 @@
response_disarm = "shoves"
response_harm = "hits"
turns_per_move = 10
- speed = -1
+ speed = 0
maxHealth = 20
health = 20
@@ -74,7 +74,7 @@
response_help = "shakes hands with"
response_disarm = "shoves"
response_harm = "hits"
- speed = -1
+ speed = 0
maxHealth = 20
health = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index 64469bb87ef..b1393e84ef9 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -123,7 +123,6 @@
//Attempt to eat things we bump into, Mobs, Walls, Clowns
/mob/living/simple_animal/hostile/spaceWorm/wormHead/Bump(atom/obstacle)
-
attemptToEat(obstacle)
//Attempt to eat things, only the head can eat
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index d749db16bf5..168ed2d441c 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -39,6 +39,7 @@
search_objects = 1 // So that it can see through walls
+ see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
anchored = 1
status_flags = GODMODE // Cannot push also
@@ -56,9 +57,6 @@
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blindness(null))
AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision(null))
- // Give nightvision
- see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
-
// Set creator
if(creator)
src.creator = creator
@@ -163,7 +161,7 @@
clothes_req = 0
range = 14
-/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets)
+/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/light/L in T)
L.flicker()
@@ -179,9 +177,9 @@
clothes_req = 0
range = 10
-/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets)
+/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets, mob/user = usr)
for(var/mob/living/L in living_mob_list)
- if(L == usr)
+ if(L == user)
continue
var/turf/T = get_turf(L.loc)
if(T && T in targets)
@@ -190,7 +188,7 @@
//Toggle Night Vision
/obj/effect/proc_holder/spell/targeted/night_vision
- name = "Toggle Nightvision \[ON\]"
+ name = "Toggle Nightvision"
desc = "Toggle your nightvision mode."
charge_max = 10
@@ -199,17 +197,15 @@
message = "
You toggle your night vision! "
range = -1
include_user = 1
+ var/non_night_vision = SEE_INVISIBLE_LIVING
+ var/night_vision = SEE_INVISIBLE_OBSERVER_NOLIGHTING
-/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets)
-
+/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
- if(target.see_invisible == SEE_INVISIBLE_LIVING)
- target.see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
- name = "Toggle Nightvision \[ON\]"
+ if(target.see_invisible == non_night_vision)
+ target.see_invisible = night_vision
else
- target.see_invisible = SEE_INVISIBLE_LIVING
- name = "Toggle Nightvision \[OFF\]"
- return
+ target.see_invisible = non_night_vision
/mob/living/simple_animal/hostile/statue/sentience_act()
faction -= "neutral"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index be2cfff6f0c..805059f25f7 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -46,13 +46,13 @@
if(O.damtype == STAMINA)
damage = 0
health -= damage
- visible_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ visible_message("
[src] has been attacked with the [O] by [user]. ")
else
- visible_message("\red \b [src] blocks the [O] with its shield! ")
+ visible_message("
[src] blocks the [O] with its shield! ")
playsound(loc, O.hitsound, 25, 1, -1)
else
- to_chat(usr, "\red This weapon is ineffective, it does no damage.")
- visible_message("\red [user] gently taps [src] with the [O]. ")
+ to_chat(usr, "
This weapon is ineffective, it does no damage. ")
+ visible_message("
[user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
index fafd30a4ae4..eefc506ff99 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
@@ -4,8 +4,25 @@
#define MOVING_TO_TARGET 3
#define SPINNING_COCOON 4
+#define TS_AI_AGGRESSIVE 0
+#define TS_AI_DEFENSIVE 1
+
+#define TS_DAMAGE_SIMPLE 0
+#define TS_DAMAGE_POISON 1
+#define TS_DAMAGE_BRUTE 2
+
+#define TS_DESC_RED "Red - Assault"
+#define TS_DESC_GRAY "Gray - Ambush"
+#define TS_DESC_GREEN "Green - Nurse"
+#define TS_DESC_WHITE "White - Infect"
+#define TS_DESC_BLACK "Black - Poison"
+#define TS_DESC_PURPLE "Purple - Guard"
+#define TS_DESC_PRINCE "Prince - WAR"
+#define TS_DESC_MOTHER "Mother - HORROR"
+#define TS_DESC_QUEEN "Queen - LEADER"
+
#define TS_TIER_1 1
#define TS_TIER_2 2
#define TS_TIER_3 3
#define TS_TIER_4 4
-#define TS_TIER_5 5
\ No newline at end of file
+#define TS_TIER_5 5
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
index 2111f350b0b..90cef39a98f 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
@@ -1,4 +1,4 @@
-
+// ---------- ACTIONS FOR ALL SPIDERS
/datum/action/innate/terrorspider/web
name = "Web"
@@ -7,7 +7,7 @@
/datum/action/innate/terrorspider/web/Activate()
var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
- user.Web()
+ user.Web(0)
/datum/action/innate/terrorspider/wrap
name = "Wrap"
@@ -19,19 +19,113 @@
user.FindWrapTarget()
user.DoWrap()
+// ---------- GREEN ACTIONS
+
+/datum/action/innate/terrorspider/greeneggs
+ name = "Lay Green Eggs"
+ icon_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "eggs"
+
+/datum/action/innate/terrorspider/greeneggs/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/green/user = owner
+ user.DoLayGreenEggs()
+
+// ---------- PRINCE ACTIONS
+
+/datum/action/innate/terrorspider/thickweb
+ name = "Thick Web"
+ icon_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "stickyweb2"
+
+/datum/action/innate/terrorspider/thickweb/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
+ user.Web(1)
+
+// ---------- BOSS ACTIONS
+
+/datum/action/innate/terrorspider/ventsmash
+ name = "Smash Welded Vent"
+ icon_icon = 'icons/atmos/vent_pump.dmi'
+ button_icon_state = "map_vent"
+
+/datum/action/innate/terrorspider/ventsmash/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
+ user.DoVentSmash()
+
+// ---------- QUEEN ACTIONS
+
+/datum/action/innate/terrorspider/queen/queennest
+ name = "Nest"
+ icon_icon = 'icons/mob/terrorspider.dmi'
+ button_icon_state = "terror_queen"
+
+/datum/action/innate/terrorspider/queen/queennest/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner
+ user.NestPrompt()
+
+/datum/action/innate/terrorspider/queen/queensense
+ name = "Hive Sense"
+ icon_icon = 'icons/mob/actions.dmi'
+ button_icon_state = "mindswap"
+
+/datum/action/innate/terrorspider/queen/queensense/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner
+ user.DoHiveSense()
+
+/datum/action/innate/terrorspider/queen/queeneggs
+ name = "Lay Queen Eggs"
+ icon_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "eggs"
+
+/datum/action/innate/terrorspider/queen/queeneggs/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner
+ user.LayQueenEggs()
+
+/datum/action/innate/terrorspider/queen/queenfakelings
+ name = "Fake Spiderlings"
+ icon_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "spiderling"
+
+/datum/action/innate/terrorspider/queen/queenfakelings/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner
+ user.QueenFakeLings()
+
+// ---------- EMPRESS
+
+/datum/action/innate/terrorspider/queen/empress/empresserase
+ name = "Erase Brood"
+ icon_icon = 'icons/effects/blood.dmi'
+ button_icon_state = "mgibbl1"
+
+/datum/action/innate/terrorspider/queen/empress/empresserase/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/user = owner
+ user.EraseBrood()
// ---------- WEB
-/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web()
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web(var/thick = 0)
+ var/turf/mylocation = loc
visible_message("
[src] begins to secrete a sticky substance. ")
- if(do_after(src, 40, target = loc))
- var/obj/effect/spider/terrorweb/T = locate() in get_turf(src)
- if(T)
- to_chat(src, "
There is already a web here. ")
+ if(do_after(src, delay_web, target = loc))
+ if(loc != mylocation)
+ return
+ else if(istype(loc, /turf/space))
+ to_chat(src, "
Webs cannot be spun in space. ")
else
- new /obj/effect/spider/terrorweb(loc)
+ var/obj/structure/spider/terrorweb/T = locate() in get_turf(src)
+ if(T)
+ to_chat(src, "
There is already a web here. ")
+ else
+ var/obj/structure/spider/terrorweb/W = new /obj/structure/spider/terrorweb(loc)
+ W.creator_ckey = ckey
+ if(thick)
+ W.opacity = 1
+ W.name = "thick terror web"
+ if(web_infects)
+ W.infectious = 1
+ W.name = "sharp terror web"
-/obj/effect/spider/terrorweb
+/obj/structure/spider/terrorweb
name = "terror web"
desc = "it's stringy and sticky"
icon = 'icons/effects/effects.dmi'
@@ -39,23 +133,44 @@
density = 0 // prevents it blocking all movement
health = 20 // two welders, or one laser shot (15 for the normal spider webs)
icon_state = "stickyweb1"
+ var/creator_ckey = null
+ var/infectious = 0
-
-/obj/effect/spider/terrorweb/New()
+/obj/structure/spider/terrorweb/New()
..()
if(prob(50))
icon_state = "stickyweb2"
+/obj/structure/spider/terrorweb/proc/DeCloakNearby()
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/gray/G in view(6,src))
+ if(!G.ckey && G.stat != DEAD)
+ G.GrayDeCloak()
+ G.Aggro()
-/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target)
+/obj/structure/spider/terrorweb/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider))
return 1
+ if(istype(mover, /obj/item/projectile/terrorqueenspit))
+ return 1
if(isliving(mover))
+ var/mob/living/M = mover
+ if(M.lying)
+ return 1
if(prob(80))
to_chat(mover, "
You get stuck in [src] for a moment. ")
- var/mob/living/M = mover
M.Stun(4) // 8 seconds.
M.Weaken(4) // 8 seconds.
+ DeCloakNearby()
+ if(iscarbon(mover))
+ var/mob/living/carbon/C = mover
+ if(!IsTSInfected(C) && infectious)
+ var/inject_target = pick("chest","head")
+ if(C.can_inject(null, 0, inject_target, 0))
+ to_chat(C, "
[src] slices into you! ")
+ new /obj/item/organ/internal/body_egg/terror_eggs(C)
+ spawn(70)
+ if(C.loc == loc)
+ qdel(src)
return 1
else
return 0
@@ -63,22 +178,25 @@
return prob(20)
return ..()
-
-
+/obj/structure/spider/terrorweb/bullet_act(obj/item/projectile/Proj)
+ if(Proj.damage_type != BRUTE && Proj.damage_type != BURN)
+ visible_message("
[src] is undamaged by [Proj]! ")
+ // Webs don't care about disablers, tasers, etc. Or toxin damage. They're organic, but not alive.
+ return
+ ..()
// ---------- WRAP
-
/mob/living/simple_animal/hostile/poison/terror_spider/proc/FindWrapTarget()
if(!cocoon_target)
var/list/choices = list()
for(var/mob/living/L in oview(1,src))
- if(Adjacent(L))
+ if(Adjacent(L) && !L.anchored)
if(L.stat == DEAD)
choices += L
for(var/obj/O in oview(1,src))
if(Adjacent(O) && !O.anchored)
- if(!istype(O, /obj/effect/spider/terrorweb) && !istype(O, /obj/effect/spider/cocoon))
+ if(!istype(O, /obj/structure/spider/terrorweb) && !istype(O, /obj/structure/spider/cocoon) && !istype(O, /obj/structure/spider/spiderling/terror_spiderling))
choices += O
if(choices.len)
cocoon_target = input(src,"What do you wish to cocoon?") in null|choices
@@ -87,6 +205,9 @@
/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap()
if(cocoon_target && busy != SPINNING_COCOON)
+ if(cocoon_target.anchored)
+ cocoon_target = null
+ return
busy = SPINNING_COCOON
visible_message("
[src] begins to secrete a sticky substance around [cocoon_target]. ")
stop_automated_movement = 1
@@ -94,16 +215,17 @@
if(do_after(src, 40, target = cocoon_target.loc))
if(busy == SPINNING_COCOON)
if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1)
- var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
+ var/obj/structure/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
for(var/obj/O in C.loc)
- if(istype(O, /obj/item))
- O.loc = C
- else if(istype(O, /obj/machinery) || istype(O, /obj/structure))
- O.loc = C
- large_cocoon = 1
+ if(!O.anchored)
+ if(istype(O, /obj/item))
+ O.loc = C
+ else if(istype(O, /obj/machinery) || istype(O, /obj/structure))
+ O.loc = C
+ large_cocoon = 1
for(var/mob/living/L in C.loc)
if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider))
continue
@@ -112,12 +234,15 @@
if(iscarbon(L))
regen_points += regen_points_per_kill
fed++
+ visible_message("
[src] sticks a proboscis into [L] and sucks a viscous substance out. ")
+ to_chat(src, "
You feel invigorated! ")
+ else
+ visible_message("
[src] wraps [L] in a web. ")
large_cocoon = 1
last_cocoon_object = 0
L.loc = C
C.pixel_x = L.pixel_x
C.pixel_y = L.pixel_y
- visible_message("
[src] sticks a proboscis into [L] and sucks a viscous substance out. ")
break
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
@@ -125,3 +250,18 @@
busy = 0
stop_automated_movement = 0
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoVentSmash()
+ if(do_after(src, 40, target = loc))
+ for(var/obj/machinery/atmospherics/unary/vent_pump/P in view(1, src))
+ if(P.welded)
+ P.welded = 0
+ P.update_icon()
+ P.visible_message("
[src] smashes the welded cover off [P]! ")
+ return
+ for(var/obj/machinery/atmospherics/unary/vent_scrubber/C in view(1, src))
+ if(C.welded)
+ C.welded = 0
+ C.update_icon()
+ C.visible_message("
[src] smashes the welded cover off [C]! ")
+ return
+ to_chat(src, "
There is no welded vent or scrubber close enough to do this. ")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
index 68d25a29492..c1a7bf45da7 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
@@ -10,8 +10,9 @@
/mob/living/simple_animal/hostile/poison/terror_spider/black
name = "Black Terror spider"
- desc = "An ominous-looking spider, black as the darkest night, and with merciless eyes and a blood-red hourglass pattern on its back."
+ desc = "An ominous-looking spider, black as the darkest night. It has merciless eyes, and a blood-red hourglass pattern on its back."
spider_role_summary = "Hit-and-run attacker with extremely venomous bite."
+ ai_target_method = TS_DAMAGE_POISON
icon_state = "terror_widow"
icon_living = "terror_widow"
@@ -24,15 +25,23 @@
stat_attack = 1 // ensures they will target people in crit, too!
spider_tier = TS_TIER_2
+
/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(!poisonable)
return ..()
- if(L.reagents.has_reagent("terror_black_toxin", 50))
+ if(L.reagents.has_reagent("terror_black_toxin", 100))
return ..()
var/inject_target = pick("chest", "head")
if(L.stunned || L.can_inject(null, 0, inject_target, 0))
- L.reagents.add_reagent("terror_black_toxin", 15) // inject our special poison
+ L.reagents.add_reagent("terror_black_toxin", 30) // inject our special poison
visible_message("
[src] buries its long fangs deep into the [inject_target] of [target]! ")
else
visible_message("
[src] bites [target], but cannot inject venom into their [inject_target]! ")
L.attack_animal(src)
+ if(!ckey && (!(target in enemies) || L.reagents.has_reagent("terror_black_toxin", 60)))
+ step_away(src,L)
+ step_away(src,L)
+ LoseTarget()
+ for(var/i in 0 to 3)
+ step_away(src, L)
+ visible_message("
[src] warily eyes [L] from a distance. ")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm
index 8ad926a8729..0ed63563011 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm
@@ -1,3 +1,4 @@
+
// Terror Spider, Black, Deadly Venom
/datum/reagent/terror_black_toxin
@@ -8,26 +9,25 @@
metabolization_rate = 0.1
/datum/reagent/terror_black_toxin/on_mob_life(mob/living/M)
- if(volume < 15)
- // bitten once, die slowly. Easy to survive a single bite - just go to medbay.
- // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get to medbay.
- M.adjustToxLoss(2) // same damage/tick as tabun cycle 0 to 60
- else if(volume < 30)
- // bitten twice, die more quickly, muscle cramps make movement difficult. Call medics immediately.
- // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death
- M.adjustToxLoss(4)
- M.Confused(3)
+ if(volume < 30)
+ // bitten once, die very slowly. Easy to survive a single bite - just go to medbay.
+ // total damage: 1/tick, human health 150 until crit, = 150 ticks, = 300 seconds = 5 minutes to get to medbay.
+ M.adjustToxLoss(1)
+ else if(volume < 60)
+ // bitten twice, die slowly. Get to medbay.
+ // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get some medical treatment.
+ M.adjustToxLoss(2)
M.EyeBlurry(3)
- else if(volume < 45)
- // bitten thrice, die very quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you.
- // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death
- M.adjustToxLoss(8) // a bit worse than coiine
+ else if(volume < 90)
+ // bitten thrice, die quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you.
+ // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death
+ M.adjustToxLoss(4) // a bit worse than coiine
M.Confused(6)
M.EyeBlurry(6)
else
// bitten 4 or more times, whole body goes into shock/death
- // total damage: 12, human health 150 until crit, = 12.5 ticks, = 25s until death
- M.adjustToxLoss(12)
+ // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death
+ M.adjustToxLoss(8)
M.EyeBlurry(6)
M.Paralyse(5)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm
new file mode 100644
index 00000000000..2d2c9af9bda
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm
@@ -0,0 +1,104 @@
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T5 EMPRESS OF TERROR -------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: ruling over planets of uncountable spiders, like Xenomorph Empresses.
+// -------------: AI: none - this is strictly adminspawn-only and intended for RP events, coder testing, and teaching people 'how to queen'
+// -------------: SPECIAL: Lay Eggs ability that allows laying queen-level eggs.
+// -------------: TO FIGHT IT: run away screaming?
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress
+ name = "Empress of Terror"
+ desc = "The unholy offspring of spiders, nightmares, and lovecraft fiction."
+ spider_role_summary = "Adminbus spider"
+ ai_target_method = TS_DAMAGE_SIMPLE
+ maxHealth = 1000
+ health = 1000
+ melee_damage_lower = 30
+ melee_damage_upper = 60
+ move_to_delay = 5
+ ventcrawler = 1
+ idle_ventcrawl_chance = 0
+ ai_playercontrol_allowtype = 0
+ ai_type = TS_AI_AGGRESSIVE
+ rapid = 1
+ canlay = 1000
+ spider_tier = TS_TIER_5
+ projectiletype = /obj/item/projectile/terrorqueenspit/empress
+ var/datum/action/innate/terrorspider/queen/empress/empresslings/empresslings_action
+ var/datum/action/innate/terrorspider/queen/empress/empresserase/empresserase_action
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/New()
+ ..()
+ empresserase_action = new()
+ empresserase_action.Grant(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/handle_automated_action()
+ return
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/NestMode()
+ ..()
+ queeneggs_action.button.name = "Empress Eggs"
+ queenfakelings_action.button.name = "Empress Lings"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/LayQueenEggs()
+ var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE)
+ var/numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50)
+ if(eggtype == null || numlings == null)
+ to_chat(src, "
Cancelled. ")
+ return
+ switch(eggtype)
+ if(TS_DESC_RED)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red,numlings,1)
+ if(TS_DESC_GRAY)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray,numlings,1)
+ if(TS_DESC_GREEN)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green,numlings,1)
+ if(TS_DESC_BLACK)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black,numlings,1)
+ if(TS_DESC_PURPLE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple,numlings,0)
+ if(TS_DESC_WHITE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/white,numlings,0)
+ if(TS_DESC_PRINCE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince,numlings,1)
+ if(TS_DESC_MOTHER)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/mother,numlings,1)
+ if(TS_DESC_QUEEN)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/queen,numlings,1)
+ else
+ to_chat(src, "
Unrecognized egg type. ")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/QueenFakeLings()
+ var/numlings = input("How many?") as null|anything in list(10, 20, 30, 40, 50)
+ var/sbpc = input("%chance to be stillborn?") as null|anything in list(0, 25, 50, 75, 100)
+ for(var/i=0, i
Through the hivemind, the raw power of [src] floods into your body, burning it from the inside out!")
+ for(var/obj/structure/spider/eggcluster/terror_eggcluster/T in ts_egg_list)
+ qdel(T)
+ for(var/obj/structure/spider/spiderling/terror_spiderling/T in ts_spiderling_list)
+ T.stillborn = 1
+ to_chat(src, "All Terror Spiders, except yourself, will die off shortly. ")
+
+
+/obj/item/projectile/terrorqueenspit/empress
+ damage_type = BURN
+ damage = 30
+ bonus_tox = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
index 06703cc2106..d5e70b27b7e 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
@@ -13,15 +13,15 @@
return
var/error_on_humanize = ""
var/humanize_prompt = "Take direct control of [src]?"
- humanize_prompt += "Role: [spider_role_summary]"
+ humanize_prompt += " Role: [spider_role_summary]"
if(user.ckey in ts_ckey_blacklist)
error_on_humanize = "You are not able to control any terror spider this round."
- else if(!ai_playercontrol_allowingeneral)
- error_on_humanize = "Terror spiders cannot currently be player-controlled."
else if(spider_awaymission)
error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts."
else if(!ai_playercontrol_allowtype)
error_on_humanize = "This specific type of terror spider is not player-controllable."
+ else if(degenerate)
+ error_on_humanize = "Dying spiders are not player-controllable."
else if(stat == DEAD)
error_on_humanize = "Dead spiders are not player-controllable."
if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien"))
@@ -39,5 +39,4 @@
return
key = user.key
for(var/mob/dead/observer/G in player_list)
- G.show_message("A ghost has taken control of [src] . ([ghost_follow_link(src, ghost=G)]). ")
-
+ G.show_message("A ghost has taken control of [src] . ([ghost_follow_link(src, ghost=G)]). ")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
index 42c16cc7666..fdaa36257d2 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
@@ -2,26 +2,30 @@
// --------------------------------------------------------------------------------
// ----------------- TERROR SPIDERS: T1 GRAY TERROR -------------------------------
// --------------------------------------------------------------------------------
-// -------------: ROLE: fast, weak terror spider
-// -------------: SPECIAL: silences targets
-// -------------: TO FIGHT IT: shoot it!
+// -------------: ROLE: ambusher
+// -------------: AI: hides in vents, emerges when prey is near to kill it, then hides again. Intended to scare normal crew.
+// -------------: SPECIAL: invisible when on top of a vent, emerges when prey approaches or gets trapped in webs. Bite silences targets.
+// -------------: TO FIGHT IT: shoot it through a window, or make it regret ambushing you
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
/mob/living/simple_animal/hostile/poison/terror_spider/gray
name = "Gray Terror spider"
- desc = "An ominous-looking gray spider, it seems jittery."
- spider_role_summary = "Fast-moving but weak spider."
+ desc = "An ominous-looking gray spider. It twitches occasionally, always seeming ready to pounce."
+ spider_role_summary = "Stealth spider that ambushes weak humans from vents."
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_gray"
icon_living = "terror_gray"
icon_dead = "terror_gray_dead"
- maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but silences its targets
+ maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but its almost invisible.
health = 120
melee_damage_lower = 10
melee_damage_upper = 20
- ventcrawler = 1
- move_to_delay = 5 // normal speed
+ regen_points_per_hp = 2 // 50% higher regen speed
+ move_to_delay = 5 // slightly faster than normal
stat_attack = 1 // ensures they will target people in crit, too!
- environment_smash = 1
+ wander = 0 // wandering defeats the purpose of stealth
+ idle_vision_range = 3 // very low idle vision range
+ delay_web = 20 // double speed
/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(mob/living/carbon/human/L, poisonable)
@@ -37,4 +41,102 @@
visible_message("[src] buries grey fangs deep into the [inject_target] of [target]! ")
else
visible_message("[src] bites [target], but cannot inject venom into their [inject_target]! ")
- L.attack_animal(src)
\ No newline at end of file
+ L.attack_animal(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/adjustBruteLoss(damage)
+ ..(damage)
+ if(invisibility > 0)
+ GrayDeCloak()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/adjustFireLoss(damage)
+ ..(damage)
+ if(invisibility > 0)
+ GrayDeCloak()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/Aggro()
+ GrayDeCloak()
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/AttackingTarget()
+ if(invisibility > 0)
+ GrayDeCloak()
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayCloak()
+ visible_message("[src] hides in the vent. ")
+ invisibility = SEE_INVISIBLE_LEVEL_ONE
+ icon_state = "terror_gray_cloaked"
+ icon_living = "terror_gray_cloaked"
+ if(!ckey)
+ vision_range = 3
+ idle_vision_range = 3
+ // Bugged, does not work yet. Also spams webs. Also doesn't look great. But... planned.
+ move_to_delay = 15 // while invisible, slow.
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayDeCloak()
+ invisibility = 0
+ icon_state = "terror_gray"
+ icon_living = "terror_gray"
+ vision_range = 9
+ idle_vision_range = 9
+ move_to_delay = 5
+ prob_ai_hides_in_vents = 10
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_special_action()
+ if(prob(prob_ai_hides_in_vents))
+ var/obj/machinery/atmospherics/unary/vent_pump/e = locate() in get_turf(src)
+ if(e)
+ if(!e.welded || spider_awaymission)
+ if(invisibility != SEE_INVISIBLE_LEVEL_ONE) // aka: 35. ghosts have 15 with no darkness, 60 with darkness. Weird...
+ var/list/g_turfs_webbed = ListWebbedTurfs()
+ var/webcount = g_turfs_webbed.len
+ if(webcount >= 4)
+ // if there are already at least 4 webs around us, then we have a good web setup already. Cloak.
+ GrayCloak()
+ // I wonder if we should settle down here forever?
+ var/foundqueen = 0
+ for(var/mob/living/H in view(src, 10))
+ if(istype(H, /mob/living/simple_animal/hostile/poison/terror_spider/queen))
+ foundqueen = 1
+ break
+ if(!foundqueen)
+ var/list/g_turfs_visible = ListVisibleTurfs()
+ if(g_turfs_visible.len >= 12)
+ // So long as the room isn't tiny, and it has no queen in it, sure, settle there
+ // since we are settled now, disable most AI behaviors so we don't waste CPU.
+ ai_ventcrawls = 0
+ ai_spins_webs = 0
+ ai_break_lights = 0
+ prob_ai_hides_in_vents = 3
+ visible_message("[src] finishes setting up its trap in [get_area(src)]. ")
+ else
+ var/list/g_turfs_valid = ListValidTurfs()
+ var/turfcount = g_turfs_valid.len
+ if(turfcount == 0)
+ // if there is literally nowhere else we could put a web, cloak.
+ GrayCloak()
+ else
+ // otherwise, pick one of the valid turfs with no web to create a web there.
+ new /obj/structure/spider/terrorweb(pick(g_turfs_valid))
+ visible_message("[src] spins a web. ")
+ else
+ if(invisibility == SEE_INVISIBLE_LEVEL_ONE)
+ // if our vent is welded, decloak
+ GrayDeCloak()
+ else
+ if(invisibility == SEE_INVISIBLE_LEVEL_ONE)
+ // if there is no vent under us, and we are cloaked, decloak
+ GrayDeCloak()
+ var/vdistance = 99
+ var/temp_vent = null
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
+ if(!v.welded)
+ if(get_dist(src,v) < vdistance)
+ temp_vent = v
+ vdistance = get_dist(src,v)
+ if(temp_vent)
+ if(get_dist(src,temp_vent) > 0 && get_dist(src,temp_vent) < 5)
+ step_to(src,temp_vent)
+ // if you're bumped off your vent, try to get back to it
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
new file mode 100644
index 00000000000..89378e6a2ae
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
@@ -0,0 +1,97 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T1 GREEN TERROR ------------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: reproduction
+// -------------: AI: after it kills you, it webs you and lays new terror eggs on your body
+// -------------: SPECIAL: can also create webs, web normal objects, etc
+// -------------: TO FIGHT IT: kill it however you like - just don't die to it!
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/green
+ name = "Green Terror spider"
+ desc = "An ominous-looking green spider. It has a small egg-sac attached to it, and dried blood stains on its carapace."
+ spider_role_summary = "Average melee spider that webs its victims and lays more spider eggs"
+ ai_target_method = TS_DAMAGE_BRUTE
+ icon_state = "terror_green"
+ icon_living = "terror_green"
+ icon_dead = "terror_green_dead"
+ maxHealth = 120
+ health = 120
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+ var/feedings_to_lay = 2
+ var/datum/action/innate/terrorspider/greeneggs/greeneggs_action
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/green/New()
+ ..()
+ greeneggs_action = new()
+ greeneggs_action.Grant(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/green/proc/DoLayGreenEggs()
+ var/obj/structure/spider/eggcluster/E = locate() in get_turf(src)
+ if(E)
+ to_chat(src, "There is already a cluster of eggs here! ")
+ else if(fed < feedings_to_lay)
+ to_chat(src, "You must wrap more humanoid prey before you can do this! ")
+ else
+ visible_message("[src] begins to lay a cluster of eggs. ")
+ if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 1, 1)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, 1, 1)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 1, 1)
+ fed -= feedings_to_lay
+
+/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_special_action()
+ if(cocoon_target)
+ if(get_dist(src, cocoon_target) <= 1)
+ spider_steps_taken = 0
+ DoWrap()
+ else
+ if(spider_steps_taken > spider_max_steps)
+ spider_steps_taken = 0
+ cocoon_target = null
+ busy = 0
+ stop_automated_movement = 0
+ else
+ spider_steps_taken++
+ CreatePath(cocoon_target)
+ step_to(src,cocoon_target)
+ if(spider_debug)
+ visible_message("[src] moves towards [cocoon_target] to cocoon it. ")
+ else if(fed >= feedings_to_lay)
+ DoLayGreenEggs()
+ else if(world.time > (last_cocoon_object + freq_cocoon_object))
+ last_cocoon_object = world.time
+ var/list/can_see = view(src, 10)
+ for(var/mob/living/C in can_see)
+ if(C.stat == DEAD && !isterrorspider(C) && !C.anchored)
+ spider_steps_taken = 0
+ cocoon_target = C
+ return
+ for(var/obj/O in can_see)
+ if(O.anchored)
+ continue
+ if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
+ if(!istype(O, /obj/item/weapon/paper))
+ cocoon_target = O
+ stop_automated_movement = 1
+ spider_steps_taken = 0
+ return
+
+/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_specialattack(mob/living/carbon/human/L, poisonable)
+ if(!poisonable)
+ ..()
+ return
+ var/inject_target = pick("chest","head")
+ if(L.stunned || L.can_inject(null,0,inject_target,0))
+ if(L.eye_blurry < 60)
+ L.AdjustEyeBlurry(10)
+ // instead of having a venom that only lasts seconds, we just add the eyeblur directly.
+ visible_message("[src] buries its fangs deep into the [inject_target] of [target]! ")
+ else
+ visible_message("[src] bites [target], but cannot inject venom into their [inject_target]! ")
+ L.attack_animal(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm
new file mode 100644
index 00000000000..c3ee3dd6a35
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm
@@ -0,0 +1,55 @@
+
+// All terror spider code that relates to queen ruling over a hive
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoHiveSense()
+ var/hsline = ""
+ to_chat(src, "Your Brood: ")
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ if(T.spider_awaymission != spider_awaymission)
+ continue
+ hsline = "* [T] in [get_area(T)], "
+ if(T.stat == DEAD)
+ hsline += "DEAD"
+ else
+ hsline += "health [T.health] / [T.maxHealth], "
+ if(T.ckey)
+ hsline += " *Player Controlled* "
+ else
+ hsline += " AI "
+ to_chat(src,hsline)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/SetHiveCommand(set_ai, set_ventcrawl)
+ var/numspiders = 0
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ if(spider_awaymission && !T.spider_awaymission)
+ continue
+ else if(!spider_awaymission && T.spider_awaymission)
+ continue
+ numspiders += 1
+ if(spider_tier >= T.spider_tier)
+ if(T.ai_type != set_ai)
+ T.ai_type = set_ai
+ if(T.idle_ventcrawl_chance != set_ventcrawl)
+ T.idle_ventcrawl_chance = set_ventcrawl
+ return numspiders
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/CountSpiders()
+ var/numspiders = 0
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ if(T.stat != DEAD && !T.spider_placed && spider_awaymission == T.spider_awaymission)
+ numspiders += 1
+ return numspiders
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/CountSpidersType(specific_type)
+ var/numspiders = 0
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ if(T.stat != DEAD && !T.spider_placed && spider_awaymission == T.spider_awaymission)
+ if(T.type == specific_type)
+ numspiders += 1
+ for(var/obj/structure/spider/eggcluster/terror_eggcluster/E in ts_egg_list)
+ if(E.spiderling_type == specific_type && E.z == z)
+ numspiders += E.spiderling_number
+ for(var/obj/structure/spider/spiderling/terror_spiderling/L in ts_spiderling_list)
+ if(!L.stillborn && L.grow_as == specific_type && L.z == z)
+ numspiders += 1
+ return numspiders
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm
new file mode 100644
index 00000000000..b6e8a0680ae
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm
@@ -0,0 +1,53 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T3 MOTHER OF TERROR --------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: living schmuck bait
+// -------------: AI: no special ai
+// -------------: SPECIAL: spawns an ungodly number of spiderlings when killed
+// -------------: TO FIGHT IT: don't! Just leave it alone! It is harmless by itself... but god help you if you aggro it.
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/mother
+ name = "Mother of Terror spider"
+ desc = "An enormous spider. Hundreds of tiny spiderlings are crawling all over it. Their beady little eyes all stare at you. The horror!"
+ spider_role_summary = "Schmuck bait. Extremely weak in combat, but spawns many spiderlings when it dies."
+ ai_target_method = TS_DAMAGE_SIMPLE
+ icon_state = "terror_gray2"
+ icon_living = "terror_gray2"
+ icon_dead = "terror_gray2_dead"
+ maxHealth = 50
+ health = 50
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+ move_to_delay = 5
+ idle_ventcrawl_chance = 5
+ spider_tier = TS_TIER_3
+ spider_opens_doors = 2
+ var/canspawn = 1
+ var/datum/action/innate/terrorspider/ventsmash/ventsmash_action
+
+/mob/living/simple_animal/hostile/poison/terror_spider/mother/New()
+ ..()
+ ventsmash_action = new()
+ ventsmash_action.Grant(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/mother/death(gibbed)
+ if(canspawn)
+ canspawn = 0
+ for(var/i in 0 to 30)
+ var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
+ S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray)
+ if(prob(66))
+ S.stillborn = 1
+ else if(prob(10))
+ S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/black, /mob/living/simple_animal/hostile/poison/terror_spider/green)
+ S.amount_grown = 50 // double speed growth
+ S.immediate_ventcrawl = 1
+ visible_message("[src] breaks apart, the many spiders on its back scurrying everywhere! ")
+ degenerate = 1
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/mother/Destroy()
+ canspawn = 0
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
index 669449a6ae3..40e6515668f 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
@@ -11,20 +11,36 @@
/mob/living/simple_animal/hostile/poison/terror_spider/prince
name = "Prince of Terror spider"
desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Its hide seems armored, and it bears the scars of many battles."
- spider_role_summary = "Boss-level terror spider. Lightning bruiser. Capable of taking on a squad by itself."
+ spider_role_summary = "Miniboss terror spider. Lightning bruiser."
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_allblack"
icon_living = "terror_allblack"
icon_dead = "terror_allblack_dead"
- maxHealth = 400 // 20 laser shots.
- health = 400
- melee_damage_lower = 15
- melee_damage_upper = 25
- move_to_delay = 5
- ventcrawler = 1
+ maxHealth = 600 // 30 laser shots
+ health = 600
+ regen_points_per_hp = 6 // double the normal - IE halved regen speed
+ melee_damage_lower = 30
+ melee_damage_upper = 40
+ move_to_delay = 4 // faster than normal
+ ventcrawler = 0
+ ai_ventcrawls = 0
+ environment_smash = 3
loot = list(/obj/item/clothing/accessory/medal)
+ idle_ventcrawl_chance = 0
spider_tier = TS_TIER_3
spider_opens_doors = 2
+ var/datum/action/innate/terrorspider/thickweb/thickweb_action
+/mob/living/simple_animal/hostile/poison/terror_spider/prince/New()
+ ..()
+ thickweb_action = new()
+ thickweb_action.Grant(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/prince/death(gibbed)
+ if(!hasdied)
+ if(spider_uo71)
+ UnlockBlastDoors("UO71_SciStorage")
+ ..()
/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L)
if(prob(15))
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm
new file mode 100644
index 00000000000..6b524872552
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm
@@ -0,0 +1,97 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T2 PURPLE TERROR -----------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: guarding queen nests
+// -------------: AI: dies if too far from queen
+// -------------: SPECIAL: chance to stun on hit
+// -------------: TO FIGHT IT: shoot it from range, bring friends!
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple
+ name = "Purple Terror spider"
+ desc = "An ominous-looking purple spider. It looks about warily, as if waiting for something."
+ spider_role_summary = "Guards the nest of the Queen of Terror."
+ ai_target_method = TS_DAMAGE_BRUTE
+ icon_state = "terror_purple"
+ icon_living = "terror_purple"
+ icon_dead = "terror_purple_dead"
+ maxHealth = 200
+ health = 200
+ melee_damage_lower = 15
+ melee_damage_upper = 25
+ move_to_delay = 6
+ spider_tier = TS_TIER_2
+ spider_opens_doors = 2
+ ventcrawler = 0
+ ai_ventcrawls = 0
+ environment_smash = 3
+ idle_ventcrawl_chance = 0 // stick to the queen!
+ var/dcheck_counter = 0
+ var/queen_visible = 1
+ var/cycles_noqueen = 0
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple/death(gibbed)
+ if(spider_myqueen)
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/Q = spider_myqueen
+ if(Q.stat != DEAD && !Q.ckey)
+ if(get_dist(src,Q) > 20)
+ if(!degenerate && !Q.degenerate)
+ degenerate = 1
+ Q.DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple,1,0)
+ visible_message("[src] chitters in the direction of [Q]! ")
+ . = ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple/spider_specialattack(mob/living/carbon/human/L, poisonable)
+ if(cycles_noqueen < 6 && prob(10))
+ visible_message("[src] rams into [L], knocking them to the floor! ")
+ L.Weaken(5)
+ L.Stun(5)
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple/Life()
+ . = ..()
+ if(.) // if mob is NOT dead
+ if(!degenerate && spider_myqueen)
+ if(dcheck_counter >= 10)
+ dcheck_counter = 0
+ purple_distance_check()
+ else
+ dcheck_counter++
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple/proc/purple_distance_check()
+ if(spider_myqueen)
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/Q = spider_myqueen
+ if(Q)
+ if(Q.stat == DEAD)
+ spider_myqueen = null
+ degenerate = 1
+ to_chat(src,"Your Queen has died! Her power no longer sustains you! ")
+ return
+ queen_visible = 0
+ for(var/mob/living/M in view(src, vision_range))
+ if(M == Q)
+ queen_visible = 1
+ break
+ if(queen_visible)
+ cycles_noqueen = 0
+ if(spider_debug)
+ to_chat(src,"Queen visible. ")
+ else
+ cycles_noqueen++
+ if(spider_debug)
+ to_chat(src,"Queen NOT visible. Cycles: [cycles_noqueen]. ")
+ if(cycles_noqueen == 3)
+ // one minute without queen sighted
+ to_chat(src,"You wonder where your Queen is. ")
+ else if(cycles_noqueen == 6)
+ // two minutes without queen sighted
+ to_chat(src,"Without your Queen in sight, you feel yourself getting weaker... ")
+ else if(cycles_noqueen >= 9)
+ // three minutes without queen sighted, kill them.
+ degenerate = 1
+ to_chat(src,"Your link to your Queen has been broken! Your life force starts to drain away! ")
+ melee_damage_lower = 5
+ melee_damage_upper = 10
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
new file mode 100644
index 00000000000..3b6266e777b
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
@@ -0,0 +1,358 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T4 QUEEN OF TERROR ---------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: gamma-level threat to the whole station, like a blob
+// -------------: AI: builds a nest, lays many eggs, attempts to take over the station
+// -------------: SPECIAL: spins webs, breaks lights, breaks cameras, webs objects, lays eggs, commands other spiders...
+// -------------: TO FIGHT IT: bring an army, and take no prisoners. Mechs and/or decloner guns are a very good idea.
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen
+ name = "Queen of Terror spider"
+ desc = "An enormous, terrifying spider. Its egg sac is almost as big as its body, and teeming with spider eggs!"
+ spider_role_summary = "Commander of the spider forces. Lays eggs, directs the brood."
+ ai_target_method = TS_DAMAGE_SIMPLE
+ icon_state = "terror_queen"
+ icon_living = "terror_queen"
+ icon_dead = "terror_queen_dead"
+ maxHealth = 200
+ health = 200
+ regen_points_per_tick = 3
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+ move_to_delay = 15 // yeah, this is very slow, but
+ ventcrawler = 1
+ var/spider_spawnfrequency = 1200 // 120 seconds
+ var/spider_spawnfrequency_stable = 1200 // 120 seconds. Spawnfrequency is set to this on ai spiders once nest setup is complete.
+ var/spider_lastspawn = 0
+ var/nestfrequency = 150 // 15 seconds
+ var/lastnestsetup = 0
+ var/neststep = 0
+ var/hasnested = 0
+ var/spider_max_per_nest = 25 // above this, AI queens become stable
+ var/canlay = 4 // main counter for egg-laying ability! # = num uses, incremented at intervals
+ var/eggslaid = 0
+ var/spider_can_fakelings = 3 // spawns defective spiderlings that don't grow up, used to freak out crew, atmosphere
+ idle_ventcrawl_chance = 0
+ force_threshold = 18 // outright immune to anything of force under 18, this means welders can't hurt it, only guns can
+ ranged = 1
+ retreat_distance = 5
+ minimum_distance = 5
+ projectilesound = 'sound/weapons/pierce.ogg'
+ projectiletype = /obj/item/projectile/terrorqueenspit
+ spider_tier = TS_TIER_4
+ spider_opens_doors = 2
+ loot = list(/obj/item/clothing/accessory/medal)
+ var/datum/action/innate/terrorspider/queen/queennest/queennest_action
+ var/datum/action/innate/terrorspider/queen/queensense/queensense_action
+ var/datum/action/innate/terrorspider/queen/queeneggs/queeneggs_action
+ var/datum/action/innate/terrorspider/queen/queenfakelings/queenfakelings_action
+ var/datum/action/innate/terrorspider/ventsmash/ventsmash_action
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/New()
+ ..()
+ queennest_action = new()
+ queennest_action.Grant(src)
+ ventsmash_action = new()
+ ventsmash_action.Grant(src)
+ spider_myqueen = src
+ if(spider_awaymission)
+ spider_growinstantly = 1
+ spider_spawnfrequency = 150
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/Life()
+ . = ..()
+ if(.) // if mob is NOT dead
+ if(ckey && canlay < 12 && hasnested) // max 12 eggs worth stored at any one time, realistically that's tons.
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(eggslaid >= 20)
+ canlay += 3
+ else if(eggslaid >= 10)
+ canlay += 2
+ else
+ canlay++
+ spider_lastspawn = world.time
+ if(canlay == 1)
+ to_chat(src, "You have an egg available to lay. ")
+ else if(canlay == 12)
+ to_chat(src, "You have [canlay] eggs available to lay. You won't grow any more eggs until you lay some of your existing ones. ")
+ else
+ to_chat(src, "You have [canlay] eggs available to lay. ")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/death(gibbed)
+ if(!hasdied)
+ SetHiveCommand(0, 15) // Hive becomes very aggressive.
+ if(spider_uo71)
+ UnlockBlastDoors("UO71_Caves")
+ // When a queen dies, so do her player-controlled purple-type guardians. Intended as a motivator for purples to ensure they guard her.
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/purple/P in ts_spiderlist)
+ if(ckey)
+ P.visible_message("\The [src] writhes in pain! ")
+ to_chat(P,"\The [src] has died. Without her hivemind link, purple terrors like yourself cannot survive more than a few minutes! ")
+ P.degenerate = 1
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/Retaliate()
+ ..()
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ T.enemies |= enemies
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/handle_automated_action()
+ ..()
+ if(!stat && !ckey && AIStatus != AI_OFF && !target && !path_to_vent)
+ switch(neststep)
+ if(0)
+ // we have no nest :(
+ var/ok_to_nest = 1
+ var/area/new_area = get_area(loc)
+ if(new_area)
+ if(findtext(new_area.name, "hall"))
+ ok_to_nest = 0
+ // nesting in a hallway would be very stupid - crew would find and kill you almost instantly
+ var/numhostiles = 0
+ for(var/mob/living/H in oview(10, src))
+ if(!istype(H, /mob/living/simple_animal/hostile/poison/terror_spider))
+ if(H.stat != DEAD)
+ numhostiles += 1
+ // nesting RIGHT NEXT TO SOMEONE is even worse
+ if(numhostiles > 0)
+ ok_to_nest = 0
+ var/vdistance = 99
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(10, src))
+ if(!v.welded)
+ if(get_dist(src, v) < vdistance)
+ entry_vent = v
+ vdistance = get_dist(src, v)
+ if(!entry_vent)
+ ok_to_nest = 0
+ // don't nest somewhere with no vent - your brood won't be able to get out!
+ if(ok_to_nest && entry_vent)
+ nest_vent = entry_vent
+ neststep = 1
+ visible_message("\The [src] settles down, starting to build a nest. ")
+ else if(entry_vent)
+ if(!path_to_vent)
+ visible_message("\The [src] looks around warily - then seeks a better nesting ground. ")
+ path_to_vent = 1
+ else
+ visible_message("\The [src] looks around, searching for the vent that should be there, but isn't. A bluespace portal forms on her, and she is gone. ")
+ qdel(src)
+ new /obj/effect/portal(get_turf(loc))
+ if(1)
+ if(world.time > (lastnestsetup + nestfrequency))
+ lastnestsetup = world.time
+ neststep = 2
+ NestMode()
+ if(2)
+ if(world.time > (lastnestsetup + nestfrequency))
+ lastnestsetup = world.time
+ spider_lastspawn = world.time
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, 2, 0)
+ neststep = 3
+ if(3)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(prob(20))
+ var/obj/structure/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
+ if(!N)
+ spider_lastspawn = world.time
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 0)
+ neststep = 4
+ if(4)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(prob(20))
+ var/obj/structure/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
+ if(!N)
+ spider_lastspawn = world.time
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 1)
+ neststep = 5
+ if(5)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(prob(20))
+ var/obj/structure/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
+ if(!N)
+ if(!spider_awaymission)
+ QueenFakeLings()
+ spider_lastspawn = world.time
+ if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, 2, 1)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 1)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
+ var/spidercount = CountSpiders()
+ if(spidercount >= spider_max_per_nest) // station overwhelmed!
+ neststep = 6
+ if(6)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ spider_lastspawn = world.time
+ // go hostile, EXTERMINATE MODE.
+ SetHiveCommand(0, 15) // AI=0 (attack everyone), ventcrawl=15%/tick
+ var/numspiders = CountSpiders()
+ if(numspiders < spider_max_per_nest)
+ if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, 2, 1)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 0)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
+ else if(spider_awaymission)
+ neststep = 7
+ spider_spawnfrequency = spider_spawnfrequency_stable
+ // if we're an away mission queen... don't keep spawning spiders at high rates. Away team should have a chance.
+ if(7)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ spider_lastspawn = world.time
+ var/numspiders = CountSpiders()
+ if(numspiders < spider_max_per_nest)
+ // someone is killing my children...
+ if(prob(25))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, 2, 1)
+ else if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 0)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, 2, 0)
+ neststep = 6
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/NestPrompt()
+ var/confirm = alert(src, "Are you sure you want to nest? You will be able to lay eggs, and smash walls, but not ventcrawl.","Nest?","Yes","No")
+ if(confirm == "Yes")
+ NestMode()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/NestMode()
+ queeneggs_action = new()
+ queeneggs_action.Grant(src)
+ queenfakelings_action = new()
+ queenfakelings_action.Grant(src)
+ queensense_action = new()
+ queensense_action.Grant(src)
+ queennest_action.Remove(src)
+ hasnested = 1
+ ventcrawler = 0
+ ai_ventcrawls = 0
+ environment_smash = 3
+ DoQueenScreech(8, 100, 8, 100)
+ MassFlicker()
+ to_chat(src, "You have matured to your egglaying stage. You can now smash through walls, and lay eggs, but can no longer ventcrawl. ")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/MassFlicker()
+ var/list/target_lights = list()
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H.z != z)
+ continue
+ if(H.stat == DEAD)
+ continue
+ for(var/obj/machinery/light/L in orange(7, H))
+ if(L.on && prob(25))
+ target_lights += L
+ for(var/obj/machinery/light/I in target_lights)
+ I.flicker()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/LayQueenEggs()
+ if(stat == DEAD)
+ return
+ if(!hasnested)
+ to_chat(src, "You must nest before doing this. ")
+ return
+ if(canlay < 1)
+ var/remainingtime = round(((spider_lastspawn + spider_spawnfrequency) - world.time) / 10, 1)
+ if(remainingtime > 0)
+ to_chat(src, "Too soon to attempt that again. Wait another [num2text(remainingtime)] seconds. ")
+ else
+ to_chat(src, "Too soon to attempt that again. Wait just a few more seconds... ")
+ return
+ var/list/eggtypes = list(TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE)
+ if(canlay >= 12)
+ eggtypes |= TS_DESC_MOTHER
+ eggtypes |= TS_DESC_PRINCE
+ var num_purples = CountSpidersType(/mob/living/simple_animal/hostile/poison/terror_spider/purple)
+ if(num_purples >= 2)
+ eggtypes -= TS_DESC_PURPLE
+ var num_blacks = CountSpidersType(/mob/living/simple_animal/hostile/poison/terror_spider/black)
+ if(num_blacks >= 2)
+ eggtypes -= TS_DESC_BLACK
+ var/eggtype = input("What kind of eggs?") as null|anything in eggtypes
+ if(!(eggtype in eggtypes))
+ to_chat(src, "Unrecognized egg type. ")
+ return 0
+ if(eggtype == TS_DESC_MOTHER || eggtype == TS_DESC_PRINCE)
+ if(canlay < 12)
+ to_chat(src, "Insufficient strength. It takes as much effort to lay one of those as it does to lay 12 normal eggs. ")
+ else
+ if(eggtype == TS_DESC_MOTHER)
+ canlay -= 12
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/mother, 1, 0)
+ else if(eggtype == TS_DESC_PRINCE)
+ canlay -= 12
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince, 1, 0)
+ return
+ var/numlings = 1
+ if(eggtype != TS_DESC_PURPLE)
+ if(canlay >= 5)
+ numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5)
+ else if(canlay >= 3)
+ numlings = input("How many in the batch?") as null|anything in list(1, 2, 3)
+ else if(canlay == 2)
+ numlings = input("How many in the batch?") as null|anything in list(1, 2)
+ if(eggtype == null || numlings == null)
+ to_chat(src, "Cancelled. ")
+ return
+ canlay -= numlings
+ eggslaid += numlings
+ if(eggtype == TS_DESC_RED)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, numlings, 1)
+ else if(eggtype == TS_DESC_GRAY)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, numlings, 1)
+ else if(eggtype == TS_DESC_GREEN)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, numlings, 1)
+ else if(eggtype == TS_DESC_BLACK)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, numlings, 1)
+ else if(eggtype == TS_DESC_PURPLE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, numlings, 0)
+ else
+ to_chat(src, "Unrecognized egg type. ")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/DoQueenScreech(light_range, light_chance, camera_range, camera_chance)
+ visible_message("\The [src] emits a bone-chilling shriek! ")
+ for(var/obj/machinery/light/L in orange(light_range, src))
+ if(L.on && prob(light_chance))
+ L.broken()
+ for(var/obj/machinery/camera/C in orange(camera_range, src))
+ if(C.status && prob(camera_chance))
+ C.toggle_cam(src, 0)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/QueenFakeLings()
+ if(eggslaid < 10)
+ to_chat(src, "You must lay at least 10 eggs before doing this. ")
+ return
+ if(spider_can_fakelings)
+ spider_can_fakelings--
+ var/numlings = 15
+ for(var/i in 1 to numlings)
+ var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
+ S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red
+ S.stillborn = 1
+ S.name = "Evil-Looking Spiderling"
+ S.desc = "It moves very quickly, hisses loudly for its size... and has disproportionately large fangs. Hopefully it does not grow up..."
+ if(!spider_can_fakelings)
+ queenfakelings_action.Remove(src)
+ else
+ to_chat(src, "You have run out of uses of this ability. ")
+
+/obj/item/projectile/terrorqueenspit
+ name = "poisonous spit"
+ damage = 0
+ icon_state = "toxin"
+ damage_type = TOX
+ var/bonus_tox = 30
+
+/obj/item/projectile/terrorqueenspit/on_hit(mob/living/carbon/target)
+ if(ismob(target))
+ var/mob/living/L = target
+ if(L.reagents)
+ if(L.can_inject(null, 0, "chest", 0))
+ L.Hallucinate(400)
+ if(!isterrorspider(L))
+ L.adjustToxLoss(bonus_tox)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
index 33480f9509c..3a77209cbfd 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
@@ -12,9 +12,8 @@
/mob/living/simple_animal/hostile/poison/terror_spider/red
name = "Red Terror spider"
desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs! It looks like it has a vicious streak a mile wide."
-
spider_role_summary = "High health, high damage, very slow, melee juggernaut"
-
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_red"
icon_living = "terror_red"
icon_dead = "terror_red_dead"
@@ -55,6 +54,6 @@
if(health > (maxHealth/2))
enrage = 1
visible_message("[src] retracts its fangs a little. ")
- melee_damage_lower = melee_damage_lower_rage0
- melee_damage_upper = melee_damage_upper_rage0
- ..()
+ melee_damage_lower = melee_damage_lower_rage1
+ melee_damage_upper = melee_damage_upper_rage1
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm
new file mode 100644
index 00000000000..d9c20c09172
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm
@@ -0,0 +1,179 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: SPIDERLINGS (USED BY GREEN, WHITE, QUEEN AND MOTHER TYPES)
+// --------------------------------------------------------------------------------
+
+/obj/structure/spider/spiderling/terror_spiderling
+ name = "spiderling"
+ desc = "A fast-moving tiny spider, prone to making aggressive hissing sounds. Hope it doesn't grow up."
+ icon_state = "spiderling"
+ anchored = 0
+ layer = 2.75
+ health = 3
+ var/stillborn = 0
+ faction = list("terrorspiders")
+ var/spider_myqueen = null
+ var/use_vents = 1
+ var/list/enemies = list()
+ var/immediate_ventcrawl = 0
+
+/obj/structure/spider/spiderling/terror_spiderling/New()
+ ..()
+ ts_spiderling_list += src
+
+/obj/structure/spider/spiderling/terror_spiderling/Destroy()
+ ts_spiderling_list -= src
+ return ..()
+
+/obj/structure/spider/spiderling/terror_spiderling/Bump(obj/O)
+ if(istype(O, /obj/structure/table))
+ forceMove(O.loc)
+ else if(istype(O, /obj/machinery/recharge_station))
+ qdel(src)
+ . = ..()
+
+/obj/structure/spider/spiderling/terror_spiderling/process()
+ if(travelling_in_vent)
+ if(isturf(loc))
+ travelling_in_vent = 0
+ entry_vent = null
+ else if(entry_vent)
+ if(get_dist(src, entry_vent) <= 1)
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.parent.other_atmosmch)
+ vents.Add(temp_vent)
+ if(!vents.len)
+ entry_vent = null
+ return
+ var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
+ if(prob(50))
+ visible_message("[src] scrambles into the ventillation ducts! ", "You hear something squeezing through the ventilation ducts. ")
+ var/original_location = loc
+ spawn(rand(20,60))
+ forceMove(exit_vent)
+ var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
+ spawn(travel_time)
+ if(!exit_vent || exit_vent.welded)
+ forceMove(original_location)
+ entry_vent = null
+ return
+ if(prob(50))
+ audible_message("You hear something squeezing through the ventilation ducts. ")
+ spawn(travel_time)
+ if(!exit_vent || exit_vent.welded)
+ forceMove(original_location)
+ entry_vent = null
+ return
+ forceMove(exit_vent.loc)
+ entry_vent = null
+ var/area/new_area = get_area(loc)
+ if(new_area)
+ new_area.Entered(src)
+ else if(prob(33))
+ var/list/nearby = oview(10, src)
+ if(nearby.len)
+ var/target_atom = pick(nearby)
+ if(!istype(get_turf(target_atom),/turf/space))
+ walk_to(src, target_atom)
+ else if(immediate_ventcrawl || (prob(10) && use_vents))
+ immediate_ventcrawl = 0
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
+ if(!v.welded)
+ entry_vent = v
+ walk_to(src, entry_vent, 1)
+ break
+ if(isturf(loc))
+ amount_grown += rand(0,2)
+ if(amount_grown >= 100)
+ if(stillborn)
+ die()
+ else
+ if(!grow_as)
+ grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green)
+ var/mob/living/simple_animal/hostile/poison/terror_spider/S = new grow_as(loc)
+ S.faction = faction
+ S.spider_myqueen = spider_myqueen
+ S.master_commander = master_commander
+ S.enemies = enemies
+ qdel(src)
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: EGGS (USED BY NURSE AND QUEEN TYPES) ---------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoLayTerrorEggs(lay_type, lay_number, lay_crawl)
+ stop_automated_movement = 1
+ var/obj/structure/spider/eggcluster/terror_eggcluster/C = new /obj/structure/spider/eggcluster/terror_eggcluster(get_turf(src))
+ C.spiderling_type = lay_type
+ C.spiderling_number = lay_number
+ C.spiderling_ventcrawl = lay_crawl
+ C.faction = faction
+ C.spider_myqueen = spider_myqueen
+ C.master_commander = master_commander
+ C.enemies = enemies
+ if(spider_growinstantly)
+ C.amount_grown = 250
+ C.spider_growinstantly = 1
+ spawn(10)
+ stop_automated_movement = 0
+
+/obj/structure/spider/eggcluster/terror_eggcluster
+ name = "terror egg cluster"
+ desc = "A cluster of tiny spider eggs. They pulse with a strong inner life, and appear to have sharp thorns on the sides."
+ icon_state = "eggs"
+ var/spider_growinstantly = 0
+ faction = list("terrorspiders")
+ var/spider_myqueen = null
+ var/spiderling_type = null
+ var/spiderling_number = 1
+ var/spiderling_ventcrawl = 1
+ var/list/enemies = list()
+
+/obj/structure/spider/eggcluster/terror_eggcluster/New()
+ ..()
+ ts_egg_list += src
+ spawn(50)
+ if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/red)
+ name = "red terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/gray)
+ name = "gray terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/green)
+ name = "green terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/black)
+ name = "black terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/purple)
+ name = "purple terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/white)
+ name = "white terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/mother)
+ name = "mother of terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/prince)
+ name = "prince of terror eggs"
+ else if(spiderling_type == /mob/living/simple_animal/hostile/poison/terror_spider/queen)
+ name = "queen of terror eggs"
+
+/obj/structure/spider/eggcluster/terror_eggcluster/Destroy()
+ ts_egg_list -= src
+ return ..()
+
+/obj/structure/spider/eggcluster/terror_eggcluster/process()
+ amount_grown += rand(0,2)
+ if(amount_grown >= 100)
+ var/num = spiderling_number
+ for(var/i=0, i melee_damage_upper)
+ continue
+ if(H in enemies)
+ targets2 += H
+ else
+ targets3 += H
+ for(var/obj/mecha/M in view(src, vision_range))
+ if(get_dist(M, src) <= 2)
+ targets2 += M
+ else
+ targets3 += M
+ for(var/obj/spacepod/S in view(src, vision_range))
+ targets3 += S
+ if(targets1.len)
+ return targets1
+ if(targets2.len)
+ return targets2
+ return targets3
+
+/mob/living/simple_animal/hostile/poison/terror_spider/LoseTarget()
+ if(target && isliving(target))
+ var/mob/living/T = target
+ if(T.stat > 0)
+ killcount++
+ regen_points += regen_points_per_kill
+ attackstep = 0
+ attackcycles = 0
+ ..()
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: AI BEHAVIOR CODE -------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/handle_automated_action()
+ if (stat || ckey)
+ return ..()
+ if(AIStatus != AI_OFF && !target)
+ var/my_ventcrawl_freq = freq_ventcrawl_idle
+ if(ts_count_dead > 0)
+ if(world.time < (ts_death_last + ts_death_window))
+ my_ventcrawl_freq = freq_ventcrawl_combat
+ // First, check for general actions that any spider could take.
+ if(path_to_vent)
+ if(entry_vent)
+ if(spider_steps_taken > spider_max_steps)
+ path_to_vent = 0
+ stop_automated_movement = 0
+ spider_steps_taken = 0
+ path_to_vent = 0
+ entry_vent = null
+ else if(get_dist(src, entry_vent) <= 1)
+ path_to_vent = 0
+ stop_automated_movement = 1
+ spider_steps_taken = 0
+ spawn(50)
+ stop_automated_movement = 0
+ TSVentCrawlRandom(entry_vent)
+ else
+ spider_steps_taken++
+ CreatePath(entry_vent)
+ step_to(src,entry_vent)
+ if(spider_debug > 0)
+ visible_message("[src] moves towards the vent [entry_vent]. ")
+ else
+ path_to_vent = 0
+ else if(ai_break_lights && world.time > (last_break_light + freq_break_light))
+ last_break_light = world.time
+ for(var/obj/machinery/light/L in range(1, src))
+ if(!L.status)
+ step_to(src,L)
+ L.on = 1
+ L.broken()
+ L.do_attack_animation(src)
+ visible_message("[src] smashes the [L.name]. ")
+ break
+ else if(ai_spins_webs && world.time > (last_spins_webs + freq_spins_webs))
+ last_spins_webs = world.time
+ var/obj/structure/spider/terrorweb/T = locate() in get_turf(src)
+ if(!T)
+ var/obj/structure/spider/terrorweb/W = new /obj/structure/spider/terrorweb(loc)
+ if(web_infects)
+ W.infectious = 1
+ W.name = "sharp terror web"
+ visible_message("[src] puts up some spider webs. ")
+ else if(ai_ventcrawls && world.time > (last_ventcrawl_time + my_ventcrawl_freq))
+ if(prob(idle_ventcrawl_chance))
+ last_ventcrawl_time = world.time
+ var/vdistance = 99
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(10, src))
+ if(!v.welded)
+ if(get_dist(src,v) < vdistance)
+ entry_vent = v
+ vdistance = get_dist(src,v)
+ if(entry_vent)
+ path_to_vent = 1
+ else
+ // If none of the general actions apply, check for class-specific actions.
+ spider_special_action()
+ else if(AIStatus != AI_OFF && target)
+ CreatePath(target)
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/adjustBruteLoss(damage)
+ ..(damage)
+ Retaliate()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/adjustFireLoss(damage)
+ ..(damage)
+ Retaliate()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/Retaliate()
+ var/list/around = oview(src, 7)
+ var/list/ts_nearby = list()
+ for(var/atom/movable/A in around)
+ if(A in enemies)
+ continue
+ if(isterrorspider(A))
+ ts_nearby += A
+ continue
+ if(isliving(A))
+ var/mob/living/M = A
+ if(!("terrorspiders" in M.faction))
+ enemies |= M
+ else if(istype(A, /obj/mecha))
+ var/obj/mecha/M = A
+ if(M.occupant)
+ enemies |= M
+ enemies |= M.occupant
+ else if(istype(A, /obj/spacepod))
+ var/obj/spacepod/M = A
+ if(M.pilot)
+ enemies |= M
+ enemies |= M.pilot
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/H in ts_nearby)
+ var/retaliate_faction_check = 0
+ for(var/F in faction)
+ if(F in H.faction)
+ retaliate_faction_check = 1
+ break
+ if(retaliate_faction_check && !attack_same && !H.attack_same)
+ H.enemies |= enemies
+ return 0
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: PATHING CODE -----------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/CreatePath(mygoal)
+ var/m2 = get_turf(src)
+ if(m2 == mylocation)
+ chasecycles++
+ ClearObstacle(get_turf(mygoal))
+ if(chasecycles >= 1)
+ chasecycles = 0
+ if(spider_opens_doors)
+ var/tgt_dir = get_dir(src,mygoal)
+ for(var/obj/machinery/door/airlock/A in view(1, src))
+ if(A.density)
+ try_open_airlock(A)
+ for(var/obj/machinery/door/firedoor/F in view(1, src))
+ if(tgt_dir == get_dir(src,F) && F.density && !F.welded)
+ visible_message("[src] pries open the firedoor! ")
+ F.open()
+
+ else
+ mylocation = m2
+ chasecycles = 0
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ClearObstacle(turf/target_turf)
+ var/list/valid_obstacles = list(/obj/structure/window, /obj/structure/closet, /obj/structure/table, /obj/structure/grille, /obj/structure/rack, /obj/machinery/door/window)
+ for(var/dir in cardinal) // North, South, East, West
+ var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
+ if(is_type_in_list(obstacle, valid_obstacles))
+ obstacle.attack_animal(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/TSVentCrawlRandom(/var/entry_vent)
+ if(entry_vent)
+ if(get_dist(src, entry_vent) <= 2)
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.parent.other_atmosmch)
+ vents.Add(temp_vent)
+ if(!vents.len)
+ entry_vent = null
+ return
+ var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
+ visible_message("[src] scrambles into the ventillation ducts! ", "You hear something squeezing through the ventilation ducts. ")
+ spawn(rand(20,60))
+ var/original_location = loc
+ forceMove(exit_vent)
+ var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
+ spawn(travel_time)
+ if(!exit_vent || exit_vent.welded)
+ forceMove(original_location)
+ entry_vent = null
+ return
+ if(prob(50))
+ audible_message("You hear something squeezing through the ventilation ducts. ")
+ spawn(travel_time)
+ if(!exit_vent || exit_vent.welded)
+ forceMove(original_location)
+ entry_vent = null
+ return
+ forceMove(exit_vent.loc)
+ entry_vent = null
+ var/area/new_area = get_area(loc)
+ if(new_area)
+ new_area.Entered(src)
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: ENVIRONMENT CODE -------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListValidTurfs()
+ var/list/potentials = list()
+ for(var/turf/simulated/T in oview(3,get_turf(src)))
+ if(T.density == 0 && get_dist(get_turf(src),T) == 3)
+ var/obj/structure/spider/terrorweb/W = locate() in T
+ if(!W)
+ var/obj/structure/grille/G = locate() in T
+ if(!G)
+ var/obj/structure/window/O = locate() in T
+ if(!O)
+ potentials += T
+ return potentials
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListWebbedTurfs()
+ var/list/webbed = list()
+ for(var/turf/simulated/T in oview(3,get_turf(src)))
+ if(T.density == 0 && get_dist(get_turf(src),T) == 3)
+ var/obj/structure/spider/terrorweb/W = locate() in T
+ if(W)
+ webbed += T
+ return webbed
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListVisibleTurfs()
+ var/list/vturfs = list()
+ for(var/turf/simulated/T in oview(7,get_turf(src)))
+ if(T.density == 0)
+ vturfs += T
+ return vturfs
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: MISC AI CODE -----------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/UnlockBlastDoors(target_id_tag)
+ for(var/obj/machinery/door/poddoor/P in airlocks)
+ if(P.density && P.id_tag == target_id_tag && P.z == z && !P.operating)
+ P.open()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index 67683d39b39..0f85d78d01f 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -1,4 +1,3 @@
-
var/global/list/ts_ckey_blacklist = list()
var/global/ts_count_dead = 0
var/global/ts_count_alive_awaymission = 0
@@ -6,6 +5,8 @@ var/global/ts_count_alive_station = 0
var/global/ts_death_last = 0
var/global/ts_death_window = 9000 // 15 minutes
var/global/list/ts_spiderlist = list()
+var/global/list/ts_egg_list = list()
+var/global/list/ts_spiderling_list = list()
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: DEFAULTS ---------------------------------
@@ -41,6 +42,15 @@ var/global/list/ts_spiderlist = list()
// Ventcrawling
ventcrawler = 1 // allows player ventcrawling
+ var/ai_ventcrawls = 1
+ var/idle_ventcrawl_chance = 3 // default 3% chance to ventcrawl when not in combat to a random exit vent
+ var/freq_ventcrawl_combat = 1800 // 3 minutes
+ var/freq_ventcrawl_idle = 9000 // 15 minutes
+ var/last_ventcrawl_time = -9000 // Last time the spider crawled. Used to prevent excessive crawling. Setting to freq*-1 ensures they can crawl once on spawn.
+
+ // AI movement tracking
+ var/spider_steps_taken = 0 // leave at 0, its a counter for ai steps taken.
+ var/spider_max_steps = 15 // after we take X turns trying to do something, give up!
// Speech
speak_chance = 0 // quiet but deadly
@@ -62,83 +72,108 @@ var/global/list/ts_spiderlist = list()
// desired: 20hp/minute unmolested, 40hp/min on food boost, assuming one tick every 2 seconds
// 90/kill means bonus 30hp/kill regenerated over the next 1-2 minutes
+ var/degenerate = 0 // if 1, they slowly degen until they all die off. Used by high-level abilities only.
+
// Vision
idle_vision_range = 10
aggro_vision_range = 10
see_in_dark = 10
nightvision = 1
- vision_type = new /datum/vision_override/nightvision/thermals/ling_augmented_eyesight
see_invisible = 5
+ sight = SEE_MOBS
- // player control by ghosts
- var/ai_playercontrol_allowingeneral = 1 // if 0, no spiders are player controllable. Default set in code, can be changed by queens.
+ // AI aggression settings
+ var/ai_type = TS_AI_AGGRESSIVE // 0 = aggressive to everyone, 1 = defends self only
+ var/ai_target_method = TS_DAMAGE_SIMPLE
+
+ // AI player control by ghosts
var/ai_playercontrol_allowtype = 1 // if 0, this specific class of spider is not player-controllable. Default set in code for each class, cannot be changed.
+ var/ai_break_lights = 1 // AI lightbreaking behavior
+ var/freq_break_light = 600
+ var/last_break_light = 0 // leave this, changed by procs.
+
+ var/ai_spins_webs = 1 // AI web-spinning behavior
+ var/freq_spins_webs = 600
+ var/last_spins_webs = 0 // leave this, changed by procs.
+ var/delay_web = 40 // delay between starting to spin web, and finishing
+
+ var/freq_cocoon_object = 1200 // two minutes between each attempt
+ var/last_cocoon_object = 0 // leave this, changed by procs.
+
+ var/prob_ai_hides_in_vents = 15 // probabily of a gray spider hiding in a vent
+
var/spider_opens_doors = 1 // all spiders can open firedoors (they have no security). 1 = can open depowered doors. 2 = can open powered doors
faction = list("terrorspiders")
var/spider_awaymission = 0 // if 1, limits certain behavior in away missions
+ var/spider_uo71 = 0 // if 1, spider is in the UO71 away mission
+ var/spider_unlock_id_tag = "" // if defined, unlock awaymission blast doors with this tag on death
var/spider_role_summary = "UNDEFINED"
var/spider_placed = 0
// AI variables designed for use in procs
- var/atom/cocoon_target // for queen and nurse
+ var/atom/movable/cocoon_target // for queen and nurse
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent // nearby vent they are going to try to get to, and enter
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent // remote vent they intend to come out of
var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens
var/fed = 0
var/travelling_in_vent = 0
+ var/list/enemies = list()
+ var/path_to_vent = 0
+ var/killcount = 0
var/busy = 0 // leave this alone!
- var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen, 5 for empress.
+ var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen
var/hasdied = 0
+ var/list/spider_special_drops = list()
var/attackstep = 0
var/attackcycles = 0
+ var/spider_myqueen = null
var/mylocation = null
var/chasecycles = 0
- var/last_cocoon_object = 0 // leave this, changed by procs.
- var/killcount = 0
-
- // Breathing, Pressure & Fire
- // - No breathing / cannot be suffocated (spiders can hold their breath, look it up)
- // - No pressure damage either - they have effectively exoskeletons
- // - HOWEVER they can be burned to death!
- // - Normal SPACE spiders should probably be immune to SPACE too, but meh, we try to leave the base spiders alone.
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- maxbodytemp = 1500
- heat_damage_per_tick = 5 //amount of damage applied if animal's body temperature is higher than maxbodytemp
-
- // DEBUG OPTIONS & COMMANDS
- var/spider_debug = 0
+ var/web_infects = 0
var/datum/action/innate/terrorspider/web/web_action
var/datum/action/innate/terrorspider/wrap/wrap_action
+ // Breathing - require some oxygen, and no toxins, but take little damage from this requirement not being met (they can hold their breath)
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 1
+
+ // Temperature - can freeze in space and cook in plasma, but it takes extreme temperatures to do this.
+ minbodytemp = 100
+ maxbodytemp = 500
+ heat_damage_per_tick = 3
+
+ // DEBUG OPTIONS & COMMANDS
+ var/spider_growinstantly = 0 // DEBUG OPTION, DO NOT ENABLE THIS ON LIVE. IT IS USED TO TEST NEST GROWTH/SETUP AI.
+ var/spider_debug = 0
+
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: SHARED ATTACK CODE -----------------------
// --------------------------------------------------------------------------------
-
-
/mob/living/simple_animal/hostile/poison/terror_spider/AttackingTarget()
- if(istype(target, /mob/living/simple_animal/hostile/poison/terror_spider))
+ if(isterrorspider(target))
+ if(target in enemies)
+ enemies -= target
var/mob/living/simple_animal/hostile/poison/terror_spider/T = target
if(T.spider_tier > spider_tier)
- visible_message("[src] bows in respect for the terrifying presence of [target]. ")
+ visible_message("[src] cowers before [target]. ")
else if(T.spider_tier == spider_tier)
visible_message("[src] nuzzles [target]. ")
else if(T.spider_tier < spider_tier && spider_tier >= 4)
- visible_message("[src] gives [target] a stern look. ")
+ target.attack_animal(src)
else
visible_message("[src] harmlessly nuzzles [target]. ")
T.CheckFaction()
CheckFaction()
- else if(istype(target, /obj/effect/spider/cocoon))
+ else if(istype(target, /obj/structure/spider/cocoon))
to_chat(src, "Destroying our own cocoons would not help us.")
else if(istype(target, /obj/machinery/door/firedoor))
var/obj/machinery/door/firedoor/F = target
if(F.density)
- if(F.blocked)
+ if(F.welded)
to_chat(src, "The fire door is welded shut.")
else
visible_message("\The [src] pries open the firedoor! ")
@@ -158,27 +193,26 @@ var/global/list/ts_spiderlist = list()
var/can_poison = 1
if(ishuman(G))
var/mob/living/carbon/human/H = G
- if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON))
+ if(!(H.species.reagent_tag & PROCESS_ORG) || (!H.species.tox_mod))
can_poison = 0
spider_specialattack(G,can_poison)
else
G.attack_animal(src)
+ else if(istype(target, /obj/structure/alien/resin))
+ var/obj/structure/alien/resin/E = target
+ do_attack_animation(E)
+ E.health -= rand(melee_damage_lower, melee_damage_upper)
+ E.healthcheck()
else
target.attack_animal(src)
-/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(mob/living/carbon/human/L, var/poisonable)
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(mob/living/carbon/human/L, poisonable)
L.attack_animal(src)
-
-
-
-
-
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: PROC OVERRIDES ---------------------------
// --------------------------------------------------------------------------------
-
/mob/living/simple_animal/hostile/poison/terror_spider/examine(mob/user)
..()
var/list/msgs = list()
@@ -195,18 +229,20 @@ var/global/list/ts_spiderlist = list()
msgs += "It has many injuries. "
else if(health > (maxHealth*0.25))
msgs += "It is barely clinging on to life! "
+ if(degenerate)
+ msgs += "It appears to be dying. "
else if(health < maxHealth && regen_points > regen_points_per_kill)
msgs += "It appears to be regenerating quickly. "
if(killcount >= 1)
msgs += "It has blood dribbling from its mouth. "
to_chat(usr,msgs.Join(" "))
-
/mob/living/simple_animal/hostile/poison/terror_spider/New()
..()
ts_spiderlist += src
add_language("Spider Hivemind")
- add_language("Galactic Common")
+ if(spider_tier >= TS_TIER_2)
+ add_language("Galactic Common")
default_language = all_languages["Spider Hivemind"]
web_action = new()
@@ -215,10 +251,19 @@ var/global/list/ts_spiderlist = list()
wrap_action.Grant(src)
name += " ([rand(1, 1000)])"
+ real_name = name
msg_terrorspiders("[src] has grown in [get_area(src)].")
if(is_away_level(z))
spider_awaymission = 1
ts_count_alive_awaymission++
+ if(spider_tier >= 3)
+ ai_ventcrawls = 0 // means that pre-spawned bosses on away maps won't ventcrawl. Necessary to keep prince/mother in one place.
+ if(istype(get_area(src), /area/awaymission/UO71)) // if we are playing the away mission with our special spiders...
+ spider_uo71 = 1
+ if(world.time < 600)
+ // these are static spiders, specifically for the UO71 away mission, make them stay in place
+ ai_ventcrawls = 0
+ spider_placed = 1
else
ts_count_alive_station++
// after 30 seconds, assuming nobody took control of it yet, offer it to ghosts.
@@ -233,9 +278,9 @@ var/global/list/ts_spiderlist = list()
if(ckey)
var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state)
notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay)
- else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype)
+ else if(ai_playercontrol_allowtype)
var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state)
- notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control) ", source = src, alert_overlay = alert_overlay, attack_not_jump = 1)
+ notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control) ", source = src, alert_overlay = alert_overlay, action = NOTIFY_ATTACK)
/mob/living/simple_animal/hostile/poison/terror_spider/Destroy()
ts_spiderlist -= src
@@ -243,13 +288,15 @@ var/global/list/ts_spiderlist = list()
return ..()
/mob/living/simple_animal/hostile/poison/terror_spider/Life()
- ..()
- if(stat == DEAD)
+ . = ..()
+ if(!.) // if mob is dead
if(prob(2))
// 2% chance every cycle to decompose
visible_message("\The dead body of the [src] decomposes! ")
gib()
else
+ if(degenerate > 0)
+ adjustToxLoss(rand(1,10))
if(regen_points < regen_points_max)
regen_points += regen_points_per_tick
if((bruteloss > 0) || (fireloss > 0))
@@ -263,9 +310,6 @@ var/global/list/ts_spiderlist = list()
if(prob(5))
CheckFaction()
-
-
-
/mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying()
if(!hasdied)
hasdied = 1
@@ -282,20 +326,20 @@ var/global/list/ts_spiderlist = list()
handle_dying()
..()
-
/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action()
return
-/mob/living/simple_animal/hostile/poison/terror_spider/Bump(atom/A)
- if(istype(A, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/L = A
+/mob/living/simple_animal/hostile/poison/terror_spider/ObjBump(obj/O)
+ if(istype(O, /obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/L = O
if(L.density)
- try_open_airlock(L)
- if(istype(A, /obj/machinery/door/firedoor))
- var/obj/machinery/door/firedoor/F = A
- if(F.density && !F.blocked)
+ return try_open_airlock(L)
+ if(istype(O, /obj/machinery/door/firedoor))
+ var/obj/machinery/door/firedoor/F = O
+ if(F.density && !F.welded)
F.open()
- ..()
+ return 1
+ . = ..()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(msgtext)
for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
@@ -319,6 +363,7 @@ var/global/list/ts_spiderlist = list()
to_chat(src, "The door is bolted shut. ")
else if(D.allowed(src))
D.open(1)
+ return 1
else if(D.arePowerSystemsOn() && (spider_opens_doors != 2))
to_chat(src, "The door's motors resist your efforts to force it. ")
else if(!spider_opens_doors)
@@ -326,4 +371,5 @@ var/global/list/ts_spiderlist = list()
else
visible_message("[src] pries open the door! ")
playsound(src.loc, "sparks", 100, 1)
- D.open(1)
\ No newline at end of file
+ D.open(1)
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm
new file mode 100644
index 00000000000..0eced254544
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm
@@ -0,0 +1,61 @@
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T2 WHITE TERROR ------------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: stealthy reproduction
+// -------------: AI: injects a venom that makes you grow spiders in your body, then retreats
+// -------------: SPECIAL: stuns you on first attack - vulnerable to groups while it does this
+// -------------: TO FIGHT IT: blast it before it can get away
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/white
+ name = "White Terror spider"
+ desc = "An ominous-looking white spider, its ghostly eyes and vicious-looking fangs are the stuff of nightmares."
+ spider_role_summary = "Rare, bite-and-run spider that infects hosts with spiderlings"
+ ai_target_method = TS_DAMAGE_POISON
+ icon_state = "terror_white"
+ icon_living = "terror_white"
+ icon_dead = "terror_white_dead"
+ maxHealth = 200
+ health = 200
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+ move_to_delay = 4
+ spider_tier = TS_TIER_2
+ loot = list(/obj/item/clothing/accessory/medal)
+ web_infects = 1
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/white/LoseTarget()
+ stop_automated_movement = 0
+ attackstep = 0
+ attackcycles = 0
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/white/death(gibbed)
+ if(!hasdied)
+ if(spider_uo71)
+ UnlockBlastDoors("UO71_Bridge")
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/white/spider_specialattack(mob/living/carbon/human/L, poisonable)
+ if(!poisonable)
+ ..()
+ return
+ var/inject_target = pick("chest","head")
+ L.attack_animal(src)
+ if(L.stunned || L.paralysis || L.can_inject(null, 0, inject_target, 0))
+ if(!IsTSInfected(L))
+ visible_message("[src] buries its long fangs deep into the [inject_target] of [L]! ")
+ new /obj/item/organ/internal/body_egg/terror_eggs(L)
+ if(!ckey)
+ LoseTarget()
+ walk_away(src,L,2,1)
+ else if(prob(25))
+ visible_message("[src] pounces on [L]! ")
+ L.Weaken(5)
+ L.Stun(5)
+
+/proc/IsTSInfected(mob/living/carbon/C) // Terror AI requires this
+ if(C.get_int_organ(/obj/item/organ/internal/body_egg))
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
new file mode 100644
index 00000000000..b4ac6212220
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -0,0 +1,116 @@
+
+
+/obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures
+ name = "flower bud"
+ desc = "A large pulsating plant..."
+ icon = 'icons/effects/spacevines.dmi'
+ icon_state = "flower_bud"
+ layer = MOB_LAYER + 0.9
+ opacity = 0
+ canSmoothWith = list()
+ smooth = SMOOTH_FALSE
+ var/growth_time = 1200
+
+/obj/structure/alien/resin/flower_bud_enemy/New()
+ ..()
+ var/list/anchors = list()
+ anchors += locate(x-2,y+2,z)
+ anchors += locate(x+2,y+2,z)
+ anchors += locate(x-2,y-2,z)
+ anchors += locate(x+2,y-2,z)
+
+ for(var/turf/T in anchors)
+ var/datum/beam/B = Beam(T, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
+ B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow)
+ addtimer(src, "bear_fruit", growth_time)
+
+/obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit()
+ visible_message("the plant has borne fruit! ")
+ new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src))
+ qdel(src)
+
+
+/obj/effect/ebeam/vine
+ name = "thick vine"
+ mouse_opacity = 1
+ desc = "A thick vine, painful to the touch."
+
+
+/obj/effect/ebeam/vine/Crossed(atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(!("vines" in L.faction))
+ L.adjustBruteLoss(5)
+ to_chat(L, "You cut yourself on the thorny vines. ")
+
+
+
+/mob/living/simple_animal/hostile/venus_human_trap
+ name = "venus human trap"
+ desc = "Now you know how the fly feels."
+ icon_state = "venus_human_trap"
+ layer = MOB_LAYER + 0.9
+ health = 50
+ maxHealth = 50
+ ranged = 1
+ harm_intent_damage = 5
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ a_intent = I_HARM
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 0
+ faction = list("hostile","vines","plants")
+ var/list/grasping = list()
+ var/max_grasps = 4
+ var/grasp_chance = 20
+ var/grasp_pull_chance = 85
+ var/grasp_range = 4
+ del_on_death = 1
+
+/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
+ if(..())
+ for(var/mob/living/L in grasping)
+ if(L.stat == DEAD)
+ var/datum/beam/B = grasping[L]
+ if(B)
+ B.End()
+ grasping -= L
+
+ //Can attack+pull multiple times per cycle
+ if(L.Adjacent(src))
+ L.attack_animal(src)
+ else
+ if(prob(grasp_pull_chance))
+ dir = get_dir(src,L) //staaaare
+ step(L,get_dir(L,src)) //reel them in
+ L.Weaken(3) //you can't get away now~
+
+ if(grasping.len < max_grasps)
+ grasping:
+ for(var/mob/living/L in view(grasp_range, src))
+ if(L == src || faction_check(L) || (L in grasping) || L == target)
+ continue
+ for(var/t in getline(src,L))
+ for(var/a in t)
+ var/atom/A = a
+ if(A.density && A != L)
+ continue grasping
+ if(prob(grasp_chance))
+ to_chat(L, "\The [src] has you entangled! ")
+ grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
+
+ break //only take 1 new victim per cycle
+
+
+/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target)
+ var/dist = get_dist(src,the_target)
+ Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine)
+ the_target.attack_animal(src)
+
+
+/mob/living/simple_animal/hostile/venus_human_trap/CanAttack(atom/the_target)
+ . = ..()
+ if(.)
+ if(the_target in grasping)
+ return 0
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 8e655760d11..de27a2173c3 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -406,7 +406,7 @@
if(!parrot_perch || parrot_interest.loc != parrot_perch.loc)
held_item = parrot_interest
parrot_interest.loc = src
- visible_message("[src] grabs the [held_item]!", "\blue You grab the [held_item]!", "You hear the sounds of wings flapping furiously.")
+ visible_message("[src] grabs the [held_item]!", "You grab the [held_item]! ", "You hear the sounds of wings flapping furiously.")
parrot_interest = null
parrot_state = PARROT_SWOOP | PARROT_RETURN
@@ -505,7 +505,8 @@
/mob/living/simple_animal/parrot/movement_delay()
if(client && stat == CONSCIOUS && parrot_state != "parrot_fly")
icon_state = "parrot_fly"
- ..()
+ //Because the most appropriate place to set icon_state is movement_delay(), clearly
+ return ..()
/mob/living/simple_animal/parrot/proc/search_for_item()
for(var/atom/movable/AM in view(src))
@@ -515,12 +516,12 @@
if(istype(AM, /obj/item))
var/obj/item/I = AM
- if(I.w_class < 2)
+ if(I.w_class < WEIGHT_CLASS_SMALL)
return I
if(iscarbon(AM))
var/mob/living/carbon/C = AM
- if((C.l_hand && C.l_hand.w_class <= 2) || (C.r_hand && C.r_hand.w_class <= 2))
+ if((C.l_hand && C.l_hand.w_class <= WEIGHT_CLASS_SMALL) || (C.r_hand && C.r_hand.w_class <= WEIGHT_CLASS_SMALL))
return C
return null
@@ -544,12 +545,12 @@
if(istype(AM, /obj/item))
var/obj/item/I = AM
- if(I.w_class <= 2)
+ if(I.w_class <= WEIGHT_CLASS_SMALL)
return I
if(iscarbon(AM))
var/mob/living/carbon/C = AM
- if(C.l_hand && C.l_hand.w_class <= 2 || C.r_hand && C.r_hand.w_class <= 2)
+ if(C.l_hand && C.l_hand.w_class <= WEIGHT_CLASS_SMALL || C.r_hand && C.r_hand.w_class <= WEIGHT_CLASS_SMALL)
return C
return null
@@ -571,7 +572,7 @@
for(var/obj/item/I in view(1,src))
//Make sure we're not already holding it and it's small enough
- if(I.loc != src && I.w_class <= 2)
+ if(I.loc != src && I.w_class <= WEIGHT_CLASS_SMALL)
//If we have a perch and the item is sitting on it, continue
if(!client && parrot_perch && I.loc == parrot_perch.loc)
@@ -600,10 +601,10 @@
var/obj/item/stolen_item = null
for(var/mob/living/carbon/C in view(1,src))
- if(C.l_hand && C.l_hand.w_class <= 2)
+ if(C.l_hand && C.l_hand.w_class <= WEIGHT_CLASS_SMALL)
stolen_item = C.l_hand
- if(C.r_hand && C.r_hand.w_class <= 2)
+ if(C.r_hand && C.r_hand.w_class <= WEIGHT_CLASS_SMALL)
stolen_item = C.r_hand
if(stolen_item)
diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm
index 70ea452381d..0abbdcdbcfd 100644
--- a/code/modules/mob/living/simple_animal/posessed_object.dm
+++ b/code/modules/mob/living/simple_animal/posessed_object.dm
@@ -13,12 +13,11 @@
universal_speak = 1 // Tell the humans spooky things about the afterlife
speak_emote = list("mumbles", "moans", "whispers", "laments", "screeches")
- allow_spin = 0 // No spinning. Spinning breaks our floating animation and broken floating animations make ghosts SUPER ANGRY.
+ allow_spin = 0 // No spinning. Spinning breaks our floating animation.
no_spin_thrown = 1
var/obj/item/possessed_item
-
/mob/living/simple_animal/possessed_object/examine(mob/user)
possessed_item.examine(user)
if(health > (maxHealth / 30))
@@ -47,15 +46,17 @@
/mob/living/simple_animal/possessed_object/death(gibbed)
+ var/mob/dead/observer/ghost = ghostize(1)
..()
if(gibbed) // Leave no trace.
- var/mob/dead/observer/ghost = ghostize(1)
ghost.timeofdeath = world.time
qdel(src)
return
- possessed_item.forceMove(loc) // Put the normal item back once the EVIL SPIRIT has been vanquished from it.
+ if(possessed_item.loc == src)
+ possessed_item.forceMove(loc) // Put the normal item back once the EVIL SPIRIT has been vanquished from it. If it's not already in place
+
qdel(src)
@@ -65,15 +66,23 @@
if(!possessed_item) // If we're a donut and someone's eaten us, for instance.
death(1)
- if(possessed_item.loc != src)
- forceMove(possessed_item.loc)
- possessed_item.forceMove(src)
+ if( possessed_item.loc != src )
+ if ( isturf(possessed_item.loc) ) // If we've, say, placed the possessed item on the table move onto the table ourselves instead and put it back inside of us.
+ forceMove(possessed_item.loc)
+ possessed_item.forceMove(src)
+ else // If we're inside a toolbox or something, we are inside the item rather than the item inside us. This is so people can see the item in the toolbox.
+ forceMove( possessed_item )
if(l_hand) // Incase object interactions put things directly into our hands. (Like cameras, or gun magizines)
drop_l_hand()
if(r_hand)
drop_r_hand()
+/mob/living/simple_animal/possessed_object/Login()
+ ..()
+ to_chat(src, "Your spirit has entered [src] and possessed it. You are able to do most things a humanoid would be able to do with a [src] in their hands. If you want to end your ghostly possession, use the 'ghost ' verb, it won't penalize your ability to respawn. ")
+
+
/mob/living/simple_animal/possessed_object/New(var/atom/loc as obj)
..()
@@ -89,23 +98,14 @@
qdel(src)
possessed_item = loc
- forceMove(possessed_loc)
+ forceMove( possessed_loc )
possessed_item.forceMove(src) // We'll keep the actual item inside of us until we die.
- zone_sel = new /obj/screen/zone_sel(src) // Create a new zone selection item so the human attacks have something to reference.
+ zone_sel = new /obj/screen/zone_sel(src) // Create a new zone selection item so the human attacks have something to reference. Horrifying and ugly hack, do not look directly at this.
- name = possessed_item.name // Take on all the attributes of the item we've possessed.
- real_name = name
- desc = possessed_item.desc
- icon = possessed_item.icon
- icon_living = possessed_item.icon_state
- icon_state = possessed_item.icon_state
- dir = possessed_item.dir
- color = possessed_item.color
- overlays = possessed_item.overlays
- opacity = possessed_item.opacity
+ update_icon(1)
- visible_message("[src] rises into the air and begins to float! ") // Inform those around us that shit's gettin' spooky.
+ visible_message("[src] rises into the air and begins to float! ") // Inform those around us that shit's gettin' spooky.
animate_ghostly_presence(src, -1, 20, 1)
@@ -138,17 +138,26 @@
else
..()
- if(possessed_item.loc != src) // If we've, say, placed the possessed item on the table move onto the table ourselves instead and put it back inside of us.
- forceMove(possessed_item.loc)
- possessed_item.forceMove(src)
+ if( possessed_item.loc != src )
+ if ( isturf(possessed_item.loc) ) // If we've, say, placed the possessed item on the table move onto the table ourselves instead and put it back inside of us.
+ forceMove(possessed_item.loc)
+ possessed_item.forceMove(src)
+ else // If we're inside a toolbox or something, we are inside the item rather than the item inside us. This is so people can see the item in the toolbox.
+ forceMove( possessed_item )
- name = possessed_item.name // Update our status
+ update_icon()
+
+/mob/living/simple_animal/possessed_object/proc/update_icon(update_pixel_xy = 0)
+ name = possessed_item.name // Take on all the attributes of the item we've possessed.
real_name = name
desc = possessed_item.desc
icon = possessed_item.icon
icon_living = possessed_item.icon_state
icon_state = possessed_item.icon_state
dir = possessed_item.dir
+ if(update_pixel_xy)
+ pixel_x = possessed_item.pixel_x
+ pixel_y = possessed_item.pixel_y
color = possessed_item.color
overlays = possessed_item.overlays
- opacity = possessed_item.opacity
+ set_opacity(possessed_item.opacity)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/powers.dm b/code/modules/mob/living/simple_animal/powers.dm
index 9177b61ea2d..9d1d6217415 100644
--- a/code/modules/mob/living/simple_animal/powers.dm
+++ b/code/modules/mob/living/simple_animal/powers.dm
@@ -8,13 +8,13 @@
if(layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
- to_chat(src, text("\green You are now hiding."))
+ to_chat(src, text("You are now hiding. "))
for(var/mob/O in oviewers(src, null))
if((O.client && !( O.blinded )))
to_chat(O, text("[] scurries to the ground! ", src))
else
layer = MOB_LAYER
- to_chat(src, text("\green You have stopped hiding."))
+ to_chat(src, text("You have stopped hiding. "))
for(var/mob/O in oviewers(src, null))
if((O.client && !( O.blinded )))
to_chat(O, text("[] slowly peaks up from the ground...", src))
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index d4d52f63ce5..01ce4964ece 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -40,12 +40,12 @@
health -= damage
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ M.show_message("[src] has been attacked with the [O] by [user]. ")
else
- to_chat(usr, "\red This weapon is ineffective, it does no damage.")
+ to_chat(usr, "This weapon is ineffective, it does no damage. ")
for(var/mob/M in viewers(src, null))
if((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ M.show_message("[user] gently taps [src] with the [O]. ")
return
/mob/living/simple_animal/shade/sword
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index eae08eb4d0c..1aa6c82b4a8 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -96,6 +96,7 @@
if(collar)
collar.forceMove(loc)
collar = null
+ master_commander = null
simple_animal_list -= src
return ..()
@@ -249,20 +250,6 @@
else if(bodytemperature > maxbodytemp)
adjustBruteLoss(heat_damage_per_tick)
-/mob/living/simple_animal/Bumped(AM as mob|obj)
- if(!AM) return
-
- if(resting || buckled)
- return
-
- if(isturf(src.loc))
- if((status_flags & CANPUSH) && ismob(AM))
- var/newamloc = src.loc
- src.loc = AM:loc
- AM:loc = newamloc
- else
- ..()
-
/mob/living/simple_animal/gib()
if(icon_gib)
flick(icon_gib, src)
@@ -301,6 +288,9 @@
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attack_threshold_check(damage,M.melee_damage_type)
+/mob/living/simple_animal/proc/attacked_by(obj/item/I, mob/living/user) // Handled in _onclick/click.dm
+ return
+
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
@@ -444,11 +434,11 @@
/mob/living/simple_animal/movement_delay()
- var/tally = 0 //Incase I need to add stuff other than "speed" later
+ . = ..()
- tally = speed
+ . = speed
- return tally+config.animal_delay
+ . += config.animal_delay
/mob/living/simple_animal/Stat()
..()
@@ -579,21 +569,7 @@
density = initial(density)
update_canmove()
-/mob/living/simple_animal/show_inv(mob/user as mob)
- user.set_machine(src)
- var/dat = {"
- Close
- "}
- var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250)
- popup.set_content(dat)
- popup.open()
/mob/living/simple_animal/proc/make_babies() // <3 <3 <3
if(gender != FEMALE || stat || !scan_ready || !childtype || !simplespecies)
@@ -652,70 +628,88 @@
if(changed)
animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
-/mob/living/simple_animal/Topic(href, href_list)
- if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
- if(href_list["remove_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
- return
- var/remove_from = href_list["remove_inv"]
- switch(remove_from)
- if("collar")
- if(!can_collar)
- return
- if(collar)
- if(collar.flags & NODROP)
- to_chat(usr, "\The [collar] is stuck too hard to [src] for you to remove! ")
- return
- collar.dropped(src)
- collar.forceMove(src.loc)
- collar = null
- regenerate_icons()
- else
- to_chat(usr, "There is nothing to remove from its [remove_from]. ")
- return
- show_inv(usr)
- else if(href_list["add_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
- return
+/* Inventory */
- var/add_to = href_list["add_inv"]
- switch(add_to)
- if("collar")
- if(!can_collar || collar)
- return
- var/obj/item/clothing/accessory/petcollar/C = usr.get_active_hand()
- if(!istype(C))
- usr.visible_message("[usr] rubs [src]'s neck.","You rub [src]'s neck for a moment. ")
- return
- usr.drop_item()
- C.forceMove(src)
- collar = C
- collar.equipped(src)
- regenerate_icons()
- to_chat(usr, "You put \the [C] around \the [src]'s neck. ")
- if(C.tagname)
- name = C.tagname
- real_name = C.tagname
- show_inv(usr)
+/mob/living/simple_animal/show_inv(mob/user as mob)
+ if(!can_collar)
+ return
+
+ user.set_machine(src)
+ var/dat = ""
+ dat += "Close "
+
+ var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250)
+ popup.set_content(dat)
+ popup.open()
+
+/mob/living/simple_animal/get_item_by_slot(slot_id)
+ switch(slot_id)
+ if(slot_collar)
+ return collar
+ . = ..()
+
+/mob/living/simple_animal/can_equip(obj/item/I, slot, disable_warning = 0)
+ // . = ..() // Do not call parent. We do not want animals using their hand slots.
+ switch(slot)
+ if(slot_collar)
+ if(collar)
+ return 0
+ if(!can_collar)
+ return 0
+ if(!istype(I, /obj/item/clothing/accessory/petcollar))
+ return 0
+ return 1
+
+/mob/living/simple_animal/equip_to_slot(obj/item/W, slot)
+ if(!istype(W))
+ return 0
+
+ if(!slot)
+ return 0
+
+ W.forceMove(src)
+ W.equipped(src, slot)
+ W.layer = 20
+ W.plane = HUD_PLANE
+
+ switch(slot)
+ if(slot_collar)
+ collar = W
+ if(collar.tagname)
+ name = collar.tagname
+ real_name = collar.tagname
+ regenerate_icons()
+
+/mob/living/simple_animal/unEquip(obj/item/I, force)
+ . = ..()
+ if(!. || !I)
+ return
+
+ if(I == collar)
+ collar = null
+ regenerate_icons()
/mob/living/simple_animal/get_access()
. = ..()
if(collar)
. |= collar.GetAccess()
+/* End Inventory */
+
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
return
-/mob/living/simple_animal/update_sight()
+/mob/living/simple_animal/update_sight(reset_sight = FALSE)
if(!client)
return
if(stat == DEAD)
grant_death_vision()
return
- see_invisible = initial(see_invisible)
- see_in_dark = initial(see_in_dark)
- sight = initial(sight)
+ if(reset_sight)
+ see_invisible = initial(see_invisible)
+ see_in_dark = initial(see_in_dark)
+ sight = initial(sight)
if(client.eye != src)
var/atom/A = client.eye
diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm
index 0cbf24cf6e2..46a05daba98 100644
--- a/code/modules/mob/living/simple_animal/spawner.dm
+++ b/code/modules/mob/living/simple_animal/spawner.dm
@@ -40,6 +40,7 @@
return 0
spawn_delay = world.time + spawn_time
var/mob/living/simple_animal/L = new mob_type(src.loc)
+ L.admin_spawned = admin_spawned //If we were admin spawned, lets have our children count as that as well.
spawned_mobs += L
L.nest = src
L.faction = src.faction
diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm
index 6a18da90aaa..78b28abf9f8 100644
--- a/code/modules/mob/living/simple_animal/tribbles.dm
+++ b/code/modules/mob/living/simple_animal/tribbles.dm
@@ -195,10 +195,10 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
if(src.destroyed)
return
else
- to_chat(usr, text("\blue You kick the lab cage."))
+ to_chat(usr, text("You kick the lab cage. "))
for(var/mob/O in oviewers())
if((O.client && !( O.blinded )))
- to_chat(O, text("\red [] kicks the lab cage.", usr))
+ to_chat(O, text("[] kicks the lab cage. ", usr))
src.health -= 2
healthcheck()
return
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 402f94e837e..30fe030bdcb 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -140,12 +140,14 @@
/mob/living/proc/StartResting(updating = 1)
var/val_change = !resting
resting = TRUE
+
if(updating && val_change)
update_canmove()
/mob/living/proc/StopResting(updating = 1)
var/val_change = !!resting
resting = FALSE
+
if(updating && val_change)
update_canmove()
@@ -352,19 +354,19 @@
// SLEEPING
-/mob/living/Sleeping(amount, updating = 1)
- SetSleeping(max(sleeping, amount), updating)
+/mob/living/Sleeping(amount, updating = 1, no_alert = FALSE)
+ SetSleeping(max(sleeping, amount), updating, no_alert)
-/mob/living/SetSleeping(amount, updating = 1)
+/mob/living/SetSleeping(amount, updating = 1, no_alert = FALSE)
sleeping = max(amount, 0)
- update_sleeping_effects()
+ update_sleeping_effects(no_alert)
if(updating)
update_stat()
update_canmove()
-/mob/living/AdjustSleeping(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1)
+/mob/living/AdjustSleeping(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, no_alert = FALSE)
var/new_value = directional_bounded_sum(sleeping, amount, bound_lower, bound_upper)
- SetSleeping(new_value, updating)
+ SetSleeping(new_value, updating, no_alert)
// SLOWED
diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm
index f817b03482e..257a4bc87c1 100644
--- a/code/modules/mob/living/update_status.dm
+++ b/code/modules/mob/living/update_status.dm
@@ -30,9 +30,10 @@
else
clear_fullscreen("nearsighted")
-/mob/living/update_sleeping_effects()
+/mob/living/update_sleeping_effects(no_alert = FALSE)
if(sleeping)
- throw_alert("asleep", /obj/screen/alert/asleep)
+ if(!no_alert)
+ throw_alert("asleep", /obj/screen/alert/asleep)
else
clear_alert("asleep")
@@ -95,3 +96,29 @@
/mob/living/proc/update_stamina()
return
+
+/mob/living/on_varedit(modified_var)
+ switch(modified_var)
+ if("weakened")
+ SetWeakened(weakened)
+ if("stunned")
+ SetStunned(stunned)
+ if("paralysis")
+ SetParalysis(paralysis)
+ if("sleeping")
+ SetSleeping(sleeping)
+ if("eye_blind")
+ SetEyeBlind(eye_blind)
+ if("eye_blurry")
+ SetEyeBlurry(eye_blurry)
+ if("ear_deaf")
+ SetEarDeaf(ear_deaf)
+ if("ear_damage")
+ SetEarDamage(ear_damage)
+ if("druggy")
+ SetDruggy(druggy)
+ if("maxHealth")
+ updatehealth()
+ if("resize")
+ update_transform()
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 8cc51882ebf..27197474c00 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -72,6 +72,8 @@
for(var/datum/alternate_appearance/AA in viewing_alternate_appearances)
AA.display_to(list(src))
+ update_client_colour(0)
+
callHook("mob_login", list("client" = client, "mob" = src))
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 6293707cdc8..cb86d417fbc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -2,13 +2,11 @@
mob_list -= src
dead_mob_list -= src
living_mob_list -= src
- qdel(hud_used)
- hud_used = null
+ QDEL_NULL(hud_used)
if(mind && mind.current == src)
spellremove(src)
mobspellremove(src)
- for(var/infection in viruses)
- qdel(infection)
+ QDEL_LIST(viruses)
ghostize()
for(var/mob/dead/observer/M in following_mobs)
M.following = null
@@ -19,7 +17,8 @@
for(var/datum/alternate_appearance/AA in viewing_alternate_appearances)
AA.viewers -= src
viewing_alternate_appearances = null
- return ..()
+ ..()
+ return QDEL_HINT_HARDDEL_NOW
/mob/New()
mob_list += src
@@ -46,14 +45,14 @@
var/datum/gas_mixture/environment = loc.return_air()
- var/t = "\blue Coordinates: [x],[y] \n"
- t+= "\red Temperature: [environment.temperature] \n"
- t+= "\blue Nitrogen: [environment.nitrogen] \n"
- t+= "\blue Oxygen: [environment.oxygen] \n"
- t+= "\blue Plasma : [environment.toxins] \n"
- t+= "\blue Carbon Dioxide: [environment.carbon_dioxide] \n"
+ var/t = "Coordinates: [x],[y] \n "
+ t+= "Temperature: [environment.temperature] \n "
+ t+= "Nitrogen: [environment.nitrogen] \n "
+ t+= "Oxygen: [environment.oxygen] \n "
+ t+= "Plasma : [environment.toxins] \n "
+ t+= "Carbon Dioxide: [environment.carbon_dioxide] \n "
for(var/datum/gas/trace_gas in environment.trace_gases)
- to_chat(usr, "\blue [trace_gas.type]: [trace_gas.moles] \n")
+ to_chat(usr, "[trace_gas.type]: [trace_gas.moles] \n ")
usr.show_message(t, 1)
@@ -170,9 +169,8 @@
if(istype(W))
if(istype(W, /obj/item/clothing))
var/obj/item/clothing/C = W
- if(C.rig_restrict_helmet)
- to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping.
-
+ if(C.hardsuit_restrict_helmet)
+ to_chat(src, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit) ")// Stop eva helms equipping.
else
equip_to_slot_if_possible(C, slot)
else
@@ -207,7 +205,7 @@
qdel(W)
else
if(!disable_warning)
- to_chat(src, "\red You are unable to equip that.")//Only print if del_on_fail is false
+ to_chat(src, "You are unable to equip that. ")//Only print if del_on_fail is false
return 0
@@ -230,22 +228,18 @@
//Mob can equip. Equip it.
equip_to_slot_or_del(W, slot)
else
- //Mob can't equip it. Put it in a bag B.
- // Do I have a backpack?
- var/obj/item/weapon/storage/B
- if(istype(back,/obj/item/weapon/storage))
- //Mob is wearing backpack
- B = back
- else
- //not wearing backpack. Check if player holding plastic bag
- B=is_in_hands(/obj/item/weapon/storage/bag/plasticbag)
- if(!B) //If not holding plastic bag, give plastic bag
- B=new /obj/item/weapon/storage/bag/plasticbag(null) // Null in case of failed equip.
- if(!put_in_hands(B))
- return // Bag could not be placed in players hands. I don't know what to do here...
- //Now, B represents a container we can insert W into.
- B.handle_item_insertion(W,1)
- return B
+ //Mob can't equip it. Put it their backpack or toss it on the floor
+ if(istype(back, /obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = back
+ //Now, B represents a container we can insert W into.
+ S.handle_item_insertion(W,1)
+ return S
+
+ var/turf/T = get_turf(src)
+ if(istype(T))
+ W.forceMove(T)
+ return T
+
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
@@ -351,7 +345,7 @@ var/list/slot_equipment_priority = list( \
if(slot_belt)
if(!H.w_uniform)
if(!disable_warning)
- to_chat(H, "\red You need a jumpsuit before you can attach this [name].")
+ to_chat(H, "You need a jumpsuit before you can attach this [name]. ")
return 0
if( !(slot_flags & SLOT_BELT) )
return 0
@@ -411,7 +405,7 @@ var/list/slot_equipment_priority = list( \
if(slot_wear_id)
if(!H.w_uniform)
if(!disable_warning)
- to_chat(H, "\red You need a jumpsuit before you can attach this [name].")
+ to_chat(H, "You need a jumpsuit before you can attach this [name]. ")
return 0
if( !(slot_flags & SLOT_ID) )
return 0
@@ -426,34 +420,34 @@ var/list/slot_equipment_priority = list( \
return 0
if(!H.w_uniform)
if(!disable_warning)
- to_chat(H, "\red You need a jumpsuit before you can attach this [name].")
+ to_chat(H, "You need a jumpsuit before you can attach this [name]. ")
return 0
if(slot_flags & SLOT_DENYPOCKET)
return
- if( w_class <= 2 || (slot_flags & SLOT_POCKET) )
+ if( w_class <= WEIGHT_CLASS_SMALL || (slot_flags & SLOT_POCKET) )
return 1
if(slot_r_store)
if(H.r_store)
return 0
if(!H.w_uniform)
if(!disable_warning)
- to_chat(H, "\red You need a jumpsuit before you can attach this [name].")
+ to_chat(H, "You need a jumpsuit before you can attach this [name]. ")
return 0
if(slot_flags & SLOT_DENYPOCKET)
return 0
- if( w_class <= 2 || (slot_flags & SLOT_POCKET) )
+ if( w_class <= WEIGHT_CLASS_SMALL || (slot_flags & SLOT_POCKET) )
return 1
return 0
if(slot_s_store)
if(!H.wear_suit)
if(!disable_warning)
- to_chat(H, "\red You need a suit before you can attach this [name].")
+ to_chat(H, "You need a suit before you can attach this [name]. ")
return 0
if(!H.wear_suit.allowed)
if(!disable_warning)
to_chat(usr, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
return 0
- if(src.w_class > 4)
+ if(src.w_class > WEIGHT_CLASS_BULKY)
if(!disable_warning)
to_chat(usr, "The [name] is too big to attach.")
return 0
@@ -751,7 +745,7 @@ var/list/slot_equipment_priority = list( \
if(client.holder && (client.holder.rights & R_ADMIN))
is_admin = 1
else if(stat != DEAD || istype(src, /mob/new_player))
- to_chat(usr, "\blue You must be observing to use this!")
+ to_chat(usr, "You must be observing to use this! ")
return
if(is_admin && stat == DEAD)
@@ -874,8 +868,8 @@ var/list/slot_equipment_priority = list( \
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.health <= config.health_threshold_softcrit)
- for(var/name in H.organs_by_name)
- var/obj/item/organ/external/e = H.organs_by_name[name]
+ for(var/name in H.bodyparts_by_name)
+ var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(e && H.lying)
if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
return 1
@@ -1014,9 +1008,10 @@ var/list/slot_equipment_priority = list( \
drop_l_hand()
drop_r_hand()
-/mob/proc/facedir(var/ndir)
- if(!canface()) return 0
- dir = ndir
+/mob/proc/facedir(ndir)
+ if(!canface())
+ return 0
+ setDir(ndir)
client.move_delay += movement_delay()
return 1
@@ -1060,7 +1055,7 @@ var/list/slot_equipment_priority = list( \
visible_implants += O
return visible_implants
-mob/proc/yank_out_object()
+/mob/proc/yank_out_object()
set category = "Object"
set name = "Yank out object"
set desc = "Remove an embedded item at the cost of bleeding and pain."
@@ -1097,8 +1092,10 @@ mob/proc/yank_out_object()
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
if(self)
+ visible_message("[usr] appears to be trying to extract an object from their body. ")
to_chat(src, "You attempt to get a good grip on [selection] in your body. ")
else
+ visible_message("[usr] attempts to get a good grip on [selection] in [S]'s body. ")
to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body. ")
if(!do_after(U, 80, target = S))
@@ -1119,7 +1116,7 @@ mob/proc/yank_out_object()
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/affected
- for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant.
+ for(var/obj/item/organ/external/organ in H.bodyparts) //Grab the organ holding the implant.
for(var/obj/item/weapon/O in organ.implants)
if(O == selection)
affected = organ
@@ -1222,9 +1219,11 @@ mob/proc/yank_out_object()
if(mind)
return mind.grab_ghost(force = force)
-/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
+/mob/proc/notify_ghost_cloning(message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", sound = 'sound/effects/genetics.ogg', atom/source = null, flashwindow = TRUE)
var/mob/dead/observer/ghost = get_ghost()
if(ghost)
+ if(flashwindow)
+ window_flash(ghost.client)
ghost.notify_cloning(message, sound, source)
return ghost
@@ -1263,7 +1262,7 @@ mob/proc/yank_out_object()
return // Only living mobs can ventcrawl
//You can buckle on mobs if you're next to them since most are dense
-/mob/buckle_mob(mob/living/M)
+/mob/buckle_mob(mob/living/M, force = 0)
if(M.buckled)
return 0
var/turf/T = get_turf(src)
@@ -1309,3 +1308,39 @@ mob/proc/yank_out_object()
if(F in target.faction)
return 1
return 0
+
+/mob/proc/create_attack_log(var/text, var/collapse = 1)//forgive me code gods for this shitcode proc
+ //this proc enables lovely stuff like an attack log that looks like this: "[18:20:29-18:20:45]21x John Smith attacked Andrew Jackson with a crowbar."
+ //That makes the logs easier to read, but because all of this is stored in strings, weird things have to be used to get it all out.
+ var/new_log = "\[[time_stamp()]] [text]"
+
+ if(length(attack_log) > 0)//if there are other logs already present
+ var/previous_log = attack_log[length(attack_log)]//get the latest log
+ var/last_log_is_range = (copytext(previous_log, 10, 11) == "-") //whether the last log is a time range or not. The "-" will be an indicator that it is.
+ var/x_sign_position = findtext(previous_log, "x")
+
+ if(world.timeofday - last_log > 100)//if more than 10 seconds from last log
+ collapse = 0//don't collapse anyway
+
+ //the following checks if the last log has the same contents as the new one
+ if(last_log_is_range)
+ if(!(copytext(previous_log, x_sign_position + 13) == text))//the 13 is there because of span classes; you won't see those normally in-game
+ collapse = 0
+ else
+ if(!(copytext(previous_log, 12) == text))
+ collapse = 0
+
+
+ if(collapse == 1)
+ var/rep = 0
+ var/old_timestamp = copytext(previous_log, 2, 10)//copy the first time value. This one doesn't move when it's a timespan, so no biggie
+ //An attack log entry can either be a time range with multiple occurences of an action or a single one, with just one time stamp
+ if(last_log_is_range)
+
+ rep = text2num(copytext(previous_log, 44, x_sign_position))//get whatever number is right before the 'x'
+
+ new_log = "\[[old_timestamp]-[time_stamp()]][rep?rep+1:2]x [text]"
+ attack_log -= attack_log[length(attack_log)]//remove the last log
+
+ attack_log += new_log
+ last_log = world.timeofday
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 1d6a7eb43fe..2988363ffb9 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -30,6 +30,7 @@
var/lastattacker = null
var/lastattacked = null
var/attack_log = list( )
+ var/last_log = 0
var/obj/machinery/machine = null
var/other_mobs = null
var/memory = ""
@@ -69,6 +70,7 @@
var/charges = 0.0
var/nutrition = NUTRITION_LEVEL_FED + 50 //Carbon
var/satiety = 0 //Carbon
+ var/hunger_drain = HUNGER_FACTOR // how quickly the mob gets hungry; largely utilized by species.
var/overeatduration = 0 // How long this guy is overeating //Carbon
var/intent = null//Living
@@ -194,3 +196,5 @@
var/list/permanent_huds = list()
var/list/actions = list()
+
+ var/list/progressbars = null //for stacking do_after bars
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index a22d9bf3c6b..fffd02adf0a 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -26,7 +26,7 @@
plane = HUD_PLANE
item_state = "nothing"
icon = 'icons/mob/screen_gen.dmi'
- w_class = 5
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/weapon/grab/New(var/mob/user, var/mob/victim)
@@ -194,7 +194,7 @@
animate(affecting, pixel_x = 0, pixel_y = 0, 5, 1, LINEAR_EASING)
return //KJK
/* if(force_down) //THIS GOES ABOVE THE RETURN LABELED KJK
- affecting.set_dir(SOUTH)*///This shows how you can apply special directions based on a variable. //face up
+ affecting.setDir(SOUTH)*///This shows how you can apply special directions based on a variable. //face up
var/shift = 0
var/adir = get_dir(assailant, affecting)
@@ -204,18 +204,18 @@
shift = 8
if(dancing) //look at partner
shift = 10
- assailant.set_dir(get_dir(assailant, affecting))
+ assailant.setDir(get_dir(assailant, affecting))
if(GRAB_AGGRESSIVE)
shift = 12
if(GRAB_NECK, GRAB_UPGRADING)
shift = -10
adir = assailant.dir
- affecting.set_dir(assailant.dir)
+ affecting.setDir(assailant.dir)
affecting.loc = assailant.loc
if(GRAB_KILL)
shift = 0
adir = 1
- affecting.set_dir(SOUTH)//face up
+ affecting.setDir(SOUTH)//face up
affecting.loc = assailant.loc
switch(adir)
@@ -254,8 +254,8 @@
force_down = 1
affecting.Weaken(3)
step_to(assailant, affecting)
- assailant.set_dir(EAST) //face the victim
- affecting.set_dir(SOUTH) //face up //This is an example of a new feature based on the context of the location of the victim.
+ assailant.setDir(EAST) //face the victim
+ affecting.setDir(SOUTH) //face up //This is an example of a new feature based on the context of the location of the victim.
*/ //It means that upgrading while someone is lying on the ground would cause you to go into pin mode.
state = GRAB_AGGRESSIVE
icon_state = "grabbed1"
@@ -268,9 +268,9 @@
assailant.visible_message("[assailant] has reinforced \his grip on [affecting] (now neck)! ")
state = GRAB_NECK
icon_state = "grabbed+1"
- assailant.set_dir(get_dir(assailant, affecting))
- affecting.attack_log += "\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey]) "
- assailant.attack_log += "\[[time_stamp()]\] Grabbed the neck of [affecting.name] ([affecting.ckey]) "
+ assailant.setDir(get_dir(assailant, affecting))
+ affecting.create_attack_log("Has had their neck grabbed by [assailant.name] ([assailant.ckey]) ")
+ assailant.create_attack_log("Grabbed the neck of [affecting.name] ([affecting.ckey]) ")
log_attack("[assailant.name] ([assailant.ckey]) grabbed the neck of [affecting.name] ([affecting.ckey]) ")
if(!iscarbon(assailant))
affecting.LAssailant = null
@@ -285,13 +285,13 @@
state = GRAB_KILL
assailant.visible_message("[assailant] has tightened \his grip on [affecting]'s neck! ")
- affecting.attack_log += "\[[time_stamp()]\] Has been strangled (kill intent) by [assailant.name] ([assailant.ckey]) "
- assailant.attack_log += "\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey]) "
+ affecting.create_attack_log("Has been strangled (kill intent) by [assailant.name] ([assailant.ckey]) ")
+ assailant.create_attack_log("Strangled (kill intent) [affecting.name] ([affecting.ckey]) ")
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
assailant.next_move = world.time + 10
affecting.AdjustLoseBreath(1)
- affecting.set_dir(WEST)
+ affecting.setDir(WEST)
adjust_position()
//This is used to make sure the victim hasn't managed to yackety sax away before using the grab.
@@ -338,8 +338,8 @@
damage += hat.force * 3
affecting.apply_damage(damage*rand(90, 110)/100, BRUTE, "head", affected.run_armor_check(affecting, "melee"))
playsound(assailant.loc, "swing_hit", 25, 1, -1)
- assailant.attack_log += text("\[[time_stamp()]\] Headbutted [affecting.name] ([affecting.ckey]) ")
- affecting.attack_log += text("\[[time_stamp()]\] Headbutted by [assailant.name] ([assailant.ckey]) ")
+ assailant.create_attack_log("Headbutted [affecting.name] ([affecting.ckey]) ")
+ affecting.create_attack_log("Headbutted by [assailant.name] ([assailant.ckey]) ")
msg_admin_attack("[key_name(assailant)] has headbutted [key_name(affecting)]")
return
@@ -347,24 +347,24 @@
if(state < GRAB_NECK)
to_chat(assailant, "You require a better grab to do this. ")
return
- if((affected.head && affected.head.flags & HEADCOVERSEYES) || \
- (affected.wear_mask && affected.wear_mask.flags & MASKCOVERSEYES) || \
- (affected.glasses && affected.glasses.flags & GLASSESCOVERSEYES))
+ if((affected.head && affected.head.flags_cover & HEADCOVERSEYES) || \
+ (affected.wear_mask && affected.wear_mask.flags_cover & MASKCOVERSEYES) || \
+ (affected.glasses && affected.glasses.flags_cover & GLASSESCOVERSEYES))
to_chat(assailant, "You're going to need to remove the eye covering first. ")
return
- if(!affected.internal_organs_by_name["eyes"])
+ if(!affected.internal_bodyparts_by_name["eyes"])
to_chat(assailant, "You cannot locate any eyes on [affecting]! ")
return
assailant.visible_message("[assailant] presses \his fingers into [affecting]'s eyes! ")
to_chat(affecting, "You feel immense pain as digits are being pressed into your eyes! ")
- assailant.attack_log += text("\[[time_stamp()]\] Pressed fingers into the eyes of [affecting.name] ([affecting.ckey]) ")
- affecting.attack_log += text("\[[time_stamp()]\] Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey]) ")
+ assailant.create_attack_log("Pressed fingers into the eyes of [affecting.name] ([affecting.ckey]) ")
+ affecting.create_attack_log("Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey]) ")
msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.")
var/obj/item/organ/internal/eyes/eyes = affected.get_int_organ(/obj/item/organ/internal/eyes)
eyes.damage += rand(3,4)
if(eyes.damage >= eyes.min_broken_damage)
if(M.stat != 2)
- to_chat(M, "\red You go blind!")*///This is a demonstration of adding a new damaging type based on intent as well as hitzone.
+ to_chat(M, "You go blind! ")*///This is a demonstration of adding a new damaging type based on intent as well as hitzone.
//This specific example would allow you to squish people's eyes with a GRAB_NECK.
@@ -378,8 +378,8 @@
affecting.Weaken(3)
affecting.lying = 1
step_to(assailant, affecting)
- assailant.set_dir(EAST) //face the victim
- affecting.set_dir(SOUTH) //face up
+ assailant.setDir(EAST) //face the victim
+ affecting.setDir(SOUTH) //face up
return
else
to_chat(assailant, "You are already pinning [affecting] to the ground. ")
@@ -396,8 +396,8 @@
user.visible_message("[user] devours \the [affecting]! ")
if(affecting.mind)
- affecting.attack_log += "\[[time_stamp()]\] Has been devoured by [attacker.name] ([attacker.ckey]) "
- attacker.attack_log += "\[[time_stamp()]\] Devoured [affecting.name] ([affecting.ckey]) "
+ affecting.create_attack_log("Has been devoured by [attacker.name] ([attacker.ckey]) ")
+ attacker.create_attack_log("Devoured [affecting.name] ([affecting.ckey]) ")
msg_admin_attack("[key_name(attacker)] devoured [key_name(affecting)]")
affecting.loc = user
@@ -444,8 +444,7 @@
if(assailant.client)
assailant.client.screen -= hud
assailant = null
- qdel(hud)
- hud = null
+ QDEL_NULL(hud)
return ..()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 0b04647d094..6c443b4aa30 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -17,13 +17,32 @@
/mob/living/carbon/human/isSynthetic()
// If they are 100% robotic, they count as synthetic.
- for(var/obj/item/organ/external/E in organs)
+ for(var/obj/item/organ/external/E in bodyparts)
if(!(E.status & ORGAN_ROBOT))
return 0
return 1
-/proc/isloyal(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
- for(var/obj/item/weapon/implant/loyalty/L in A)
+/mob/proc/get_screen_colour()
+
+/mob/proc/update_client_colour(var/time = 10) //Update the mob's client.color with an animation the specified time in length.
+ if(!client) //No client_colour without client. If the player logs back in they'll be back through here anyway.
+ return
+ client.colour_transition(get_screen_colour(), time = time) //Get the colour matrix we're going to transition to depending on relevance (magic glasses first, eyes second).
+
+/mob/living/carbon/human/get_screen_colour() //Fetch the colour matrix from wherever (e.g. eyes) so it can be compared to client.color.
+ . = ..()
+ if(.)
+ return .
+
+ var/obj/item/clothing/glasses/worn_glasses = glasses
+ var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
+ if(istype(worn_glasses) && worn_glasses.color_view) //Check to see if they got those magic glasses and they're augmenting the colour of what the wearer sees. If they're not, color_view should be null.
+ return worn_glasses.color_view
+ else if(eyes) //If they're not, check to see if their eyes got one of them there colour matrices. Will be null if eyes are robotic/the mob isn't colourblind and they have no default colour matrix.
+ return eyes.get_colourmatrix()
+
+/proc/ismindshielded(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
+ for(var/obj/item/weapon/implant/mindshield/L in A)
if(L && L.implanted)
return 1
return 0
@@ -291,10 +310,10 @@ proc/muffledspeech(phrase)
/mob/proc/abiotic(var/full_body = 0)
- if(full_body && ((src.l_hand && !(src.l_hand.flags & ABSTRACT)) || (src.r_hand && !(src.r_hand.flags & ABSTRACT)) || (src.back || src.wear_mask)))
+ if(full_body && ((l_hand && !(l_hand.flags & ABSTRACT)) || (r_hand && !(r_hand.flags & ABSTRACT)) || (back || wear_mask)))
return 1
- if((src.l_hand && !(src.l_hand.flags & ABSTRACT)) || (src.r_hand && !(src.r_hand.flags & ABSTRACT)))
+ if((l_hand && !(l_hand.flags & ABSTRACT)) || (r_hand && !(r_hand.flags & ABSTRACT)))
return 1
return 0
@@ -361,9 +380,16 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
set name = "Rest"
set category = "IC"
- resting = !resting
- update_canmove()
- to_chat(src, "You are now [resting ? "resting" : "getting up"]. ")
+ if(world.time < client.move_delay)
+ return
+
+ if(!resting)
+ client.move_delay = world.time + 20
+ to_chat(src, "You are now resting. ")
+ StartResting()
+ else if(resting)
+ to_chat(src, "You are now getting up. ")
+ StopResting()
/proc/is_blind(A)
if(iscarbon(A))
@@ -423,9 +449,9 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
if(istype(subject, /mob/dead/observer))
DM = subject
if(check_rights(R_ADMIN|R_MOD,0,M)) // What admins see
- lname = "[keyname][(DM && DM.anonsay) ? "*" : (DM ? "" : "^")] ([name])"
+ lname = "[keyname][(DM && DM.client && DM.client.prefs.ghost_anonsay) ? "*" : (DM ? "" : "^")] ([name])"
else
- if(DM && DM.anonsay) // If the person is actually observer they have the option to be anonymous
+ if(DM && DM.client && DM.client.prefs.ghost_anonsay) // If the person is actually observer they have the option to be anonymous
lname = "Ghost of [name]"
else if(DM) // Non-anons
lname = "[keyname] ([name])"
@@ -434,20 +460,24 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
lname = "[lname] "
to_chat(M, "[lname][follow][message] ")
-/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/image/alert_overlay = null, var/attack_not_jump = 0) //Easy notification of ghosts.
+/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, title = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
for(var/mob/dead/observer/O in player_list)
if(O.client)
to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]")
if(ghost_sound)
O << sound(ghost_sound)
+ if(flashwindow)
+ window_flash(O.client)
if(source)
- var/obj/screen/alert/notify_jump/A = O.throw_alert("\ref[source]_notify_jump", /obj/screen/alert/notify_jump)
+ var/obj/screen/alert/notify_action/A = O.throw_alert("\ref[source]_notify_action", /obj/screen/alert/notify_action)
if(A)
if(O.client.prefs && O.client.prefs.UI_style)
A.icon = ui_style2icon(O.client.prefs.UI_style)
+ if(title)
+ A.name = title
A.desc = message
- A.attack_not_jump = attack_not_jump
- A.jump_target = source
+ A.action = action
+ A.target = source
if(!alert_overlay)
var/old_layer = source.layer
var/old_plane = source.plane
@@ -586,8 +616,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
if(5)
newletter="glor"
newphrase+="[newletter]";counter-=1
- return newphrase
-
+ return newphrase
+
/mob/proc/get_preference(toggleflag)
if(!client)
return FALSE
@@ -596,3 +626,6 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
return FALSE
// Cast to 1/0
return !!(client.prefs.toggles & toggleflag)
+
+
+#define isterrorspider(A) (istype((A), /mob/living/simple_animal/hostile/poison/terror_spider))
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 74c9528071c..03ba9618bd4 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -15,21 +15,27 @@
return 1
return (!mover.density || !density || lying)
+//The byond version of these verbs wait for the next tick before acting.
+// instant verbs however can run mid tick or even during the time between ticks.
+/client/verb/moveup()
+ set name = ".moveup"
+ set instant = 1
+ Move(get_step(mob, NORTH), NORTH)
-/client/North()
- ..()
+/client/verb/movedown()
+ set name = ".movedown"
+ set instant = 1
+ Move(get_step(mob, SOUTH), SOUTH)
+/client/verb/moveright()
+ set name = ".moveright"
+ set instant = 1
+ Move(get_step(mob, EAST), EAST)
-/client/South()
- ..()
-
-
-/client/West()
- ..()
-
-
-/client/East()
- ..()
+/client/verb/moveleft()
+ set name = ".moveleft"
+ set instant = 1
+ Move(get_step(mob, WEST), WEST)
/client/Northeast()
@@ -50,12 +56,12 @@
var/mob/living/silicon/robot/R = usr
var/module = R.get_selected_module()
if(!module)
- to_chat(usr, "\red You have no module selected.")
+ to_chat(usr, "You have no module selected. ")
return
R.cycle_modules()
R.uneq_numbered(module)
else
- to_chat(usr, "\red This mob type cannot throw items.")
+ to_chat(usr, "This mob type cannot throw items. ")
return
@@ -63,17 +69,17 @@
if(iscarbon(usr))
var/mob/living/carbon/C = usr
if(!C.get_active_hand())
- to_chat(usr, "\red You have nothing to drop in your hand.")
+ to_chat(usr, "You have nothing to drop in your hand. ")
return
drop_item()
else if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
if(!R.get_selected_module())
- to_chat(usr, "\red You have no module selected.")
+ to_chat(usr, "You have no module selected. ")
return
R.deselect_module(R.get_selected_module())
else
- to_chat(usr, "\red This mob type cannot drop items.")
+ to_chat(usr, "This mob type cannot drop items. ")
return
//This gets called when you press the delete button.
@@ -81,7 +87,7 @@
set hidden = 1
if(!usr.pulling)
- to_chat(usr, "\blue You are not pulling anything.")
+ to_chat(usr, "You are not pulling anything. ")
return
usr.stop_pulling()
@@ -105,12 +111,11 @@
/client/verb/toggle_throw_mode()
set hidden = 1
- if(!istype(mob, /mob/living/carbon))
- return
- if(!mob.stat && isturf(mob.loc) && !mob.restrained())
- mob:toggle_throw_mode()
+ if(iscarbon(mob))
+ var/mob/living/carbon/C = mob
+ C.toggle_throw_mode()
else
- return
+ to_chat(usr, "This mob type cannot throw items. ")
/client/verb/drop_item()
@@ -134,16 +139,16 @@
/client/proc/Move_object(direct)
if(mob && mob.control_object)
if(mob.control_object.density)
- step(mob.control_object,direct)
- if(!mob.control_object) return
- mob.control_object.dir = direct
+ step(mob.control_object, direct)
+ if(!mob.control_object)
+ return
+ mob.control_object.setDir(direct)
else
- mob.control_object.forceMove(get_step(mob.control_object,direct))
+ mob.control_object.forceMove(get_step(mob.control_object, direct))
return
/client/Move(n, direct)
-
if(viewingCanvas)
view = world.view //Reset the view
winset(src, "mapwindow.map", "icon-size=[src.reset_stretch]")
@@ -152,19 +157,28 @@
if(mob.hud_used)
mob.hud_used.show_hud(HUD_STYLE_STANDARD)
- if(mob.control_object) Move_object(direct)
+ if(world.time < move_delay)
+ return
- if(world.time < move_delay) return
+ move_delay = world.time + world.tick_lag //this is here because Move() can now be called multiple times per tick
+ if(!mob || !mob.loc)
+ return 0
- if(!isliving(mob)) return mob.Move(n,direct)
+ if(mob.notransform)
+ return 0 //This is sota the goto stop mobs from moving var
- if(moving) return 0
+ if(mob.control_object)
+ return Move_object(direct)
- if(!mob) return
+ if(!isliving(mob))
+ return mob.Move(n, direct)
- if(mob.stat==DEAD) return
+ if(mob.stat == DEAD)
+ mob.ghostize()
+ return 0
- if(mob.notransform) return//This is sota the goto stop mobs from moving var
+ if(moving)
+ return 0
if(isliving(mob))
var/mob/living/L = mob
@@ -172,122 +186,105 @@
Process_Incorpmove(direct)
return
- if(Process_Grab()) return
-
- if(mob.buckled) //if we're buckled to something, tell it we moved.
- return mob.buckled.relaymove(mob, direct)
-
- if(mob.remote_control) //we're controlling something, our movement is relayed to it
+ if(mob.remote_control) //we're controlling something, our movement is relayed to it
return mob.remote_control.relaymove(mob, direct)
if(isAI(mob))
if(istype(mob.loc, /obj/item/device/aicard))
var/obj/O = mob.loc
- return O.relaymove(mob, direct) //aicards have special relaymove stuff
- return AIMove(n,direct,mob)
+ return O.relaymove(mob, direct) // aicards have special relaymove stuff
+ return AIMove(n, direct, mob)
+
+
+ if(Process_Grab())
+ return
+
+ if(mob.buckled) //if we're buckled to something, tell it we moved.
+ return mob.buckled.relaymove(mob, direct)
if(!mob.canmove)
return
- //if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
- // if(!mob.Process_Spacemove(0)) return 0
-
if(!mob.lastarea)
mob.lastarea = get_area(mob.loc)
- if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved
+ if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
var/atom/O = mob.loc
return O.relaymove(mob, direct)
-
+
if(!mob.Process_Spacemove(direct))
- return 0
+ return 0
- if(isturf(mob.loc))
-
- if(mob.restrained())//Why being pulled while cuffed prevents you from moving
- for(var/mob/M in range(mob, 1))
- if(M.pulling == mob)
- if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M))
- to_chat(src, "\blue You're restrained! You can't move!")
- return 0
- else
- M.stop_pulling()
-
- if(mob.pinned.len)
- to_chat(src, "\blue You're pinned to a wall by [mob.pinned[1]]!")
- return 0
-
- var/turf/T = mob.loc
- move_delay = world.time//set move delay
- move_delay += T.slowdown
- mob.last_movement = world.time
- switch(mob.m_intent)
- if("run")
- if(mob.drowsyness > 0)
- move_delay += 6
- move_delay += 1+config.run_speed
- if("walk")
- move_delay += 1+config.walk_speed
- move_delay += mob.movement_delay()
-
- if(config.Tickcomp)
- move_delay -= 1.3
- var/tickcomp = ((1/(world.tick_lag))*1.3)
- move_delay = move_delay + tickcomp
-
- //We are now going to move
- moving = 1
- //Something with pulling things
- if(locate(/obj/item/weapon/grab, mob))
- move_delay = max(move_delay, world.time + 7)
- var/list/L = mob.ret_grab()
- if(istype(L, /list))
- if(L.len == 2)
- L -= mob
- var/mob/M = L[1]
- if(M)
- if((get_dist(mob, M) <= 1 || M.loc == mob.loc))
- . = ..()
- if(isturf(M.loc))
- var/diag = get_dir(mob, M)
- if((diag - 1) & diag)
- else
- diag = null
- if((get_dist(mob, M) > 1 || diag))
- step(M, get_dir(M.loc, T))
+ if(mob.restrained()) // Why being pulled while cuffed prevents you from moving
+ for(var/mob/M in orange(1, mob))
+ if(M.pulling == mob)
+ if(!M.incapacitated() && mob.Adjacent(M))
+ to_chat(src, "You're restrained! You can't move! ")
+ move_delay = world.time + 10
+ return 0
else
- for(var/mob/M in L)
- M.other_mobs = 1
- if(mob != M)
- M.animate_movement = 3
- for(var/mob/M in L)
- spawn( 0 )
- step(M, direct)
- return
- spawn( 1 )
- M.other_mobs = null
- M.animate_movement = 2
- return
+ M.stop_pulling()
- else if(mob.confused)
- step(mob, pick(cardinal))
- else
- . = ..()
- for(var/obj/item/weapon/grab/G in mob)
- if(G.state == GRAB_NECK)
- mob.set_dir(reverse_dir[direct])
- G.adjust_position()
- for(var/obj/item/weapon/grab/G in mob.grabbed_by)
- G.adjust_position()
+ //We are now going to move
+ moving = 1
+ move_delay = mob.movement_delay() + world.time
+ mob.last_movement = world.time
+
+ if(locate(/obj/item/weapon/grab, mob))
+ move_delay = max(move_delay, world.time + 7)
+ var/list/L = mob.ret_grab()
+ if(istype(L, /list))
+ if(L.len == 2)
+ L -= mob
+ var/mob/M = L[1]
+ if(M)
+ if((get_dist(mob, M) <= 1 || M.loc == mob.loc))
+ var/turf/prev_loc = mob.loc
+ . = ..()
+ if(M && isturf(M.loc)) // Mob may get deleted during parent call
+ var/diag = get_dir(mob, M)
+ if((diag - 1) & diag)
+ else
+ diag = null
+ if((get_dist(mob, M) > 1 || diag))
+ step(M, get_dir(M.loc, prev_loc))
+ else
+ for(var/mob/M in L)
+ M.other_mobs = 1
+ if(mob != M)
+ M.animate_movement = 3
+ for(var/mob/M in L)
+ spawn(0)
+ step(M, direct)
+ return
+ spawn(1)
+ M.other_mobs = null
+ M.animate_movement = 2
+ return
+
+ else if(mob.confused)
+ step(mob, pick(cardinal))
+ else
+ . = ..()
+
+ for(var/obj/item/weapon/grab/G in mob)
+ if(G.state == GRAB_NECK)
+ mob.setDir(reverse_dir[direct])
+ G.adjust_position()
+ for(var/obj/item/weapon/grab/G in mob.grabbed_by)
+ G.adjust_position()
+
+ moving = 0
+ if(mob && .)
+ if(mob.throwing)
+ mob.throwing.finalize(FALSE)
+
+ for(var/obj/O in mob)
+ O.on_mob_move(direct, mob)
- moving = 0
- if(mob && .)
- mob.throwing = 0
- return .
- return
///Process_Grab()
@@ -404,13 +401,13 @@
var/atom/movable/backup = get_spacemove_backup()
if(backup)
if(istype(backup) && movement_dir && !backup.anchored)
- if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
- src << "You push off of [backup] to propel yourself. "
+ var/opposite_dir = turn(movement_dir, 180)
+ if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves
+ to_chat(src, "You push off of [backup] to propel yourself. ")
return 1
return 0
/mob/get_spacemove_backup()
- var/atom/movable/dense_object_backup
for(var/A in orange(1, get_turf(src)))
if(isarea(A))
continue
@@ -430,9 +427,7 @@
return AM
if(pulling == AM)
continue
- dense_object_backup = AM
- break
- . = dense_object_backup
+ . = AM
/mob/proc/mob_has_gravity(turf/T)
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index 856879acf38..a94be6a54c1 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -5,7 +5,7 @@
/mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/forcekey = 0)
if(istype(src,/mob/new_player))
- to_chat(usr, "\red cannot convert players who have not entered yet.")
+ to_chat(usr, "cannot convert players who have not entered yet. ")
return
if(!new_type)
@@ -19,7 +19,7 @@
return
if( new_type == /mob/new_player )
- to_chat(usr, "\red cannot convert into a new_player mob type.")
+ to_chat(usr, "cannot convert into a new_player mob type. ")
return
var/mob/M
diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm
index c226f3a0176..bbecb8e6458 100644
--- a/code/modules/mob/new_player/login.dm
+++ b/code/modules/mob/new_player/login.dm
@@ -30,6 +30,23 @@
callHook("mob_login", list("client" = client, "mob" = src))
new_player_panel()
+
+ spawn(30)
+ // Annoy the player with polls.
+ establish_db_connection()
+ if(dbcon.IsConnected() && client.can_vote())
+ var/isadmin = 0
+ if(client && client.holder)
+ isadmin = 1
+ var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")")
+ query.Execute()
+ var/newpoll = 0
+ while(query.NextRow())
+ newpoll = 1
+ break
+ if(newpoll)
+ client.handle_player_polling()
+
if(ckey in deadmins)
verbs += /client/proc/readmin
spawn(40)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 20640edce66..58c5ee4104d 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -25,6 +25,8 @@
/mob/new_player/proc/new_player_panel_proc()
var/real_name = client.prefs.real_name
+ if(client.prefs.randomslot)
+ real_name = "Random Character Slot"
var/output = "Setup Character [real_name]
"
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
@@ -40,7 +42,7 @@
if(!IsGuestKey(src.key))
establish_db_connection()
- if(dbcon.IsConnected())
+ if(dbcon.IsConnected() && client.can_vote())
var/isadmin = 0
if(src.client && src.client.holder)
isadmin = 1
@@ -52,9 +54,9 @@
break
if(newpoll)
- output += "Show Player Polls (NEW!)
"
+ output += "Show Player Polls (NEW!)
"
else
- output += "Show Player Polls
"
+ output += "Show Player Polls
"
output += " "
@@ -129,7 +131,7 @@
observer.started_as_observer = 1
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")
- to_chat(src, "\blue Now teleporting.")
+ to_chat(src, "Now teleporting. ")
observer.loc = O.loc
observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly.
client.prefs.update_preview_icon(1)
@@ -149,7 +151,7 @@
if(href_list["late_join"])
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
- to_chat(usr, "\red The round is either not ready, or has already finished...")
+ to_chat(usr, "The round is either not ready, or has already finished... ")
return
if(client.prefs.species in whitelisted_species)
@@ -166,9 +168,12 @@
if(href_list["SelectedJob"])
if(!enter_allowed)
- to_chat(usr, "\blue There is an administrative lock on entering the game!")
+ to_chat(usr, "There is an administrative lock on entering the game! ")
return
+ if(client.prefs.randomslot)
+ client.prefs.load_random_character_slot(client)
+
if(client.prefs.species in whitelisted_species)
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
to_chat(src, alert("You are currently not whitelisted to play [client.prefs.species]."))
@@ -183,61 +188,6 @@
else if(!href_list["late_join"])
new_player_panel()
- if(href_list["showpoll"])
-
- handle_player_polling()
- return
-
- if(href_list["pollid"])
-
- var/pollid = href_list["pollid"]
- if(istext(pollid))
- pollid = text2num(pollid)
- if(isnum(pollid))
- src.poll_player(pollid)
- return
-
- if(href_list["votepollid"] && href_list["votetype"])
- var/pollid = text2num(href_list["votepollid"])
- var/votetype = href_list["votetype"]
- switch(votetype)
- if("OPTION")
- var/optionid = text2num(href_list["voteoptionid"])
- vote_on_poll(pollid, optionid)
- if("TEXT")
- var/replytext = href_list["replytext"]
- log_text_poll_reply(pollid, replytext)
- if("NUMVAL")
- var/id_min = text2num(href_list["minid"])
- var/id_max = text2num(href_list["maxid"])
-
- if( (id_max - id_min) > 100 ) //Basic exploit prevention
- to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.")
- return
-
- for(var/optionid = id_min; optionid <= id_max; optionid++)
- if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to
- var/rating
- if(href_list["o[optionid]"] == "abstain")
- rating = null
- else
- rating = text2num(href_list["o[optionid]"])
- if(!isnum(rating))
- return
-
- vote_on_numval_poll(pollid, optionid, rating)
- if("MULTICHOICE")
- var/id_min = text2num(href_list["minoptionid"])
- var/id_max = text2num(href_list["maxoptionid"])
-
- if( (id_max - id_min) > 100 ) //Basic exploit prevention
- to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.")
- return
-
- for(var/optionid = id_min; optionid <= id_max; optionid++)
- if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected
- vote_on_poll(pollid, optionid, 1)
-
/mob/new_player/proc/IsJobAvailable(rank)
var/datum/job/job = job_master.GetJob(rank)
if(!job) return 0
@@ -280,10 +230,10 @@
if(src != usr)
return 0
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
- to_chat(usr, "\red The round is either not ready, or has already finished...")
+ to_chat(usr, "The round is either not ready, or has already finished... ")
return 0
if(!enter_allowed)
- to_chat(usr, "\blue There is an administrative lock on entering the game!")
+ to_chat(usr, "There is an administrative lock on entering the game! ")
return 0
if(!IsJobAvailable(rank))
to_chat(src, alert("[rank] is not available. Please try another."))
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index f85a8c9ded1..ecd690c871d 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -2,45 +2,208 @@
var/optionid
var/optiontext
-/mob/new_player/proc/handle_player_polling()
+/client/verb/polls_verb()
+ set name = "Show Player Polls"
+ set category = "OOC"
+ handle_player_polling()
+
+/client/proc/can_vote()
+ return istext(player_age) || player_age >= 30
+
+/client/proc/handle_player_polling()
establish_db_connection()
if(dbcon.IsConnected())
var/isadmin = 0
- if(src.client && src.client.holder)
+ if(holder)
isadmin = 1
- var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question, (id IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = '[ckey]') OR id IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = '[ckey]')) AS voted FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/output = "Player polls "
+ if(check_rights(R_SERVER))
+ output += "(
Create new poll )"
output +="
"
- var/pollid
- var/pollquestion
-
output += "
"
var/color1 = "#ececec"
var/color2 = "#e2e2e2"
var/i = 0
-
+
+ output += "Active Polls "
while(select_query.NextRow())
- pollid = select_query.item[1]
- pollquestion = select_query.item[2]
- output += "[pollquestion] "
+ var/pollid = select_query.item[1]
+ var/pollquestion = select_query.item[2]
+ var/voted = text2num(select_query.item[3])
+ output += "[pollquestion] "
+ if(can_vote() && !voted)
+ output += "[poll_player(pollid, 1)] "
i++
+
+ // Show expired polls. Non admins can view admin polls at this stage
+ // (just like tgstation's web interface so don't complain)
+ // (Also why was there no ingame interface tg not having an ingame
+ // interface is retarded because it cucks downstreams)
+ select_query = dbcon.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE Now() > endtime ORDER BY id DESC")
+ select_query.Execute()
+
+ output += "Expired Polls "
+ while(select_query.NextRow())
+ var/pollid = select_query.item[1]
+ var/pollquestion = select_query.item[2]
+ output += "[pollquestion] "
output += "
"
src << browse(output,"window=playerpolllist;size=500x300")
+/client/proc/poll_results(var/pollid = -1)
+ if(pollid == -1)
+ return
+ establish_db_connection()
+ if(!dbcon.IsConnected())
+ return
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT polltype, question, adminonly, multiplechoiceoptions, starttime, endtime FROM [format_table_name("poll_question")] WHERE id = [pollid] AND endtime < Now()")
+ select_query.Execute()
+ var/question = ""
+ var/polltype = ""
+ var/adminonly = 0
+ var/multiplechoiceoptions = 0
+ var/starttime = ""
+ var/endtime = ""
+ var/found = 0
+ while(select_query.NextRow())
+ polltype = select_query.item[1]
+ question = select_query.item[2]
+ adminonly = text2num(select_query.item[3])
+ multiplechoiceoptions = text2num(select_query.item[4])
+ starttime = select_query.item[5]
+ endtime = select_query.item[6]
+ found = 1
+ break
+ if(!found)
+ to_chat(src, "
Poll question details not found. (Maybe the poll isn't expired yet?) ")
+ return
+
+ if(polltype == POLLTYPE_MULTI)
+ question += " (Choose up to [multiplechoiceoptions] options)"
+ if(adminonly)
+ question = "(
Admin only poll ) " + question
+
+ var output = ""
+ if(polltype == POLLTYPE_MULTI || polltype == POLLTYPE_OPTION)
+ select_query = dbcon.NewQuery("SELECT text, percentagecalc, (SELECT COUNT(optionid) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id GROUP BY optionid) AS votecount FROM [format_table_name("poll_option")] WHERE pollid = [pollid]");
+ select_query.Execute()
+ var/list/options = list()
+ var/total_votes = 1
+ var/total_percent_votes = 1
+ var/max_votes = 1
+ while(select_query.NextRow())
+ var/text = select_query.item[1]
+ var/percentagecalc = select_query.item[2]
+ var/votecount = text2num(select_query.item[3])
+ if(percentagecalc)
+ total_percent_votes += votecount
+ total_votes += votecount
+ if(votecount > max_votes)
+ max_votes = votecount
+ options[++options.len] = list(text, percentagecalc, votecount)
+ // fuck ie.
+ output += {"
+
+
+ [question][starttime] - [endtime]
+
+
+ "}
+ var/list/colors = list("#66c2a5", "#fc8d62", "#8da0cb", "#e78ac3", "#a6d854", "#ffd92f", "#e5c494", "#b3b3b3")
+ var/color_index = 0
+ for(var/list/option in options)
+ var/bar_width = option[3] * 700 / total_votes
+ var/percentage = option[2] ? "[round(option[3] * 100 / total_percent_votes)]%" : "N/A"
+ color_index++
+ if(color_index > colors.len)
+ color_index = 1
+ output += "
"
+ output += "
(Hover over the colored bar to read description) "
+ for(var/list/option in options)
+ var/bar_width = option[3] * 390 / max_votes
+ var/percentage = option[2] ? "[round(option[3] * 100 / total_percent_votes)]%" : "N/A"
+ output += "[option[1]] "
+ output += "[option[3]] "
+ output += "[percentage] "
+ output += "
"
+ output += "
"
+ if(polltype == POLLTYPE_RATING)
+ output += {"
+
+
+ [question][starttime] - [endtime]
+ "}
+ select_query = dbcon.NewQuery("SELECT id, text, (SELECT AVG(rating) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id AND rating != 'abstain') AS avgrating, (SELECT COUNT(rating) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id AND rating != 'abstain') AS countvotes, minval, maxval FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
+ select_query.Execute()
+ while(select_query.NextRow())
+ output += {"
+
+ [select_query.item[2]]
+ N = [select_query.item[4]]
+ AVG = [select_query.item[3]]
+ "}
+ var/optionid = select_query.item[1]
+ var/totalvotes = text2num(select_query.item[4])
+ var/minval = text2num(select_query.item[5])
+ var/maxval = text2num(select_query.item[6])
+ var/maxvote = 1
+ var/list/votecounts = list()
+ for(var/I in minval to maxval)
+ var/DBQuery/rating_query = dbcon.NewQuery("SELECT COUNT(rating) AS countrating FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND rating = [I] GROUP BY rating")
+ rating_query.Execute()
+ var/votecount = 0
+ while(rating_query.NextRow())
+ votecount = text2num(rating_query.item[1])
+ votecounts["[I]"] = votecount
+ if(votecount > maxvote)
+ maxvote = votecount
+ for(var/I in minval to maxval)
+ var/votecount = votecounts["[I]"]
+ var/bar_width = votecount * 200 / maxvote
+ output += {"
+
+ [I]
+ [votecount]
+ ([votecount / totalvotes]%)
+
+ "}
+ output += "
"
+ output += "
"
+ if(polltype == POLLTYPE_TEXT)
+ select_query = dbcon.NewQuery("SELECT replytext, COUNT(replytext) AS countresponse, GROUP_CONCAT(DISTINCT ckey SEPARATOR ', ') as ckeys FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] GROUP BY replytext ORDER BY countresponse DESC");
+ select_query.Execute()
+ output += {"
+
+
+ [question][starttime] - [endtime]
+ "}
+ while(select_query.NextRow())
+ var/replytext = select_query.item[1]
+ var/countresponse = select_query.item[2]
+ var/ckeys = select_query.item[3]
+ output += {"
+
+ [ckeys] ([countresponse] player\s) responded with:
+ [replytext]
+ "}
+ output += "
"
+ output += ""
+
+ src << browse(output,"window=pollresults;size=950x500")
-
-/mob/new_player/proc/poll_player(var/pollid = -1)
+/client/proc/poll_player(var/pollid = -1, var/inline = 0)
if(pollid == -1) return
establish_db_connection()
if(dbcon.IsConnected())
- var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]")
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime [holder ? "AND adminonly = 0" : ""]")
select_query.Execute()
var/pollstarttime = ""
@@ -49,6 +212,7 @@
var/polltype = ""
var/found = 0
var/multiplechoiceoptions = 0
+ var/canvote = can_vote()
while(select_query.NextRow())
pollstarttime = select_query.item[1]
@@ -59,16 +223,16 @@
break
if(!found)
- to_chat(usr, "\red Poll question details not found.")
+ to_chat(usr, "
Poll question details not found. (Maybe you do not have access?) ")
return
switch(polltype)
//Polls that have enumerated options
if(POLLTYPE_OPTION)
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
voted_query.Execute()
- var/voted = 0
+ var/voted = 0 // If the can't vote then consider them voted
var/votedoptionid = 0
while(voted_query.NextRow())
votedoptionid = text2num(voted_query.item[1])
@@ -84,22 +248,23 @@
PO.optionid = text2num(options_query.item[1])
PO.optiontext = options_query.item[2]
options += PO
-
- var/output = "
Player poll "
- output +="
"
+
+ var/output
+ if(!inline)
+ output += "
Player poll "
+ output +="
"
output += "
Question: [pollquestion] "
output += "
Poll runs from [pollstarttime] until [pollendtime] "
-
- if(!voted) //Only make this a form if we have not voted yet
- output += "
"
output += "
"
-
- src << browse(output,"window=playerpoll;size=500x250")
+
+ if(inline)
+ return output
+ else
+ src << browse(output,"window=playerpoll;size=500x250")
//Polls with a text input
if(POLLTYPE_TEXT)
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
voted_query.Execute()
var/voted = 0
@@ -128,15 +296,16 @@
voted = 1
break
-
- var/output = "
Player poll "
- output +="
"
+
+ var/output
+ if(!inline)
+ output += "
Player poll "
+ output +="
"
output += "
Question: [pollquestion] "
output += "
Feedback gathering runs from [pollstarttime] until [pollendtime] "
- if(!voted) //Only make this a form if we have not voted yet
- output += "
"
- output += "
"
else
output += "[vote_text]"
-
- src << browse(output,"window=playerpoll;size=500x500")
+
+ if(inline)
+ return output
+ else
+ src << browse(output,"window=playerpoll;size=500x500")
//Polls with a text input
if(POLLTYPE_RATING)
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[ckey]' AND o.id = v.optionid")
voted_query.Execute()
-
- var/output = "
Player poll "
- output +="
"
+
+ var/output
+ if(!inline)
+ output += "
Player poll "
+ output +="
"
output += "
Question: [pollquestion] "
output += "
Poll runs from [pollstarttime] until [pollendtime] "
@@ -177,9 +350,8 @@
output += "[optiontext] - [rating] "
- if(!voted) //Only make this a form if we have not voted yet
- output += "
"
- src << browse(output,"window=playerpoll;size=500x500")
+ if(inline)
+ return output
+ else
+ src << browse(output,"window=playerpoll;size=500x500")
if(POLLTYPE_MULTI)
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
voted_query.Execute()
var/list/votedfor = list()
@@ -258,14 +433,15 @@
if(select_query.item[5])
multiplechoiceoptions = text2num(select_query.item[5])
- var/output = "
Player poll "
- output +="
"
+ var/output
+ if(!inline)
+ output += "
Player poll "
+ output +="
"
output += "
Question: [pollquestion] You can select up to [multiplechoiceoptions] options. If you select more, the first [multiplechoiceoptions] will be saved.
"
output += "
Poll runs from [pollstarttime] until [pollendtime] "
- if(!voted) //Only make this a form if we have not voted yet
- output += "
"
output += "
"
- src << browse(output,"window=playerpoll;size=600x250")
+ if(inline)
+ return output
+ else
+ src << browse(output,"window=playerpoll;size=600x250")
return
-/mob/new_player/proc/vote_on_poll(var/pollid = -1, var/optionid = -1, var/multichoice = 0)
+/client/proc/vote_on_poll(var/pollid = -1, var/optionid = -1, var/multichoice = 0)
if(pollid == -1 || optionid == -1)
return
@@ -301,7 +480,7 @@
establish_db_connection()
if(dbcon.IsConnected())
- var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime [holder ? "AND adminonly = 0" : ""]")
select_query.Execute()
var/validpoll = 0
@@ -316,7 +495,7 @@
break
if(!validpoll)
- to_chat(usr, "\red Poll is not valid.")
+ to_chat(usr, "
Poll is not valid. ")
return
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]")
@@ -329,12 +508,12 @@
break
if(!validoption)
- to_chat(usr, "\red Poll option is not valid.")
+ to_chat(usr, "
Poll option is not valid. ")
return
var/alreadyvoted = 0
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -343,11 +522,11 @@
break
if(!multichoice && alreadyvoted)
- to_chat(usr, "\red You already voted in this poll.")
+ to_chat(usr, "
You already voted in this poll. ")
return
if(multichoice && (alreadyvoted >= multiplechoiceoptions))
- to_chat(usr, "\red You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error.")
+ to_chat(usr, "
You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error. ")
return
var/adminrank = "Player"
@@ -355,14 +534,14 @@
adminrank = usr.client.holder.rank
- var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')")
+ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[ckey]', '[usr.client.address]', '[adminrank]')")
insert_query.Execute()
- to_chat(usr, "\blue Vote successful.")
+ to_chat(usr, "
Vote successful. ")
usr << browse(null,"window=playerpoll")
-/mob/new_player/proc/log_text_poll_reply(var/pollid = -1, var/replytext = "")
+/client/proc/log_text_poll_reply(var/pollid = -1, var/replytext = "")
if(pollid == -1 || replytext == "")
return
@@ -371,7 +550,7 @@
establish_db_connection()
if(dbcon.IsConnected())
- var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime [holder ? "AND adminonly = 0" : ""]")
select_query.Execute()
var/validpoll = 0
@@ -383,12 +562,12 @@
break
if(!validpoll)
- to_chat(usr, "\red Poll is not valid.")
+ to_chat(usr, "
Poll is not valid. ")
return
var/alreadyvoted = 0
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -396,7 +575,7 @@
break
if(alreadyvoted)
- to_chat(usr, "\red You already sent your feedback for this poll.")
+ to_chat(usr, "
You already sent your feedback for this poll. ")
return
var/adminrank = "Player"
@@ -413,14 +592,14 @@
to_chat(usr, "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again.")
return
- var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
+ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
insert_query.Execute()
- to_chat(usr, "\blue Feedback logging successful.")
+ to_chat(usr, "
Feedback logging successful. ")
usr << browse(null,"window=playerpoll")
-/mob/new_player/proc/vote_on_numval_poll(var/pollid = -1, var/optionid = -1, var/rating = null)
+/client/proc/vote_on_numval_poll(var/pollid = -1, var/optionid = -1, var/rating = null)
if(pollid == -1 || optionid == -1)
return
@@ -429,7 +608,7 @@
establish_db_connection()
if(dbcon.IsConnected())
- var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
+ var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime [holder ? "AND adminonly = 0" : ""]")
select_query.Execute()
var/validpoll = 0
@@ -441,7 +620,7 @@
break
if(!validpoll)
- to_chat(usr, "\red Poll is not valid.")
+ to_chat(usr, "
Poll is not valid. ")
return
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]")
@@ -454,12 +633,12 @@
break
if(!validoption)
- to_chat(usr, "\red Poll option is not valid.")
+ to_chat(usr, "
Poll option is not valid. ")
return
var/alreadyvoted = 0
- var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[usr.ckey]'")
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -467,7 +646,7 @@
break
if(alreadyvoted)
- to_chat(usr, "\red You already voted in this poll.")
+ to_chat(usr, "
You already voted in this poll. ")
return
var/adminrank = "Player"
@@ -475,8 +654,8 @@
adminrank = usr.client.holder.rank
- var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])")
+ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])")
insert_query.Execute()
- to_chat(usr, "\blue Vote successful.")
+ to_chat(usr, "
Vote successful. ")
usr << browse(null,"window=playerpoll")
\ No newline at end of file
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index efaf84798d1..9a2ea2e3499 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -241,11 +241,12 @@
var/mob/living/carbon/human/H = new
H.species = current_species
H.s_tone = s_tone
- H.species.updatespeciescolor(H)
-
- icobase = H.species.icobase
+ H.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive.
+ var/obj/item/organ/external/chest/C = H.get_organ("chest")
+ icobase = C.icobase ? C.icobase : C.species.icobase
if(H.species.bodyflags & HAS_TAIL)
- coloured_tail = H.species.tail
+ coloured_tail = H.tail ? H.tail : H.species.tail
+
qdel(H)
else
icobase = current_species.icobase
@@ -469,7 +470,7 @@
if(CHEF)
clothes_s = new /icon(uniform_dmi, "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- clothes_s.Blend(new /icon('icons/mob/head.dmi', "chefhat"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
if(prob(1))
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY)
switch(backbag)
@@ -657,6 +658,20 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
+ if(CORONER)
+ clothes_s = new /icon(uniform_dmi, "medical_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ if(prob(1))
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "mortician"), ICON_OVERLAY)
+ else
+ clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
+ switch(backbag)
+ if(2)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
+ if(3)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
+ if(4)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(GENETICIST)
clothes_s = new /icon(uniform_dmi, "geneticswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index a29a2e9480a..5572f9cc8af 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -431,106 +431,87 @@
/datum/sprite_accessory/hair/ipc
species_allowed = list("Machine")
glasses_over = 1
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.", "Shellguard Munitions Monitor Series")
/datum/sprite_accessory/hair/ipc/ipc_screen_pink
name = "Pink IPC Screen"
icon_state = "ipc_pink"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_red
name = "Red IPC Screen"
icon_state = "ipc_red"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_green
name = "Green IPC Screen"
icon_state = "ipc_green"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_blue
name = "Blue IPC Screen"
icon_state = "ipc_blue"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_breakout
name = "Breakout IPC Screen"
icon_state = "ipc_breakout"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_eight
name = "Eight IPC Screen"
icon_state = "ipc_eight"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow
name = "Rainbow IPC Screen"
icon_state = "ipc_rainbow"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_goggles
name = "Goggles IPC Screen"
icon_state = "ipc_goggles"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_heart
name = "Heart IPC Screen"
icon_state = "ipc_heart"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye
name = "Monoeye IPC Screen"
icon_state = "ipc_monoeye"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_nature
name = "Nature IPC Screen"
icon_state = "ipc_nature"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_orange
name = "Orange IPC Screen"
icon_state = "ipc_orange"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_purple
name = "Purple IPC Screen"
icon_state = "ipc_purple"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_shower
name = "Shower IPC Screen"
icon_state = "ipc_shower"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_static
name = "Static IPC Screen"
icon_state = "ipc_static"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_yellow
name = "Yellow IPC Screen"
icon_state = "ipc_yellow"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling
name = "Scanline IPC Screen"
icon_state = "ipc_scroll"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_console
name = "Console IPC Screen"
icon_state = "ipc_console"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_rgb
name = "RGB IPC Screen"
icon_state = "ipc_rgb"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/ipc_screen_glider
name = "Glider IPC Screen"
icon_state = "ipc_gol_glider"
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off
name = "Dark Hesphiastos Screen"
@@ -578,10 +559,73 @@
/datum/sprite_accessory/hair/unathi
species_allowed = list("Unathi")
glasses_over = 1
+ icon = 'icons/mob/body_accessory.dmi'
-/datum/sprite_accessory/hair/unathi/una_horns
- name = "Unathi Horns"
- icon_state = "soghun_horns"
+/datum/sprite_accessory/hair/unathi/una_side_frills
+ icon = 'icons/mob/human_face.dmi'
+ name = "Unathi Side Frills"
+ icon_state = "unathi_sidefrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/hair/unathi/una_cobra_hood
+ icon = 'icons/mob/human_face.dmi'
+ name = "Unathi Cobra Hood"
+ icon_state = "unathi_cobrahood"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/hair/unathi/una_frills_dorsal
+ icon = 'icons/mob/human_face.dmi'
+ name = "Dorsal Frills"
+ icon_state = "unathi_dorsalfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/hair/unathi/simple
+ name = "Simple Horns"
+ icon_state = "horns_simple"
+
+/datum/sprite_accessory/hair/unathi/short
+ name = "Short Horns"
+ icon_state = "horns_short"
+
+/datum/sprite_accessory/hairy/unathi/curled
+ name = "Curled Horns"
+ icon_state = "horns_curled"
+
+/datum/sprite_accessory/hair/unathi/ram
+ name = "Ram Horns"
+ icon_state = "horns_ram"
+
+/datum/sprite_accessory/hair/unathi/double
+ name = "Double Horns"
+ icon_state = "horns_drac"
+
+/datum/sprite_accessory/hair/unathi/lower
+ name = "Lower Horns"
+ icon_state = "horns_lower"
+
+/datum/sprite_accessory/hair/unathi/big
+ name = "Big"
+ icon_state = "horns_big"
+
+/datum/sprite_accessory/hair/unathi/ram2
+ name = "Ram alt."
+ icon_state = "horns_ram2"
+
+/datum/sprite_accessory/hair/unathi/small
+ name = "Small"
+ icon_state = "horns_small"
+
+/datum/sprite_accessory/hair/unathi/chin
+ name = "Chin"
+ icon_state = "horns_chin"
+
+/datum/sprite_accessory/hair/unathi/adorns
+ name = "Adorns"
+ icon_state = "horns_adorns"
+
+/datum/sprite_accessory/hair/unathi/spikes
+ name = "Spikes"
+ icon_state = "horns_spikes"
/datum/sprite_accessory/hair/skrell
species_allowed = list("Skrell")
@@ -766,6 +810,20 @@
icon_state = "braided"
secondary_theme = "beads"
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_punkbraided
+ name = "Punk Braided"
+ icon_state = "punkbraided"
+ secondary_theme = "flare"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short2
+ name = "Short Alt."
+ icon_state = "short2"
+ glasses_over = 1
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_rough
+ name = "Rough-Cropped Mane"
+ icon_state = "rough"
+
/datum/sprite_accessory/hair/vox
species_allowed = list("Vox")
glasses_over = 1
@@ -1003,6 +1061,10 @@
name = "Tajara Goatee"
icon_state = "facial_goatee"
+/datum/sprite_accessory/facial_hair/tajara/taj_goatee_faded
+ name = "Tajara Faded Goatee"
+ icon_state = "facial_goatee_faded"
+
/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
name = "Tajara Smallstache"
icon_state = "facial_smallstache"
@@ -1067,6 +1129,15 @@
name = "Swift"
icon_state = "vulp_facial_swift"
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_elder
+ name = "Elder"
+ icon_state = "vulp_facial_elder"
+ secondary_theme = "chin"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_slash
+ name = "Slash"
+ icon_state = "vulp_facial_slash"
+
/datum/sprite_accessory/facial_hair/unathi
species_allowed = list("Unathi")
gender = NEUTER
@@ -1074,39 +1145,74 @@
/datum/sprite_accessory/facial_hair/unathi/una_spines_long
name = "Long Spines"
- icon_state = "soghun_longspines"
+ icon_state = "unathi_longspines"
/datum/sprite_accessory/facial_hair/unathi/una_spines_short
name = "Short Spines"
- icon_state = "soghun_shortspines"
+ icon_state = "unathi_shortspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_aquaspine
+ name = "Spiny Aquatic Frills"
+ icon_state = "unathi_dracfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
name = "Aquatic Frills"
- icon_state = "soghun_aquaticfrills"
+ icon_state = "unathi_aquaticfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_long
name = "Long Frills"
- icon_state = "soghun_longfrills"
+ icon_state = "unathi_longfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_short
name = "Short Frills"
- icon_state = "soghun_shortfrills"
+ icon_state = "unathi_shortfrills"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquaspine
+ name = "Spiny Aquatic Webbed Frills"
+ icon_state = "unathi_dracfrills"
+ secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
name = "Aquatic Webbed Frills"
- icon_state = "soghun_aquaticfrills"
+ icon_state = "unathi_aquaticfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
name = "Long Webbed Frills"
- icon_state = "soghun_longfrills"
+ icon_state = "unathi_longfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
name = "Short Webbed Frills"
- icon_state = "soghun_shortfrills"
+ icon_state = "unathi_shortfrills"
secondary_theme = "webbing"
+/datum/sprite_accessory/facial_hair/unathi/una_side_frills
+ name = "Side Frills"
+ icon_state = "unathi_sidefrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_dorsal
+ over_hair = null
+ name = "Dorsal Frills"
+ icon_state = "unathi_dorsalfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_chin_horns
+ name = "Chin Horns"
+ icon = 'icons/mob/body_accessory.dmi'
+ icon_state = "horns_chin"
+
+/datum/sprite_accessory/facial_hair/unathi/una_horn_adorns
+ name = "Horn Adorns"
+ icon = 'icons/mob/body_accessory.dmi'
+ icon_state = "horns_adorns"
+
+/datum/sprite_accessory/facial_hair/unathi/una_spikes
+ name = "Spikes"
+ icon = 'icons/mob/body_accessory.dmi'
+ icon_state = "horns_spikes"
+
//skin styles - WIP
//going to have to re-integrate this with surgery
//let the icon_state hold an icon preview for now
@@ -1151,13 +1257,13 @@
///////////////////////////
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask")
gender = NEUTER
/datum/sprite_accessory/underwear/nude
name = "Nude"
icon_state = null
- species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox")
/datum/sprite_accessory/underwear/male
gender = MALE
@@ -1277,13 +1383,13 @@
////////////////////////////
/datum/sprite_accessory/undershirt
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask")
gender = NEUTER
/datum/sprite_accessory/undershirt/nude
name = "Nude"
icon_state = null
- species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox")
//plain color shirts
/datum/sprite_accessory/undershirt/shirt_white
@@ -1513,13 +1619,13 @@
///////////////////////
/datum/sprite_accessory/socks
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask")
gender = NEUTER
/datum/sprite_accessory/socks/nude
name = "Nude"
icon_state = null
- species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox")
/datum/sprite_accessory/socks/white_norm
name = "Normal White"
@@ -1645,7 +1751,7 @@
/datum/sprite_accessory/head_accessory/none
name = "None"
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
+ species_allowed = list("Human", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
/datum/sprite_accessory/head_accessory/unathi
@@ -1668,6 +1774,38 @@
name = "Ram"
icon_state = "horns_ram"
+/datum/sprite_accessory/head_accessory/unathi/double
+ name = "Double"
+ icon_state = "horns_drac"
+
+/datum/sprite_accessory/head_accessory/unathi/lower
+ name = "Lower"
+ icon_state = "horns_lower"
+
+/datum/sprite_accessory/head_accessory/unathi/big
+ name = "Big"
+ icon_state = "horns_big"
+
+/datum/sprite_accessory/head_accessory/unathi/ram2
+ name = "Ram alt."
+ icon_state = "horns_ram2"
+
+/datum/sprite_accessory/head_accessory/unathi/small
+ name = "Small"
+ icon_state = "horns_small"
+
+/datum/sprite_accessory/head_accessory/unathi/chin
+ name = "Chin"
+ icon_state = "horns_chin"
+
+/datum/sprite_accessory/head_accessory/unathi/adorns
+ name = "Adorns"
+ icon_state = "horns_adorns"
+
+/datum/sprite_accessory/head_accessory/unathi/spikes
+ name = "Spikes"
+ icon_state = "horns_spikes"
+
/datum/sprite_accessory/head_accessory/tajara
species_allowed = list("Tajaran")
@@ -1748,6 +1886,20 @@
name = "Vulpkanin Nose"
icon_state = "markings_face_nose_vulp"
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose2
+ name = "Vulpkanin Nose Alt."
+ icon_state = "markings_face_nose2_vulp"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_elder
+ icon = 'icons/mob/human_face.dmi'
+ name = "Elder"
+ icon_state = "vulp_facial_elder"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_slash
+ icon = 'icons/mob/human_face.dmi'
+ name = "Slash"
+ icon_state = "vulp_facial_slash"
+
/datum/sprite_accessory/head_accessory/ipc
species_allowed = list("Machine")
over_hair = 1
@@ -1768,18 +1920,80 @@
name = "Head Light"
icon_state = "light"
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_lights
+ name = "Side Lights"
+ icon_state = "sidelights"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_cyber_head
+ name = "Cyber Pipes"
+ icon_state = "cyberhead"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_antlers
+ name = "Antlers"
+ icon_state = "antlers"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_drone_eyes
+ name = "Drone Eyes"
+ icon_state = "droneeyes"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_crowned
+ name = "Crowned"
+ icon_state = "crowned"
+
+/datum/sprite_accessory/head_accessory/kidan
+ icon = 'icons/mob/human_face.dmi'
+ species_allowed = list("Kidan")
+ over_hair = 1
+ do_colouration = 1
+
+/datum/sprite_accessory/head_accessory/kidan/perked_antennae
+ name = "Perked-up Antennae"
+ icon_state = "kidan_perky"
+
+/datum/sprite_accessory/head_accessory/kidan/mopey_antennae
+ name = "Mopey Antennae"
+ icon_state = "kidan_mopey"
+
+/datum/sprite_accessory/head_accessory/kidan/curious_antennae
+ name = "Curious Antennae"
+ icon_state = "kidan_curious"
+
+/datum/sprite_accessory/head_accessory/kidan/mopey_antennae
+ name = "Mopey Antennae"
+ icon_state = "kidan_mopey"
+
+/datum/sprite_accessory/head_accessory/kidan/crescent_antennae
+ name = "Crescent Antennae"
+ icon_state = "kidan_crescent"
+
+/datum/sprite_accessory/head_accessory/kidan/alert_antennae
+ name = "Alert Antennae"
+ icon_state = "kidan_alert"
+
+/datum/sprite_accessory/head_accessory/kidan/normal_antennae
+ name = "Normal Antennae"
+ icon_state = "kidan_normal"
+
+/datum/sprite_accessory/head_accessory/kidan/long_antennae
+ name = "Long Antennae"
+ icon_state = "kidan_long"
+
+/datum/sprite_accessory/head_accessory/kidan/moth_antennae
+ name = "Moth Antennae"
+ icon_state = "kidan_moth"
+
/* BODY MARKINGS */
/datum/sprite_accessory/body_markings
icon = 'icons/mob/body_accessory.dmi'
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox")
+ species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox", "Kidan")
icon_state = "accessory_none"
marking_location = "body"
/datum/sprite_accessory/body_markings/none
name = "None"
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
+ species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/tiger
@@ -1787,6 +2001,13 @@
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tiger"
+/datum/sprite_accessory/body_markings/kidan
+ species_allowed = list("Kidan")
+
+/datum/sprite_accessory/body_markings/kidan/outline_kid
+ name = "Kidan Outline"
+ icon_state = "markings_outline_kid"
+
/datum/sprite_accessory/body_markings/unathi
species_allowed = list("Unathi")
@@ -1875,6 +2096,13 @@
marking_location = "head"
species_allowed = list()
+/datum/sprite_accessory/body_markings/head/kidan
+ species_allowed = list("Kidan")
+
+/datum/sprite_accessory/body_markings/head/kidan/outline_head_kid
+ name = "Kidan Outline Head"
+ icon_state = "markings_head_outline_kid"
+
/datum/sprite_accessory/body_markings/head/tajara
species_allowed = list("Tajaran")
@@ -1933,6 +2161,10 @@
name = "Vulpkanin Nose"
icon_state = "markings_face_nose_vulp"
+/datum/sprite_accessory/body_markings/head/vulpkanin/nose2_default_vulp
+ name = "Vulpkanin Nose Alt."
+ icon_state = "markings_face_nose2_vulp"
+
/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
name = "Vulpkanin Muzzle"
icon_state = "markings_face_full_vulp"
@@ -1968,6 +2200,7 @@
/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round
name = "Unathi Lower Round Snout"
icon_state = "markings_face_snout_lower_una"
+ heads_allowed = list("All")
/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded.
name = "Unathi Banded Head"
diff --git a/code/modules/mob/pulling.dm b/code/modules/mob/pulling.dm
index 6a6a66675b0..5a532ee1a42 100644
--- a/code/modules/mob/pulling.dm
+++ b/code/modules/mob/pulling.dm
@@ -15,7 +15,11 @@
return
stop_pulling()
- src.pulling = AM
+ if(AM.pulledby)
+ visible_message("
[src] has pulled [AM] from [AM.pulledby]'s grip. ")
+ AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+
+ pulling = AM
AM.pulledby = src
if(pullin)
pullin.update_icon(src)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 8adc505102b..c21733a7a39 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/proc/monkeyize()
var/mob/H = src
H.dna.SetSEState(MONKEYBLOCK,1)
- domutcheck(H, null)
+ genemutcheck(H,MONKEYBLOCK,null,MUTCHK_FORCED)
/mob/new_player/AIize()
spawning = 1
@@ -55,7 +55,7 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
+ for(var/t in bodyparts)
qdel(t)
for(var/i in internal_organs)
qdel(i)
@@ -115,7 +115,7 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
+ for(var/t in bodyparts)
qdel(t)
var/alien_caste = pick("Hunter","Sentinel","Drone")
@@ -147,7 +147,7 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
+ for(var/t in bodyparts)
qdel(t)
var/mob/living/carbon/slime/new_slime
@@ -183,7 +183,7 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs) //this really should not be necessary
+ for(var/t in bodyparts) //this really should not be necessary
qdel(t)
var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc)
@@ -212,7 +212,7 @@
icon = null
invisibility = 101
- for(var/t in organs)
+ for(var/t in bodyparts)
qdel(t)
var/mob/new_mob = new mobpath(src.loc)
@@ -252,7 +252,7 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs) //this really should not be necessary
+ for(var/t in bodyparts) //this really should not be necessary
qdel(t)
var/obj/item/device/paicard/card = new(loc)
diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm
new file mode 100644
index 00000000000..55998071e71
--- /dev/null
+++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm
@@ -0,0 +1,70 @@
+var/global/static/ntnrc_uid = 0
+
+/datum/ntnet_conversation
+ var/id = null
+ var/title = "Untitled Conversation"
+ var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator,
+ var/list/messages = list()
+ var/list/clients = list()
+ var/password
+
+/datum/ntnet_conversation/New()
+ id = ntnrc_uid
+ ntnrc_uid++
+ if(ntnet_global)
+ ntnet_global.chat_channels.Add(src)
+ ..()
+
+/datum/ntnet_conversation/Destroy()
+ if(ntnet_global)
+ ntnet_global.chat_channels.Remove(src)
+ return ..()
+
+/datum/ntnet_conversation/proc/add_message(message, username)
+ message = "[worldtime2text()] [username]: [message]"
+ messages.Add(message)
+ trim_message_list()
+
+/datum/ntnet_conversation/proc/add_status_message(message)
+ messages.Add("[worldtime2text()] -!- [message]")
+ trim_message_list()
+
+/datum/ntnet_conversation/proc/trim_message_list()
+ if(messages.len <= 50)
+ return
+ messages = messages.Copy(messages.len-50 ,0)
+
+/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/C)
+ if(!istype(C))
+ return
+ clients.Add(C)
+ add_status_message("[C.username] has joined the channel.")
+ // No operator, so we assume the channel was empty. Assign this user as operator.
+ if(!operator)
+ changeop(C)
+
+/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/C)
+ if(!istype(C) || !(C in clients))
+ return
+ clients.Remove(C)
+ add_status_message("[C.username] has left the channel.")
+
+ // Channel operator left, pick new operator
+ if(C == operator)
+ operator = null
+ if(clients.len)
+ var/datum/computer_file/program/chatclient/newop = pick(clients)
+ changeop(newop)
+
+
+/datum/ntnet_conversation/proc/changeop(datum/computer_file/program/chatclient/newop)
+ if(istype(newop))
+ operator = newop
+ add_status_message("Channel operator status transferred to [newop.username].")
+
+/datum/ntnet_conversation/proc/change_title(newtitle, datum/computer_file/program/chatclient/client)
+ if(operator != client)
+ return 0 // Not Authorised
+
+ add_status_message("[client.username] has changed channel title from [title] to [newtitle]")
+ title = newtitle
diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm
new file mode 100644
index 00000000000..ed69207f0ee
--- /dev/null
+++ b/code/modules/modular_computers/NTNet/NTNet.dm
@@ -0,0 +1,145 @@
+var/global/datum/ntnet/ntnet_global = new()
+
+
+// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this.
+/datum/ntnet
+ var/list/relays = list()
+ var/list/logs = list()
+ var/list/available_station_software = list()
+ var/list/available_antag_software = list()
+ var/list/chat_channels = list()
+ var/list/fileservers = list()
+ // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly.
+ // High values make displaying logs much laggier.
+ var/setting_maxlogcount = 100
+
+ // These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections
+ var/setting_softwaredownload = 1
+ var/setting_peertopeer = 1
+ var/setting_communication = 1
+ var/setting_systemcontrol = 1
+ var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status.
+
+ var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled
+ var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software.
+
+
+// If new NTNet datum is spawned, it replaces the old one.
+/datum/ntnet/New()
+ if(ntnet_global && (ntnet_global != src))
+ ntnet_global = src // There can be only one.
+ for(var/obj/machinery/ntnet_relay/R in machines)
+ relays.Add(R)
+ R.NTNet = src
+ build_software_lists()
+ add_log("NTNet logging system activated.")
+
+// Simplified logging: Adds a log. log_string is mandatory parameter, source is optional.
+/datum/ntnet/proc/add_log(log_string, obj/item/weapon/computer_hardware/network_card/source = null)
+ var/log_text = "[worldtime2text()] - "
+ if(source)
+ log_text += "[source.get_network_tag()] - "
+ else
+ log_text += "*SYSTEM* - "
+ log_text += log_string
+ logs.Add(log_text)
+
+
+ // We have too many logs, remove the oldest entries until we get into the limit
+ if(logs.len > setting_maxlogcount)
+ logs = logs.Copy(logs.len-setting_maxlogcount,0)
+
+
+// Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled.
+/datum/ntnet/proc/check_function(specific_action = 0)
+ if(!relays || !relays.len) // No relays found. NTNet is down
+ return 0
+
+ var/operating = 0
+
+ // Check all relays. If we have at least one working relay, network is up.
+ for(var/M in relays)
+ var/obj/machinery/ntnet_relay/R = M
+ if(R.operable())
+ operating = 1
+ break
+
+ if(setting_disabled)
+ return 0
+
+ switch(specific_action)
+ if(NTNET_SOFTWAREDOWNLOAD)
+ return (operating && setting_softwaredownload)
+ if(NTNET_PEERTOPEER)
+ return (operating && setting_peertopeer)
+ if(NTNET_COMMUNICATION)
+ return (operating && setting_communication)
+ if(NTNET_SYSTEMCONTROL)
+ return (operating && setting_systemcontrol)
+ return operating
+
+// Builds lists that contain downloadable software.
+/datum/ntnet/proc/build_software_lists()
+ available_station_software = list()
+ available_antag_software = list()
+ for(var/F in typesof(/datum/computer_file/program))
+ var/datum/computer_file/program/prog = new F
+ // Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program)
+ if(!prog || prog.filename == "UnknownProgram" || prog.filetype != "PRG")
+ continue
+ // Check whether the program should be available for station/antag download, if yes, add it to lists.
+ if(prog.available_on_ntnet)
+ available_station_software.Add(prog)
+ if(prog.available_on_syndinet)
+ available_antag_software.Add(prog)
+
+// Attempts to find a downloadable file according to filename var
+/datum/ntnet/proc/find_ntnet_file_by_name(filename)
+ for(var/N in available_station_software)
+ var/datum/computer_file/program/P = N
+ if(filename == P.filename)
+ return P
+ for(var/N in available_antag_software)
+ var/datum/computer_file/program/P = N
+ if(filename == P.filename)
+ return P
+
+// Resets the IDS alarm
+/datum/ntnet/proc/resetIDS()
+ intrusion_detection_alarm = 0
+
+/datum/ntnet/proc/toggleIDS()
+ resetIDS()
+ intrusion_detection_enabled = !intrusion_detection_enabled
+
+// Removes all logs
+/datum/ntnet/proc/purge_logs()
+ logs = list()
+ add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-")
+
+// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks.
+/datum/ntnet/proc/update_max_log_count(lognumber)
+ if(!lognumber)
+ return 0
+ // Trim the value if necessary
+ lognumber = max(MIN_NTNET_LOGS, min(lognumber, MAX_NTNET_LOGS))
+ setting_maxlogcount = lognumber
+ add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.")
+
+/datum/ntnet/proc/toggle_function(function)
+ if(!function)
+ return
+ function = text2num(function)
+ switch(function)
+ if(NTNET_SOFTWAREDOWNLOAD)
+ setting_softwaredownload = !setting_softwaredownload
+ add_log("Configuration Updated. Wireless network firewall now [setting_softwaredownload ? "allows" : "disallows"] connection to software repositories.")
+ if(NTNET_PEERTOPEER)
+ setting_peertopeer = !setting_peertopeer
+ add_log("Configuration Updated. Wireless network firewall now [setting_peertopeer ? "allows" : "disallows"] peer to peer network traffic.")
+ if(NTNET_COMMUNICATION)
+ setting_communication = !setting_communication
+ add_log("Configuration Updated. Wireless network firewall now [setting_communication ? "allows" : "disallows"] instant messaging and similar communication services.")
+ if(NTNET_SYSTEMCONTROL)
+ setting_systemcontrol = !setting_systemcontrol
+ add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of station's systems.")
diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm
new file mode 100644
index 00000000000..5f5325e0364
--- /dev/null
+++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm
@@ -0,0 +1,128 @@
+// Relays don't handle any actual communication. Global NTNet datum does that, relays only tell the datum if it should or shouldn't work.
+/obj/machinery/ntnet_relay
+ name = "NTNet Quantum Relay"
+ desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile."
+ use_power = 2
+ active_power_usage = 10000 //10kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. Used to be 20 but that actually drained the smes one round
+ idle_power_usage = 100
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "bus"
+ anchored = 1
+ density = 1
+ var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
+ var/enabled = 1 // Set to 0 if the relay was turned off
+ var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
+ var/list/dos_sources = list() // Backwards reference for qdel() stuff
+
+ // Denial of Service attack variables
+ var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer
+ var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay
+ var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time.
+
+
+// TODO: Implement more logic here. For now it's only a placeholder.
+/obj/machinery/ntnet_relay/inoperable(additional_flags = 0)
+ if(stat & (BROKEN | NOPOWER | EMPED | additional_flags))
+ return 1
+ if(dos_failure)
+ return 1
+ if(!enabled)
+ return 1
+ return 0
+
+/obj/machinery/ntnet_relay/update_icon()
+ if(operable())
+ icon_state = "bus"
+ else
+ icon_state = "bus_off"
+
+/obj/machinery/ntnet_relay/process()
+ if(operable())
+ use_power = 2
+ else
+ use_power = 1
+
+ update_icon()
+
+ if(dos_overload)
+ dos_overload = max(0, dos_overload - dos_dissipate)
+
+ // If DoS traffic exceeded capacity, crash.
+ if((dos_overload > dos_capacity) && !dos_failure)
+ dos_failure = 1
+ update_icon()
+ ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.")
+ // If the DoS buffer reaches 0 again, restart.
+ if((dos_overload == 0) && dos_failure)
+ dos_failure = 0
+ update_icon()
+ ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.")
+ ..()
+
+/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300)
+ ui.open()
+
+/obj/machinery/ntnet_relay/ui_data(mob/user)
+ var/list/data = list()
+ data["enabled"] = enabled
+ data["dos_capacity"] = dos_capacity
+ data["dos_overload"] = dos_overload
+ data["dos_crashed"] = dos_failure
+ return data
+
+
+/obj/machinery/ntnet_relay/Topic(href, list/href_list)
+ if(..())
+ return
+ switch(href_list["action"])
+ if("restart")
+ dos_overload = 0
+ dos_failure = 0
+ update_icon()
+ ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
+ if("toggle")
+ enabled = !enabled
+ ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].")
+ update_icon()
+ return 1
+
+
+/obj/machinery/ntnet_relay/attack_hand(mob/living/user)
+ ui_interact(user)
+
+/obj/machinery/ntnet_relay/New()
+ uid = gl_uid
+ gl_uid++
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/machine/ntnet_relay(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 2)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
+
+ if(ntnet_global)
+ ntnet_global.relays.Add(src)
+ NTNet = ntnet_global
+ ntnet_global.add_log("New quantum relay activated. Current amount of linked relays: [NTNet.relays.len]")
+ ..()
+
+/obj/machinery/ntnet_relay/Destroy()
+ if(ntnet_global)
+ ntnet_global.relays.Remove(src)
+ ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]")
+ NTNet = null
+
+ for(var/datum/computer_file/program/ntnet_dos/D in dos_sources)
+ D.target = null
+ D.error = "Connection to quantum relay severed"
+
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/ntnet_relay
+ name = "NTNet Relay (Machine Board)"
+ build_path = /obj/machinery/ntnet_relay
+ origin_tech = "programming=3;bluespace=3;magnets=2"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
new file mode 100644
index 00000000000..9f867692153
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -0,0 +1,381 @@
+// This is the base type that does all the hardware stuff.
+// Other types expand it - tablets use a direct subtypes, and
+// consoles and laptops use "procssor" item that is held inside machinery piece
+/obj/item/device/modular_computer
+ name = "modular microcomputer"
+ desc = "A small portable microcomputer."
+
+ var/enabled = 0 // Whether the computer is turned on.
+ var/screen_on = 1 // Whether the computer is active/opened/it's screen is on.
+ var/datum/computer_file/program/active_program = null // A currently active program running on the computer.
+ var/hardware_flag = 0 // A flag that describes this device type
+ var/last_power_usage = 0
+ var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
+ var/last_world_time = "00:00"
+ var/list/last_header_icons
+ var/emagged = 0 // Whether the computer is emagged.
+
+ var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
+ var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
+
+ // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..)
+ // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently
+ // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example.
+
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "laptop-open"
+ var/icon_state_unpowered = null // Icon state when the computer is turned off.
+ var/icon_state_powered = null // Icon state when the computer is turned on.
+ var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen.
+ var/max_hardware_size = 0 // Maximal hardware w_class. Tablets/PDAs have 1, laptops 2, consoles 4.
+ var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
+
+ var/obj_integrity = 100
+ var/integrity_failure = 50
+ var/max_integrity = 100
+ armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 0, acid = 0)
+
+ // Important hardware (must be installed for computer to work)
+
+ // Optional hardware (improves functionality, but is not critical for computer to work)
+
+ var/list/all_components // List of "connection ports" in this computer and the components with which they are plugged
+
+ var/list/idle_threads // Idle programs on background. They still receive process calls but can't be interacted with.
+ var/obj/physical = null // Object that represents our computer. It's used for Adjacent() and UI visibility checks.
+
+
+
+/obj/item/device/modular_computer/New()
+ update_icon()
+ if(!physical)
+ physical = src
+ ..()
+ processing_objects += src
+ all_components = list()
+ idle_threads = list()
+
+/obj/item/device/modular_computer/Destroy()
+ kill_program(forced = TRUE)
+ for(var/H in all_components)
+ var/obj/item/weapon/computer_hardware/CH = all_components[H]
+ if(CH.holder == src)
+ CH.on_remove(src)
+ CH.holder = null
+ all_components.Remove(CH.device_type)
+ qdel(CH)
+ physical = null
+ processing_objects -= src
+ return ..()
+
+
+/obj/item/device/modular_computer/proc/add_verb(var/path)
+ switch(path)
+ if(MC_CARD)
+ verbs += /obj/item/device/modular_computer/proc/eject_id
+ if(MC_SDD)
+ verbs += /obj/item/device/modular_computer/proc/eject_disk
+ if(MC_AI)
+ verbs += /obj/item/device/modular_computer/proc/eject_card
+
+/obj/item/device/modular_computer/proc/remove_verb(path)
+ switch(path)
+ if(MC_CARD)
+ verbs -= /obj/item/device/modular_computer/proc/eject_id
+ if(MC_SDD)
+ verbs -= /obj/item/device/modular_computer/proc/eject_disk
+ if(MC_AI)
+ verbs -= /obj/item/device/modular_computer/proc/eject_card
+
+// Eject ID card from computer, if it has ID slot with card inside.
+/obj/item/device/modular_computer/proc/eject_id()
+ set name = "Eject ID"
+ set category = "Object"
+ set src in view(1)
+
+ if(issilicon(usr))
+ return
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
+ if(!usr.incapacitated())
+ card_slot.try_eject(null, usr)
+
+// Eject ID card from computer, if it has ID slot with card inside.
+/obj/item/device/modular_computer/proc/eject_card()
+ set name = "Eject Intellicard"
+ set category = "Object"
+ set src in view(1)
+
+ if(issilicon(usr))
+ return
+ var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = all_components[MC_AI]
+ if(!usr.incapacitated())
+ ai_slot.try_eject(null, usr, 1)
+
+
+// Eject ID card from computer, if it has ID slot with card inside.
+/obj/item/device/modular_computer/proc/eject_disk()
+ set name = "Eject Data Disk"
+ set category = "Object"
+ set src in view(1)
+
+ if(issilicon(usr))
+ return
+
+ if(!usr.incapacitated())
+ var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD]
+ if(uninstall_component(portable_drive, usr))
+ portable_drive.verb_pickup()
+
+/obj/item/device/modular_computer/AltClick(mob/user)
+ ..()
+ if(issilicon(user))
+ return
+
+ if(!user.incapacitated() && Adjacent(user))
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
+ var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = all_components[MC_AI]
+ var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD]
+ if(portable_drive)
+ if(uninstall_component(portable_drive, user))
+ portable_drive.verb_pickup()
+ else
+ if(card_slot && card_slot.try_eject(null, user))
+ return
+ if(ai_slot)
+ ai_slot.try_eject(null, user)
+
+
+// Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs.
+/obj/item/device/modular_computer/GetAccess()
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
+ if(card_slot)
+ return card_slot.GetAccess()
+ return ..()
+
+/obj/item/device/modular_computer/GetID()
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
+ if(card_slot)
+ return card_slot.GetID()
+ return ..()
+
+/obj/item/device/modular_computer/attack_ai(mob/user)
+ return attack_self(user)
+
+/obj/item/device/modular_computer/attack_ghost(mob/dead/observer/user)
+ if(enabled)
+ ui_interact(user)
+ else if(user.can_admin_interact())
+ var/response = alert(user, "This computer is turned off. Would you like to turn it on?", "Admin Override", "Yes", "No")
+ if(response == "Yes")
+ turn_on(user)
+
+/obj/item/device/modular_computer/emag_act(mob/user)
+ if(emagged)
+ to_chat(user, "
\The [src] was already emagged. ")
+ return 0
+ else
+ emagged = 1
+ to_chat(user, "
You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message. ")
+ return 1
+
+/obj/item/device/modular_computer/examine(mob/user)
+ ..()
+ if(obj_integrity <= integrity_failure)
+ to_chat(user, "
It is heavily damaged! ")
+ else if(obj_integrity < max_integrity)
+ to_chat(user, "
It is damaged. ")
+
+/obj/item/device/modular_computer/update_icon()
+ overlays.Cut()
+ if(!enabled)
+ icon_state = icon_state_unpowered
+ else
+ icon_state = icon_state_powered
+ if(active_program && active_program.program_state != PROGRAM_STATE_KILLED)
+ overlays += active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu
+ else
+ overlays += icon_state_menu
+
+ if(obj_integrity <= integrity_failure)
+ overlays += "bsod"
+ overlays += "broken"
+
+
+// On-click handling. Turns on the computer if it's off and opens the GUI.
+/obj/item/device/modular_computer/attack_self(mob/user)
+ if(enabled)
+ ui_interact(user)
+ else
+ turn_on(user)
+
+/obj/item/device/modular_computer/proc/turn_on(mob/user)
+ var/issynth = issilicon(user) // Robots and AIs get different activation messages.
+ if(obj_integrity <= integrity_failure)
+ if(issynth)
+ to_chat(user, "
You send an activation signal to \the [src], but it responds with an error code. It must be damaged. ")
+ else
+ to_chat(user, "
You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again. ")
+ return
+
+ // If we have a recharger, enable it automatically. Lets computer without a battery work.
+ var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
+ if(recharger)
+ recharger.enabled = 1
+
+ if(all_components[MC_CPU] && use_power()) // use_power() checks if the PC is powered
+ if(issynth)
+ to_chat(user, "
You send an activation signal to \the [src], turning it on. ")
+ else
+ to_chat(user, "
You press the power button and start up \the [src]. ")
+ enabled = 1
+ update_icon()
+ ui_interact(user)
+ else // Unpowered
+ if(issynth)
+ to_chat(user, "
You send an activation signal to \the [src] but it does not respond. ")
+ else
+ to_chat(user, "
You press the power button but \the [src] does not respond. ")
+
+// Process currently calls handle_power(), may be expanded in future if more things are added.
+/obj/item/device/modular_computer/process()
+ if(!enabled) // The computer is turned off
+ last_power_usage = 0
+ return 0
+
+ if(obj_integrity <= integrity_failure)
+ shutdown_computer()
+ return 0
+
+ if(active_program && active_program.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature))
+ active_program.event_networkfailure(0) // Active program requires NTNet to run but we've just lost connection. Crash.
+
+ if(active_program)
+ if(active_program.program_state != PROGRAM_STATE_KILLED)
+ active_program.process_tick()
+ active_program.ntnet_status = get_ntnet_status()
+ else
+ active_program = null
+
+ for(var/I in idle_threads)
+ var/datum/computer_file/program/P = I
+ if(P.program_state != PROGRAM_STATE_KILLED)
+ if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature))
+ P.event_networkfailure(1)
+ P.process_tick()
+ P.ntnet_status = get_ntnet_status()
+ else
+ idle_threads.Remove(P)
+
+ handle_power() // Handles all computer power interaction
+
+// Relays kill program request to currently active program. Use this to quit current program.
+/obj/item/device/modular_computer/proc/kill_program(forced = FALSE)
+ if(active_program && active_program.program_state != PROGRAM_STATE_KILLED)
+ active_program.kill_program(forced)
+ active_program = null
+ var/mob/user = usr
+ if(user && istype(user))
+ ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
+ update_icon()
+
+// Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on)
+/obj/item/device/modular_computer/proc/get_ntnet_status(specific_action = 0)
+ var/obj/item/weapon/computer_hardware/network_card/network_card = all_components[MC_NET]
+ if(network_card)
+ return network_card.get_signal(specific_action)
+ else
+ return 0
+
+/obj/item/device/modular_computer/proc/add_log(text)
+ if(!get_ntnet_status())
+ return FALSE
+ var/obj/item/weapon/computer_hardware/network_card/network_card = all_components[MC_NET]
+ return ntnet_global.add_log(text, network_card)
+
+/obj/item/device/modular_computer/proc/shutdown_computer(loud = 1)
+ if(enabled)
+ kill_program(forced = TRUE)
+ for(var/datum/computer_file/program/P in idle_threads)
+ P.kill_program(forced = TRUE)
+ idle_threads.Remove(P)
+ if(loud)
+ physical.visible_message("
\The [src] shuts down. ")
+ enabled = 0
+ update_icon()
+
+
+/obj/item/device/modular_computer/attackby(obj/item/weapon/W, mob/user)
+ // Insert items into the components
+ for(var/h in all_components)
+ var/obj/item/weapon/computer_hardware/H = all_components[h]
+ if(H.try_insert(W, user))
+ return
+
+ // Insert new hardware
+ if(istype(W, /obj/item/weapon/computer_hardware))
+ if(install_component(W, user))
+ return
+
+ if(istype(W, /obj/item/weapon/wrench))
+ if(all_components.len)
+ to_chat(user, "
Remove all components from \the [src] before disassembling it. ")
+ return
+ new /obj/item/stack/sheet/metal(get_turf(loc), steel_sheet_cost)
+ physical.visible_message("\The [src] has been disassembled by [user].")
+ relay_qdel()
+ qdel(src)
+ return
+
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.isOn())
+ to_chat(user, "
\The [W] is off. ")
+ return
+
+ if(obj_integrity == max_integrity)
+ to_chat(user, "
\The [src] does not require repairs. ")
+ return
+
+ to_chat(user, "
You begin repairing damage to \the [src]... ")
+ var/dmg = round(max_integrity - obj_integrity)
+ if(WT.remove_fuel(round(dmg/75)) && do_after(usr, dmg/10))
+ obj_integrity = max_integrity
+ to_chat(user, "
You repair \the [src]. ")
+ return
+
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(!all_components.len)
+ to_chat(user, "
This device doesn't have any components installed. ")
+ return
+ var/list/component_names = list()
+ for(var/h in all_components)
+ var/obj/item/weapon/computer_hardware/H = all_components[h]
+ component_names.Add(H.name)
+
+ var/choice = input(user, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in component_names
+
+ if(!choice)
+ return
+
+ if(!Adjacent(user))
+ return
+
+ var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(choice)
+
+ if(!H)
+ return
+
+ uninstall_component(H, user)
+ return
+
+ ..()
+
+// Used by processor to relay qdel() to machinery type.
+/obj/item/device/modular_computer/proc/relay_qdel()
+ return
+
+// Perform adjacency checks on our physical counterpart, if any.
+/obj/item/device/modular_computer/Adjacent(atom/neighbor)
+ if(physical && physical != src)
+ return physical.Adjacent(neighbor)
+ return ..()
diff --git a/code/modules/modular_computers/computers/item/computer_components.dm b/code/modules/modular_computers/computers/item/computer_components.dm
new file mode 100644
index 00000000000..09f027f2301
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/computer_components.dm
@@ -0,0 +1,58 @@
+/obj/item/device/modular_computer/proc/can_install_component(obj/item/weapon/computer_hardware/H, mob/living/user = null)
+ if(!H.can_install(src, user))
+ return FALSE
+
+ if(H.w_class > max_hardware_size)
+ if(user)
+ to_chat(user, "
This component is too large for \the [src]! ")
+ return FALSE
+
+ if(all_components[H.device_type])
+ if(user)
+ to_chat(user, "
This computer's hardware slot is already occupied by \the [all_components[H.device_type]]. ")
+ return FALSE
+ return TRUE
+
+
+// Installs component.
+/obj/item/device/modular_computer/proc/install_component(obj/item/weapon/computer_hardware/H, mob/living/user = null)
+ if(!can_install_component(H, user))
+ return FALSE
+
+ if(user && !user.unEquip(H))
+ return FALSE
+ H.forceMove(src)
+
+ all_components[H.device_type] = H
+
+ if(user)
+ to_chat(user, "
You install \the [H] into \the [src]. ")
+ H.holder = src
+ H.on_install(src, user)
+
+
+// Uninstalls component.
+/obj/item/device/modular_computer/proc/uninstall_component(obj/item/weapon/computer_hardware/H, mob/living/user = null)
+ if(H.holder != src) // Not our component at all.
+ return FALSE
+
+ all_components.Remove(H.device_type)
+
+ if(user)
+ to_chat(user, "
You remove \the [H] from \the [src]. ")
+
+ H.forceMove(get_turf(src))
+ H.holder = null
+ H.on_remove(src, user)
+ if(enabled && !use_power())
+ shutdown_computer()
+ update_icon()
+
+
+// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null
+/obj/item/device/modular_computer/proc/find_hardware_by_name(name)
+ for(var/i in all_components)
+ var/obj/O = all_components[i]
+ if(O.name == name)
+ return O
+ return null
diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm
new file mode 100644
index 00000000000..689e8c99ab7
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/computer_damage.dm
@@ -0,0 +1,52 @@
+/obj/item/device/modular_computer/emp_act(severity)
+ if(prob(20 / severity))
+ take_damage(obj_integrity, BURN)
+ ..()
+
+/obj/item/device/modular_computer/ex_act(severity)
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
+ if(prob(25))
+ qdel(src)
+ else if(prob(50))
+ obj_integrity = 0
+ if(3)
+ if(prob(25))
+ obj_integrity = 0
+
+/obj/item/device/modular_computer/bullet_act(obj/item/projectile/P)
+ take_damage(P.damage, P.damage_type)
+ ..()
+
+/obj/item/device/modular_computer/blob_act()
+ if(prob(75))
+ take_damage(obj_integrity, BRUTE)
+
+/obj/item/device/modular_computer/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity))
+ switch(damage_flag)
+ if("bullet")
+ component_probability = damage_amount * 0.5
+ if("laser")
+ component_probability = damage_amount * 0.66
+ if(component_probability)
+ for(var/I in all_components)
+ var/obj/item/weapon/computer_hardware/H = all_components[I]
+ if(prob(component_probability))
+ H.take_damage(round(damage_amount*0.5))
+
+/obj/item/device/modular_computer/proc/break_apart(damage = TRUE)
+ physical.visible_message("\The [src] breaks apart!")
+ var/turf/newloc = get_turf(src)
+ new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
+ for(var/C in all_components)
+ var/obj/item/weapon/computer_hardware/H = all_components[C]
+ uninstall_component(H)
+ H.forceMove(newloc)
+ if(damage && prob(25))
+ H.take_damage(rand(10, 30))
+ relay_qdel()
+ qdel(src)
diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm
new file mode 100644
index 00000000000..8483e9c4fc6
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/computer_power.dm
@@ -0,0 +1,73 @@
+// Tries to draw power from charger or, if no operational charger is present, from power cell.
+/obj/item/device/modular_computer/proc/use_power(amount = 0)
+ if(check_power_override())
+ return TRUE
+
+ var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
+
+ if(recharger && recharger.check_functionality())
+ if(recharger.use_power(amount))
+ return TRUE
+
+ var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
+
+ if(battery_module && battery_module.battery && battery_module.battery.charge)
+ var/obj/item/weapon/stock_parts/cell/cell = battery_module.battery
+ if(cell.use(amount * CELLRATE))
+ return TRUE
+ else // Discharge the cell anyway.
+ cell.use(min(amount*CELLRATE, cell.charge))
+ return FALSE
+ return FALSE
+
+/obj/item/device/modular_computer/proc/give_power(amount)
+ var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
+ if(battery_module && battery_module.battery)
+ return battery_module.battery.give(amount)
+ return 0
+
+
+// Used in following function to reduce copypaste
+/obj/item/device/modular_computer/proc/power_failure()
+ if(enabled) // Shut down the computer
+ if(active_program)
+ active_program.event_powerfailure(0)
+ for(var/I in idle_threads)
+ var/datum/computer_file/program/PRG = I
+ PRG.event_powerfailure(1)
+ shutdown_computer(0)
+
+// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged
+/obj/item/device/modular_computer/proc/handle_power()
+ var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
+ if(recharger)
+ recharger.process()
+
+ var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage
+
+ for(var/obj/item/weapon/computer_hardware/H in all_components)
+ if(H.enabled)
+ power_usage += H.power_usage
+
+ if(use_power(power_usage))
+ last_power_usage = power_usage
+ return TRUE
+ else
+ power_failure()
+ return FALSE
+
+/obj/item/device/modular_computer/proc/get_power_eta()
+ var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
+ if(battery_module && battery_module.battery)
+ var/hours = 0
+ var/minutes = (battery_module.battery.charge) / (last_power_usage / 20) // 20 = obj processing interval
+ if(minutes > 60)
+ hours = minutes/60
+ minutes = (hours - round(hours)) * 60
+ var/seconds = (minutes - round(minutes)) * 60
+ return list("hours" = hours, "minutes" = minutes, "seconds" = seconds)
+ return list()
+
+// Used by child types if they have other power source than battery or recharger
+/obj/item/device/modular_computer/proc/check_power_override()
+ return FALSE
diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm
new file mode 100644
index 00000000000..4044e2530bf
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/computer_ui.dm
@@ -0,0 +1,194 @@
+// Operates NanoUI
+/obj/item/device/modular_computer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ if(!enabled)
+ if(ui)
+ ui.close()
+ return 0
+ if(!use_power())
+ if(ui)
+ ui.close()
+ return 0
+
+ // Robots don't really need to see the screen, their wireless connection works as long as computer is on.
+ if(!screen_on && !issilicon(user))
+ if(ui)
+ ui.close()
+ return 0
+
+ // If we have an active program switch to it now.
+ if(active_program)
+ if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now.
+ ui.close()
+ active_program.ui_interact(user)
+ return
+
+ // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it.
+ // This screen simply lists available programs and user may select them.
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
+ if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len)
+ to_chat(user, "
\The [src] beeps three times, it's screen displaying a \"DISK ERROR\" warning. ")
+ return // No HDD, No HDD files list or no stored files. Something is very broken.
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "computer_main.tmpl", "NTOS Main menu", 400, 500)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+
+/obj/item/device/modular_computer/ui_data(mob/user)
+ var/list/data = get_header_data()
+ data["programs"] = list()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
+ for(var/datum/computer_file/program/P in hard_drive.stored_files)
+ var/running = 0
+ if(P in idle_threads)
+ running = 1
+
+ data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc, "running" = running))
+
+ return data
+
+// Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_"
+/obj/item/device/modular_computer/proc/get_header_data()
+ var/list/data = list()
+
+ var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
+ var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
+
+ if(battery_module && battery_module.battery)
+ switch(battery_module.battery.percent())
+ if(80 to 200) // 100 should be maximal but just in case..
+ data["PC_batteryicon"] = "batt_100.gif"
+ if(60 to 80)
+ data["PC_batteryicon"] = "batt_80.gif"
+ if(40 to 60)
+ data["PC_batteryicon"] = "batt_60.gif"
+ if(20 to 40)
+ data["PC_batteryicon"] = "batt_40.gif"
+ if(5 to 20)
+ data["PC_batteryicon"] = "batt_20.gif"
+ else
+ data["PC_batteryicon"] = "batt_5.gif"
+ data["PC_batterypercent"] = "[round(battery_module.battery.percent())] %"
+ data["PC_showbatteryicon"] = 1
+ else
+ data["PC_batteryicon"] = "batt_5.gif"
+ data["PC_batterypercent"] = "N/C"
+ data["PC_showbatteryicon"] = battery_module ? 1 : 0
+
+ if(recharger && recharger.enabled && recharger.check_functionality() && recharger.use_power(0))
+ data["PC_apclinkicon"] = "charging.gif"
+
+ switch(get_ntnet_status())
+ if(0)
+ data["PC_ntneticon"] = "sig_none.gif"
+ if(1)
+ data["PC_ntneticon"] = "sig_low.gif"
+ if(2)
+ data["PC_ntneticon"] = "sig_high.gif"
+ if(3)
+ data["PC_ntneticon"] = "sig_lan.gif"
+
+ if(idle_threads.len)
+ var/list/program_headers = list()
+ for(var/I in idle_threads)
+ var/datum/computer_file/program/P = I
+ if(!P.ui_header)
+ continue
+ program_headers.Add(list(list(
+ "icon" = P.ui_header
+ )))
+
+ data["PC_programheaders"] = program_headers
+
+ data["PC_stationtime"] = worldtime2text()
+ data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen
+ return data
+
+
+// Handles user's GUI input
+/obj/item/device/modular_computer/Topic(href, list/href_list)
+ if(..())
+ return
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
+ switch(href_list["action"])
+ if("PC_exit")
+ kill_program()
+ return 1
+ if("PC_shutdown")
+ shutdown_computer()
+ return 1
+ if("PC_minimize")
+ var/mob/user = usr
+ if(!active_program || !all_components[MC_CPU])
+ return 1
+
+ idle_threads.Add(active_program)
+ active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs
+
+ active_program = null
+ update_icon()
+ if(user && istype(user))
+ ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
+
+ if("PC_killprogram")
+ var/prog = href_list["name"]
+ var/datum/computer_file/program/P = null
+ var/mob/user = usr
+ if(hard_drive)
+ P = hard_drive.find_file_by_name(prog)
+
+ if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED)
+ return 1
+
+ P.kill_program(forced = TRUE)
+ to_chat(user, "
Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed. ")
+
+ if("PC_runprogram")
+ var/prog = href_list["name"]
+ var/datum/computer_file/program/P = null
+ var/mob/user = usr
+ if(hard_drive)
+ P = hard_drive.find_file_by_name(prog)
+
+ if(!P || !istype(P)) // Program not found or it's not executable program.
+ to_chat(user, "
\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning. ")
+ return 1
+
+ P.computer = src
+
+ if(!P.is_supported_by_hardware(hardware_flag, 1, user))
+ return 1
+
+ // The program is already running. Resume it.
+ if(P in idle_threads)
+ P.program_state = PROGRAM_STATE_ACTIVE
+ active_program = P
+ idle_threads.Remove(P)
+ update_icon()
+ return
+
+ var/obj/item/weapon/computer_hardware/processor_unit/PU = all_components[MC_CPU]
+
+ if(idle_threads.len > PU.max_idle_programs)
+ to_chat(user, "
\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error. ")
+ return 1
+
+ if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet.
+ to_chat(user, "
\The [src]'s screen shows \"Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning. ")
+ return 1
+ if(P.run_program(user))
+ active_program = P
+ update_icon()
+ return 1
+ else
+ return
+
+/obj/item/device/modular_computer/nano_host()
+ if(physical)
+ return physical
+ return src
diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm
new file mode 100644
index 00000000000..7a7d27acd45
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/laptop.dm
@@ -0,0 +1,107 @@
+/obj/item/device/modular_computer/laptop
+ name = "laptop"
+ desc = "A portable laptop computer."
+
+ icon = 'icons/obj/modular_laptop.dmi'
+ icon_state = "laptop-closed"
+ icon_state_powered = "laptop"
+ icon_state_unpowered = "laptop-off"
+ icon_state_menu = "menu"
+
+ hardware_flag = PROGRAM_LAPTOP
+ max_hardware_size = 2
+ w_class = WEIGHT_CLASS_NORMAL
+
+ flags = HANDSLOW // No running around with open laptops in hands.
+
+ screen_on = 0 // Starts closed
+ var/start_open = 1 // unless this var is set to 1
+ var/icon_state_closed = "laptop-closed"
+ var/w_class_open = WEIGHT_CLASS_BULKY
+ var/slowdown_open = 1
+
+/obj/item/device/modular_computer/laptop/New()
+ ..()
+ if(start_open && !screen_on)
+ toggle_open()
+
+/obj/item/device/modular_computer/laptop/update_icon()
+ if(screen_on)
+ ..()
+ else
+ overlays.Cut()
+ icon_state = icon_state_closed
+
+/obj/item/device/modular_computer/laptop/attack_self(mob/user)
+ if(!screen_on)
+ try_toggle_open(user)
+ else
+ return ..()
+
+/obj/item/device/modular_computer/laptop/verb/open_computer()
+ set name = "Toggle Open"
+ set category = "Object"
+ set src in view(1)
+
+ try_toggle_open(usr)
+
+/obj/item/device/modular_computer/laptop/MouseDrop(obj/over_object, src_location, over_location)
+ if(over_object == usr || over_object == src)
+ try_toggle_open(usr)
+ if(ishuman(usr))
+ if(!isturf(loc) || !Adjacent(usr))
+ return
+ if(over_object && !usr.incapacitated())
+ if(!usr.canUnEquip(src))
+ to_chat(usr, "[src] appears stuck on you!")
+ return
+ switch(over_object.name)
+ if("r_hand")
+ usr.unEquip(src)
+ usr.put_in_r_hand(src)
+ if("l_hand")
+ usr.unEquip(src)
+ usr.put_in_l_hand(src)
+
+/obj/item/device/modular_computer/laptop/attack_hand(mob/user)
+ if(screen_on && isturf(loc))
+ return attack_self(user)
+
+ return ..()
+
+
+/obj/item/device/modular_computer/laptop/proc/try_toggle_open(mob/living/user)
+ if(issilicon(user))
+ return
+ if(!isturf(loc) && !ismob(loc)) // No opening it in backpack.
+ return
+ if(user.incapacitated() || !Adjacent(user))
+ return
+
+ toggle_open(user)
+
+
+/obj/item/device/modular_computer/laptop/AltClick(mob/user)
+ if(screen_on) // Close it.
+ try_toggle_open(user)
+ else
+ return ..()
+
+/obj/item/device/modular_computer/laptop/proc/toggle_open(mob/living/user=null)
+ if(screen_on)
+ to_chat(user, "
You close \the [src]. ")
+ slowdown = initial(slowdown)
+ w_class = initial(w_class)
+ else
+ to_chat(user, "
You open \the [src]. ")
+ slowdown = slowdown_open
+ w_class = w_class_open
+
+ screen_on = !screen_on
+ update_icon()
+
+
+
+// Laptop frame, starts empty and closed.
+/obj/item/device/modular_computer/laptop/buildable
+ start_open = 0
diff --git a/code/modules/modular_computers/computers/item/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop_presets.dm
new file mode 100644
index 00000000000..31519e70d6b
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/laptop_presets.dm
@@ -0,0 +1,21 @@
+/obj/item/device/modular_computer/laptop/preset/New()
+ . = ..()
+ install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
+ install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer))
+ install_component(new /obj/item/weapon/computer_hardware/hard_drive)
+ install_component(new /obj/item/weapon/computer_hardware/network_card)
+ install_programs()
+
+
+/obj/item/device/modular_computer/laptop/preset/proc/install_programs()
+ return
+
+
+/obj/item/device/modular_computer/laptop/preset/civillian
+ desc = "A low-end laptop often used for personal recreation."
+
+
+/obj/item/device/modular_computer/laptop/preset/civillian/install_programs()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
+ hard_drive.store_file(new/datum/computer_file/program/chatclient())
+ hard_drive.store_file(new/datum/computer_file/program/nttransfer())
\ No newline at end of file
diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm
new file mode 100644
index 00000000000..3c81c43e824
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/processor.dm
@@ -0,0 +1,74 @@
+// Held by /obj/machinery/modular_computer to reduce amount of copy-pasted code.
+/obj/item/device/modular_computer/processor
+ name = "processing unit"
+ desc = "You shouldn't see this. If you do, report it."
+ icon = null
+ icon_state = null
+ icon_state_unpowered = null
+ icon_state_menu = null
+ hardware_flag = 0
+
+ var/obj/machinery/modular_computer/machinery_computer = null
+
+/obj/item/device/modular_computer/processor/Destroy()
+ . = ..()
+ if(machinery_computer && (machinery_computer.cpu == src))
+ machinery_computer.cpu = null
+ machinery_computer = null
+
+/obj/item/device/modular_computer/processor/New(comp)
+ if(!comp || !istype(comp, /obj/machinery/modular_computer))
+ CRASH("Inapropriate type passed to obj/item/device/modular_computer/processor/New()! Aborting.")
+ return
+ // Obtain reference to machinery computer
+ all_components = list()
+ idle_threads = list()
+ machinery_computer = comp
+ machinery_computer.cpu = src
+ hardware_flag = machinery_computer.hardware_flag
+ max_hardware_size = machinery_computer.max_hardware_size
+ steel_sheet_cost = machinery_computer.steel_sheet_cost
+ obj_integrity = machinery_computer.obj_integrity
+ max_integrity = machinery_computer.max_integrity
+ integrity_failure = machinery_computer.integrity_failure
+ base_active_power_usage = machinery_computer.base_active_power_usage
+ base_idle_power_usage = machinery_computer.base_idle_power_usage
+
+/obj/item/device/modular_computer/processor/relay_qdel()
+ qdel(machinery_computer)
+
+/obj/item/device/modular_computer/processor/update_icon()
+ if(machinery_computer)
+ return machinery_computer.update_icon()
+
+// This thing is not meant to be used on it's own, get topic data from our machinery owner.
+//obj/item/device/modular_computer/processor/canUseTopic(user, state)
+// if(!machinery_computer)
+// return 0
+
+// return machinery_computer.canUseTopic(user, state)
+
+/obj/item/device/modular_computer/processor/shutdown_computer()
+ if(!machinery_computer)
+ return
+ ..()
+ machinery_computer.update_icon()
+ return
+
+/obj/item/device/modular_computer/processor/add_verb(path)
+ switch(path)
+ if(MC_CARD)
+ machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_id
+ if(MC_SDD)
+ machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_disk
+ if(MC_AI)
+ machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_card
+
+/obj/item/device/modular_computer/processor/remove_verb(path)
+ switch(path)
+ if(MC_CARD)
+ machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_id
+ if(MC_SDD)
+ machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_disk
+ if(MC_AI)
+ machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_card
\ No newline at end of file
diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm
new file mode 100644
index 00000000000..6a2b5674a5b
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/tablet.dm
@@ -0,0 +1,12 @@
+/obj/item/device/modular_computer/tablet //Its called tablet for theme of 90ies but actually its a "big smartphone" sized
+ name = "tablet computer"
+ icon = 'icons/obj/modular_tablet.dmi'
+ icon_state = "tablet"
+ icon_state_unpowered = "tablet"
+ icon_state_powered = "tablet"
+ icon_state_menu = "menu"
+ hardware_flag = PROGRAM_TABLET
+ max_hardware_size = 1
+ w_class = WEIGHT_CLASS_SMALL
+ steel_sheet_cost = 1
+ slot_flags = SLOT_ID | SLOT_BELT
\ No newline at end of file
diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm
new file mode 100644
index 00000000000..6ac9ed4063b
--- /dev/null
+++ b/code/modules/modular_computers/computers/item/tablet_presets.dm
@@ -0,0 +1,29 @@
+
+// This is literally the worst possible cheap tablet
+/obj/item/device/modular_computer/tablet/preset/cheap
+ desc = "A low-end tablet often seen among low ranked station personnel."
+
+/obj/item/device/modular_computer/tablet/preset/cheap/New()
+ . = ..()
+ install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
+ install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer/micro))
+ install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
+ install_component(new /obj/item/weapon/computer_hardware/network_card)
+
+// Alternative version, an average one, for higher ranked positions mostly
+/obj/item/device/modular_computer/tablet/preset/advanced/New()
+ . = ..()
+ install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
+ install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer))
+ install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
+ install_component(new /obj/item/weapon/computer_hardware/network_card)
+ install_component(new /obj/item/weapon/computer_hardware/card_slot)
+ install_component(new /obj/item/weapon/computer_hardware/printer/mini)
+
+/obj/item/device/modular_computer/tablet/preset/cargo/New()
+ . = ..()
+ install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
+ install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer))
+ install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
+ install_component(new /obj/item/weapon/computer_hardware/network_card)
+ install_component(new /obj/item/weapon/computer_hardware/printer/mini)
diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm
new file mode 100644
index 00000000000..3f9d3de11ca
--- /dev/null
+++ b/code/modules/modular_computers/computers/machinery/console_presets.dm
@@ -0,0 +1,75 @@
+/obj/machinery/modular_computer/console/preset
+ // Can be changed to give devices specific hardware
+ var/_has_id_slot = 0
+ var/_has_printer = 0
+ var/_has_battery = 0
+ var/_has_ai = 0
+
+/obj/machinery/modular_computer/console/preset/New()
+ . = ..()
+ if(!cpu)
+ return
+ cpu.install_component(new /obj/item/weapon/computer_hardware/processor_unit)
+
+ if(_has_id_slot)
+ cpu.install_component(new /obj/item/weapon/computer_hardware/card_slot)
+ if(_has_printer)
+ cpu.install_component(new /obj/item/weapon/computer_hardware/printer)
+ if(_has_battery)
+ cpu.install_component(new /obj/item/weapon/computer_hardware/battery(cpu, /obj/item/weapon/stock_parts/cell/computer/super))
+ if(_has_ai)
+ cpu.install_component(new /obj/item/weapon/computer_hardware/ai_slot)
+ install_programs()
+
+// Override in child types to install preset-specific programs.
+/obj/machinery/modular_computer/console/preset/proc/install_programs()
+ return
+
+
+
+// ===== ENGINEERING CONSOLE =====
+/obj/machinery/modular_computer/console/preset/engineering
+ console_department = "Engineering"
+ desc = "A stationary computer. This one comes preloaded with engineering programs."
+
+/obj/machinery/modular_computer/console/preset/engineering/install_programs()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
+ hard_drive.store_file(new/datum/computer_file/program/power_monitor())
+ hard_drive.store_file(new/datum/computer_file/program/alarm_monitor())
+
+// ===== RESEARCH CONSOLE =====
+/obj/machinery/modular_computer/console/preset/research
+ console_department = "Research"
+ desc = "A stationary computer. This one comes preloaded with research programs."
+ _has_ai = 1
+
+/obj/machinery/modular_computer/console/preset/research/install_programs()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
+ hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor())
+ hard_drive.store_file(new/datum/computer_file/program/nttransfer())
+ hard_drive.store_file(new/datum/computer_file/program/chatclient())
+ hard_drive.store_file(new/datum/computer_file/program/aidiag())
+
+
+// ===== COMMAND CONSOLE =====
+/obj/machinery/modular_computer/console/preset/command
+ console_department = "Command"
+ desc = "A stationary computer. This one comes preloaded with command programs."
+ _has_id_slot = 1
+ _has_printer = 1
+
+/obj/machinery/modular_computer/console/preset/command/install_programs()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
+ hard_drive.store_file(new/datum/computer_file/program/chatclient())
+ hard_drive.store_file(new/datum/computer_file/program/card_mod())
+ hard_drive.store_file(new/datum/computer_file/program/comm())
+
+// ===== CIVILIAN CONSOLE =====
+/obj/machinery/modular_computer/console/preset/civilian
+ console_department = "Civilian"
+ desc = "A stationary computer. This one comes preloaded with generic programs."
+
+/obj/machinery/modular_computer/console/preset/civilian/install_programs()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
+ hard_drive.store_file(new/datum/computer_file/program/chatclient())
+ hard_drive.store_file(new/datum/computer_file/program/nttransfer())
\ No newline at end of file
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
new file mode 100644
index 00000000000..9e07fc19ddb
--- /dev/null
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -0,0 +1,158 @@
+// Global var to track modular computers
+var/list/global_modular_computers = list()
+
+// Modular Computer - device that runs various programs and operates with hardware
+// DO NOT SPAWN THIS TYPE. Use /laptop/ or /console/ instead.
+/obj/machinery/modular_computer
+ name = "modular computer"
+ desc = "An advanced computer."
+
+ use_power = 1
+ idle_power_usage = 5
+ var/hardware_flag = 0 // A flag that describes this device type
+ var/last_power_usage = 0 // Power usage during last tick
+
+ // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..)
+ // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently
+ // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example.
+
+ icon = null
+ icon_state = null
+ var/icon_state_unpowered = null // Icon state when the computer is turned off.
+ var/icon_state_powered = null // Icon state when the computer is turned on.
+ var/screen_icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen.
+ var/screen_icon_screensaver = "standby" // Icon state overlay when the computer is powered, but not 'switched on'.
+ var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed.
+ var/steel_sheet_cost = 10 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
+ var/light_strength = 0 // Light luminosity when turned on
+ var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
+ var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
+
+ var/obj_integrity = 300
+ var/integrity_failure = 150
+ var/max_integrity = 300
+
+ var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
+
+/obj/machinery/modular_computer/New()
+ ..()
+ cpu = new(src)
+ cpu.physical = src
+ global_modular_computers.Add(src)
+
+/obj/machinery/modular_computer/Destroy()
+ QDEL_NULL(cpu)
+ return ..()
+
+/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
+ if(cpu)
+ cpu.attack_ghost(user)
+
+/obj/machinery/modular_computer/emag_act(mob/user)
+ return cpu ? cpu.emag_act(user) : 1
+
+/obj/machinery/modular_computer/update_icon()
+ overlays.Cut()
+ icon_state = icon_state_powered
+
+ if(!cpu || !cpu.enabled)
+ if (!(stat & NOPOWER) && (cpu && cpu.use_power()))
+ overlays += screen_icon_screensaver
+ else
+ icon_state = icon_state_unpowered
+ set_light(0)
+ else
+ set_light(light_strength)
+ if(cpu.active_program)
+ overlays += cpu.active_program.program_icon_state ? cpu.active_program.program_icon_state : screen_icon_state_menu
+ else
+ overlays += screen_icon_state_menu
+
+ if(cpu && cpu.obj_integrity <= cpu.integrity_failure)
+ overlays += "bsod"
+ overlays += "broken"
+
+// Eject ID card from computer, if it has ID slot with card inside.
+/obj/machinery/modular_computer/proc/eject_id()
+ set name = "Eject ID"
+ set category = "Object"
+
+ if(cpu)
+ cpu.eject_id()
+
+// Eject ID card from computer, if it has ID slot with card inside.
+/obj/machinery/modular_computer/proc/eject_disk()
+ set name = "Eject Data Disk"
+ set category = "Object"
+
+ if(cpu)
+ cpu.eject_disk()
+
+/obj/machinery/modular_computer/proc/eject_card()
+ set name = "Eject Intellicard"
+ set category = "Object"
+ set src in view(1)
+
+ if(cpu)
+ cpu.eject_card()
+
+/obj/machinery/modular_computer/AltClick(mob/user)
+ if(cpu)
+ cpu.AltClick(user)
+
+// On-click handling. Turns on the computer if it's off and opens the GUI.
+/obj/machinery/modular_computer/attack_hand(mob/user)
+ if(cpu)
+ cpu.attack_self(user) // CPU is an item, that's why we route attack_hand to attack_self
+
+// Process currently calls handle_power(), may be expanded in future if more things are added.
+/obj/machinery/modular_computer/process()
+ if(cpu)
+ // Keep names in sync.
+ cpu.name = src.name
+ cpu.process()
+
+// Used in following function to reduce copypaste
+/obj/machinery/modular_computer/proc/power_failure(malfunction = 0)
+ var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
+ if(cpu && cpu.enabled) // Shut down the computer
+ visible_message("
\The [src]'s screen flickers [battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly. ")
+ if(cpu)
+ cpu.shutdown_computer(0)
+ stat |= NOPOWER
+ update_icon()
+
+
+// Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us.
+/obj/machinery/modular_computer/power_change()
+ if(cpu && cpu.use_power()) // If MC_CPU still has a power source, PC wouldn't go offline.
+ stat &= ~NOPOWER
+ update_icon()
+ return
+ ..()
+ update_icon()
+
+/obj/machinery/modular_computer/attackby(obj/item/weapon/W, mob/user)
+ if(cpu)
+ return cpu.attackby(W, user)
+ return ..()
+
+
+// Stronger explosions cause serious damage to internal components
+// Minor explosions are mostly mitigitated by casing.
+/obj/machinery/modular_computer/ex_act(severity)
+ if(cpu)
+ cpu.ex_act(severity)
+ ..()
+
+// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components
+/obj/machinery/modular_computer/emp_act(severity)
+ if(cpu)
+ cpu.emp_act(severity)
+
+// "Stun" weapons can cause minor damage to components (short-circuits?)
+// "Burn" damage is equally strong against internal components and exterior casing
+// "Brute" damage mostly damages the casing.
+/obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj)
+ if(cpu)
+ cpu.bullet_act(Proj)
diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm
new file mode 100644
index 00000000000..2c330913353
--- /dev/null
+++ b/code/modules/modular_computers/computers/machinery/modular_console.dm
@@ -0,0 +1,54 @@
+/obj/machinery/modular_computer/console
+ name = "console"
+ desc = "A stationary computer."
+
+ icon = 'icons/obj/modular_console.dmi'
+ icon_state = "console"
+ icon_state_powered = "console"
+ icon_state_unpowered = "console-off"
+ screen_icon_state_menu = "menu"
+ hardware_flag = PROGRAM_CONSOLE
+ anchored = 1
+ density = 1
+ base_idle_power_usage = 100
+ base_active_power_usage = 500
+ max_hardware_size = 4
+ steel_sheet_cost = 10
+ light_strength = 2
+ obj_integrity = 300
+ max_integrity = 300
+ integrity_failure = 150
+
+ var/console_department = "" // Used in New() to set network tag according to our area.
+ var/components = TRUE // Install basic components?
+
+/obj/machinery/modular_computer/console/buildable
+ components = FALSE
+
+/obj/machinery/modular_computer/console/New()
+ ..()
+ var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
+ if(battery_module)
+ qdel(battery_module)
+
+ if(components)
+ var/obj/item/weapon/computer_hardware/network_card/wired/network_card = new()
+
+ cpu.install_component(network_card)
+ cpu.install_component(new /obj/item/weapon/computer_hardware/recharger/APC)
+ cpu.install_component(new /obj/item/weapon/computer_hardware/hard_drive/super) // Consoles generally have better HDDs due to lower space limitations
+
+ var/area/A = get_area(src)
+ // Attempts to set this console's tag according to our area. Since some areas have stuff like "XX - YY" in their names we try to remove that too.
+ if(A && console_department)
+ network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_"
+ else if(A)
+ network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_")
+ else if(console_department)
+ network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_")
+ else
+ network_card.identification_string = "Unknown Console"
+
+ if(cpu)
+ cpu.screen_on = 1
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/modular_computers/documentation.md b/code/modules/modular_computers/documentation.md
new file mode 100644
index 00000000000..88d8602729d
--- /dev/null
+++ b/code/modules/modular_computers/documentation.md
@@ -0,0 +1,45 @@
+
+
+#Modular computer programs
+Ok. so a quick rundown on how to make a program. This is kind of a shitty documentation, but oh well I was asked to.
+
+
+## Base setup
+This is how the base program is setup. the rest is mostly tgui stuff. I'll use the ntnetmonitor as a base
+
+
+```DM
+/datum/computer_file/program/ntnetmonitor
+ filename = "ntmonitor" //This is obviously the name of the file itself. not much to be said
+ filedesc = "NTNet Diagnostics and Monitoring" // This is sort of the official name. it's what shows up on the main menu
+ program_icon_state = "comm_monitor" // This is what the screen will look like when the program is active
+ extended_desc = "This program is a dummy. // This is a sort of a description, visible when looking on the ntnet
+ size = 12 // size of the program. Big programs need more hard drive space. Don't make it too big though.
+ requires_ntnet = 1 // If this is set, the program will not run without an ntnet connection, and will close if the connection is lost. Mainly for primarily online programs.
+ required_access = access_network //This is access required to run the program itself. ONLY SET THIS FOR SUPER SECURE SHIT. This also acts as transfer_access as well.
+ transfer_access = access_change_ids // This is the access needed to download from ntnet or host on the ptp program. This is what you want to use most of the time.
+ available_on_ntnet = 1 //If it's available to download on ntnet. pretty self explanatory.
+ available_on_syndinet = 0 // ditto but on emagged syndie net. Use this for antag programs
+ usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
+ //^^- The comment above sorta explains it. Use this to limit what kind of machines can run the program. For example, comms program should be limited to consoles and laptops.
+ var/ui_header = "downloader_finished.gif" //This one is kinda cool. If you have the program minimized, this will show up in the header of the computer screen.
+ //you can even have the program change what the header is based on the situation! see alarm.dm for an example.
+```
+
+##Preinstalls
+Now. for pre-installing stuff.
+
+Primarily done for consoles, there's an install_programs() proc in the console presets file in the machines folder.
+
+for example, the command console one.
+
+```DM
+/obj/machinery/modular_computer/console/preset/command/install_programs()
+ cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient())
+ cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod())
+```
+Basically, you want to do cpu.hard_drive.store_file(new/*program path here*()) and put it in the subtype's install_programs().
+Probably pretty self explanatory, but just in case.
+
+Will probably be expanded when new features come around or I get asked to mention something.
+
diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm
new file mode 100644
index 00000000000..40860cb58e0
--- /dev/null
+++ b/code/modules/modular_computers/file_system/computer_file.dm
@@ -0,0 +1,39 @@
+var/global/file_uid = 0
+
+/datum/computer_file
+ var/filename = "NewFile" // Placeholder. No spacebars
+ var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case
+ var/size = 1 // File size in GQ. Integers only!
+ var/obj/item/weapon/computer_hardware/hard_drive/holder // Holder that contains this file.
+ var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means.
+ var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc.
+ var/uid // UID of this file
+
+/datum/computer_file/New()
+ ..()
+ uid = file_uid
+ file_uid++
+
+/datum/computer_file/Destroy()
+ if(!holder)
+ return ..()
+
+ holder.remove_file(src)
+ // holder.holder is the computer that has drive installed. If we are Destroy()ing program that's currently running kill it.
+ if(holder.holder && holder.holder.active_program == src)
+ holder.holder.kill_program(forced = TRUE)
+ holder = null
+ return ..()
+
+// Returns independent copy of this file.
+/datum/computer_file/proc/clone(rename = 0)
+ var/datum/computer_file/temp = new type
+ temp.unsendable = unsendable
+ temp.undeletable = undeletable
+ temp.size = size
+ if(rename)
+ temp.filename = filename + "(Copy)"
+ else
+ temp.filename = filename
+ temp.filetype = filetype
+ return temp
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/data.dm b/code/modules/modular_computers/file_system/data.dm
new file mode 100644
index 00000000000..32ef6f53dd1
--- /dev/null
+++ b/code/modules/modular_computers/file_system/data.dm
@@ -0,0 +1,20 @@
+// /data/ files store data in string format.
+// They don't contain other logic for now.
+/datum/computer_file/data
+ var/stored_data = "" // Stored data in string format.
+ filetype = "DAT"
+ var/block_size = 250
+ var/do_not_edit = 0 // Whether the user will be reminded that the file probably shouldn't be edited.
+
+/datum/computer_file/data/clone()
+ var/datum/computer_file/data/temp = ..()
+ temp.stored_data = stored_data
+ return temp
+
+// Calculates file size from amount of characters in saved string
+/datum/computer_file/data/proc/calculate_size()
+ size = max(1, round(length(stored_data) / block_size))
+
+/datum/computer_file/data/logfile
+ filetype = "LOG"
+
diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm
new file mode 100644
index 00000000000..8d917e4cb81
--- /dev/null
+++ b/code/modules/modular_computers/file_system/program.dm
@@ -0,0 +1,200 @@
+// /program/ files are executable programs that do things.
+/datum/computer_file/program
+ filetype = "PRG"
+ filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET!
+ var/required_access = null // List of required accesses to *run* the program.
+ var/transfer_access = null // List of required access to download or file host the program
+ var/program_state = PROGRAM_STATE_KILLED// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running.
+ var/obj/item/device/modular_computer/computer // Device that runs this program.
+ var/filedesc = "Unknown Program" // User-friendly name of this program.
+ var/extended_desc = "N/A" // Short description of this program's function.
+ var/program_icon_state = null // Program-specific screen icon state
+ var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes.
+ var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION)
+ var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
+ var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
+ var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging.
+ var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable.
+ var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable.
+ var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /icons/program_icons. Be careful not to use too large images!
+
+/datum/computer_file/program/New(obj/item/device/modular_computer/comp = null)
+ ..()
+ if(comp && istype(comp))
+ computer = comp
+
+/datum/computer_file/program/Destroy()
+ computer = null
+ . = ..()
+
+/datum/computer_file/program/clone()
+ var/datum/computer_file/program/temp = ..()
+ temp.required_access = required_access
+ temp.filedesc = filedesc
+ temp.program_icon_state = program_icon_state
+ temp.requires_ntnet = requires_ntnet
+ temp.requires_ntnet_feature = requires_ntnet_feature
+ temp.usage_flags = usage_flags
+ return temp
+
+// Relays icon update to the computer.
+/datum/computer_file/program/proc/update_computer_icon()
+ if(computer)
+ computer.update_icon()
+
+// Attempts to create a log in global ntnet datum. Returns 1 on success, 0 on fail.
+/datum/computer_file/program/proc/generate_network_log(text)
+ if(computer)
+ return computer.add_log(text)
+ return 0
+
+/datum/computer_file/program/proc/is_supported_by_hardware(hardware_flag = 0, loud = 0, mob/user = null)
+ if(!(hardware_flag & usage_flags))
+ if(loud && computer && user)
+ to_chat(user, "
\The [computer] flashes an \"Hardware Error - Incompatible software\" warning. ")
+ return 0
+ return 1
+
+/datum/computer_file/program/proc/get_signal(specific_action = 0)
+ if(computer)
+ return computer.get_ntnet_status(specific_action)
+ return 0
+
+// Called by Process() on device that runs us, once every tick.
+/datum/computer_file/program/proc/process_tick()
+ return 1
+
+// Check if the user can run program. Only humans can operate computer. Automatically called in run_program()
+// User has to wear their ID for ID Scan to work.
+// Can also be called manually, with optional parameter being access_to_check to scan the user's ID
+/datum/computer_file/program/proc/can_run(mob/user, loud = 0, access_to_check, transfer = 0)
+ // Defaults to required_access
+ if(!access_to_check)
+ if(transfer && transfer_access)
+ access_to_check = transfer_access
+ else
+ access_to_check = required_access
+ if(!access_to_check) // No required_access, allow it.
+ return 1
+
+ if(!transfer && computer && computer.emagged) //emags can bypass the execution locks but not the download ones.
+ return 1
+
+ if(user.can_admin_interact())
+ return 1
+
+ if(issilicon(user))
+ return 1
+
+ if(ishuman(user))
+ var/obj/item/weapon/card/id/D
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot
+ if(computer && card_slot)
+ card_slot = computer.all_components[MC_CARD]
+ D = card_slot.GetID()
+ var/mob/living/carbon/human/h = user
+ var/obj/item/weapon/card/id/I = h.get_idcard()
+ var/obj/item/weapon/card/id/C = h.get_active_hand()
+ if(C)
+ C = C.GetID()
+ if(!(C && istype(C)))
+ C = null
+
+ if(!I && !C && !D)
+ if(loud)
+ to_chat(user, "
\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning. ")
+ return 0
+
+ if(I)
+ if(access_to_check in I.GetAccess())
+ return 1
+ else if(C)
+ if(access_to_check in C.GetAccess())
+ return 1
+ else if(D)
+ if(access_to_check in D.GetAccess())
+ return 1
+ if(loud)
+ to_chat(user, "
\The [computer] flashes an \"Access Denied\" warning. ")
+ return 0
+
+// This attempts to retrieve header data for UIs. If implementing completely new device of different type than existing ones
+// always include the device here in this proc. This proc basically relays the request to whatever is running the program.
+/datum/computer_file/program/proc/get_header_data()
+ if(computer)
+ return computer.get_header_data()
+ return list()
+
+// This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure.
+// When implementing new program based device, use this to run the program.
+/datum/computer_file/program/proc/run_program(mob/living/user)
+ if(can_run(user, 1))
+ if(requires_ntnet && network_destination)
+ generate_network_log("Connection opened to [network_destination].")
+ program_state = PROGRAM_STATE_ACTIVE
+ return 1
+ return 0
+
+// Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client.
+/datum/computer_file/program/proc/kill_program(forced = FALSE)
+ program_state = PROGRAM_STATE_KILLED
+ computer.update_icon()
+ if(network_destination)
+ generate_network_log("Connection to [network_destination] closed.")
+ return 1
+
+// This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation.
+
+/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists.
+ return computer.ui_interact(user)
+ return 1
+
+
+// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC:
+// Topic calls are automagically forwarded from NanoModule this program contains.
+// Calls beginning with "PRG_" are reserved for programs handling.
+// Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program)
+// ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE.
+/datum/computer_file/program/Topic(href, list/href_list)
+ if(..())
+ return 1
+
+ var/datum/nanoui/ui = nanomanager.get_open_ui(usr, src, "main")
+
+ if(computer)
+ switch(href_list["action"])
+ if("PC_exit")
+ computer.kill_program()
+ ui.close()
+ return 1
+ if("PC_shutdown")
+ computer.shutdown_computer()
+ ui.close()
+ return 1
+ if("PC_minimize")
+ var/mob/user = usr
+ if(!computer.active_program || !computer.all_components[MC_CPU])
+ return
+
+ computer.idle_threads.Add(computer.active_program)
+ program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs
+
+ computer.active_program = null
+ computer.update_icon()
+ ui.close()
+
+ if(user && istype(user))
+ computer.ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
+
+
+/datum/computer_file/program/nano_host()
+ if(computer.physical)
+ return computer.physical
+ else
+ return computer
+
+/datum/computer_file/program/CanUseTopic(mob/user)
+ if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists.
+ return STATUS_CLOSE
+ return ..()
diff --git a/code/modules/modular_computers/file_system/program_events.dm b/code/modules/modular_computers/file_system/program_events.dm
new file mode 100644
index 00000000000..279d646cfd7
--- /dev/null
+++ b/code/modules/modular_computers/file_system/program_events.dm
@@ -0,0 +1,18 @@
+// Events are sent to the program by the computer.
+// Always include a parent call when overriding an event.
+
+// Called when the ID card is removed from computer. ID is removed AFTER this proc.
+/datum/computer_file/program/proc/event_idremoved(background, slot)
+ return
+
+// Called when the computer fails due to power loss. Override when program wants to specifically react to power loss.
+/datum/computer_file/program/proc/event_powerfailure(background)
+ kill_program(forced = TRUE)
+
+// Called when the network connectivity fails. Computer does necessary checks and only calls this when requires_ntnet_feature and similar variables are not met.
+/datum/computer_file/program/proc/event_networkfailure(background)
+ kill_program(forced = TRUE)
+ if(background)
+ computer.visible_message("
\The [computer]'s screen displays an \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error ")
+ else
+ computer.visible_message("
\The [computer]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error. ")
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm
new file mode 100644
index 00000000000..feaee3be63d
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm
@@ -0,0 +1,103 @@
+/datum/computer_file/program/ntnet_dos
+ filename = "ntn_dos"
+ filedesc = "DoS Traffic Generator"
+ program_icon_state = "hostile"
+ extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against same relay for increased effect"
+ size = 20
+ requires_ntnet = 1
+ available_on_ntnet = 0
+ available_on_syndinet = 1
+ var/obj/machinery/ntnet_relay/target = null
+ var/dos_speed = 0
+ var/error = ""
+ var/executed = 0
+
+/datum/computer_file/program/ntnet_dos/process_tick()
+ dos_speed = 0
+ switch(ntnet_status)
+ if(1)
+ dos_speed = NTNETSPEED_LOWSIGNAL * 10
+ if(2)
+ dos_speed = NTNETSPEED_HIGHSIGNAL * 10
+ if(3)
+ dos_speed = NTNETSPEED_ETHERNET * 10
+ if(target && executed)
+ target.dos_overload += dos_speed
+ if(target.inoperable())
+ target.dos_sources.Remove(src)
+ target = null
+ error = "Connection to destination relay lost."
+
+/datum/computer_file/program/ntnet_dos/kill_program(forced = FALSE)
+ if(target)
+ target.dos_sources.Remove(src)
+ target = null
+ executed = 0
+ ..()
+
+/datum/computer_file/program/ntnet_dos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "ntnet_dos.tmpl", "DoS Traffic Generator", 575, 250)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+
+/datum/computer_file/program/ntnet_dos/Topic(href, list/href_list)
+ if(..())
+ return 1
+ switch(href_list["action"])
+ if("PRG_target_relay")
+ for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays)
+ if("[R.uid]" == href_list["targid"])
+ target = R
+ return 1
+ if("PRG_reset")
+ if(target)
+ target.dos_sources.Remove(src)
+ target = null
+ executed = 0
+ error = ""
+ return 1
+ if("PRG_execute")
+ if(target)
+ executed = 1
+ target.dos_sources.Add(src)
+ if(ntnet_global.intrusion_detection_enabled)
+ var/obj/item/weapon/computer_hardware/network_card/network_card = computer.all_components[MC_NET]
+ ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]")
+ ntnet_global.intrusion_detection_alarm = 1
+ return 1
+
+/datum/computer_file/program/ntnet_dos/ui_data(mob/user)
+ if(!ntnet_global)
+ return
+
+ var/list/data = get_header_data()
+
+ if(error)
+ data["error"] = error
+ else if(target && executed)
+ data["target"] = 1
+ data["speed"] = dos_speed
+
+ // This is mostly visual, generate some strings of 1s and 0s
+ // Probability of 1 is equal of completion percentage of DoS attack on this relay.
+ // Combined with UI updates this adds quite nice effect to the UI
+ var/percentage = target.dos_overload * 100 / target.dos_capacity
+ data["dos_strings"] = list()
+ for(var/j, j<10, j++)
+ var/string = ""
+ for(var/i, i<20, i++)
+ string = "[string][prob(percentage)]"
+ data["dos_strings"] += list(list("nums" = string))
+ else
+ data["relays"] = list()
+ for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays)
+ data["relays"] += list(list("id" = R.uid))
+ data["focus"] = target ? target.uid : null
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
new file mode 100644
index 00000000000..148766ef59d
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -0,0 +1,78 @@
+/datum/computer_file/program/revelation
+ filename = "revelation"
+ filedesc = "Revelation"
+ program_icon_state = "hostile"
+ extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution."
+ size = 13
+ requires_ntnet = 0
+ available_on_ntnet = 0
+ available_on_syndinet = 1
+ var/armed = 0
+
+/datum/computer_file/program/revelation/run_program(var/mob/living/user)
+ . = ..(user)
+ if(armed)
+ activate()
+
+/datum/computer_file/program/revelation/proc/activate()
+ if(computer)
+ computer.visible_message("
\The [computer]'s screen brightly flashes and loud electrical buzzing is heard. ")
+ computer.enabled = 0
+ computer.update_icon()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ var/obj/item/weapon/computer_hardware/battery/battery_module = computer.all_components[MC_CELL]
+ var/obj/item/weapon/computer_hardware/recharger/recharger = computer.all_components[MC_CHARGE]
+ qdel(hard_drive)
+ computer.take_damage(25, BRUTE, 0, 0)
+ if(battery_module && prob(25))
+ qdel(battery_module)
+ computer.visible_message("
\The [computer]'s battery explodes in rain of sparks. ")
+ var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ spark_system.set_up(5, 0, computer.loc)
+ spark_system.start()
+
+ if(recharger && prob(50))
+ qdel(recharger)
+ computer.visible_message("
\The [computer]'s recharger explodes in rain of sparks. ")
+ var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ spark_system.set_up(5, 0, computer.loc)
+ spark_system.start()
+
+
+/datum/computer_file/program/revelation/Topic(href, list/href_list)
+ if(..())
+ return 1
+ switch(href_list["action"])
+ if("PRG_arm")
+ armed = !armed
+ if("PRG_activate")
+ activate()
+ if("PRG_obfuscate")
+ var/mob/living/user = usr
+ var/newname = sanitize(input(user, "Enter new program name: "))
+ if(!newname)
+ return
+ filedesc = newname
+
+
+/datum/computer_file/program/revelation/clone()
+ var/datum/computer_file/program/revelation/temp = ..()
+ temp.armed = armed
+ return temp
+
+/datum/computer_file/program/revelation/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "revelation.tmpl", "Revelation Virus", 575, 250)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/revelation/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ data["armed"] = armed
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm
new file mode 100644
index 00000000000..8cd1043bea6
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/command/card.dm
@@ -0,0 +1,413 @@
+/datum/computer_file/program/card_mod
+ filename = "cardmod"
+ filedesc = "ID card modification program"
+ program_icon_state = "id"
+ extended_desc = "Program for programming employee ID cards to access parts of the station."
+ transfer_access = access_change_ids
+ requires_ntnet = 0
+ size = 8
+ var/is_centcom = 0
+ var/mode = 0
+ var/printing = 0
+
+ //Cooldown for closing positions in seconds
+ //if set to -1: No cooldown... probably a bad idea
+ //if set to 0: Not able to close "original" positions. You can only close positions that you have opened before
+ var/change_position_cooldown = 60
+ //Jobs you cannot open new positions for
+ var/list/blacklisted = list(
+ /datum/job/ai,
+ /datum/job/cyborg,
+ /datum/job/captain,
+ /datum/job/hop,
+ /datum/job/hos,
+ /datum/job/chief_engineer,
+ /datum/job/rd,
+ /datum/job/cmo,
+ /datum/job/judge,
+ /datum/job/blueshield,
+ /datum/job/nanotrasenrep,
+ /datum/job/pilot,
+ /datum/job/brigdoc,
+ /datum/job/mechanic,
+ /datum/job/barber,
+ /datum/job/chaplain,
+ /datum/job/ntnavyofficer,
+ /datum/job/ntspecops,
+ /datum/job/civilian
+ )
+
+ //The scaling factor of max total positions in relation to the total amount of people on board the station in %
+ var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players
+
+ //This is used to keep track of opened positions for jobs to allow instant closing
+ //Assoc array: "JobName" = (int)
+ var/list/opened_positions = list()
+
+/datum/computer_file/program/card_mod/proc/is_authenticated(var/mob/user)
+ if(user.can_admin_interact())
+ return 1
+ if(computer)
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
+ if(card_slot)
+ var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
+ if(auth_card)
+ return check_access(auth_card)
+ return 0
+
+/datum/computer_file/program/card_mod/proc/check_access(obj/item/I)
+ if(access_change_ids in I.GetAccess())
+ return 1
+ return 0
+
+/datum/computer_file/program/card_mod/proc/get_target_rank()
+ if(computer)
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
+ if(card_slot)
+ var/obj/item/weapon/card/id/id_card = card_slot.stored_card
+ if(id_card && id_card.assignment)
+ return id_card.assignment
+ return "Unassigned"
+
+/datum/computer_file/program/card_mod/proc/format_job_slots()
+ var/list/formatted = list()
+ for(var/datum/job/job in job_master.occupations)
+ if(job_blacklisted(job))
+ continue
+ formatted.Add(list(list(
+ "title" = job.title,
+ "current_positions" = job.current_positions,
+ "total_positions" = job.total_positions,
+ "can_open" = can_open_job(job),
+ "can_close" = can_close_job(job))))
+
+ return formatted
+
+/datum/computer_file/program/card_mod/proc/format_card_skins(list/card_skins)
+ var/list/formatted = list()
+ for(var/skin in card_skins)
+ formatted.Add(list(list(
+ "display_name" = get_skin_desc(skin),
+ "skin" = skin)))
+
+ return formatted
+
+
+/datum/computer_file/program/card_mod/proc/job_blacklisted(datum/job/job)
+ return (job.type in blacklisted)
+
+
+//Logic check for if you can open the job
+/datum/computer_file/program/card_mod/proc/can_open_job(datum/job/job)
+ if(job)
+ if(!job_blacklisted(job))
+ if((job.total_positions <= player_list.len * (max_relative_positions / 100)))
+ var/delta = (world.time / 10) - time_last_changed_position
+ if((change_position_cooldown < delta) || (opened_positions[job.title] < 0))
+ return 1
+ return -2
+ return -1
+ return 0
+
+//Logic check for if you can close the job
+/datum/computer_file/program/card_mod/proc/can_close_job(datum/job/job)
+ if(job)
+ if(!job_blacklisted(job))
+ if(job.total_positions > job.current_positions)
+ var/delta = (world.time / 10) - time_last_changed_position
+ if((change_position_cooldown < delta) || (opened_positions[job.title] > 0))
+ return 1
+ return -2
+ return -1
+ return 0
+
+/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs)
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
+ if(!card_slot || !card_slot.stored_card)
+ return null
+ var/obj/item/weapon/card/id/id_card = card_slot.stored_card
+ var/list/formatted = list()
+ for(var/job in jobs)
+ formatted.Add(list(list(
+ "display_name" = replacetext(job, " ", " "),
+ "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned",
+ "job" = job)))
+
+ return formatted
+
+
+/datum/computer_file/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "card_prog.tmpl", "ID card modification program", 775, 700)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/card_mod/Topic(href, href_list)
+ if(..())
+ return 1
+
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot
+ var/obj/item/weapon/computer_hardware/printer/printer
+ if(computer)
+ card_slot = computer.all_components[MC_CARD]
+ printer = computer.all_components[MC_PRINT]
+ if(!card_slot)
+ return
+
+ var/mob/user = usr
+
+ var/obj/item/weapon/card/id/modify = card_slot.stored_card
+ var/obj/item/weapon/card/id/scan = card_slot.stored_card2
+
+ switch(href_list["action"])
+ if("PRG_modify")
+ if(modify)
+ data_core.manifest_modify(modify.registered_name, modify.assignment)
+ modify.name = "[modify.registered_name]'s ID Card ([modify.assignment])"
+ card_slot.try_eject(1, user)
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ if(!usr.drop_item())
+ return
+ I.forceMove(computer)
+ card_slot.stored_card = I
+
+ if("PRG_scan")
+ if(scan)
+ card_slot.try_eject(2, user)
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ if(!usr.drop_item())
+ return
+ I.forceMove(computer)
+ card_slot.stored_card2 = I
+
+ if("PRG_access")
+ if(href_list["allowed"])
+ if(is_authenticated(usr))
+ var/access_type = text2num(href_list["access_target"])
+ var/access_allowed = text2num(href_list["allowed"])
+ if(access_type in (is_centcom ? get_all_centcom_access() : get_all_accesses()))
+ modify.access -= access_type
+ if(!access_allowed)
+ modify.access += access_type
+
+ if("PRG_skin")
+ var/skin = href_list["skin_target"]
+ if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom)))
+ modify.icon_state = href_list["skin_target"]
+
+ if("PRG_assign")
+ if(is_authenticated(usr) && modify)
+ var/t1 = href_list["assign_target"]
+ if(t1 == "Custom")
+ var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
+ //let custom jobs function as an impromptu alt title, mainly for sechuds
+ if(temp_t && modify)
+ modify.assignment = temp_t
+ else
+ var/list/access = list()
+ if(is_centcom)
+ access = get_centcom_access(t1)
+ else
+ var/datum/job/jobdatum
+ for(var/jobtype in typesof(/datum/job))
+ var/datum/job/J = new jobtype
+ if(ckey(J.title) == ckey(t1))
+ jobdatum = J
+ break
+ if(!jobdatum)
+ to_chat(usr, "\red No log exists for this job: [t1]")
+ return
+
+ access = jobdatum.get_access()
+
+ modify.access = access
+ modify.assignment = t1
+ modify.rank = t1
+
+ callHook("reassign_employee", list(modify))
+
+ if("PRG_reg")
+ if(is_authenticated(usr))
+ var/temp_name = reject_bad_name(href_list["reg"])
+ if(temp_name)
+ modify.registered_name = temp_name
+ else
+ computer.visible_message("[src] buzzes rudely. ")
+
+ if("PRG_account")
+ if(is_authenticated(usr))
+ var/account_num = text2num(href_list["account"])
+ modify.associated_account_number = account_num
+
+ if("PRG_mode")
+ mode = text2num(href_list["mode_target"])
+
+ if("PRG_print")
+ if(!printing && computer)
+ printing = 1
+ playsound(computer.loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
+ spawn(50)
+ printing = 0
+ nanomanager.update_uis(src)
+ var/title
+ var/content
+ if(mode == 2)
+ title = "crew manifest ([worldtime2text()])"
+ content = "Crew Manifest [data_core ? data_core.get_manifest(0) : ""]"
+ else if(modify && !mode)
+ title = "access report"
+ content = {"Access Report
+ Prepared By: [scan && scan.registered_name ? scan.registered_name : "Unknown"]
+ For: [modify.registered_name ? modify.registered_name : "Unregistered"]
+
+ Assignment: [modify.assignment]
+ Account Number: #[modify.associated_account_number]
+ Blood Type: [modify.blood_type]
+ Access: "}
+
+ var/first = 1
+ for(var/A in modify.access)
+ content += "[first ? "" : ", "][get_access_desc(A)]"
+ first = 0
+ content += "
"
+
+ if(content)
+ if(!printer.print_text(content, title))
+ to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper. ")
+ return 1
+ else
+ computer.visible_message("\The [computer] prints out paper. ")
+
+ if("PRG_terminate")
+ if(is_authenticated(usr))
+ modify.assignment = "Terminated"
+ modify.access = list()
+
+ callHook("terminate_employee", list(modify))
+
+ if("PRG_make_job_available")
+ // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
+ if(is_authenticated(usr))
+ var/edit_job_target = href_list["job"]
+ var/datum/job/j = job_master.GetJob(edit_job_target)
+ if(!j)
+ return 1
+ if(can_open_job(j) != 1)
+ return 1
+ if(opened_positions[edit_job_target] >= 0)
+ time_last_changed_position = world.time / 10
+ j.total_positions++
+ opened_positions[edit_job_target]++
+ log_game("[key_name(usr)] has opened a job slot for job \"[j]\".")
+
+ if("PRG_make_job_unavailable")
+ // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS
+ if(is_authenticated(usr))
+ var/edit_job_target = href_list["job"]
+ var/datum/job/j = job_master.GetJob(edit_job_target)
+ if(!j)
+ return 1
+ if(can_close_job(j) != 1)
+ return 1
+ //Allow instant closing without cooldown if a position has been opened before
+ if(opened_positions[edit_job_target] <= 0)
+ time_last_changed_position = world.time / 10
+ j.total_positions--
+ opened_positions[edit_job_target]--
+ log_game("[key_name(usr)] has closed a job slot for job \"[j]\".")
+
+ if(modify)
+ modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
+
+ nanomanager.update_uis(src)
+ return 1
+
+/datum/computer_file/program/card_mod/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ var/obj/item/weapon/card/id/modify = null
+ var/obj/item/weapon/card/id/scan = null
+
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot
+ var/obj/item/weapon/computer_hardware/printer/printer
+ if(computer)
+ card_slot = computer.all_components[MC_CARD]
+ printer = computer.all_components[MC_PRINT]
+ if(card_slot)
+ modify = card_slot.stored_card
+ scan = card_slot.stored_card2
+
+ data["src"] = UID()
+ data["station_name"] = station_name()
+ data["mode"] = mode
+ data["printing"] = printing
+ data["printer"] = printer ? TRUE : FALSE
+ data["manifest"] = data_core ? data_core.get_manifest(0) : null
+ data["target_name"] = modify ? modify.name : "-----"
+ data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----"
+ data["target_rank"] = get_target_rank()
+ data["scan_name"] = scan ? scan.name : "-----"
+ data["authenticated"] = is_authenticated(user)
+ data["has_modify"] = !!modify
+ data["account_number"] = modify ? modify.associated_account_number : null
+ data["centcom_access"] = is_centcom
+ data["all_centcom_access"] = null
+ data["regions"] = null
+
+ data["engineering_jobs"] = format_jobs(engineering_positions)
+ data["medical_jobs"] = format_jobs(medical_positions)
+ data["science_jobs"] = format_jobs(science_positions)
+ data["security_jobs"] = format_jobs(security_positions)
+ data["support_jobs"] = format_jobs(support_positions)
+ data["civilian_jobs"] = format_jobs(civilian_positions)
+ data["special_jobs"] = format_jobs(whitelisted_positions)
+ data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
+ data["card_skins"] = format_card_skins(get_station_card_skins())
+
+ data["job_slots"] = format_job_slots()
+
+ var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - time_last_changed_position), 1)
+ var/mins = round(time_to_wait / 60)
+ var/seconds = time_to_wait - (60*mins)
+ data["cooldown_mins"] = mins
+ data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds
+
+ if(modify)
+ data["current_skin"] = modify.icon_state
+
+ if(modify && is_centcom)
+ var/list/all_centcom_access = list()
+ for(var/access in get_all_centcom_access())
+ all_centcom_access.Add(list(list(
+ "desc" = replacetext(get_centcom_access_desc(access), " ", " "),
+ "ref" = access,
+ "allowed" = (access in modify.access) ? 1 : 0)))
+
+ data["all_centcom_access"] = all_centcom_access
+ data["all_centcom_skins"] = format_card_skins(get_centcom_card_skins())
+
+ else if(modify)
+ var/list/regions = list()
+ for(var/i = 1; i <= 7; i++)
+ var/list/accesses = list()
+ for(var/access in get_region_accesses(i))
+ if(get_access_desc(access))
+ accesses.Add(list(list(
+ "desc" = replacetext(get_access_desc(access), " ", " "),
+ "ref" = access,
+ "allowed" = (access in modify.access) ? 1 : 0)))
+
+ regions.Add(list(list(
+ "name" = get_region_accesses_name(i),
+ "accesses" = accesses)))
+
+ data["regions"] = regions
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/command/comms.dm b/code/modules/modular_computers/file_system/programs/command/comms.dm
new file mode 100644
index 00000000000..84cc2ec130a
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/command/comms.dm
@@ -0,0 +1,402 @@
+/datum/computer_file/program/comm
+ filename = "comm"
+ filedesc = "Command and communications"
+ program_icon_state = "comm"
+ extended_desc = "Used to command and control the station. Can relay long-range communications. This program can not be run on tablet computers."
+ required_access = access_heads
+ requires_ntnet = 1
+ size = 12
+ usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
+ network_destination = "station long-range communication array"
+
+ var/authenticated = COMM_AUTHENTICATION_NONE
+ var/list/messagetitle = list()
+ var/list/messagetext = list()
+ var/currmsg = 0
+ var/aicurrmsg = 0
+ var/menu_state = COMM_SCREEN_MAIN
+ var/ai_menu_state = COMM_SCREEN_MAIN
+ var/message_cooldown = 0
+ var/centcomm_message_cooldown = 0
+ var/tmp_alertlevel = 0
+
+ var/status_display_freq = "1435"
+ var/stat_msg1
+ var/stat_msg2
+ var/display_type="blank"
+
+ var/datum/announcement/priority/crew_announcement = new
+
+/datum/computer_file/program/comm/New()
+ shuttle_caller_list += src
+ ..()
+ crew_announcement.newscast = 0
+
+/datum/computer_file/program/comm/Destroy()
+ shuttle_caller_list -= src
+ shuttle_master.autoEvac()
+ return ..()
+
+/datum/computer_file/program/comm/proc/is_authenticated(mob/user, loud = 1)
+ if(authenticated == COMM_AUTHENTICATION_MAX)
+ return COMM_AUTHENTICATION_MAX
+ else if(user.can_admin_interact())
+ return COMM_AUTHENTICATION_MAX
+ else if(authenticated)
+ return COMM_AUTHENTICATION_MIN
+ else
+ if(loud)
+ to_chat(user, "Access denied. ")
+ return COMM_AUTHENTICATION_NONE
+
+/datum/computer_file/program/comm/proc/change_security_level(mob/user, new_level)
+ tmp_alertlevel = new_level
+ var/old_level = security_level
+ if(!tmp_alertlevel)
+ tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel < SEC_LEVEL_GREEN)
+ tmp_alertlevel = SEC_LEVEL_GREEN
+ if(tmp_alertlevel > SEC_LEVEL_BLUE)
+ tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this
+ set_security_level(tmp_alertlevel)
+ if(security_level != old_level)
+ log_game("[key_name(user)] has changed the security level to [get_security_level()].")
+ message_admins("[key_name_admin(user)] has changed the security level to [get_security_level()].")
+ switch(security_level)
+ if(SEC_LEVEL_GREEN)
+ feedback_inc("alert_comms_green", 1)
+ if(SEC_LEVEL_BLUE)
+ feedback_inc("alert_comms_blue", 1)
+ tmp_alertlevel = 0
+
+/datum/computer_file/program/comm/proc/setCurrentMessage(mob/user, value)
+ if(isAI(user) || isrobot(user))
+ aicurrmsg = value
+ else
+ currmsg = value
+
+/datum/computer_file/program/comm/proc/getCurrentMessage(mob/user)
+ if(isAI(user) || isrobot(user))
+ return aicurrmsg
+ else
+ return currmsg
+
+/datum/computer_file/program/comm/proc/setMenuState(mob/user, value)
+ if(isAI(user) || isrobot(user))
+ ai_menu_state=value
+ else
+ menu_state=value
+
+/datum/computer_file/program/comm/proc/getMenuState(mob/user)
+ if(isAI(user) || isrobot(user))
+ return ai_menu_state
+ else
+ return menu_state
+
+/datum/computer_file/program/comm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "comm_program.tmpl", "Command and communications program", 575, 500)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/comm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/list/data = get_header_data()
+ data["is_ai"] = isAI(user) || isrobot(user)
+ data["menu_state"] = data["is_ai"] ? ai_menu_state : menu_state
+ data["emagged"] = computer ? computer.emagged : null
+ data["authenticated"] = is_authenticated(user, 0)
+ data["screen"] = getMenuState(usr)
+
+ data["stat_display"] = list(
+ "type" = display_type,
+ "line_1" = (stat_msg1 ? stat_msg1 : "-----"),
+ "line_2" = (stat_msg2 ? stat_msg2 : "-----"),
+
+ "presets" = list(
+ list("name" = "blank", "label" = "Clear", "desc" = "Blank slate"),
+ list("name" = "shuttle", "label" = "Shuttle ETA", "desc" = "Display how much time is left."),
+ list("name" = "message", "label" = "Message", "desc" = "A custom message.")
+ ),
+
+ "alerts"=list(
+ list("alert" = "default", "label" = "Nanotrasen", "desc" = "Oh god."),
+ list("alert" = "redalert", "label" = "Red Alert", "desc" = "Nothing to do with communists."),
+ list("alert" = "lockdown", "label" = "Lockdown", "desc" = "Let everyone know they're on lockdown."),
+ list("alert" = "biohazard", "label" = "Biohazard", "desc" = "Great for virus outbreaks and parties."),
+ )
+ )
+
+ data["security_level"] = security_level
+ data["str_security_level"] = capitalize(get_security_level())
+ data["levels"] = list(
+ list("id" = SEC_LEVEL_GREEN, "name" = "Green"),
+ list("id" = SEC_LEVEL_BLUE, "name" = "Blue"),
+ )
+
+ var/list/msg_data = list()
+ for(var/i = 1; i <= messagetext.len; i++)
+ msg_data.Add(list(list("title" = messagetitle[i], "body" = messagetext[i], "id" = i)))
+
+ data["messages"] = msg_data
+ if((data["is_ai"] && aicurrmsg) || (!data["is_ai"] && currmsg))
+ data["current_message"] = data["is_ai"] ? messagetext[aicurrmsg] : messagetext[currmsg]
+ data["current_message_title"] = data["is_ai"] ? messagetitle[aicurrmsg] : messagetitle[currmsg]
+
+ data["lastCallLoc"] = shuttle_master.emergencyLastCallLoc ? format_text(shuttle_master.emergencyLastCallLoc.name) : null
+
+ var/shuttle[0]
+ switch(shuttle_master.emergency.mode)
+ if(SHUTTLE_IDLE, SHUTTLE_RECALL)
+ shuttle["callStatus"] = 2 //#define
+ else
+ shuttle["callStatus"] = 1
+ if(shuttle_master.emergency.mode == SHUTTLE_CALL)
+ var/timeleft = shuttle_master.emergency.timeLeft()
+ shuttle["eta"] = "[timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]"
+
+ data["shuttle"] = shuttle
+
+ if(trade_dockrequest_timelimit > world.time)
+ data["dock_request"] = 1
+ else
+ data["dock_request"] = 0
+
+ return data
+
+/datum/computer_file/program/comm/Topic(href, href_list)
+ if(..())
+ return 1
+
+ var/turf/T = get_turf(computer)
+ if(!is_secure_level(T.z))
+ to_chat(usr, "Unable to establish a connection: You're too far away from the station! ")
+ return 1
+
+ if(href_list["PRG_login"])
+ if(!ishuman(usr))
+ to_chat(usr, "Access denied. ")
+ return
+
+ var/list/access = usr.get_access()
+ if(access_heads in access)
+ authenticated = COMM_AUTHENTICATION_MIN
+
+ if(access_captain in access)
+ authenticated = COMM_AUTHENTICATION_MAX
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/weapon/card/id = H.get_idcard(TRUE)
+ if(istype(id))
+ crew_announcement.announcer = GetNameAndAssignmentFromId(id)
+
+ nanomanager.update_uis(src)
+ return 1
+
+ if(href_list["PRG_logout"])
+ authenticated = COMM_AUTHENTICATION_NONE
+ crew_announcement.announcer = ""
+ setMenuState(usr, COMM_SCREEN_MAIN)
+ nanomanager.update_uis(src)
+ return 1
+
+ if(is_authenticated(usr))
+ switch(href_list["PRG_operation"])
+ if("main")
+ setMenuState(usr, COMM_SCREEN_MAIN)
+
+ if("changeseclevel")
+ setMenuState(usr,COMM_SCREEN_SECLEVEL)
+
+ if("newalertlevel")
+ if(isAI(usr) || isrobot(usr))
+ to_chat(usr, "Firewalls prevent you from changing the alert level. ")
+ return 1
+ else if(usr.can_admin_interact())
+ change_security_level(usr, text2num(href_list["level"]))
+ return 1
+ else if(!ishuman(usr))
+ to_chat(usr, "Security measures prevent you from changing the alert level. ")
+ return 1
+
+ var/mob/living/carbon/human/L = usr
+ var/obj/item/card = L.get_active_hand()
+ var/obj/item/weapon/card/id/I = (card && card.GetID()) || L.wear_id || L.wear_pda
+ if(istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = I
+ I = pda.id
+ if(I && istype(I))
+ if(access_captain in I.access)
+ change_security_level(usr, text2num(href_list["level"]))
+ else
+ to_chat(usr, "You are not authorized to do this. ")
+ setMenuState(usr, COMM_SCREEN_MAIN)
+ else
+ to_chat(usr, "You need to swipe your ID. ")
+
+ if("announce")
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
+ if(message_cooldown)
+ to_chat(usr, "Please allow at least one minute to pass between announcements. ")
+ nanomanager.update_uis(src)
+ return 1
+ var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement")
+ if(!input || message_cooldown || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
+ nanomanager.update_uis(src)
+ return 1
+ crew_announcement.Announce(input)
+ message_cooldown = 1
+ spawn(600)//One minute cooldown
+ message_cooldown = 0
+
+ if("callshuttle")
+ var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null
+ if(!input || ..() || !is_authenticated(usr))
+ nanomanager.update_uis(src)
+ return 1
+
+ call_shuttle_proc(usr, input)
+ if(shuttle_master.emergency.timer)
+ post_status("shuttle")
+ setMenuState(usr, COMM_SCREEN_MAIN)
+
+ if("cancelshuttle")
+ if(isAI(usr) || isrobot(usr))
+ to_chat(usr, "Firewalls prevent you from recalling the shuttle. ")
+ nanomanager.update_uis(src)
+ return 1
+ var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No")
+ if(response == "Yes")
+ cancel_call_proc(usr)
+ if(shuttle_master.emergency.timer)
+ post_status("shuttle")
+ setMenuState(usr, COMM_SCREEN_MAIN)
+
+ if("messagelist")
+ currmsg = 0
+ if(href_list["msgid"])
+ setCurrentMessage(usr, text2num(href_list["msgid"]))
+ setMenuState(usr,COMM_SCREEN_MESSAGES)
+
+ if("delmessage")
+ if(href_list["msgid"])
+ currmsg = text2num(href_list["msgid"])
+ var/response = alert("Are you sure you wish to delete this message?", "Confirm", "Yes", "No")
+ if(response == "Yes")
+ if(currmsg)
+ var/id = getCurrentMessage()
+ var/title = messagetitle[id]
+ var/text = messagetext[id]
+ messagetitle.Remove(title)
+ messagetext.Remove(text)
+ if(currmsg == id)
+ currmsg = 0
+ if(aicurrmsg == id)
+ aicurrmsg = 0
+ setMenuState(usr,COMM_SCREEN_MESSAGES)
+
+ if("status")
+ setMenuState(usr,COMM_SCREEN_STAT)
+
+ // Status display stuff
+ if("setstat")
+ display_type=href_list["statdisp"]
+ switch(display_type)
+ if("message")
+ post_status("message", stat_msg1, stat_msg2, usr)
+ if("alert")
+ post_status("alert", href_list["alert"], user = usr)
+ else
+ post_status(href_list["statdisp"], user = usr)
+ setMenuState(usr, COMM_SCREEN_STAT)
+
+ if("setmsg1")
+ stat_msg1 = input("Line 1", "Enter Message Text", stat_msg1) as text|null
+ setMenuState(usr, COMM_SCREEN_STAT)
+
+ if("setmsg2")
+ stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null
+ setMenuState(usr, COMM_SCREEN_STAT)
+
+ if("nukerequest")
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
+ if(centcomm_message_cooldown)
+ to_chat(usr, "Arrays recycling. Please stand by. ")
+ nanomanager.update_uis(src)
+ return 1
+ var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
+ nanomanager.update_uis(src)
+ return 1
+ Nuke_request(input, usr)
+ to_chat(usr, "Request sent. ")
+ log_say("[key_name(usr)] has requested the nuclear codes from Centcomm")
+ priority_announcement.Announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/AI/commandreport.ogg')
+ centcomm_message_cooldown = 1
+ spawn(6000)//10 minute cooldown
+ centcomm_message_cooldown = 0
+ setMenuState(usr,COMM_SCREEN_MAIN)
+
+ if("MessageCentcomm")
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
+ if(centcomm_message_cooldown)
+ to_chat(usr, "Arrays recycling. Please stand by. ")
+ nanomanager.update_uis(src)
+ return 1
+ var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
+ nanomanager.update_uis(src)
+ return 1
+ Centcomm_announce(input, usr)
+ to_chat(usr, "Message transmitted.")
+ log_say("[key_name(usr)] has made a Centcomm announcement: [input]")
+ centcomm_message_cooldown = 1
+ spawn(6000)//10 minute cooldown
+ centcomm_message_cooldown = 0
+ setMenuState(usr,COMM_SCREEN_MAIN)
+
+ // OMG SYNDICATE ...LETTERHEAD
+ if("MessageSyndicate")
+ if((is_authenticated(usr) == COMM_AUTHENTICATION_MAX) && (computer && computer.emagged))
+ if(centcomm_message_cooldown)
+ to_chat(usr, "Arrays recycling. Please stand by.")
+ nanomanager.update_uis(src)
+ return 1
+ var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
+ nanomanager.update_uis(src)
+ return 1
+ Syndicate_announce(input, usr)
+ to_chat(usr, "Message transmitted.")
+ log_say("[key_name(usr)] has made a Syndicate announcement: [input]")
+ centcomm_message_cooldown = 1
+ spawn(6000)//10 minute cooldown
+ centcomm_message_cooldown = 0
+ setMenuState(usr,COMM_SCREEN_MAIN)
+
+ if("RestartNanoMob")
+ if(mob_hunt_server)
+ if(mob_hunt_server.manual_reboot())
+ var/loading_msg = pick("Respawning spawns", "Reticulating splines", "Flipping hat",
+ "Capturing all of them", "Fixing minor text issues", "Being the very best",
+ "Nerfing this", "Not communicating with playerbase", "Coding a ripoff in a 2D spaceman game")
+ to_chat(usr, "Restarting Nano-Mob Hunter GO! game server. [loading_msg]... ")
+ else
+ to_chat(usr, "Nano-Mob Hunter GO! game server reboot failed due to recent restart. Please wait before re-attempting. ")
+ else
+ to_chat(usr, "Nano-Mob Hunter GO! game server is offline for extended maintenance. Contact your Central Command administrators for more info if desired. ")
+
+ if("AcceptDocking")
+ to_chat(usr, "Docking request accepted!")
+ trade_dock_timelimit = world.time + 1200
+ trade_dockrequest_timelimit = 0
+ event_announcement.Announce("Docking request for trading ship approved, please dock at port bay 4.", "Docking Request")
+ if("DenyDocking")
+ to_chat(usr, "Docking requeset denied!")
+ trade_dock_timelimit = 0
+ trade_dockrequest_timelimit = 0
+ event_announcement.Announce("Docking request for trading ship denied.", "Docking request")
+
+ nanomanager.update_uis(src)
+ return 1
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
new file mode 100644
index 00000000000..254559c2580
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
@@ -0,0 +1,71 @@
+/datum/computer_file/program/alarm_monitor
+ filename = "alarmmonitor"
+ filedesc = "Alarm Monitoring"
+ ui_header = "alarm_green.gif"
+ program_icon_state = "alert-green"
+ extended_desc = "This program provides visual interface for station's alarm system."
+ requires_ntnet = 1
+ network_destination = "alarm monitoring network"
+ size = 5
+ var/list/datum/alarm_handler/alarm_handlers
+
+/datum/computer_file/program/alarm_monitor/New()
+ ..()
+ alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm)
+ for(var/datum/alarm_handler/AH in alarm_handlers)
+ AH.register(src, /datum/computer_file/program/alarm_monitor/proc/update_icon)
+
+/datum/computer_file/program/alarm_monitor/Destroy()
+ for(var/datum/alarm_handler/AH in alarm_handlers)
+ AH.unregister(src)
+ QDEL_NULL(alarm_handlers)
+ return ..()
+
+/datum/computer_file/program/alarm_monitor/proc/update_icon()
+ for(var/datum/alarm_handler/AH in alarm_handlers)
+ if(AH.has_major_alarms())
+ program_icon_state = "alert-red"
+ ui_header = "alarm_red.gif"
+ update_computer_icon()
+ return 1
+ program_icon_state = "alert-green"
+ ui_header = "alarm_green.gif"
+ update_computer_icon()
+ return 0
+
+/datum/computer_file/program/alarm_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/alarm_monitor/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ var/categories[0]
+ for(var/datum/alarm_handler/AH in alarm_handlers)
+ categories[++categories.len] = list("category" = AH.category, "alarms" = list())
+ for(var/datum/alarm/A in AH.major_alarms())
+ var/cameras[0]
+ var/lost_sources[0]
+
+ if(isAI(user))
+ for(var/obj/machinery/camera/C in A.cameras())
+ cameras[++cameras.len] = C.nano_structure()
+ for(var/datum/alarm_source/AS in A.sources)
+ if(!AS.source)
+ lost_sources[++lost_sources.len] = AS.source_name
+
+ categories[categories.len]["alarms"] += list(list(
+ "name" = sanitize(A.alarm_name()),
+ "origin_lost" = A.origin == null,
+ "has_cameras" = cameras.len,
+ "cameras" = cameras,
+ "lost_sources" = lost_sources.len ? sanitize(english_list(lost_sources, nothing_text = "", and_text = ", ")) : ""))
+ data["categories"] = categories
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm
new file mode 100644
index 00000000000..dca2fabd499
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm
@@ -0,0 +1,48 @@
+/datum/computer_file/program/power_monitor
+ filename = "powermonitor"
+ filedesc = "Power Monitoring"
+ program_icon_state = "power_monitor"
+ extended_desc = "This program connects to sensors around the station to provide information about electrical systems"
+ ui_header = "power_norm.gif"
+ transfer_access = access_engine
+ usage_flags = PROGRAM_CONSOLE
+ requires_ntnet = 0
+ network_destination = "power monitoring system"
+ size = 9
+ var/obj/structure/cable/attached
+
+/datum/computer_file/program/power_monitor/run_program(mob/living/user)
+ . = ..(user)
+ search()
+
+/datum/computer_file/program/power_monitor/process_tick()
+ if(!attached)
+ search()
+
+/datum/computer_file/program/power_monitor/proc/search()
+ var/turf/T = get_turf(computer)
+ attached = locate() in T
+
+/datum/computer_file/program/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "power_monitor.tmpl", "Alarm Monitoring", 800, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/power_monitor/ui_data()
+ var/list/data = get_header_data()
+
+ data["powermonitor"] = attached ? TRUE : FALSE
+
+ if(attached)
+ var/datum/powernet/powernet = attached.get_powernet()
+ data["poweravail"] = powernet.avail
+ data["powerload"] = powernet.viewload
+ data["powerdemand"] = powernet.load
+ data["apcs"] = apc_repository.apc_data(powernet)
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/generic/configurator.dm b/code/modules/modular_computers/file_system/programs/generic/configurator.dm
new file mode 100644
index 00000000000..0630d1a129a
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/generic/configurator.dm
@@ -0,0 +1,68 @@
+// This is special hardware configuration program.
+// It is to be used only with modular computers.
+// It allows you to toggle components of your device.
+
+/datum/computer_file/program/computerconfig
+ filename = "compconfig"
+ filedesc = "Computer Configuration Tool"
+ extended_desc = "This program allows configuration of computer's hardware"
+ program_icon_state = "generic"
+ unsendable = 1
+ undeletable = 1
+ size = 4
+ available_on_ntnet = 0
+ requires_ntnet = 0
+
+
+/datum/computer_file/program/computerconfig/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "laptop_configuration.tmpl", "NTOS Configuration Utility", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/computerconfig/ui_data(mob/user)
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ var/obj/item/weapon/computer_hardware/battery/battery_module = computer.all_components[MC_CELL]
+
+ var/list/data = get_header_data()
+
+ data["disk_size"] = hard_drive.max_capacity
+ data["disk_used"] = hard_drive.used_capacity
+ data["power_usage"] = computer.last_power_usage
+ data["battery_exists"] = battery_module ? 1 : 0
+ if(battery_module && battery_module.battery)
+ data["battery_rating"] = battery_module.battery.maxcharge
+ data["battery_percent"] = round(battery_module.battery.percent())
+ data["eta"] = computer.get_power_eta()
+
+ if(battery_module && battery_module.battery)
+ data["battery"] = list("max" = battery_module.battery.maxcharge, "charge" = round(battery_module.battery.charge))
+
+ var/list/all_entries[0]
+ for(var/I in computer.all_components)
+ var/obj/item/weapon/computer_hardware/H = computer.all_components[I]
+ all_entries.Add(list(list(
+ "name" = H.name,
+ "desc" = H.desc,
+ "enabled" = H.enabled,
+ "critical" = H.critical,
+ "powerusage" = H.power_usage
+ )))
+
+ data["hardware"] = all_entries
+ return data
+
+
+/datum/computer_file/program/computerconfig/Topic(href, list/href_list)
+ if(..())
+ return
+ switch(href_list["action"])
+ if("PC_toggle_component")
+ var/obj/item/weapon/computer_hardware/H = computer.find_hardware_by_name(href_list["name"])
+ if(H && istype(H))
+ H.enabled = !H.enabled
+ . = TRUE
diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm
new file mode 100644
index 00000000000..20c4e92fd98
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm
@@ -0,0 +1,195 @@
+/datum/computer_file/program/filemanager
+ filename = "filemanager"
+ filedesc = "NTOS File Manager"
+ extended_desc = "This program allows management of files."
+ program_icon_state = "generic"
+ size = 8
+ requires_ntnet = 0
+ available_on_ntnet = 0
+ undeletable = 1
+ var/open_file
+ var/error
+
+/datum/computer_file/program/filemanager/proc/prepare_printjob(t, font = PRINTER_FONT) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW.
+ t = replacetext(t, "\[field\]", " ")
+ t = replacetext(t, "\[sign\]", " ")
+ t = pencode_to_html(t, sign = 0, fields = 0, deffont = font)
+ return t
+
+/datum/computer_file/program/filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/filemanager/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
+ var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD]
+ if(error)
+ data["error"] = error
+ if(open_file)
+ var/datum/computer_file/data/file
+
+ if(!computer || !HDD)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
+ else
+ file = HDD.find_file_by_name(open_file)
+ if(!istype(file))
+ data["error"] = "I/O ERROR: Unable to open file."
+ else
+ data["filedata"] = pencode_to_html(file.stored_data, sign = 0, fields = 0)
+ data["filename"] = "[file.filename].[file.filetype]"
+ else
+ if(!computer || !HDD)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
+ else
+ var/list/files[0]
+ for(var/datum/computer_file/F in HDD.stored_files)
+ files.Add(list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ )))
+ data["files"] = files
+ if(RHDD)
+ data["usbconnected"] = 1
+ var/list/usbfiles[0]
+ for(var/datum/computer_file/F in RHDD.stored_files)
+ usbfiles.Add(list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ )))
+ data["usbfiles"] = usbfiles
+
+ return data
+
+/datum/computer_file/program/filemanager/Topic(href, list/href_list)
+ if(..())
+ return 1
+
+ var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
+ var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD]
+ var/obj/item/weapon/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
+
+ switch(href_list["action"])
+ if("PRG_openfile")
+ . = 1
+ open_file = href_list["name"]
+ if("PRG_newtextfile")
+ . = 1
+ var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50)
+ if(!newname)
+ return 1
+ if(!HDD)
+ return 1
+ var/datum/computer_file/data/F = new/datum/computer_file/data()
+ F.filename = newname
+ F.filetype = "TXT"
+ HDD.store_file(F)
+ if("PRG_deletefile")
+ . = 1
+ if(!HDD)
+ return 1
+ var/datum/computer_file/file = HDD.find_file_by_name(href_list["name"])
+ if(!file || file.undeletable)
+ return 1
+ HDD.remove_file(file)
+ if("PRG_usbdeletefile")
+ . = 1
+ if(!RHDD)
+ return 1
+ var/datum/computer_file/file = RHDD.find_file_by_name(href_list["name"])
+ if(!file || file.undeletable)
+ return 1
+ RHDD.remove_file(file)
+ if("PRG_closefile")
+ . = 1
+ open_file = null
+ error = null
+ if("PRG_clone")
+ . = 1
+ if(!HDD)
+ return 1
+ var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"])
+ if(!F || !istype(F))
+ return 1
+ var/datum/computer_file/C = F.clone(1)
+ HDD.store_file(C)
+ if("PRG_rename")
+ . = 1
+ if(!HDD)
+ return 1
+ var/datum/computer_file/file = HDD.find_file_by_name(href_list["name"])
+ if(!file || !istype(file))
+ return 1
+ var/newname = stripped_input(usr, "Enter new file name:", "File rename", file.filename, max_length=50)
+ if(file && newname)
+ file.filename = newname
+ if("PRG_edit")
+ . = 1
+ if(!open_file)
+ return 1
+ if(!HDD)
+ return 1
+ var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
+ if(!F || !istype(F))
+ return 1
+ if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No"))
+ return 1
+ // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently.
+ var/newtext = stripped_multiline_input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", html_decode(F.stored_data), 16384, TRUE)
+ if(!newtext)
+ return
+ if(F)
+ var/datum/computer_file/data/backup = F.clone()
+ HDD.remove_file(F)
+ F.stored_data = newtext
+ F.calculate_size()
+ // We can't store the updated file, it's probably too large. Print an error and restore backed up version.
+ // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space.
+ // They will be able to copy-paste the text from error screen and store it in notepad or something.
+ if(!HDD.store_file(F))
+ error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window: [F.stored_data] "
+ HDD.store_file(backup)
+ if("PRG_printfile")
+ . = 1
+ if(!open_file)
+ return 1
+ if(!HDD)
+ return 1
+ var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
+ if(!F || !istype(F))
+ return 1
+ if(!printer)
+ error = "Missing Hardware: Your computer does not have required hardware to complete this operation."
+ return 1
+ if(!printer.print_text(prepare_printjob(F.stored_data, computer.emagged ? CRAYON_FONT : PRINTER_FONT), open_file))
+ error = "Hardware error: Printer was unable to print the file. It may be out of paper."
+ return 1
+ if("PRG_copytousb")
+ . = 1
+ if(!HDD || !RHDD)
+ return 1
+ var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"])
+ if(!F || !istype(F))
+ return 1
+ var/datum/computer_file/C = F.clone(0)
+ RHDD.store_file(C)
+ if("PRG_copyfromusb")
+ . = 1
+ if(!HDD || !RHDD)
+ return 1
+ var/datum/computer_file/F = RHDD.find_file_by_name(href_list["name"])
+ if(!F || !istype(F))
+ return 1
+ var/datum/computer_file/C = F.clone(0)
+ HDD.store_file(C)
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm
new file mode 100644
index 00000000000..1ce9fb38bd1
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm
@@ -0,0 +1,178 @@
+/datum/computer_file/program/ntnetdownload
+ filename = "ntndownloader"
+ filedesc = "NTNet Software Download Tool"
+ program_icon_state = "generic"
+ extended_desc = "This program allows downloads of software from official NT repositories"
+ unsendable = 1
+ undeletable = 1
+ size = 4
+ requires_ntnet = 1
+ requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD
+ available_on_ntnet = 0
+ ui_header = "downloader_finished.gif"
+ var/datum/computer_file/program/downloaded_file = null
+ var/hacked_download = 0
+ var/download_completion = 0 //GQ of downloaded data.
+ var/download_netspeed = 0
+ var/downloaderror = ""
+ var/obj/item/device/modular_computer/my_computer = null
+
+/datum/computer_file/program/ntnetdownload/proc/begin_file_download(filename)
+ if(downloaded_file)
+ return 0
+
+ var/datum/computer_file/program/PRG = ntnet_global.find_ntnet_file_by_name(filename)
+
+ if(!PRG || !istype(PRG))
+ return 0
+
+ // Attempting to download antag only program, but without having emagged computer. No.
+ if(PRG.available_on_syndinet && !computer.emagged)
+ return 0
+
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+
+ if(!computer || !hard_drive || !hard_drive.can_store_file(PRG))
+ return 0
+
+ ui_header = "downloader_running.gif"
+
+ if(PRG in ntnet_global.available_station_software)
+ generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.")
+ hacked_download = 0
+ else if(PRG in ntnet_global.available_antag_software)
+ generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.")
+ hacked_download = 1
+ else
+ generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from unspecified server.")
+ hacked_download = 0
+
+ downloaded_file = PRG.clone()
+
+/datum/computer_file/program/ntnetdownload/proc/abort_file_download()
+ if(!downloaded_file)
+ return
+ generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : "[downloaded_file.filename].[downloaded_file.filetype]"].")
+ downloaded_file = null
+ download_completion = 0
+ ui_header = "downloader_finished.gif"
+
+/datum/computer_file/program/ntnetdownload/proc/complete_file_download()
+ if(!downloaded_file)
+ return
+ generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : "[downloaded_file.filename].[downloaded_file.filetype]"].")
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ if(!computer || !hard_drive || !hard_drive.store_file(downloaded_file))
+ // The download failed
+ downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance."
+ downloaded_file = null
+ download_completion = 0
+ ui_header = "downloader_finished.gif"
+
+/datum/computer_file/program/ntnetdownload/process_tick()
+ if(!downloaded_file)
+ return
+ if(download_completion >= downloaded_file.size)
+ complete_file_download()
+ // Download speed according to connectivity state. NTNet server is assumed to be on unlimited speed so we're limited by our local connectivity
+ download_netspeed = 0
+ // Speed defines are found in misc.dm
+ switch(ntnet_status)
+ if(1)
+ download_netspeed = NTNETSPEED_LOWSIGNAL
+ if(2)
+ download_netspeed = NTNETSPEED_HIGHSIGNAL
+ if(3)
+ download_netspeed = NTNETSPEED_ETHERNET
+ download_completion += download_netspeed
+
+/datum/computer_file/program/ntnetdownload/Topic(href, list/href_list)
+ if(..())
+ return 1
+ switch(href_list["action"])
+ if("PRG_downloadfile")
+ if(!downloaded_file)
+ begin_file_download(href_list["filename"])
+ return 1
+ if("PRG_reseterror")
+ if(downloaderror)
+ download_completion = 0
+ download_netspeed = 0
+ downloaded_file = null
+ downloaderror = ""
+ return 1
+ return 0
+
+/datum/computer_file/program/ntnetdownload/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "ntnet_downloader.tmpl", "NTNet Download Program", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/ntnetdownload/ui_data(mob/user)
+ my_computer = computer
+
+ if(!istype(my_computer))
+ return
+
+ var/list/data = get_header_data()
+
+ // This IF cuts on data transferred to client, so i guess it's worth it.
+ if(downloaderror) // Download errored. Wait until user resets the program.
+ data["error"] = downloaderror
+ else if(downloaded_file) // Download running. Wait please..
+ data["downloadname"] = downloaded_file.filename
+ data["downloaddesc"] = downloaded_file.filedesc
+ data["downloadsize"] = downloaded_file.size
+ data["downloadspeed"] = download_netspeed
+ data["downloadcompletion"] = round(min(download_completion, downloaded_file.size), 0.1)
+ else // No download running, pick file.
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = my_computer.all_components[MC_HDD]
+ data["disk_size"] = hard_drive.max_capacity
+ data["disk_used"] = hard_drive.used_capacity
+ var/list/all_entries[0]
+ for(var/A in ntnet_global.available_station_software)
+ var/datum/computer_file/program/P = A
+ // Only those programs our user can run will show in the list
+ if(!P.can_run(user,transfer = 1))
+ continue
+ all_entries.Add(list(list(
+ "filename" = P.filename,
+ "filedesc" = P.filedesc,
+ "fileinfo" = P.extended_desc,
+ "compatibility" = check_compatibility(P),
+ "size" = P.size,
+ "status" = !hard_drive || !hard_drive.can_store_file(P) ? "disabled" : null
+ )))
+ data["hackedavailable"] = 0
+ if(computer.emagged) // If we are running on emagged computer we have access to some "bonus" software
+ var/list/hacked_programs[0]
+ for(var/S in ntnet_global.available_antag_software)
+ var/datum/computer_file/program/P = S
+ data["hackedavailable"] = 1
+ hacked_programs.Add(list(list(
+ "filename" = P.filename,
+ "filedesc" = P.filedesc,
+ "fileinfo" = P.extended_desc,
+ "size" = P.size
+ )))
+ data["hacked_programs"] = hacked_programs
+
+ data["downloadable_programs"] = all_entries
+
+ return data
+
+/datum/computer_file/program/ntnetdownload/proc/check_compatibility(datum/computer_file/program/P)
+ var/hardflag = computer.hardware_flag
+
+ if(P && P.is_supported_by_hardware(hardflag,0))
+ return "Compatible"
+ return "Incompatible!"
+
+/datum/computer_file/program/ntnetdownload/kill_program(forced)
+ abort_file_download()
+ return ..(forced)
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm
new file mode 100644
index 00000000000..bfb90ab881b
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm
@@ -0,0 +1,231 @@
+/datum/computer_file/program/chatclient
+ filename = "ntnrc_client"
+ filedesc = "NTNet Relay Chat Client"
+ program_icon_state = "command"
+ extended_desc = "This program allows communication over NTNRC network"
+ size = 8
+ requires_ntnet = 1
+ requires_ntnet_feature = NTNET_COMMUNICATION
+ network_destination = "NTNRC server"
+ ui_header = "ntnrc_idle.gif"
+ available_on_ntnet = 1
+ var/last_message = null // Used to generate the toolbar icon
+ var/username
+ var/datum/ntnet_conversation/channel = null
+ var/operator_mode = 0 // Channel operator mode
+ var/netadmin_mode = 0 // Administrator mode (invisible to other users + bypasses passwords)
+
+/datum/computer_file/program/chatclient/New()
+ ..()
+ username = "DefaultUser[rand(100, 999)]"
+
+/datum/computer_file/program/chatclient/process_tick()
+ ..()
+ if(program_state != PROGRAM_STATE_KILLED)
+ ui_header = "ntnrc_idle.gif"
+ if(channel)
+ // Remember the last message. If there is no message in the channel remember null.
+ last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null
+ else
+ last_message = null
+ return 1
+ if(channel && channel.messages && channel.messages.len)
+ ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif"
+ else
+ ui_header = "ntnrc_idle.gif"
+
+/datum/computer_file/program/chatclient/kill_program(forced = FALSE)
+ if(channel)
+ channel.remove_client(src)
+ channel = null
+ ..()
+
+/datum/computer_file/program/chatclient/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "ntnet_chat.tmpl", "NTNet Relay Chat Client", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+
+/datum/computer_file/program/chatclient/ui_data(mob/user)
+ if(!ntnet_global || !ntnet_global.chat_channels)
+ return
+
+ var/list/data = get_header_data()
+
+ data["adminmode"] = netadmin_mode
+ if(channel)
+ data["title"] = channel.title
+ var/list/messages[0]
+ for(var/M in channel.messages)
+ messages.Add(list(list(
+ "msg" = M
+ )))
+ data["messages"] = messages
+ var/list/clients[0]
+ for(var/C in channel.clients)
+ var/datum/computer_file/program/chatclient/cl = C
+ clients.Add(list(list(
+ "name" = cl.username
+ )))
+ data["clients"] = clients
+ operator_mode = (channel.operator == src) ? 1 : 0
+ data["is_operator"] = operator_mode || netadmin_mode
+
+ else // Channel selection screen
+ var/list/all_channels[0]
+ for(var/C in ntnet_global.chat_channels)
+ var/datum/ntnet_conversation/conv = C
+ if(conv && conv.title)
+ all_channels.Add(list(list(
+ "chan" = conv.title,
+ "id" = conv.id
+ )))
+ data["all_channels"] = all_channels
+
+ return data
+
+/datum/computer_file/program/chatclient/Topic(href, list/href_list)
+ if(..())
+ return 1
+
+ switch(href_list["action"])
+ if("PRG_speak")
+ . = 1
+ if(!channel)
+ return 1
+ var/mob/living/user = usr
+ var/message = reject_bad_text(input(user, "Enter message or leave blank to cancel: "))
+ if(!message || !channel)
+ return
+ channel.add_message(message, username)
+ log_chat("[user]/([user.ckey]) as [username] sent to [channel.title]: [message]")
+
+ if("PRG_joinchannel")
+ . = 1
+ var/datum/ntnet_conversation/C
+ for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels)
+ if(chan.id == text2num(href_list["id"]))
+ C = chan
+ break
+
+ if(!C)
+ return 1
+
+ if(netadmin_mode)
+ channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others.
+ return 1
+
+ if(C.password)
+ var/mob/living/user = usr
+ var/password = reject_bad_text(input(user,"Access Denied. Enter password:"))
+ if(C && (password == C.password))
+ C.add_client(src)
+ channel = C
+ return 1
+ C.add_client(src)
+ channel = C
+ if("PRG_leavechannel")
+ . = 1
+ if(channel)
+ channel.remove_client(src)
+ channel = null
+ if("PRG_newchannel")
+ . = 1
+ var/mob/living/user = usr
+ var/channel_title = reject_bad_text(input(user,"Enter channel name or leave blank to cancel:"))
+ if(!channel_title)
+ return 1
+ var/datum/ntnet_conversation/C = new/datum/ntnet_conversation()
+ C.add_client(src)
+ C.operator = src
+ channel = C
+ C.title = channel_title
+ if("PRG_toggleadmin")
+ . = 1
+ if(netadmin_mode)
+ netadmin_mode = 0
+ if(channel)
+ channel.remove_client(src) // We shouldn't be in channel's user list, but just in case...
+ channel = null
+ return 1
+ var/mob/living/user = usr
+ if(can_run(user, 1, access_network))
+ if(channel)
+ var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No")
+ if(response == "Yes")
+ if(channel)
+ channel.remove_client(src)
+ channel = null
+ else
+ return 1
+ netadmin_mode = 1
+ if("PRG_changename")
+ . = 1
+ var/mob/living/user = usr
+ var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:"))
+ if(!newname)
+ return 1
+ if(channel)
+ channel.add_status_message("[username] is now known as [newname].")
+ username = newname
+
+ if("PRG_savelog")
+ . = 1
+ if(!channel)
+ return 1
+ var/mob/living/user = usr
+ var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:")
+ if(!logname || !channel)
+ return 1
+ var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile()
+ // Now we will generate HTML-compliant file that can actually be viewed/printed.
+ logfile.filename = logname
+ logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]"
+ for(var/logstring in channel.messages)
+ logfile.stored_data += "[logstring]\[BR\]"
+ logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]"
+ logfile.calculate_size()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ if(!computer || !hard_drive || !hard_drive.store_file(logfile))
+ if(!computer)
+ // This program shouldn't even be runnable without computer.
+ CRASH("Var computer is null!")
+ return 1
+ if(!hard_drive)
+ computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.")
+ else // In 99.9% cases this will mean our HDD is full
+ computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.")
+ if("PRG_renamechannel")
+ . = 1
+ if(!operator_mode || !channel)
+ return 1
+ var/mob/living/user = usr
+ var/newname = reject_bad_text(input(user, "Enter new channel name or leave blank to cancel:"))
+ if(!newname || !channel)
+ return 1
+ channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.")
+ channel.title = newname
+ if("PRG_deletechannel")
+ . = 1
+ if(channel && ((channel.operator == src) || netadmin_mode))
+ qdel(channel)
+ channel = null
+ if("PRG_setpassword")
+ . = 1
+ if(!channel || ((channel.operator != src) && !netadmin_mode))
+ return 1
+
+ var/mob/living/user = usr
+ var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:"))
+ if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode))
+ return 1
+
+ if(newpassword == "nopassword")
+ channel.password = ""
+ else
+ channel.password = newpassword
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm
new file mode 100644
index 00000000000..1ddabcd1151
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm
@@ -0,0 +1,195 @@
+var/global/nttransfer_uid = 0
+
+/datum/computer_file/program/nttransfer
+ filename = "nttransfer"
+ filedesc = "NTNet P2P Transfer Client"
+ extended_desc = "This program allows for simple file transfer via direct peer to peer connection."
+ program_icon_state = "comm_logs"
+ size = 7
+ requires_ntnet = 1
+ requires_ntnet_feature = NTNET_PEERTOPEER
+ network_destination = "other device via P2P tunnel"
+ available_on_ntnet = 1
+
+ var/error = "" // Error screen
+ var/server_password = "" // Optional password to download the file.
+ var/datum/computer_file/provided_file = null // File which is provided to clients.
+ var/datum/computer_file/downloaded_file = null // File which is being downloaded
+ var/list/connected_clients = list() // List of connected clients.
+ var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from.
+ var/download_completion = 0 // Download progress in GQ
+ var/download_netspeed = 0 // Our connectivity speed in GQ/s
+ var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
+ var/unique_token // UID of this program
+ var/upload_menu = 0 // Whether we show the program list and upload menu
+
+/datum/computer_file/program/nttransfer/New()
+ unique_token = nttransfer_uid
+ nttransfer_uid++
+ ..()
+
+/datum/computer_file/program/nttransfer/process_tick()
+ // Server mode
+ update_netspeed()
+ if(provided_file)
+ for(var/datum/computer_file/program/nttransfer/C in connected_clients)
+ // Transfer speed is limited by device which uses slower connectivity.
+ // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer
+ // so they can all run on same speed.
+ C.actual_netspeed = min(C.download_netspeed, download_netspeed)
+ C.download_completion += C.actual_netspeed
+ if(C.download_completion >= provided_file.size)
+ C.finish_download()
+ else if(downloaded_file) // Client mode
+ if(!remote)
+ crash_download("Connection to remote server lost")
+
+/datum/computer_file/program/nttransfer/kill_program(forced = FALSE)
+ if(downloaded_file) // Client mode, clean up variables for next use
+ finalize_download()
+
+ if(provided_file) // Server mode, disconnect all clients
+ for(var/datum/computer_file/program/nttransfer/P in connected_clients)
+ P.crash_download("Connection terminated by remote server")
+ downloaded_file = null
+ ..(forced)
+
+/datum/computer_file/program/nttransfer/proc/update_netspeed()
+ download_netspeed = 0
+ switch(ntnet_status)
+ if(1)
+ download_netspeed = NTNETSPEED_LOWSIGNAL
+ if(2)
+ download_netspeed = NTNETSPEED_HIGHSIGNAL
+ if(3)
+ download_netspeed = NTNETSPEED_ETHERNET
+
+// Finishes download and attempts to store the file on HDD
+/datum/computer_file/program/nttransfer/proc/finish_download()
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ if(!computer || !hard_drive || !hard_drive.store_file(downloaded_file))
+ error = "I/O Error: Unable to save file. Check your hard drive and try again."
+ finalize_download()
+
+// Crashes the download and displays specific error message
+/datum/computer_file/program/nttransfer/proc/crash_download(var/message)
+ error = message ? message : "An unknown error has occurred during download"
+ finalize_download()
+
+// Cleans up variables for next use
+/datum/computer_file/program/nttransfer/proc/finalize_download()
+ if(remote)
+ remote.connected_clients.Remove(src)
+ downloaded_file = null
+ remote = null
+ download_completion = 0
+
+
+/datum/computer_file/program/nttransfer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "ntnet_transfer.tmpl", "NTNet P2P Transfer Client", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/nttransfer/Topic(href, list/href_list)
+ if(..())
+ return 1
+ switch(href_list["action"])
+ if("PRG_downloadfile")
+ for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers)
+ if("[P.unique_token]" == href_list["id"])
+ remote = P
+ break
+ if(!remote || !remote.provided_file)
+ return
+ if(remote.server_password)
+ var/pass = reject_bad_text(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required"))
+ if(pass != remote.server_password)
+ error = "Incorrect Password"
+ return 1
+ downloaded_file = remote.provided_file.clone()
+ remote.connected_clients.Add(src)
+ return 1
+ if("PRG_reset")
+ error = ""
+ upload_menu = 0
+ finalize_download()
+ if(src in ntnet_global.fileservers)
+ ntnet_global.fileservers.Remove(src)
+ for(var/datum/computer_file/program/nttransfer/T in connected_clients)
+ T.crash_download("Remote server has forcibly closed the connection")
+ provided_file = null
+ return 1
+ if("PRG_setpassword")
+ var/pass = reject_bad_text(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
+ if(!pass)
+ return
+ if(pass == "none")
+ server_password = ""
+ return
+ server_password = pass
+ return 1
+ if("PRG_uploadfile")
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ for(var/datum/computer_file/F in hard_drive.stored_files)
+ if("[F.uid]" == href_list["id"])
+ if(F.unsendable)
+ error = "I/O Error: File locked."
+ return
+ if(istype(F, /datum/computer_file/program))
+ var/datum/computer_file/program/P = F
+ if(!P.can_run(usr,transfer = 1))
+ error = "Access Error: Insufficient rights to upload file."
+ provided_file = F
+ ntnet_global.fileservers.Add(src)
+ return
+ error = "I/O Error: Unable to locate file on hard drive."
+ return 1
+ if("PRG_uploadmenu")
+ upload_menu = 1
+
+
+/datum/computer_file/program/nttransfer/ui_data(mob/user)
+
+ var/list/data = get_header_data()
+
+ if(error)
+ data["error"] = error
+ else if(downloaded_file)
+ data["downloading"] = 1
+ data["download_size"] = downloaded_file.size
+ data["download_progress"] = download_completion
+ data["download_netspeed"] = actual_netspeed
+ data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]"
+ else if (provided_file)
+ data["uploading"] = 1
+ data["upload_uid"] = unique_token
+ data["upload_clients"] = connected_clients.len
+ data["upload_haspassword"] = server_password ? 1 : 0
+ data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
+ else if (upload_menu)
+ var/list/all_files[0]
+ var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
+ for(var/datum/computer_file/F in hard_drive.stored_files)
+ all_files.Add(list(list(
+ "uid" = F.uid,
+ "filename" = "[F.filename].[F.filetype]",
+ "size" = F.size
+ )))
+ data["upload_filelist"] = all_files
+ else
+ var/list/all_servers[0]
+ for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers)
+ all_servers.Add(list(list(
+ "uid" = P.unique_token,
+ "filename" = "[P.provided_file.filename].[P.provided_file.filetype]",
+ "size" = P.provided_file.size,
+ "haspassword" = P.server_password ? 1 : 0
+ )))
+ data["servers"] = all_servers
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/research/airestorer.dm b/code/modules/modular_computers/file_system/programs/research/airestorer.dm
new file mode 100644
index 00000000000..55bbcb3b2b2
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/research/airestorer.dm
@@ -0,0 +1,137 @@
+/datum/computer_file/program/aidiag
+ filename = "aidiag"
+ filedesc = "AI Maintenance Utility"
+ program_icon_state = "generic"
+ extended_desc = "This program is capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot."
+ size = 12
+ requires_ntnet = 0
+ usage_flags = PROGRAM_CONSOLE
+ transfer_access = access_heads
+ available_on_ntnet = 1
+ var/restoring = FALSE
+
+/datum/computer_file/program/aidiag/proc/get_ai(cardcheck)
+
+ var/obj/item/weapon/computer_hardware/ai_slot/ai_slot
+
+ if(computer)
+ ai_slot = computer.all_components[MC_AI]
+
+ if(computer && ai_slot && ai_slot.check_functionality())
+ if(cardcheck == 1)
+ return ai_slot
+ if(ai_slot.enabled && ai_slot.stored_card)
+ if(cardcheck == 2)
+ return ai_slot.stored_card
+ if(locate(/mob/living/silicon/ai) in ai_slot.stored_card)
+ return locate(/mob/living/silicon/ai) in ai_slot.stored_card
+
+ return null
+
+/datum/computer_file/program/aidiag/Topic(href, list/href_list)
+ if(..())
+ return TRUE
+
+ var/mob/living/silicon/ai/A = get_ai()
+ if(!A)
+ restoring = FALSE
+
+ switch(href_list["action"])
+ if("PRG_beginReconstruction")
+ if(A && A.health < 100)
+ restoring = TRUE
+ return TRUE
+ if("PRG_eject")
+ if(computer.all_components[MC_AI])
+ var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = computer.all_components[MC_AI]
+ if(ai_slot && ai_slot.stored_card)
+ ai_slot.try_eject(0,usr)
+ return TRUE
+
+/datum/computer_file/program/aidiag/process_tick()
+ ..()
+ if(!restoring) //Put the check here so we don't check for an ai all the time
+ return
+ var/obj/item/device/aicard/cardhold = get_ai(2)
+
+ var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = get_ai(1)
+
+
+ var/mob/living/silicon/ai/A = get_ai()
+ if(!A || !cardhold)
+ restoring = FALSE // If the AI was removed, stop the restoration sequence.
+ if(ai_slot)
+ ai_slot.locked = FALSE
+ return
+
+ if(cardhold.flush)
+ ai_slot.locked = FALSE
+ restoring = FALSE
+ return
+ ai_slot.locked = TRUE
+ A.adjustOxyLoss(-1)
+ A.adjustFireLoss(-1)
+ A.adjustToxLoss(-1)
+ A.adjustBruteLoss(-1)
+ A.updatehealth()
+ if(A.health >= 0 && A.stat == DEAD)
+ A.stat = CONSCIOUS
+ A.lying = 0
+ dead_mob_list -= A
+ living_mob_list += A
+ // Finished restoring
+ if(A.health >= 100)
+ ai_slot.locked = FALSE
+ restoring = FALSE
+
+ return TRUE
+
+
+/datum/computer_file/program/aidiag/ui_data(mob/user)
+ var/list/data = get_header_data()
+ var/mob/living/silicon/ai/AI
+ // A shortcut for getting the AI stored inside the computer. The program already does necessary checks.
+ AI = get_ai()
+
+ var/obj/item/device/aicard/aicard = get_ai(2)
+
+ if(!aicard)
+ data["nocard"] = TRUE
+ data["error"] = "Please insert an intelliCard."
+ else
+ if(!AI)
+ data["error"] = "No AI located"
+ else
+ var/obj/item/device/aicard/cardhold = AI.loc
+ if(cardhold.flush)
+ data["error"] = "Flush in progress"
+ else
+ data["name"] = AI.name
+ data["restoring"] = restoring
+ data["health"] = (AI.health + 100) / 2
+ data["isDead"] = AI.stat == DEAD
+
+ var/list/all_laws[0]
+ for(var/datum/ai_law/L in AI.laws.all_laws())
+ all_laws.Add(list(list(
+ "index" = L.index,
+ "text" = L.law
+ )))
+
+ data["ai_laws"] = all_laws
+
+ return data
+
+/datum/computer_file/program/aidiag/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "ai_restorer.tmpl", "Integrity Restorer", 600, 400)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/aidiag/kill_program(forced)
+ restoring = FALSE
+ return ..(forced)
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm
new file mode 100644
index 00000000000..e3809cdcc37
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm
@@ -0,0 +1,90 @@
+/datum/computer_file/program/ntnetmonitor
+ filename = "ntmonitor"
+ filedesc = "NTNet Diagnostics and Monitoring"
+ program_icon_state = "comm_monitor"
+ extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes"
+ size = 12
+ requires_ntnet = 1
+ required_access = access_network //Network control is a more secure program.
+ available_on_ntnet = 1
+
+/datum/computer_file/program/ntnetmonitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+ ui = new(user, src, ui_key, "ntnet_monitor.tmpl", "NTNet Diagnostics and Monitoring Tool", 575, 700)
+ ui.set_auto_update(1)
+ ui.set_layout_key("program")
+ ui.open()
+
+/datum/computer_file/program/ntnetmonitor/Topic(href, list/href_list)
+ if(..())
+ return 1
+ switch(href_list["action"])
+ if("resetIDS")
+ . = 1
+ if(ntnet_global)
+ ntnet_global.resetIDS()
+ return 1
+ if("toggleIDS")
+ . = 1
+ if(ntnet_global)
+ ntnet_global.toggleIDS()
+ return 1
+ if("toggleWireless")
+ . = 1
+ if(!ntnet_global)
+ return 1
+
+ // NTNet is disabled. Enabling can be done without user prompt
+ if(ntnet_global.setting_disabled)
+ ntnet_global.setting_disabled = 0
+ return 1
+
+ // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on)
+ var/mob/user = usr
+ if(!user)
+ return 1
+ var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No")
+ if(response == "Yes")
+ ntnet_global.setting_disabled = 1
+ return 1
+ if("purgelogs")
+ . = 1
+ if(ntnet_global)
+ ntnet_global.purge_logs()
+ if("updatemaxlogs")
+ . = 1
+ var/mob/user = usr
+ var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):"))
+ if(ntnet_global)
+ ntnet_global.update_max_log_count(logcount)
+ if("toggle_function")
+ . = 1
+ if(!ntnet_global)
+ return 1
+ ntnet_global.toggle_function(text2num(href_list["id"]))
+
+/datum/computer_file/program/ntnetmonitor/ui_data(mob/user)
+ if(!ntnet_global)
+ return
+ var/list/data = get_header_data()
+
+ data["ntnetstatus"] = ntnet_global.check_function()
+ data["ntnetrelays"] = ntnet_global.relays.len
+ data["idsstatus"] = ntnet_global.intrusion_detection_enabled
+ data["idsalarm"] = ntnet_global.intrusion_detection_alarm
+
+ data["config_softwaredownload"] = ntnet_global.setting_softwaredownload
+ data["config_peertopeer"] = ntnet_global.setting_peertopeer
+ data["config_communication"] = ntnet_global.setting_communication
+ data["config_systemcontrol"] = ntnet_global.setting_systemcontrol
+
+ data["ntnetlogs"] = list()
+
+ for(var/i in ntnet_global.logs)
+ data["ntnetlogs"] += list(list("entry" = i))
+ data["ntnetmaxlogs"] = ntnet_global.setting_maxlogcount
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/CPU.dm b/code/modules/modular_computers/hardware/CPU.dm
new file mode 100644
index 00000000000..614ad35da9d
--- /dev/null
+++ b/code/modules/modular_computers/hardware/CPU.dm
@@ -0,0 +1,44 @@
+// CPU that allows the computer to run programs.
+// Better CPUs are obtainable via research and can run more programs on background.
+
+/obj/item/weapon/computer_hardware/processor_unit
+ name = "processor board"
+ desc = "A standard CPU board used in most computers. It can run up to three programs simultaneously."
+ icon_state = "cpuboard"
+ w_class = WEIGHT_CLASS_SMALL
+ power_usage = 50
+ critical = 1
+ malfunction_probability = 1
+ origin_tech = "programming=3;engineering=2"
+ var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description.
+ device_type = MC_CPU
+
+/obj/item/weapon/computer_hardware/processor_unit/on_remove(obj/item/device/modular_computer/MC, mob/user)
+ MC.shutdown_computer()
+
+/obj/item/weapon/computer_hardware/processor_unit/small
+ name = "microprocessor"
+ desc = "A miniaturised CPU used in portable devices. It can run up to two programs simultaneously."
+ icon_state = "cpu"
+ w_class = WEIGHT_CLASS_TINY
+ power_usage = 25
+ max_idle_programs = 1
+ origin_tech = "programming=2;engineering=2"
+
+/obj/item/weapon/computer_hardware/processor_unit/photonic
+ name = "photonic processor board"
+ desc = "An advanced experimental CPU board that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power."
+ icon_state = "cpuboard_super"
+ w_class = WEIGHT_CLASS_SMALL
+ power_usage = 250
+ max_idle_programs = 4
+ origin_tech = "programming=5;engineering=4"
+
+/obj/item/weapon/computer_hardware/processor_unit/photonic/small
+ name = "photonic microprocessor"
+ desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously."
+ icon_state = "cpu_super"
+ w_class = WEIGHT_CLASS_TINY
+ power_usage = 75
+ max_idle_programs = 2
+ origin_tech = "programming=4;engineering=3"
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
new file mode 100644
index 00000000000..4f752fdac10
--- /dev/null
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -0,0 +1,110 @@
+/obj/item/weapon/computer_hardware
+ name = "hardware"
+ desc = "Unknown Hardware."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "std_mod"
+
+ w_class = WEIGHT_CLASS_TINY // w_class limits which devices can contain this component.
+ // 1: PDAs/Tablets, 2: Laptops, 3-4: Consoles only
+ var/obj/item/device/modular_computer/holder = null
+ // Computer that holds this hardware, if any.
+
+ var/obj_integrity = 200
+ var/max_integrity = 200
+
+ var/power_usage = 0 // If the hardware uses extra power, change this.
+ var/enabled = 1 // If the hardware is turned off set this to 0.
+ var/critical = 0 // Prevent disabling for important component, like the CPU.
+ var/can_install = 1 // Prevents direct installation of removable media.
+ var/damage = 0 // Current damage level
+ var/max_damage = 100 // Maximal damage level.
+ var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
+ var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
+ var/malfunction_probability = 10// Chance of malfunction when the component is damaged
+ var/device_type
+
+/obj/item/weapon/computer_hardware/New(var/obj/L)
+ ..()
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+
+/obj/item/weapon/computer_hardware/Destroy()
+ if(holder)
+ holder.uninstall_component(src)
+ return ..()
+
+
+/obj/item/weapon/computer_hardware/attackby(obj/item/I, mob/living/user)
+ // Multitool. Runs diagnostics
+ if(istype(I, /obj/item/device/multitool))
+ to_chat(user, "***** DIAGNOSTICS REPORT *****")
+ diagnostics(user)
+ to_chat(user, "******************************")
+ return 1
+
+ // Cable coil. Works as repair method, but will probably require multiple applications and more cable.
+ if(istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/S = I
+ if(obj_integrity == max_integrity)
+ to_chat(user, "\The [src] doesn't seem to require repairs. ")
+ return 1
+ if(S.use(1))
+ to_chat(user, "You patch up \the [src] with a bit of \the [I]. ")
+ obj_integrity = min(obj_integrity + 10, max_integrity)
+ return 1
+
+ if(try_insert(I, user))
+ return 1
+
+ return ..()
+
+// Called on multitool click, prints diagnostic information to the user.
+/obj/item/weapon/computer_hardware/proc/diagnostics(var/mob/user)
+ to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]")
+
+// Handles damage checks
+/obj/item/weapon/computer_hardware/proc/check_functionality()
+ if(!enabled) // Disabled.
+ return FALSE
+
+ if(damage > damage_failure) // Too damaged to work at all.
+ return FALSE
+
+ if(damage > damage_malfunction) // Still working. Well, sometimes...
+ if(prob(malfunction_probability))
+ return FALSE
+
+ return TRUE // Good to go.
+
+// Handles damage checks
+/obj/item/weapon/computer_hardware/proc/take_damage(damage_amount)
+ obj_integrity = max(obj_integrity - damage_amount, 0)
+
+/obj/item/weapon/computer_hardware/examine(var/mob/user)
+ . = ..()
+ if(damage > damage_failure)
+ to_chat(user, "It seems to be severely damaged! ")
+ else if(damage > damage_malfunction)
+ to_chat(user, "It seems to be damaged! ")
+ else if(damage)
+ to_chat(user, "It seems to be slightly damaged. ")
+
+// Component-side compatibility check.
+/obj/item/weapon/computer_hardware/proc/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
+ return can_install
+
+// Called when component is installed into PC.
+/obj/item/weapon/computer_hardware/proc/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
+ return
+
+// Called when component is removed from PC.
+/obj/item/weapon/computer_hardware/proc/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
+ try_eject(forced = 1)
+
+// Called when someone tries to insert something in it - paper in printer, card in card reader, etc.
+/obj/item/weapon/computer_hardware/proc/try_insert(obj/item/I, mob/living/user = null)
+ return FALSE
+
+// Called when someone tries to eject something from it - card from card reader, etc.
+/obj/item/weapon/computer_hardware/proc/try_eject(slot=0, mob/living/user = null, forced = 0)
+ return FALSE
diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm
new file mode 100644
index 00000000000..4de202ba8b5
--- /dev/null
+++ b/code/modules/modular_computers/hardware/ai_slot.dm
@@ -0,0 +1,80 @@
+/obj/item/weapon/computer_hardware/ai_slot
+ name = "intelliCard interface slot"
+ desc = "A module allowing this computer to interface with most common intelliCard modules. Necessary for some programs to run properly."
+ power_usage = 100 //W
+ icon_state = "card_mini"
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "programming=2"
+ device_type = MC_AI
+
+ var/obj/item/device/aicard/stored_card = null
+ var/locked = FALSE
+
+/obj/item/weapon/computer_hardware/ai_slot/Destroy()
+ QDEL_NULL(stored_card)
+ return ..()
+
+
+/obj/item/weapon/computer_hardware/ai_slot/examine(mob/user)
+ ..()
+ if(stored_card)
+ to_chat(user, "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it")
+
+/obj/item/weapon/computer_hardware/ai_slot/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
+ M.add_verb(device_type)
+
+/obj/item/weapon/computer_hardware/ai_slot/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
+ M.remove_verb(device_type)
+ try_eject(0, forced = 1)
+
+/obj/item/weapon/computer_hardware/ai_slot/try_insert(obj/item/I, mob/living/user = null)
+ if(!holder)
+ return FALSE
+
+ if(!istype(I, /obj/item/device/aicard))
+ return FALSE
+
+ if(stored_card)
+ if(user)
+ to_chat(user, "You try to insert \the [I] into \the [src], but the slot is occupied. ")
+ return FALSE
+ if(user && !user.unEquip(I))
+ return FALSE
+
+ I.forceMove(src)
+ stored_card = I
+ if(user)
+ to_chat(user, "You insert \the [I] into \the [src]. ")
+
+ return TRUE
+
+
+/obj/item/weapon/computer_hardware/ai_slot/try_eject(slot=0, mob/living/user = null, forced = 0)
+ if(!stored_card)
+ if(user)
+ to_chat(user, "There is no card in \the [src]. ")
+ return FALSE
+
+ if(locked && !forced)
+ if(user)
+ to_chat(user, "Safeties prevent you from removing the card until reconstruction is complete... ")
+ return FALSE
+
+ if(stored_card)
+ stored_card.forceMove(get_turf(src))
+ locked = FALSE
+ stored_card.verb_pickup()
+ stored_card = null
+
+ if(user)
+ to_chat(user, "You remove the card from \the [src]. ")
+ return TRUE
+ return FALSE
+
+/obj/item/weapon/computer_hardware/ai_slot/attackby(obj/item/I, mob/living/user)
+ if(..())
+ return
+ if(istype(I, /obj/item/weapon/screwdriver))
+ to_chat(user, "You press down on the manual eject button with \the [I]. ")
+ try_eject(0, user, 1)
+ return
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm
new file mode 100644
index 00000000000..06ecff641c3
--- /dev/null
+++ b/code/modules/modular_computers/hardware/battery_module.dm
@@ -0,0 +1,106 @@
+/obj/item/weapon/computer_hardware/battery
+ name = "power cell controller"
+ desc = "A charge controller for standard power cells, used in all kinds of modular computers."
+ icon_state = "cell_con"
+ critical = 1
+ malfunction_probability = 1
+ origin_tech = "powerstorage=1;engineering=1"
+ var/obj/item/weapon/stock_parts/cell/battery = null
+ device_type = MC_CELL
+
+/obj/item/weapon/computer_hardware/battery/New(loc, battery_type = null)
+ if(battery_type)
+ battery = new battery_type(src)
+ ..()
+
+/obj/item/weapon/computer_hardware/battery/Destroy()
+ QDEL_NULL(battery)
+ return ..()
+
+/obj/item/weapon/computer_hardware/battery/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
+ try_eject(0, forced = 1)
+
+/obj/item/weapon/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null)
+ if(!holder)
+ return FALSE
+
+ if(!istype(I, /obj/item/weapon/stock_parts/cell))
+ return FALSE
+
+ if(battery)
+ if(user)
+ to_chat(user, "You try to connect \the [I] to \the [src], but its connectors are occupied. ")
+ return FALSE
+
+ if(I.w_class > holder.max_hardware_size)
+ if(user)
+ to_chat(user, "This power cell is too large for \the [holder]! ")
+ return FALSE
+
+ if(user && !user.unEquip(I))
+ return FALSE
+
+ I.forceMove(src)
+ battery = I
+ if(user)
+ to_chat(user, "You connect \the [I] to \the [src]. ")
+
+ return TRUE
+
+
+/obj/item/weapon/computer_hardware/battery/try_eject(slot=0, mob/living/user = null, forced = 0)
+ if(!battery)
+ if(user)
+ to_chat(user, "There is no power cell connected to \the [src]. ")
+ return FALSE
+ else
+ battery.forceMove(get_turf(src))
+ if(user)
+ to_chat(user, "You detach \the [battery] from \the [src]. ")
+ battery = null
+
+ if(holder)
+ if(holder.enabled && !holder.use_power())
+ holder.shutdown_computer()
+
+ return TRUE
+ return FALSE
+
+
+// Stock parts
+/obj/item/weapon/stock_parts/cell/computer
+ name = "standard battery"
+ desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "cell_mini"
+ origin_tech = "powerstorage=2;engineering=1"
+ w_class = WEIGHT_CLASS_TINY
+ maxcharge = 750
+
+/obj/item/weapon/stock_parts/cell/computer/advanced
+ name = "advanced battery"
+ desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices."
+ icon_state = "cell"
+ origin_tech = "powerstorage=2;engineering=2"
+ maxcharge = 1500
+
+/obj/item/weapon/stock_parts/cell/computer/super
+ name = "super battery"
+ desc = "An advanced power cell, often used in high-end laptops."
+ icon_state = "cell"
+ origin_tech = "powerstorage=3;engineering=3"
+ maxcharge = 2000
+
+/obj/item/weapon/stock_parts/cell/computer/micro
+ name = "micro battery"
+ desc = "A small power cell, commonly seen in most portable microcomputers."
+ icon_state = "cell_micro"
+ w_class = WEIGHT_CLASS_TINY
+ maxcharge = 500
+
+/obj/item/weapon/stock_parts/cell/computer/nano
+ name = "nano battery"
+ desc = "A tiny power cell, commonly seen in low-end portable microcomputers."
+ icon_state = "cell_micro"
+ w_class = WEIGHT_CLASS_TINY
+ maxcharge = 300
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
new file mode 100644
index 00000000000..ff02b69bace
--- /dev/null
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -0,0 +1,112 @@
+/obj/item/weapon/computer_hardware/card_slot
+ name = "identification card authentication module" // \improper breaks the find_hardware_by_name proc
+ desc = "A module allowing this computer to read or write data on ID cards. Necessary for some programs to run properly."
+ power_usage = 10 //W
+ icon_state = "card_mini"
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "programming=2"
+ device_type = MC_CARD
+
+ var/obj/item/weapon/card/id/stored_card = null
+ var/obj/item/weapon/card/id/stored_card2 = null
+
+/obj/item/weapon/computer_hardware/card_slot/Destroy()
+ QDEL_NULL(stored_card)
+ QDEL_NULL(stored_card2)
+ return ..()
+
+/obj/item/weapon/computer_hardware/card_slot/GetAccess()
+ if(stored_card && stored_card2) // Best of both worlds
+ return (stored_card.GetAccess() | stored_card2.GetAccess())
+ else if(stored_card)
+ return stored_card.GetAccess()
+ else if(stored_card2)
+ return stored_card2.GetAccess()
+ return ..()
+
+/obj/item/weapon/computer_hardware/card_slot/GetID()
+ if(stored_card)
+ return stored_card
+ else if(stored_card2)
+ return stored_card2
+ return ..()
+
+/obj/item/weapon/computer_hardware/card_slot/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
+ M.add_verb(device_type)
+
+/obj/item/weapon/computer_hardware/card_slot/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
+ M.remove_verb(device_type)
+ try_eject(0, forced = 1)
+
+/obj/item/weapon/computer_hardware/card_slot/try_insert(obj/item/I, mob/living/user = null)
+ if(!holder)
+ return FALSE
+
+ if(!istype(I, /obj/item/weapon/card/id))
+ return FALSE
+
+ if(stored_card && stored_card2)
+ if(user)
+ to_chat(user, "You try to insert \the [I] into \the [src], but its slots are occupied. ")
+ return FALSE
+ if(user && !user.unEquip(I))
+ return FALSE
+
+ I.forceMove(src)
+
+ if(!stored_card)
+ stored_card = I
+ else
+ stored_card2 = I
+
+ if(user)
+ to_chat(user, "You insert \the [I] into \the [src]. ")
+
+ return TRUE
+
+
+/obj/item/weapon/computer_hardware/card_slot/try_eject(slot = 0, mob/living/user = null, forced = 0)
+ if(!stored_card && !stored_card2)
+ if(user)
+ to_chat(user, "There are no cards in \the [src]. ")
+ return FALSE
+
+ var/ejected = 0
+ if(stored_card && (!slot || slot == 1))
+ stored_card.forceMove(get_turf(src))
+ stored_card.verb_pickup()
+ stored_card = null
+ ejected++
+
+ if(stored_card2 && (!slot || slot == 2))
+ stored_card2.forceMove(get_turf(src))
+ stored_card2.verb_pickup()
+ stored_card2 = null
+ ejected++
+
+ if(ejected)
+ if(holder)
+ if(holder.active_program)
+ holder.active_program.event_idremoved(0, slot)
+
+ for(var/I in holder.idle_threads)
+ var/datum/computer_file/program/P = I
+ P.event_idremoved(1, slot)
+
+ if(user)
+ to_chat(user, "You remove the card[ejected>1 ? "s" : ""] from \the [src]. ")
+ return TRUE
+ return FALSE
+
+/obj/item/weapon/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user)
+ if(..())
+ return
+ if(istype(I, /obj/item/weapon/screwdriver))
+ to_chat(user, "You press down on the manual eject button with \the [I]. ")
+ try_eject(0,user)
+ return
+
+/obj/item/weapon/computer_hardware/card_slot/examine(mob/user)
+ ..()
+ if(stored_card || stored_card2)
+ to_chat(user, "There appears to be something loaded in the card slots.")
diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm
new file mode 100644
index 00000000000..caf0406336b
--- /dev/null
+++ b/code/modules/modular_computers/hardware/hard_drive.dm
@@ -0,0 +1,175 @@
+/obj/item/weapon/computer_hardware/hard_drive
+ name = "hard disk drive"
+ desc = "A small HDD, for use in basic computers where power efficiency is desired."
+ power_usage = 25
+ icon_state = "harddisk_mini"
+ critical = 1
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "programming=1;engineering=1"
+ device_type = MC_HDD
+ var/max_capacity = 128
+ var/used_capacity = 0
+ var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
+
+/obj/item/weapon/computer_hardware/hard_drive/on_remove(obj/item/device/modular_computer/MC, mob/user)
+ MC.shutdown_computer()
+
+/obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs()
+ store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar
+ store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository
+ store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation.
+
+/obj/item/weapon/computer_hardware/hard_drive/examine(user)
+ ..()
+ to_chat(user, "It has [max_capacity] GQ of storage capacity. ")
+
+/obj/item/weapon/computer_hardware/hard_drive/diagnostics(var/mob/user)
+ ..()
+ // 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
+ to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999")
+ to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ")
+
+// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
+/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
+ if(!F || !istype(F))
+ return 0
+
+ if(!can_store_file(F))
+ return 0
+
+ if(!check_functionality())
+ return 0
+
+ if(!stored_files)
+ return 0
+
+ // This file is already stored. Don't store it again.
+ if(F in stored_files)
+ return 0
+
+ F.holder = src
+ stored_files.Add(F)
+ recalculate_size()
+ return 1
+
+// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
+/obj/item/weapon/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F)
+ if(!F || !istype(F))
+ return 0
+
+ if(!stored_files)
+ return 0
+
+ if(!check_functionality())
+ return 0
+
+ if(F in stored_files)
+ stored_files -= F
+ qdel(F)
+ recalculate_size()
+ return 1
+ else
+ return 0
+
+// Loops through all stored files and recalculates used_capacity of this drive
+/obj/item/weapon/computer_hardware/hard_drive/proc/recalculate_size()
+ var/total_size = 0
+ for(var/datum/computer_file/F in stored_files)
+ total_size += F.size
+
+ used_capacity = total_size
+
+// Checks whether file can be stored on the hard drive. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file.
+/obj/item/weapon/computer_hardware/hard_drive/proc/can_store_file(var/datum/computer_file/F)
+ if(!F || !istype(F))
+ return 0
+
+ if(F in stored_files)
+ return 0
+
+ var/name = F.filename + "." + F.filetype
+ for(var/datum/computer_file/file in stored_files)
+ if((file.filename + "." + file.filetype) == name)
+ return 0
+
+ // In the unlikely event someone manages to create that many files.
+ // BYOND is acting weird with numbers above 999 in loops (infinite loop prevention)
+ if(stored_files.len >= 999)
+ return 0
+ if((used_capacity + F.size) > max_capacity)
+ return 0
+ else
+ return 1
+
+
+// Tries to find the file by filename. Returns null on failure
+/obj/item/weapon/computer_hardware/hard_drive/proc/find_file_by_name(var/filename)
+ if(!check_functionality())
+ return null
+
+ if(!filename)
+ return null
+
+ if(!stored_files)
+ return null
+
+ for(var/datum/computer_file/F in stored_files)
+ if(F.filename == filename)
+ return F
+ return null
+
+/obj/item/weapon/computer_hardware/hard_drive/Destroy()
+ QDEL_LIST(stored_files)
+ stored_files = null
+ return ..()
+
+/obj/item/weapon/computer_hardware/hard_drive/New()
+ install_default_programs()
+ ..()
+
+
+/obj/item/weapon/computer_hardware/hard_drive/advanced
+ name = "advanced hard disk drive"
+ desc = "A hybrid HDD, for use in higher grade computers where balance between power efficiency and capacity is desired."
+ max_capacity = 256
+ origin_tech = "programming=2;engineering=2"
+ power_usage = 50 // Hybrid, medium capacity and medium power storage
+ icon_state = "harddisk_mini"
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/weapon/computer_hardware/hard_drive/super
+ name = "super hard disk drive"
+ desc = "A high capacity HDD, for use in cluster storage solutions where capacity is more important than power efficiency."
+ max_capacity = 512
+ origin_tech = "programming=3;engineering=3"
+ power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link.
+ icon_state = "harddisk_mini"
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/weapon/computer_hardware/hard_drive/cluster
+ name = "cluster hard disk drive"
+ desc = "A large storage cluster consisting of multiple HDDs for usage in dedicated storage systems."
+ power_usage = 500
+ origin_tech = "programming=4;engineering=4"
+ max_capacity = 2048
+ icon_state = "harddisk"
+ w_class = WEIGHT_CLASS_NORMAL
+
+// For tablets, etc. - highly power efficient.
+/obj/item/weapon/computer_hardware/hard_drive/small
+ name = "solid state drive"
+ desc = "An efficient SSD for portable devices."
+ power_usage = 10
+ origin_tech = "programming=2;engineering=2"
+ max_capacity = 64
+ icon_state = "ssd_mini"
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/weapon/computer_hardware/hard_drive/micro
+ name = "micro solid state drive"
+ desc = "A highly efficient SSD chip for portable devices."
+ power_usage = 2
+ origin_tech = "programming=1;engineering=1"
+ max_capacity = 32
+ icon_state = "ssd_micro"
+ w_class = WEIGHT_CLASS_TINY
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm
new file mode 100644
index 00000000000..bf918a86b99
--- /dev/null
+++ b/code/modules/modular_computers/hardware/network_card.dm
@@ -0,0 +1,82 @@
+var/global/ntnet_card_uid = 1
+
+/obj/item/weapon/computer_hardware/network_card
+ name = "network card"
+ desc = "A basic wireless network card for usage with standard NTNet frequencies."
+ power_usage = 50
+ origin_tech = "programming=2;engineering=1"
+ icon_state = "radio_mini"
+ var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user.
+ var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
+ var/long_range = 0
+ var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
+ malfunction_probability = 1
+ device_type = MC_NET
+
+/obj/item/weapon/computer_hardware/network_card/diagnostics(var/mob/user)
+ ..()
+ to_chat(user, "NIX Unique ID: [identification_id]")
+ to_chat(user, "NIX User Tag: [identification_string]")
+ to_chat(user, "Supported protocols:")
+ to_chat(user, "511.m SFS (Subspace) - Standard Frequency Spread")
+ if(long_range)
+ to_chat(user, "511.n WFS/HB (Subspace) - Wide Frequency Spread/High Bandiwdth")
+ if(ethernet)
+ to_chat(user, "OpenEth (Physical Connection) - Physical network connection port")
+
+/obj/item/weapon/computer_hardware/network_card/New(var/l)
+ ..(l)
+ identification_id = ntnet_card_uid
+ ntnet_card_uid++
+
+// Returns a string identifier of this network card
+/obj/item/weapon/computer_hardware/network_card/proc/get_network_tag()
+ return "[identification_string] (NID [identification_id])"
+
+// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection
+/obj/item/weapon/computer_hardware/network_card/proc/get_signal(var/specific_action = 0)
+ if(!holder) // Hardware is not installed in anything. No signal. How did this even get called?
+ return 0
+
+ if(!check_functionality())
+ return 0
+
+ if(ethernet) // Computer is connected via wired connection.
+ return 3
+
+ if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
+ return 0
+
+ if(holder)
+
+ var/turf/T = get_turf(holder)
+ if((T && istype(T)) && is_station_contact(T.z))
+ // Computer is on station. Low/High signal depending on what type of network card you have
+ if(long_range)
+ return 2
+ else
+ return 1
+
+ if(long_range) // Computer is not on station, but it has upgraded network card. Low signal.
+ return 1
+
+ return 0 // Computer is not on station and does not have upgraded network card. No signal.
+
+
+/obj/item/weapon/computer_hardware/network_card/advanced
+ name = "advanced network card"
+ desc = "An advanced network card for usage with standard NTNet frequencies. Its transmitter is strong enough to connect even off-station."
+ long_range = 1
+ origin_tech = "programming=4;engineering=2"
+ power_usage = 100 // Better range but higher power usage.
+ icon_state = "radio"
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/weapon/computer_hardware/network_card/wired
+ name = "wired network card"
+ desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection."
+ ethernet = 1
+ origin_tech = "programming=5;engineering=3"
+ power_usage = 100 // Better range but higher power usage.
+ icon_state = "net_wired"
+ w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/modules/modular_computers/hardware/portable_disk.dm b/code/modules/modular_computers/hardware/portable_disk.dm
new file mode 100644
index 00000000000..4bdf0b35493
--- /dev/null
+++ b/code/modules/modular_computers/hardware/portable_disk.dm
@@ -0,0 +1,35 @@
+/obj/item/weapon/computer_hardware/hard_drive/portable
+ name = "data disk"
+ desc = "Removable disk used to store data."
+ power_usage = 10
+ icon_state = "datadisk6"
+ w_class = WEIGHT_CLASS_TINY
+ critical = 0
+ max_capacity = 16
+ origin_tech = "programming=1"
+ device_type = MC_SDD
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
+ M.add_verb(device_type)
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
+ ..()
+ M.remove_verb(device_type)
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/install_default_programs()
+ return // Empty by default
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/advanced
+ name = "advanced data disk"
+ power_usage = 20
+ icon_state = "datadisk5"
+ max_capacity = 64
+ origin_tech = "programming=2"
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/super
+ name = "super data disk"
+ desc = "Removable disk used to store large amounts of data."
+ power_usage = 40
+ icon_state = "datadisk3"
+ max_capacity = 256
+ origin_tech = "programming=4"
diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm
new file mode 100644
index 00000000000..c5d8ba0cc77
--- /dev/null
+++ b/code/modules/modular_computers/hardware/printer.dm
@@ -0,0 +1,65 @@
+/obj/item/weapon/computer_hardware/printer
+ name = "printer"
+ desc = "Computer-integrated printer with paper recycling module."
+ power_usage = 100
+ origin_tech = "programming=2;engineering=2"
+ icon_state = "printer"
+ w_class = WEIGHT_CLASS_NORMAL
+ device_type = MC_PRINT
+ var/stored_paper = 20
+ var/max_paper = 30
+
+/obj/item/weapon/computer_hardware/printer/diagnostics(mob/living/user)
+ ..()
+ to_chat(user, "Paper level: [stored_paper]/[max_paper]")
+
+/obj/item/weapon/computer_hardware/printer/examine(mob/user)
+ ..()
+ to_chat(user, "Paper level: [stored_paper]/[max_paper] ")
+
+
+/obj/item/weapon/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "")
+ if(!stored_paper)
+ return FALSE
+ if(!check_functionality())
+ return FALSE
+
+ var/obj/item/weapon/paper/P = new/obj/item/weapon/paper(get_turf(holder))
+
+ // Damaged printer causes the resulting paper to be somewhat harder to read.
+ if(damage > damage_malfunction)
+ P.info = stars(text_to_print, 100-malfunction_probability)
+ else
+ P.info = text_to_print
+ if(paper_title)
+ P.name = paper_title
+ P.update_icon()
+ stored_paper--
+ P = null
+ return TRUE
+
+/obj/item/weapon/computer_hardware/printer/try_insert(obj/item/I, mob/living/user = null)
+ if(istype(I, /obj/item/weapon/paper))
+ if(stored_paper >= max_paper)
+ if(user)
+ to_chat(user, "You try to add \the [I] into [src], but its paper bin is full! ")
+ return FALSE
+
+ if(user && !user.unEquip(I))
+ return FALSE
+
+ if(user)
+ to_chat(user, "You insert \the [I] into [src]'s paper recycler. ")
+ qdel(I)
+ stored_paper++
+ return TRUE
+ return FALSE
+
+/obj/item/weapon/computer_hardware/printer/mini
+ name = "miniprinter"
+ desc = "A small printer with paper recycling module."
+ power_usage = 50
+ icon_state = "printer_mini"
+ w_class = WEIGHT_CLASS_TINY
+ stored_paper = 5
+ max_paper = 15
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm
new file mode 100644
index 00000000000..c7ab6910780
--- /dev/null
+++ b/code/modules/modular_computers/hardware/recharger.dm
@@ -0,0 +1,94 @@
+/obj/item/weapon/computer_hardware/recharger
+ critical = 1
+ enabled = 1
+ var/charge_rate = 100
+ device_type = MC_CHARGE
+
+/obj/item/weapon/computer_hardware/recharger/proc/use_power(amount, charging=0)
+ if(charging)
+ return 1
+ return 0
+
+/obj/item/weapon/computer_hardware/recharger/process()
+ ..()
+ var/obj/item/weapon/computer_hardware/battery/battery_module = holder.all_components[MC_CELL]
+ if(!holder || !battery_module || !battery_module.battery)
+ return
+
+ var/obj/item/weapon/stock_parts/cell/cell = battery_module.battery
+ if(cell.charge >= cell.maxcharge)
+ return
+
+ if(use_power(charge_rate, charging=1))
+ holder.give_power(charge_rate * CELLRATE)
+
+
+/obj/item/weapon/computer_hardware/recharger/APC
+ name = "area power connector"
+ desc = "A device that wirelessly recharges connected device from nearby APC."
+ icon_state = "charger_APC"
+ w_class = WEIGHT_CLASS_SMALL // Can't be installed into tablets/PDAs
+ origin_tech = "programming=2;engineering=2;powerstorage=3"
+
+/obj/item/weapon/computer_hardware/recharger/APC/use_power(amount, charging=0)
+ if(istype(holder.physical, /obj/machinery))
+ var/obj/machinery/M = holder.physical
+ if(M.powered())
+ M.use_power(amount)
+ return 1
+
+ else
+ var/area/A = get_area(src)
+ if(!A || !isarea(A))
+ return 0
+
+ if(A.powered(EQUIP))
+ A.use_power(amount, EQUIP)
+ return 1
+ return 0
+
+/obj/item/weapon/computer_hardware/recharger/wired
+ name = "wired power connector"
+ desc = "A power connector that recharges connected device from nearby power wire. Incompatible with portable computers."
+ icon_state = "charger_wire"
+ w_class = WEIGHT_CLASS_NORMAL
+ origin_tech = "engineering=2;powerstorage=1"
+
+/obj/item/weapon/computer_hardware/recharger/wired/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
+ if(istype(M.physical, /obj/machinery) && M.physical.anchored)
+ return ..()
+ if(user)
+ to_chat(user, "\The [src] is incompatible with portable computers! ")
+ return 0
+
+/obj/item/weapon/computer_hardware/recharger/wired/use_power(amount, charging=0)
+ if(istype(holder.physical, /obj/machinery) && holder.physical.anchored)
+ var/obj/machinery/M = holder.physical
+ var/turf/T = M.loc
+ if(!T || !istype(T))
+ return 0
+
+ var/obj/structure/cable/C = T.get_cable_node()
+ if(!C || !C.powernet)
+ return 0
+
+ var/power_in_net = C.powernet.avail-C.powernet.load
+
+ if(power_in_net && power_in_net > amount)
+ C.powernet.load += amount
+ return 1
+
+ return 0
+
+
+
+// This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes.
+/obj/item/weapon/computer_hardware/recharger/lambda
+ name = "lambda coil"
+ desc = "A very complex device that draws power from its own bluespace dimension."
+ icon_state = "charger_lambda"
+ w_class = WEIGHT_CLASS_TINY
+ charge_rate = 100000
+
+/obj/item/weapon/computer_hardware/recharger/lambda/use_power(amount, charging=0)
+ return 1
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
new file mode 100644
index 00000000000..2a6cb6f18a6
--- /dev/null
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -0,0 +1,306 @@
+// A vendor machine for modular computer portable devices - Laptops and Tablets
+
+/obj/machinery/lapvend
+ name = "computer vendor"
+ desc = "A vending machine with a built-in microfabricator, capable of dispensing various NT-branded computers."
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "robotics"
+ layer = BELOW_OBJ_LAYER
+ anchored = 1
+ density = 1
+
+ // The actual laptop/tablet
+ var/obj/item/device/modular_computer/laptop/fabricated_laptop = null
+ var/obj/item/device/modular_computer/tablet/fabricated_tablet = null
+
+ // Utility vars
+ var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen
+ var/devtype = 0 // 0: None(unselected), 1: Laptop, 2: Tablet
+ var/total_price = 0 // Price of currently vended device.
+
+ // Device loadout
+ var/dev_cpu = 1 // 1: Default, 2: Upgraded
+ var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced
+ var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced
+ var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range
+ var/dev_apc_recharger = 0 // 0: None, 1: Standard (LAPTOP ONLY)
+ var/dev_printer = 0 // 0: None, 1: Standard
+ var/dev_card = 0 // 0: None, 1: Standard
+
+// Removes all traces of old order and allows you to begin configuration from scratch.
+/obj/machinery/lapvend/proc/reset_order()
+ state = 0
+ devtype = 0
+ if(fabricated_laptop)
+ qdel(fabricated_laptop)
+ fabricated_laptop = null
+ if(fabricated_tablet)
+ qdel(fabricated_tablet)
+ fabricated_tablet = null
+ dev_cpu = 1
+ dev_battery = 1
+ dev_disk = 1
+ dev_netcard = 0
+ dev_apc_recharger = 0
+ dev_printer = 0
+ dev_card = 0
+
+// Recalculates the price and optionally even fabricates the device.
+/obj/machinery/lapvend/proc/fabricate_and_recalc_price(fabricate = 0)
+ total_price = 0
+ if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles
+ var/obj/item/weapon/computer_hardware/battery/battery_module = null
+ if(fabricate)
+ fabricated_laptop = new /obj/item/device/modular_computer/laptop/buildable(src)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/battery)
+ battery_module = fabricated_laptop.all_components[MC_CELL]
+ total_price = 99
+ switch(dev_cpu)
+ if(1)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
+ if(2)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/processor_unit)
+ total_price += 299
+ switch(dev_battery)
+ if(1) // Basic(750C)
+ if(fabricate)
+ battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer)
+ if(2) // Upgraded(1100C)
+ if(fabricate)
+ battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/advanced)
+ total_price += 199
+ if(3) // Advanced(1500C)
+ if(fabricate)
+ battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/super)
+ total_price += 499
+ switch(dev_disk)
+ if(1) // Basic(128GQ)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/hard_drive)
+ if(2) // Upgraded(256GQ)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/hard_drive/advanced)
+ total_price += 99
+ if(3) // Advanced(512GQ)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/hard_drive/super)
+ total_price += 299
+ switch(dev_netcard)
+ if(1) // Basic(Short-Range)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/network_card)
+ total_price += 99
+ if(2) // Advanced (Long Range)
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/network_card/advanced)
+ total_price += 299
+ if(dev_apc_recharger)
+ total_price += 399
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/recharger/APC)
+ if(dev_printer)
+ total_price += 99
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/printer/mini)
+ if(dev_card)
+ total_price += 199
+ if(fabricate)
+ fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/card_slot)
+
+ return total_price
+ else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this.
+ var/obj/item/weapon/computer_hardware/battery/battery_module = null
+ if(fabricate)
+ fabricated_tablet = new(src)
+ fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/battery)
+ fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
+ battery_module = fabricated_tablet.all_components[MC_CELL]
+ total_price = 199
+ switch(dev_battery)
+ if(1) // Basic(300C)
+ if(fabricate)
+ battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/nano)
+ if(2) // Upgraded(500C)
+ if(fabricate)
+ battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/micro)
+ total_price += 199
+ if(3) // Advanced(750C)
+ if(fabricate)
+ battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer)
+ total_price += 499
+ switch(dev_disk)
+ if(1) // Basic(32GQ)
+ if(fabricate)
+ fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/hard_drive/micro)
+ if(2) // Upgraded(64GQ)
+ if(fabricate)
+ fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
+ total_price += 99
+ if(3) // Advanced(128GQ)
+ if(fabricate)
+ fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/hard_drive)
+ total_price += 299
+ switch(dev_netcard)
+ if(1) // Basic(Short-Range)
+ if(fabricate)
+ fabricated_tablet.install_component(new/obj/item/weapon/computer_hardware/network_card)
+ total_price += 99
+ if(2) // Advanced (Long Range)
+ if(fabricate)
+ fabricated_tablet.install_component(new/obj/item/weapon/computer_hardware/network_card/advanced)
+ total_price += 299
+ if(dev_printer)
+ total_price += 99
+ if(fabricate)
+ fabricated_tablet.install_component(new/obj/item/weapon/computer_hardware/printer)
+ if(dev_card)
+ total_price += 199
+ if(fabricate)
+ fabricated_tablet.install_component(new/obj/item/weapon/computer_hardware/card_slot)
+ return total_price
+ return 0
+
+
+/obj/machinery/lapvend/Topic(href, href_list)
+ if(..())
+ return 1
+
+ switch(href_list["action"])
+ if("pick_device")
+ if(state) // We've already picked a device type
+ return 0
+ devtype = text2num(href_list["pick"])
+ state = 1
+ fabricate_and_recalc_price(0)
+ return 1
+ if("clean_order")
+ reset_order()
+ return 1
+ if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode
+ return 0
+ switch(href_list["action"])
+ if("confirm_order")
+ state = 2 // Wait for ID swipe for payment processing
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_cpu")
+ dev_cpu = text2num(href_list["cpu"])
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_battery")
+ dev_battery = text2num(href_list["battery"])
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_disk")
+ dev_disk = text2num(href_list["disk"])
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_netcard")
+ dev_netcard = text2num(href_list["netcard"])
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_tesla")
+ dev_apc_recharger = text2num(href_list["tesla"])
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_nanoprint")
+ dev_printer = text2num(href_list["print"])
+ fabricate_and_recalc_price(0)
+ return 1
+ if("hw_card")
+ dev_card = text2num(href_list["card"])
+ fabricate_and_recalc_price(0)
+ return 1
+ return 0
+
+/obj/machinery/lapvend/attack_hand(mob/user)
+ ui_interact(user)
+
+/obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "computer_fabricator.tmpl", "Personal Computer Vendor", 500, 700)
+ ui.set_auto_update(1)
+ ui.open()
+
+/obj/machinery/lapvend/ui_data(mob/user)
+ var/list/data[0]
+ data["state"] = state
+ if(state == 1)
+ data["devtype"] = devtype
+ data["hw_battery"] = dev_battery
+ data["hw_disk"] = dev_disk
+ data["hw_netcard"] = dev_netcard
+ data["hw_tesla"] = dev_apc_recharger
+ data["hw_nanoprint"] = dev_printer
+ data["hw_card"] = dev_card
+ data["hw_cpu"] = dev_cpu
+ if(state == 1 || state == 2)
+ data["totalprice"] = total_price
+ return data
+
+obj/machinery/lapvend/attackby(obj/item/I, mob/user)
+ var/obj/item/weapon/card/id/C
+ if(istype(I, /obj/item/weapon/card/id))
+ C = I
+ if(istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/PDA = I
+ if(PDA.id)
+ C = PDA.id
+
+ if(C && istype(C) && state == 2)
+ if(process_payment(C, I))
+ fabricate_and_recalc_price(1)
+ if((devtype == 1) && fabricated_laptop)
+ fabricated_laptop.forceMove(loc)
+ fabricated_laptop = null
+ else if((devtype == 2) && fabricated_tablet)
+ fabricated_tablet.forceMove(loc)
+ fabricated_tablet = null
+ atom_say("Enjoy your new product!")
+ state = 3
+ return 1
+ return 0
+ return ..()
+
+
+// Simplified payment processing, returns 1 on success.
+/obj/machinery/lapvend/proc/process_payment(obj/item/weapon/card/id/I, obj/item/ID_container)
+ visible_message("\The [usr] swipes \the [ID_container] through \the [src]. ")
+ var/datum/money_account/customer_account = get_card_account(I)
+ if(!customer_account || customer_account.suspended)
+ atom_say("Connection error. Unable to connect to account.")
+ return 0
+
+ if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
+ var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
+ customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
+
+ if(!customer_account)
+ atom_say("Unable to access account: incorrect credentials.")
+ return 0
+
+ if(total_price > customer_account.money)
+ atom_say("Insufficient funds in account.")
+ return 0
+ else
+ var/paid = customer_account.charge(total_price,
+ transaction_purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].",
+ terminal_name = name,
+ terminal_id = name,
+ dest_name = vendor_account.owner_name)
+
+ if(paid)
+ vendor_account.money += total_price
+ var/datum/transaction/T = new()
+ T.target_name = customer_account.owner_name
+ T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]"
+ T.amount = "[total_price]"
+ T.source_terminal = name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ vendor_account.transaction_log.Add(T)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/nano/interaction/not_incapacitated.dm b/code/modules/nano/interaction/not_incapacitated.dm
new file mode 100644
index 00000000000..a0116409c90
--- /dev/null
+++ b/code/modules/nano/interaction/not_incapacitated.dm
@@ -0,0 +1,25 @@
+ /**
+ * This state only checks if the user isn't incapacitated
+ **/
+
+/var/global/datum/topic_state/not_incapacitated_state/not_incapacitated_state = new()
+
+ /**
+ * This state checks if the user isn't incapacitated and that their loc is a turf
+ **/
+
+/var/global/datum/topic_state/not_incapacitated_state/not_incapacitated_turf_state = new(no_turfs = TRUE)
+
+/datum/topic_state/not_incapacitated_state
+ var/turf_check = FALSE
+
+/datum/topic_state/not_incapacitated_state/New(loc, no_turfs = FALSE)
+ ..()
+ turf_check = no_turfs
+
+/datum/topic_state/not_incapacitated_state/can_use_topic(src_object, mob/user)
+ if(user.stat)
+ return STATUS_CLOSE
+ if(user.incapacitated() || user.lying || (turf_check && !isturf(user.loc)))
+ return STATUS_DISABLED
+ return STATUS_INTERACTIVE
\ No newline at end of file
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index 0670193e498..9dbb508f16e 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -25,7 +25,7 @@
if(ui_ref)
var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines)
if(alarm)
- var/datum/topic_state/TS = generate_state(alarm)
+ var/datum/topic_state/air_alarm/TS = generate_state(alarm)
alarm.ui_interact(usr, master_ui = ui_ref, state = TS)
/datum/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
@@ -63,7 +63,7 @@
/datum/topic_state/air_alarm/href_list(var/mob/user)
var/list/extra_href = list()
- extra_href["remote_connection"] = 1
+ extra_href["remote_connection"] = TRUE
extra_href["remote_access"] = has_access(user)
return extra_href
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 21636465d4a..95738cd6354 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -223,6 +223,7 @@
data["specimen"] = owner.species.name
data["gender"] = owner.gender
+ data["has_gender"] = owner.species.has_gender
data["change_race"] = can_change(APPEARANCE_RACE)
if(data["change_race"])
var/species[0]
diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm
index 33e08b00e83..ef052d6a5f6 100644
--- a/code/modules/nano/modules/power_monitor.dm
+++ b/code/modules/nano/modules/power_monitor.dm
@@ -33,7 +33,7 @@
data["poweravail"] = powermonitor.powernet.avail
data["powerload"] = powermonitor.powernet.viewload
data["powerdemand"] = powermonitor.powernet.load
- data["apcs"] = apc_repository.apc_data(powermonitor)
+ data["apcs"] = apc_repository.apc_data(powermonitor.powernet)
return data
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 1622fe1700e..8b749a67903 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -178,6 +178,7 @@ nanoui is used to open and update nano browser uis
var/name = "[src_object]"
var/list/config_data = list(
"title" = title,
+ "map" = MAP_NAME,
"srcObject" = list("name" = name),
"stateKey" = state_key,
"status" = status,
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 701c4e7080b..0865536bc36 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -74,6 +74,5 @@
spark_system.attach(src)
/obj/item/weapon/katana/energy/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
return ..()
\ No newline at end of file
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index ad4c64decca..0229dbf1e99 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -6,7 +6,7 @@
var/obj/item/weapon/stock_parts/cell/CELL
if(CELL.maxcharge > cell.maxcharge && suitGloves)
to_chat(U, "Higher maximum capacity detected.\nUpgrading... ")
- if(n_gloves && n_gloves.candrain && do_after(U,s_delay, target = U))
+ if(n_gloves && n_gloves.candrain && do_after(U, s_delay, target = U))
U.drop_item()
CELL.loc = src
CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index a5c64adc7ea..da26fc96fec 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -4,7 +4,7 @@
icon_state = "clipboard"
item_state = "clipboard"
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 10
var/obj/item/weapon/pen/haspen //The stored pen.
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 80f45fa0eaf..14925d9752f 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -18,8 +18,10 @@ var/list/alldepartments = list()
active_power_usage = 200
var/obj/item/weapon/card/id/scan = null // identification
+
var/authenticated = 0
var/sendcooldown = 0 // to avoid spamming fax messages
+ var/cooldown_time = 1800
var/department = "Unknown" // our department
@@ -37,9 +39,12 @@ var/list/alldepartments = list()
fax_network = "Central Command Quantum Entanglement Network"
long_range_enabled = 1
-/obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob)
+/obj/machinery/photocopier/faxmachine/attack_hand(mob/user)
ui_interact(user)
+/obj/machinery/photocopier/faxmachine/attack_ghost(mob/user)
+ ui_interact(user)
+
/obj/machinery/photocopier/faxmachine/attackby(obj/item/weapon/item, mob/user, params)
if(istype(item,/obj/item/weapon/card/id) && !scan)
scan(item)
@@ -49,7 +54,7 @@ var/list/alldepartments = list()
else
return ..()
-/obj/machinery/photocopier/faxmachine/emag_act(user as mob)
+/obj/machinery/photocopier/faxmachine/emag_act(mob/user)
if(!emagged)
emagged = 1
to_chat(user, "The transmitters realign to an unknown source! ")
@@ -64,13 +69,14 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
+ var/is_authenticated = is_authenticated(user)
if(scan)
data["scan_name"] = scan.name
else
data["scan_name"] = "-----"
- data["authenticated"] = authenticated
- if(!authenticated)
+ data["authenticated"] = is_authenticated
+ if(!is_authenticated)
data["network"] = "Disconnected"
else if(!emagged)
data["network"] = fax_network
@@ -91,12 +97,20 @@ var/list/alldepartments = list()
return data
+/obj/machinery/photocopier/faxmachine/proc/is_authenticated(mob/user)
+ if(authenticated)
+ return TRUE
+ else if(user.can_admin_interact())
+ return TRUE
+ return FALSE
+
/obj/machinery/photocopier/faxmachine/Topic(href, href_list)
if(..())
return 1
-
+
+ var/is_authenticated = is_authenticated(usr)
if(href_list["send"])
- if(copyitem && authenticated)
+ if(copyitem && is_authenticated)
if((destination in admin_departments) || (destination in hidden_admin_departments))
send_admin_fax(usr, destination)
else
@@ -111,7 +125,7 @@ var/list/alldepartments = list()
if(copyitem)
copyitem.forceMove(get_turf(src))
if(ishuman(usr))
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(copyitem)
to_chat(usr, "You eject \the [copyitem] from \the [src]. ")
copyitem = null
@@ -128,24 +142,24 @@ var/list/alldepartments = list()
scan()
if(href_list["dept"])
- if(authenticated)
+ if(is_authenticated)
var/lastdestination = destination
- var/list/combineddepartments = alldepartments
+ var/list/combineddepartments = alldepartments.Copy()
if(long_range_enabled)
- combineddepartments += admin_departments
+ combineddepartments += admin_departments.Copy()
if(emagged)
- combineddepartments += hidden_admin_departments
+ combineddepartments += hidden_admin_departments.Copy()
destination = input(usr, "To which department?", "Choose a department", "") as null|anything in combineddepartments
if(!destination)
destination = lastdestination
if(href_list["auth"])
- if((!authenticated) && scan)
+ if(!is_authenticated && scan)
if(check_access(scan))
authenticated = 1
- else if(authenticated)
+ else if(is_authenticated)
authenticated = 0
if(href_list["rename"])
@@ -165,26 +179,42 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null)
if(scan) // Card is in machine
if(ishuman(usr))
- scan.forceMove(get_turf(usr))
- if(!usr.get_active_hand())
+ scan.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(scan)
scan = null
else
scan.forceMove(get_turf(src))
scan = null
- else
+ else if(Adjacent(usr))
if(!card)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.forceMove(src)
scan = I
- else
- if(istype(card))
- usr.drop_item()
- card.forceMove(src)
- scan = card
+ else if(istype(card))
+ usr.drop_item()
+ card.forceMove(src)
+ scan = card
nanomanager.update_uis(src)
+
+/obj/machinery/photocopier/faxmachine/verb/eject_id()
+ set category = null
+ set name = "Eject ID Card"
+ set src in oview(1)
+
+ if(usr.restrained())
+ return
+
+ if(scan)
+ to_chat(usr, "You remove \the [scan] from \the [src].")
+ scan.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ to_chat(usr, "There is nothing to remove from \the [src].")
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination,var/mob/sender)
if(stat & (BROKEN|NOPOWER))
@@ -208,7 +238,6 @@ var/list/alldepartments = list()
F.sent_at = world.time
visible_message("[src] beeps, \"Message transmitted successfully.\"")
- //sendcooldown = 600
else
visible_message("[src] beeps, \"Error transmitting message.\"")
@@ -221,7 +250,7 @@ var/list/alldepartments = list()
flick("faxreceive", src)
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
// give the sprite some time to flick
sleep(20)
@@ -241,6 +270,9 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(sendcooldown)
+ return
use_power(200)
@@ -272,15 +304,15 @@ var/list/alldepartments = list()
message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
if("Syndicate")
message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
- sendcooldown = 1800
- sleep(50)
- visible_message("[src] beeps, \"Message transmitted successfully.\"")
+ sendcooldown = cooldown_time
+ spawn(50)
+ visible_message("[src] beeps, \"Message transmitted successfully.\"")
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#9A04D1")
- var/msg = "[faxname]: [key_name(sender, 1)] (PP ) (VV ) (CA ) ([admin_jump_link(sender)]) | REPLY: (RADIO ) (FAX ) (SM ) | REJECT: (TEMPLATE ) (BSA ) (EVILFAX ) : Receiving '[sent.name]' via secure connection... view message "
+ var/msg = "[faxname]: [key_name_admin(sender)] | REPLY: (RADIO ) (FAX ) (SM ) | REJECT: (TEMPLATE ) (BSA ) (EVILFAX ) : Receiving '[sent.name]' via secure connection... view message "
for(var/client/C in admins)
- if(R_EVENT & C.holder.rights)
+ if(check_rights(R_EVENT, 0, C.mob))
to_chat(C, msg)
if(C.prefs.sound & SOUND_ADMINHELP)
C << 'sound/effects/adminhelp.ogg'
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 0fe3a6e75a4..a759ab2c850 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -43,7 +43,7 @@
icon_state = initial(icon_state)
updateUsrDialog()
else if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
anchored = !anchored
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src]. ")
else
@@ -110,17 +110,15 @@
for(var/datum/data/record/G in data_core.general)
var/datum/data/record/S
for(var/datum/data/record/R in data_core.security)
- if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
+ if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
S = R
break
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "Security Record "
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]] \nSex: [G.fields["sex"]] \nAge: [G.fields["age"]] \nFingerprint: [G.fields["fingerprint"]] \nPhysical Status: [G.fields["p_stat"]] \nMental Status: [G.fields["m_stat"]] "
P.info += " \nSecurity Data \nCriminal Status: [S.fields["criminal"]] \n \nMinor Crimes: [S.fields["mi_crim"]] \nDetails: [S.fields["mi_crim_d"]] \n \nMajor Crimes: [S.fields["ma_crim"]] \nDetails: [S.fields["ma_crim_d"]] \n \nImportant Notes: \n\t[S.fields["notes"]] \n \nComments/Log "
- var/counter = 1
- while(S.fields["com_[counter]"])
- P.info += "[S.fields["com_[counter]"]] "
- counter++
+ for(var/c in S.fields["comments"])
+ P.info += "[c] "
P.info += ""
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
@@ -146,17 +144,15 @@
for(var/datum/data/record/G in data_core.general)
var/datum/data/record/M
for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
+ if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
M = R
break
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "Medical Record "
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]] \nSex: [G.fields["sex"]] \nAge: [G.fields["age"]] \nFingerprint: [G.fields["fingerprint"]] \nPhysical Status: [G.fields["p_stat"]] \nMental Status: [G.fields["m_stat"]] "
P.info += " \nMedical Data \nBlood Type: [M.fields["b_type"]] \nDNA: [M.fields["b_dna"]] \n \nMinor Disabilities: [M.fields["mi_dis"]] \nDetails: [M.fields["mi_dis_d"]] \n \nMajor Disabilities: [M.fields["ma_dis"]] \nDetails: [M.fields["ma_dis_d"]] \n \nAllergies: [M.fields["alg"]] \nDetails: [M.fields["alg_d"]] \n \nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section) \nDetails: [M.fields["cdi_d"]] \n \nImportant Notes: \n\t[M.fields["notes"]] \n \nComments/Log "
- var/counter = 1
- while(M.fields["com_[counter]"])
- P.info += "[M.fields["com_[counter]"]] "
- counter++
+ for(var/c in M.fields["comments"])
+ P.info += "[c] "
P.info += ""
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index 00458df575c..214c284f206 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -3,7 +3,7 @@
desc = "A folder."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "folder"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
pressure_resistance = 2
burn_state = FLAMMABLE
@@ -121,4 +121,3 @@
..()
new /obj/item/documents/syndicate/blue(src)
update_icon()
-
diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm
index 46f4e12d97e..1e16049f4b8 100644
--- a/code/modules/paperwork/frames.dm
+++ b/code/modules/paperwork/frames.dm
@@ -3,6 +3,8 @@
desc = "Its patented design allows it to be folded larger or smaller to accommodate standard paper, photo, and poster, and canvas sizes."
icon = 'icons/obj/bureaucracy.dmi'
+ usesound = 'sound/items/Deconstruct.ogg'
+
var/icon_base
var/obj/displayed
@@ -58,7 +60,7 @@
/obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/screwdriver))
if(displayed)
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] unfastens \the [displayed] out of \the [src]. ", "You unfasten \the [displayed] out of \the [src]. ")
if(istype(displayed, /obj/structure/sign/poster))
@@ -72,7 +74,7 @@
else
to_chat(user, "There is nothing to remove from \the [src]. ")
else if(istype(I, /obj/item/weapon/crowbar))
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] breaks down \the [src]. ", "You break down \the [src]. ")
for(var/A in contents)
if(istype(A, /obj/structure/sign/poster))
@@ -135,7 +137,7 @@
PF.pixel_x = px
PF.pixel_y = py
- playsound(PF.loc, 'sound/items/Deconstruct.ogg', 100, 1)
+ playsound(PF.loc, usesound, 100, 1)
/obj/item/weapon/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
..()
@@ -196,9 +198,7 @@
verbs |= /obj/structure/sign/picture_frame/proc/tilt
/obj/structure/sign/picture_frame/Destroy()
- if(frame)
- qdel(frame)
- frame = null
+ QDEL_NULL(frame)
return ..()
/obj/structure/sign/picture_frame/update_icon()
@@ -213,10 +213,10 @@
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] begins to unfasten \the [src] from the wall. ", "You begin to unfasten \the [src] from the wall. ")
- if(do_after(user, 100, target = src))
- playsound(src, 'sound/items/Deconstruct.ogg', 100, 1)
+ if(do_after(user, 100 * I.toolspeed, target = src))
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] unfastens \the [src] from the wall. ", "You unfasten \the [src] from the wall. ")
frame.forceMove(user.loc)
frame = null
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 9de96b73129..250abe3d682 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -10,7 +10,7 @@
icon_state = "paper"
item_state = "paper"
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_range = 1
throw_speed = 1
layer = 4
@@ -31,6 +31,9 @@
var/offset_y[0] //usage by the photocopier
var/rigged = 0
var/spam_flag = 0
+ var/contact_poison // Reagent ID to transfer on contact
+ var/contact_poison_volume = 0
+ var/contact_poison_poisoner = null
var/const/deffont = "Verdana"
var/const/signfont = "Times New Roman"
@@ -199,62 +202,8 @@
update_icon()
-/obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob, var/iscrayon = 0)
-// t = sanitize(copytext(t),1,MAX_MESSAGE_LEN)
-
- t = replacetext(t, "\[center\]", "")
- t = replacetext(t, "\[/center\]", " ")
- t = replacetext(t, "\[br\]", " ")
- t = replacetext(t, "\[b\]", "")
- t = replacetext(t, "\[/b\]", " ")
- t = replacetext(t, "\[i\]", "")
- t = replacetext(t, "\[/i\]", " ")
- t = replacetext(t, "\[u\]", "")
- t = replacetext(t, "\[/u\]", " ")
- t = replacetext(t, "\[large\]", "")
- t = replacetext(t, "\[/large\]", " ")
- t = replacetext(t, "\[sign\]", "[user ? user.real_name : "Anonymous"] ")
- t = replacetext(t, "\[field\]", " ")
-
- t = replacetext(t, "\[h1\]", "")
- t = replacetext(t, "\[/h1\]", " ")
- t = replacetext(t, "\[h2\]", "")
- t = replacetext(t, "\[/h2\]", " ")
- t = replacetext(t, "\[h3\]", "")
- t = replacetext(t, "\[/h3\]", " ")
-
- if(!iscrayon)
- t = replacetext(t, "\[*\]", "")
- t = replacetext(t, "\[hr\]", " ")
- t = replacetext(t, "\[small\]", "")
- t = replacetext(t, "\[/small\]", " ")
- t = replacetext(t, "\[list\]", "")
- t = replacetext(t, "\[/list\]", " ")
- t = replacetext(t, "\[table\]", "")
- t = replacetext(t, "\[/table\]", "
")
- t = replacetext(t, "\[grid\]", "")
- t = replacetext(t, "\[/grid\]", "
")
- t = replacetext(t, "\[row\]", "")
- t = replacetext(t, "\[cell\]", "")
- t = replacetext(t, "\[logo\]", " ")
-
- t = "[t] "
- else // If it is a crayon, and he still tries to use these, make them empty!
- t = replacetext(t, "\[*\]", "")
- t = replacetext(t, "\[hr\]", "")
- t = replacetext(t, "\[small\]", "")
- t = replacetext(t, "\[/small\]", "")
- t = replacetext(t, "\[list\]", "")
- t = replacetext(t, "\[/list\]", "")
- t = replacetext(t, "\[table\]", "")
- t = replacetext(t, "\[/table\]", "")
- t = replacetext(t, "\[row\]", "")
- t = replacetext(t, "\[cell\]", "")
- t = replacetext(t, "\[logo\]", "")
-
- t = "[t] "
-
- t = copytext(t, 1, MAX_PAPER_MESSAGE_LEN)
+/obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob)
+ t = pencode_to_html(t, usr, P, TRUE, TRUE, deffont, signfont, crayonfont)
//Count the fields
var/laststart = 1
@@ -303,12 +252,10 @@
//var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN)
var/t = input("Enter what you want to write:", "Write", null, null) as message
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
- var/iscrayon = 0
add_hiddenprint(usr) // No more forging nasty documents as someone else, you jerks
if(!istype(i, /obj/item/weapon/pen))
if(!istype(i, /obj/item/toy/crayon))
return
- iscrayon = 1
// if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr
@@ -320,14 +267,13 @@
// check for exploits
for(var/bad in paper_blacklist)
if(findtext(t,bad))
- to_chat(usr, "\blue You think to yourself, \"Hm.. this is only paper...\"")
+ to_chat(usr, "You think to yourself, \ "Hm.. this is only paper...\"")
log_admin("PAPER: [key_name(usr)] tried to use forbidden word in [src]: [bad].")
message_admins("PAPER: [key_name_admin(usr)] tried to use forbidden word in [src]: [bad].")
return
*/
t = html_encode(t)
- t = replacetext(t, "\n", " ")
- t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
+ t = parsepencode(t, i, usr) // Encode everything from pencode to html
if(id!="end")
addtofield(text2num(id), t) // He wants to edit a field, let him.
@@ -335,6 +281,8 @@
info += t // Oh, he wants to edit to the end of the file, let him.
updateinfolinks()
+ i.on_write(src,usr)
+
show_content(usr, forceshow = 1, infolinks = 1)
update_icon()
@@ -701,7 +649,7 @@
to_chat(H, "You feel surrounded by sadness. Sadness... and HONKS! ")
H.makeCluwne()
else if(myeffect == "Demotion Notice")
- command_announcement.Announce("[mytarget] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order")
+ event_announcement.Announce("[mytarget] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order")
else
message_admins("Evil paper [src] was activated without a proper effect set! This is a bug.")
used = 1
@@ -710,3 +658,13 @@
/obj/item/weapon/paper/evilfax/proc/evilpaper_selfdestruct()
visible_message("[src] spontaneously catches fire, and burns up! ")
qdel(src)
+
+/obj/item/weapon/paper/pickup(user)
+ if(contact_poison && ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(!istype(G) || G.transfer_prints)
+ H.reagents.add_reagent(contact_poison, contact_poison_volume)
+ contact_poison = null
+ add_logs(user, src, "picked up [src], the paper poisoned by [contact_poison_poisoner]")
+ ..()
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 1710ae1d485..2a7c7e113e1 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -5,7 +5,7 @@
icon_state = "paper"
item_state = "paper"
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_range = 2
throw_speed = 1
layer = 4
@@ -94,7 +94,7 @@
qdel(src)
else
- to_chat(user, "\red You must hold \the [P] steady to burn \the [src].")
+ to_chat(user, "You must hold \the [P] steady to burn \the [src]. ")
/obj/item/weapon/paper_bundle/examine(mob/user)
if(..(user, 1))
@@ -241,4 +241,4 @@
if(photo)
desc += "\nThere is a photo attached to it."
overlays += image('icons/obj/bureaucracy.dmi', "clip")
- return
\ No newline at end of file
+ return
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 9770fb8c523..efcce443d6c 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -4,7 +4,7 @@
icon_state = "paper_bin1"
item_state = "sheet-metal"
throwforce = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 7
pressure_resistance = 8
@@ -18,10 +18,7 @@
..()
/obj/item/weapon/paper_bin/Destroy()
- if(papers)
- for(var/i in papers)
- qdel(i)
- papers.Cut()
+ QDEL_LIST(papers)
return ..()
/obj/item/weapon/paper_bin/burn()
@@ -54,9 +51,9 @@
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
+ var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(H.hand)
- temp = H.organs_by_name["l_hand"]
+ temp = H.bodyparts_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(H, "You try to move your [temp.name], but cannot!")
return
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index d7f86727d87..89bd843467a 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -17,7 +17,7 @@
item_state = "pen"
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=10)
@@ -167,7 +167,7 @@
force = 18
sharp = 1
edge = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
name = "energy dagger"
hitsound = 'sound/weapons/blade1.ogg'
throwforce = 35
@@ -182,3 +182,22 @@
else
icon_state = initial(icon_state) //looks like a normal pen when off.
item_state = initial(item_state)
+
+/obj/item/proc/on_write(obj/item/weapon/paper/P, mob/user)
+ return
+
+/obj/item/weapon/pen/poison
+ var/uses_left = 3
+
+/obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user)
+ if(P.contact_poison_volume)
+ to_chat(user, "[P] is already coated. ")
+ else if(uses_left)
+ uses_left--
+ P.contact_poison = "amanitin"
+ P.contact_poison_volume = 15
+ P.contact_poison_poisoner = user.name
+ add_logs(user, P, "used poison pen on")
+ to_chat(user, "You apply the poison to [P]. ")
+ else
+ to_chat(user, "[src] clicks. It seems to be depleted. ")
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index d333ed1cf47..a438d98afdc 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -19,10 +19,13 @@
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
var/mob/living/ass = null
-/obj/machinery/photocopier/attack_ai(mob/user as mob)
+/obj/machinery/photocopier/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/photocopier/attack_ghost(mob/user)
return attack_hand(user)
-/obj/machinery/photocopier/attack_hand(mob/user as mob)
+/obj/machinery/photocopier/attack_hand(mob/user)
user.set_machine(src)
var/dat = "Photocopier "
@@ -47,11 +50,14 @@
return
/obj/machinery/photocopier/Topic(href, href_list)
+ if(..())
+ return 1
+
if(href_list["copy"])
if(stat & (BROKEN|NOPOWER))
return
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
for(var/i = 0, i < copies, i++)
if(toner <= 0)
break
@@ -111,7 +117,7 @@
if(!selection)
return
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc)
p.construct(selection)
if(p.desc == "")
@@ -144,7 +150,7 @@
else
to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner. ")
else if(istype(O, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = !anchored
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src]. ")
else if(istype(O, /obj/item/weapon/grab)) //For ass-copying.
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index c24dec2413f..dc86ce2299a 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -15,7 +15,7 @@
desc = "A camera film cartridge. Insert it into a camera to reload it."
icon_state = "film"
item_state = "electropack"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
@@ -27,9 +27,10 @@
icon = 'icons/obj/items.dmi'
icon_state = "photo"
item_state = "paper"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
burn_state = FLAMMABLE
burntime = 5
+ var/blueprints = 0 // Does this have the blueprints?
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/icon/tiny
@@ -70,7 +71,7 @@
qdel(src)
else
- to_chat(user, "\red You must hold \the [P] steady to burn \the [src].")
+ to_chat(user, "You must hold \the [P] steady to burn \the [src]. ")
/obj/item/weapon/photo/examine(mob/user)
if(..(user, 1) || isobserver(user))
@@ -109,7 +110,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "album"
item_state = "briefcase"
- can_hold = list("/obj/item/weapon/photo")
+ can_hold = list(/obj/item/weapon/photo)
burn_state = FLAMMABLE
/obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj)
@@ -145,12 +146,13 @@
desc = "A polaroid camera. 10 photos left."
icon_state = "camera"
item_state = "electropack"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
var/list/matter = list("metal" = 2000)
var/pictures_max = 10
var/pictures_left = 10
var/on = 1
+ var/blueprints = 0
var/icon_on = "camera"
var/icon_off = "camera_off"
var/size = 3
@@ -253,6 +255,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
var/atom/A = sorted[i]
if(A)
var/icon/img = getFlatIcon(A)//build_composite_icon(A)
+ if(istype(A, /obj/item/areaeditor/blueprints))
+ blueprints = 1
// If what we got back is actually a picture, draw it.
if(istype(img, /icon))
@@ -351,7 +355,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
y_c--
x_c = x_c - size
- var/datum/picture/P = createpicture(target, user, turfs, mobs, flag)
+ var/datum/picture/P = createpicture(target, user, turfs, mobs, flag, blueprints)
printpicture(user, P)
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
@@ -388,6 +392,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
Photo.loc = user.loc
if(!user.get_inactive_hand())
user.put_in_inactive_hand(Photo)
+
+ if(blueprints)
+ Photo.blueprints = 1
+ blueprints = 0
Photo.construct(P)
/obj/item/weapon/photo/proc/construct(var/datum/picture/P)
@@ -409,6 +417,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
p.name = name
p.desc = desc
p.scribble = scribble
+ p.blueprints = blueprints
return p
@@ -499,7 +508,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
desc = "video camera that can send live feed to the entertainment network."
icon_state = "videocam"
item_state = "videocam"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
materials = list(MAT_METAL=2000)
var/on = 0
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 26e397039d8..2ca25bf185f 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -5,7 +5,7 @@
icon_state = "stamp-ok"
item_state = "stamp"
throwforce = 0
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=60)
@@ -105,4 +105,4 @@
if(chosen_stamp)
name = chosen_stamp.name
icon_state = chosen_stamp.icon_state
- item_color = chosen_stamp.item_color
\ No newline at end of file
+ item_color = chosen_stamp.item_color
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index 6874593f33a..df129989965 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -10,7 +10,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon = 'icons/obj/pda.dmi'
icon_state = "pda"
item_state = "electronic"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_ID | SLOT_BELT | SLOT_PDA
//Main variables
@@ -302,21 +302,29 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/AltClick(mob/user)
..()
- if(issilicon(usr))
+ if(issilicon(user))
return
if(can_use(user))
if(id)
- remove_id()
+ remove_id(user)
else
to_chat(user, "This PDA does not have an ID in it! ")
-/obj/item/device/pda/proc/remove_id()
+/obj/item/device/pda/CtrlClick(mob/user)
+ ..()
+ if(issilicon(user))
+ return
+
+ if(can_use(user))
+ remove_pen(user)
+
+/obj/item/device/pda/proc/remove_id(mob/user)
if(id)
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(id)
- to_chat(usr, "You remove the ID from the [name]. ")
+ to_chat(user, "You remove the ID from the [name]. ")
else
id.forceMove(get_turf(src))
overlays -= image('icons/goonstation/objects/pda_overlay.dmi', id.icon_state)
@@ -332,36 +340,37 @@ var/global/list/obj/item/device/pda/PDAs = list()
if( can_use(usr) )
if(id)
- remove_id()
+ remove_id(usr)
else
to_chat(usr, "This PDA does not have an ID in it. ")
else
to_chat(usr, "You cannot do this while restrained. ")
-
/obj/item/device/pda/verb/verb_remove_pen()
set category = "Object"
set name = "Remove pen"
set src in usr
+ remove_pen(usr)
- if(issilicon(usr))
+/obj/item/device/pda/proc/remove_pen(mob/user)
+
+ if(issilicon(user))
return
- if( can_use(usr) )
+ if( can_use(user) )
var/obj/item/weapon/pen/O = locate() in src
if(O)
+ to_chat(user, "You remove the [O] from [src]. ")
if(istype(loc, /mob))
var/mob/M = loc
if(M.get_active_hand() == null)
M.put_in_hands(O)
- to_chat(usr, "You remove \the [O] from \the [src]. ")
return
O.forceMove(get_turf(src))
else
- to_chat(usr, "This PDA does not have a pen in it. ")
+ to_chat(user, "This PDA does not have a pen in it. ")
else
- to_chat(usr, "You cannot do this while restrained. ")
-
+ to_chat(user, "You cannot do this while restrained. ")
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1)
@@ -440,7 +449,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
scanmode.scan_atom(A, user)
/obj/item/device/pda/proc/explode() //This needs tuning.
- if(!src.detonate) return
+ if(!detonate)
+ return
var/turf/T = get_turf(src.loc)
if(ismob(loc))
@@ -463,12 +473,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
pai.forceMove(T)
current_app = null
scanmode = null
- for(var/A in programs)
- qdel(A)
- programs.Cut()
- if(cartridge)
- qdel(cartridge)
- cartridge = null
+ QDEL_LIST(programs)
+ QDEL_NULL(cartridge)
return ..()
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
@@ -505,8 +511,3 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/process()
if(current_app)
current_app.program_process()
-
-/obj/item/device/pda/hit_check(speed)
- if(current_app)
- current_app.program_hit_check()
- ..()
\ No newline at end of file
diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm
index 30d26607113..b432effb8be 100644
--- a/code/modules/pda/cart.dm
+++ b/code/modules/pda/cart.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/pda.dmi'
icon_state = "cart"
item_state = "electronic"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/obj/item/radio/integrated/radio = null
@@ -24,15 +24,9 @@
..()
/obj/item/weapon/cartridge/Destroy()
- if(radio)
- qdel(radio)
- radio = null
- for(var/A in programs)
- qdel(A)
- programs.Cut()
- for(var/A in messenger_plugins)
- qdel(A)
- messenger_plugins.Cut()
+ QDEL_NULL(radio)
+ QDEL_LIST(programs)
+ QDEL_LIST(messenger_plugins)
return ..()
/obj/item/weapon/cartridge/proc/update_programs(obj/item/device/pda/pda)
@@ -328,4 +322,4 @@
my_game.hacked = 1
to_chat(user, "TR4P_M45T3R.mod successfully initialized. ToS violated. User Agreement nullified. Gotta pwn them all. ")
to_chat(user, "You can now create trapped versions of any mob in your collection that will damage hunters who attempt to capture it. ")
- description_antag = "This copy of Nano-Mob Hunter GO! has been hacked to allow the creation of trap mobs which will cause any PDA that attempts to capture it to shock anyone holding it. Hacked copies of the game will not trigger the trap."
\ No newline at end of file
+ description_antag = "This copy of Nano-Mob Hunter GO! has been hacked to allow the creation of trap mobs which will cause any PDA that attempts to capture it to shock anyone holding it. Hacked copies of the game will not trigger the trap."
diff --git a/code/modules/pda/chatroom.dm b/code/modules/pda/chatroom.dm
index af03356f01f..de6f434a7dd 100644
--- a/code/modules/pda/chatroom.dm
+++ b/code/modules/pda/chatroom.dm
@@ -78,6 +78,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
ch.users -= src
if(src in ch.invites)
ch.invites -= src
+ return ..()
/datum/data/pda/app/chatroom/start()
. = ..()
diff --git a/code/modules/pda/messenger_plugins.dm b/code/modules/pda/messenger_plugins.dm
index 8585a26c827..b1fa63dd2e0 100644
--- a/code/modules/pda/messenger_plugins.dm
+++ b/code/modules/pda/messenger_plugins.dm
@@ -22,7 +22,7 @@
/datum/data/pda/messenger_plugin/virus/clown/user_act(mob/user as mob, obj/item/device/pda/P)
. = ..(user, P)
if(.)
- user.show_message("Virus sent! ", 1)
+ user.show_message("Virus sent! ", 1)
P.honkamt = (rand(15,20))
P.ttone = "honk"
@@ -33,7 +33,7 @@
/datum/data/pda/messenger_plugin/virus/mime/user_act(mob/user as mob, obj/item/device/pda/P)
. = ..(user, P)
if(.)
- user.show_message("Virus sent! ", 1)
+ user.show_message("Virus sent! ", 1)
var/datum/data/pda/app/M = P.find_program(/datum/data/pda/app/messenger)
if(M)
M.notify_silent = 1
@@ -57,16 +57,19 @@
else
difficulty += 2
- if(prob(difficulty * 12) || (pda.hidden_uplink))
- user.show_message("An error flashes on your [pda]. ", 1)
+ if(!P.detonate || P.hidden_uplink)
+ user.show_message("The target PDA does not seem to respond to the detonation command. ", 1)
+ pda.cartridge.charges++
+ else if(prob(difficulty * 12))
+ user.show_message("An error flashes on your [pda]. ", 1)
else if(prob(difficulty * 3))
- user.show_message("Energy feeds back into your [pda]! ", 1)
+ user.show_message("Energy feeds back into your [pda]! ", 1)
pda.close(user)
pda.explode()
log_admin("[key_name(user)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
message_admins("[key_name_admin(user)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1)
else
- user.show_message("Success! ", 1)
+ user.show_message("Success! ", 1)
log_admin("[key_name(user)] just attempted to blow up [P] with the Detomatix cartridge and succeded")
message_admins("[key_name_admin(user)] just attempted to blow up [P] with the Detomatix cartridge and succeded", 1)
P.explode()
\ No newline at end of file
diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm
index 9b8e3225976..bec10f782ab 100644
--- a/code/modules/pda/mob_hunt_game_app.dm
+++ b/code/modules/pda/mob_hunt_game_app.dm
@@ -74,12 +74,6 @@
return
scan_nearby()
-/datum/data/pda/app/mob_hunter_game/program_hit_check()
- if(!pda)
- return
- for(var/obj/effect/nanomob/hit_mob in get_turf(pda))
- hit_mob.hitby(pda)
-
/datum/data/pda/app/mob_hunter_game/proc/register_capture(datum/mob_hunt/captured, wild = 0)
if(!captured)
return 0
diff --git a/code/modules/pda/pdas.dm b/code/modules/pda/pdas.dm
index 5e7fa98750b..db7d68fdf37 100644
--- a/code/modules/pda/pdas.dm
+++ b/code/modules/pda/pdas.dm
@@ -99,6 +99,18 @@
default_cartridge = /obj/item/weapon/cartridge/hos
icon_state = "pda-h"
+/obj/item/device/pda/heads/ert
+
+/obj/item/device/pda/heads/ert/engineering
+ icon_state = "pda-engineer"
+
+/obj/item/device/pda/heads/ert/security
+ icon_state = "pda-security"
+
+/obj/item/device/pda/heads/ert/medical
+ icon_state = "pda-medical"
+
+
/obj/item/device/pda/cargo
default_cartridge = /obj/item/weapon/cartridge/quartermaster
icon_state = "pda-cargo"
@@ -199,4 +211,4 @@
/obj/item/weapon/cartridge/medical,
/obj/item/weapon/cartridge/signal/toxins,
/obj/item/weapon/cartridge/quartermaster)
- new newcart(src)
\ No newline at end of file
+ new newcart(src)
diff --git a/code/modules/pooling/pool.dm b/code/modules/pooling/pool.dm
deleted file mode 100644
index 2d769a020cb..00000000000
--- a/code/modules/pooling/pool.dm
+++ /dev/null
@@ -1,125 +0,0 @@
-
-/*
-/tg/station13 /datum Pool:
----------------------------------
-By RemieRichards
-
-Creation/Deletion is laggy, so let's reduce reuse and recycle!
-
-Usage:
-
-To get a object, just call
- - PoolOrNew(type, arg) if you only want to pass one argument to New(), usually loc
- - PoolOrNew(type, list) if you want to pass multiple arguments to New()
-
-To put a object back in the pool, call PlaceInPool(object)
-This will call destroy on the object, set its loc to null,
-and reset all of its vars to their default
-
-You can override your object's destroy to return QDEL_HINT_PUTINPOOL
-to ensure its always placed in this pool (this will only be acted on if qdel calls destroy, and destroy will not get called twice)
-
-For almost all pooling purposes, it is better to use the QDEL hint than to pool it directly with PlaceInPool
-
-*/
-
-var/global/list/GlobalPool = list()
-
-//You'll be using this proc 90% of the time.
-//It grabs a type from the pool if it can
-//And if it can't, it creates one
-//The pool is flexible and will expand to fit
-//The new created atom when it eventually
-//Goes into the pool
-
-//Second argument can be a single arg
-//Or a list of arguments
-//Either way it gets passed to new
-
-/proc/PoolOrNew(get_type,second_arg)
- if(!get_type)
- return
-
- . = GetFromPool(get_type,second_arg)
-
- if(!.)
- if(ispath(get_type))
- if(islist(second_arg))
- . = new get_type (arglist(second_arg))
- else
- . = new get_type (second_arg)
-
-
-/proc/GetFromPool(get_type,second_arg)
- if(!get_type)
- return
-
- if(isnull(GlobalPool[get_type]))
- return
-
- if(length(GlobalPool[get_type]) == 0)
- return
-
- var/datum/pooled = pop(GlobalPool[get_type])
- if(pooled)
- var/atom/movable/AM
- if(istype(pooled, /atom/movable))
- AM = pooled
-
- if(islist(second_arg))
- if(AM)
- AM.loc = second_arg[1] //we need to do loc setting explicetly before even calling New() to replicate new()'s behavior
- pooled.New(arglist(second_arg))
-
- else
- if(AM)
- AM.loc = second_arg
- pooled.New(second_arg)
-
- return pooled
-
-
-/proc/PlaceInPool(datum/diver, destroy = 1)
- if(!istype(diver))
- return
-
- if(diver in GlobalPool[diver.type])
- return
-
- if(!GlobalPool[diver.type])
- GlobalPool[diver.type] = list()
-
- GlobalPool[diver.type] |= diver
-
- if(destroy)
- diver.Destroy()
-
- diver.ResetVars()
-
-var/list/exclude = list("animate_movement", "contents", "loc", "locs", "parent_type", "vars", "verbs", "type")
-var/list/pooledvariables = list()
-//thanks to clusterfack @ /vg/station for these two procs
-/datum/proc/createVariables()
- pooledvariables[type] = new/list()
- var/list/exclude = global.exclude + args
-
- for(var/key in vars)
- if(key in exclude)
- continue
- pooledvariables[type][key] = initial(vars[key])
-
-/datum/proc/ResetVars()
- if(!pooledvariables[type])
- createVariables(args)
-
- for(var/key in pooledvariables[type])
- vars[key] = pooledvariables[type][key]
-
-/atom/movable/ResetVars()
- ..()
- loc = null
- contents = initial(contents) //something is really wrong if this object still has stuff in it by this point
-
-/image/ResetVars()
- ..()
- loc = null
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 56da9cf9b07..0b2c6f8b165 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -90,7 +90,6 @@
var/update_overlay = -1
var/global/status_overlays = 0
var/updating_icon = 0
- var/standard_max_charge
var/datum/wires/apc/wires = null
//var/debug = 0
var/global/list/status_overlays_lock
@@ -123,9 +122,11 @@
desc = "Heavy-duty switching circuits for power control."
icon = 'icons/obj/module.dmi'
icon_state = "power_mod"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
flags = CONDUCT
+ usesound = 'sound/items/Deconstruct.ogg'
+ toolspeed = 1
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
@@ -140,9 +141,6 @@
apcs += src
apcs = sortAtom(apcs)
wires = new(src)
- var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new
- standard_max_charge = tmp_cell.maxcharge
- qdel(tmp_cell)
// offset 24 pixels in direction of dir
// this allows the APC to be embedded in a wall, yet still inside an area
@@ -176,11 +174,8 @@
area.power_change()
if(occupier)
malfvacate(1)
- qdel(wires)
- wires = null
- if(cell)
- qdel(cell) // qdel
- cell = null
+ QDEL_NULL(wires)
+ QDEL_NULL(cell)
if(terminal)
disconnect_terminal()
area.apc -= src
@@ -199,7 +194,7 @@
if(cell_type)
src.cell = new/obj/item/weapon/stock_parts/cell(src)
cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively)
- cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value)
+ cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
var/area/A = get_area(src)
@@ -232,7 +227,7 @@
if(has_electronics && terminal)
to_chat(user, "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].")
else if(!has_electronics && terminal)
- to_chat(user, "There are some wires but no any electronics.")
+ to_chat(user, "There are some wires but no electronics.")
else if(has_electronics && !terminal)
to_chat(user, "Electronics installed but not wired.")
else /* if(!has_electronics && !terminal) */
@@ -431,10 +426,10 @@
if(terminal)
to_chat(user, "Disconnect wires first. ")
return
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You are trying to remove the power control board...")//lpeters - fixed grammar issues
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
if(has_electronics==1)
has_electronics = 0
if((stat & BROKEN) || malfhack)
@@ -472,6 +467,7 @@
user.visible_message(\
"[user.name] has inserted the power cell to [src.name]! ",\
"You insert the power cell.")
+ playsound(loc, W.usesound, 50, 1)
chargecount = 0
update_icon()
else if(istype(W, /obj/item/weapon/screwdriver)) // haxing
@@ -484,12 +480,12 @@
if(has_electronics==1 && terminal)
has_electronics = 2
stat &= ~MAINT
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You screw the circuit electronics into place.")
else if(has_electronics==2)
has_electronics = 1
stat |= MAINT
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You unfasten the electronics.")
else /* has_electronics==0 */
to_chat(user, "There is nothing to secure. ")
@@ -499,7 +495,7 @@
to_chat(user, "The interface is broken.")
else
wiresexposed = !wiresexposed
- to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
+ to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"].")
update_icon()
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
@@ -508,7 +504,7 @@
else if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else if(wiresexposed)
- to_chat(user, "You must close the panel")
+ to_chat(user, "You must close the panel.")
else if(stat & (BROKEN|MAINT))
to_chat(user, "Nothing happens.")
else
@@ -527,8 +523,8 @@
to_chat(user, "You need more wires. ")
return
to_chat(user, "You start adding cables to the APC frame...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, C.usesound, 50, 1)
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(C.amount >= 10 && !terminal && opened && has_electronics != 2)
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
@@ -548,8 +544,8 @@
to_chat(user, "You must remove the floor plating in front of the APC first. ")
return
to_chat(user, "You begin to cut the cables...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ playsound(src.loc, W.usesound, 50, 1)
+ if(do_after(user, 50 * W.toolspeed, target = src))
if(terminal && opened && has_electronics!=2)
if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -561,10 +557,11 @@
qdel(terminal) // qdel
else if(istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
to_chat(user, "You trying to insert the power control board into the frame...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(src.loc, W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
if(has_electronics==0)
has_electronics = 1
+ locked = 0
to_chat(user, "You place the power control board inside the frame. ")
qdel(W) // qdel
else if(istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack))
@@ -578,8 +575,8 @@
user.visible_message("[user.name] welds [src]. ", \
"You start welding the APC frame...", \
"You hear welding.")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 50 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(3, user)) return
if(emagged || malfhack || (stat & BROKEN) || opened==2)
new /obj/item/stack/sheet/metal(loc)
@@ -609,7 +606,7 @@
to_chat(user, "You cannot repair this APC until you remove the electronics still inside.")
return
to_chat(user, "You begin to replace the damaged APC frame...")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
user.visible_message(\
"[user.name] has replaced the damaged APC frame with new one. ",\
"You replace the damaged APC frame with new one.")
@@ -624,14 +621,14 @@
if(((stat & BROKEN) || malfhack) \
&& !opened \
&& ( \
- (W.force >= 5 && W.w_class >= 3.0) \
+ (W.force >= 5 && W.w_class >= WEIGHT_CLASS_NORMAL) \
|| istype(W,/obj/item/weapon/crowbar) \
) \
&& prob(20) )
opened = 2
user.visible_message("The APC cover was knocked down with the [W.name] by [user.name]! ", \
"You knock down the APC cover with your [W.name]! ", \
- "You hear bang")
+ "You hear a bang.")
update_icon()
else
if(istype(user, /mob/living/silicon))
@@ -640,17 +637,20 @@
(istype(W, /obj/item/device/multitool) || \
istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
return src.attack_hand(user)
+ if(W.flags & NOBLUDGEON)
+ return
+ user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("The [src.name] has been hit with the [W.name] by [user.name]! ", \
"You hit the [src.name] with your [W.name]! ", \
- "You hear bang")
+ "You hear a bang.")
/obj/machinery/power/apc/emag_act(user as mob)
if(!(emagged || malfhack)) // trying to unlock with an emag card
if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else if(wiresexposed)
- to_chat(user, "You must close the panel first")
+ to_chat(user, "You must close the panel first.")
else if(stat & (BROKEN|MAINT))
to_chat(user, "Nothing happens.")
else
@@ -667,36 +667,6 @@
if(!user)
return
src.add_fingerprint(user)
- //Synthetic human mob goes here.
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(H.get_int_organ(/obj/item/organ/internal/cell) && H.a_intent == I_GRAB)
- if(emagged || stat & BROKEN)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- to_chat(H, "The APC power currents surge erratically, damaging your chassis! ")
- H.adjustFireLoss(10,0)
- else if(src.cell && src.cell.charge > 0)
- if(H.nutrition < NUTRITION_LEVEL_WELL_FED)
- if(src.cell.charge >= 500)
- H.nutrition += 50
- src.cell.charge -= 500
- else
- H.nutrition += src.cell.charge/10
- src.cell.charge = 0
-
- to_chat(user, "You slot your fingers into the APC interface and siphon off some of the stored charge for your own use. ")
- if(src.cell.charge < 0)
- src.cell.charge = 0
- if(H.nutrition > NUTRITION_LEVEL_WELL_FED + 50)
- H.nutrition = NUTRITION_LEVEL_WELL_FED + 50
- src.charging = 1
- else
- to_chat(user, "You are already fully charged. ")
- else
- to_chat(user, "There is no charge to draw from that APC. ")
- return
if(usr == user && opened && (!issilicon(user)))
if(cell)
@@ -745,16 +715,16 @@
beenhit += 1
return
-/obj/machinery/power/apc/attack_ghost(user as mob)
- if(stat & (BROKEN|MAINT))
- return
+/obj/machinery/power/apc/attack_ghost(mob/user)
+ if(wiresexposed)
+ wires.Interact(user)
return ui_interact(user)
/obj/machinery/power/apc/interact(mob/user)
if(!user)
return
- if(wiresexposed /*&& (!istype(user, /mob/living/silicon))*/) //Commented out the typecheck to allow engiborgs to repair damaged apcs.
+ if(wiresexposed)
wires.Interact(user)
return ui_interact(user)
@@ -834,7 +804,7 @@
data["powerChannels"] = powerChannels
- return data
+ return data
/obj/machinery/power/apc/proc/report()
return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])"
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 0bbc04c08d8..b70e847cab4 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -74,6 +74,12 @@ By design, d1 is the smallest direction and d2 is the highest
if(level==1) hide(T.intact)
cable_list += src //add it to the global cable list
+ // Catches the interim-zone of worldstart and roundstart
+ // I want both the ticker to exist (so mapped-in cables don't trip this)
+ // but also not have started yet (since the zlevel system would handle this on its own otherwise)
+ if((ticker && ticker.current_state < GAME_STATE_PLAYING))
+ attempt_init()
+
/obj/structure/cable/Destroy() // called when a cable is deleted
if(powernet)
@@ -114,7 +120,7 @@ By design, d1 is the smallest direction and d2 is the highest
//
/obj/structure/cable/attackby(obj/item/W, mob/user)
- var/turf/T = src.loc
+ var/turf/T = get_turf(src)
if(T.intact)
return
@@ -125,7 +131,7 @@ By design, d1 is the smallest direction and d2 is the highest
return */
///// Z-Level Stuff
/* if(breaker_box)
- to_chat(user, "\red This cable is connected to nearby breaker box. Use breaker box to interact with it.")
+ to_chat(user, "This cable is connected to nearby breaker box. Use breaker box to interact with it. ")
return */
if(shock(user, 50))
@@ -149,7 +155,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(c.d1 == 12 || c.d2 == 12)
c.qdel()*/
///// Z-Level Stuff
- investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]([T.x], [T.y], [T.z] - JMP )","wires")
+ investigate_log("was cut by [key_name(usr, usr.client)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires")
qdel(src) // qdel
return
@@ -162,6 +168,12 @@ By design, d1 is the smallest direction and d2 is the highest
return
coil.cable_join(src, user)
+ else if(istype(W, /obj/item/weapon/twohanded/rcl))
+ var/obj/item/weapon/twohanded/rcl/R = W
+ if(R.loaded)
+ R.loaded.cable_join(src, user)
+ R.is_empty(user)
+
else if(istype(W, /obj/item/device/multitool))
if(powernet && (powernet.avail > 0)) // is it powered?
@@ -197,12 +209,12 @@ By design, d1 is the smallest direction and d2 is the highest
qdel(src) // qdel
if(2.0)
if(prob(50))
- new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color)
+ new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, color)
qdel(src) // qdel
if(3.0)
if(prob(25))
- new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color)
+ new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, color)
qdel(src) // qdel
return
@@ -469,10 +481,11 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
item_state = "coil_red"
amount = MAXCOIL
max_amount = MAXCOIL
+ merge_type = /obj/item/stack/cable_coil // This is here to let its children merge between themselves
color = COLOR_RED
desc = "A coil of power cable."
throwforce = 10
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 2
throw_range = 5
materials = list(MAT_METAL=10, MAT_GLASS=5)
@@ -480,21 +493,21 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
slot_flags = SLOT_BELT
item_state = "coil"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
+ usesound = 'sound/items/Deconstruct.ogg'
+ toolspeed = 1
/obj/item/stack/cable_coil/suicide_act(mob/user)
if(locate(/obj/structure/stool) in user.loc)
- user.visible_message("[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide. ")
+ user.visible_message("[user] is making a noose with the [name]! It looks like \he's trying to commit suicide. ")
else
- user.visible_message("[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide. ")
+ user.visible_message("[user] is strangling \himself with the [name]! It looks like \he's trying to commit suicide. ")
return(OXYLOSS)
/obj/item/stack/cable_coil/New(loc, length = MAXCOIL, var/paramcolor = null)
..()
- src.amount = length
+ amount = length
if(paramcolor)
color = paramcolor
- else
- color = color
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
update_icon()
@@ -505,10 +518,10 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
// General procedures
///////////////////////////////////
//you can use wires to heal robotics
-/obj/item/stack/cable_coil/attack(mob/M as mob, mob/user as mob)
+/obj/item/stack/cable_coil/attack(mob/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
+ var/obj/item/organ/external/S = H.bodyparts_by_name[user.zone_sel.selecting]
if(!S)
return
@@ -543,7 +556,6 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
/obj/item/stack/cable_coil/update_icon()
if(!color)
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
- color = color
if(amount == 1)
icon_state = "coil1"
name = "cable piece"
@@ -556,9 +568,9 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
/obj/item/stack/cable_coil/proc/update_wclass()
if(amount == 1)
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
else
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/stack/cable_coil/examine(mob/user)
if(!..(user, 1))
@@ -614,11 +626,11 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
return C
// called when cable_coil is clicked on a turf/simulated/floor
-/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user)
+/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user, dirnew)
if(!isturf(user.loc))
return
- if(!T.can_have_cabling())
+ if(!isturf(T) || T.intact || !T.can_have_cabling())
to_chat(user, "You can only lay cables on catwalks and plating! ")
return
@@ -630,44 +642,46 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
to_chat(user, "You can't lay cable at a place that far away! ")
return
- else
- var/dirn
-
+ var/dirn = null
+ if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm)
if(user.loc == T)
- dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing
+ dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing
else
dirn = get_dir(T, user)
+ else
+ dirn = dirnew
- for(var/obj/structure/cable/LC in T)
- if(LC.d2 == dirn && LC.d1 == 0)
- to_chat(user, "There's already a cable at that position! ")
- return
+ for(var/obj/structure/cable/LC in T)
+ if(LC.d2 == dirn && LC.d1 == 0)
+ to_chat(user, "There's already a cable at that position! ")
+ return
- var/obj/structure/cable/C = get_new_cable(T)
+ var/obj/structure/cable/C = get_new_cable(T)
- //set up the new cable
- C.d1 = 0 //it's a O-X node cable
- C.d2 = dirn
- C.add_fingerprint(user)
- C.updateicon()
+ //set up the new cable
+ C.d1 = 0 //it's a O-X node cable
+ C.d2 = dirn
+ C.add_fingerprint(user)
+ C.updateicon()
- //create a new powernet with the cable, if needed it will be merged later
- var/datum/powernet/PN = new()
- PN.add_cable(C)
+ //create a new powernet with the cable, if needed it will be merged later
+ var/datum/powernet/PN = new()
+ PN.add_cable(C)
- C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets
- C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
+ C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets
+ C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
- if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
- C.mergeDiagonalsNetworks(C.d2)
+ if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
+ C.mergeDiagonalsNetworks(C.d2)
+ use(1)
- use(1)
+ if(C.shock(user, 50))
+ if(prob(50)) //fail
+ new /obj/item/stack/cable_coil(get_turf(C), 1, C.color)
+ qdel(C) // qdel
- if(C.shock(user, 50))
- if(prob(50)) //fail
- new/obj/item/stack/cable_coil(C.loc, 1, C.color)
- qdel(C) // qdel
+ return C
// called when cable_coil is click on an installed obj/cable
// or click on a turf that already contains a "node" cable
@@ -676,7 +690,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
if(!isturf(U))
return
- var/turf/T = C.loc
+ var/turf/T = get_turf(C)
if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable
return
@@ -701,38 +715,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
// cable is pointing at us, we're standing on an open tile
// so create a stub pointing at the clicked cable on our tile
- var/fdirn = turn(dirn, 180) // the opposite direction
-
- for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already
- if(LC.d1 == fdirn || LC.d2 == fdirn)
- to_chat(user, "There's already a cable at that position.")
- return
-
- var/obj/structure/cable/NC = new(U)
- NC.cableColor(color)
-
- NC.d1 = 0
- NC.d2 = fdirn
- NC.add_fingerprint()
- NC.updateicon()
-
- //create a new powernet with the cable, if needed it will be merged later
- var/datum/powernet/newPN = new()
- newPN.add_cable(NC)
-
- NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets
- NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
-
- if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
- NC.mergeDiagonalsNetworks(NC.d2)
-
- use(1)
-
- if(NC.shock(user, 50))
- if(prob(50)) //fail
- new/obj/item/stack/cable_coil(NC.loc, 1, NC.color)
- qdel(NC) // qdel
-
+ place_turf(T, user, turn(dirn, 180))
return
// exisiting cable doesn't point at our position, so see if it's a stub
@@ -778,7 +761,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
if(C.shock(user, 50))
if(prob(50)) //fail
- new/obj/item/stack/cable_coil(C.loc, 2, C.color)
+ new/obj/item/stack/cable_coil(get_turf(C), 2, C.color)
qdel(C) // qdel
return
@@ -831,4 +814,4 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
/obj/item/stack/cable_coil/cyborg/attack_self(mob/user)
var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
color = cablecolor
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm
index 87a25032eb7..e0992d1b79e 100644
--- a/code/modules/power/cable_heavyduty.dm
+++ b/code/modules/power/cable_heavyduty.dm
@@ -16,10 +16,10 @@
return
if(istype(W, /obj/item/weapon/wirecutters))
- to_chat(usr, "\blue These cables are too tough to be cut with those [W.name].")
+ to_chat(usr, "These cables are too tough to be cut with those [W.name]. ")
return
else if(istype(W, /obj/item/stack/cable_coil))
- to_chat(usr, "\blue You will need heavier cables to connect to these.")
+ to_chat(usr, "You will need heavier cables to connect to these. ")
return
else
..()
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index e2e97437b68..942ed2ac98a 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -1,56 +1,29 @@
// the power cell
// charge from 0 to 100%
// fits in APC to provide backup power
-/obj/item/weapon/stock_parts/cell/var/image/overlay_image
-
-/obj/item/weapon/stock_parts/cell/New()
- ..()
- processing_objects.Add(src)
- charge = maxcharge
-
- spawn(5)
- updateicon()
-
-/obj/item/weapon/stock_parts/cell/Destroy()
- processing_objects.Remove(src)
- return ..()
-
-/obj/item/weapon/stock_parts/cell/proc/updateicon()
- if(isnull(src.overlay_image))
- src.overlay_image = image('icons/obj/power.dmi')
- overlays.Cut()
-
- if(charge < 0.01)
- return
- else if(charge/maxcharge >=0.995)
- src.overlay_image.icon_state = "cell-o2"
- overlays += src.overlay_image
- else
- src.overlay_image.icon_state = "cell-o1"
- overlays += src.overlay_image
-
/obj/item/weapon/stock_parts/cell/proc/percent() // return % charge of cell
return 100.0*charge/maxcharge
// use power from a cell
-/obj/item/weapon/stock_parts/cell/proc/use(var/amount)
+/obj/item/weapon/stock_parts/cell/proc/use(amount)
if(rigged && amount > 0)
explode()
return 0
-
- if(charge < amount) return 0
+ if(charge < amount)
+ return 0
charge = (charge - amount)
return 1
// recharge the cell
-/obj/item/weapon/stock_parts/cell/proc/give(var/amount)
+/obj/item/weapon/stock_parts/cell/proc/give(amount)
if(rigged && amount > 0)
explode()
return 0
-
- if(maxcharge < amount) return 0
+ if(maxcharge < amount)
+ return 0
var/power_used = min(maxcharge-charge,amount)
- if(crit_fail) return 0
+ if(crit_fail)
+ return 0
if(!prob(reliability))
minor_fault++
if(prob(minor_fault))
@@ -59,7 +32,6 @@
charge += power_used
return power_used
-
/obj/item/weapon/stock_parts/cell/examine(mob/user)
if(..(user, 1))
if(maxcharge <= 2500)
@@ -67,7 +39,7 @@
else
to_chat(user, "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%.")
if(crit_fail)
- to_chat(user, "\red This power cell seems to be faulty.")
+ to_chat(user, "This power cell seems to be faulty. ")
/obj/item/weapon/stock_parts/cell/attack_self(mob/user as mob)
src.add_fingerprint(user)
@@ -80,12 +52,12 @@
to_chat(user, "You inject the solution into the power cell.")
- if(S.reagents.has_reagent("plasma", 5))
+ if(S.reagents.has_reagent("plasma", 5) || S.reagents.has_reagent("plasma_dust", 5))
rigged = 1
- log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.")
- message_admins("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.")
+ log_admin("LOG: [key_name(user)] injected a power cell with plasma, rigging it to explode.")
+ message_admins("LOG: [key_name_admin(user)] injected a power cell with plasma, rigging it to explode.")
S.reagents.clear_reagents()
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 0ff6289ea66..ed3146d4be7 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -10,23 +10,23 @@
var/obj/machinery/atmospherics/binary/circulator/hot_circ
var/cold_dir = WEST
- var/hot_dir = EAST
-
+ var/hot_dir = EAST
+
var/lastgen = 0
var/lastgenlev = -1
var/lastcirc = "00"
-
+
/obj/machinery/power/generator/New()
..()
update_desc()
-
+
/obj/machinery/power/generator/proc/update_desc()
desc = initial(desc) + " Its cold circulator is located on the [dir2text(cold_dir)] side, and its heat circulator is located on the [dir2text(hot_dir)] side."
-
+
/obj/machinery/power/generator/Destroy()
disconnect()
return ..()
-
+
/obj/machinery/power/generator/proc/disconnect()
if(cold_circ)
cold_circ.generator = null
@@ -38,10 +38,10 @@
/obj/machinery/power/generator/initialize()
..()
connect()
-
+
/obj/machinery/power/generator/proc/connect()
connect_to_network()
-
+
var/obj/machinery/atmospherics/binary/circulator/circpath = /obj/machinery/atmospherics/binary/circulator
cold_circ = locate(circpath) in get_step(src, cold_dir)
hot_circ = locate(circpath) in get_step(src, hot_dir)
@@ -61,13 +61,13 @@
power_change()
update_icon()
updateDialog()
-
+
/obj/machinery/power/generator/power_change()
if(!anchored)
stat |= NOPOWER
else
..()
-
+
/obj/machinery/power/generator/update_icon()
if(stat & (NOPOWER|BROKEN))
overlays.Cut()
@@ -79,7 +79,7 @@
overlays += image('icons/obj/power.dmi', "teg-oc[lastcirc]")
-/obj/machinery/power/generator/process()
+/obj/machinery/power/generator/process()
if(stat & (NOPOWER|BROKEN))
return
@@ -128,11 +128,11 @@
// update icon overlays only if displayed level has changed
if(hot_air)
- var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.get_outlet_air()
hot_circ_air1.merge(hot_air)
if(cold_air)
- var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.get_outlet_air()
cold_circ_air1.merge(cold_air)
var/genlev = max(0, min( round(11 * lastgen / 100000), 11))
@@ -146,12 +146,12 @@
/obj/machinery/power/generator/attack_ai(mob/user)
return attack_hand(user)
-
+
/obj/machinery/power/generator/attack_ghost(mob/user)
if(stat & (NOPOWER|BROKEN))
return
- interact(user)
-
+ interact(user)
+
/obj/machinery/power/generator/attack_hand(mob/user)
if(..())
user << browse(null, "window=teg")
@@ -166,31 +166,37 @@
power_change()
else
connect()
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor. ")
- else if(istype(W, /obj/item/device/multitool))
+ else if(ismultitool(W))
if(cold_dir == WEST)
cold_dir = EAST
hot_dir = WEST
- else
+ else if(cold_dir == NORTH)
+ cold_dir = SOUTH
+ hot_dir = NORTH
+ else if(cold_dir == EAST)
cold_dir = WEST
hot_dir = EAST
+ else
+ cold_dir = NORTH
+ hot_dir = SOUTH
connect()
to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side. ")
update_desc()
else
- ..()
-
+ ..()
+
/obj/machinery/power/generator/proc/get_menu(include_link = 1)
var/t = ""
if(!powernet)
t += "Unable to connect to the power network! "
t += "Retry "
else if(cold_circ && hot_circ)
- var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
- var/datum/gas_mixture/cold_circ_air2 = cold_circ.air2
- var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
- var/datum/gas_mixture/hot_circ_air2 = hot_circ.air2
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.get_outlet_air()
+ var/datum/gas_mixture/cold_circ_air2 = cold_circ.get_inlet_air()
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.get_outlet_air()
+ var/datum/gas_mixture/hot_circ_air2 = hot_circ.get_inlet_air()
t += ""
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index e3be67f7aca..a9893d690c8 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -32,6 +32,11 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(severity == 1) // Very sturdy.
set_broken()
+/obj/machinery/gravity_generator/tesla_act(power, explosive)
+ ..()
+ if(explosive)
+ qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
+
/obj/machinery/gravity_generator/update_icon()
..()
icon_state = "[get_status()]_[sprite_number]"
@@ -52,8 +57,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/part/Destroy()
set_broken()
- if(main_part)
- qdel(main_part)
+ QDEL_NULL(main_part)
return ..()
//
@@ -184,14 +188,14 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(GRAV_NEEDS_SCREWDRIVER)
if(istype(I, /obj/item/weapon/screwdriver))
to_chat(user, "
You secure the screws of the framework. ")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
broken_state++
if(GRAV_NEEDS_WELDING)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(1, user))
to_chat(user, "
You mend the damaged framework. ")
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
broken_state++
if(GRAV_NEEDS_PLASTEEL)
if(istype(I, /obj/item/stack/sheet/plasteel))
@@ -199,14 +203,14 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(PS.amount >= 10)
PS.use(10)
to_chat(user, "
You add the plating to the framework. ")
- playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
+ playsound(src.loc, PS.usesound, 75, 1)
broken_state++
else
to_chat(user, "
You need 10 sheets of plasteel. ")
if(GRAV_NEEDS_WRENCH)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "
You secure the plating to the framework. ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, I.usesound, 75, 1)
set_fix()
else
..()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 7c702313ae4..3f42b4d58ce 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -40,14 +40,14 @@
src.add_fingerprint(user)
if(istype(W, /obj/item/weapon/wrench))
if(src.stage == 1)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
to_chat(usr, "You begin deconstructing [src].")
- if(!do_after(usr, 30, target = src))
+ if(!do_after(usr, 30 * W.toolspeed, target = src))
return
new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
user.visible_message("[user.name] deconstructs [src].", \
"You deconstruct [src].", "You hear a noise.")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
qdel(src)
if(src.stage == 2)
to_chat(usr, "You have to remove the wires first.")
@@ -65,10 +65,10 @@
src.icon_state = "tube-construct-stage1"
if("bulb")
src.icon_state = "bulb-construct-stage1"
- new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red")
+ new /obj/item/stack/cable_coil(get_turf(src.loc), 1, COLOR_RED)
user.visible_message("[user.name] removes the wiring from [src].", \
"You remove the wiring from [src].", "You hear a noise.")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
return
if(istype(W, /obj/item/stack/cable_coil))
@@ -81,6 +81,7 @@
if("bulb")
src.icon_state = "bulb-construct-stage2"
src.stage = 2
+ playsound(loc, coil.usesound, 50, 1)
user.visible_message("[user.name] adds wires to [src].", \
"You add wires to [src].")
return
@@ -95,7 +96,7 @@
src.stage = 3
user.visible_message("[user.name] closes [src]'s casing.", \
"You close [src]'s casing.", "You hear a noise.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
switch(fixture_type)
@@ -138,7 +139,7 @@
var/on_gs = 0
var/static_power_used = 0
var/brightness_range = 8 // luminosity when on, also used in power calculation
- var/brightness_power = 3
+ var/brightness_power = 1
var/brightness_color = null
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
var/flickering = 0
@@ -156,7 +157,6 @@
base_state = "bulb"
fitting = "bulb"
brightness_range = 4
- brightness_power = 2
brightness_color = "#a0a080"
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
@@ -189,12 +189,10 @@
switch(fitting)
if("tube")
brightness_range = 8
- brightness_power = 3
if(prob(2))
broken(1)
if("bulb")
brightness_range = 4
- brightness_power = 2
brightness_color = "#a0a080"
if(prob(5))
broken(1)
@@ -348,7 +346,7 @@
// attempt to stick weapon into light socket
else if(status == LIGHT_EMPTY)
if(istype(W, /obj/item/weapon/screwdriver)) //If it's a screwdriver open it.
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
user.visible_message("[user.name] opens [src]'s casing.", \
"You open [src]'s casing.", "You hear a noise.")
var/obj/machinery/light_construct/newlight = null
@@ -405,7 +403,7 @@
// Aliens smash the bulb but do not get electrocuted./N
/obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs.
if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
- to_chat(user, "\green That object is useless to you.")
+ to_chat(user, "
That object is useless to you. ")
return
else if(status == LIGHT_OK||status == LIGHT_BURNED)
user.do_attack_animation(src)
@@ -416,7 +414,7 @@
/obj/machinery/light/attack_animal(mob/living/simple_animal/M)
if(M.melee_damage_upper == 0) return
if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
- to_chat(M, "\red That object is useless to you.")
+ to_chat(M, "
That object is useless to you. ")
return
else if(status == LIGHT_OK||status == LIGHT_BURNED)
M.do_attack_animation(src)
@@ -535,6 +533,11 @@
on = 1
update()
+/obj/machinery/light/tesla_act(power, explosive = FALSE)
+ if(explosive)
+ explosion(loc,0,0,0,flame_range = 5, adminlog = 0)
+ qdel(src)
+
// explosion effect
// destroy the whole light fixture or just shatter it
@@ -589,7 +592,7 @@
icon = 'icons/obj/lighting.dmi'
force = 2
throwforce = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/base_state
var/switchcount = 0 // number of times switched
@@ -607,13 +610,12 @@
item_state = "c_tube"
materials = list(MAT_GLASS=100)
brightness_range = 8
- brightness_power = 3
/obj/item/weapon/light/tube/large
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
name = "large light tube"
brightness_range = 15
- brightness_power = 4
+ brightness_power = 2
/obj/item/weapon/light/bulb
name = "light bulb"
@@ -623,7 +625,6 @@
item_state = "contvapour"
materials = list(MAT_GLASS=100)
brightness_range = 5
- brightness_power = 2
brightness_color = "#a0a080"
/obj/item/weapon/light/throw_impact(atom/hit_atom)
@@ -638,7 +639,6 @@
item_state = "egg4"
materials = list(MAT_GLASS=100)
brightness_range = 5
- brightness_power = 2
// update the icon state and description of the light
@@ -674,10 +674,10 @@
to_chat(user, "You inject the solution into the [src].")
- if(S.reagents.has_reagent("plasma", 5))
+ if(S.reagents.has_reagent("plasma", 5) || S.reagents.has_reagent("plasma_dust", 5))
- log_admin("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.")
- message_admins("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.")
+ log_admin("LOG: [key_name(user)] injected a light with plasma, rigging it to explode.")
+ message_admins("LOG: [key_name_admin(user)] injected a light with plasma, rigging it to explode.")
rigged = 1
@@ -701,7 +701,7 @@
/obj/item/weapon/light/proc/shatter()
if(status == LIGHT_OK || status == LIGHT_BURNED)
- src.visible_message("\red [name] shatters.","\red You hear a small glass object shatter.")
+ src.visible_message("
[name] shatters. ","
You hear a small glass object shatter. ")
status = LIGHT_BROKEN
force = 5
sharp = 1
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 0abb033e3e8..70be5b747c1 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -288,12 +288,12 @@
disconnect_from_network()
to_chat(user, "
You unsecure the generator from the floor. ")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
anchored = !anchored
else if(istype(O, /obj/item/weapon/screwdriver))
panel_open = !panel_open
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
if(panel_open)
to_chat(user, "
You open the access panel. ")
else
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index bab046450a3..278b4513d2f 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -317,12 +317,16 @@
//source is an object caused electrocuting (airlock, grille, etc)
//No animations will be performed by this proc.
/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0)
- if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb
+ if(!istype(M))
+ return 0
+ if(istype(M.loc,/obj/mecha))
+ return 0 //feckin mechs are dumb
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
- if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on
+ if(G.siemens_coefficient == 0)
+ return 0 //to avoid spamming with insulated glvoes on
var/area/source_area
if(istype(power_source,/area))
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 5ec69cf0233..11c83313737 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -44,7 +44,7 @@ var/global/list/rad_collectors = list()
investigate_log("turned [active?"
on ":"
off "] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"
It is empty "].","singulo")
return
else
- to_chat(user, "\red The controls are locked!")
+ to_chat(user, "
The controls are locked! ")
return
..()
@@ -57,10 +57,10 @@ var/global/list/rad_collectors = list()
atmosanalyzer_scan(P.air_contents, user)
else if(istype(W, /obj/item/weapon/tank/plasma))
if(!src.anchored)
- to_chat(user, "\red The [src] needs to be secured to the floor first.")
+ to_chat(user, "
The [src] needs to be secured to the floor first. ")
return 1
if(src.P)
- to_chat(user, "\red There's already a plasma tank loaded.")
+ to_chat(user, "
There's already a plasma tank loaded. ")
return 1
user.drop_item()
src.P = W
@@ -72,9 +72,9 @@ var/global/list/rad_collectors = list()
return 1
else if(istype(W, /obj/item/weapon/wrench))
if(P)
- to_chat(user, "\blue Remove the plasma tank first.")
+ to_chat(user, "
Remove the plasma tank first. ")
return 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
src.anchored = !src.anchored
user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \
"You [anchored? "secure":"undo"] the external bolts.", \
@@ -90,9 +90,9 @@ var/global/list/rad_collectors = list()
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
src.locked = 0 //just in case it somehow gets locked
- to_chat(user, "\red The controls can only be locked when the [src] is active")
+ to_chat(user, "
The controls can only be locked when the [src] is active ")
else
- to_chat(user, "\red Access denied!")
+ to_chat(user, "
Access denied! ")
return 1
else
..()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 9d42e8d7613..7ee9ea5edf1 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -154,9 +154,9 @@
investigate_log("turned
on by [key_name(usr)]","singulo")
update_icon()
else
- to_chat(user, "\red The controls are locked!")
+ to_chat(user, "
The controls are locked! ")
else
- to_chat(user, "\red The [src] needs to be firmly secured to the floor first.")
+ to_chat(user, "
The [src] needs to be firmly secured to the floor first. ")
return 1
@@ -236,20 +236,20 @@
switch(state)
if(0)
state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear a ratchet")
src.anchored = 1
if(1)
state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc,W.usesound, 75, 1)
user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear a ratchet")
src.anchored = 0
if(2)
- to_chat(user, "\red The [src.name] needs to be unwelded from the floor.")
+ to_chat(user, "
The [src.name] needs to be unwelded from the floor. ")
return
if(istype(W, /obj/item/weapon/weldingtool))
@@ -259,38 +259,38 @@
return
switch(state)
if(0)
- to_chat(user, "\red The [src.name] needs to be wrenched to the floor.")
+ to_chat(user, "
The [src.name] needs to be wrenched to the floor. ")
if(1)
if(WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
state = 2
to_chat(user, "You weld the [src] to the floor.")
connect_to_network()
else
- to_chat(user, "\red You need more welding fuel to complete this task.")
+ to_chat(user, "
You need more welding fuel to complete this task. ")
if(2)
if(WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
state = 1
to_chat(user, "You cut the [src] free from the floor.")
disconnect_from_network()
else
- to_chat(user, "\red You need more welding fuel to complete this task.")
+ to_chat(user, "
You need more welding fuel to complete this task. ")
return
if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
if(emagged)
- to_chat(user, "\red The lock seems to be broken")
+ to_chat(user, "
The lock seems to be broken ")
return
if(src.allowed(user))
if(active)
@@ -298,9 +298,9 @@
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
else
src.locked = 0 //just in case it somehow gets locked
- to_chat(user, "\red The controls can only be locked when the [src] is online")
+ to_chat(user, "
The controls can only be locked when the [src] is online ")
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "
Access denied. ")
return
if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W))
@@ -319,4 +319,4 @@
locked = 0
emagged = 1
if(user)
- user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
+ user.visible_message("[user.name] emags the [src.name].","
You short out the lock. ")
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index d55e240bdf6..aebee058c18 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -87,14 +87,14 @@ field_generator power level display
if(FG_UNSECURED)
if(isinspace()) return
state = FG_SECURED
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
user.visible_message("[user.name] secures [name] to the floor.", \
"
You secure the external reinforcing bolts to the floor. ", \
"
You hear ratchet. ")
anchored = 1
if(FG_SECURED)
state = FG_UNSECURED
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
user.visible_message("[user.name] unsecures [name] reinforcing bolts from the floor.", \
"
You undo the external reinforcing bolts. ", \
"
You hear ratchet. ")
@@ -110,11 +110,11 @@ field_generator power level display
if(FG_SECURED)
if(WT.remove_fuel(0,user))
- playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to weld the [name] to the floor.", \
"
You start to weld \the [src] to the floor... ", \
"
You hear welding. ")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn())
return
state = FG_WELDED
@@ -122,11 +122,11 @@ field_generator power level display
if(FG_WELDED)
if(WT.remove_fuel(0,user))
- playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
"
You start to cut \the [src] free from the floor... ", \
"
You hear welding. ")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn())
return
state = FG_SECURED
@@ -319,7 +319,7 @@ field_generator power level display
if(O.last_warning && temp)
if((world.time - O.last_warning) > 50) //to stop message-spam
temp = 0
- message_admins("A singulo exists and a containment field has failed.",1)
+ message_admins("A singulo exists and a containment field has failed. Location: [get_area(src)] (
JMP )",1)
investigate_log("has
failed whilst a singulo exists.","singulo")
O.last_warning = world.time
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index 11ffbf5a3f6..7746128b251 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -1,7 +1,7 @@
/////SINGULARITY SPAWNER
/obj/machinery/the_singularitygen/
name = "Gravitational Singularity Generator"
- desc = "An Odd Device which produces a Gravitational Singularity when set up."
+ desc = "An odd device which produces a Gravitational Singularity when set up."
icon = 'icons/obj/singularity.dmi'
icon_state = "TheSingGen"
anchored = 0
@@ -23,7 +23,7 @@
/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
if(anchored)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 00028e58afd..03b1d07b85b 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -32,7 +32,7 @@
var/area/A = get_area(src)
if(A)
var/image/alert_overlay = image('icons/effects/effects.dmi', "ghostalertsie")
- notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, attack_not_jump = 1)
+ notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK)
narsie_spawn_animation()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 7fba50784b8..0ce1159743e 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -214,7 +214,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 0
-/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user)
+/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
if(!(O) || !(user))
return 0
if(!ismob(user) || !isobj(O))
@@ -224,14 +224,14 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
if(iswrench(O) && !isinspace())
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 1
user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.")
temp_state++
if(1)
if(iswrench(O))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 0
user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.")
@@ -239,6 +239,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
else if(iscoil(O))
var/obj/item/stack/cable_coil/C = O
if(C.use(1))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
temp_state++
@@ -247,15 +248,18 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
if(2)
if(iswirecutter(O))//TODO:Shock user if its on?
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.")
temp_state--
else if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.")
temp_state--
@@ -352,7 +356,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 0
-/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user)
+/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
if(!(O) || !(user))
return 0
if(!ismob(user) || !isobj(O))
@@ -361,7 +365,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
if(iswrench(O))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 1
user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.")
@@ -369,7 +373,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
power_change()
if(1)
if(iswrench(O))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 0
user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.")
@@ -377,20 +381,24 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
power_change()
else if(iscoil(O))
if(O:use(1))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
temp_state++
if(2)
if(iswirecutter(O))//TODO:Shock user if its on?
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.")
temp_state--
else if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.")
temp_state--
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 636fe7d338b..d0bdc9c6490 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -30,8 +30,7 @@
/obj/machinery/particle_accelerator/control_box/Destroy()
if(active)
toggle_power()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/particle_accelerator/control_box/attack_ghost(user as mob)
@@ -68,11 +67,8 @@
if(stat & NOPOWER)
icon_state = "[reference]w"
return
- else if(use_power)
- if(assembled)
- icon_state = "[reference]p"
- else
- icon_state = "u[reference]p"
+ else if(use_power && assembled)
+ icon_state = "[reference]p"
else
switch(construction_state)
if(0)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 2fa6facdab0..114ffc29d6f 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -7,8 +7,9 @@
icon_state = "singularity_s1"
anchored = 1
density = 1
- layer = 6
+ layer = MASSIVE_OBJ_LAYER
light_range = 6
+ appearance_flags = 0
unacidable = 1 //Don't comment this out.
var/current_size = 1
var/allowed_size = 1
@@ -31,20 +32,21 @@
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
- singularities += src
admin_investigate_setup()
src.energy = starting_energy
..()
processing_objects.Add(src)
- for(var/obj/machinery/power/singularity_beacon/singubeacon in world)
+ poi_list |= src
+ singularities += src
+ for(var/obj/machinery/power/singularity_beacon/singubeacon in machines)
if(singubeacon.active)
target = singubeacon
break
- return
/obj/singularity/Destroy()
processing_objects.Remove(src)
+ poi_list.Remove(src)
singularities -= src
target = null
return ..()
@@ -58,7 +60,17 @@
return 0
-/obj/singularity/attack_hand(mob/user as mob)
+/obj/singularity/attack_hand(mob/user)
+ consume(user)
+ return 1
+
+/obj/singularity/attack_alien(mob/user)
+ consume(user)
+
+/obj/singularity/attack_animal(mob/user)
+ consume(user)
+
+/obj/singularity/attackby(obj/item/weapon/W, mob/user, params)
consume(user)
return 1
@@ -70,16 +82,16 @@
/obj/singularity/ex_act(severity)
switch(severity)
- if(1.0)
+ if(1)
if(current_size <= STAGE_TWO)
investigate_log("has been destroyed by a heavy explosion.","singulo")
qdel(src)
return
else
energy -= round(((energy+1)/2),1)
- if(2.0)
+ if(2)
energy -= round(((energy+1)/3),1)
- if(3.0)
+ if(3)
energy -= round(((energy+1)/4),1)
return
@@ -117,8 +129,9 @@
/obj/singularity/proc/admin_investigate_setup()
last_warning = world.time
- var/count = locate(/obj/machinery/field/containment) in orange(30, src)
- if(!count) message_admins("A singularity has been created without containment fields active at [x], [y], [z] (
JMP )")
+ var/count = locate(/obj/machinery/field/containment) in urange(30, src, 1)
+ if(!count)
+ message_admins("A singularity has been created without containment fields active at [x], [y], [z] (
JMP )")
investigate_log("was created. [count?"":"
No containment fields were active "]","singulo")
/obj/singularity/proc/dissipate()
@@ -131,7 +144,7 @@
dissipate_track++
-/obj/singularity/proc/expand(var/force_size = 0)
+/obj/singularity/proc/expand(force_size = 0)
var/temp_allowed_size = src.allowed_size
if(force_size)
temp_allowed_size = force_size
@@ -217,8 +230,6 @@
investigate_log("collapsed.","singulo")
qdel(src)
return 0
- if(energy > 2999 && !consumedSupermatter)
- energy = 2000
switch(energy)//Some of these numbers might need to be changed up later -Mport
if(1 to 199)
allowed_size = STAGE_ONE
@@ -228,10 +239,11 @@
allowed_size = STAGE_THREE
if(1000 to 1999)
allowed_size = STAGE_FOUR
- if(2000 to 2999)
- allowed_size = STAGE_FIVE
- if(3000 to INFINITY)
- allowed_size = STAGE_SIX
+ if(2000 to INFINITY)
+ if(energy >= 3000 && consumedSupermatter)
+ allowed_size = STAGE_SIX
+ else
+ allowed_size = STAGE_FIVE
if(current_size != allowed_size)
expand()
return 1
@@ -256,7 +268,8 @@
consume(X)
CHECK_TICK
-/obj/singularity/proc/consume(var/atom/A)
+
+/obj/singularity/proc/consume(atom/A)
var/gain = A.singularity_act(current_size)
src.energy += gain
if(istype(A, /obj/machinery/power/supermatter_shard) && !consumedSupermatter)
@@ -267,7 +280,7 @@
return
-/obj/singularity/proc/move(var/force_move = 0)
+/obj/singularity/proc/move(force_move = 0)
if(!move_self)
return 0
@@ -282,7 +295,7 @@
step(src, movement_dir)
-/obj/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0)
+/obj/singularity/proc/check_turfs_in(direction = 0, step = 0)
if(!direction)
return 0
var/steps = 0
@@ -350,6 +363,7 @@
return 0
return 1
+
/obj/singularity/proc/event()
var/numb = pick(1,2,3,4,5,6)
switch(numb)
@@ -380,9 +394,9 @@
/obj/singularity/proc/combust_mobs()
- for(var/mob/living/carbon/C in orange(20, src))
+ for(var/mob/living/carbon/C in urange(20, src, 1))
C.visible_message("
[C]'s skin bursts into flame! ", \
- "
You feel an inner fire as your skin is suddenly covered in fire! ")
+ "
You feel an inner fire as your skin bursts into flames! ")
C.adjust_fire_stacks(5)
C.IgniteMob()
return
@@ -394,7 +408,7 @@
continue
if(M.stat == CONSCIOUS)
- if(istype(M,/mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
if(istype(H.glasses, /obj/item/clothing/glasses/meson))
var/obj/item/clothing/glasses/meson/MS = H.glasses
@@ -414,11 +428,9 @@
/obj/singularity/proc/pulse()
-
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
- if(get_dist(R, src) <= 15) // Better than using orange() every process
+ if(R.z == z && get_dist(R, src) <= 15) // Better than using orange() every process
R.receive_pulse(energy)
- return
/obj/singularity/singularity_act()
var/gain = (energy/2)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 02597b46840..f73d306d15b 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -180,9 +180,9 @@
return
to_chat(user, "
You begin to dismantle the power terminal... ")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * I.toolspeed, target = src))
if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
@@ -438,7 +438,7 @@
if(is_station_level(src.z))
if(prob(1)) //explosion
for(var/mob/M in viewers(src))
- M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2)
+ M.show_message("
The [src.name] is making strange noises! ", 3, "
You hear sizzling electronics. ", 2)
sleep(10*pick(4,5,6,7,10,14))
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
smoke.set_up(3, 0, src.loc)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 5f137f4cb74..fa9b61c8059 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -60,12 +60,12 @@
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar panel.", "
You begin to take the glass off the solar panel... ")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.loc = src.loc
S.give_glass()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message("[user] takes the glass off the solar panel.", "
You take the glass off the solar panel. ")
qdel(src)
return
@@ -204,7 +204,7 @@
icon = 'icons/obj/power.dmi'
icon_state = "sp_base"
item_state = "electropack"
- w_class = 4 // Pretty big!
+ w_class = WEIGHT_CLASS_BULKY // Pretty big!
anchored = 0
var/tracker = 0
var/glass_type = null
@@ -227,20 +227,20 @@
if(istype(W, /obj/item/weapon/wrench))
anchored = 1
user.visible_message("[user] wrenches the solar assembly into place.", "
You wrench the solar assembly into place. ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 50, 1)
return 1
else
if(istype(W, /obj/item/weapon/wrench))
anchored = 0
user.visible_message("[user] unwrenches the solar assembly from its place.", "
You unwrench the solar assembly from its place. ")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 50, 1)
return 1
if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass))
var/obj/item/stack/sheet/S = W
if(S.use(2))
glass_type = W.type
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(loc, S.usesound, 50, 1)
user.visible_message("[user] places the glass on the solar assembly.", "
You place the glass on the solar assembly. ")
if(tracker)
new /obj/machinery/power/tracker(get_turf(src), src)
@@ -263,6 +263,7 @@
if(istype(W, /obj/item/weapon/crowbar))
new /obj/item/weapon/tracker_electronics(src.loc)
tracker = 0
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] takes out the electronics from the solar assembly.", "
You take out the electronics from the solar assembly. ")
return 1
..()
@@ -411,10 +412,10 @@
return data
-/obj/machinery/power/solar_control/attackby(I as obj, user as mob, params)
+/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, I.usesound, 50, 1)
+ if(do_after(user, 20 * I.toolspeed, target = src))
if(src.stat & BROKEN)
to_chat(user, "
The broken glass falls out. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm
index 690aeac6fce..d4c1109e16e 100644
--- a/code/modules/power/supermatter/sm_shard.dm
+++ b/code/modules/power/supermatter/sm_shard.dm
@@ -7,7 +7,7 @@
icon_state = "supermatter"
sharp = 1
edge = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
light_color = "#8A8A00"
var/brightness = 2
@@ -66,13 +66,13 @@
/obj/item/weapon/shard/supermatter/attack_hand(var/mob/user)
if(!istype(user,/mob/living/carbon/human/nucleation))
- to_chat(user, pick( "\red You think twice before touching that without protection.",)
- "\red You don't want to touch that without some protection.",
- "\red You probably should get something else to pick that up.",
- "\red You aren't sure that's a good idea.",
- "\red You aren't in the mood to get vaporized today.",
- "\red You really don't feel like frying your hand off.",
- "\red You assume that's a bad idea." )
+ to_chat(user, pick( "
You think twice before touching that without protection. ",)
+ "
You don't want to touch that without some protection. ",
+ "
You probably should get something else to pick that up. ",
+ "
You aren't sure that's a good idea. ",
+ "
You aren't in the mood to get vaporized today. ",
+ "
You really don't feel like frying your hand off. ",
+ "
You assume that's a bad idea. " )
return
..()
@@ -85,7 +85,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "tongs"
edge = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
var/obj/item/held = null // The item currently being held
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 323c240d239..344971d42a2 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -64,6 +64,7 @@
/obj/machinery/power/supermatter_shard/New()
. = ..()
+ poi_list |= src
radio = new(src)
radio.listening = 0
investigate_log("has been created.", "supermatter")
@@ -71,8 +72,8 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
- qdel(radio)
- radio = null
+ QDEL_NULL(radio)
+ poi_list.Remove(src)
return ..()
/obj/machinery/power/supermatter_shard/proc/explode()
diff --git a/code/modules/power/supermatter/wall.dm b/code/modules/power/supermatter/wall.dm
index e8997dee07c..afadcb23a46 100644
--- a/code/modules/power/supermatter/wall.dm
+++ b/code/modules/power/supermatter/wall.dm
@@ -49,7 +49,7 @@
icon_state = "smatter"
temperature = T20C+80
density = 1
- opacity = 1
+ set_opacity(1)
blocks_air = 1
spawn(2)
diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm
index cba253be5f0..34e867005e1 100644
--- a/code/modules/power/switch.dm
+++ b/code/modules/power/switch.dm
@@ -29,25 +29,25 @@
to_chat(user, "The switch is in the off position")
/obj/structure/powerswitch/attack_ai(mob/user)
- to_chat(user, "\red You're an AI. This is a manual switch. It's not going to work.")
+ to_chat(user, "
You're an AI. This is a manual switch. It's not going to work. ")
return
/obj/structure/powerswitch/attack_hand(mob/user)
if(busy)
- to_chat(user, "\red This switch is already being toggled.")
+ to_chat(user, "
This switch is already being toggled. ")
return
..()
busy = 1
for(var/mob/O in viewers(user))
- O.show_message(text("\red [user] starts pulling the [src]."), 1)
+ O.show_message(text("
[user] starts pulling the [src]. "), 1)
if(do_after(user, 50, target = src))
set_state(!on)
for(var/mob/O in viewers(user))
- O.show_message(text("\red [user] flips the [src] into the [on ? "on": "off"] position."), 1)
+ O.show_message(text("
[user] flips the [src] into the [on ? "on": "off"] position."), 1)
busy = 0
/obj/structure/powerswitch/proc/set_state(var/state)
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 2bee73f7a97..77ff3801da2 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -2,27 +2,38 @@
name = "tesla coil"
desc = "For the union!"
icon = 'icons/obj/tesla_engine/tesla_coil.dmi'
- icon_state = "coil"
+ icon_state = "coil0"
anchored = 0
density = 1
+
var/power_loss = 2
var/input_power_multiplier = 1
+ var/zap_cooldown = 100
+ var/last_zap = 0
+ var/datum/wires/tesla_coil/wires = null
/obj/machinery/power/tesla_coil/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/tesla_coil(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
+ wires = new(src)
RefreshParts()
+/obj/machinery/power/tesla_coil/Destroy()
+ QDEL_NULL(wires)
+ return ..()
+
/obj/machinery/power/tesla_coil/RefreshParts()
var/power_multiplier = 0
+ zap_cooldown = 100
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
power_multiplier += C.rating
+ zap_cooldown -= (C.rating * 20)
input_power_multiplier = power_multiplier
/obj/machinery/power/tesla_coil/attackby(obj/item/W, mob/user, params)
- if(default_deconstruction_screwdriver(user, "coil", "coil", W))
+ if(default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", W))
return
if(exchange_parts(user, W))
@@ -38,22 +49,43 @@
if(default_deconstruction_crowbar(W))
return
- return ..()
+ else if(iswirecutter(W) || ismultitool(W) || istype(W, /obj/item/device/assembly/signaler))
+ if(panel_open)
+ wires.Interact(user)
+
+ else
+ ..()
/obj/machinery/power/tesla_coil/tesla_act(var/power)
- being_shocked = 1
- var/power_produced = power / power_loss
- add_avail(power_produced*input_power_multiplier)
- flick("coilhit", src)
+ if(anchored && !panel_open)
+ being_shocked = 1
+ //don't lose arc power when it's not connected to anything
+ //please place tesla coils all around the station to maximize effectiveness
+ var/power_produced = powernet ? power / power_loss : power
+ add_avail(power_produced*input_power_multiplier)
+ flick("coilhit", src)
+ playsound(src.loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
+ tesla_zap(src, 5, power_produced)
+ addtimer(src, "reset_shocked", 10)
+ else
+ ..()
+
+/obj/machinery/power/tesla_coil/proc/zap()
+ if((last_zap + zap_cooldown) > world.time || !powernet)
+ return FALSE
+ last_zap = world.time
+ var/coeff = (20 - ((input_power_multiplier - 1) * 3))
+ coeff = max(coeff, 10)
+ var/power = (powernet.avail/2)
+ draw_power(power)
playsound(src.loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
- tesla_zap(src, 5, power_produced)
- addtimer(src, "reset_shocked", 10)
+ tesla_zap(src, 10, power/(coeff/2))
/obj/machinery/power/grounding_rod
- name = "Grounding Rod"
+ name = "grounding rod"
desc = "Keep an area from being fried from Edison's Bane."
icon = 'icons/obj/tesla_engine/tesla_coil.dmi'
- icon_state = "grounding_rod"
+ icon_state = "grounding_rod0"
anchored = 0
density = 1
@@ -65,7 +97,7 @@
RefreshParts()
/obj/machinery/power/grounding_rod/attackby(obj/item/W, mob/user, params)
- if(default_deconstruction_screwdriver(user, "grounding_rod", "grounding_rod", W))
+ if(default_deconstruction_screwdriver(user, "grounding_rod_open[anchored]", "grounding_rod[anchored]", W))
return
if(exchange_parts(user, W))
@@ -80,4 +112,7 @@
return ..()
/obj/machinery/power/grounding_rod/tesla_act(var/power)
- flick("coil_shock_1", src)
+ if(anchored && !panel_open)
+ flick("grounding_rodhit", src)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 14407ef9202..b231e32b183 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -15,7 +15,9 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
/obj/machinery/field/containment,
/obj/structure/disposalpipe,
/obj/structure/sign,
- /obj/machinery/gateway))
+ /obj/machinery/gateway,
+ /obj/structure/grille,
+ /obj/machinery/the_singularitygen/tesla))
/obj/singularity/energy_ball
name = "energy ball"
@@ -30,20 +32,24 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
contained = 0
density = 1
energy = 0
+ dissipate = 1
+ dissipate_delay = 5
+ dissipate_strength = 1
var/list/orbiting_balls = list()
var/produced_power
var/energy_to_raise = 32
var/energy_to_lower = -20
+/obj/singularity/energy_ball/ex_act(severity)
+ return
+
/obj/singularity/energy_ball/Destroy()
if(orbiting && istype(orbiting, /obj/singularity/energy_ball))
var/obj/singularity/energy_ball/EB = orbiting
EB.orbiting_balls -= src
orbiting = null
- for(var/ball in orbiting_balls)
- var/obj/singularity/energy_ball/EB = ball
- qdel(EB)
+ QDEL_LIST(orbiting_balls)
return ..()
@@ -51,24 +57,23 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
if(!orbiting)
handle_energy()
- move_the_basket_ball(4 + orbiting_balls.len * 2)
+ move_the_basket_ball(4 + orbiting_balls.len * 1.5)
playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 30)
pixel_x = 0
pixel_y = 0
- dir = tesla_zap(src, 7, TESLA_DEFAULT_POWER)
+ setDir(tesla_zap(src, 7, TESLA_DEFAULT_POWER, TRUE))
pixel_x = -32
pixel_y = -32
for(var/ball in orbiting_balls)
- tesla_zap(ball, rand(1, Clamp(orbiting_balls.len, 3, 7)), TESLA_MINI_POWER)
+ var/range = rand(1, Clamp(orbiting_balls.len, 3, 7))
+ tesla_zap(ball, range, TESLA_MINI_POWER/7*range, TRUE)
else
energy = 0 // ensure we dont have miniballs of miniballs
- return
-
/obj/singularity/energy_ball/examine(mob/user)
..()
if(orbiting_balls.len)
@@ -84,37 +89,43 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
move_dir = get_dir(src,target)
var/turf/T = get_step(src, move_dir)
if(can_move(T))
- loc = T
+ forceMove(T)
+ setDir(move_dir)
+ for(var/mob/living/carbon/C in loc)
+ dust_mobs(C)
/obj/singularity/energy_ball/proc/handle_energy()
if(energy >= energy_to_raise)
energy_to_lower = energy_to_raise - 20
- energy_to_raise = energy_to_raise * 1.5
+ energy_to_raise = energy_to_raise * 1.25
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30)
- spawn(100)
- if(!loc)
- return
- var/obj/singularity/energy_ball/EB = new(loc)
-
- EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
- var/icon/I = icon(icon,icon_state,dir)
-
- var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
- orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
-
- EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
+ addtimer(src, "new_mini_ball", 100)
else if(energy < energy_to_lower && orbiting_balls.len)
- energy_to_raise = energy_to_raise / 1.5
- energy_to_lower = (energy_to_raise / 1.5) - 20
+ energy_to_raise = energy_to_raise / 1.25
+ energy_to_lower = (energy_to_raise / 1.25) - 20
var/Orchiectomy_target = pick(orbiting_balls)
qdel(Orchiectomy_target)
else if(orbiting_balls.len)
- energy -= orbiting_balls.len * 0.5
+ dissipate() //sing code has a much better system.
+
+/obj/singularity/energy_ball/proc/new_mini_ball()
+ if(!loc)
+ return
+ var/obj/singularity/energy_ball/EB = new(loc)
+
+ EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
+ var/icon/I = icon(icon,icon_state,dir)
+
+ var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
+ orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
+
+ EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
+
/obj/singularity/energy_ball/Bump(atom/A)
dust_mobs(A)
@@ -125,21 +136,27 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target)
if(istype(target))
target.orbiting_balls += src
+ poi_list -= src
+ target.dissipate_strength = target.orbiting_balls.len
. = ..()
if(istype(target))
target.orbiting_balls -= src
+ target.dissipate_strength = target.orbiting_balls.len
if(!loc)
qdel(src)
/obj/singularity/energy_ball/proc/dust_mobs(atom/A)
- if(istype(A, /mob/living/carbon))
- var/mob/living/carbon/C = A
- C.dust()
- return
+ if(!iscarbon(A))
+ return
+ for(var/obj/machinery/power/grounding_rod/GR in orange(src, 2))
+ if(GR.anchored)
+ return
+ var/mob/living/carbon/C = A
+ C.dust()
-/proc/tesla_zap(var/atom/source, zap_range = 3, power)
+/proc/tesla_zap(atom/source, zap_range = 3, power, explosive = FALSE, stun_mobs = TRUE)
. = source.dir
if(power < 1000)
return
@@ -151,12 +168,13 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
var/mob/living/closest_mob
var/obj/machinery/closest_machine
var/obj/structure/closest_structure
+ var/obj/structure/blob/closest_blob
- for(var/A in oview(source, zap_range))
+ for(var/A in oview(source, zap_range+2))
if(istype(A, /obj/machinery/power/tesla_coil))
var/dist = get_dist(source, A)
var/obj/machinery/power/tesla_coil/C = A
- if((dist < closest_dist || !closest_tesla_coil) && !C.being_shocked)
+ if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !C.being_shocked)
closest_dist = dist
//we use both of these to save on istype and typecasting overhead later on
@@ -169,8 +187,8 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
continue //no need checking these other things
else if(istype(A, /obj/machinery/power/grounding_rod))
- var/dist = get_dist(source, A)
- if(dist < closest_dist || !closest_grounding_rod)
+ var/dist = get_dist(source, A)-2
+ if(dist <= zap_range && (dist < closest_dist || !closest_grounding_rod))
closest_grounding_rod = A
closest_atom = A
closest_dist = dist
@@ -178,10 +196,10 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(closest_grounding_rod || is_type_in_typecache(A, blacklisted_tesla_types))
continue
- else if(istype(A, /mob/living))
+ else if(isliving(A))
var/dist = get_dist(source, A)
var/mob/living/L = A
- if((dist < closest_dist || !closest_mob) && L.stat != DEAD)
+ if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !L.tesla_ignore)
closest_mob = L
closest_atom = A
closest_dist = dist
@@ -192,7 +210,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(istype(A, /obj/machinery))
var/obj/machinery/M = A
var/dist = get_dist(source, A)
- if((dist < closest_dist || !closest_machine) && !M.being_shocked)
+ if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !M.being_shocked)
closest_machine = M
closest_atom = A
closest_dist = dist
@@ -200,10 +218,21 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(closest_mob)
continue
+ else if(istype(A, /obj/structure/blob))
+ var/obj/structure/blob/B = A
+ var/dist = get_dist(source, A)
+ if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !B.being_shocked)
+ closest_blob = B
+ closest_atom = A
+ closest_dist = dist
+
+ else if(closest_blob)
+ continue
+
else if(istype(A, /obj/structure))
var/obj/structure/S = A
var/dist = get_dist(source, A)
- if((dist < closest_dist || !closest_tesla_coil) && !S.being_shocked)
+ if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !S.being_shocked)
closest_structure = S
closest_atom = A
closest_dist = dist
@@ -218,23 +247,27 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
//per type stuff:
if(closest_tesla_coil)
- closest_tesla_coil.tesla_act(power)
+ closest_tesla_coil.tesla_act(power, explosive)
else if(closest_grounding_rod)
- closest_grounding_rod.tesla_act(power)
+ closest_grounding_rod.tesla_act(power, explosive)
else if(closest_mob)
var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5, 5)
closest_mob.electrocute_act(shock_damage, source, 1, tesla_shock = 1)
- if(istype(closest_mob, /mob/living/silicon))
+ if(issilicon(closest_mob))
var/mob/living/silicon/S = closest_mob
- S.emp_act(2)
- tesla_zap(S, 7, power / 1.5) // metallic folks bounce it further
+ if(stun_mobs)
+ S.emp_act(2)
+ tesla_zap(S, 7, power / 1.5, explosive, stun_mobs) // metallic folks bounce it further
else
- tesla_zap(closest_mob, 5, power / 1.5)
+ tesla_zap(closest_mob, 5, power / 1.5, explosive, stun_mobs)
else if(closest_machine)
- closest_machine.tesla_act(power)
+ closest_machine.tesla_act(power, explosive)
+
+ else if(closest_blob)
+ closest_blob.tesla_act(power, explosive)
else if(closest_structure)
- closest_structure.tesla_act(power)
\ No newline at end of file
+ closest_structure.tesla_act(power, explosive)
\ No newline at end of file
diff --git a/code/modules/power/tesla/generator.dm b/code/modules/power/tesla/generator.dm
index f511c650c8c..53eea847ad9 100644
--- a/code/modules/power/tesla/generator.dm
+++ b/code/modules/power/tesla/generator.dm
@@ -3,4 +3,8 @@
desc = "Makes the wardenclyffe look like a child's plaything when shot with a particle accelerator."
icon = 'icons/obj/tesla_engine/tesla_generator.dmi'
icon_state = "TheSingGen"
- creation_type = /obj/singularity/energy_ball
\ No newline at end of file
+ creation_type = /obj/singularity/energy_ball
+
+/obj/machinery/the_singularitygen/tesla/tesla_act(power, explosive = FALSE)
+ if(explosive)
+ energy += power
\ No newline at end of file
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 63653eab9d1..ffaffd5ea81 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -63,12 +63,12 @@
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("
[user] begins to take the glass off the solar tracker. ")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.loc = src.loc
S.give_glass()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message("
[user] takes the glass off the tracker. ")
qdel(src) // qdel
return
@@ -81,4 +81,4 @@
name = "tracker electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index b5a990dec69..71400802ee2 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -6,7 +6,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 1
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/fire_sound = null //What sound should play when this ammo is fired
var/caliber = null //Which kind of guns it can be loaded into
var/projectile_type = null //The bullet type to create when New() is called
@@ -87,7 +87,7 @@
item_state = "syringe_kit"
materials = list(MAT_METAL=30000)
throwforce = 2
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throw_speed = 4
throw_range = 10
var/list/stored_ammo = list()
@@ -103,8 +103,7 @@
update_icon()
/obj/item/ammo_box/Destroy()
- for(var/atom/A in stored_ammo)
- qdel(A)
+ QDEL_LIST(stored_ammo)
stored_ammo = null
return ..()
@@ -188,3 +187,9 @@
//Behavior for magazines
/obj/item/ammo_box/magazine/proc/ammo_count()
return stored_ammo.len
+
+/obj/item/ammo_box/magazine/proc/empty_magazine()
+ var/turf_mag = get_turf(src)
+ for(var/obj/item/ammo in stored_ammo)
+ ammo.forceMove(turf_mag)
+ stored_ammo -= ammo
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index df34a279caf..3b808c64d53 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -3,6 +3,12 @@
caliber = "357"
projectile_type = /obj/item/projectile/bullet
+/obj/item/ammo_casing/rubber9mm
+ desc = "A 9mm rubber bullet casing."
+ caliber = "9mm"
+ icon_state = "r-casing"
+ projectile_type = /obj/item/projectile/bullet/weakbullet4
+
/obj/item/ammo_casing/a762
desc = "A 7.62mm bullet casing."
icon_state = "762-casing"
@@ -20,6 +26,7 @@
/obj/item/ammo_casing/c38
desc = "A .38 bullet casing."
caliber = "38"
+ icon_state = "r-casing"
projectile_type = /obj/item/projectile/bullet/weakbullet2/rubber
/obj/item/ammo_casing/c10mm
@@ -76,6 +83,12 @@
caliber = "4.6x30mm"
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
+/obj/item/ammo_casing/rubber45
+ desc = "A .45 rubber bullet casing."
+ caliber = ".45"
+ icon_state = "r-casing"
+ projectile_type = /obj/item/projectile/bullet/weakbullet4
+
/obj/item/ammo_casing/c45
desc = "A .45 bullet casing."
caliber = ".45"
@@ -120,7 +133,7 @@
/obj/item/ammo_casing/shotgun/rubbershot
name = "rubber shot"
desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
- icon_state = "bshell"
+ icon_state = "cshell"
projectile_type = /obj/item/projectile/bullet/rpellet
pellets = 6
variance = 25
@@ -233,9 +246,9 @@
/obj/item/ammo_casing/shotgun/dart/New()
..()
- flags |= NOREACT
flags |= OPENCONTAINER
create_reagents(30)
+ reagents.set_reacting(FALSE)
/obj/item/ammo_casing/shotgun/dart/attackby()
return
@@ -247,14 +260,14 @@
..()
reagents.add_reagent("neurotoxin", 6)
reagents.add_reagent("spore", 6)
- reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
+ reagents.add_reagent("capulettium_plus", 6) //;HELP OPS IN MAINT
reagents.add_reagent("coniine", 6)
reagents.add_reagent("sodium_thiopental", 6)
/obj/item/ammo_casing/shotgun/tranquilizer
name = "tranquilizer darts"
desc = "A tranquilizer round used to subdue individuals utilizing stimulants."
- icon_state = "cshell"
+ icon_state = "nshell"
projectile_type = /obj/item/projectile/bullet/dart/syringe/tranquilizer
materials = list(MAT_METAL=250)
@@ -362,3 +375,9 @@
desc = "A cap for children toys."
caliber = "caps"
projectile_type = /obj/item/projectile/bullet/cap
+
+/obj/item/ammo_casing/laser
+ desc = "An experimental laser casing."
+ caliber = "laser"
+ projectile_type = /obj/item/projectile/beam/laser
+ icon_state = "lasercasing"
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 894b5ac25b1..6eba670e906 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -35,6 +35,12 @@
ammo_type = /obj/item/ammo_casing/c45
max_ammo = 20
+/obj/item/ammo_box/rubber45
+ name = "ammo box (.45 rubber)"
+ icon_state = "45box-r"
+ ammo_type = /obj/item/ammo_casing/rubber45
+ max_ammo = 16
+
/obj/item/ammo_box/a40mm
name = "ammo box (40mm grenades)"
icon_state = "40mm"
@@ -52,44 +58,59 @@
/obj/item/ammo_box/n762
name = "ammo box (7.62x38mmR)"
- icon_state = "10mmbox"
+ icon_state = "riflebox"
origin_tech = "combat=2"
ammo_type = /obj/item/ammo_casing/n762
max_ammo = 14
/obj/item/ammo_box/shotgun
- name = "Ammunition Box (slug)"
- icon_state = "9mmbox"
+ name = "Shotgun Speedloader (slug)"
+ icon_state = "slugloader"
origin_tech = "combat=2"
ammo_type = /obj/item/ammo_casing/shotgun
max_ammo = 7
materials = list(MAT_METAL=28000)
+ multiple_sprites = 1
/obj/item/ammo_box/shotgun/buck
- name = "Ammunition Box (buckshot)"
+ name = "Shotgun Speedloader (buckshot)"
+ icon_state = "buckloader"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/ammo_box/shotgun/dragonsbreath
+ name = "Shotgun Speedloader (dragonsbreath)"
+ icon_state = "dragonsbreathloader"
+ ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
+
+
/obj/item/ammo_box/shotgun/stun
- name = "Ammunition Box (stun shells)"
+ name = "Shotgun Speedloader (stun shells)"
+ icon_state = "stunloader"
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
- materials = list(MAT_METAL=1750)
+
/obj/item/ammo_box/shotgun/beanbag
- name = "Ammunition Box (beanbag shells)"
+ name = "Shotgun Speedloader (beanbag shells)"
+ icon_state = "beanbagloader"
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
materials = list(MAT_METAL=1750)
+
/obj/item/ammo_box/shotgun/rubbershot
- name = "Ammunition Box (rubbershot shells)"
+ name = "Shotgun Speedloader (rubbershot shells)"
+ icon_state = "rubbershotloader"
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
- materials = list(MAT_METAL=28000)
+ materials = list(MAT_METAL=1750)
+
/obj/item/ammo_box/shotgun/tranquilizer
- name = "Ammunition Box (tranquilizer darts)"
- icon_state = "45box"
+ name = "Shotgun Speedloader (tranquilizer darts)"
+ icon_state = "tranqloader"
ammo_type = /obj/item/ammo_casing/shotgun/tranquilizer
materials = list(MAT_METAL=1750)
+
//FOAM DARTS
/obj/item/ammo_box/foambox
name = "ammo box (Foam Darts)"
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 93e5d5f2bb4..cdb0e063184 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -3,7 +3,7 @@
desc = "The part of the gun that makes the laser go pew"
caliber = "energy"
projectile_type = /obj/item/projectile/energy
- var/e_cost = 1000 //The amount of energy a cell needs to expend to create this shot.
+ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
fire_sound = 'sound/weapons/Laser.ogg'
@@ -13,10 +13,11 @@
/obj/item/ammo_casing/energy/lasergun
projectile_type = /obj/item/projectile/beam/laser
- e_cost = 830
+ e_cost = 83
select_name = "kill"
/obj/item/ammo_casing/energy/laser/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
+ e_cost = 100
/obj/item/ammo_casing/energy/laser/practice
projectile_type = /obj/item/projectile/beam/practice
@@ -35,13 +36,13 @@
/obj/item/ammo_casing/energy/laser/pulse
projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 2000
+ e_cost = 200
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/scatter/pulse
projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 2000
+ e_cost = 200
select_name = "ANNIHILATE"
fire_sound = 'sound/weapons/pulse.ogg'
@@ -55,26 +56,27 @@
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
- e_cost = 500
+ e_cost = 50
fire_sound = 'sound/weapons/laser3.ogg'
/obj/item/ammo_casing/energy/immolator
projectile_type = /obj/item/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
- e_cost = 1250
+ e_cost = 125
/obj/item/ammo_casing/energy/electrode
projectile_type = /obj/item/projectile/energy/electrode
select_name = "stun"
fire_sound = 'sound/weapons/taser.ogg'
- e_cost = 2000
+ e_cost = 200
delay = 15
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
- e_cost = 1000
+ e_cost = 100
/obj/item/ammo_casing/energy/electrode/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
+ e_cost = 200
/obj/item/ammo_casing/energy/ion
projectile_type = /obj/item/projectile/ion
@@ -118,40 +120,28 @@
projectile_type = /obj/item/projectile/meteor
select_name = "goddamn meteor"
-/obj/item/ammo_casing/energy/kinetic
- projectile_type = /obj/item/projectile/kinetic
- select_name = "kinetic"
- e_cost = 5000
- fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
-
-/obj/item/ammo_casing/energy/kinetic/super
- projectile_type = /obj/item/projectile/kinetic/super
-
-/obj/item/ammo_casing/energy/kinetic/hyper
- projectile_type = /obj/item/projectile/kinetic/hyper
-
/obj/item/ammo_casing/energy/disabler
projectile_type = /obj/item/projectile/beam/disabler
select_name = "disable"
- e_cost = 500
- fire_sound = "sound/weapons/taser2.ogg"
+ e_cost = 50
+ fire_sound = 'sound/weapons/taser2.ogg'
/obj/item/ammo_casing/energy/plasma
projectile_type = /obj/item/projectile/plasma
select_name = "plasma burst"
fire_sound = 'sound/weapons/plasma_cutter.ogg'
delay = 15
- e_cost = 250
+ e_cost = 25
/obj/item/ammo_casing/energy/plasma/adv
projectile_type = /obj/item/projectile/plasma/adv
delay = 10
- e_cost = 100
+ e_cost = 10
/obj/item/ammo_casing/energy/wormhole
projectile_type = /obj/item/projectile/beam/wormhole
e_cost = 0
- fire_sound = "sound/weapons/pulse3.ogg"
+ fire_sound = 'sound/weapons/pulse3.ogg'
var/obj/item/weapon/gun/energy/wormhole_projector/gun = null
select_name = "blue"
@@ -165,7 +155,7 @@
/obj/item/ammo_casing/energy/bolt
projectile_type = /obj/item/projectile/energy/bolt
select_name = "bolt"
- e_cost = 5000
+ e_cost = 500
fire_sound = 'sound/weapons/Genhit.ogg'
/obj/item/ammo_casing/energy/bolt/large
@@ -175,7 +165,7 @@
/obj/item/ammo_casing/energy/dart
projectile_type = /obj/item/projectile/energy/dart
fire_sound = 'sound/weapons/Genhit.ogg'
- e_cost = 5000
+ e_cost = 500
select_name = "toxic dart"
/obj/item/ammo_casing/energy/instakill
@@ -199,13 +189,13 @@
/obj/item/ammo_casing/energy/shock_revolver
fire_sound = 'sound/magic/lightningbolt.ogg'
- e_cost = 2000
+ e_cost = 200
select_name = "lightning beam"
projectile_type = /obj/item/projectile/energy/shock_revolver
/obj/item/ammo_casing/energy/toxplasma
projectile_type = /obj/item/projectile/energy/toxplasma
- fire_sound = "sound/weapons/taser2.ogg"
+ fire_sound = 'sound/weapons/taser2.ogg'
select_name = "plasma dart"
/obj/item/ammo_casing/energy/clown
@@ -222,7 +212,7 @@
/obj/item/ammo_casing/energy/teleport
projectile_type = /obj/item/projectile/energy/teleport
fire_sound = 'sound/weapons/wave.ogg'
- e_cost = 1250
+ e_cost = 250
select_name = "teleport beam"
var/teleport_target
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 0f587c54bf4..d3cf7702c00 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -209,6 +209,34 @@
caliber = ".45"
max_ammo = 8
multiple_sprites = 1
+/obj/item/ammo_box/magazine/m45/enforcer45
+ name = "handgun magazine (.45)"
+ icon_state = "enforcer"
+ ammo_type = /obj/item/ammo_casing/rubber45
+
+/obj/item/ammo_box/magazine/m45/enforcer45/update_icon()
+ ..()
+ overlays.Cut()
+
+ var/ammo = ammo_count()
+ if(ammo && is_rubber())
+ overlays += image('icons/obj/ammo.dmi', icon_state = "enforcer-r")
+
+/obj/item/ammo_box/magazine/m45/enforcer45/examine(mob/user, var/distance)
+ ..()
+ if(distance <= 2)
+ to_chat(user, "It seems to be loaded with [is_rubber() ? "rubber" : "lethal"] bullets.")//only can see the topmost one.
+
+/obj/item/ammo_box/magazine/m45/enforcer45/proc/is_rubber()//if the topmost bullet is a rubber one
+ var/ammo = ammo_count()
+ if(!ammo)
+ return 0
+ if(istype(contents[contents.len], /obj/item/ammo_casing/rubber45))
+ return 1
+ return 0
+
+ /obj/item/ammo_box/magazine/m45/enforcer45/lethal
+ ammo_type = /obj/item/ammo_casing/c45
/obj/item/ammo_box/magazine/wt550m9
name = "wt550 magazine (4.6x30mm)"
@@ -230,7 +258,7 @@
ammo_type = /obj/item/ammo_casing/c46x30mmtox
/obj/item/ammo_box/magazine/wt550m9/wtic
- name = "wt550 magazine (Incindiary 4.6x30mm)"
+ name = "wt550 magazine (Incendiary 4.6x30mm)"
ammo_type = /obj/item/ammo_casing/c46x30mminc
/obj/item/ammo_box/magazine/uzim9mm
@@ -409,3 +437,16 @@
/obj/item/ammo_box/magazine/toy/m762/update_icon()
..()
icon_state = "a762-[round(ammo_count(),10)]"
+
+/obj/item/ammo_box/magazine/laser
+ name = "encased laser projector magazine"
+ desc = "Fits experimental laser ammo casings."
+ icon_state = "laser"
+ ammo_type = /obj/item/ammo_casing/laser
+ origin_tech = "combat=3"
+ caliber = "laser"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/laser/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/20)*20]"
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
index d17d65e9fc8..1af728100f8 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -27,6 +27,9 @@
/obj/item/ammo_casing/magic/chaos
projectile_type = /obj/item/projectile/magic
+/obj/item/ammo_casing/magic/spellblade
+ projectile_type = /obj/item/projectile/magic/spellblade
+
/obj/item/ammo_casing/magic/chaos/newshot()
projectile_type = pick(typesof(/obj/item/projectile/magic))
..()
@@ -46,4 +49,4 @@
projectile_type = /obj/item/projectile/bullet/midbullet3
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
- e_cost = 200
+ e_cost = 20
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 6cafcce56c3..0304f4a48a9 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -7,7 +7,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
materials = list(MAT_METAL=2000)
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throwforce = 5
throw_speed = 3
throw_range = 5
@@ -45,7 +45,7 @@
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
- var/obj/item/device/flashlight/F = null
+ var/obj/item/device/flashlight/gun_light = null
var/can_flashlight = 0
var/list/upgrades = list()
@@ -63,7 +63,7 @@
/obj/item/weapon/gun/New()
..()
- if(F)
+ if(gun_light)
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
build_zooming()
@@ -241,27 +241,27 @@ obj/item/weapon/gun/proc/newshot()
if(istype(I, /obj/item/device/flashlight/seclite))
var/obj/item/device/flashlight/seclite/S = I
if(can_flashlight)
- if(!F)
+ if(!gun_light)
if(!user.unEquip(I))
return
to_chat(user, "
You click [S] into place on [src]. ")
if(S.on)
set_light(0)
- F = S
+ gun_light = S
I.loc = src
update_icon()
- update_gunlight(user)
+ update_gun_light(user)
var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src)
if(loc == user)
A.Grant(user)
if(istype(I, /obj/item/weapon/screwdriver))
- if(F && can_flashlight)
+ if(gun_light && can_flashlight)
for(var/obj/item/device/flashlight/seclite/S in src)
to_chat(user, "
You unscrew the seclite from [src]. ")
- F = null
+ gun_light = null
S.loc = get_turf(user)
- update_gunlight(user)
+ update_gun_light(user)
S.update_brightness(user)
update_icon()
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
@@ -273,26 +273,26 @@ obj/item/weapon/gun/proc/newshot()
..()
/obj/item/weapon/gun/proc/toggle_gunlight()
- set name = "Toggle Gunlight"
+ set name = "Toggle Gun Light"
set category = "Object"
set desc = "Click to toggle your weapon's attached flashlight."
- if(!F)
+ if(!gun_light)
return
var/mob/living/carbon/human/user = usr
if(!isturf(user.loc))
to_chat(user, "
You cannot turn the light on while in this [user.loc]! ")
- F.on = !F.on
- to_chat(user, "
You toggle the gunlight [F.on ? "on":"off"]. ")
+ gun_light.on = !gun_light.on
+ to_chat(user, "
You toggle the gun light [gun_light.on ? "on":"off"]. ")
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
- update_gunlight(user)
+ update_gun_light(user)
-/obj/item/weapon/gun/proc/update_gunlight(mob/user = null)
- if(F)
- if(F.on)
- set_light(F.brightness_on)
+/obj/item/weapon/gun/proc/update_gun_light(mob/user = null)
+ if(gun_light)
+ if(gun_light.on)
+ set_light(gun_light.brightness_on)
else
set_light(0)
update_icon()
diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm
index de217a9715d..f541ca2a94a 100644
--- a/code/modules/projectiles/guns/alien.dm
+++ b/code/modules/projectiles/guns/alien.dm
@@ -3,7 +3,7 @@
desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive."
icon_state = "spikethrower"
item_state = "spikethrower"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
fire_sound_text = "a strange noise"
mag_type = /obj/item/ammo_box/magazine/internal/spikethrower
burst_size = 2
@@ -52,7 +52,7 @@
sharp = 1
edge = 0
throwforce = 5
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
caliber = "spike"
icon_state = "bolt"
fire_sound = 'sound/weapons/bladeslice.ogg'
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index b8f659eb09f..4ec3b827945 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -154,7 +154,7 @@
qdel(S)
D.icon_state = "syringeproj"
D.name = "syringe"
- D.flags |= NOREACT
+ D.reagents.set_reacting(FALSE)
playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
for(var/i=0, i<6, i++)
@@ -173,8 +173,8 @@
R += A.id + " ("
R += num2text(A.volume) + "),"
if(istype(M, /mob))
- M.attack_log += "\[[time_stamp()]\]
[user]/[user.ckey] shot
[M]/[M.ckey] with a
dartgun ([R])"
- user.attack_log += "\[[time_stamp()]\]
[user]/[user.ckey] shot
[M]/[M.ckey] with a
dartgun ([R])"
+ M.create_attack_log("
[user]/[user.ckey] shot
[M]/[M.ckey] with a
dartgun ([R])")
+ user.create_attack_log("
[user]/[user.ckey] shot
[M]/[M.ckey] with a
dartgun ([R])")
if(M.ckey)
msg_admin_attack("[key_name_admin(user)] shot [M] ([M.ckey]) with a dartgun ([R]).")
if(!iscarbon(user))
@@ -183,7 +183,7 @@
M.LAssailant = user
else
- M.attack_log += "\[[time_stamp()]\]
UNKNOWN SUBJECT (No longer exists) shot
[key_name_admin(M)] with a
dartgun ([R])"
+ M.create_attack_log("
UNKNOWN SUBJECT (No longer exists) shot
[key_name_admin(M)] with a
dartgun ([R])")
msg_admin_attack("UNKNOWN shot [key_name(M)] with a
dartgun ([R]) (
JMP )")
if(D.reagents)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 2d87a32be2b..7b848dca5c7 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -30,6 +30,12 @@
else
power_supply = new(src)
power_supply.give(power_supply.maxcharge)
+ update_ammo_types()
+ if(selfcharge)
+ processing_objects.Add(src)
+ update_icon()
+
+/obj/item/weapon/gun/energy/proc/update_ammo_types()
var/obj/item/ammo_casing/energy/shot
for(var/i = 1, i <= ammo_type.len, i++)
var/shottype = ammo_type[i]
@@ -38,9 +44,6 @@
shot = ammo_type[select]
fire_sound = shot.fire_sound
fire_delay = shot.delay
- if(selfcharge)
- processing_objects.Add(src)
- update_icon()
/obj/item/weapon/gun/energy/Destroy()
if(selfcharge)
@@ -58,9 +61,9 @@
var/obj/item/ammo_casing/energy/E = ammo_type[select]
if(use_external_power)
var/obj/item/weapon/stock_parts/cell/external = get_external_power_supply()
- if(!external || !external.use((E.e_cost)/10)) //Take power from the borg...
+ if(!external || !external.use(E.e_cost)) //Take power from the borg...
return //Note, uses /10 because of shitty mods to the cell system
- power_supply.give(1000) //... to recharge the shot
+ power_supply.give(100) //... to recharge the shot
update_icon()
/obj/item/weapon/gun/energy/attack_self(mob/living/user as mob)
@@ -129,9 +132,9 @@
overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))
else
overlays += image(icon = icon, icon_state = "[icon_state]_[modifystate ? "[shot.select_name]_" : ""]charge[ratio]")
- if(F && can_flashlight)
+ if(gun_light && can_flashlight)
var/iconF = "flight"
- if(F.on)
+ if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
if(itemState)
@@ -160,12 +163,20 @@
playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
return (OXYLOSS)
+/obj/item/weapon/gun/energy/on_varedit(modified_var)
+ if(modified_var == "selfcharge")
+ if(selfcharge)
+ processing_objects.Add(src)
+ else
+ processing_objects.Remove(src)
+ ..()
+
/obj/item/weapon/gun/energy/proc/robocharge()
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
- if(R.cell.use(shot.e_cost/10)) //Take power from the borg... //Divided by 10 because cells and charge costs are fucked.
+ if(R.cell.use(shot.e_cost)) //Take power from the borg...
power_supply.give(shot.e_cost) //... to recharge the shot
/obj/item/weapon/gun/energy/proc/get_external_power_supply()
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
new file mode 100644
index 00000000000..bdc4126a25c
--- /dev/null
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -0,0 +1,428 @@
+/obj/item/weapon/gun/energy/kinetic_accelerator
+ name = "proto-kinetic accelerator"
+ desc = "A self recharging, ranged mining tool that does increased damage in low pressure. Capable of holding up to six slots worth of mod kits."
+ icon_state = "kineticgun"
+ item_state = "kineticgun"
+ ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
+ cell_type = /obj/item/weapon/stock_parts/cell/emproof
+ needs_permit = 0
+ unique_rename = 1
+ origin_tech = "combat=3;powerstorage=3;engineering=3"
+ weapon_weight = WEAPON_LIGHT
+ can_flashlight = 1
+ flight_x_offset = 15
+ flight_y_offset = 9
+ var/overheat_time = 16
+ var/holds_charge = FALSE
+ var/unique_frequency = FALSE // modified by KA modkits
+ var/overheat = FALSE
+
+ var/max_mod_capacity = 100
+ var/list/modkits = list()
+
+ var/empty_state = "kineticgun_empty"
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
+ if(..(user, 1))
+ if(max_mod_capacity)
+ to_chat(user, "
[get_remaining_mod_capacity()]% mod capacity remaining.")
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ to_chat(user, "
There is a [M.name] mod installed, using [M.cost]% capacity. ")
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/weapon/crowbar))
+ if(modkits.len)
+ to_chat(user, "
You pry the modifications out. ")
+ playsound(loc, A.usesound, 100, 1)
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
+ else
+ to_chat(user, "
There are no modifications currently installed. ")
+ else if(istype(A, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/MK = A
+ MK.install(src, user)
+ else
+ ..()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity()
+ var/current_capacity_used = 0
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ current_capacity_used += M.cost
+ return max_mod_capacity - current_capacity_used
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_modkits()
+ . = list()
+ for(var/A in modkits)
+ . += A
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ M.modify_projectile(K)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+ max_mod_capacity = 80
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/New()
+ . = ..()
+ if(!holds_charge)
+ empty()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
+ . = ..()
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
+ . = ..()
+ if(!can_shoot())
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/dropped()
+ . = ..()
+ if(!holds_charge)
+ // Put it on a delay because moving item from slot to hand
+ // calls dropped().
+ spawn(2)
+ empty_if_not_held()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
+ if(!ismob(loc))
+ empty()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
+ power_supply.use(500)
+ update_icon()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
+ if(overheat)
+ return
+ overheat = TRUE
+
+ var/carried = 0
+ if(!unique_frequency)
+ for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \
+ loc.GetAllContents())
+
+ carried++
+
+ carried = max(carried, 1)
+ else
+ carried = 1
+
+ spawn(overheat_time * carried)
+ reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
+ return
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
+ power_supply.give(500)
+ if(!suppressed)
+ playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ else if(isliving(loc))
+ to_chat(loc, "
[src] silently charges up.")
+ update_icon()
+ overheat = FALSE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
+ overlays.Cut()
+ if(empty_state && !can_shoot())
+ overlays += empty_state
+
+ if(gun_light && can_flashlight)
+ var/iconF = "flight"
+ if(gun_light.on)
+ iconF = "flight_on"
+ overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
+
+
+//Casing
+/obj/item/ammo_casing/energy/kinetic
+ projectile_type = /obj/item/projectile/kinetic
+ select_name = "kinetic"
+ e_cost = 500
+ fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
+
+/obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ ..()
+ if(loc && istype(loc, /obj/item/weapon/gun/energy/kinetic_accelerator))
+ var/obj/item/weapon/gun/energy/kinetic_accelerator/KA = loc
+ KA.modify_projectile(BB)
+
+ var/turf/proj_turf = get_turf(BB)
+ if(!isturf(proj_turf))
+ return
+ var/datum/gas_mixture/environment = proj_turf.return_air()
+ var/pressure = environment.return_pressure()
+ if(pressure > 50)
+ BB.name = "weakened [BB.name]"
+ var/obj/item/projectile/kinetic/K = BB
+ K.damage *= K.pressure_decrease
+
+
+//Projectiles
+/obj/item/projectile/kinetic
+ name = "kinetic force"
+ icon_state = null
+ damage = 40
+ damage_type = BRUTE
+ flag = "bomb"
+ range = 3
+ log_override = TRUE
+
+ var/pressure_decrease = 0.25
+ var/turf_aoe = FALSE
+ var/mob_aoe = FALSE
+ var/list/hit_overlays = list()
+
+/obj/item/projectile/kinetic/pod
+ range = 4
+
+/obj/item/projectile/kinetic/pod/regular
+ damage = 50
+ pressure_decrease = 0.5
+
+/obj/item/projectile/kinetic/pod/enhanced
+ turf_aoe = TRUE
+ mob_aoe = TRUE
+
+/obj/item/projectile/kinetic/on_range()
+ strike_thing()
+ ..()
+
+/obj/item/projectile/kinetic/on_hit(atom/target)
+ strike_thing(target)
+ . = ..()
+
+/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
+ var/turf/target_turf = get_turf(target)
+ if(!target_turf)
+ target_turf = get_turf(src)
+ if(ismineralturf(target_turf))
+ var/turf/simulated/mineral/M = target_turf
+ M.gets_drilled(firer)
+ var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf)
+ K.color = color
+ for(var/type in hit_overlays)
+ new type(target_turf)
+ if(turf_aoe)
+ for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
+ if(ismineralturf(T))
+ var/turf/simulated/mineral/M = T
+ M.gets_drilled(firer)
+ if(mob_aoe)
+ for(var/mob/living/L in range(1, target_turf) - firer - target)
+ var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration)
+ L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
+ to_chat(L, "You're struck by a [name]! ")
+
+
+//Modkits
+/obj/item/borg/upgrade/modkit
+ name = "modification kit"
+ desc = "An upgrade for kinetic accelerators."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "modkit"
+ origin_tech = "programming=2;materials=2;magnets=4"
+ require_module = 1
+ module_type = /obj/item/weapon/robot_module/miner
+ usesound = 'sound/items/Screwdriver.ogg'
+ var/denied_type = null
+ var/maximum_of_type = 1
+ var/cost = 30
+ var/modifier = 1 //For use in any mod kit that has numerical modifiers
+
+/obj/item/borg/upgrade/modkit/examine(mob/user)
+ if(..(user, 1))
+ to_chat(user, "Occupies [cost]% of mod capacity. ")
+
+/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user))
+ install(A, user)
+ else
+ ..()
+
+/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
+ if(..())
+ return
+
+ for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
+ return install(H, usr)
+
+/obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = TRUE
+ if(denied_type)
+ var/number_of_denied = 0
+ for(var/A in KA.get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ if(istype(M, denied_type))
+ number_of_denied++
+ if(number_of_denied >= maximum_of_type)
+ . = FALSE
+ break
+ if(KA.get_remaining_mod_capacity() >= cost)
+ if(.)
+ to_chat(user, "You install the modkit. ")
+ playsound(loc, usesound, 100, 1)
+ user.unEquip(src)
+ forceMove(KA)
+ KA.modkits += src
+ else
+ to_chat(user, "The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits. ")
+ else
+ to_chat(user, "You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits. ")
+ . = FALSE
+
+/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ forceMove(get_turf(KA))
+ KA.modkits -= src
+
+/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
+
+
+//Range
+/obj/item/borg/upgrade/modkit/range
+ name = "range increase"
+ desc = "Increases the range of a kinetic accelerator when installed."
+ modifier = 1
+ cost = 24 //so you can fit four plus a tracer cosmetic
+
+/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K)
+ K.range += modifier
+
+
+//Damage
+/obj/item/borg/upgrade/modkit/damage
+ name = "damage increase"
+ desc = "Increases the damage of kinetic accelerator when installed."
+ modifier = 10
+
+/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
+ K.damage += modifier
+
+
+//Cooldown
+/obj/item/borg/upgrade/modkit/cooldown
+ name = "cooldown decrease"
+ desc = "Decreases the cooldown of a kinetic accelerator."
+ modifier = 2.5
+
+/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.overheat_time -= modifier
+
+/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.overheat_time += modifier
+ ..()
+
+
+//AoE blasts
+/obj/item/borg/upgrade/modkit/aoe
+ modifier = 0
+
+/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
+ K.name = "kinetic explosion"
+ if(!K.turf_aoe && !K.mob_aoe)
+ K.hit_overlays += /obj/effect/overlay/temp/explosion/fast
+ K.mob_aoe += modifier
+
+/obj/item/borg/upgrade/modkit/aoe/turfs
+ name = "mining explosion"
+ desc = "Causes the kinetic accelerator to destroy rock in an AoE."
+ denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs
+
+/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K)
+ ..()
+ K.turf_aoe = TRUE
+
+/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
+ name = "offensive mining explosion"
+ desc = "Causes the kinetic accelerator to destroy rock and damage mobs in an AoE."
+ maximum_of_type = 3
+ modifier = 0.25
+
+/obj/item/borg/upgrade/modkit/aoe/mobs
+ name = "offensive explosion"
+ desc = "Causes the kinetic accelerator to damage mobs in an AoE."
+ modifier = 0.2
+
+
+//Indoors
+/obj/item/borg/upgrade/modkit/indoors
+ name = "decrease pressure penalty"
+ desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
+ modifier = 2
+ denied_type = /obj/item/borg/upgrade/modkit/indoors
+ maximum_of_type = 2
+ cost = 40
+
+/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
+ K.pressure_decrease *= modifier
+
+
+//Trigger Guard
+/obj/item/borg/upgrade/modkit/trigger_guard
+ name = "modified trigger guard"
+ desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed."
+ cost = 20
+ denied_type = /obj/item/borg/upgrade/modkit/trigger_guard
+
+/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+
+/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.trigger_guard = TRIGGER_GUARD_NORMAL
+ ..()
+
+
+//Cosmetic
+
+/obj/item/borg/upgrade/modkit/chassis_mod
+ name = "super chassis"
+ desc = "Makes your KA yellow. All the fun of having a more powerful KA without actually having a more powerful KA."
+ cost = 0
+ denied_type = /obj/item/borg/upgrade/modkit/chassis_mod
+ var/chassis_icon = "kineticgun_u"
+ var/chassis_name = "super-kinetic accelerator"
+
+/obj/item/borg/upgrade/modkit/chassis_mod/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.icon_state = chassis_icon
+ KA.name = chassis_name
+
+/obj/item/borg/upgrade/modkit/chassis_mod/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.icon_state = initial(KA.icon_state)
+ KA.name = initial(KA.name)
+ ..()
+
+/obj/item/borg/upgrade/modkit/chassis_mod/orange
+ name = "hyper chassis"
+ desc = "Makes your KA orange. All the fun of having explosive blasts without actually having explosive blasts."
+ chassis_icon = "kineticgun_h"
+ chassis_name = "hyper-kinetic accelerator"
+
+/obj/item/borg/upgrade/modkit/tracer
+ name = "white tracer bolts"
+ desc = "Causes kinetic accelerator bolts to have a white tracer trail and explosion."
+ cost = 0
+ denied_type = /obj/item/borg/upgrade/modkit/tracer
+ var/bolt_color = "#FFFFFF"
+
+/obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/item/projectile/kinetic/K)
+ K.icon_state = "ka_tracer"
+ K.color = bolt_color
+
+/obj/item/borg/upgrade/modkit/tracer/adjustable
+ name = "adjustable tracer bolts"
+ desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color."
+
+/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
+ bolt_color = input(user,"Choose Color") as color
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 40356f8a7d9..fc14b32a09c 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -3,7 +3,7 @@
desc = "A basic energy-based laser gun that fires concentrated beams of light which pass through glass and thin metal."
icon_state = "laser"
item_state = "laser"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=2000)
origin_tech = "combat=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
@@ -66,7 +66,7 @@
desc = "An advanced laser cannon that does more damage the farther away the target is."
icon_state = "lasercannon"
item_state = "laser"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 8d920a7e736..379a8af70d8 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -31,20 +31,20 @@
desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: stun and kill."
icon_state = "mini"
item_state = "gun"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
ammo_x_offset = 2
charge_sections = 3
can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
/obj/item/weapon/gun/energy/gun/mini/New()
- F = new /obj/item/device/flashlight/seclite(src)
+ gun_light = new /obj/item/device/flashlight/seclite(src)
..()
- power_supply.maxcharge = 6000
- power_supply.charge = 6000
+ power_supply.maxcharge = 600
+ power_supply.charge = 600
/obj/item/weapon/gun/energy/gun/mini/update_icon()
..()
- if(F && F.on)
+ if(gun_light && gun_light.on)
overlays += "mini-light"
/obj/item/weapon/gun/energy/gun/hos
@@ -71,7 +71,7 @@
icon_state = "turretlaser"
item_state = "turretlaser"
slot_flags = null
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
weapon_weight = WEAPON_MEDIUM
can_flashlight = 0
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index c155cfb9dff..7ded54f6690 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -3,7 +3,7 @@
desc = "A heavy-duty, multifaceted energy rifle with three modes. Preferred by front-line combat personnel."
icon_state = "pulse"
item_state = null
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
@@ -25,7 +25,7 @@
/obj/item/weapon/gun/energy/pulse/carbine
name = "pulse carbine"
desc = "A compact variant of the pulse rifle with less firepower but easier storage."
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BELT
icon_state = "pulse_carbine"
item_state = "pulse"
@@ -37,7 +37,7 @@
/obj/item/weapon/gun/energy/pulse/pistol
name = "pulse pistol"
desc = "A pulse rifle in an easily concealed handgun package with low capacity."
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
icon_state = "pulse_pistol"
item_state = "gun"
@@ -70,3 +70,16 @@
/obj/item/weapon/gun/energy/pulse/pistol/m1911/isHandgun()
return 1
+
+/obj/item/weapon/gun/energy/pulse/turret
+ name = "pulse turret gun"
+ desc = "A heavy, turret-mounted pulse energy cannon."
+ icon_state = "turretlaser"
+ item_state = "turretlaser"
+ slot_flags = null
+ w_class = WEIGHT_CLASS_HUGE
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser/pulse)
+ weapon_weight = WEAPON_MEDIUM
+ can_flashlight = 0
+ trigger_guard = TRIGGER_GUARD_NONE
+ ammo_x_offset = 2
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index a648831cd8b..009d2c6c5e8 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -5,7 +5,7 @@
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/IonRifle.ogg'
origin_tech = "combat=2;magnets=4"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/ion)
@@ -21,7 +21,7 @@
desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
icon_state = "ioncarbine"
origin_tech = "combat=4;magnets=4;materials=4"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BELT
ammo_x_offset = 2
flight_x_offset = 18
@@ -60,7 +60,7 @@
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "riotgun"
item_state = "c20r"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
ammo_type = list(/obj/item/ammo_casing/energy/meteor)
cell_type = /obj/item/weapon/stock_parts/cell/potato
clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
@@ -74,7 +74,7 @@
item_state = "pen"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/gun/energy/mindflayer
name = "\improper Mind Flayer"
@@ -84,147 +84,12 @@
ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
ammo_x_offset = 2
-/obj/item/weapon/gun/energy/kinetic_accelerator
- name = "proto-kinetic accelerator"
- desc = "In the year 2544, only a year after the discovery of a potentially \
- world-changing substance, now colloquially referred to as plasma, the \
- Nanotrasen-UEG mining conglomerate introduced a prototype of a gun-like \
- device intended for quick, effective mining of plasma in the low \
- pressures of the solar system. Included in this presentation were \
- demonstrations of the gun being fired at collections of rocks contained \
- in vacuumed environments, obliterating them instantly while maintaining \
- the structure of the ores buried within them. Additionally, volunteers \
- were called from the crowd to have the gun used on them, only proving that \
- the gun caused little harm to objects in standard pressure. \n\
- An official from an unnamed, now long dissipated company observed this \
- presentation and offered to share their self-recharger cells, powered \
- by the user's bioelectrical field, another new and unknown technology. \
- They warned that the cells were incredibly experimental and several times \
- had injured workers, but the scientists as Nanotrasen were unable to resist \
- the money-saving potential of self recharging cells. Upon accepting this \
- offer, it took only a matter of days to prove the volatility of these cells, \
- as they exploded left and right whenever inserted into the prototype devices, \
- only throwing more money in the bin. \n\
- Whenever the Nanotrasen scientists were on the edge of giving up, a \
- breakthrough was made by head researcher Miles Parks McCollum, who \
- demonstrated that the cells could be stabilized when exposed to radium \
- then cooled with cryostylane. After this discovery, the low pressure gun, \
- now named the Kinetic Accelerator, was hastily completed and made compatible \
- with the self-recharging cells. As a result of poor testing, the currently \
- used guns lose their charge when not in use, and when two Kinetic Accelerators \
- come in proximity of one another, they will interfere with each other. Despite \
- this, the shoddy guns still see use in the mining of plasma to this day."
- icon_state = "kineticgun"
- item_state = "kineticgun"
- ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
- cell_type = /obj/item/weapon/stock_parts/cell/emproof
- // Apparently these are safe to carry? I'm sure goliaths would disagree.
- needs_permit = 0
- unique_rename = 1
- origin_tech = "combat=3;powerstorage=3;engineering=3"
- weapon_weight = WEAPON_LIGHT
- can_flashlight = 1
- flight_x_offset = 15
- flight_y_offset = 9
- var/overheat_time = 16
- var/holds_charge = FALSE
- var/unique_frequency = FALSE // modified by KA modkits
- var/overheat = FALSE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/super
- name = "super-kinetic accelerator"
- desc = "An upgraded, superior version of the proto-kinetic accelerator."
- icon_state = "kineticgun_u"
- ammo_type = list(/obj/item/ammo_casing/energy/kinetic/super)
- overheat_time = 15
- origin_tech = "combat=3;powerstorage=2"
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/hyper
- name = "hyper-kinetic accelerator"
- desc = "An upgraded, even more superior version of the proto-kinetic accelerator."
- icon_state = "kineticgun_h"
- ammo_type = list(/obj/item/ammo_casing/energy/kinetic/hyper)
- overheat_time = 14
- origin_tech = "combat=4;powerstorage=3"
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
- holds_charge = TRUE
- unique_frequency = TRUE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg
- holds_charge = TRUE
- unique_frequency = TRUE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/New()
- . = ..()
- if(!holds_charge)
- empty()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
- . = ..()
- attempt_reload()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
- . = ..()
- if(!can_shoot())
- attempt_reload()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/dropped()
- . = ..()
- if(!holds_charge)
- // Put it on a delay because moving item from slot to hand
- // calls dropped().
- spawn(1)
- if(!ismob(loc))
- empty()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
- power_supply.use(5000)
- update_icon()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
- if(overheat)
- return
- overheat = TRUE
-
- var/carried = 0
- if(!unique_frequency)
- for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \
- loc.GetAllContents())
-
- carried++
-
- carried = max(carried, 1)
- else
- carried = 1
-
- spawn(overheat_time * carried)
- reload()
- overheat = FALSE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
- return
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
- power_supply.give(5000)
- if(!suppressed)
- playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
- else if(ismob(loc))
- to_chat(loc, "[src] silently charges up.")
- update_icon()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
- if(!can_shoot())
- icon_state = "[initial(icon_state)]_empty"
- else
- icon_state = initial(icon_state)
-
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
name = "mini energy crossbow"
desc = "A weapon favored by syndicate stealth specialists."
icon_state = "crossbow"
item_state = "crossbow"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=2000)
origin_tech = "combat=2;magnets=2;syndicate=5"
suppressed = 1
@@ -234,6 +99,9 @@
overheat_time = 20
holds_charge = TRUE
unique_frequency = TRUE
+ can_flashlight = 0
+ max_mod_capacity = 0
+ empty_state = null
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/ninja
name = "energy dart thrower"
@@ -243,7 +111,7 @@
name = "energy crossbow"
desc = "A reverse engineered weapon using syndicate technology."
icon_state = "crossbowlarge"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=4000)
origin_tech = "combat=2;magnets=2;syndicate=3" //can be further researched for more syndie tech
suppressed = 0
@@ -271,6 +139,8 @@
origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1"
ammo_type = list(/obj/item/ammo_casing/energy/plasma)
fire_sound = 'sound/weapons/laser.ogg'
+ usesound = 'sound/items/Welder.ogg'
+ toolspeed = 1
flags = CONDUCT | OPENCONTAINER
attack_verb = list("attacked", "slashed", "cut", "sliced")
force = 12
@@ -287,11 +157,11 @@
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
var/obj/item/stack/sheet/S = A
S.use(1)
- power_supply.give(10000)
+ power_supply.give(1000)
to_chat(user, "You insert [A] in [src], recharging it. ")
else if(istype(A, /obj/item/weapon/ore/plasma))
qdel(A)
- power_supply.give(5000)
+ power_supply.give(500)
to_chat(user, "You insert [A] in [src], recharging it. ")
else
..()
@@ -410,7 +280,7 @@
desc = "A specialized firearm designed to fire lethal bolts of toxins."
icon_state = "toxgun"
fire_sound = 'sound/effects/stealthoff.ogg'
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "combat=4;plasmatech=3"
ammo_type = list(/obj/item/ammo_casing/energy/toxplasma)
shaded_charge = 1
@@ -422,7 +292,7 @@
origin_tech = "combat=6;materials=5;powerstorage=4"
ammo_type = list(/obj/item/ammo_casing/energy/sniper)
slot_flags = SLOT_BACK
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
zoomable = TRUE
zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you.
shaded_charge = 1
@@ -433,17 +303,15 @@
icon_state = "tempgun_4"
item_state = "tempgun_4"
slot_flags = SLOT_BACK
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
fire_sound = 'sound/weapons/pulse3.ogg'
desc = "A gun that changes the body temperature of its targets."
var/temperature = 300
var/target_temperature = 300
- var/e_cost = 1000
origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/temp)
selfcharge = 1
- cell_type = /obj/item/weapon/stock_parts/cell
var/powercost = ""
var/powercostcolor = ""
@@ -499,19 +367,19 @@
T.temp = temperature
switch(temperature)
if(0 to 100)
- T.e_cost = 3000
+ T.e_cost = 300
powercost = "High"
if(100 to 250)
- T.e_cost = 2000
+ T.e_cost = 200
powercost = "Medium"
if(251 to 300)
- T.e_cost = 1000
+ T.e_cost = 100
powercost = "Low"
if(301 to 400)
- T.e_cost = 2000
+ T.e_cost = 200
powercost = "Medium"
if(401 to 1000)
- T.e_cost = 3000
+ T.e_cost = 300
powercost = "High"
switch(powercost)
if("High")
@@ -601,16 +469,16 @@
/obj/item/weapon/gun/energy/temperature/proc/update_charge()
var/charge = power_supply.charge
switch(charge)
- if(9000 to INFINITY) overlays += "900"
- if(8000 to 9000) overlays += "800"
- if(7000 to 8000) overlays += "700"
- if(6000 to 7000) overlays += "600"
- if(5000 to 6000) overlays += "500"
- if(4000 to 5000) overlays += "400"
- if(3000 to 4000) overlays += "300"
- if(2000 to 3000) overlays += "200"
- if(1000 to 2002) overlays += "100"
- if(-INFINITY to 1000) overlays += "0"
+ if(900 to INFINITY) overlays += "900"
+ if(800 to 900) overlays += "800"
+ if(700 to 800) overlays += "700"
+ if(600 to 700) overlays += "600"
+ if(500 to 600) overlays += "500"
+ if(400 to 500) overlays += "400"
+ if(300 to 400) overlays += "300"
+ if(200 to 300) overlays += "200"
+ if(100 to 202) overlays += "100"
+ if(-INFINITY to 100) overlays += "0"
/obj/item/weapon/gun/energy/mimicgun
name = "mimic gun"
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 9728a9442e1..ea92cb06449 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -5,23 +5,12 @@
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
- cell_type = /obj/item/weapon/stock_parts/cell/crap
/obj/item/weapon/gun/energy/taser/mounted
name = "mounted taser gun"
selfcharge = 1
use_external_power = 1
-/obj/item/weapon/gun/energy/taser/cyborg
- name = "taser gun"
- desc = "A small, low capacity gun used for non-lethal takedowns."
- icon_state = "taser"
- cell_type = /obj/item/weapon/stock_parts/cell/secborg
-
-/obj/item/weapon/gun/energy/disabler/cyborg/newshot()
- ..()
- robocharge()
-
/obj/item/weapon/gun/energy/shock_revolver
name = "tesla revolver"
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm
index 7b94698f0e9..2e66b00643f 100644
--- a/code/modules/projectiles/guns/energy/telegun.dm
+++ b/code/modules/projectiles/guns/energy/telegun.dm
@@ -6,7 +6,6 @@
icon_state = "telegun"
item_state = "ionrifle"
origin_tech = "combat=6;materials=7;powerstorage=5;bluespace=5;syndicate=4"
- cell_type = /obj/item/weapon/stock_parts/cell/crap
ammo_type = list(/obj/item/ammo_casing/energy/teleport)
shaded_charge = 1
var/teleport_target = null
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm
index 5abac9ebad9..ad49c99bfc4 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/grenade_launcher.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "riotgun"
item_state = "riotgun"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
throw_speed = 2
throw_range = 10
force = 5
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 860d52d2550..f26583bbe0d 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -7,7 +7,7 @@
fire_sound = 'sound/weapons/emitter.ogg'
fire_sound_text = "energy blast"
flags = CONDUCT
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
var/max_charges = 6
var/charges = 0
var/recharge_rate = 4
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index 9ef7de7f369..9909cb18d9d 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -8,6 +8,7 @@
ammo_type = /obj/item/ammo_casing/magic/change
icon_state = "staffofchange"
item_state = "staffofchange"
+ fire_sound = 'sound/magic/Staff_Change.ogg'
/obj/item/weapon/gun/magic/staff/animate
name = "staff of animation"
@@ -15,6 +16,7 @@
ammo_type = /obj/item/ammo_casing/magic/animate
icon_state = "staffofanimation"
item_state = "staffofanimation"
+ fire_sound = 'sound/magic/Staff_animation.ogg'
/obj/item/weapon/gun/magic/staff/healing
name = "staff of healing"
@@ -22,6 +24,7 @@
ammo_type = /obj/item/ammo_casing/magic/heal
icon_state = "staffofhealing"
item_state = "staffofhealing"
+ fire_sound = 'sound/magic/Staff_Healing.ogg'
/obj/item/weapon/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves
return
@@ -35,6 +38,7 @@
max_charges = 10
recharge_rate = 2
no_den_usage = 1
+ fire_sound = 'sound/magic/Staff_Chaos.ogg'
/obj/item/weapon/gun/magic/staff/door
name = "staff of door creation"
@@ -45,16 +49,17 @@
max_charges = 10
recharge_rate = 2
no_den_usage = 1
+ fire_sound = 'sound/magic/Staff_Door.ogg'
/obj/item/weapon/gun/magic/staff/honk
name = "staff of the honkmother"
desc = "Honk"
- fire_sound = "sound/items/airhorn.ogg"
ammo_type = /obj/item/ammo_casing/magic/honk
icon_state = "honker"
item_state = "honker"
max_charges = 4
recharge_rate = 8
+ fire_sound = 'sound/items/airhorn.ogg'
/obj/item/weapon/gun/magic/staff/focus
name = "mental focus"
@@ -63,3 +68,23 @@
icon_state = "focus"
item_state = "focus"
ammo_type = list(/obj/item/ammo_casing/forcebolt)
+
+/obj/item/weapon/gun/magic/staff/spellblade
+ name = "spellblade"
+ desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword."
+ fire_sound = 'sound/magic/Fireball.ogg'
+ ammo_type = /obj/item/ammo_casing/magic/spellblade
+ icon_state = "spellblade"
+ item_state = "spellblade"
+ hitsound = 'sound/weapons/rapierhit.ogg'
+ force = 20
+ armour_penetration = 75
+ block_chance = 50
+ sharp = 1
+ edge = 1
+ max_charges = 4
+
+/obj/item/weapon/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ if(attack_type == PROJECTILE_ATTACK)
+ final_block_chance = 0
+ return ..()
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index f743d29f275..ac804ab9192 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -4,7 +4,7 @@
ammo_type = /obj/item/ammo_casing/magic
icon_state = "nothingwand"
item_state = "wand"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
can_charge = 0
max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
var/variable_charges = 1
@@ -50,7 +50,7 @@
/obj/item/weapon/gun/magic/wand/proc/zap_self(mob/living/user)
user.visible_message("[user] zaps \himself with [src]. ")
playsound(user, fire_sound, 50, 1)
- user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] zapped \himself with a [src] "
+ user.create_attack_log("[user]/[user.ckey] zapped \himself with a [src] ")
/////////////////////////////////////
//WAND OF DEATH
@@ -59,6 +59,7 @@
/obj/item/weapon/gun/magic/wand/death
name = "wand of death"
desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
+ fire_sound = 'sound/magic/WandoDeath.ogg'
ammo_type = /obj/item/ammo_casing/magic/death
icon_state = "deathwand"
max_charges = 3 //3, 2, 2, 1
@@ -79,6 +80,7 @@
name = "wand of resurrection"
desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
ammo_type = /obj/item/ammo_casing/magic/heal
+ fire_sound = 'sound/magic/Staff_Healing.ogg'
icon_state = "revivewand"
max_charges = 3 //3, 2, 2, 1
@@ -96,6 +98,7 @@
name = "wand of polymorph"
desc = "This wand is attuned to chaos and will radically alter the victim's form."
ammo_type = /obj/item/ammo_casing/magic/change
+ fire_sound = 'sound/magic/Staff_Change.ogg'
icon_state = "polywand"
max_charges = 10 //10, 5, 5, 4
@@ -115,6 +118,7 @@
icon_state = "telewand"
max_charges = 10 //10, 5, 5, 4
no_den_usage = 1
+ fire_sound = 'sound/magic/Wand_Teleport.ogg'
/obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user)
do_teleport(user, user, 10)
@@ -132,6 +136,7 @@
name = "wand of door creation"
desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
ammo_type = /obj/item/ammo_casing/magic/door
+ fire_sound = 'sound/magic/Staff_Door.ogg'
icon_state = "doorwand"
max_charges = 20 //20, 10, 10, 7
@@ -147,6 +152,7 @@
/obj/item/weapon/gun/magic/wand/fireball
name = "wand of fireball"
desc = "This wand shoots scorching balls of fire that explode into destructive flames."
+ fire_sound = 'sound/magic/Fireball.ogg'
ammo_type = /obj/item/ammo_casing/magic/fireball
icon_state = "firewand"
max_charges = 8 //8, 4, 4, 3
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index 032874c4918..59a24533e80 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronogun"
item_state = "chronogun"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/mob/living/current_target
var/last_check = 0
@@ -103,7 +103,7 @@
target.adjustFireLoss(-4)
if(ishuman(target))
var/var/mob/living/carbon/human/H = target
- for(var/obj/item/organ/external/E in H.organs)
+ for(var/obj/item/organ/external/E in H.bodyparts)
if(prob(10))
if(E.mend_fracture())
E.perma_injury = 0
diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm
index ae9c8f06d09..8fec6cd8b8e 100644
--- a/code/modules/projectiles/guns/mounted.dm
+++ b/code/modules/projectiles/guns/mounted.dm
@@ -4,7 +4,7 @@
icon_state = "armcannon"
force = 5
flags = NODROP
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
can_flashlight = 0
selfcharge = 1
trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
@@ -20,7 +20,7 @@
item_state = "armcannonlase"
force = 5
flags = NODROP
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
materials = null
selfcharge = 1
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 961a7b91e05..7575e9b92f8 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -3,7 +3,7 @@
name = "projectile gun"
icon_state = "pistol"
origin_tech = "combat=2;materials=2"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=1000)
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
@@ -77,7 +77,7 @@
S.oldsound = fire_sound
S.initial_w_class = w_class
fire_sound = 'sound/weapons/Gunshot_silenced.ogg'
- w_class = 3 //so pistols do not fit in pockets when suppressed
+ w_class = WEIGHT_CLASS_NORMAL //so pistols do not fit in pockets when suppressed
A.loc = src
update_icon()
return
@@ -169,7 +169,7 @@
user.visible_message("[user] shortens \the [src]!", "You shorten \the [src]. ")
name = "sawn-off [name]"
desc = sawn_desc
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
item_state = "gun"//phil235 is it different with different skin?
slot_flags &= ~SLOT_BACK //you can't sling it on your back
slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
@@ -191,7 +191,7 @@
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "suppressor"
item_state = "suppressor"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/oldsound = null
var/initial_w_class = null
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index d0e7efcd26b..1b666a88953 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/gun/projectile/automatic
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
var/alarmed = 0
var/select = 1
can_suppress = 1
@@ -194,7 +194,7 @@
desc = "A genuine 'Chicago Typewriter'."
icon_state = "tommygun"
item_state = "shotgun"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
mag_type = /obj/item/ammo_box/magazine/tommygunm45
@@ -222,7 +222,7 @@
desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines."
icon_state = "bulldog"
item_state = "bulldog"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "combat=5;materials=4;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/m12g
fire_sound = 'sound/weapons/Gunshot4.ogg'
@@ -249,3 +249,19 @@
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
..()
empty_alarm()
+
+/obj/item/weapon/gun/projectile/automatic/lasercarbine
+ name = "\improper IK-60 Laser Carbine"
+ desc = "An experimental carbine. Uses encased laser projectors as ammunition."//we need to uncouple the toroidal resistance dejammers
+ icon_state = "lasercarbine"
+ item_state = "laser"
+ w_class = WEIGHT_CLASS_NORMAL
+ origin_tech = "combat=5;materials=5"
+ mag_type = /obj/item/ammo_box/magazine/laser
+ fire_sound = 'sound/weapons/emitter2.ogg'
+ can_suppress = 0
+ burst_size = 2
+
+/obj/item/weapon/gun/projectile/automatic/lasercarbine/update_icon()
+ ..()
+ icon_state = "lasercarbine[magazine ? "-[Ceiling(get_ammo(0)/5)*5]" : ""]"
diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm
new file mode 100644
index 00000000000..2512ebfa35f
--- /dev/null
+++ b/code/modules/projectiles/guns/projectile/bow.dm
@@ -0,0 +1,98 @@
+/obj/item/weapon/gun/projectile/bow
+ name = "bow"
+ desc = "A sturdy bow made out of wood and reinforced with iron."
+ icon_state = "bow_unloaded"
+ item_state = "bow"
+ fire_sound = 'sound/weapons/grenadelaunch.ogg'
+ mag_type = /obj/item/ammo_box/magazine/internal/bow
+ flags = HANDSLOW
+ weapon_weight = WEAPON_HEAVY
+ var/draw_sound = 'sound/weapons/draw_bow.ogg'
+ var/ready_to_fire = 0
+ var/slowdown_when_ready = 2
+
+/obj/item/weapon/gun/projectile/bow/update_icon()
+ if(magazine.ammo_count() && !ready_to_fire)
+ icon_state = "bow_loaded"
+ else if(ready_to_fire)
+ icon_state = "bow_firing"
+ slowdown = slowdown_when_ready
+ else
+ icon_state = initial(icon_state)
+ slowdown = initial(slowdown)
+
+/obj/item/weapon/gun/projectile/bow/dropped(mob/user)
+ if(magazine && magazine.ammo_count())
+ magazine.empty_magazine()
+ ready_to_fire = FALSE
+ update_icon()
+
+/obj/item/weapon/gun/projectile/bow/attack_self(mob/living/user)
+ if(!ready_to_fire && magazine.ammo_count())
+ ready_to_fire = TRUE
+ playsound(user, draw_sound, 100, 1)
+ update_icon()
+ else
+ ready_to_fire = FALSE
+ update_icon()
+
+/obj/item/weapon/gun/projectile/bow/attackby(obj/item/A, mob/user, params)
+ var/num_loaded = magazine.attackby(A, user, params, 1)
+ if(num_loaded)
+ to_chat(user, "You ready \the [A] into \the [src]. ")
+ update_icon()
+ chamber_round()
+
+/obj/item/weapon/gun/projectile/bow/can_shoot()
+ . = ..()
+ if(!ready_to_fire)
+ return FALSE
+
+/obj/item/weapon/gun/projectile/bow/shoot_with_empty_chamber(mob/living/user as mob|obj)
+ return
+
+/obj/item/weapon/gun/projectile/bow/process_chamber(eject_casing = 0, empty_chamber = 1)
+ . = ..()
+ ready_to_fire = FALSE
+ update_icon()
+
+// ammo
+/obj/item/ammo_box/magazine/internal/bow
+ name = "bow internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ caliber = "arrow"
+ max_ammo = 1
+
+
+/obj/item/projectile/bullet/reusable/arrow
+ name = "arrow"
+ icon_state = "arrow"
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ range = 10
+ damage = 25
+ damage_type = BRUTE
+
+/obj/item/ammo_casing/caseless/arrow
+ name = "arrow"
+ desc = "Stab, stab, stab."
+ icon_state = "arrow"
+ force = 10
+ sharp = 1
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow
+ caliber = "arrow"
+
+//quiver
+/obj/item/weapon/storage/backpack/quiver
+ name = "quiver"
+ desc = "A quiver for holding arrows."
+ icon_state = "quiver"
+ item_state = "quiver"
+ storage_slots = 20
+ can_hold = list(
+ /obj/item/ammo_casing/caseless/arrow
+ )
+
+/obj/item/weapon/storage/backpack/quiver/full/New()
+ ..()
+ for(var/i in 1 to storage_slots)
+ new /obj/item/ammo_casing/caseless/arrow(src)
diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm
index 462341fdc36..e8dd43d1501 100644
--- a/code/modules/projectiles/guns/projectile/launchers.dm
+++ b/code/modules/projectiles/guns/projectile/launchers.dm
@@ -8,7 +8,7 @@
item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher
fire_sound = 'sound/weapons/grenadelaunch.ogg'
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/attackby(var/obj/item/A, mob/user, params)
..()
@@ -57,7 +57,7 @@
desc = "A weapon favored by carp hunters. Fires specialized spears using kinetic energy."
icon_state = "speargun"
item_state = "speargun"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 10
can_suppress = 0
mag_type = /obj/item/ammo_box/magazine/internal/speargun
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index d1d65dcbfc0..4db9d3175d7 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -2,7 +2,7 @@
name = "stechkin pistol"
desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
icon_state = "pistol"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=2;materials=2;syndicate=2"
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = 1
@@ -22,7 +22,7 @@
name = "\improper M1911"
desc = "A classic .45 handgun with a small magazine capacity."
icon_state = "m1911"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/m45
can_suppress = 0
@@ -40,6 +40,14 @@
mag_type = /obj/item/ammo_box/magazine/m50
can_suppress = 0
+/obj/item/weapon/gun/projectile/automatic/pistol/enforcer45
+ name = "Enforcer .45"
+ desc = "A pistol of modern design."
+ icon_state = "enforcer"
+ force = 10
+ mag_type = /obj/item/ammo_box/magazine/m45/enforcer45
+ can_suppress = 0
+
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/update_icon()
..()
icon_state = "[initial(icon_state)][magazine ? "" : "-e"]"
@@ -58,7 +66,7 @@
name = "stechkin APS pistol"
desc = "The original russian version of a widely used Syndicate sidearm. Uses 9mm ammo."
icon_state = "aps"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "combat=3;materials=2;syndicate=3"
mag_type = /obj/item/ammo_box/magazine/pistolm9mm
can_suppress = 0
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 884b97c8ffb..2efc6cda7e0 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -121,7 +121,7 @@
afterattack(user, user) //you know the drill
user.visible_message("[src] goes off! ", "[src] goes off in your face! ")
return
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * A.toolspeed, target = src))
if(magazine.ammo_count())
to_chat(user, "You can't modify it! ")
return
@@ -134,7 +134,7 @@
afterattack(user, user) //and again
user.visible_message("[src] goes off! ", "[src] goes off in your face! ")
return
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * A.toolspeed, target = src))
if(magazine.ammo_count())
to_chat(user, "You can't modify it! ")
return
@@ -270,7 +270,7 @@
desc = "A true classic."
icon_state = "dshotgun"
item_state = "shotgun"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
@@ -325,7 +325,7 @@
desc = "Essentially a tube that aims shotgun shells."
icon_state = "ishotgun"
item_state = "shotgun"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 10
slot_flags = null
origin_tech = "combat=2;materials=2"
@@ -373,7 +373,7 @@
icon_state = "cane"
item_state = "stick"
sawn_state = SAWN_OFF
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
force = 10
can_unsuppress = 0
slot_flags = null
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index d36ad1dd2c6..3c80b241613 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -1,9 +1,9 @@
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "\improper L6 SAW"
- desc = "A heavily modified 5.56 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation."
+ desc = "A heavily modified 5.56 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
icon_state = "l6closed100"
item_state = "l6closedmag"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
mag_type = /obj/item/ammo_box/magazine/mm556x45
@@ -87,7 +87,7 @@ obj/item/projectile/bullet/saw/incen/Move()
..()
var/turf/location = get_turf(src)
if(location)
- PoolOrNew(/obj/effect/hotspot, location)
+ new /obj/effect/hotspot(location)
location.hotspot_expose(700, 50, 1)
/obj/item/projectile/bullet/saw/incen/on_hit(atom/target, blocked = 0)
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 35cde243c20..970f874c334 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -3,7 +3,7 @@
desc = "A traditional shotgun with wood furniture and a four-shell capacity underneath."
icon_state = "shotgun"
item_state = "shotgun"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
@@ -173,7 +173,7 @@
icon_state = "cshotgun"
origin_tech = "combat=5;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
//Dual Feed Shotgun
@@ -183,7 +183,7 @@
icon_state = "cycler"
origin_tech = "combat=4;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/shot/tube
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
var/toggled = 0
var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm
index cf7c2a4bb35..5d4078e666d 100644
--- a/code/modules/projectiles/guns/projectile/sniper.dm
+++ b/code/modules/projectiles/guns/projectile/sniper.dm
@@ -11,7 +11,7 @@
origin_tech = "combat=8"
can_unsuppress = 1
can_suppress = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
zoomable = TRUE
zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you.
slot_flags = SLOT_BACK
@@ -53,6 +53,7 @@
damage = 70
stun = 5
weaken = 5
+ dismemberment = 50
armour_penetration = 50
var/breakthings = TRUE
@@ -82,6 +83,7 @@
armour_penetration = 0
nodamage = 1
stun = 0
+ dismemberment = 0
weaken = 0
breakthings = FALSE
@@ -113,6 +115,7 @@
armour_penetration = 15
damage = 15
stun = 0
+ dismemberment = 0
weaken = 0
breakthings = FALSE
@@ -142,5 +145,6 @@
damage = 60
forcedodge = 1
stun = 0
+ dismemberment = 0
weaken = 0
breakthings = FALSE
diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm
index 809647e4186..8a191f06b97 100644
--- a/code/modules/projectiles/guns/projectile/toy.dm
+++ b/code/modules/projectiles/guns/projectile/toy.dm
@@ -20,7 +20,7 @@
name = "foam force pistol"
desc = "A small, easily concealable toy handgun. Ages 8 and up."
icon_state = "pistol"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/toy/pistol
fire_sound = 'sound/weapons/Gunshot.ogg'
can_suppress = 0
@@ -65,7 +65,7 @@
mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow
fire_sound = 'sound/items/syringeproj.ogg'
slot_flags = SLOT_BELT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/gun/projectile/automatic/c20r/toy
name = "donksoft SMG"
@@ -96,4 +96,4 @@
icon_state = "tommygun"
item_state = "shotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/tommygun
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm
index 345d183318f..0bb44409acd 100644
--- a/code/modules/projectiles/guns/rocket.dm
+++ b/code/modules/projectiles/guns/rocket.dm
@@ -4,7 +4,7 @@
desc = "Say hello to my little friend"
icon_state = "rocket"
item_state = "rocket"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
throw_speed = 2
throw_range = 10
force = 5.0
@@ -20,10 +20,8 @@
to_chat(user, "[rockets.len] / [max_rockets] rockets. ")
/obj/item/weapon/gun/rocketlauncher/Destroy()
- for(var/datum/D in rockets)
- qdel(D)
+ QDEL_LIST(rockets)
rockets = null
-
return ..()
/obj/item/weapon/gun/rocketlauncher/update_icon()
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 332d279376b..e9d79fe42c4 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -3,7 +3,7 @@
desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
icon_state = "syringegun"
item_state = "syringegun"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 7
force = 4
@@ -88,7 +88,7 @@
desc = "A small spring-loaded sidearm that functions identically to a syringe gun."
icon_state = "syringe_pistol"
item_state = "gun" //Smaller inhand
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=2;syndicate=2"
force = 2 //Also very weak because it's smaller
suppressed = 1 //Softer fire sound
diff --git a/code/modules/projectiles/guns/throw.dm b/code/modules/projectiles/guns/throw.dm
index d1bcda59067..0ea753f4cfa 100644
--- a/code/modules/projectiles/guns/throw.dm
+++ b/code/modules/projectiles/guns/throw.dm
@@ -16,10 +16,10 @@
return
/obj/item/weapon/gun/throw/proc/get_throwrange()
- return projectile_speed
+ return projectile_range
/obj/item/weapon/gun/throw/proc/get_throwspeed()
- return projectile_range
+ return projectile_speed
/obj/item/weapon/gun/throw/proc/modify_projectile(obj/item/I, on_chamber = 0)
return
@@ -36,12 +36,9 @@
notify_ammo_count(user)
/obj/item/weapon/gun/throw/Destroy()
- qdel(to_launch)
- to_launch = null
- for(var/atom/A in loaded_projectiles)
- qdel(A)
+ QDEL_NULL(to_launch)
+ QDEL_LIST(loaded_projectiles)
loaded_projectiles = null
-
return ..()
/obj/item/weapon/gun/throw/update_icon()
@@ -83,7 +80,7 @@
to_launch = null
modify_projectile(I)
playsound(user, fire_sound, 50, 1)
- I.throw_at(target, get_throwrange(), get_throwspeed(), user, 1)
+ I.throw_at(target, get_throwrange(), get_throwspeed(), user, FALSE)
message_admins("[key_name_admin(user)] fired \a [I] from a [src].")
log_game("[key_name_admin(user)] used \a [src].")
process_chamber()
diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm
index 11d39bf2a38..77d3e89eade 100644
--- a/code/modules/projectiles/guns/throw/crossbow.dm
+++ b/code/modules/projectiles/guns/throw/crossbow.dm
@@ -153,7 +153,7 @@
icon_state = "bolt"
item_state = "bolt"
throwforce = 20
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
sharp = 1
edge = 0
diff --git a/code/modules/projectiles/guns/throw/pielauncher.dm b/code/modules/projectiles/guns/throw/pielauncher.dm
index f6405f47194..3af48788134 100644
--- a/code/modules/projectiles/guns/throw/pielauncher.dm
+++ b/code/modules/projectiles/guns/throw/pielauncher.dm
@@ -2,7 +2,7 @@
name = "pie cannon"
desc = "A projectile weapon that fires pies."
icon_state = "piecannon"
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
throw_speed = 2
throw_range = 3
force = 5
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 7d6f629aa4c..4a3afd18684 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -50,8 +50,9 @@
var/jitter = 0
var/embed = 0 // whether or not the projectile can embed itself in the mob
var/forcedodge = 0 //to pass through everything
+ var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all.
- var/log = 1 //whether print to admin attack logs or just keep it in the diary
+ var/log_override = FALSE //whether print to admin attack logs or just keep it in the diary
/obj/item/projectile/New()
permutated = list()
@@ -89,7 +90,8 @@
for(var/datum/reagent/R in reagents.reagent_list)
reagent_note += R.id + " ("
reagent_note += num2text(R.volume) + ") "
- add_logs(firer, L, "shot", src, reagent_note, print_attack_log = log)
+ if(!log_override && firer && original)
+ add_logs(firer, L, "shot", src, reagent_note)
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
/obj/item/projectile/proc/vol_by_damage()
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 872ee7c3f26..6cddc1c1b91 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -20,7 +20,7 @@
name = "practice laser"
damage = 0
nodamage = 1
- log = 0
+ log_override = TRUE
/obj/item/projectile/beam/scatter
name = "laser pellet"
@@ -75,7 +75,7 @@
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
- log = 0
+ log_override = TRUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
. = ..()
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 9c3475d2141..7434038eb91 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -42,6 +42,7 @@
damage = 5
weaken = 3
stamina = 60
+ icon_state = "bullet-r"
/obj/item/projectile/bullet/weakbullet2/rubber //detective's bullets that don't embed
embed = 0
@@ -50,6 +51,13 @@
/obj/item/projectile/bullet/weakbullet3
damage = 20
+/obj/item/projectile/bullet/weakbullet4
+ name = "rubber bullet"
+ damage = 5
+ stamina = 30
+ icon_state = "bullet-r"
+ embed = 0
+ sharp = 0
/obj/item/projectile/bullet/toxinbullet
damage = 15
@@ -73,13 +81,14 @@
/obj/item/projectile/bullet/pellet
name = "pellet"
- damage = 15
+ damage = 12.5
/obj/item/projectile/bullet/pellet/weak
damage = 6
/obj/item/projectile/bullet/pellet/weak/New()
- range = rand(8)
+ range = rand(1, 8)
+ ..()
/obj/item/projectile/bullet/pellet/weak/on_range()
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
@@ -91,7 +100,8 @@
damage = 3
/obj/item/projectile/bullet/pellet/overload/New()
- range = rand(10)
+ range = rand(1, 10)
+ ..()
/obj/item/projectile/bullet/pellet/overload/on_hit(atom/target, blocked = 0)
..()
@@ -135,6 +145,9 @@
name = "rubber pellet"
damage = 3
stamina = 25
+ embed = 0
+ sharp = 0
+ icon_state = "bullet-r"
/obj/item/projectile/bullet/stunshot//taser slugs for shotguns, nothing special
name = "stunshot"
@@ -190,14 +203,17 @@
stun = 4
/obj/item/projectile/bullet/honker
+ name = "banana"
damage = 0
weaken = 5
stun = 5
forcedodge = 1
nodamage = 1
+ embed = 0
+ sharp = 0
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
hitsound = 'sound/items/bikehorn.ogg'
- icon = 'icons/obj/harvest.dmi'
+ icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "banana"
range = 200
@@ -234,8 +250,8 @@
/obj/item/projectile/bullet/dart/New()
..()
- flags |= NOREACT
create_reagents(50)
+ reagents.set_reacting(FALSE)
/obj/item/projectile/bullet/dart/on_hit(var/atom/target, var/blocked = 0, var/hit_zone)
if(iscarbon(target))
@@ -251,7 +267,7 @@
target.visible_message("The [name] was deflected! ", \
"You were protected against the [name]! ")
..(target, blocked, hit_zone)
- flags &= ~NOREACT
+ reagents.set_reacting(TRUE)
reagents.handle_reactions()
return 1
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 95447e2441f..6d4976e1d53 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -17,6 +17,12 @@
damage = 10
damage_type = BRUTE
nodamage = 0
+
+ //explosion values
+ var/exp_heavy = 0
+ var/exp_light = 2
+ var/exp_flash = 3
+ var/exp_fire = 2
/obj/item/projectile/magic/death/on_hit(var/mob/living/carbon/G)
. = ..()
@@ -27,11 +33,16 @@
/obj/item/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
var/turf/T2 = get_step(src,turn(dir, 45))
+ var/turf/T3 = get_step(src,dir)
var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
if(L && L.stat != DEAD)
Bump(L) //Magic Bullet #teachthecontroversy
return
L = locate(/mob/living) in T2
+ if(L && L.stat != DEAD)
+ Bump(L)
+ return
+ L = locate(/mob/living) in T3
if(L && L.stat != DEAD)
Bump(L)
return
@@ -44,6 +55,14 @@
if(ismob(target)) //multiple flavors of pain
var/mob/living/M = target
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
+
+
+/obj/item/projectile/magic/fireball/infernal
+ name = "infernal fireball"
+ exp_heavy = -1
+ exp_light = -1
+ exp_flash = 4
+ exp_fire= 5
/obj/item/projectile/magic/resurrection
name = "bolt of resurrection"
@@ -143,7 +162,7 @@ proc/wabbajack(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
// Make sure there are no organs or limbs to drop
- for(var/t in H.organs)
+ for(var/t in H.bodyparts)
qdel(t)
for(var/i in H.internal_organs)
qdel(i)
@@ -221,7 +240,7 @@ proc/wabbajack(mob/living/M)
else
return
- M.attack_log += text("\[[time_stamp()]\] [M.real_name] ([M.ckey]) became [new_mob.real_name]. ")
+ M.create_attack_log("[M.real_name] ([M.ckey]) became [new_mob.real_name]. ")
new_mob.attack_log = M.attack_log
new_mob.a_intent = I_HARM
@@ -266,3 +285,12 @@ proc/wabbajack(mob/living/M)
// Change our allegiance!
var/mob/living/simple_animal/hostile/mimic/copy/C = change
C.ChangeOwner(firer)
+
+/obj/item/projectile/magic/spellblade
+ name = "blade energy"
+ icon_state = "lavastaff"
+ damage = 15
+ damage_type = BURN
+ flag = "magic"
+ dismemberment = 50
+ nodamage = 0
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
index 17aaad71a2a..a223f415165 100644
--- a/code/modules/projectiles/projectile/reusable.dm
+++ b/code/modules/projectiles/projectile/reusable.dm
@@ -37,7 +37,7 @@
var/obj/item/weapon/pen/pen = null
edge = 0
embed = 0
- log = 0//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
+ log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
if(dropped)
@@ -57,7 +57,7 @@
newdart.update_icon()
/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
- pen = null
+ QDEL_NULL(pen)
return ..()
/obj/item/projectile/bullet/reusable/foam_dart/riot
@@ -65,4 +65,4 @@
icon_state = "foamdart_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
- log = 1
+ log_override = FALSE
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index ab65418b6f1..83a4ec0650c 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -201,62 +201,6 @@
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
-/obj/item/projectile/kinetic
- name = "kinetic force"
- icon_state = null
- damage = 10
- damage_type = BRUTE
- flag = "bomb"
- range = 3
- var/splash = 0
-
-/obj/item/projectile/kinetic/super
- damage = 11
- range = 4
-
-/obj/item/projectile/kinetic/hyper
- damage = 12
- range = 5
- splash = 1
-
-obj/item/projectile/kinetic/New()
- var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 50)
- name = "full strength kinetic force"
- damage *= 4
- ..()
-
-/obj/item/projectile/kinetic/on_range()
- new /obj/effect/kinetic_blast(loc)
- ..()
-
-/obj/item/projectile/kinetic/on_hit(atom/target)
- . = ..()
- var/turf/target_turf= get_turf(target)
- if(istype(target_turf, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = target_turf
- M.gets_drilled(firer)
- new /obj/effect/kinetic_blast(target_turf)
- if(splash)
- for(var/turf/T in range(splash, target_turf))
- if(istype(T, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = T
- M.gets_drilled(firer)
-
-/obj/effect/kinetic_blast
- name = "kinetic explosion"
- icon = 'icons/obj/projectiles.dmi'
- icon_state = "kinetic_blast"
- layer = 4.1
-
-/obj/effect/kinetic_blast/New()
- spawn(4)
- qdel(src)
-
/obj/item/projectile/beam/wormhole
name = "bluespace beam"
icon_state = "spark"
@@ -299,6 +243,7 @@ obj/item/projectile/kinetic/New()
damage_type = BRUTE
damage = 5
range = 3
+ dismemberment = 20
/obj/item/projectile/plasma/New()
var/turf/proj_turf = get_turf(src)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 9c0c14014e4..c65c628353b 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -13,10 +13,12 @@ var/const/INGEST = 2
var/atom/my_atom = null
var/chem_temp = 300
var/list/datum/reagent/addiction_list = new/list()
+ var/flags
-/datum/reagents/New(maximum=100)
+/datum/reagents/New(maximum = 100)
maximum_volume = maximum
-
+ if(!(flags & REAGENT_NOREACT))
+ processing_objects |= src
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -288,11 +290,24 @@ var/const/INGEST = 2
od_chems.Add(R.id)
return od_chems
+/datum/reagents/proc/process()
+ if(flags & REAGENT_NOREACT)
+ processing_objects -= src
+ return
-/datum/reagents/proc/reagent_on_tick()
for(var/datum/reagent/R in reagent_list)
R.on_tick()
- return
+
+/datum/reagents/proc/set_reacting(react = TRUE)
+ if(react)
+ // Order is important, process() can remove from processing if
+ // the flag is present
+ flags &= ~(REAGENT_NOREACT)
+ processing_objects |= src
+ else
+ processing_objects -= src
+ flags |= REAGENT_NOREACT
+
/*
if(!target) return
var/total_transfered = 0
@@ -337,7 +352,7 @@ var/const/INGEST = 2
update_total()
/datum/reagents/proc/handle_reactions()
- if(my_atom.flags & NOREACT)
+ if(flags & REAGENT_NOREACT)
return //Yup, no reactions here. No siree.
var/reaction_occured = 0
@@ -711,6 +726,16 @@ atom/proc/create_reagents(max_vol)
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src
+/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents
+ var/static/list/random_reagents = list()
+ if(!random_reagents.len)
+ for(var/thing in subtypesof(/datum/reagent))
+ var/datum/reagent/R = thing
+ if(initial(R.can_synth))
+ random_reagents += initial(R.id)
+ var/picked_reagent = pick(random_reagents)
+ return picked_reagent
+
/datum/reagents/proc/get_reagent_from_id(id)
var/datum/reagent/result = null
for(var/datum/reagent/R in reagent_list)
@@ -721,10 +746,8 @@ atom/proc/create_reagents(max_vol)
/datum/reagents/Destroy()
. = ..()
- processing_objects.Remove(src)
- for(var/datum/reagent/R in reagent_list)
- qdel(R)
- reagent_list.Cut()
+ processing_objects -= src
+ QDEL_LIST(reagent_list)
reagent_list = null
if(my_atom && my_atom.reagents == src)
my_atom.reagents = null
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 9a3ecffedb6..3904e923886 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -358,7 +358,7 @@
return
if(istype(I, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, I.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, "[src] can now be moved. ")
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 569bdb3f4e1..86ec72e238b 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -96,7 +96,7 @@
if(!(printing))
printing = 1
visible_message("[src] rattles and prints out a sheet of paper. ")
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
P.info = "Chemical Analysis "
P.info += "Time of analysis: [worldtime2text(world.time)] "
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 38cfdf4b0ae..2714b8d1b16 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -3,62 +3,86 @@
icon = 'icons/obj/kitchen.dmi'
icon_state = "juicer1"
layer = 2.9
- density = 1
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- var/inuse = 0
+ pass_flags = PASSTABLE
+ var/operating = 0
var/obj/item/weapon/reagent_containers/beaker = null
var/limit = 10
//IMPORTANT NOTE! A negative number is a multiplier, a positive number is a flat amount to add. 0 means equal to the amount of the original reagent
var/list/blend_items = list (
- //Sheets
- /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20),
- /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20),
- /obj/item/stack/sheet/mineral/bananium = list("banana" = 20),
- /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20),
- /obj/item/stack/sheet/mineral/silver = list("silver" = 20),
- /obj/item/stack/sheet/mineral/gold = list("gold" = 20),
- /obj/item/weapon/grown/novaflower = list("capsaicin" = 0),
+ //Sheets
+ /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20),
+ /obj/item/stack/sheet/metal = list("iron" = 20),
+ /obj/item/stack/rods = list("iron" = 10),
+ /obj/item/stack/sheet/plasteel = list("iron" = 20, "plasma_dust" = 20),
+ /obj/item/stack/sheet/wood = list("carbon" = 20),
+ /obj/item/stack/sheet/glass = list("silicon" = 20),
+ /obj/item/stack/sheet/rglass = list("silicon" = 20, "iron" = 20),
+ /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20),
+ /obj/item/stack/sheet/mineral/bananium = list("banana" = 20),
+ /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20),
+ /obj/item/stack/sheet/mineral/silver = list("silver" = 20),
+ /obj/item/stack/sheet/mineral/gold = list("gold" = 20),
+ /obj/item/weapon/grown/nettle/basic = list("sacid" = 0),
+ /obj/item/weapon/grown/nettle/death = list("facid" = 0, "sacid" = 0),
+ /obj/item/weapon/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0),
- //archaeology!
- ///obj/item/weapon/rocksliver = list("ground_rock" = 50),
+ //Blender Stuff
+ /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/egg = list("egg" = -5),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5),
+
+ //Grinder stuff, but only if dry
+ /obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/coffee = list("coffeepowder" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra = list("teapowder" = 0, "salglu_solution" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tea = list("teapowder" = 0),
- //All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
- /obj/item/weapon/reagent_containers/food = list(),
- /obj/item/weapon/reagent_containers/honeycomb = list()
- )
-
- var/list/blend_tags = list (
- "nettle" = list("sacid" = 0),
- "deathnettle" = list("facid" = 0),
- "soybeans" = list("soymilk" = 0),
- "tomato" = list("ketchup" = 0),
- "wheat" = list("flour" = -5),
- "rice" = list("rice" = -5),
- "cherries" = list("cherryjelly" = 0),
+ //All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
+ /obj/item/slime_extract = list(),
+ /obj/item/weapon/reagent_containers/food = list(),
+ /obj/item/weapon/reagent_containers/honeycomb = list()
)
var/list/juice_items = list (
- /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
+
+ //Juicer Stuff
+ /obj/item/weapon/reagent_containers/food/snacks/grown/corn = list("corn_starch" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = list("tomatojuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = list("carrotjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries = list("berryjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = list("banana" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/potato = list("potato" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = list("lemonjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = list("orangejuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = list("limejuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = list("watermelonjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = list("poisonberryjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = list("pumpkinjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = list("blumpkinjuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/apple = list("applejuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = list("grapejuice" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green = list("grapejuice" = 0),
)
- var/list/juice_tags = list (
- "tomato" = list("tomatojuice" = 0),
- "carrot" = list("carrotjuice" = 0),
- "berries" = list("berryjuice" = 0),
- "banana" = list("banana" = 0),
- "potato" = list("potato" = 0),
- "lemon" = list("lemonjuice" = 0),
- "orange" = list("orangejuice" = 0),
- "lime" = list("limejuice" = 0),
- "poisonberries" = list("poisonberryjuice" = 0),
- "grapes" = list("grapejuice" = 0),
- "corn" = list("cornoil" = 0),
+ var/list/dried_items = list(
+ //Grinder stuff, but only if dry,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/coffee = list("coffeepowder" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra = list("teapowder" = 0, "salglu_solution" = 0),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/tea = list("teapowder" = 0)
)
var/list/holdingitems = list()
@@ -68,348 +92,357 @@
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
return
+/obj/machinery/reagentgrinder/Destroy()
+ QDEL_NULL(beaker)
+ return ..()
+
+/obj/machinery/reagentgrinder/ex_act(severity)
+ if(beaker)
+ beaker.ex_act(severity)
+ ..()
+
/obj/machinery/reagentgrinder/update_icon()
- icon_state = "juicer"+num2text(!isnull(beaker))
- return
+ if(beaker)
+ icon_state = "juicer1"
+ else
+ icon_state = "juicer0"
-/obj/machinery/reagentgrinder/attackby(obj/item/O, mob/user, params)
-
- if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
- istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
- istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
-
- if(beaker)
- return 1
- else
- if(!user.drop_item())
- to_chat(user, "[O] is stuck to you! ")
+/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
+ if(default_unfasten_wrench(user, I))
return
- beaker = O
- O.forceMove(src)
- update_icon()
- updateUsrDialog()
- return 0
- if(holdingitems && holdingitems.len >= limit)
- to_chat(usr, "The machine cannot hold anymore items. ")
- return 1
+ if (istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER) )
+ if (!beaker)
+ if(!user.drop_item())
+ return 1
+ beaker = I
+ beaker.loc = src
+ update_icon()
+ src.updateUsrDialog()
+ else
+ to_chat(user, "There's already a container inside. ")
+ return 1 //no afterattack
- //Fill machine with a plantbag!
- if(istype(O, /obj/item/weapon/storage/bag/plants))
- var/obj/item/weapon/storage/bag/plants/PB = O
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
- PB.remove_from_storage(G, src)
- holdingitems += G
- if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill
- to_chat(user, "You must dry that first! ")
+ return 1
- if(!PB.contents.len)
- to_chat(user, "You empty [PB] into the All-In-One grinder. ")
+ if(holdingitems && holdingitems.len >= limit)
+ to_chat(usr, "The machine cannot hold anymore items.")
+ return 1
- updateUsrDialog()
- return 0
+ //Fill machine with a bag!
+ if(istype(I, /obj/item/weapon/storage/bag))
+ var/obj/item/weapon/storage/bag/B = I
+ for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in B.contents)
+ B.remove_from_storage(G, src)
+ holdingitems += G
+ if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill
+ to_chat(user, "You fill the All-In-One grinder to the brim. ")
+ break
+ if(!I.contents.len)
+ to_chat(user, "You empty the plant bag into the All-In-One grinder. ")
- if(!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
- to_chat(user, "Cannot refine into a reagent. ")
- return 1
+ src.updateUsrDialog()
+ return 1
- user.unEquip(O)
- O.forceMove(src)
- holdingitems += O
- updateUsrDialog()
- return 0
+ if (!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items))
+ if(user.a_intent == I_HARM)
+ return ..()
+ else
+ to_chat(user, "Cannot refine into a reagent! ")
+ return 1
+
+ if(user.drop_item())
+ I.loc = src
+ holdingitems += I
+ src.updateUsrDialog()
+ return 0
/obj/machinery/reagentgrinder/attack_ai(mob/user)
- return 0
+ return 0
/obj/machinery/reagentgrinder/attack_hand(mob/user)
- user.set_machine(src)
- interact(user)
+ user.set_machine(src)
+ interact(user)
/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu
- var/is_chamber_empty = 0
- var/is_beaker_ready = 0
- var/processing_chamber = ""
- var/beaker_contents = ""
- var/dat = ""
+ var/is_chamber_empty = 0
+ var/is_beaker_ready = 0
+ var/processing_chamber = ""
+ var/beaker_contents = ""
+ var/dat = ""
- if(!inuse)
- for(var/obj/item/O in holdingitems)
- processing_chamber += "\A [O.name] "
+ if(!operating)
+ for (var/obj/item/O in holdingitems)
+ processing_chamber += "\A [O.name] "
- if(!processing_chamber)
- is_chamber_empty = 1
- processing_chamber = "Nothing."
- if(!beaker)
- beaker_contents = "No beaker attached. "
+ if (!processing_chamber)
+ is_chamber_empty = 1
+ processing_chamber = "Nothing."
+ if (!beaker)
+ beaker_contents = "No beaker attached. "
+ else
+ is_beaker_ready = 1
+ beaker_contents = "The beaker contains: "
+ var/anything = 0
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ anything = 1
+ beaker_contents += "[R.volume] - [R.name] "
+ if(!anything)
+ beaker_contents += "Nothing "
+
+
+ dat = {"
+ Processing chamber contains:
+ [processing_chamber]
+ [beaker_contents]
+ "}
+ if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
+ dat += "Grind the reagents "
+ dat += "Juice the reagents "
+ if(holdingitems && holdingitems.len > 0)
+ dat += "Eject the reagents "
+ if (beaker)
+ dat += "Detach the beaker "
else
- is_beaker_ready = 1
- beaker_contents = "The beaker contains: "
- var/anything = 0
- for(var/datum/reagent/R in beaker.reagents.reagent_list)
- anything = 1
- beaker_contents += "[R.volume] - [R.name] "
- if(!anything)
- beaker_contents += "Nothing "
+ dat += "Please wait..."
-
- dat = {"
- Processing chamber contains:
- [processing_chamber]
- [beaker_contents]
- "}
- if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
- dat += "Grind the reagents "
- dat += "Juice the reagents "
- if(holdingitems && holdingitems.len > 0)
- dat += "Eject the reagents "
- if(beaker)
- dat += "Detach the beaker "
- else
- dat += "Please wait..."
- user << browse("All-In-One Grinder [dat] ", "window=reagentgrinder")
- onclose(user, "reagentgrinder")
- return
+ var/datum/browser/popup = new(user, "reagentgrinder", "All-In-One Grinder")
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open(1)
+ return
/obj/machinery/reagentgrinder/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
+ if(operating)
+ updateUsrDialog()
+ return
switch(href_list["action"])
- if("grind")
+ if ("grind")
grind()
if("juice")
juice()
if("eject")
eject()
- if("detach")
+ if ("detach")
detach()
- updateUsrDialog()
- return
/obj/machinery/reagentgrinder/proc/detach()
- if(usr.stat != 0)
- return
- if(!beaker)
- return
- beaker.forceMove(loc)
- beaker = null
- update_icon()
+ if (usr.stat != 0)
+ return
+ if (!beaker)
+ return
+ beaker.loc = src.loc
+ beaker = null
+ update_icon()
+ updateUsrDialog()
/obj/machinery/reagentgrinder/proc/eject()
- if(usr.stat != 0)
- return
- if(holdingitems && holdingitems.len == 0)
- return
+ if (usr.stat != 0)
+ return
+ if (holdingitems && holdingitems.len == 0)
+ return
- for(var/obj/item/O in holdingitems)
- O.forceMove(loc)
- holdingitems -= O
- holdingitems = list()
+ for(var/obj/item/O in holdingitems)
+ O.loc = src.loc
+ holdingitems -= O
+ holdingitems = list()
+ updateUsrDialog()
/obj/machinery/reagentgrinder/proc/is_allowed(obj/item/weapon/reagent_containers/O)
- for(var/i in blend_items)
- if(istype(O, i))
- return 1
- return 0
+ for (var/i in blend_items)
+ if(istype(O, i))
+ return 1
+ return 0
-/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/weapon/grown/O)
- for(var/i in blend_items)
- if(istype(O, i))
- return blend_items[i]
+/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/O)
+ for (var/i in blend_items)
+ if (istype(O, i))
+ return blend_items[i]
/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
- for(var/i in blend_items)
- if(istype(O, i))
- return blend_items[i]
+ for(var/i in blend_items)
+ if(istype(O, i))
+ return blend_items[i]
/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
- for(var/i in juice_items)
- if(istype(O, i))
- return juice_items[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
- for(var/i in blend_tags)
- if(O.seed.kitchen_tag == i)
- return blend_tags[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
- for(var/i in juice_tags)
- if(O.seed.kitchen_tag == i)
- return juice_tags[i]
+ for(var/i in juice_items)
+ if(istype(O, i))
+ return juice_items[i]
/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/weapon/grown/O)
- if(!istype(O))
- return 5
- else if(O.potency == -1)
- return 5
- else
- return round(O.potency)
+ if (!istype(O) || !O.seed)
+ return 5
+ else if (O.seed.potency == -1)
+ return 5
+ else
+ return round(O.seed.potency)
/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O)
- if(!istype(O))
- return 5
- else if(O.potency == -1)
- return 5
- else
- return round(5*sqrt(O.potency))
+ if (!istype(O) || !O.seed)
+ return 5
+ else if (O.seed.potency == -1)
+ return 5
+ else
+ return round(5*sqrt(O.seed.potency))
/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O)
- holdingitems -= O
- qdel(O)
+ holdingitems -= O
+ qdel(O)
/obj/machinery/reagentgrinder/proc/juice()
- power_change()
- if(stat & (NOPOWER|BROKEN))
- return
- if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
- return
- playsound(loc, 'sound/machines/juicer.ogg', 20, 1)
- var/offset = prob(50) ? -2 : 2
- animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- inuse = 1
- spawn(50)
- pixel_x = initial(pixel_x) //return to its spot after shaking
- inuse = 0
- interact(usr)
- //Snacks
- for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
+ power_change()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ return
+ playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
+ operating = 1
+ updateUsrDialog()
+ spawn(50)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ operating = 0
+ updateUsrDialog()
- var/allowed = null
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- allowed = get_allowed_juice_by_tag(O)
- else
- allowed = get_allowed_juice_by_id(O)
- if(isnull(allowed))
- break
+ //Snacks
+ for (var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
- for(var/r_id in allowed)
+ var/allowed = get_allowed_juice_by_id(O)
+ if(isnull(allowed))
+ break
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = get_juice_amount(O)
+ for (var/r_id in allowed)
- beaker.reagents.add_reagent(r_id, min(amount, space))
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = get_juice_amount(O)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
+ beaker.reagents.add_reagent(r_id, min(amount, space))
- remove_object(O)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+
+ remove_object(O)
/obj/machinery/reagentgrinder/proc/grind()
- power_change()
- if(stat & (NOPOWER|BROKEN))
- return
- if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
- return
- playsound(loc, 'sound/machines/blender.ogg', 50, 1)
- var/offset = prob(50) ? -2 : 2
- animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- inuse = 1
- spawn(60)
- pixel_x = initial(pixel_x) //return to its spot after shaking
- inuse = 0
- interact(usr)
- //Snacks and Plants
- for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
+ power_change()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ return
+ playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 250) //start shaking
+ operating = 1
+ updateUsrDialog()
+ spawn(60)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ operating = 0
+ updateUsrDialog()
- var/allowed = null
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- allowed = get_allowed_snack_by_tag(O)
- else
- allowed = get_allowed_snack_by_id(O)
- if(isnull(allowed))
- break
+ //Snacks and Plants
+ for (var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
- for(var/r_id in allowed)
+ var/allowed = get_allowed_snack_by_id(O)
+ if(isnull(allowed))
+ break
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- if(amount <= 0) //Negative amounts are multipliers for the reagent amount (Example: "amount = -5" means "reagent_amount * 5")
- if(amount == 0)
- if(O.reagents != null && O.reagents.has_reagent("nutriment"))
- beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
- O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
- if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
- beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space))
- O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
- else
- if(O.reagents != null && O.reagents.has_reagent("nutriment"))
- beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space))
- O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
- if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
- beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space))
- O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
+ for (var/r_id in allowed)
- else
- O.reagents.trans_id_to(beaker, r_id, min(amount, space))
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ if(amount <= 0)
+ if(amount == 0)
+ if (O.reagents != null && O.reagents.has_reagent("nutriment"))
+ beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
+ O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
+ if (O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space))
+ O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
+ else
+ if (O.reagents != null && O.reagents.has_reagent("nutriment"))
+ beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space))
+ O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
+ if (O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space))
+ O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- if(O.reagents.reagent_list.len == 0)
- remove_object(O)
+ else
+ O.reagents.trans_id_to(beaker, r_id, min(amount, space))
- //Sheets
- for(var/obj/item/stack/sheet/O in holdingitems)
- var/allowed = get_allowed_by_id(O)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- for(var/i = 1; i <= round(O.amount, 1); i++)
- for(var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- beaker.reagents.add_reagent(r_id,min(amount, space))
- if(space < amount)
- break
- if(i == round(O.amount, 1))
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+
+ if(O.reagents.reagent_list.len == 0)
+ remove_object(O)
+
+ //Sheets
+ for (var/obj/item/stack/sheet/O in holdingitems)
+ var/allowed = get_allowed_by_id(O)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ for(var/i = 1; i <= round(O.amount, 1); i++)
+ for (var/r_id in allowed)
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ beaker.reagents.add_reagent(r_id,min(amount, space))
+ if (space < amount)
+ break
+ if (i == round(O.amount, 1))
+ remove_object(O)
+ break
+ //Plants
+ for (var/obj/item/weapon/grown/O in holdingitems)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ var/allowed = get_allowed_by_id(O)
+ for (var/r_id in allowed)
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ var/amount = allowed[r_id]
+ if (amount == 0)
+ if (O.reagents != null && O.reagents.has_reagent(r_id))
+ beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space))
+ else
+ beaker.reagents.add_reagent(r_id,min(amount, space))
+
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
remove_object(O)
- break
- //Plants
- for(var/obj/item/weapon/grown/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/allowed = get_allowed_by_id(O)
- for(var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- if(amount == 0)
- if(O.reagents != null && O.reagents.has_reagent(r_id))
- beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space))
- else
- beaker.reagents.add_reagent(r_id,min(amount, space))
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- remove_object(O)
+ //Slime Extractis
+ for (var/obj/item/slime_extract/O in holdingitems)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ if (O.reagents != null)
+ var/amount = O.reagents.total_volume
+ O.reagents.trans_to(beaker, min(amount, space))
+ if (O.Uses > 0)
+ beaker.reagents.add_reagent("slimejelly",min(20, space))
+ remove_object(O)
- //xenoarch
- /*for(var/obj/item/weapon/rocksliver/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/allowed = get_allowed_by_id(O)
- for(var/r_id in allowed)
- var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
- var/amount = allowed[r_id]
- beaker.reagents.add_reagent(r_id,min(amount, space), O.geological_data)
-
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- remove_object(O)*/
-
- //Everything else - Transfers reagents from it into beaker
- for(var/obj/item/weapon/reagent_containers/O in holdingitems)
- if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
- break
- var/amount = O.reagents.total_volume
- O.reagents.trans_to(beaker, amount)
- if(!O.reagents.total_volume)
- remove_object(O)
\ No newline at end of file
+ //Everything else - Transfers reagents from it into beaker
+ for (var/obj/item/weapon/reagent_containers/O in holdingitems)
+ if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ break
+ var/amount = O.reagents.total_volume
+ O.reagents.trans_to(beaker, amount)
+ if(!O.reagents.total_volume)
+ remove_object(O)
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 1e043d88b7c..cdc214c3089 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -1,7 +1,3 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-
/datum/reagent
var/name = "Reagent"
var/id = "reagent"
@@ -30,7 +26,7 @@
var/last_addiction_dose = 0
var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
var/current_cycle = 1
- var/drink_icon = "glass_brown" // what icon state/name/description a drinking glass will use if this is the master reagent.
+ var/drink_icon = null
var/drink_name = "Glass of ..what?"
var/drink_desc = "You can't really tell what this is."
@@ -73,7 +69,7 @@
/datum/reagent/proc/on_mob_life(mob/living/M)
current_cycle++
- holder.remove_reagent(id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
+ holder.remove_reagent(id, metabolization_rate * M.metabolism_efficiency * M.digestion_ratio) //By default it slowly disappears.
/datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect
return
diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm
index a915ef8cd57..b94998221ef 100644
--- a/code/modules/reagents/chemistry/reagents/admin.dm
+++ b/code/modules/reagents/chemistry/reagents/admin.dm
@@ -21,7 +21,7 @@
for(var/name in H.internal_organs)
var/obj/item/organ/internal/I = H.get_int_organ(name)
I.damage = max(0, I.damage-5)
- for(var/obj/item/organ/external/E in H.organs)
+ for(var/obj/item/organ/external/E in H.bodyparts)
if(E.mend_fracture())
E.perma_injury = 0
M.SetEyeBlind(0)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm
index 627fbf3062c..9b651a21443 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol.dm
@@ -819,10 +819,11 @@
drink_desc = "A drink that is guaranteed to knock you silly."
/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/M)
- M.Weaken(3)
- if(current_cycle >=55)
+ if(current_cycle >= 13)
+ M.Weaken(3)
+ if(current_cycle >= 55)
M.Druggy(55)
- if(current_cycle >=200)
+ if(current_cycle >= 200)
M.adjustToxLoss(2)
..()
@@ -983,6 +984,27 @@
drink_name = "Jack Rose"
drink_desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s."
+/datum/reagent/consumable/ethanol/drunkenblumpkin
+ name = "Drunken Blumpkin"
+ id = "drunkenblumpkin"
+ description = "A weird mix of whiskey and blumpkin juice."
+ color = "#1EA0FF" // rgb: 102, 67, 0
+ alcohol_perc = 0.5
+ drink_icon = "drunkenblumpkin"
+ drink_name = "Drunken Blumpkin"
+ drink_desc = "A drink for the drunks"
+
+/datum/reagent/consumable/ethanol/eggnog
+ name = "Eggnog"
+ id = "eggnog"
+ description = "For enjoying the most wonderful time of the year."
+ color = "#fcfdc6" // rgb: 252, 253, 198
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ alcohol_perc = 0.1
+ drink_icon = "glass_yellow"
+ drink_name = "Eggnog"
+ drink_desc = "For enjoying the most wonderful time of the year."
+
/datum/reagent/consumable/ethanol/dragons_breath //inaccessible to players, but here for admin shennanigans
name = "Dragon's Breath"
id = "dragonsbreath"
diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm
index f9fbf930e3e..7db78883e90 100644
--- a/code/modules/reagents/chemistry/reagents/disease.dm
+++ b/code/modules/reagents/chemistry/reagents/disease.dm
@@ -141,11 +141,11 @@
can_synth = 0
/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
- if(volume >=5)
+ if(volume >= 5)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1 // rip in pepperoni
+ if(!H.undergoing_cardiac_arrest())
+ H.set_heartattack(TRUE) // rip in pepperoni
//virus foods
@@ -183,4 +183,4 @@
/datum/reagent/plasma_dust/plasmavirusfood/weak
name = "weakened virus plasma"
id = "weakplasmavirusfood"
- color = "#CEC3C6" // rgb: 206,195,198
\ No newline at end of file
+ color = "#CEC3C6" // rgb: 206,195,198
diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm
index cf60d77c2c1..7db9387c3ff 100644
--- a/code/modules/reagents/chemistry/reagents/drinks.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks.dm
@@ -111,6 +111,12 @@
M.adjustToxLoss(1)
..()
+/datum/reagent/consumable/applejuice
+ name = "Apple Juice"
+ id = "applejuice"
+ description = "The sweet juice of an apple, fit for all ages."
+ color = "#ECFF56" // rgb: 236, 255, 86
+
/datum/reagent/consumable/drink/watermelonjuice
name = "Watermelon Juice"
id = "watermelonjuice"
@@ -361,4 +367,82 @@
if(ishuman(M) && M.job in list("Mime"))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- ..()
\ No newline at end of file
+ ..()
+
+/datum/reagent/consumable/drink/chocolatepudding
+ name = "Chocolate Pudding"
+ id = "chocolatepudding"
+ description = "A great dessert for chocolate lovers."
+ color = "#800000"
+ nutriment_factor = 4 * REAGENTS_METABOLISM
+ drink_icon = "chocolatepudding"
+ drink_name = "Chocolate Pudding"
+ drink_desc = "Tasty"
+
+/datum/reagent/consumable/drink/vanillapudding
+ name = "Vanilla Pudding"
+ id = "vanillapudding"
+ description = "A great dessert for vanilla lovers."
+ color = "#FAFAD2"
+ nutriment_factor = 4 * REAGENTS_METABOLISM
+ drink_icon = "vanillapudding"
+ drink_name = "Vanilla Pudding"
+ drink_desc = "Tasty."
+
+/datum/reagent/consumable/drink/cherryshake
+ name = "Cherry Shake"
+ id = "cherryshake"
+ description = "A cherry flavored milkshake."
+ color = "#FFB6C1"
+ nutriment_factor = 4 * REAGENTS_METABOLISM
+ drink_icon = "cherryshake"
+ drink_name = "Cherry Shake"
+ drink_desc = "A cherry flavored milkshake."
+
+/datum/reagent/consumable/drink/bluecherryshake
+ name = "Blue Cherry Shake"
+ id = "bluecherryshake"
+ description = "An exotic milkshake."
+ color = "#00F1FF"
+ nutriment_factor = 4 * REAGENTS_METABOLISM
+ drink_icon = "bluecherryshake"
+ drink_name = "Blue Cherry Shake"
+ drink_desc = "An exotic blue milkshake."
+
+/datum/reagent/consumable/drink/pumpkin_latte
+ name = "Pumpkin Latte"
+ id = "pumpkin_latte"
+ description = "A mix of pumpkin juice and coffee."
+ color = "#F4A460"
+ nutriment_factor = 3 * REAGENTS_METABOLISM
+ drink_icon = "pumpkin_latte"
+ drink_name = "Pumpkin Latte"
+ drink_desc = "A mix of coffee and pumpkin juice."
+
+/datum/reagent/consumable/drink/gibbfloats
+ name = "Gibb Floats"
+ id = "gibbfloats"
+ description = "Ice cream on top of a Dr. Gibb glass."
+ color = "#B22222"
+ nutriment_factor = 3 * REAGENTS_METABOLISM
+ drink_icon= "gibbfloats"
+ drink_name = "Gibbfloat"
+ drink_desc = "Dr. Gibb with ice cream on top."
+
+/datum/reagent/consumable/drink/pumpkinjuice
+ name = "Pumpkin Juice"
+ id = "pumpkinjuice"
+ description = "Juiced from real pumpkin."
+ color = "#FFA500"
+
+/datum/reagent/consumable/drink/blumpkinjuice
+ name = "Blumpkin Juice"
+ id = "blumpkinjuice"
+ description = "Juiced from real blumpkin."
+ color = "#00BFFF"
+
+/datum/reagent/consumable/drink/grape_soda
+ name = "Grape soda"
+ id = "grapesoda"
+ description = "Beloved of children and teetotalers."
+ color = "#E6CDFF"
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index fa37e5544e7..a18f1c01c42 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -169,17 +169,17 @@
var/eyes_covered = 0
var/obj/item/safe_thing = null
if( victim.wear_mask )
- if( victim.wear_mask.flags & MASKCOVERSEYES )
+ if(victim.wear_mask.flags_cover & MASKCOVERSEYES)
eyes_covered = 1
safe_thing = victim.wear_mask
- if( victim.wear_mask.flags & MASKCOVERSMOUTH )
+ if(victim.wear_mask.flags_cover & MASKCOVERSMOUTH)
mouth_covered = 1
safe_thing = victim.wear_mask
if( victim.head )
- if( victim.head.flags & MASKCOVERSEYES )
+ if(victim.head.flags_cover & MASKCOVERSEYES)
eyes_covered = 1
safe_thing = victim.head
- if( victim.head.flags & MASKCOVERSMOUTH )
+ if(victim.head.flags_cover & MASKCOVERSMOUTH)
mouth_covered = 1
safe_thing = victim.head
if(victim.glasses)
@@ -282,6 +282,14 @@
nutriment_factor = 5 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
+/datum/reagent/consumable/vanilla
+ name = "Vanilla Powder"
+ id = "vanilla"
+ description = "A fatty, bitter paste made from vanilla pods."
+ reagent_state = SOLID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#FFFACD"
+
/datum/reagent/consumable/hot_coco
name = "Hot Chocolate"
id = "hot_coco"
@@ -393,6 +401,13 @@
reagent_state = LIQUID
color = "#801E28" // rgb: 128, 30, 40
+/datum/reagent/consumable/bluecherryjelly
+ name = "Blue Cherry Jelly"
+ id = "bluecherryjelly"
+ description = "Blue and tastier kind of cherry jelly."
+ reagent_state = LIQUID
+ color = "#00F0FF"
+
/datum/reagent/consumable/egg
name = "Egg"
id = "egg"
@@ -757,8 +772,8 @@
M.Weaken(1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1
+ if(!H.undergoing_cardiac_arrest())
+ H.set_heartattack(TRUE)
..()
/datum/reagent/fungus
@@ -831,4 +846,52 @@
/datum/reagent/greenvomit/reaction_turf(turf/T, volume)
if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/vomit/green(T)
- playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
\ No newline at end of file
+ playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
+
+////Lavaland Flora Reagents////
+
+/datum/reagent/consumable/entpoly
+ name = "Entropic Polypnium"
+ id = "entpoly"
+ description = "An ichor, derived from a certain mushroom, makes for a bad time."
+ color = "#1d043d"
+
+/datum/reagent/consumable/entpoly/on_mob_life(mob/living/M)
+ if(current_cycle >= 10)
+ M.Paralyse(2)
+ if(prob(20))
+ M.LoseBreath(4)
+ M.adjustBrainLoss(2 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustStaminaLoss(10 * REAGENTS_EFFECT_MULTIPLIER)
+ M.EyeBlurry(5)
+ ..()
+
+/datum/reagent/consumable/tinlux
+ name = "Tinea Luxor"
+ id = "tinlux"
+ description = "A stimulating ichor which causes luminescent fungi to grow on the skin. "
+ color = "#b5a213"
+ var/light_activated = 0
+
+/datum/reagent/consumable/tinlux/on_mob_life(mob/living/M)
+ if(!light_activated)
+ M.set_light(2)
+ light_activated = 1
+ ..()
+
+/datum/reagent/consumable/tinlux/on_mob_delete(mob/living/M)
+ M.set_light(0)
+
+/datum/reagent/consumable/vitfro
+ name = "Vitrium Froth"
+ id = "vitfro"
+ description = "A bubbly paste that heals wounds of the skin."
+ color = "#d3a308"
+ nutriment_factor = 3 * REAGENTS_METABOLISM
+
+/datum/reagent/consumable/vitfro/on_mob_life(mob/living/M)
+ if(prob(80))
+ M.adjustBruteLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index de539ef52ba..452f9f6d2ff 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -4,7 +4,7 @@
/datum/reagent/medicine/on_mob_life(mob/living/M)
current_cycle++
- holder.remove_reagent(id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism
+ holder.remove_reagent(id, (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio) //medicine reagents stay longer if you have a better metabolism
/datum/reagent/medicine/hydrocodone
name = "Hydrocodone"
@@ -91,8 +91,7 @@
var/mob/living/carbon/human/H = M
//Mitocholide is hard enough to get, it's probably fair to make this all internal organs
- for(var/name in H.internal_organs)
- var/obj/item/organ/internal/I = H.get_int_organ(name)
+ for(var/obj/item/organ/internal/I in H.internal_organs)
if(I.damage > 0)
I.damage = max(I.damage-0.4, 0)
..()
@@ -618,6 +617,9 @@
..()
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(volume < 1)
+ // gotta pay to play
+ return ..()
if(isanimal(M))
if(method == TOUCH)
var/mob/living/simple_animal/SM = M
@@ -629,21 +631,38 @@
if(iscarbon(M))
if(method == INGEST)
if(M.stat == DEAD)
- if(M.getBruteLoss()+M.getFireLoss() >= 150)
+ if(M.getBruteLoss()+M.getFireLoss()+M.getCloneLoss() >= 150)
M.visible_message("[M]'s body starts convulsing! ")
M.gib()
return
var/mob/dead/observer/ghost = M.get_ghost()
if(ghost)
- to_chat(ghost, "Your are attempting to be revived with Strange Reagent. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)")
+ to_chat(ghost, "You are attempting to be revived with Strange Reagent. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)")
+ window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
M.visible_message("[M] doesn't appear to respond, perhaps try again later? ")
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
+ var/time_dead = world.time - M.timeofdeath
M.visible_message("[M] seems to rise from the dead! ")
+ M.adjustCloneLoss(50)
M.setOxyLoss(0)
M.adjustBruteLoss(rand(0,15))
M.adjustToxLoss(rand(0,15))
M.adjustFireLoss(rand(0,15))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/necrosis_prob = 40 * min((20 MINUTES), max((time_dead - (1 MINUTES)), 0)) / ((20 MINUTES) - (1 MINUTES))
+ for(var/obj/item/organ/O in (H.bodyparts | H.internal_organs))
+ // Per non-vital body part:
+ // 0% chance of necrosis within 1 minute of death
+ // 40% chance of necrosis after 20 minutes of death
+ if(!O.vital && prob(necrosis_prob))
+ // side effects may include: Organ failure
+ O.necrotize(FALSE)
+ if(O.status & ORGAN_DEAD)
+ O.germ_level = INFECTION_LEVEL_THREE
+ H.update_body()
+
M.update_revive()
M.stat = UNCONSCIOUS
add_logs(M, M, "revived", object="strange reagent") //Yes, the logs say you revived yourself.
@@ -878,38 +897,10 @@
..()
/datum/reagent/medicine/omnizine_diluted/overdose_process(mob/living/M, severity)
- var/effect = ..()
- if(severity == 1) //lesser
- M.stuttering += 1
- if(effect <= 1)
- M.visible_message("[M] suddenly cluches their gut! ")
- M.emote("scream")
- M.Stun(4)
- M.Weaken(4)
- else if(effect <= 3)
- M.visible_message("[M] completely spaces out for a moment. ")
- M.AdjustConfused(15)
- else if(effect <= 5)
- M.visible_message("[M] stumbles and staggers. ")
- M.Dizzy(5)
- M.Weaken(3)
- else if(effect <= 7)
- M.visible_message("[M] shakes uncontrollably. ")
- M.Jitter(30)
- else if(severity == 2) // greater
- if(effect <= 2)
- M.visible_message("[M] suddenly cluches their gut! ")
- M.emote("scream")
- M.Stun(7)
- M.Weaken(7)
- else if(effect <= 5)
- M.visible_message("[M] jerks bolt upright, then collapses! ")
- M.Paralyse(5)
- M.Weaken(4)
- else if(effect <= 8)
- M.visible_message("[M] stumbles and staggers. ")
- M.Dizzy(5)
- M.Weaken(3)
+ M.adjustToxLoss(1.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustOxyLoss(1.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBruteLoss(1.5*REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(1.5*REAGENTS_EFFECT_MULTIPLIER)
//virus-specific symptom reagents
@@ -974,4 +965,69 @@
/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M)
M.adjustBrainLoss(-3)
- ..()
\ No newline at end of file
+ ..()
+
+
+
+//Trek-Chems. DO NOT USE THES OUTSIDE OF BOTANY OR FOR VERY SPECIFIC PURPOSES. NEVER GIVE A RECIPE UNDER ANY CIRCUMSTANCES//
+/datum/reagent/medicine/bicaridine
+ name = "Bicaridine"
+ id = "bicaridine"
+ description = "Restores bruising. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/M)
+ M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
+ M.adjustBruteLoss(4*REAGENTS_EFFECT_MULTIPLIER)
+
+/datum/reagent/medicine/kelotane
+ name = "Kelotane"
+ id = "kelotane"
+ description = "Restores fire damage. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/kelotane/on_mob_life(mob/living/M)
+ M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
+
+/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
+ M.adjustFireLoss(4*REAGENTS_EFFECT_MULTIPLIER)
+
+
+/datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants
+ name = "Earthsblood"
+ id = "earthsblood"
+ description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain."
+ color = "#FFAF00"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/M)
+ M.adjustBruteLoss(-3 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustFireLoss(-3 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustOxyLoss(-15 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustToxLoss(-3 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustBrainLoss(2 * REAGENTS_EFFECT_MULTIPLIER) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
+ M.adjustCloneLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
+ M.adjustStaminaLoss(-30 * REAGENTS_EFFECT_MULTIPLIER)
+ M.SetJitter(min(max(0, M.jitteriness + 3), 30))
+ M.SetDruggy(min(max(0, M.druggy + 10), 15)) //See above
+ ..()
+
+/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
+ M.SetHallucinate(min(max(0, M.hallucination + 10), 50))
+ M.adjustToxLoss(5 * REAGENTS_EFFECT_MULTIPLIER)
+
+/datum/reagent/medicine/corazone
+ name = "Corazone"
+ id = "corazone"
+ description = "A medication used to treat pain, fever, and inflammation, along with heart attacks."
+ color = "#F5F5F5"
+
+// This reagent's effects are handled in heart attack handling code
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index bb386d0215c..89233789903 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -39,7 +39,6 @@
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
-
/datum/reagent/nitrogen
name = "Nitrogen"
id = "nitrogen"
@@ -176,15 +175,6 @@
reagent_state = LIQUID
color = "#322D00"
-// Allows you to make planks from any plant that has this reagent in it.
-// Also vines with this reagent are considered dense.
-/datum/reagent/woodpulp
- name = "Wood Pulp"
- id = "woodpulp"
- description = "A mass of wood fibers."
- reagent_state = LIQUID
- color = "#B97A57"
-
/datum/reagent/oil
name = "Oil"
id = "oil"
@@ -415,6 +405,37 @@
M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."))
..()
+/datum/reagent/growthserum
+ name = "Growth serum"
+ id = "growthserum"
+ description = "A commercial chemical designed to help older men in the bedroom." //not really it just makes you a giant
+ color = "#ff0000"//strong red. rgb 255, 0, 0
+ var/current_size = 1
+
+/datum/reagent/growthserum/on_mob_life(mob/living/carbon/H)
+ var/newsize = current_size
+ switch(volume)
+ if(0 to 19)
+ newsize = 1.1
+ if(20 to 49)
+ newsize = 1.2
+ if(50 to 99)
+ newsize = 1.25
+ if(100 to 199)
+ newsize = 1.3
+ if(200 to INFINITY)
+ newsize = 1.5
+
+ H.resize = newsize/current_size
+ current_size = newsize
+ H.update_transform()
+ ..()
+
+/datum/reagent/growthserum/on_mob_delete(mob/living/M)
+ M.resize = 1/current_size
+ M.update_transform()
+ ..()
+
/datum/reagent/toxin/coffeepowder
name = "Coffee Grounds"
id = "coffeepowder"
@@ -429,25 +450,40 @@
reagent_state = SOLID
color = "#7F8400" // rgb: 127, 132, 0
-//Reagents used for plant fertilizers.
-/datum/reagent/toxin/fertilizer
- name = "fertilizer"
- id = "fertilizer"
- description = "A chemical mix good for growing plants with."
- reagent_state = LIQUID
- color = "#664330" // rgb: 102, 67, 48
+//////////////////////////////////Hydroponics stuff///////////////////////////////
-/datum/reagent/toxin/fertilizer/eznutrient
- name = "EZ Nutrient"
- id = "eznutrient"
+/datum/reagent/plantnutriment
+ name = "Generic nutriment"
+ id = "plantnutriment"
+ description = "Some kind of nutriment. You can't really tell what it is. You should probably report it, along with how you obtained it."
+ color = "#000000" // RBG: 0, 0, 0
+ var/tox_prob = 0
-/datum/reagent/toxin/fertilizer/left4zed
- name = "Left-4-Zed"
- id = "left4zed"
+/datum/reagent/plantnutriment/on_mob_life(mob/living/M)
+ if(prob(tox_prob))
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ ..()
-/datum/reagent/toxin/fertilizer/robustharvest
+/datum/reagent/plantnutriment/eznutriment
+ name = "E-Z-Nutrient"
+ id = "eznutriment"
+ description = "Cheap and extremely common type of plant nutriment."
+ color = "#376400" // RBG: 50, 100, 0
+ tox_prob = 10
+
+/datum/reagent/plantnutriment/left4zednutriment
+ name = "Left 4 Zed"
+ id = "left4zednutriment"
+ description = "Unstable nutriment that makes plants mutate more often than usual."
+ color = "#1A1E4D" // RBG: 26, 30, 77
+ tox_prob = 25
+
+/datum/reagent/plantnutriment/robustharvestnutriment
name = "Robust Harvest"
- id = "robustharvest"
+ id = "robustharvestnutriment"
+ description = "Very potent nutriment that prevents plants from mutating."
+ color = "#9D9D00" // RBG: 157, 157, 0
+ tox_prob = 15
///Alchemical Reagents
diff --git a/code/modules/reagents/chemistry/reagents/paradise_pop.dm b/code/modules/reagents/chemistry/reagents/paradise_pop.dm
index 17fdc2cb444..2dab79627cc 100644
--- a/code/modules/reagents/chemistry/reagents/paradise_pop.dm
+++ b/code/modules/reagents/chemistry/reagents/paradise_pop.dm
@@ -88,16 +88,15 @@
/datum/reagent/consumable/drink/blackeye_brew/on_mob_life(mob/living/M)
if(prob(25))
- var/list/tider_talk = list("CLOWN IS VALID, RIGHT?",
- "SHITMINS! SHITMINS! SHITMINS!",
- "FURRIES ARE OPPRESSED!",
- "I OWN THIS SERVER NOW, I JUST BOUGHT IT.",
+ var/list/tider_talk = list("I OWN THIS STATION NOW, I JUST BOUGHT IT.",
"SECRET TECHNIQUE: TOOLBOX TO THE FACE!",
"SECRET TECHNIQUE: PLASMA CANISTER FIRE!",
"SECRET TECHNIQUE: TABLE AND DISPOSAL!",
- "[pick("MY BROTHER", " MY DOG", "MY BEST FRIEND", "THE BORER", "GEORGE MELONS", "SHITMINS")] DID IT!",
- "WHAT DO YOU MEAN [pick("Barrack Obama", "John Cena", "Hughe Jass", "Hitler", "xX360noscopeXx")] ISN'T AN ACCEPTABLE NAME?",
- "WHAT THE FUCK DID YOU JUST FUCKING SAY ABOUT ME, YOU LITTLE BITCH? I'LL HAVE YOU KNOW I GRADUATED TOP OF MY CLASS IN...")
+ "[pick("MY BROTHER", " MY DOG", "MY BEST FRIEND", "THE BORER", "GEORGE MELONS", "BADMINS")] DID IT!",
+ ";s WHATS SPACE LAW?!",
+ "I BOUGHT THESE GLOVES, NOT STEAL THEM",
+ "THIS DOOR WAS SHOCKED WHEN I GOT HERE",
+ "ANIMALS ARE NOT CREW")
M.say(pick(tider_talk))
..()
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
index a92982a8aaf..43e81db402f 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
@@ -178,6 +178,7 @@
..()
/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume)
+ M.adjust_fire_stacks(1)
M.IgniteMob()
..()
@@ -286,17 +287,8 @@
C.adjustPlasma(20)
..()
-/datum/reagent/plasma_dust/reaction_obj(obj/O, volume)
- if((!O) || (!volume))
- return 0
- O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
-
-/datum/reagent/plasma_dust/reaction_turf(turf/simulated/T, volume)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
-
/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel!
if(method == TOUCH)
M.adjust_fire_stacks(volume / 5)
return
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 411e6a7bae5..40d9cb1c481 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -73,7 +73,7 @@
if(human.species.name != "Shadow")
to_chat(M, "Your flesh rapidly mutates! ")
to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids. ")
- to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness. ")
+ to_chat(M, "Your body reacts violently to light. However, it naturally heals in darkness. ")
to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations. ")
human.set_species("Shadow")
..()
@@ -269,9 +269,9 @@
M.take_organ_damage(0,20)
/datum/reagent/sacid/reaction_obj(obj/O, volume)
- if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40))
+ if((istype(O,/obj/item) || istype(O,/obj/structure/glowshroom)) && prob(40))
if(!O.unacidable)
- var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
+ var/obj/effect/decal/cleanable/molten_object/I = new/obj/effect/decal/cleanable/molten_object(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
O.visible_message("[O] melts. ")
qdel(O)
@@ -615,9 +615,9 @@
H.status_flags |= DISFIGURED
/datum/reagent/facid/reaction_obj(obj/O, volume)
- if((istype(O, /obj/item) || istype(O, /obj/effect/glowshroom)))
+ if((istype(O, /obj/item) || istype(O, /obj/structure/glowshroom)))
if(!O.unacidable)
- var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
+ var/obj/effect/decal/cleanable/molten_object/I = new/obj/effect/decal/cleanable/molten_object(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
O.visible_message("[O] melts. ")
qdel(O)
@@ -648,8 +648,8 @@
M.Weaken(2)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1 // rip in pepperoni
+ if(!H.undergoing_cardiac_arrest())
+ H.set_heartattack(TRUE) // rip in pepperoni
..()
/datum/reagent/pancuronium
@@ -900,41 +900,41 @@
M.adjustFireLoss(1)
..()
-/datum/reagent/atrazine
- name = "Atrazine"
- id = "atrazine"
- description = "A herbicidal compound used for destroying unwanted plants."
+/datum/reagent/glyphosate
+ name = "Glyphosate"
+ id = "glyphosate"
+ description = "A broad-spectrum herbicide that is highly effective at killing all plants."
reagent_state = LIQUID
- color = "#17002D"
+ color = "#d3cf50"
+ var/lethality = 0 //Glyphosate is non-toxic to people
-/datum/reagent/atrazine/on_mob_life(mob/living/M)
- M.adjustToxLoss(2)
+/datum/reagent/glyphosate/on_mob_life(mob/living/M)
+ M.adjustToxLoss(lethality)
..()
-/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume) // Clear off wallrot fungi
+/datum/reagent/glyphosate/reaction_turf(turf/simulated/wall/W, volume) // Clear off wallrot fungi
if(istype(W) && W.rotting)
for(var/obj/effect/overlay/wall_rot/WR in W)
qdel(WR)
W.rotting = 0
W.visible_message("The fungi are completely dissolved by the solution! ")
-/datum/reagent/atrazine/reaction_obj(obj/O, volume)
+/datum/reagent/glyphosate/reaction_obj(obj/O, volume)
if(istype(O,/obj/structure/alien/weeds/))
var/obj/structure/alien/weeds/alien_weeds = O
alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast
alien_weeds.healthcheck()
- else if(istype(O, /obj/effect/glowshroom)) //even a small amount is enough to kill it
+ else if(istype(O, /obj/structure/glowshroom)) //even a small amount is enough to kill it
qdel(O)
- else if(istype(O,/obj/effect/plant))
- if(prob(50))
- qdel(O) //Kills kudzu too.
- // Damage that is done to growing plants is separately at code/game/machinery/hydroponics at obj/item/hydroponics
+ else if(istype(O,/obj/structure/spacevine))
+ var/obj/structure/spacevine/SV = O
+ SV.on_chem_effect(src)
-/datum/reagent/atrazine/reaction_mob(mob/living/M, method=TOUCH, volume)
+/datum/reagent/glyphosate/reaction_mob(mob/living/M, method=TOUCH, volume)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.wear_mask) // If not wearing a mask
- C.adjustToxLoss(2) // 2 toxic damage per application
+ C.adjustToxLoss(lethality)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage
@@ -945,6 +945,35 @@
D.adjustHealth(100)
..()
+/datum/reagent/glyphosate/atrazine
+ name = "Atrazine"
+ id = "atrazine"
+ description = "A herbicidal compound used for destroying unwanted plants."
+ reagent_state = LIQUID
+ color = "#17002D"
+ lethality = 2 //Atrazine, however, is definitely toxic
+
+
+/datum/reagent/pestkiller // To-Do; make this more realistic.
+ name = "Pest Killer"
+ id = "pestkiller"
+ description = "A harmful toxic mixture to kill pests. Do not ingest!"
+ color = "#4B004B" // rgb: 75, 0, 75
+
+/datum/reagent/pestkiller/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1)
+ ..()
+
+/datum/reagent/pestkiller/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.wear_mask) // If not wearing a mask
+ C.adjustToxLoss(2)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.get_species() == "Kidan") //RIP
+ H.adjustToxLoss(20)
+
/datum/reagent/capulettium
name = "Capulettium"
id = "capulettium"
@@ -1061,4 +1090,4 @@
shock_timer = 0
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index f5e409a1cb4..70d2a9f76c0 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -48,8 +48,7 @@
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
- if(!cube.wrapped)
- cube.Expand()
+ cube.Expand()
// Dehydrated carp
if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
@@ -131,7 +130,7 @@
/datum/reagent/blood
- data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"="#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null)
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"="#A10808","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Blood"
id = "blood"
reagent_state = LIQUID
@@ -158,6 +157,7 @@
/datum/reagent/blood/on_merge(list/mix_data)
if(data && mix_data)
+ data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning, or else we won't know who's even getting cloned, etc
if(data["viruses"] || mix_data["viruses"])
var/list/mix1 = data["viruses"]
@@ -348,25 +348,24 @@
metabolization_rate = 1
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
- M.adjustBrainLoss(3)
if(iscultist(M))
- M.status_flags |= GOTTAGOFAST
M.AdjustDrowsy(-5)
- M.AdjustParalysis(-2)
+ M.AdjustParalysis(-1)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
+ M.adjustToxLoss(-2)
+ M.adjustFireLoss(-2)
+ M.adjustOxyLoss(-2)
+ M.adjustBruteLoss(-2)
else
- M.adjustToxLoss(2)
+ M.adjustBrainLoss(3)
+ M.adjustToxLoss(1)
M.adjustFireLoss(2)
M.adjustOxyLoss(2)
M.adjustBruteLoss(2)
M.AdjustCultSlur(10)//CUASE WHY THE HELL NOT
..()
-/datum/reagent/fuel/unholywater/on_mob_delete(mob/living/M)
- M.status_flags &= ~GOTTAGOFAST
- ..()
-
/datum/reagent/hellwater
name = "Hell Water"
id = "hell_water"
diff --git a/code/modules/reagents/chemistry/recipes/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm
index d1866a2b2f1..b8d31e55e1c 100644
--- a/code/modules/reagents/chemistry/recipes/drinks.dm
+++ b/code/modules/reagents/chemistry/recipes/drinks.dm
@@ -768,4 +768,77 @@
required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
result_amount = 3
mix_message = "The citrus juices begin to blend together."
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/chocolatepudding
+ name = "Chocolate Pudding"
+ id = "chocolatepudding"
+ result = "chocolatepudding"
+ required_reagents = list("cocoa" = 5, "milk" = 5, "egg" = 5)
+ result_amount = 20
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/vanillapudding
+ name = "Vanilla Pudding"
+ id = "vanillapudding"
+ result = "vanillapudding"
+ required_reagents = list("vanilla" = 5, "milk" = 5, "egg" = 5)
+ result_amount = 20
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/cherryshake
+ name = "Cherry Shake"
+ id = "cherryshake"
+ result = "cherryshake"
+ required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1)
+ result_amount = 3
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/bluecherryshake
+ name = "Blue Cherry Shake"
+ id = "bluecherryshake"
+ result = "bluecherryshake"
+ required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1)
+ result_amount = 3
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/drunkenblumpkin
+ name = "Drunken Blumpkin"
+ id = "drunkenblumpkin"
+ result = "drunkenblumpkin"
+ required_reagents = list("blumpkinjuice" = 1, "irishcream" = 2, "ice" = 1)
+ result_amount = 4
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/pumpkin_latte
+ name = "Pumpkin space latte"
+ id = "pumpkin_latte"
+ result = "pumpkin_latte"
+ required_reagents = list("pumpkinjuice" = 5, "coffee" = 5, "cream" = 5)
+ result_amount = 15
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/gibbfloats
+ name = "Gibb Floats"
+ id = "gibbfloats"
+ result = "gibbfloats"
+ required_reagents = list("dr_gibb" = 5, "ice" = 5, "cream" = 5)
+ result_amount = 15
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/grape_soda
+ name = "grape soda"
+ id = "grapesoda"
+ result = "grapesoda"
+ required_reagents = list("grapejuice" = 1, "sodawater" = 1)
+ result_amount = 2
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+
+/datum/chemical_reaction/eggnog
+ name = "eggnog"
+ id = "eggnog"
+ result = "eggnog"
+ required_reagents = list("rum" = 5, "cream" = 5, "egg" = 5)
+ result_amount = 15
+ mix_message = "The eggs nog together. Pretend that \"nog\" is a verb."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 1c22693513f..31547e10c44 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -271,4 +271,11 @@
required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1)
result_amount = 3
min_temp = 370
- mix_message = "The solution gently swirls with a metallic sheen."
\ No newline at end of file
+ mix_message = "The solution gently swirls with a metallic sheen."
+
+/datum/chemical_reaction/corazone
+ name = "Corazone"
+ id = "corazone"
+ result = "corazone"
+ result_amount = 3
+ required_reagents = list("phenol" = 2, "lithium" = 1)
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index b97deb0ae8f..3bdcfd5c029 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -101,7 +101,7 @@
result_amount = 1
/datum/chemical_reaction/plastication/on_reaction(datum/reagents/holder)
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/plastic
M.amount = 10
M.forceMove(get_turf(holder.my_atom))
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 6f42eaf91b2..fe54819e035 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -402,4 +402,4 @@ datum/chemical_reaction/flash_powder
id = "thermite"
result = "thermite"
required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
- result_amount = 3
\ No newline at end of file
+ result_amount = 3
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 9a48e07e6a5..133ab0e6378 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -67,12 +67,24 @@
/datum/chemical_reaction/slimemetal/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
- M.amount = 15
- M.forceMove(get_turf(holder.my_atom))
- var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
- P.amount = 5
- P.forceMove(get_turf(holder.my_atom))
+ var/turf/location = get_turf(holder.my_atom)
+ new /obj/item/stack/sheet/plasteel (location, 5)
+ new /obj/item/stack/sheet/metal (location, 15)
+
+/datum/chemical_reaction/slimeglass
+ name = "Slime Glass"
+ id = "m_glass"
+ result = null
+ required_reagents = list("water" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/metal
+ required_other = 1
+
+/datum/chemical_reaction/slimeglass/on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+ var/turf/location = get_turf(holder.my_atom)
+ new /obj/item/stack/sheet/rglass (location, 5)
+ new /obj/item/stack/sheet/glass (location, 15)
//Gold
/datum/chemical_reaction/slimecrit
@@ -209,8 +221,7 @@
required_other = 1
/datum/chemical_reaction/slimefrost/on_reaction(datum/reagents/holder)
- feedback_add_details("slime_cores_used","[type]")
-
+ feedback_add_details("slime_cores_used","[type]")
/datum/chemical_reaction/slimestabilizer
name = "Slime Stabilizer"
@@ -226,8 +237,6 @@
var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer
P.forceMove(get_turf(holder.my_atom))
-
-
//Dark Blue
/datum/chemical_reaction/slimefreeze
name = "Slime Freeze"
@@ -383,12 +392,10 @@
/datum/chemical_reaction/slimeplasma/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
- var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
- P.amount = 3
- P.forceMove(get_turf(holder.my_atom))
+ var/turf/location = get_turf(holder.my_atom)
+ new /obj/item/stack/sheet/mineral/plasma (location, 3)
//Red
-
/datum/chemical_reaction/slimemutator
name = "Slime Mutator"
id = "m_slimemutator"
@@ -661,4 +668,18 @@
var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black")
S.forceMove(get_turf(holder.my_atom))
- S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it! ")
\ No newline at end of file
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it! ")
+
+/datum/chemical_reaction/slime_transfer
+ name = "Transfer Potion"
+ id = "slimetransfer"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_other = 1
+ required_container = /obj/item/slime_extract/rainbow
+
+/datum/chemical_reaction/slime_transfer/on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+ var/obj/item/slimepotion/transference/P = new /obj/item/slimepotion/transference
+ P.forceMove(get_turf(holder.my_atom))
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index 2181401b2da..082e209e18b 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -93,6 +93,13 @@
if(C.can_breathe_gas())
C.reagents.add_reagent("sarin", 4)
+/datum/chemical_reaction/glyphosate
+ name = "glyphosate"
+ id = "glyphosate"
+ result = "glyphosate"
+ required_reagents = list("chlorine" = 1, "phosphorus" = 1, "formaldehyde" = 1, "ammonia" = 1)
+ result_amount = 4
+
/datum/chemical_reaction/atrazine
name = "atrazine"
id = "atrazine"
@@ -101,6 +108,14 @@
result_amount = 3
mix_message = "The mixture gives off a harsh odor"
+/datum/chemical_reaction/pestkiller // To-Do make this more realistic
+ name = "Pest Killer"
+ id = "pestkiller"
+ result = "pestkiller"
+ required_reagents = list("toxin" = 1, "ethanol" = 4)
+ result_amount = 5
+ mix_message = "The mixture gives off a harsh odor"
+
/datum/chemical_reaction/capulettium
name = "capulettium"
id = "capulettium"
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index f46d4010e69..009828543ce 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -3,7 +3,7 @@
desc = "..."
icon = 'icons/obj/chemical.dmi'
icon_state = null
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/amount_per_transfer_from_this = 5
var/possible_transfer_amounts = list(5,10,15,25,30)
var/volume = 30
@@ -30,7 +30,6 @@
if(!possible_transfer_amounts)
verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT
create_reagents(volume)
- processing_objects.Add(src)
if(spawned_disease)
var/datum/disease/F = new spawned_disease(0)
var/list/data = list("viruses" = list(F), "blood_colour" = "#A10808")
@@ -38,11 +37,6 @@
if(list_reagents)
reagents.add_reagent_list(list_reagents)
-/obj/item/weapon/reagent_containers/process()
- if(reagents)
- reagents.reagent_on_tick()
- return
-
/obj/item/weapon/reagent_containers/ex_act()
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
@@ -84,4 +78,4 @@
reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this))
to_chat(user, "You fill [src] from [source]. ")
return
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index a04087603ad..c0e85013ccd 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -1,11 +1,13 @@
/obj/item/weapon/reagent_containers/blood
name = "BloodPack"
+ var/base_name = "BloodPack"
desc = "Contains blood used for transfusion."
icon = 'icons/obj/bloodpack.dmi'
icon_state = "empty"
volume = 200
var/blood_type = null
+ var/label_text = ""
/obj/item/weapon/reagent_containers/blood/New()
..()
@@ -16,6 +18,7 @@
/obj/item/weapon/reagent_containers/blood/on_reagent_change()
update_icon()
+ update_name_label()
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
@@ -27,27 +30,55 @@
if(51 to INFINITY)
icon_state = "full"
+/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen))
+ var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text))
+ if(length(tmp_label) > MAX_NAME_LEN)
+ to_chat(user, "The label can be at most [MAX_NAME_LEN] characters long. ")
+ else
+ to_chat(user, "You set the label to \"[tmp_label]\". ")
+ label_text = tmp_label
+ update_name_label()
+
+/obj/item/weapon/reagent_containers/blood/proc/update_name_label()
+ if(reagents.total_volume == 0)
+ base_name = "Empty BloodPack"
+ desc = "Seems pretty useless... Maybe if there were a way to fill it?"
+ else
+ base_name = "BloodPack"
+ desc = "Contains blood used for transfusion."
+ if(label_text == "")
+ name = base_name
+ else
+ name = "[base_name] ([label_text])"
+
/obj/item/weapon/reagent_containers/blood/random/New()
blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-")
..()
/obj/item/weapon/reagent_containers/blood/APlus
blood_type = "A+"
+ label_text = "A+"
/obj/item/weapon/reagent_containers/blood/AMinus
blood_type = "A-"
+ label_text = "A-"
/obj/item/weapon/reagent_containers/blood/BPlus
blood_type = "B+"
+ label_text = "B+"
/obj/item/weapon/reagent_containers/blood/BMinus
blood_type = "B-"
+ label_text = "B-"
/obj/item/weapon/reagent_containers/blood/OPlus
blood_type = "O+"
+ label_text = "O+"
/obj/item/weapon/reagent_containers/blood/OMinus
blood_type = "O-"
+ label_text = "O-"
/obj/item/weapon/reagent_containers/blood/empty
name = "Empty BloodPack"
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index c69c7b4a0ef..70ba27e7dcc 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -84,8 +84,8 @@
if(M.reagents)
var/datum/reagent/injected = chemical_reagents_list[reagent_ids[mode]]
var/contained = injected.name
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [key_name(user)]. Reagents: [contained] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [key_name(M)]. Reagents: [contained] ")
+ M.create_attack_log("Has been injected with [name] by [key_name(user)]. Reagents: [contained] ")
+ user.create_attack_log("Used the [name] to inject [key_name(M)]. Reagents: [contained] ")
if(M.ckey)
msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
M.LAssailant = user
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index deeeb76b58d..b9d429b0597 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -1,122 +1,111 @@
////////////////////////////////////////////////////////////////////////////////
-/// Droppers.
+/// Droppers. ///
////////////////////////////////////////////////////////////////////////////////
+
/obj/item/weapon/reagent_containers/dropper
name = "dropper"
desc = "A dropper. Transfers 5 units."
- icon = 'icons/obj/chemical.dmi'
icon_state = "dropper"
+ item_state = "dropper"
amount_per_transfer_from_this = 5
- possible_transfer_amounts = list(1,2,3,4,5)
+ possible_transfer_amounts = list(1, 2, 3, 4, 5)
volume = 5
- var/filled = 0
-
-/obj/item/weapon/reagent_containers/dropper/afterattack(obj/target, mob/user , flag)
- if(!target.reagents)
- return
-
- if(filled)
-
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "[target] is full. ")
- return
-
- if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit.
- to_chat(user, "You cannot directly fill this object. ")
- return
-
- var/trans = 0
-
- if(ismob(target))
- if(istype(target , /mob/living/carbon/human))
- var/mob/living/carbon/human/victim = target
-
- var/obj/item/safe_thing = null
- if( victim.wear_mask )
- if( victim.wear_mask.flags & MASKCOVERSEYES )
- safe_thing = victim.wear_mask
- if( victim.head )
- if( victim.head.flags & MASKCOVERSEYES )
- safe_thing = victim.head
- if(victim.glasses)
- if( !safe_thing )
- safe_thing = victim.glasses
-
- if(safe_thing)
- if(!safe_thing.reagents)
- safe_thing.create_reagents(100)
- trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this)
-
- visible_message("[user] tries to squirt something into [victim]'s eyes, but fails! ")
- spawn(5)
- reagents.reaction(safe_thing, TOUCH)
-
-
-
- to_chat(user, "You transfer [trans] units of the solution. ")
- if(reagents.total_volume<=0)
- filled = 0
- icon_state = "[initial(icon_state)]"
- return
-
-
- visible_message("[user] squirts something into [target]'s eyes! ")
- reagents.reaction(target, TOUCH)
-
- var/mob/living/M = target
-
- var/list/injected = list()
- for(var/datum/reagent/R in reagents.reagent_list)
- injected += R.name
- var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been squirted with [name] by [key_name(user)]. Reagents: [contained] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to squirt [key_name(M)]. Reagents: [contained] ")
- if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
-
- trans = reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "You transfer [trans] units of the solution. ")
- if(reagents.total_volume<=0)
- filled = 0
- icon_state = "[initial(icon_state)]"
+/obj/item/weapon/reagent_containers/dropper/on_reagent_change()
+ if(!reagents.total_volume)
+ icon_state = "[initial(icon_state)]"
else
+ icon_state = "[initial(icon_state)]1"
- if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
- to_chat(user, "You cannot directly remove reagents from [target]. ")
+/obj/item/weapon/reagent_containers/dropper/attack(mob/living/M, mob/living/user, def_zone)
+ return
+
+/obj/item/weapon/reagent_containers/dropper/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
+ return
+ var/to_transfer = 0
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ if(!reagents.total_volume)
+ return
+ if(user != C)
+ visible_message("[user] begins to drip something into [C]'s eyes! ")
+ if(!do_mob(user, C, 30))
+ return
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/safe_thing = null
+
+ if(H.glasses)
+ safe_thing = H.glasses
+ if(H.wear_mask )
+ if(H.wear_mask.flags_cover & MASKCOVERSEYES)
+ safe_thing = H.wear_mask
+ if(H.head)
+ if(H.head.flags_cover & MASKCOVERSEYES)
+ safe_thing = H.head
+
+ if(safe_thing)
+ visible_message("[user] tries to drip something into [H]'s eyes, but fails! ")
+
+ reagents.reaction(safe_thing, TOUCH)
+ to_transfer = reagents.remove_any(amount_per_transfer_from_this)
+
+ to_chat(user, "You transfer [to_transfer] units of the solution. ")
+ return
+
+ visible_message("[user] drips something into [C]'s eyes! ")
+ reagents.reaction(C, TOUCH)
+
+ var/list/injected = list()
+ for(var/datum/reagent/R in reagents.reagent_list)
+ injected += R.name
+ var/contained = english_list(injected)
+ add_logs(user, C, "dripped", src, "([contained])")
+
+ to_transfer = reagents.trans_to(C, amount_per_transfer_from_this)
+ to_chat(user, "You transfer [to_transfer] units of the solution. ")
+
+ if(isobj(target))
+ if(!target.reagents)
return
- if(!target.reagents.total_volume)
- to_chat(user, "[target] is empty. ")
- return
+ if(reagents.total_volume)
+ if(!target.is_open_container() && !(istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/weapon/reagent_containers/food/pill)) && !istype(target, /obj/item/clothing/mask/cigarette))
+ to_chat(user, "You cannot directly fill this object. ")
+ return
- var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "[target] is full. ")
+ return
- to_chat(user, "You fill [src] with [trans] units of the solution. ")
+ to_transfer = reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "You transfer [to_transfer] units of the solution. ")
- filled = 1
- icon_state = "[initial(icon_state)][filled]"
+ else
+ if(!target.is_open_container() && !istype(target, /obj/structure/reagent_dispensers))
+ to_chat(user, "You cannot directly remove reagents from [target]. ")
+ return
+
+ if(!target.reagents.total_volume)
+ to_chat(user, "[target] is empty. ")
+ return
+
+ to_transfer = target.reagents.trans_to(src, amount_per_transfer_from_this)
+
+ to_chat(user, "You fill [src] with [to_transfer] units of the solution. ")
/obj/item/weapon/reagent_containers/dropper/cyborg
name = "Industrial Dropper"
desc = "A larger dropper. Transfers 10 units."
amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(1,2,3,4,5,6,7,8,9,10)
+ possible_transfer_amounts = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
volume = 10
-////////////////////////////////////////////////////////////////////////////////
-/// Droppers. END
-////////////////////////////////////////////////////////////////////////////////
-
/obj/item/weapon/reagent_containers/dropper/precision
name = "pipette"
desc = "A high precision pippette. Holds 1 unit."
- icon = 'icons/obj/chemical.dmi'
icon_state = "pipette"
amount_per_transfer_from_this = 1
- possible_transfer_amounts = list(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
+ possible_transfer_amounts = list(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1)
volume = 1
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 60c924e0515..5d22a21aa4a 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -38,8 +38,9 @@
/obj/machinery/sleeper,
/obj/machinery/smartfridge/,
/obj/machinery/biogenerator,
- /obj/machinery/portable_atmospherics/hydroponics,
- /obj/machinery/constructable_frame)
+ /obj/machinery/hydroponics,
+ /obj/machinery/constructable_frame,
+ /obj/machinery/icemachine)
/obj/item/weapon/reagent_containers/glass/New()
..()
@@ -62,7 +63,8 @@
update_icon()
/obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
- if(!proximity) return
+ if(!proximity)
+ return
if(!is_open_container())
return
@@ -78,8 +80,8 @@
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been splashed with [name] by [key_name(user)]. Reagents: [contained] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to splash [key_name(M)]. Reagents: [contained] ")
+ M.create_attack_log("Has been splashed with [name] by [key_name(user)]. Reagents: [contained] ")
+ user.create_attack_log("Used the [name] to splash [key_name(M)]. Reagents: [contained] ")
if(M.ckey)
msg_admin_attack("[key_name_admin(user)] splashed [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
@@ -94,16 +96,16 @@
return
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
- if(!target.reagents.total_volume && target.reagents)
- to_chat(user, "[target] is empty. ")
+ if(target.reagents && !target.reagents.total_volume)
+ to_chat(user, "[target] is empty and can't be refilled! ")
return
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "[src] is full. ")
+ to_chat(user, "[src] is full. ")
return
- var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
- to_chat(user, "You fill [src] with [trans] units of the contents of [target]. ")
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+ to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target]. ")
else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
@@ -290,7 +292,11 @@
materials = list(MAT_GLASS=500)
volume = 50
amount_per_transfer_from_this = 10
- flags = OPENCONTAINER | NOREACT
+ flags = OPENCONTAINER
+
+/obj/item/weapon/reagent_containers/glass/beaker/noreact/New()
+ ..()
+ reagents.set_reacting(FALSE)
/obj/item/weapon/reagent_containers/glass/beaker/bluespace
name = "bluespace beaker"
@@ -324,7 +330,7 @@
icon_state = "bucket"
item_state = "bucket"
materials = list(MAT_METAL=200)
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
amount_per_transfer_from_this = 20
possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120)
volume = 120
@@ -347,4 +353,4 @@
user.unEquip(src)
qdel(src)
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index a706d443d90..8674ba75a09 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -7,7 +7,7 @@
flags = OPENCONTAINER | NOBLUDGEON
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
var/spray_maxrange = 3 //what the sprayer will set spray_currentrange to in the attack_self.
@@ -19,7 +19,7 @@
/obj/item/weapon/reagent_containers/spray/afterattack(atom/A, mob/user)
if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack) || istype(A, /obj/structure/closet) \
- || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/portable_atmospherics/hydroponics))
+ || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return
if(istype(A, /obj/effect/proc_holder/spell))
@@ -34,7 +34,7 @@
to_chat(user, "[src] is full. ")
return
- var/trans = A.reagents.trans_to(src, A:amount_per_transfer_from_this)
+ var/trans = A.reagents.trans_to(src, 50) //This is a static amount, otherwise, it'll take forever to fill.
to_chat(user, "You fill [src] with [trans] units of the contents of [A]. ")
return
@@ -127,7 +127,7 @@
/obj/item/weapon/reagent_containers/spray/waterflower
name = "water flower"
desc = "A seemingly innocent sunflower...with a twist."
- icon = 'icons/obj/harvest.dmi'
+ icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "sunflower"
item_state = "sunflower"
amount_per_transfer_from_this = 1
@@ -145,7 +145,7 @@
icon_state = "chemsprayer"
item_state = "chemsprayer"
throwforce = 0
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
spray_maxrange = 7
spray_currentrange = 7
amount_per_transfer_from_this = 10
@@ -200,20 +200,8 @@
/obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie
name = "Plant-B-Gone"
desc = "Kills those pesky weeds!"
- icon = 'icons/obj/hydroponics.dmi'
+ icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "plantbgone"
item_state = "plantbgone"
volume = 100
- list_reagents = list("atrazine" = 100)
-
-
-/obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A, mob/user, proximity)
- if(!proximity) return
-
- if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) // We are targeting hydrotray
- return
-
- if(istype(A, /obj/effect/blob)) // blob damage in blob code
- return
-
- ..()
\ No newline at end of file
+ list_reagents = list("glyphosate" = 100)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index bb84295a22d..ebb13f0830c 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -14,7 +14,7 @@
amount_per_transfer_from_this = 5
possible_transfer_amounts = null //list(5,10,15)
volume = 15
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
sharp = 1
var/mode = SYRINGE_DRAW
var/projectile_type = /obj/item/projectile/bullet/dart/syringe
@@ -68,22 +68,22 @@
return
if(mode == SYRINGE_BROKEN)
- to_chat(user, "\red This syringe is broken!")
+ to_chat(user, "This syringe is broken! ")
return
switch(mode)
if(SYRINGE_DRAW)
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\red The syringe is full.")
+ to_chat(user, "The syringe is full. ")
return
if(ismob(target))//Blood!
if(istype(target, /mob/living/carbon/slime))
- to_chat(user, "\red You are unable to locate any blood.")
+ to_chat(user, "You are unable to locate any blood. ")
return
if(reagents.has_reagent("blood"))
- to_chat(user, "\red There is already a blood sample in this syringe")
+ to_chat(user, "There is already a blood sample in this syringe ")
return
if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
var/mob/living/carbon/T = target
@@ -91,7 +91,7 @@
to_chat(usr, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)")
return
if(NOCLONE in T.mutations) //target done been et, no more blood in him
- to_chat(user, "\red You are unable to locate any blood.")
+ to_chat(user, "You are unable to locate any blood. ")
return
@@ -130,45 +130,45 @@
on_reagent_change()
reagents.handle_reactions()
- to_chat(user, "\blue You take a blood sample from [target]")
+ to_chat(user, "You take a blood sample from [target] ")
for(var/mob/O in viewers(4, user))
- O.show_message("\red [user] takes a blood sample from [target].", 1)
+ O.show_message("[user] takes a blood sample from [target]. ", 1)
else
user.visible_message("[user] takes a sample from [target]. ", "You take a sample from [target]. ")
else //if not mob
if(!target.reagents.total_volume)
- to_chat(user, "\red [target] is empty.")
+ to_chat(user, "[target] is empty. ")
return
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract))
- to_chat(user, "\red You cannot directly remove reagents from this object.")
+ to_chat(user, "You cannot directly remove reagents from this object. ")
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
- to_chat(user, "\blue You fill the syringe with [trans] units of the solution.")
+ to_chat(user, "You fill the syringe with [trans] units of the solution. ")
if(reagents.total_volume >= reagents.maximum_volume)
mode=!mode
update_icon()
if(SYRINGE_INJECT)
if(!reagents.total_volume)
- to_chat(user, "\red The Syringe is empty.")
+ to_chat(user, "The Syringe is empty. ")
return
if(istype(target, /obj/item/weapon/implantcase/chem))
return
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes))
- to_chat(user, "\red You cannot directly fill this object.")
+ to_chat(user, "You cannot directly fill this object. ")
return
if(istype(target, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/C = target
if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes))
- to_chat(user, "\red You cannot inject a cigarette while it's still in the pack.")
+ to_chat(user, "You cannot inject a cigarette while it's still in the pack. ")
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red [target] is full.")
+ to_chat(user, "[target] is full. ")
return
var/mob/living/carbon/human/H = target
@@ -188,7 +188,7 @@
if(!do_mob(user, target, 30)) return
for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] injects [] with the syringe!", user, target), 1)
+ O.show_message(text("[] injects [] with the syringe! ", user, target), 1)
if(istype(target,/mob/living))
var/mob/living/M = target
@@ -196,8 +196,8 @@
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [key_name(user)]. Reagents: [contained] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [key_name(M)]. Reagents: [contained] ")
+ M.create_attack_log("Has been injected with [name] by [key_name(user)]. Reagents: [contained] ")
+ user.create_attack_log("Used the [name] to inject [key_name(M)]. Reagents: [contained] ")
if(M.ckey)
msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
@@ -220,7 +220,7 @@
C.inject_blood(src, 5)
else
trans = reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.")
+ to_chat(user, "You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units. ")
if(istype(target, /obj/item/weapon/reagent_containers/food/pill/patch))
var/obj/item/weapon/reagent_containers/food/pill/patch/P = target
if(P.instant_application)
@@ -300,7 +300,7 @@
if(SYRINGE_DRAW)
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\red The syringe is full.")
+ to_chat(user, "The syringe is full. ")
return
if(ismob(target))
@@ -309,31 +309,31 @@
return
else //if not mob
if(!target.reagents.total_volume)
- to_chat(user, "\red [target] is empty.")
+ to_chat(user, "[target] is empty. ")
return
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
- to_chat(user, "\red You cannot directly remove reagents from this object.")
+ to_chat(user, "You cannot directly remove reagents from this object. ")
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
- to_chat(user, "\blue You fill the syringe with [trans] units of the solution.")
+ to_chat(user, "You fill the syringe with [trans] units of the solution. ")
if(reagents.total_volume >= reagents.maximum_volume)
mode=!mode
update_icon()
if(SYRINGE_INJECT)
if(!reagents.total_volume)
- to_chat(user, "\red The Syringe is empty.")
+ to_chat(user, "The Syringe is empty. ")
return
if(istype(target, /obj/item/weapon/implantcase/chem))
return
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food))
- to_chat(user, "\red You cannot directly fill this object.")
+ to_chat(user, "You cannot directly fill this object. ")
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red [target] is full.")
+ to_chat(user, "[target] is full. ")
return
if(ismob(target) && target != user)
@@ -341,13 +341,13 @@
O.show_message(text("[] is trying to inject [] with a giant syringe! ", user, target), 1)
if(!do_mob(user, target, 300)) return
for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] injects [] with a giant syringe!", user, target), 1)
+ O.show_message(text("[] injects [] with a giant syringe! ", user, target), 1)
reagents.reaction(target, INGEST)
if(ismob(target) && target == user)
reagents.reaction(target, INGEST)
spawn(5)
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.")
+ to_chat(user, "You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units. ")
if(reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
@@ -398,4 +398,4 @@
/obj/item/weapon/reagent_containers/syringe/bioterror
name = "bioterror syringe"
desc = "Contains several paralyzing reagents."
- list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5)
\ No newline at end of file
+ list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 4c2d2caa6b8..11abc89a343 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -1,5 +1,3 @@
-#define AUTOIGNITION_WELDERFUEL 561.15
-
/obj/structure/reagent_dispensers
name = "Dispenser"
desc = "..."
@@ -9,109 +7,95 @@
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
- var/amount_per_transfer_from_this = 10
- var/possible_transfer_amounts = list(10,25,50,100)
+ var/tank_volume = 1000 //In units, how much the dispenser can hold
+ var/reagent_id = "water" //The ID of the reagent that the dispenser uses
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W, mob/user, params)
return
/obj/structure/reagent_dispensers/New()
- create_reagents(1000)
- if(!possible_transfer_amounts)
- verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
+ create_reagents(tank_volume)
+ reagents.add_reagent(reagent_id, tank_volume)
..()
/obj/structure/reagent_dispensers/examine(mob/user)
if(!..(user, 2))
return
- to_chat(user, "It contains: ")
- if(reagents && reagents.reagent_list.len)
- for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name] ")
+ if(reagents.total_volume)
+ to_chat(user, "It has [reagents.total_volume] units left. ")
else
- to_chat(user, "Nothing. ")
+ to_chat(user, "It's empty. ")
-/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
- set name = "Set transfer amount"
- set category = "Object"
- set src in view(1)
- if(usr.stat || !usr.canmove || usr.restrained())
- return
- var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
- if(N)
- amount_per_transfer_from_this = N
+
+/obj/structure/reagent_dispensers/proc/boom()
+ visible_message("[src] ruptures! ")
+ qdel(src)
/obj/structure/reagent_dispensers/ex_act(severity)
switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
+ if(1)
+ boom()
+ if(2)
if(prob(50))
- new /obj/effect/effect/water(loc)
- qdel(src)
- return
- if(3.0)
+ boom()
+ if(3)
if(prob(5))
- new /obj/effect/effect/water(loc)
- qdel(src)
- return
- else
- return
+ boom()
/obj/structure/reagent_dispensers/blob_act()
if(prob(50))
- new /obj/effect/effect/water(loc)
- qdel(src)
-
-
-
-
-
+ boom()
//Dispensers
/obj/structure/reagent_dispensers/watertank
- name = "watertank"
- desc = "A watertank"
- icon = 'icons/obj/objects.dmi'
- icon_state = "watertank"
- amount_per_transfer_from_this = 10
+ name = "water tank"
+ desc = "A water tank."
+ icon_state = "water"
-/obj/structure/reagent_dispensers/watertank/New()
+/obj/structure/reagent_dispensers/watertank/boom()
+ playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6)
+ new /obj/effect/effect/water(loc)
+ for(var/turf/simulated/T in view(5, loc))
+ T.MakeSlippery()
+ for(var/mob/living/L in T)
+ L.adjust_fire_stacks(-20)
..()
- reagents.add_reagent("water",1000)
+
+/obj/structure/reagent_dispensers/watertank/high
+ name = "high-capacity water tank"
+ desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."
+ icon_state = "water_high" //I was gonna clean my room...
+ tank_volume = 100000
/obj/structure/reagent_dispensers/fueltank
- name = "fueltank"
- desc = "A fueltank"
- icon = 'icons/obj/objects.dmi'
- icon_state = "weldtank"
- amount_per_transfer_from_this = 10
+ name = "fuel tank"
+ desc = "A tank full of industrial welding fuel. Do not consume."
+ icon_state = "fuel"
+ reagent_id = "fuel"
var/obj/item/device/assembly_holder/rig = null
var/accepts_rig = 1
-/obj/structure/reagent_dispensers/fueltank/New()
+/obj/structure/reagent_dispensers/fueltank/Destroy()
+ QDEL_NULL(rig)
+ return ..()
+
+/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
..()
- reagents.add_reagent("fuel",1000)
+ if(!qdeleted(src)) //wasn't deleted by the projectile's effects.
+ if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
+ message_admins("[key_name_admin(P.firer)] triggered a fueltank explosion.")
+ log_game("[key_name(P.firer)] triggered a fueltank explosion.")
+ boom()
-/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj)
- ..()
- if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
- message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.")
- log_game("[key_name(Proj.firer)] triggered a fueltank explosion.")
- boom()
+/obj/structure/reagent_dispensers/fueltank/boom()
+ explosion(loc, 0, 1, 5, 7, 10, flame_range = 5)
+ qdel(src)
-/obj/structure/reagent_dispensers/fueltank/proc/boom()
- explosion(loc,0,1,5,7,10, flame_range = 5)
- if(src)
- qdel(src)
-
-/obj/structure/reagent_dispensers/fueltank/blob_act(obj/effect/blob/B)
+/obj/structure/reagent_dispensers/fueltank/blob_act()
boom()
-
/obj/structure/reagent_dispensers/fueltank/ex_act()
boom()
@@ -133,34 +117,53 @@
usr.visible_message("[usr] begins to detach [rig] from [src]. ", "You begin to detach [rig] from [src]. ")
if(do_after(usr, 20, target = src))
usr.visible_message("[usr] detaches [rig] from [src]. ", "You detach [rig] from [src]. ")
- rig.loc = get_turf(usr)
+ rig.forceMove(get_turf(usr))
rig = null
- overlays = new/list()
+ overlays.Cut()
-/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/device/assembly_holder) && accepts_rig)
+/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/assembly_holder) && accepts_rig)
if(rig)
to_chat(user, "There is another device in the way. ")
return ..()
- user.visible_message("[user] begins rigging [W] to [src].", "You begin rigging [W] to [src]")
+ user.visible_message("[user] begins rigging [I] to [src].", "You begin rigging [I] to [src]")
if(do_after(user, 20, target = src))
- user.visible_message("[user] rigs [W] to [src]. ", "You rig [W] to [src]. ")
+ user.visible_message("[user] rigs [I] to [src]. ", "You rig [I] to [src]. ")
- var/obj/item/device/assembly_holder/H = W
- if(istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
+ var/obj/item/device/assembly_holder/H = I
+ if(istype(H.a_left, /obj/item/device/assembly/igniter) || istype(H.a_right, /obj/item/device/assembly/igniter))
msg_admin_attack("[key_name_admin(user)] rigged a fueltank for explosion (JMP )")
log_game("[key_name(user)] rigged fueltank a fueltank for explosion at [loc.x], [loc.y], [loc.z]")
- rig = W
+ rig = H
user.drop_item()
- W.loc = src
+ H.forceMove(src)
- var/icon/test = getFlatIcon(W)
- test.Shift(NORTH,1)
- test.Shift(EAST,6)
+ var/icon/test = getFlatIcon(H)
+ test.Shift(NORTH, 1)
+ test.Shift(EAST, 6)
overlays += test
- return ..()
+ if(istype(I, /obj/item/weapon/weldingtool))
+ if(!reagents.has_reagent("fuel"))
+ to_chat(user, "[src] is out of fuel! ")
+ return
+ var/obj/item/weapon/weldingtool/W = I
+ if(!W.welding)
+ if(W.reagents.has_reagent("fuel", W.max_fuel))
+ to_chat(user, "Your [W] is already full! ")
+ return
+ reagents.trans_to(W, W.max_fuel)
+ user.visible_message("[user] refills \his [W]. ", "You refill [W]. ")
+ playsound(src, 'sound/effects/refill.ogg', 50, 1)
+ W.update_icon()
+ else
+ user.visible_message("[user] catastrophically fails at refilling \his [W]! ", "That was stupid of you. ")
+ message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
+ log_game("[key_name(user)] triggered a fueltank explosion.")
+ boom()
+ else
+ ..()
/obj/structure/reagent_dispensers/fueltank/Move()
..()
@@ -190,76 +193,65 @@
/obj/structure/reagent_dispensers/peppertank
- name = "Pepper Spray Refiller"
- desc = "Refill pepper spray canisters."
- icon = 'icons/obj/objects.dmi'
- icon_state = "peppertank"
+ name = "pepper spray refiller"
+ desc = "Contains condensed capsaicin for use in law \"enforcement.\""
+ icon_state = "pepper"
anchored = 1
density = 0
- amount_per_transfer_from_this = 45
-
-/obj/structure/reagent_dispensers/peppertank/New()
- ..()
- reagents.add_reagent("condensedcapsaicin",1000)
-
+ reagent_id = "condensedcapsaicin"
/obj/structure/reagent_dispensers/water_cooler
- name = "Water-Cooler"
- desc = "A machine that dispenses water to drink"
- amount_per_transfer_from_this = 5
+ name = "liquid cooler"
+ desc = "A machine that dispenses liquid to drink."
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"
- possible_transfer_amounts = null
anchored = 1
+ tank_volume = 500
+ var/paper_cups = 25 //Paper cups left from the cooler
-/obj/structure/reagent_dispensers/water_cooler/New()
- ..()
- reagents.add_reagent("water",500)
+/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
+ if(!..(user, 2))
+ return
+ to_chat(user, "There are [paper_cups ? paper_cups : "no"] paper cups left.")
+/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user)
+ if(!paper_cups)
+ to_chat(user, "There aren't any cups left! ")
+ return
+ user.visible_message("[user] takes a cup from [src]. ", "You take a paper cup from [src]. ")
+ var/obj/item/weapon/reagent_containers/food/drinks/sillycup/S = new(get_turf(src))
+ user.put_in_hands(S)
+ paper_cups--
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
- desc = "A beer keg"
- icon = 'icons/obj/objects.dmi'
- icon_state = "beertankTEMP"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/beerkeg/New()
- ..()
- reagents.add_reagent("beer",1000)
+ desc = "Beer is liquid bread, it's good for you..."
+ icon_state = "beer"
+ reagent_id = "beer"
/obj/structure/reagent_dispensers/beerkeg/blob_act()
- explosion(loc,0,3,5,7,10)
+ explosion(loc, 0, 3, 5, 7, 10)
qdel(src)
/obj/structure/reagent_dispensers/virusfood
- name = "Virus Food Dispenser"
- desc = "A dispenser of virus food."
- icon = 'icons/obj/objects.dmi'
- icon_state = "virusfoodtank"
- amount_per_transfer_from_this = 10
+ name = "virus food dispenser"
+ desc = "A dispenser of low-potency virus mutagenic."
+ icon_state = "virus_food"
anchored = 1
density = 0
-
-/obj/structure/reagent_dispensers/virusfood/New()
- ..()
- reagents.add_reagent("virusfood", 1000)
+ reagent_id = "virusfood"
/obj/structure/reagent_dispensers/spacecleanertank
name = "space cleaner refiller"
desc = "Refills space cleaner bottles."
- icon = 'icons/obj/objects.dmi'
- icon_state = "spacecleanertank"
+ icon_state = "cleaner"
anchored = 1
density = 0
- amount_per_transfer_from_this = 250
-
-/obj/structure/reagent_dispensers/spacecleanertank/New()
- ..()
- reagents.add_reagent("cleaner",5000)
+ tank_volume = 5000
+ reagent_id = "cleaner"
/obj/structure/reagent_dispensers/fueltank/chem
- icon_state = "weldingtank_chem"
+ icon_state = "fuel_chem"
anchored = 1
density = 0
accepts_rig = 0
\ No newline at end of file
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 2785683e378..8896d939e2f 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -50,7 +50,7 @@
dir = newdir
update_move_direction()
-/obj/machinery/conveyor/set_dir(newdir)
+/obj/machinery/conveyor/setDir(newdir)
. = ..()
update_move_direction()
@@ -129,12 +129,13 @@
var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc)
C.id = id
transfer_fingerprints_to(C)
+ playsound(loc, I.usesound, 50, 1)
to_chat(usr,"You remove the conveyor belt. ")
qdel(src)
else if(istype(I, /obj/item/weapon/wrench))
if(!(stat & BROKEN))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
dir = turn(dir,-45)
update_move_direction()
to_chat(user, "You rotate [src]. ")
@@ -253,9 +254,20 @@
// attack with hand, switch position
/obj/machinery/conveyor_switch/attack_hand(mob/user)
- if(!allowed(user)) //this is in Para but not TG. I don't think there's any which are set anyway.
+ if(..())
+ return 1
+
+ toggle(user)
+
+/obj/machinery/conveyor_switch/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ toggle(user)
+
+/obj/machinery/conveyor_switch/proc/toggle(mob/user)
+ if(!allowed(user) && !user.can_advanced_admin_interact()) //this is in Para but not TG. I don't think there's any which are set anyway.
to_chat(user, "Access denied. ")
return
+
add_fingerprint(user)
if(position == 0)
if(convdir) //is it a oneway switch
@@ -281,7 +293,6 @@
S.update()
CHECK_TICK
-
/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/crowbar))
var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc)
@@ -298,7 +309,12 @@
/obj/machinery/conveyor_switch/multitool_topic(var/mob/user,var/list/href_list,var/obj/O)
..()
if("toggle_logic" in href_list)
- convdir = !convdir //reverses?
+ if(convdir)
+ convdir = 0
+ else if(last_pos)
+ convdir = last_pos
+ else
+ convdir = position
/obj/machinery/conveyor_switch/multitool_menu(var/mob/user, var/obj/item/device/multitool/P)
@@ -318,7 +334,7 @@
icon_state = "conveyor0"
name = "conveyor belt assembly"
desc = "A conveyor belt assembly."
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
var/id = "" //inherited by the belt
/obj/item/conveyor_construct/attackby(obj/item/I, mob/user, params)
@@ -345,7 +361,7 @@
desc = "A conveyor control switch assembly."
icon = 'icons/obj/recycling.dmi'
icon_state = "switch-off"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
var/id = "" //inherited by the switch
/obj/item/conveyor_switch_construct/New()
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 4e720f39c00..73fbb455835 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -175,6 +175,27 @@
to_chat(user, "You can only attach the [nicetype] if the floor plating is removed.")
return
+ if(istype(I, /obj/item/weapon/wrench))
+ if(anchored)
+ anchored = 0
+ if(ispipe)
+ level = 2
+ density = 0
+ else
+ density = 1
+ to_chat(user, "You detach the [nicetype] from the underfloor.")
+ else
+ anchored = 1
+ if(ispipe)
+ level = 1 // We don't want disposal bins to disappear under the floors
+ density = 0
+ else
+ density = 1 // We don't want disposal bins or outlets to go density 0
+ to_chat(user, "You attach the [nicetype] to the underfloor.")
+ playsound(src.loc, I.usesound, 100, 1)
+ update()
+ return
+
var/obj/structure/disposalpipe/CP = locate() in T
if(ptype>=6 && ptype <= 8) // Disposal or outlet
if(CP) // There's something there
@@ -194,34 +215,13 @@
to_chat(user, "There is already a [nicetype] at that location.")
return
-
- if(istype(I, /obj/item/weapon/wrench))
- if(anchored)
- anchored = 0
- if(ispipe)
- level = 2
- density = 0
- else
- density = 1
- to_chat(user, "You detach the [nicetype] from the underfloor.")
- else
- anchored = 1
- if(ispipe)
- level = 1 // We don't want disposal bins to disappear under the floors
- density = 0
- else
- density = 1 // We don't want disposal bins or outlets to go density 0
- to_chat(user, "You attach the [nicetype] to the underfloor.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- update()
-
- else if(istype(I, /obj/item/weapon/weldingtool))
+ if(istype(I, /obj/item/weapon/weldingtool))
if(anchored)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "Welding the [nicetype] in place.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "The [nicetype] has been welded in place!")
update() // TODO: Make this neat
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 6691df19a1d..6a97d71ed68 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -74,12 +74,12 @@
return
if(mode==0) // It's off but still not unscrewed
mode=-1 // Set it to doubleoff l0l
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(mode==-1)
mode=0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1)
@@ -88,10 +88,10 @@
return
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "You start slicing the floorweld off the disposal unit.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the disposal unit.")
var/obj/structure/disposalconstruct/C = new (src.loc)
@@ -130,15 +130,16 @@
if(do_after(usr, 20, target = GM))
GM.forceMove(src)
for(var/mob/C in viewers(src))
- C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3)
+ C.show_message("[GM.name] has been placed in the [src] by [user]. ", 3)
qdel(G)
- usr.attack_log += text("\[[time_stamp()]\] Has placed [key_name(GM)] in disposals. ")
- GM.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [key_name(user)] ")
+ usr.create_attack_log("Has placed [key_name(GM)] in disposals. ")
+ GM.create_attack_log("Has been placed in disposals by [key_name(user)] ")
if(GM.ckey)
msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(GM)] in a disposals unit. (JMP )")
return
- if(!I) return
+ if(!I)
+ return
if(!user.drop_item())
return
@@ -180,8 +181,8 @@
msg = "[user.name] stuffs [target.name] into the [src]!"
to_chat(user, "You stuff [target.name] into the [src]!")
- user.attack_log += text("\[[time_stamp()]\] Has placed [key_name(target)] in disposals. ")
- target.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [key_name(user)] ")
+ user.create_attack_log("Has placed [key_name(target)] in disposals. ")
+ target.create_attack_log("Has been placed in disposals by [key_name(user)] ")
if(target.ckey)
msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(target)] in a disposals unit")
else
@@ -209,7 +210,8 @@
// leave the disposal
/obj/machinery/disposal/proc/go_out(mob/user)
- user.forceMove(loc)
+ if(user)
+ user.forceMove(loc)
update()
// ai as human but can't flush
@@ -229,7 +231,7 @@
return
if(user && user.loc == src)
- to_chat(usr, "\red You cannot reach the controls from inside.")
+ to_chat(usr, "You cannot reach the controls from inside. ")
return
// Clumsy folks can only flush it.
@@ -270,11 +272,11 @@
/obj/machinery/disposal/Topic(href, href_list)
if(usr.loc == src)
- to_chat(usr, "\red You cannot reach the controls from inside.")
+ to_chat(usr, "You cannot reach the controls from inside. ")
return
if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1
- to_chat(usr, "\red The disposal units power is disabled.")
+ to_chat(usr, "The disposal units power is disabled. ")
return
if(..())
@@ -456,7 +458,7 @@
H.vent_gas(loc)
qdel(H)
-/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover,/obj/item) && mover.throwing)
var/obj/item/I = mover
if(istype(I, /obj/item/projectile))
@@ -465,12 +467,13 @@
I.loc = src
for(var/mob/M in viewers(src))
M.show_message("\the [I] lands in \the [src].", 3)
+ update()
else
for(var/mob/M in viewers(src))
M.show_message("\the [I] bounces off of \the [src]'s rim!.", 3)
return 0
else
- return ..(mover, target, height, air_group)
+ return ..(mover, target, height)
/obj/machinery/disposal/singularity_pull(S, current_size)
@@ -498,7 +501,7 @@
var/hasmob = 0 //If it contains a mob
Destroy()
- qdel(gas)
+ QDEL_NULL(gas)
active = 0
return ..()
@@ -530,14 +533,18 @@
has_fat_guy = 1 // set flag on holder
if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
var/obj/structure/bigDelivery/T = AM
- src.destinationTag = T.sortTag
+ destinationTag = T.sortTag
if(istype(AM, /obj/item/smallDelivery) && !hasmob)
var/obj/item/smallDelivery/T = AM
- src.destinationTag = T.sortTag
+ destinationTag = T.sortTag
//Drones can mail themselves through maint.
if(istype(AM, /mob/living/silicon/robot/drone))
var/mob/living/silicon/robot/drone/drone = AM
- src.destinationTag = drone.mail_destination
+ destinationTag = drone.mail_destination
+ if(istype(AM, /obj/item/shippingPackage) && !hasmob)
+ var/obj/item/shippingPackage/sp = AM
+ if(sp.sealed) //only sealed packages get delivered to their intended destination
+ destinationTag = sp.sortTag
// start the movement process
@@ -867,29 +874,22 @@
//weldingtool: unfasten and convert to obj/disposalconstruct
/obj/structure/disposalpipe/attackby(var/obj/item/I, var/mob/user, params)
-
- var/turf/T = src.loc
+ var/turf/T = get_turf(src)
if(T.intact)
return // prevent interaction with T-scanner revealed pipes
- src.add_fingerprint(user)
+
+ add_fingerprint(user)
+
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = I
-
- if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
- // check if anything changed over 2 seconds
- var/turf/uloc = user.loc
- var/atom/wloc = W.loc
- to_chat(user, "Slicing the disposal pipe.")
- sleep(30)
- if(!W.isOn()) return
- if(user.loc == uloc && wloc == W.loc)
+ if(W.remove_fuel(0, user))
+ to_chat(user, "You begin slicing \the [src]. ")
+ playsound(loc, W.usesound, 100, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
+ to_chat(user, "You finish slicing \the [src]. ")
welded()
- else
- to_chat(user, "You must stay still while welding the pipe.")
else
- to_chat(user, "You need more welding fuel to cut the pipe.")
- return
+ to_chat(user, "You need more welding fuel to cut the pipe. ")
// called when pipe is cut with welder
/obj/structure/disposalpipe/proc/welded()
@@ -987,7 +987,7 @@
/obj/structure/disposalpipe/sortjunction
icon_state = "pipe-j1s"
- var/sortType = 0 //Look at the list called TAGGERLOCATIONS in setup.dm
+ var/sortType = 0 //Look at the list called TAGGERLOCATIONS in /code/_globalvars/lists/flavor_misc.dm
var/posdir = 0
var/negdir = 0
var/sortdir = 0
@@ -1028,7 +1028,7 @@
sortType = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
- to_chat(user, "\blue Changed filter to [tag]")
+ to_chat(user, "Changed filter to [tag] ")
updatedesc()
@@ -1148,6 +1148,19 @@
update()
return
+/obj/structure/disposalpipe/trunk/Destroy()
+ if(istype(linked, /obj/structure/disposaloutlet))
+ var/obj/structure/disposaloutlet/O = linked
+ O.expel(animation = 0)
+ else if(istype(linked, /obj/machinery/disposal))
+ var/obj/machinery/disposal/D = linked
+ if(D.trunk == src)
+ D.go_out()
+ D.trunk = null
+
+ linked = null
+ return ..()
+
/obj/structure/disposalpipe/trunk/proc/getlinked()
linked = null
var/obj/machinery/disposal/D = locate() in src.loc
@@ -1192,19 +1205,14 @@
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
- // check if anything changed over 2 seconds
- var/turf/uloc = user.loc
- var/atom/wloc = W.loc
- to_chat(user, "Slicing the disposal pipe.")
- sleep(30)
- if(!W.isOn()) return
- if(user.loc == uloc && wloc == W.loc)
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "Slicing the disposal pipe. ")
+ if(do_after(user, 30 * W.toolspeed, target = src))
+ if(!W.isOn())
+ return
welded()
- else
- to_chat(user, "You must stay still while welding the pipe.")
else
- to_chat(user, "You need more welding fuel to cut the pipe.")
+ to_chat(user, "You need more welding fuel to cut the pipe. ")
return
// would transfer to next pipe segment, but we are in a trunk
@@ -1283,16 +1291,17 @@
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
- proc/expel(var/obj/structure/disposalholder/H)
+ proc/expel(var/obj/structure/disposalholder/H, animation = 1)
- flick("outlet-open", src)
- playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
- sleep(20) //wait until correct animation frame
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ if(animation)
+ flick("outlet-open", src)
+ playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
+ sleep(20) //wait until correct animation frame
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
if(H)
for(var/atom/movable/AM in H)
- AM.loc = src.loc
+ AM.forceMove(loc)
AM.pipe_eject(dir)
if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
spawn(5)
@@ -1301,7 +1310,6 @@
H.vent_gas(src.loc)
qdel(H)
- return
attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
@@ -1310,20 +1318,20 @@
if(istype(I, /obj/item/weapon/screwdriver))
if(mode==0)
mode=1
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(mode==1)
mode=0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "You start slicing the floorweld off the disposal outlet.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the disposal outlet.")
var/obj/structure/disposalconstruct/C = new (src.loc)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 7f7b3bfbb45..52db1f8d30c 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -35,6 +35,16 @@
sortTag = O.currTag
playsound(loc, 'sound/machines/twobeep.ogg', 100, 1)
+ else if(istype(W, /obj/item/shippingPackage))
+ var/obj/item/shippingPackage/sp = W
+ if(sp.sealed)
+ return
+ else
+ sortTag = sp.sortTag
+ to_chat(user, "You rip the label off the shipping package and affix it to [src]. ")
+ qdel(sp)
+ playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
+
else if(istype(W, /obj/item/weapon/pen))
var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN)
if(!str || !length(str))
@@ -89,6 +99,16 @@
sortTag = O.currTag
playsound(loc, 'sound/machines/twobeep.ogg', 100, 1)
+ else if(istype(W, /obj/item/shippingPackage))
+ var/obj/item/shippingPackage/sp = W
+ if(sp.sealed)
+ return
+ else
+ sortTag = sp.sortTag
+ to_chat(user, "You rip the label off the shipping package and affix it to [src]. ")
+ qdel(sp)
+ playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
+
else if(istype(W, /obj/item/weapon/pen))
var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN)
if(!str || !length(str))
@@ -134,7 +154,7 @@
- if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box)))
+ if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box) && !istype(target, /obj/item/shippingPackage)))
var/obj/item/O = target
if(use(1))
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
@@ -182,7 +202,7 @@
return
user.visible_message("[user] wraps [target]. ")
- user.attack_log += text("\[[time_stamp()]\] Has used [name] on [target] ")
+ user.create_attack_log("Has used [name] on [target] ")
if(amount <= 0 && !src.loc) //if we used our last wrapping paper, drop a cardboard tube
new /obj/item/weapon/c_tube( get_turf(user) )
@@ -196,7 +216,7 @@
//The whole system for the sorttype var is determined based on the order of this list,
//disposals must always be 1, since anything that's untagged will automatically go to disposals, or sorttype = 1 --Superxpdude
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
item_state = "electronic"
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -235,101 +255,179 @@
var/c_mode = 0
- New()
- ..()
- spawn(5)
- trunk = locate() in src.loc
- if(trunk)
- trunk.linked = src // link the pipe trunk to self
+/obj/machinery/disposal/deliveryChute/New()
+ ..()
+ spawn(5)
+ trunk = locate() in src.loc
+ if(trunk)
+ trunk.linked = src // link the pipe trunk to self
- interact()
- return
+/obj/machinery/disposal/deliveryChute/interact()
+ return
- update()
- return
+/obj/machinery/disposal/deliveryChute/update()
+ return
- Bumped(var/atom/movable/AM) //Go straight into the chute
- if(istype(AM, /obj/item/projectile)) return
- switch(dir)
- if(NORTH)
- if(AM.loc.y != src.loc.y+1) return
- if(EAST)
- if(AM.loc.x != src.loc.x+1) return
- if(SOUTH)
- if(AM.loc.y != src.loc.y-1) return
- if(WEST)
- if(AM.loc.x != src.loc.x-1) return
+/obj/machinery/disposal/deliveryChute/Bumped(atom/movable/AM) //Go straight into the chute
+ if(istype(AM, /obj/item/projectile)) return
+ switch(dir)
+ if(NORTH)
+ if(AM.loc.y != src.loc.y+1) return
+ if(EAST)
+ if(AM.loc.x != src.loc.x+1) return
+ if(SOUTH)
+ if(AM.loc.y != src.loc.y-1) return
+ if(WEST)
+ if(AM.loc.x != src.loc.x-1) return
- if(istype(AM, /obj))
- var/obj/O = AM
- O.loc = src
- else if(istype(AM, /mob))
- var/mob/M = AM
- M.loc = src
- src.flush()
+ if(istype(AM, /obj))
+ var/obj/O = AM
+ O.loc = src
+ else if(istype(AM, /mob))
+ var/mob/M = AM
+ M.loc = src
+ src.flush()
- flush()
- flushing = 1
- flick("intake-closing", src)
- var/deliveryCheck = 0
- var/obj/structure/disposalholder/H = new() // virtual holder object which actually
+/obj/machinery/disposal/deliveryChute/flush()
+ flushing = 1
+ flick("intake-closing", src)
+ var/deliveryCheck = 0
+ var/obj/structure/disposalholder/H = new() // virtual holder object which actually
// travels through the pipes.
- for(var/obj/structure/bigDelivery/O in src)
- deliveryCheck = 1
- if(O.sortTag == 0)
- O.sortTag = 1
- for(var/obj/item/smallDelivery/O in src)
- deliveryCheck = 1
- if(O.sortTag == 0)
- O.sortTag = 1
- if(deliveryCheck == 0)
- H.destinationTag = 1
+ for(var/obj/structure/bigDelivery/O in src)
+ deliveryCheck = 1
+ if(O.sortTag == 0)
+ O.sortTag = 1
+ for(var/obj/item/smallDelivery/O in src)
+ deliveryCheck = 1
+ if(O.sortTag == 0)
+ O.sortTag = 1
+ for(var/obj/item/shippingPackage/O in src)
+ deliveryCheck = 1
+ if(!O.sealed || O.sortTag == 0) //unsealed or untagged shipping packages will default to disposals
+ O.sortTag = 1
+ if(deliveryCheck == 0)
+ H.destinationTag = 1
- sleep(10)
- playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
- sleep(5) // wait for animation to finish
+ sleep(10)
+ playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
+ sleep(5) // wait for animation to finish
- H.init(src) // copy the contents of disposer to holder
- air_contents = new() // The holder just took our gas; replace it
- H.start(src) // start the holder processing movement
- flushing = 0
- // now reset disposal state
- flush = 0
- if(mode == 2) // if was ready,
- mode = 1 // switch to charging
- update()
+ H.init(src) // copy the contents of disposer to holder
+ air_contents = new() // The holder just took our gas; replace it
+ H.start(src) // start the holder processing movement
+ flushing = 0
+ // now reset disposal state
+ flush = 0
+ if(mode == 2) // if was ready,
+ mode = 1 // switch to charging
+ update()
+ return
+
+/obj/machinery/disposal/deliveryChute/attackby(obj/item/I, mob/user, params)
+ if(!I || !user)
return
- attackby(var/obj/item/I, var/mob/user, params)
- if(!I || !user)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(c_mode==0)
+ c_mode=1
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, "You remove the screws around the power connection.")
+ return
+ else if(c_mode==1)
+ c_mode=0
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, "You attach the screws around the power connection.")
+ return
+ else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1)
+ var/obj/item/weapon/weldingtool/W = I
+ if(W.remove_fuel(0,user))
+ playsound(src.loc, W.usesound, 100, 1)
+ to_chat(user, "You start slicing the floorweld off the delivery chute.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ if(!src || !W.isOn()) return
+ to_chat(user, "You sliced the floorweld off the delivery chute.")
+ var/obj/structure/disposalconstruct/C = new (src.loc)
+ C.ptype = 8 // 8 = Delivery chute
+ C.update()
+ C.anchored = 1
+ C.density = 1
+ qdel(src)
+ return
+ else
+ to_chat(user, "You need more welding fuel to complete this task.")
return
- if(istype(I, /obj/item/weapon/screwdriver))
- if(c_mode==0)
- c_mode=1
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "You remove the screws around the power connection.")
- return
- else if(c_mode==1)
- c_mode=0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- to_chat(user, "You attach the screws around the power connection.")
- return
- else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1)
- var/obj/item/weapon/weldingtool/W = I
- if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
- to_chat(user, "You start slicing the floorweld off the delivery chute.")
- if(do_after(user,20, target = src))
- if(!src || !W.isOn()) return
- to_chat(user, "You sliced the floorweld off the delivery chute.")
- var/obj/structure/disposalconstruct/C = new (src.loc)
- C.ptype = 8 // 8 = Delivery chute
- C.update()
- C.anchored = 1
- C.density = 1
- qdel(src)
- return
- else
- to_chat(user, "You need more welding fuel to complete this task.")
+
+/obj/item/shippingPackage
+ name = "Shipping package"
+ desc = "A pre-labeled package for shipping an item to coworkers."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "shippack"
+ var/obj/item/wrapped = null
+ var/sortTag = 0
+ var/sealed = 0
+
+/obj/item/shippingPackage/attackby(obj/item/O, mob/user, params)
+ if(sealed)
+ if(istype(O, /obj/item/weapon/pen))
+ var/str = copytext(sanitize(input(user,"Intended recipient?","Address","")),1,MAX_NAME_LEN)
+ if(!str || !length(str))
+ to_chat(user, "Invalid text. ")
return
+ user.visible_message("[user] addresses [src] to [str]. ")
+ name = "Shipping package (RE: [str])"
+ return
+ if(wrapped)
+ to_chat(user, "[src] already contains \a [wrapped]. ")
+ return
+ if(istype(O, /obj/item) && !istype(O, /obj/item/weapon/storage) && !istype(O, /obj/item/shippingPackage))
+ if(!user.canUnEquip(O))
+ to_chat(user, "[O] is stuck to your hand, you cannot put it in [src]! ")
+ return
+ if(O.w_class > 3)
+ to_chat(user, "[O] is too large to fit in [src]. ")
+ else
+ wrapped = O
+ user.unEquip(O)
+ O.forceMove(src)
+ O.add_fingerprint(usr)
+ add_fingerprint(usr)
+ to_chat(user, "You put [O] in [src]. ")
+
+/obj/item/shippingPackage/attack_self(mob/user)
+ if(sealed)
+ to_chat(user, "You tear open [src], dropping the contents onto the floor. ")
+ playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ user.unEquip(src)
+ wrapped.forceMove(get_turf(user))
+ wrapped = null
+ qdel(src)
+ else if(wrapped)
+ switch(alert("Select an action:",, "Remove Object", "Seal Package", "Cancel"))
+ if("Remove Object")
+ to_chat(user, "You shake out [src]'s contents onto the floor. ")
+ wrapped.forceMove(get_turf(user))
+ wrapped = null
+ if("Seal Package")
+ to_chat(user, "You seal [src], preparing it for delivery. ")
+ icon_state = "shippack_sealed"
+ sealed = 1
+ update_desc()
+ else
+ if(alert("Do you want to tear up the package?",, "Yes", "No") == "Yes")
+ to_chat(user, "You shred [src]. ")
+ playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ user.unEquip(src)
+ qdel(src)
+
+/obj/item/shippingPackage/proc/update_desc()
+ desc = "A pre-labeled package for shipping an item to coworkers."
+ if(sortTag)
+ desc += " The label says \"Deliver to [TAGGERLOCATIONS[sortTag]]\"."
+ if(!sealed)
+ desc += " The package is not sealed."
+
+/obj/item/shippingPackage/Destroy()
+ QDEL_NULL(wrapped)
+ return ..()
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 82bf6b43989..9e411abaee3 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -19,6 +19,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
var/list/categories = list(
"AI Modules",
"Computer Boards",
+ "Computer Parts",
"Engineering Machinery",
"Exosuit Modules",
"Hydroponics Machinery",
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 06dbba8d62e..26f9413bc5f 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -43,7 +43,8 @@ other types of metals and chemistry for reagents).
var/build_type = null //Flag as to what kind machine the design is built in. See defines.
var/list/materials = list() //List of materials. Format: "id" = amount.
var/construction_time //Amount of time required for building the object
- var/build_path = "" //The file path of the object that gets created
+ var/build_path = null //The file path of the object that gets created
+ var/list/make_reagents = list() //Reagents produced. Format: "id" = amount. Currently only supported by the biogenerator.
var/locked = 0 //If true it will spawn inside a lockbox with currently sec access
var/access_requirement = list(access_armory) //What special access requirements will the lockbox have? Defaults to armory.
var/category = null //Primarily used for Mech Fabricators, but can be used for anything
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index f34d9797124..29370cbc04b 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -2,14 +2,6 @@
//////////Autolathe Designs ///////
///////////////////////////////////
-/datum/design/analyzer
- name = "Analyzer"
- id = "analyzer"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- build_path = /obj/item/device/analyzer
- category = list("initial","Tools")
-
/datum/design/bucket
name = "Bucket"
id = "bucket"
@@ -26,14 +18,6 @@
build_path = /obj/item/weapon/crowbar
category = list("initial","Tools")
-/datum/design/extinguisher
- name = "Fire Extinguisher"
- id = "extinguisher"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 90)
- build_path = /obj/item/weapon/extinguisher
- category = list("initial","Tools")
-
/datum/design/flashlight
name = "Flashlight"
id = "flashlight"
@@ -42,6 +26,14 @@
build_path = /obj/item/device/flashlight
category = list("initial","Tools")
+/datum/design/extinguisher
+ name = "Fire Extinguisher"
+ id = "extinguisher"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 90)
+ build_path = /obj/item/weapon/extinguisher
+ category = list("initial","Tools")
+
/datum/design/multitool
name = "Multitool"
id = "multitool"
@@ -50,12 +42,12 @@
build_path = /obj/item/device/multitool
category = list("initial","Tools")
-/datum/design/screwdriver
- name = "Screwdriver"
- id = "screwdriver"
+/datum/design/analyzer
+ name = "Analyzer"
+ id = "analyzer"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 75)
- build_path = /obj/item/weapon/screwdriver
+ materials = list(MAT_METAL = 30, MAT_GLASS = 20)
+ build_path = /obj/item/device/analyzer
category = list("initial","Tools")
/datum/design/tscanner
@@ -66,6 +58,46 @@
build_path = /obj/item/device/t_scanner
category = list("initial","Tools")
+/datum/design/weldingtool
+ name = "Welding Tool"
+ id = "welding_tool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 70, MAT_GLASS = 20)
+ build_path = /obj/item/weapon/weldingtool
+ category = list("initial","Tools")
+
+/datum/design/mini_weldingtool
+ name = "Emergency welding tool"
+ id = "mini_welding_tool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30, MAT_GLASS = 10)
+ build_path = /obj/item/weapon/weldingtool/mini
+ category = list("initial","Tools")
+
+/datum/design/screwdriver
+ name = "Screwdriver"
+ id = "screwdriver"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75)
+ build_path = /obj/item/weapon/screwdriver
+ category = list("initial","Tools")
+
+/datum/design/wirecutters
+ name = "Wirecutters"
+ id = "wirecutters"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 80)
+ build_path = /obj/item/weapon/wirecutters
+ category = list("initial","Tools")
+
+/datum/design/wrench
+ name = "Wrench"
+ id = "wrench"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150)
+ build_path = /obj/item/weapon/wrench
+ category = list("initial","Tools")
+
/datum/design/welding_helmet
name = "Welding Helmet"
id = "welding_helmet"
@@ -83,44 +115,28 @@
category = list("initial","Tools")
maxstack = 30
-/datum/design/weldingtool
- name = "Welding Tool"
- id = "welding_tool"
+/datum/design/toolbox
+ name = "Toolbox"
+ id = "tool_box"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 70, MAT_GLASS = 20)
- build_path = /obj/item/weapon/weldingtool
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/weapon/storage/toolbox
category = list("initial","Tools")
-/datum/design/wirecutters
- name = "Wirecutters"
- id = "wirecutters"
+/datum/design/console_screen
+ name = "Console Screen"
+ id = "console_screen"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 80)
- build_path = /obj/item/weapon/wirecutters
- category = list("initial","Tools")
+ materials = list(MAT_GLASS = 200)
+ build_path = /obj/item/weapon/stock_parts/console_screen
+ category = list("initial", "Electronics")
-/datum/design/wrench
- name = "Wrench"
- id = "wrench"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150)
- build_path = /obj/item/weapon/wrench
- category = list("initial","Tools")
-
-/datum/design/spraycan
- name = "Spraycan"
- id = "spraycan"
+/datum/design/apc_board
+ name = "APC module"
+ id = "power control"
build_type = AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
- build_path = /obj/item/toy/crayon/spraycan
- category = list("initial", "Tools")
-
-/datum/design/airalarm_electronics
- name = "Air Alarm Electronics"
- id = "airalarm_electronics"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/weapon/airalarm_electronics
+ build_path = /obj/item/weapon/apc_electronics
category = list("initial", "Electronics")
/datum/design/airlock_board
@@ -131,28 +147,20 @@
build_path = /obj/item/weapon/airlock_electronics
category = list("initial", "Electronics")
-/datum/design/apc_electronics
- name="Power Control Module"
- id = "apc_electronics"
+/datum/design/firelock_board
+ name = "Firelock Electronics"
+ id = "firelock_board"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/weapon/apc_electronics
+ build_path = /obj/item/weapon/firelock_electronics
category = list("initial", "Electronics")
-/datum/design/intercom_electronics
- name = "Intercom Electronics"
- id = "intercom_electronics"
+/datum/design/airalarm_electronics
+ name = "Air Alarm Electronics"
+ id = "airalarm_electronics"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/weapon/intercom_electronics
- category = list("initial", "Electronics")
-
-/datum/design/console_screen
- name = "Console Screen"
- id = "console_screen"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 200)
- build_path = /obj/item/weapon/stock_parts/console_screen
+ build_path = /obj/item/weapon/airalarm_electronics
category = list("initial", "Electronics")
/datum/design/firealarm_electronics
@@ -163,52 +171,144 @@
build_path = /obj/item/weapon/firealarm_electronics
category = list("initial", "Electronics")
-/datum/design/igniter
- name = "Igniter"
- id = "igniter"
+/datum/design/intercom_electronics
+ name = "Intercom Electronics"
+ id = "intercom_electronics"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/device/assembly/igniter
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/weapon/intercom_electronics
+ category = list("initial", "Electronics")
+
+/datum/design/earmuffs
+ name = "Earmuffs"
+ id = "earmuffs"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/clothing/ears/earmuffs
category = list("initial", "Miscellaneous")
-/datum/design/infrared_emitter
- name = "Infrared Emitter"
- id = "infrared_emitter"
+/datum/design/pipe_painter
+ name = "Pipe Painter"
+ id = "pipe_painter"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
- build_path = /obj/item/device/assembly/infra
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
+ build_path = /obj/item/device/pipe_painter
category = list("initial", "Miscellaneous")
-/datum/design/health_sensor
- name = "Health sensor"
- id = "health_sensor"
+/datum/design/floorpainter
+ name = "Floor painter"
+ id = "floor_painter"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 800, MAT_GLASS = 200)
- build_path = /obj/item/device/assembly/health
- category = list("initial", "Medical")
+ materials = list(MAT_METAL = 150, MAT_GLASS = 125)
+ build_path = /obj/item/device/floor_painter
+ category = list("initial", "Miscellaneous")
+
+/datum/design/metal
+ name = "Metal"
+ id = "metal"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/metal
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/glass
+ name = "Glass"
+ id = "glass"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/glass
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/rglass
+ name = "Reinforced Glass"
+ id = "rglass"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/rglass
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/rods
+ name = "Metal Rod"
+ id = "rods"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000)
+ build_path = /obj/item/stack/rods
+ category = list("initial","Construction")
+ maxstack = 50
+
+/datum/design/rcd_ammo
+ name = "Compressed Matter Cardridge"
+ id = "rcd_ammo"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 16000, MAT_GLASS=8000)
+ build_path = /obj/item/weapon/rcd_ammo
+ category = list("initial","Construction")
/datum/design/kitchen_knife
- name = "Kitchen knife"
+ name = "Kitchen Knife"
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
build_path = /obj/item/weapon/kitchen/knife
- category = list("initial","Miscellaneous")
+ category = list("initial","Dinnerware")
-/datum/design/minihoe
- name = "Mini hoe"
- id = "mini_hoe"
+/datum/design/fork
+ name = "Fork"
+ id = "fork"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 50)
- build_path = /obj/item/weapon/minihoe
+ materials = list(MAT_METAL = 80)
+ build_path = /obj/item/weapon/kitchen/utensil/fork
+ category = list("initial","Dinnerware")
+
+/datum/design/tray
+ name = "Tray"
+ id = "tray"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 3000)
+ build_path = /obj/item/weapon/storage/bag/tray
+ category = list("initial","Dinnerware")
+
+/datum/design/drinking_glass
+ name = "Drinking glass"
+ id = "drinking_glass"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/weapon/reagent_containers/food/drinks/drinkingglass
+ category = list("initial","Dinnerware")
+
+/datum/design/shot_glass
+ name = "Shot glass"
+ id = "shot_glass"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 100)
+ build_path = /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass
+ category = list("initial","Dinnerware")
+
+/datum/design/shaker
+ name = "Shaker"
+ id = "shaker"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1500)
+ build_path = /obj/item/weapon/reagent_containers/food/drinks/shaker
+ category = list("initial","Dinnerware")
+
+/datum/design/cultivator
+ name = "Cultivator"
+ id = "cultivator"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL=50)
+ build_path = /obj/item/weapon/cultivator
category = list("initial","Miscellaneous")
/datum/design/plant_analyzer
- name = "Plant analyzer"
+ name = "Plant Analyzer"
id = "plant_analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- build_path = /obj/item/device/analyzer/plant_analyzer
+ build_path = /obj/item/device/plant_analyzer
category = list("initial","Miscellaneous")
/datum/design/shovel
@@ -235,37 +335,125 @@
build_path = /obj/item/weapon/hatchet
category = list("initial","Miscellaneous")
-/datum/design/pipe_painter
- name = "Pipe Painter"
- id = "pipe_painter"
+/datum/design/scalpel
+ name = "Scalpel"
+ id = "scalpel"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
- build_path = /obj/item/device/pipe_painter
- category = list("initial", "Miscellaneous")
+ materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
+ build_path = /obj/item/weapon/scalpel
+ category = list("initial", "Medical")
-/datum/design/prox_sensor
- name = "Proximity Sensor"
- id = "prox_sensor"
+/datum/design/circular_saw
+ name = "Circular Saw"
+ id = "circular_saw"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 800, MAT_GLASS = 200)
- build_path = /obj/item/device/assembly/prox_sensor
- category = list("initial", "Miscellaneous")
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
+ build_path = /obj/item/weapon/circular_saw
+ category = list("initial", "Medical")
-/datum/design/mousetrap
- name = "Mousetrap"
- id = "mousetrap"
+/datum/design/surgicaldrill
+ name = "Surgical Drill"
+ id = "surgicaldrill"
build_type = AUTOLATHE
- materials = list(MAT_METAL = 800, MAT_GLASS = 200)
- build_path = /obj/item/device/assembly/mousetrap
- category = list("initial", "Miscellaneous")
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
+ build_path = /obj/item/weapon/surgicaldrill
+ category = list("initial", "Medical")
-/datum/design/timer
- name = "Timer"
- id = "timer"
+/datum/design/retractor
+ name = "Retractor"
+ id = "retractor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
+ build_path = /obj/item/weapon/retractor
+ category = list("initial", "Medical")
+
+/datum/design/cautery
+ name = "Cautery"
+ id = "cautery"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
+ build_path = /obj/item/weapon/cautery
+ category = list("initial", "Medical")
+
+/datum/design/hemostat
+ name = "Hemostat"
+ id = "hemostat"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
+ build_path = /obj/item/weapon/hemostat
+ category = list("initial", "Medical")
+
+/datum/design/bonesetter
+ name = "Bone Setter"
+ id = "bonesetter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/weapon/bonesetter
+ category = list("initial", "Medical")
+
+/datum/design/fixovein
+ name = "FixOVein"
+ id = "fixovein"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 3000)
+ build_path = /obj/item/weapon/FixOVein
+ category = list("initial", "Medical")
+
+/datum/design/bonegel
+ name = "Bone Gel"
+ id = "bonegel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 6000)
+ build_path = /obj/item/weapon/bonegel
+ category = list("initial", "Medical")
+
+/datum/design/beaker
+ name = "Beaker"
+ id = "beaker"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker
+ category = list("initial", "Medical")
+
+/datum/design/large_beaker
+ name = "Large Beaker"
+ id = "large_beaker"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 2500)
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker/large
+ category = list("initial", "Medical")
+
+/datum/design/healthanalyzer
+ name = "Health Analyzer"
+ id = "healthanalyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/device/assembly/timer
- category = list("initial", "Miscellaneous")
+ build_path = /obj/item/device/healthanalyzer
+ category = list("initial", "Medical")
+
+/datum/design/beanbag_slug
+ name = "Beanbag Slug"
+ id = "beanbag_slug"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 250)
+ build_path = /obj/item/ammo_casing/shotgun/beanbag
+ category = list("initial", "Security")
+
+/datum/design/rubbershot
+ name = "Rubber shot"
+ id = "rubber_shot"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/rubbershot
+ category = list("initial", "Security")
+
+/datum/design/c38
+ name = "Speed Loader (.38)"
+ id = "c38"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c38
+ category = list("initial", "Security")
/datum/design/recorder
name = "Universal Recorder"
@@ -283,6 +471,62 @@
build_path = /obj/item/device/tape/random
category = list("initial", "Miscellaneous")
+/datum/design/igniter
+ name = "Igniter"
+ id = "igniter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/device/assembly/igniter
+ category = list("initial", "Miscellaneous")
+
+/datum/design/signaler
+ name = "Remote Signaling Device"
+ id = "signaler"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 120)
+ build_path = /obj/item/device/assembly/signaler
+ category = list("initial", "Communication")
+
+/datum/design/radio_headset
+ name = "Radio Headset"
+ id = "radio_headset"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75)
+ build_path = /obj/item/device/radio/headset
+ category = list("initial", "Communication")
+
+/datum/design/bounced_radio
+ name = "Station Bounced Radio"
+ id = "bounced_radio"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 75, MAT_GLASS = 25)
+ build_path = /obj/item/device/radio/off
+ category = list("initial", "Communication")
+
+/datum/design/infrared_emitter
+ name = "Infrared Emitter"
+ id = "infrared_emitter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
+ build_path = /obj/item/device/assembly/infra
+ category = list("initial", "Miscellaneous")
+
+/datum/design/health_sensor
+ name = "Health sensor"
+ id = "health_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/device/assembly/health
+ category = list("initial", "Medical")
+
+/datum/design/timer
+ name = "Timer"
+ id = "timer"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/device/assembly/timer
+ category = list("initial", "Miscellaneous")
+
/datum/design/voice_analyser
name = "Voice Analyser"
id = "voice_analyser"
@@ -291,6 +535,271 @@
build_path = /obj/item/device/assembly/voice
category = list("initial", "Miscellaneous")
+/datum/design/light_tube
+ name = "Light Tube"
+ id = "light_tube"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 100)
+ build_path = /obj/item/weapon/light/tube
+ category = list("initial", "Construction")
+
+/datum/design/light_bulb
+ name = "Light Bulb"
+ id = "light_bulb"
+ build_type = AUTOLATHE
+ materials = list(MAT_GLASS = 100)
+ build_path = /obj/item/weapon/light/bulb
+ category = list("initial", "Construction")
+
+/datum/design/camera_assembly
+ name = "Camera Assembly"
+ id = "camera_assembly"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 250)
+ build_path = /obj/item/weapon/camera_assembly
+ category = list("initial", "Construction")
+
+/datum/design/newscaster_frame
+ name = "Newscaster Frame"
+ id = "newscaster_frame"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
+ build_path = /obj/item/mounted/frame/newscaster_frame
+ category = list("initial", "Construction")
+
+/datum/design/syringe
+ name = "Syringe"
+ id = "syringe"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10, MAT_GLASS = 20)
+ build_path = /obj/item/weapon/reagent_containers/syringe
+ category = list("initial", "Medical")
+
+/datum/design/prox_sensor
+ name = "Proximity Sensor"
+ id = "prox_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/device/assembly/prox_sensor
+ category = list("initial", "Miscellaneous")
+
+/datum/design/foam_dart
+ name = "Box of Foam Darts"
+ id = "foam_dart"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/ammo_box/foambox
+ category = list("initial", "Miscellaneous")
+
+//hacked autolathe recipes
+/datum/design/flamethrower
+ name = "Flamethrower"
+ id = "flamethrower"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/weapon/flamethrower/full
+ category = list("hacked", "Security")
+
+/datum/design/rcd
+ name = "Rapid Construction Device (RCD)"
+ id = "rcd"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/weapon/rcd
+ category = list("hacked", "Construction")
+
+/datum/design/rcl
+ name = "Rapid Cable Layer"
+ id = "rcl"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000)
+ build_path = /obj/item/weapon/twohanded/rcl
+ category = list("hacked", "Construction")
+
+/datum/design/electropack
+ name = "Electropack"
+ id = "electropack"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2500)
+ build_path = /obj/item/device/radio/electropack
+ category = list("hacked", "Tools")
+
+/datum/design/large_welding_tool
+ name = "Industrial Welding Tool"
+ id = "large_welding_tool"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 70, MAT_GLASS = 60)
+ build_path = /obj/item/weapon/weldingtool/largetank
+ category = list("hacked", "Tools")
+
+/datum/design/handcuffs
+ name = "Handcuffs"
+ id = "handcuffs"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/weapon/restraints/handcuffs
+ category = list("hacked", "Security")
+
+/datum/design/receiver
+ name = "Modular Receiver"
+ id = "receiver"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 15000)
+ build_path = /obj/item/weaponcrafting/receiver
+ category = list("hacked", "Security")
+
+/datum/design/shotgun_slug
+ name = "Shotgun Slug"
+ id = "shotgun_slug"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun
+ category = list("hacked", "Security")
+
+/datum/design/buckshot_shell
+ name = "Buckshot shell"
+ id = "buckshot_shell"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/buckshot
+ category = list("hacked", "Security")
+
+/datum/design/shotgun_dart
+ name = "Shotgun Dart"
+ id = "shotgun_dart"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/dart
+ category = list("hacked", "Security")
+
+/datum/design/incendiary_slug
+ name = "Incendiary Slug"
+ id = "incendiary_slug"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 4000)
+ build_path = /obj/item/ammo_casing/shotgun/incendiary
+ category = list("hacked", "Security")
+
+/datum/design/riot_dart
+ name = "Foam riot dart"
+ id = "riot_dart"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal!
+ build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
+ category = list("hacked", "Security")
+
+/datum/design/riot_darts
+ name = "Foam riot dart box"
+ id = "riot_darts"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 50000) //Comes with 40 darts
+ build_path = /obj/item/ammo_box/foambox/riot
+ category = list("hacked", "Security")
+
+/datum/design/a357
+ name = "Ammo Box (.357)"
+ id = "a357"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/a357
+ category = list("hacked", "Security")
+
+/datum/design/c10mm
+ name = "Ammo Box (10mm)"
+ id = "c10mm"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c10mm
+ category = list("hacked", "Security")
+
+/datum/design/c45
+ name = "Ammo Box (.45)"
+ id = "c45"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c45
+ category = list("hacked", "Security")
+
+/datum/design/c9mm
+ name = "Ammo Box (9mm)"
+ id = "c9mm"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c9mm
+ category = list("hacked", "Security")
+
+/datum/design/cleaver
+ name = "Butcher's cleaver"
+ id = "cleaver"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 18000)
+ build_path = /obj/item/weapon/kitchen/knife/butcher
+ category = list("hacked", "Dinnerware")
+
+/datum/design/spraycan
+ name = "Spraycan"
+ id = "spraycan"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 100, MAT_GLASS = 100)
+ build_path = /obj/item/toy/crayon/spraycan
+ category = list("initial", "Tools")
+
+/datum/design/desttagger
+ name = "Destination tagger"
+ id = "desttagger"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 250, MAT_GLASS = 125)
+ build_path = /obj/item/device/destTagger
+ category = list("initial", "Electronics")
+
+/datum/design/handlabeler
+ name = "Hand labeler"
+ id = "handlabel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 125)
+ build_path = /obj/item/weapon/hand_labeler
+ category = list("initial", "Electronics")
+
+/datum/design/conveyor_belt
+ name = "Conveyor belt"
+ id = "conveyor_belt"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000)
+ build_path = /obj/item/conveyor_construct
+ category = list("initial", "Construction")
+
+/datum/design/conveyor_switch
+ name = "Conveyor belt switch"
+ id = "conveyor_switch"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 450, MAT_GLASS = 190)
+ build_path = /obj/item/conveyor_switch_construct
+ category = list("initial", "Construction")
+
+/datum/design/laptop
+ name = "Laptop Frame"
+ id = "laptop"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 1000)
+ build_path = /obj/item/device/modular_computer/laptop/buildable
+ category = list("initial", "Miscellaneous")
+
+/datum/design/tablet
+ name = "Tablet Frame"
+ id = "tablet"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
+ build_path = /obj/item/device/modular_computer/tablet
+ category = list("initial", "Miscellaneous")
+
+/datum/design/mousetrap
+ name = "Mousetrap"
+ id = "mousetrap"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/device/assembly/mousetrap
+ category = list("initial", "Miscellaneous")
+
/datum/design/videocam
name = "Video Camera"
id = "videocam"
@@ -323,14 +832,6 @@
build_path = /obj/item/weapon/canvas/twentythreeXnineteen
category = list("initial", "Miscellaneous")
-/datum/design/foambox
- name = "Box of Foam Force darts"
- id = "foamforce"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 2000)
- build_path = /obj/item/ammo_box/foambox
- category = list("initial", "Miscellaneous")
-
/datum/design/canvas/twentythreeXtwentythree
name = "23px by 23px Canvas"
id = "canvas23x23"
@@ -339,363 +840,6 @@
build_path = /obj/item/weapon/canvas/twentythreeXtwentythree
category = list("initial", "Miscellaneous")
-/datum/design/camera_assembly
- name = "Camera Assembly"
- id = "camera_assembly"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 400, MAT_GLASS = 250)
- build_path = /obj/item/weapon/camera_assembly
- category = list("initial", "Construction")
-
-/datum/design/glass
- name = "Glass"
- id = "glass"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
- build_path = /obj/item/stack/sheet/glass
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/light_bulb
- name = "Light Bulb"
- id = "light_bulb"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 60, MAT_GLASS = 100)
- build_path = /obj/item/weapon/light/bulb
- category = list("initial", "Construction")
-
-/datum/design/light_tube
- name = "Light Tube"
- id = "light_tube"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 60, MAT_GLASS = 100)
- build_path = /obj/item/weapon/light/tube
- category = list("initial", "Construction")
-
-/datum/design/metal
- name = "Metal"
- id = "metal"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT)
- build_path = /obj/item/stack/sheet/metal
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/newscaster_frame
- name = "Newscaster Frame"
- id = "newscaster_frame"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
- build_path = /obj/item/mounted/frame/newscaster_frame
- category = list("initial", "Construction")
-
-/datum/design/rcd_ammo
- name = "Compressed Matter Cardridge"
- id = "rcd_ammo"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 16000, MAT_GLASS=8000)
- build_path = /obj/item/weapon/rcd_ammo
- category = list("initial","Construction")
-
-/datum/design/rglass
- name = "Reinforced Glass"
- id = "rglass"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
- build_path = /obj/item/stack/sheet/rglass
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/rods
- name = "Metal Rod"
- id = "rods"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000)
- build_path = /obj/item/stack/rods
- category = list("initial","Construction")
- maxstack = 50
-
-/datum/design/beaker
- name = "Beaker"
- id = "beaker"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 500)
- build_path = /obj/item/weapon/reagent_containers/glass/beaker
- category = list("initial", "Medical")
-
-/datum/design/cautery
- name = "Cautery"
- id = "cautery"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
- build_path = /obj/item/weapon/cautery
- category = list("initial", "Medical")
-
-/datum/design/circular_saw
- name = "Circular Saw"
- id = "circular_saw"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
- build_path = /obj/item/weapon/circular_saw
- category = list("initial", "Medical")
-
-/datum/design/hemostat
- name = "Hemostat"
- id = "hemostat"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
- build_path = /obj/item/weapon/hemostat
- category = list("initial", "Medical")
-
-/datum/design/large_beaker
- name = "Large Beaker"
- id = "large_beaker"
- build_type = AUTOLATHE
- materials = list(MAT_GLASS = 2500)
- build_path = /obj/item/weapon/reagent_containers/glass/beaker/large
- category = list("initial", "Medical")
-
-/datum/design/healthanalyzer
- name = "Health Analyzer"
- id = "healthanalyzer"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 50)
- build_path = /obj/item/device/healthanalyzer
- category = list("initial", "Medical")
-
-/datum/design/retractor
- name = "Retractor"
- id = "retractor"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
- build_path = /obj/item/weapon/retractor
- category = list("initial", "Medical")
-
-/datum/design/scalpel
- name = "Scalpel"
- id = "scalpel"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
- build_path = /obj/item/weapon/scalpel
- category = list("initial", "Medical")
-
-/datum/design/surgicaldrill
- name = "Surgical Drill"
- id = "surgicaldrill"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
- build_path = /obj/item/weapon/surgicaldrill
- category = list("initial", "Medical")
-
-/datum/design/bonesetter
- name = "Bone Setter"
- id = "bonesetter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/weapon/bonesetter
- category = list("initial", "Medical")
-
-/datum/design/fixovein
- name = "FixOVein"
- id = "fixovein"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000, MAT_GLASS = 3000)
- build_path = /obj/item/weapon/FixOVein
- category = list("initial", "Medical")
-
-/datum/design/bonegel
- name = "Bone Gel"
- id = "bonegel"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 6000)
- build_path = /obj/item/weapon/bonegel
- category = list("initial", "Medical")
-
-/datum/design/syringe
- name = "Syringe"
- id = "syringe"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10, MAT_GLASS = 20)
- build_path = /obj/item/weapon/reagent_containers/syringe
- category = list("initial", "Medical")
-
-/datum/design/beanbag_slug
- name = "Beanbag Slug"
- id = "beanbag_slug"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 250)
- build_path = /obj/item/ammo_casing/shotgun/beanbag
- category = list("initial", "Security")
-
-/datum/design/rubbershot
- name = "Rubber shot"
- id = "rubber_shot"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/rubbershot
- category = list("initial", "Security")
-
-/datum/design/c38
- name = "Speed Loader (.38)"
- id = "c38"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c38
- category = list("initial", "Security")
-
-/datum/design/radio_headset
- name = "Radio Headset"
- id = "radio_headset"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75)
- build_path = /obj/item/device/radio/headset
- category = list("initial", "Communication")
-
-/datum/design/signaler
- name = "Remote Signaling Device"
- id = "signaler"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 400, MAT_GLASS = 120)
- build_path = /obj/item/device/assembly/signaler
- category = list("initial", "Communication")
-
-/datum/design/bounced_radio
- name = "Station Bounced Radio"
- id = "bounced_radio"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 75, MAT_GLASS = 25)
- build_path = /obj/item/device/radio/off
- category = list("initial", "Communication")
-
-//hacked autolathe recipes
-/datum/design/c45
- name = "Ammo Box (.45)"
- id = "c45"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c45
- category = list("hacked", "Security")
-
-/datum/design/a357
- name = "Ammo Box (.357)"
- id = "a357"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/a357
- category = list("hacked", "Security")
-
-/datum/design/c9mm
- name = "Ammo Box (9mm)"
- id = "c9mm"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c9mm
- category = list("hacked", "Security")
-
-/datum/design/c10mm
- name = "Ammo Box (10mm)"
- id = "c10mm"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c10mm
- category = list("hacked", "Security")
-
-/datum/design/buckshot_shell
- name = "Buckshot Shell"
- id = "buckshot_shell"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/buckshot
- category = list("hacked", "Security")
-
-/datum/design/electropack
- name = "Electropack"
- id = "electropack"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 2500)
- build_path = /obj/item/device/radio/electropack
- category = list("hacked", "Tools")
-
-/datum/design/flamethrower
- name = "Flamethrower"
- id = "flamethrower"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/weapon/flamethrower/full
- category = list("hacked", "Security")
-
-/datum/design/handcuffs
- name = "Handcuffs"
- id = "handcuffs"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 500)
- build_path = /obj/item/weapon/restraints/handcuffs
- category = list("hacked", "Security")
-
-/datum/design/incendiary_slug
- name = "Incendiary Slug"
- id = "incendiary_slug"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/incendiary
- category = list("hacked", "Security")
-
-/datum/design/large_welding_tool
- name = "Industrial Welding Tool"
- id = "large_welding_tool"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 70, MAT_GLASS = 60)
- build_path = /obj/item/weapon/weldingtool/largetank
- category = list("hacked", "Tools")
-
-/datum/design/rcd
- name = "Rapid Construction Device (RCD)"
- id = "rcd"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/weapon/rcd
- category = list("hacked", "Construction")
-
-/datum/design/shotgun_dart
- name = "Shotgun Dart"
- id = "shotgun_dart"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun/dart
- category = list("hacked", "Security")
-
-/datum/design/shotgun_slug
- name = "Shotgun Slug"
- id = "shotgun_slug"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 4000)
- build_path = /obj/item/ammo_casing/shotgun
- category = list("hacked", "Security")
-
-/datum/design/desttagger
- name = "Destination tagger"
- id = "desttagger"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 250, MAT_GLASS = 125)
- build_path = /obj/item/device/destTagger
- category = list("initial", "Electronics")
-
-/datum/design/handlabeler
- name = "Hand labeler"
- id = "handlabel"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150, MAT_GLASS = 125)
- build_path = /obj/item/weapon/hand_labeler
- category = list("initial", "Electronics")
-
-/datum/design/floorpainter
- name = "Floor painter"
- id = "floor_painter"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 150, MAT_GLASS = 125)
- build_path = /obj/item/device/floor_painter
- category = list("initial", "Electronics")
-
/datum/design/logic_board
name = "Logic Circuit"
id = "logic_board"
@@ -712,20 +856,4 @@
build_type = AUTOLATHE
materials = list(MAT_GLASS = 750, MAT_METAL = 250)
build_path = /obj/item/weapon/circuitboard/vendor
- category = list("initial", "Electronics")
-
-/datum/design/conveyor_belt
- name = "Conveyor belt"
- id = "conveyor_belt"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 5000)
- build_path = /obj/item/conveyor_construct
- category = list("initial", "Construction")
-
-/datum/design/conveyor_switch
- name = "Conveyor belt switch"
- id = "conveyor_switch"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 450, MAT_GLASS = 190)
- build_path = /obj/item/conveyor_switch_construct
- category = list("initial", "Construction")
\ No newline at end of file
+ category = list("initial", "Electronics")
\ No newline at end of file
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
new file mode 100644
index 00000000000..14b8ad1dc6b
--- /dev/null
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -0,0 +1,220 @@
+///////////////////////////////////
+///////Biogenerator Designs ///////
+///////////////////////////////////
+
+/datum/design/milk
+ name = "10 milk"
+ id = "milk"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 20)
+ make_reagents = list("milk" = 10)
+ category = list("initial","Food")
+
+/datum/design/cream
+ name = "10 cream"
+ id = "cream"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 30)
+ make_reagents = list("cream" = 10)
+ category = list("initial","Food")
+
+/datum/design/milk_carton
+ name = "Milk carton"
+ id = "milk_carton"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 100)
+ build_path = /obj/item/weapon/reagent_containers/food/condiment/milk
+ category = list("initial","Food")
+
+/datum/design/cream_carton
+ name = "Cream carton"
+ id = "cream_carton"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/reagent_containers/food/drinks/bottle/cream
+ category = list("initial","Food")
+
+/datum/design/black_pepper
+ name = "10u black pepper"
+ id = "black_pepper"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 25)
+ make_reagents = list("blackpepper" = 10)
+ category = list("initial","Food")
+
+/datum/design/pepper_mill
+ name = "Pepper mill"
+ id = "pepper_mill"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 50)
+ build_path = /obj/item/weapon/reagent_containers/food/condiment/peppermill
+ make_reagents = list()
+ category = list("initial","Food")
+
+/datum/design/monkey_cube
+ name = "Monkey cube"
+ id = "mcube"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 250)
+ build_path = /obj/item/weapon/reagent_containers/food/snacks/monkeycube
+ category = list("initial", "Food")
+
+/datum/design/ez_nut
+ name = "E-Z-Nutrient"
+ id = "ez_nut"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 10)
+ build_path = /obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez
+ category = list("initial","Botany Chemicals")
+
+/datum/design/l4z_nut
+ name = "Left 4 Zed"
+ id = "l4z_nut"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 20)
+ build_path = /obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
+ category = list("initial","Botany Chemicals")
+
+/datum/design/rh_nut
+ name = "Robust Harvest"
+ id = "rh_nut"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 25)
+ build_path = /obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
+ category = list("initial","Botany Chemicals")
+
+/datum/design/weed_killer
+ name = "Weed Killer"
+ id = "weed_killer"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 50)
+ build_path = /obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller
+ category = list("initial","Botany Chemicals")
+
+/datum/design/pest_spray
+ name = "Pest Killer"
+ id = "pest_spray"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 50)
+ build_path = /obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
+ category = list("initial","Botany Chemicals")
+
+/datum/design/botany_bottle
+ name = "Empty Bottle"
+ id = "botany_bottle"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 5)
+ build_path = /obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
+ category = list("initial", "Botany Chemicals")
+
+/datum/design/cloth
+ name = "Roll of cloth"
+ id = "cloth"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 50)
+ build_path = /obj/item/stack/sheet/cloth
+ category = list("initial","Leather and Cloth")
+
+/datum/design/wallet
+ name = "Wallet"
+ id = "wallet"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 100)
+ build_path = /obj/item/weapon/storage/wallet
+ category = list("initial","Leather and Cloth")
+
+/datum/design/botany_gloves
+ name = "Botanical gloves"
+ id = "botany_gloves"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 150)
+ build_path = /obj/item/clothing/gloves/botanic_leather
+ category = list("initial","Leather and Cloth")
+
+/datum/design/toolbelt
+ name = "Utility Belt"
+ id = "toolbelt"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/storage/belt/utility
+ category = list("initial","Leather and Cloth")
+
+/datum/design/hydrobelt
+ name = "Botanist belt"
+ id = "hydrobelt"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/storage/belt/botany
+ category = list("initial","Leather and Cloth")
+
+/datum/design/secbelt
+ name = "Security belt"
+ id = "secbelt"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/storage/belt/security
+ category = list("initial","Leather and Cloth")
+
+/datum/design/medbelt
+ name = "Medical belt"
+ id = "medbel"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/storage/belt/medical
+ category = list("initial","Leather and Cloth")
+
+/datum/design/janibelt
+ name = "Janitorial belt"
+ id = "janibelt"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/storage/belt/janitor
+ category = list("initial","Leather and Cloth")
+
+/datum/design/bandolier
+ name = "Bandolier belt"
+ id = "bandolier"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/weapon/storage/belt/bandolier
+ category = list("initial","Leather and Cloth")
+
+/datum/design/s_holster
+ name = "Shoulder holster"
+ id = "s_holster"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 400)
+ build_path = /obj/item/clothing/accessory/holster
+ category = list("initial","Leather and Cloth")
+
+/datum/design/leather_satchel
+ name = "Leather satchel"
+ id = "leather_satchel"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 400)
+ build_path = /obj/item/weapon/storage/backpack/satchel
+ category = list("initial","Leather and Cloth")
+
+/datum/design/leather_jacket
+ name = "Leather jacket"
+ id = "leather_jacket"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 500)
+ build_path = /obj/item/clothing/suit/jacket/leather
+ category = list("initial","Leather and Cloth")
+
+/datum/design/leather_overcoat
+ name = "Leather overcoat"
+ id = "leather_overcoat"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 1000)
+ build_path = /obj/item/clothing/suit/jacket/leather/overcoat
+ category = list("initial","Leather and Cloth")
+
+/datum/design/rice_hat
+ name = "Rice hat"
+ id = "rice_hat"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 300)
+ build_path = /obj/item/clothing/head/rice_hat
+ category = list("initial","Leather and Cloth")
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 25135f7a079..6d3624701b9 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -342,7 +342,7 @@
build_path = /obj/item/weapon/circuitboard/teleporter
category = list("Computer Boards")
-datum/design/GAC
+/datum/design/GAC
name = "Console Board (General Air Control)"
desc = "Allows for the construction of circuit boards used to build a General Air Control Computer."
id = "GAC"
@@ -352,7 +352,7 @@ datum/design/GAC
build_path = /obj/item/weapon/circuitboard/air_management
category = list("Computer Boards")
-datum/design/tank_control
+/datum/design/tank_control
name = "Console Board (Large Tank Control)"
desc = "Allows for the construction of circuit boards used to build a Large Tank Control Computer."
id = "tankcontrol"
@@ -362,7 +362,7 @@ datum/design/tank_control
build_path = /obj/item/weapon/circuitboard/large_tank_control
category = list("Computer Boards")
-datum/design/AAC
+/datum/design/AAC
name = "Console Board (Atmospheric Automations Console)"
desc = "Allows for the construction of circuit boards used to build an Atmospheric Automations Console."
id = "AAC"
@@ -370,4 +370,14 @@ datum/design/AAC
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/atmos_automation
- category = list("Computer Boards")
\ No newline at end of file
+ category = list("Computer Boards")
+
+/datum/design/xenobiocamera
+ name = "Console Board (Xenobiology Console)"
+ desc = "Allows for the construction of circuit boards used to build xenobiology camera computers."
+ id = "xenobioconsole"
+ req_tech = list("programming" = 3, "biotech" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/xenobiology
+ category = list("Computer Boards")
diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm
new file mode 100644
index 00000000000..278adb3cf25
--- /dev/null
+++ b/code/modules/research/designs/computer_part_designs.dm
@@ -0,0 +1,251 @@
+////////////////////////////////////////
+///////////Computer Parts///////////////
+////////////////////////////////////////
+
+/datum/design/disk/normal
+ name = "hard disk drive"
+ id = "hdd_basic"
+ req_tech = list("programming" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 100)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive
+ category = list("Computer Parts")
+
+/datum/design/disk/advanced
+ name = "advanced hard disk drive"
+ id = "hdd_advanced"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced
+ category = list("Computer Parts")
+
+/datum/design/disk/super
+ name = "super hard disk drive"
+ id = "hdd_super"
+ req_tech = list("programming" = 3, "engineering" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1600, MAT_GLASS = 400)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/super
+ category = list("Computer Parts")
+
+/datum/design/disk/cluster
+ name = "cluster hard disk drive"
+ id = "hdd_cluster"
+ req_tech = list("programming" = 4, "engineering" = 4)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3200, MAT_GLASS = 800)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster
+ category = list("Computer Parts")
+
+/datum/design/disk/small
+ name = "solid state drive"
+ id = "ssd_small"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/small
+ category = list("Computer Parts")
+
+/datum/design/disk/micro
+ name = "micro solid state drive"
+ id = "ssd_micro"
+ req_tech = list("programming" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 100)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/micro
+ category = list("Computer Parts")
+
+
+// Network cards
+/datum/design/netcard/basic
+ name = "network card"
+ id = "netcard_basic"
+ req_tech = list("programming" = 2, "engineering" = 1)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 100, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/network_card
+ category = list("Computer Parts")
+
+/datum/design/netcard/advanced
+ name = "advanced network card"
+ id = "netcard_advanced"
+ req_tech = list("programming" = 4, "engineering" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 200, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/network_card/advanced
+ category = list("Computer Parts")
+
+/datum/design/netcard/wired
+ name = "wired network card"
+ id = "netcard_wired"
+ req_tech = list("programming" = 5, "engineering" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 400, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/network_card/wired
+ category = list("Computer Parts")
+
+
+// Data disks
+/datum/design/portabledrive/basic
+ name = "data disk"
+ id = "portadrive_basic"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 800, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/portable
+ category = list("Computer Parts")
+
+/datum/design/portabledrive/advanced
+ name = "advanced data disk"
+ id = "portadrive_advanced"
+ req_tech = list("programming" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1600, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced
+ category = list("Computer Parts")
+
+/datum/design/portabledrive/super
+ name = "super data disk"
+ id = "portadrive_super"
+ req_tech = list("programming" = 4)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 3200, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super
+ category = list("Computer Parts")
+
+
+// Card slot
+/datum/design/cardslot
+ name = "ID card slot"
+ id = "cardslot"
+ req_tech = list("programming" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600)
+ build_path = /obj/item/weapon/computer_hardware/card_slot
+ category = list("Computer Parts")
+
+// Intellicard slot
+/datum/design/aislot
+ name = "Intellicard slot"
+ id = "aislot"
+ req_tech = list("programming" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600)
+ build_path = /obj/item/weapon/computer_hardware/ai_slot
+ category = list("Computer Parts")
+
+// Mini printer
+/datum/design/miniprinter
+ name = "miniprinter"
+ id = "miniprinter"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600)
+ build_path = /obj/item/weapon/computer_hardware/printer/mini
+ category = list("Computer Parts")
+
+
+// APC Link
+/datum/design/APClink
+ name = "area power connector"
+ id = "APClink"
+ req_tech = list("programming" = 2, "powerstorage" = 3, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000)
+ build_path = /obj/item/weapon/computer_hardware/recharger/APC
+ category = list("Computer Parts")
+
+
+// Batteries
+/datum/design/battery/controller
+ name = "power cell controller"
+ id = "bat_control"
+ req_tech = list("powerstorage" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400)
+ build_path = /obj/item/weapon/computer_hardware/battery
+ category = list("Computer Parts")
+
+/datum/design/battery/normal
+ name = "battery module"
+ id = "bat_normal"
+ req_tech = list("powerstorage" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400)
+ build_path = /obj/item/weapon/stock_parts/cell/computer
+ category = list("Computer Parts")
+
+/datum/design/battery/advanced
+ name = "advanced battery module"
+ id = "bat_advanced"
+ req_tech = list("powerstorage" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 800)
+ build_path = /obj/item/weapon/stock_parts/cell/computer/advanced
+ category = list("Computer Parts")
+
+/datum/design/battery/super
+ name = "super battery module"
+ id = "bat_super"
+ req_tech = list("powerstorage" = 3, "engineering" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1600)
+ build_path = /obj/item/weapon/stock_parts/cell/computer/super
+ category = list("Computer Parts")
+
+/datum/design/battery/nano
+ name = "nano battery module"
+ id = "bat_nano"
+ req_tech = list("powerstorage" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 200)
+ build_path = /obj/item/weapon/stock_parts/cell/computer/nano
+ category = list("Computer Parts")
+
+/datum/design/battery/micro
+ name = "micro battery module"
+ id = "bat_micro"
+ req_tech = list("powerstorage" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400)
+ build_path = /obj/item/weapon/stock_parts/cell/computer/micro
+ category = list("Computer Parts")
+
+
+// Processor unit
+/datum/design/cpu
+ name = "processor board"
+ id = "cpu_normal"
+ req_tech = list("programming" = 3, "engineering" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1600, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit
+ category = list("Computer Parts")
+
+/datum/design/cpu/small
+ name = "microprocessor"
+ id = "cpu_small"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 800, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit/small
+ category = list("Computer Parts")
+
+/datum/design/cpu/photonic
+ name = "photonic processor board"
+ id = "pcpu_normal"
+ req_tech = list("programming" = 5, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS= 6400, MAT_GOLD = 2000, "sacid" = 40)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic
+ category = list("Computer Parts")
+
+/datum/design/cpu/photonic/small
+ name = "photonic microprocessor"
+ id = "pcpu_small"
+ req_tech = list("programming" = 4, "engineering" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 3200, MAT_GOLD = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small
+ category = list("Computer Parts")
\ No newline at end of file
diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm
index 0f23b2a6532..9792f007c55 100644
--- a/code/modules/research/designs/equipment_designs.dm
+++ b/code/modules/research/designs/equipment_designs.dm
@@ -189,4 +189,84 @@
build_type = PROTOLATHE
materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200)
build_path = /obj/item/clothing/glasses/hud/hydroponic/night
+ category = list("Equipment")
+
+/datum/design/handdrill
+ name = "Hand Drill"
+ desc = "A small electric hand drill with an interchangable screwdriver and bolt bit"
+ id = "handdrill"
+ req_tech = list("materials" = 4, "engineering" = 6)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_GOLD = 1000)
+ build_path = /obj/item/weapon/screwdriver/power
+ category = list("Equipment")
+
+/datum/design/jawsoflife
+ name = "Jaws of Life"
+ desc = "A small, compact Jaws of Life with an interchangable pry jaws and cutting jaws"
+ id = "jawsoflife"
+ req_tech = list("materials" = 4, "engineering" = 6, "magnets" = 6) // added one more requirment since the Jaws of Life are a bit OP
+ build_path = /obj/item/weapon/crowbar/power
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_DIAMOND = 1000)
+ category = list("Equipment")
+
+/datum/design/alienwrench
+ name = "Alien Wrench"
+ desc = "An advanced wrench obtained through Abductor technology."
+ id = "alien_wrench"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/wrench/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienwirecutters
+ name = "Alien Wirecutters"
+ desc = "Advanced wirecutters obtained through Abductor technology."
+ id = "alien_wirecutters"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/wirecutters/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienscrewdriver
+ name = "Alien Screwdriver"
+ desc = "An advanced screwdriver obtained through Abductor technology."
+ id = "alien_screwdriver"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/screwdriver/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/aliencrowbar
+ name = "Alien Crowbar"
+ desc = "An advanced crowbar obtained through Abductor technology."
+ id = "alien_crowbar"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/crowbar/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienwelder
+ name = "Alien Welding Tool"
+ desc = "An advanced welding tool obtained through Abductor technology."
+ id = "alien_welder"
+ req_tech = list("engineering" = 5, "plasmatech" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/weldingtool/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienmultitool
+ name = "Alien Multitool"
+ desc = "An advanced multitool obtained through Abductor technology."
+ id = "alien_multitool"
+ req_tech = list("engineering" = 5, "programming" = 5, "abductor" = 4)
+ build_path = /obj/item/device/multitool/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000)
category = list("Equipment")
\ No newline at end of file
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index ca63be9e4ae..c1d3c64d6b9 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -62,6 +62,16 @@
build_path = /obj/item/weapon/circuitboard/power_turbine
category = list ("Engineering Machinery")
+/datum/design/quantumpad
+ name = "Machine Board (Quantum Pad Board)"
+ desc = "The circuit board for a quantum telepad."
+ id = "quantumpad"
+ req_tech = list("programming" = 4, "bluespace" = 4, "plasmatech" = 3, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/quantumpad
+ category = list ("Teleportation Machinery")
+
/datum/design/telepad
name = "Machine Board (Telepad Board)"
desc = "Allows for the construction of circuit boards used to build a Telepad."
@@ -340,7 +350,7 @@
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/seed_extractor
- category = list ("Misc. Machinery")
+ category = list ("Hydroponics Machinery")
/datum/design/processor
name = "Machine Design (Processor Board)"
@@ -512,23 +522,12 @@
build_path = /obj/item/weapon/circuitboard/gameboard
category = list("Misc. Machinery")
-
-/datum/design/botany_extractor
- name = "Machine Design (Lysis-Isolation Centrifuge)"
- desc = "The circuit board for a lysis-isolation centrifuge."
- id = "botany_extractor"
- req_tech = list("biotech" = 3, "programming" = 3)
+/datum/design/plantgenes
+ name = "Machine Design (Plant DNA Manipulator Board)"
+ desc = "The circuit board for a plant DNA manipulator."
+ id = "plantgenes"
+ req_tech = list("programming" = 4, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS=1000, "sacid"=20)
- build_path = /obj/item/weapon/circuitboard/botany_extractor
- category = list("Hydroponics Machinery")
-
-/datum/design/botany_editor
- name = "Machine Design (Bioballistic Delivery System)"
- desc = "The circuit board for a bioballistic delivery system."
- id = "botany_editor"
- req_tech = list("biotech" = 3, "programming" = 3)
- build_type = IMPRINTER
- materials = list(MAT_GLASS=1000, "sacid"=20)
- build_path = /obj/item/weapon/circuitboard/botany_editor
- category = list("Hydroponics Machinery")
+ build_path = /obj/item/weapon/circuitboard/plantgenes
+ category = list("Hydroponics Machinery")
\ No newline at end of file
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index 15e2fb66056..4b00be0b932 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -167,32 +167,32 @@
build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting
category = list("Exosuit Modules")
-/datum/design/recitence_main
- name = "Exosuit Module (\"Recitence\" Central Control module)"
- desc = "Allows for the construction of a \"Recitence\" Central Control module."
- id = "recitence_main"
+/datum/design/reticence_main
+ name = "Exosuit Module (\"Reticence\" Central Control module)"
+ desc = "Allows for the construction of a \"Reticence\" Central Control module."
+ id = "reticence_main"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha/recitence/main
+ build_path = /obj/item/weapon/circuitboard/mecha/reticence/main
category = list("Exosuit Modules")
-/datum/design/recitence_peri
- name = "Exosuit Module (\"Recitence\" Peripherals Control module)"
- desc = "Allows for the construction of a \"Recitence\" Peripheral Control module."
- id = "recitence_peri"
+/datum/design/reticence_peri
+ name = "Exosuit Module (\"Reticence\" Peripherals Control module)"
+ desc = "Allows for the construction of a \"Reticence\" Peripheral Control module."
+ id = "reticence_peri"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha/recitence/peripherals
+ build_path = /obj/item/weapon/circuitboard/mecha/reticence/peripherals
category = list("Exosuit Modules")
-/datum/design/recitence_targ
- name = "Exosuit Module (\"Recitence\" Weapons & Targeting Control module)"
- desc = "Allows for the construction of a \"Recitence\" Weapons & Targeting Control module."
- id = "recitence_targ"
+/datum/design/reticence_targ
+ name = "Exosuit Module (\"Reticence\" Weapons & Targeting Control module)"
+ desc = "Allows for the construction of a \"Reticence\" Weapons & Targeting Control module."
+ id = "reticence_targ"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha/recitence/targeting
+ build_path = /obj/item/weapon/circuitboard/mecha/reticence/targeting
category = list("Exosuit Modules")
\ No newline at end of file
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 702afa68f2f..b31eeb43319 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -459,69 +459,69 @@
construction_time = 200
category = list("H.O.N.K")
-//Recitence
-/datum/design/recitence_chassis
- name = "Exosuit Chassis (\"Recitence\")"
- id = "recitence_chassis"
+//Reticence
+/datum/design/reticence_chassis
+ name = "Exosuit Chassis (\"Reticence\")"
+ id = "reticence_chassis"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/recitence
+ build_path = /obj/item/mecha_parts/chassis/reticence
materials = list(MAT_METAL=20000)
construction_time = 100
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_torso
- name = "Exosuit Torso (\"Recitence\")"
- id = "recitence_torso"
+/datum/design/reticence_torso
+ name = "Exosuit Torso (\"Reticence\")"
+ id = "reticence_torso"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_torso
+ build_path = /obj/item/mecha_parts/part/reticence_torso
materials = list(MAT_METAL=20000,MAT_GLASS=10000,MAT_TRANQUILLITE=10000)
construction_time = 300
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_head
- name = "Exosuit Head (\"Recitence\")"
- id = "recitence_head"
+/datum/design/reticence_head
+ name = "Exosuit Head (\"Reticence\")"
+ id = "reticence_head"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_head
+ build_path = /obj/item/mecha_parts/part/reticence_head
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_left_arm
- name = "Exosuit Left Arm (\"Recitence\")"
- id = "recitence_left_arm"
+/datum/design/reticence_left_arm
+ name = "Exosuit Left Arm (\"Reticence\")"
+ id = "reticence_left_arm"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_left_arm
+ build_path = /obj/item/mecha_parts/part/reticence_left_arm
materials = list(MAT_METAL=15000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_right_arm
- name = "Exosuit Right Arm (\"Recitence\")"
- id = "recitence_right_arm"
+/datum/design/reticence_right_arm
+ name = "Exosuit Right Arm (\"Reticence\")"
+ id = "reticence_right_arm"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_right_arm
+ build_path = /obj/item/mecha_parts/part/reticence_right_arm
materials = list(MAT_METAL=15000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_left_leg
- name = "Exosuit Left Leg (\"Recitence\")"
- id = "recitence_left_leg"
+/datum/design/reticence_left_leg
+ name = "Exosuit Left Leg (\"Reticence\")"
+ id = "reticence_left_leg"
build_type = MECHFAB
- build_path =/obj/item/mecha_parts/part/recitence_left_leg
+ build_path =/obj/item/mecha_parts/part/reticence_left_leg
materials = list(MAT_METAL=20000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_right_leg
- name = "Exosuit Right Leg (\"Recitence\")"
- id = "recitence_right_leg"
+/datum/design/reticence_right_leg
+ name = "Exosuit Right Leg (\"Reticence\")"
+ id = "reticence_right_leg"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_right_leg
+ build_path = /obj/item/mecha_parts/part/reticence_right_leg
materials = list(MAT_METAL=20000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
//Phazon
/datum/design/phazon_chassis
@@ -883,7 +883,7 @@
category = list("Exosuit Equipment")
/datum/design/mech_laser
- name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)"
+ name = "Exosuit Weapon (CH-PL \"Firedart\" Laser)"
desc = "Allows for the construction of CH-PS Laser."
id = "mech_laser"
build_type = MECHFAB
@@ -893,6 +893,17 @@
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/mech_disabler
+ name = "Exosuit Weapon (CH-PD Disabler)"
+ desc = "Allows for the construction of CH-PD Disabler."
+ id = "mech_laser"
+ build_type = MECHFAB
+ req_tech = list("combat" = 3, "magnets" = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
+ materials = list(MAT_METAL=10000)
+ construction_time = 100
+ category = list("Exosuit Equipment")
+
/datum/design/mech_carbine
name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
desc = "Allows for the construction of FNX-99 \"Hades\" Carbine."
@@ -959,6 +970,28 @@
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/mech_tesla
+ name = "Exosuit Weapon (P-X Tesla Cannon)"
+ desc = "Allows for the construction of P-X Tesla Cannon."
+ id = "mech_tesla"
+ build_type = MECHFAB
+ req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000)
+ construction_time = 100
+ category = list("Exosuit Equipment")
+
+/datum/design/mech_immolator
+ name = "Exosuit Weapon (ZFI Immolation Beam Gun)"
+ desc = "Allows for the construction of ZFI Immolation Beam Gun."
+ id = "mech_tesla"
+ build_type = MECHFAB
+ req_tech = list("combat" = 4, "materials" = 4, "plasmatech" = 2, "magnets" = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
+ materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_SILVER = 3000, MAT_PLASMA = 2000)
+ construction_time = 100
+ category = list("Exosuit Equipment")
+
//Cyborg Upgrade Modules
/datum/design/borg_upgrade_reset
@@ -1038,16 +1071,6 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_hyperka
- name = "Cyborg Upgrade (Hyper-Kinetic Accelerator)"
- id = "borg_upgrade_hyperka"
- req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
- build_type = MECHFAB //Reqs same as human Hyper KA
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
- build_path = /obj/item/borg/upgrade/hyperka
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
/datum/design/borg_syndicate_module
name = "Cyborg Upgrade (Illegal Modules)"
id = "borg_syndicate_module"
@@ -1078,6 +1101,16 @@
construction_time = 50
category = list("Misc")
+/datum/design/mecha_tracking_ai_control
+ name = "AI Control Beacon"
+ id = "mecha_tracking_ai_control"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/mecha_tracking/ai_control
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 200)
+ req_tech = list("programming" = 3, "magnets" = 2, "engineering" = 2)
+ construction_time = 50
+ category = list("Misc")
+
/datum/design/ipc_head
name = "IPC Head"
id = "ipc_head"
@@ -1100,7 +1133,7 @@
name = "IPC Optical Sensor"
id = "ipc_optics"
build_type = MECHFAB
- build_path = /obj/item/organ/internal/optical_sensor
+ build_path = /obj/item/organ/internal/eyes/optical_sensor
materials = list(MAT_METAL=1000, MAT_GLASS=2500)
construction_time = 200
category = list("Misc")
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 7bcc42e4979..f1d477a4f89 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -165,7 +165,7 @@
req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500)
- build_path = /obj/item/weapon/scalpel/laser1
+ build_path = /obj/item/weapon/scalpel/laser/laser1
category = list("Medical")
/datum/design/item/scalpel_laser2
@@ -175,7 +175,7 @@
req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000)
- build_path = /obj/item/weapon/scalpel/laser2
+ build_path = /obj/item/weapon/scalpel/laser/laser2
category = list("Medical")
/datum/design/item/scalpel_laser3
@@ -185,7 +185,7 @@
req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000)
- build_path = /obj/item/weapon/scalpel/laser3
+ build_path = /obj/item/weapon/scalpel/laser/laser3
category = list("Medical")
/datum/design/item/scalpel_manager
@@ -195,9 +195,68 @@
req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4)
build_type = PROTOLATHE
materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000)
- build_path = /obj/item/weapon/scalpel/manager
+ build_path = /obj/item/weapon/scalpel/laser/manager
category = list("Medical")
+/datum/design/alienscalpel
+ name = "Alien Scalpel"
+ desc = "An advanced scalpel obtained through Abductor technology."
+ id = "alien_scalpel"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/scalpel/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
+
+/datum/design/alienhemostat
+ name = "Alien Hemostat"
+ desc = "An advanced hemostat obtained through Abductor technology."
+ id = "alien_hemostat"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/hemostat/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
+
+/datum/design/alienretractor
+ name = "Alien Retractor"
+ desc = "An advanced retractor obtained through Abductor technology."
+ id = "alien_retractor"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/retractor/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
+
+/datum/design/aliensaw
+ name = "Alien Circular Saw"
+ desc = "An advanced surgical saw obtained through Abductor technology."
+ id = "alien_saw"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/circular_saw/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_GOLD = 1000, MAT_PLASMA = 1000)
+ category = list("Medical")
+
+/datum/design/aliendrill
+ name = "Alien Drill"
+ desc = "An advanced drill obtained through Abductor technology."
+ id = "alien_drill"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/surgicaldrill/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_GOLD = 1000, MAT_PLASMA = 1000)
+ category = list("Medical")
+
+/datum/design/aliencautery
+ name = "Alien Cautery"
+ desc = "An advanced cautery obtained through Abductor technology."
+ id = "alien_cautery"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/cautery/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
/////////////////////////////////////////
//////////Cybernetic Implants////////////
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 2b7d911f2b1..aa3014e2825 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -64,26 +64,6 @@
build_path = /obj/item/weapon/pickaxe/drill/jackhammer
category = list("Mining")
-/datum/design/superaccelerator
- name = "Super-Kinetic Accelerator"
- desc = "An upgraded version of the proto-kinetic accelerator, with superior damage, speed and range."
- id = "superaccelerator"
- req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
- build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/super
- category = list("Mining")
-
-/datum/design/hyperaccelerator
- name = "Hyper-Kinetic Accelerator"
- desc = "An upgraded version of the proto-kinetic accelerator, with even more superior damage, speed and range."
- id = "hyperaccelerator"
- req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
- build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/hyper
- category = list("Mining")
-
/datum/design/superresonator
name = "Upgraded Resonator"
desc = "An upgraded version of the resonator that allows more fields to be active at once."
@@ -92,4 +72,64 @@
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
build_path = /obj/item/weapon/resonator/upgraded
- category = list("Mining")
\ No newline at end of file
+ category = list("Mining")
+
+/datum/design/trigger_guard_mod
+ name = "Kinetic Accelerator Trigger Guard Mod"
+ desc = "A device which allows kinetic accelerators to be wielded by any organism."
+ id = "triggermod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/trigger_guard
+ category = list("Mining")
+
+/datum/design/damage_mod
+ name = "Kinetic Accelerator Damage Mod"
+ desc = "A device which allows kinetic accelerators to deal more damage."
+ id = "damagemod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/damage
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/cooldown_mod
+ name = "Kinetic Accelerator Cooldown Mod"
+ desc = "A device which decreases the cooldown of a Kinetic Accelerator."
+ id = "cooldownmod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/cooldown
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/range_mod
+ name = "Kinetic Accelerator Range Mod"
+ desc = "A device which allows kinetic accelerators to fire at a further range."
+ id = "rangemod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
+ build_path = /obj/item/borg/upgrade/modkit/range
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/superaccelerator
+ name = "Kinetic Accelerator Pressure Mod"
+ desc = "A modification kit which allows Kinetic Accelerators to do more damage while indoors."
+ id = "indoormod"
+ req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000)
+ build_path = /obj/item/borg/upgrade/modkit/indoors
+ category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/hyperaccelerator
+ name = "Kinetic Accelerator Mining AoE Mod"
+ desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock."
+ id = "hypermod"
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/borg/upgrade/modkit/aoe/turfs
+ category = list("Mining", "Cyborg Upgrade Modules")
\ No newline at end of file
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 44aff0048d5..ea67fe5e809 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -11,6 +11,16 @@
build_path = /obj/item/weapon/disk/design_disk
category = list("Miscellaneous")
+/datum/design/diskplantgene
+ name = "Plant data disk"
+ desc = "A disk for storing plant genetic data."
+ id = "diskplantgene"
+ req_tech = list("programming" = 4, "biotech" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=200, MAT_GLASS=100)
+ build_path = /obj/item/weapon/disk/plantgene
+ category = list("Miscellaneous")
+
/datum/design/intellicard
name = "Intellicard"
desc = "Allows for the construction of an intellicard."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 05364e3e40f..a70088b25b1 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -11,7 +11,7 @@
materials = list(MAT_METAL = 700, MAT_GLASS = 50)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell
- category = list("Misc","Power")
+ category = list("Misc","Power","Machinery","initial")
/datum/design/high_cell
name = "High-Capacity Power Cell"
diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm
index a1be7ffcf7a..7859f635cd5 100644
--- a/code/modules/research/designs/stock_parts_designs.dm
+++ b/code/modules/research/designs/stock_parts_designs.dm
@@ -10,7 +10,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/weapon/stock_parts/capacitor
- category = list("Stock Parts")
+ category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/basic_sensor
@@ -21,7 +21,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/weapon/stock_parts/scanning_module
- category = list("Stock Parts")
+ category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/micro_mani
@@ -32,7 +32,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 30)
build_path = /obj/item/weapon/stock_parts/manipulator
- category = list("Stock Parts")
+ category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/basic_micro_laser
@@ -43,7 +43,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 20)
build_path = /obj/item/weapon/stock_parts/micro_laser
- category = list("Stock Parts")
+ category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/basic_matter_bin
@@ -54,7 +54,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/weapon/stock_parts/matter_bin
- category = list("Stock Parts")
+ category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/adv_capacitor
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index f44e96ae78b..e282e42fa3f 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -104,16 +104,6 @@
locked = 1
category = list("Weapons")
-/datum/design/receiver
- name = "Modular Receiver"
- desc = "A prototype modular receiver and trigger assembly for a variety of firearms."
- id = "receiver"
- req_tech = list("combat" = 5, "materials" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 6500, MAT_SILVER = 500)
- build_path = /obj/item/weaponcrafting/receiver
- category = list("Weapons")
-
/datum/design/plasmapistol
name = "Plasma Pistol"
desc = "A specialized firearm designed to fire lethal bolts of toxins."
@@ -152,8 +142,8 @@
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
/datum/design/mag_oldsmg/tx_mag
- name = "WT-550 Auto Gun Urnaium Magazine (4.6x30mm TX)"
- desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle"
+ name = "WT-550 Auto Gun Uranium Magazine (4.6x30mm TX)"
+ desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_tx"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 23dc9d8ea36..52fa9596d92 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -113,7 +113,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
Console.set_light(2)
/obj/machinery/message_server/attack_hand(user as mob)
-// to_chat(user, "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays.")
+// to_chat(user, "There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays. ")
to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]")
active = !active
update_icon()
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 81392aa99e5..20093e7771b 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -18,6 +18,7 @@ Note: Must be placed west/left of and R&D console to function.
var/list/categories = list(
"Bluespace",
+ "Computer Parts",
"Equipment",
"Janitorial",
"Medical",
@@ -61,8 +62,7 @@ Note: Must be placed west/left of and R&D console to function.
reagents.my_atom = src
/obj/machinery/r_n_d/protolathe/Destroy()
- qdel(materials)
- materials = null
+ QDEL_NULL(materials)
return ..()
/obj/machinery/r_n_d/protolathe/RefreshParts()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 121eb0ee2d3..1e7e9b1674a 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -410,6 +410,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(being_built)
var/power = 2000
var/amount=text2num(href_list["amount"])
+ if(being_built.make_reagents.len)
+ return 0
amount = max(1, min(10, amount))
for(var/M in being_built.materials)
power += round(being_built.materials[M] * amount / 5)
@@ -718,6 +720,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(b_type & AUTOLATHE) lathe_types += "Autolathe"
if(b_type & MECHFAB) lathe_types += "Mech Fabricator"
if(b_type & PODFAB) lathe_types += "Spacepod Fabricator"
+ if(b_type & BIOGENERATOR) lathe_types += "Biogenerator"
var/list/materials = list()
disk_data["materials"] = materials
for(var/M in d_disk.blueprint.materials)
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 34b5a00fd71..8386c79377d 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -178,6 +178,21 @@ research holder datum.
return
..()
+//Biogenerator files
+/datum/research/biogenerator/New()
+ for(var/T in (subtypesof(/datum/tech)))
+ possible_tech += new T(src)
+ for(var/path in subtypesof(/datum/design))
+ var/datum/design/D = new path(src)
+ possible_designs += D
+ if((D.build_type & BIOGENERATOR) && ("initial" in D.category))
+ AddDesign2Known(D)
+
+/datum/research/biogenerator/AddDesign2Known(datum/design/D)
+ if(!(D.build_type & BIOGENERATOR))
+ return
+ ..()
+
/***************************************************************
** Technology Datums **
** Includes all the various technoliges and what they make. **
@@ -205,7 +220,7 @@ datum/tech/engineering
name = "Engineering Research"
desc = "Development of new and improved engineering parts and methods."
id = "engineering"
- max_level = 5
+ max_level = 6
datum/tech/plasmatech
name = "Plasma Research"
@@ -311,10 +326,7 @@ datum/tech/robotics
/obj/item/weapon/disk/tech_disk
name = "\improper Technology Disk"
desc = "A disk for storing technology data for further research."
- icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk2"
- item_state = "card-id"
- w_class = 1
materials = list(MAT_METAL=30, MAT_GLASS=10)
var/datum/tech/stored
var/default_name = "\improper Technology Disk"
@@ -339,10 +351,7 @@ datum/tech/robotics
/obj/item/weapon/disk/design_disk
name = "\improper Component Design Disk"
desc = "A disk for storing device design data for construction in lathes."
- icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk2"
- item_state = "card-id"
- w_class = 1
materials = list(MAT_METAL=30, MAT_GLASS=10)
var/datum/design/blueprint
// I'm doing this so that disk paths with pre-loaded designs don't get weird names
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 5b842c90e08..0fa680faf6a 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -208,7 +208,7 @@
add_fingerprint(usr)
usr.set_machine(src)
if(!src.allowed(usr) && !emagged)
- to_chat(usr, "\red You do not have the required access level")
+ to_chat(usr, "You do not have the required access level ")
return
if(href_list["main"])
@@ -338,7 +338,7 @@
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- to_chat(user, "\blue You you disable the security protocols")
+ to_chat(user, "You you disable the security protocols ")
src.updateUsrDialog()
/obj/machinery/r_n_d/server/core
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm
index 57759308aee..366ce13107b 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm
@@ -79,26 +79,26 @@
if(istype(W, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = W
- user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
- if(do_after(user,40, target = src))
- to_chat(user, "\blue [bicon(P)] [src] has been excavated to a depth of [2*src.excavation_level]cm.")
+ user.visible_message("[user] extends [P] towards [src]. ","You extend [P] towards [src]. ")
+ if(do_after(user, 40, target = src))
+ to_chat(user, "[bicon(P)] [src] has been excavated to a depth of [2*src.excavation_level]cm. ")
return
if(istype(W, /obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/P = W
- to_chat(user, "\red You start [P.drill_verb] [src].")
+ to_chat(user, "You start [P.drill_verb] [src]. ")
- if(!do_after(user,P.digspeed, target = src))
+ if(!do_after(user, P.digspeed, target = src))
return
- to_chat(user, "\blue You finish [P.drill_verb] [src].")
+ to_chat(user, "You finish [P.drill_verb] [src]. ")
excavation_level += P.excavation_amount
if(excavation_level > 100)
//failure
user.visible_message("[src] suddenly crumbles away. ",\
- "\red [src] has disintegrated under your onslaught, any secrets it was holding are long gone.")
+ "[src] has disintegrated under your onslaught, any secrets it was holding are long gone. ")
qdel(src)
return
@@ -114,5 +114,5 @@
src.visible_message("[src] suddenly crumbles away. ")
else
user.visible_message("[src] suddenly crumbles away. ",\
- "\blue [src] has been whittled away under your careful excavation, but there was nothing of interest inside.")
+ "[src] has been whittled away under your careful excavation, but there was nothing of interest inside. ")
qdel(src)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
index 95489be4775..410f05a925c 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
@@ -50,17 +50,17 @@
if(!previous_power_state)
previous_power_state = 1
icon_state = "cellold1"
- src.visible_message("\blue [bicon(src)] [src] suddenly comes to life!")
+ src.visible_message("[bicon(src)] [src] suddenly comes to life! ")
//slowly grow a mob
if(prob(5))
- src.visible_message("\blue [bicon(src)] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
+ src.visible_message("[bicon(src)] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")]. ")
//if we've finished growing...
if(time_spent_spawning >= time_per_spawn)
time_spent_spawning = 0
use_power = 1
- src.visible_message("\blue [bicon(src)] [src] pings!")
+ src.visible_message("[bicon(src)] [src] pings! ")
icon_state = "cellold1"
desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow."
if(spawn_type)
@@ -81,7 +81,7 @@
if(previous_power_state)
previous_power_state = 0
icon_state = "cellold0"
- src.visible_message("\blue [bicon(src)] [src] suddenly shuts down.")
+ src.visible_message("[bicon(src)] [src] suddenly shuts down. ")
//cloned mob slowly breaks down
time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
index 4073b0bd74c..96b9f2e2fb4 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm
@@ -14,11 +14,11 @@
if(active)
active = 0
icon_state = "gigadrill"
- to_chat(user, "\blue You press a button and [src] slowly spins down.")
+ to_chat(user, "You press a button and [src] slowly spins down. ")
else
active = 1
icon_state = "gigadrill_mov"
- to_chat(user, "\blue You press a button and [src] shudders to life.")
+ to_chat(user, "You press a button and [src] shudders to life. ")
/obj/machinery/giga_drill/Bump(atom/A)
if(active && !drilling_turf)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
index 5ca29dc6d43..d87c71dbc72 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
@@ -78,19 +78,19 @@
viables.Remove(type)
construction[button_desc] = type
- fail_message = "\blue [bicon(src)] a [pick("loud","soft","sinister","eery","triumphant","depressing","cheerful","angry")] \
+ fail_message = "[bicon(src)] a [pick("loud","soft","sinister","eery","triumphant","depressing","cheerful","angry")] \
[pick("horn","beep","bing","bleep","blat","honk","hrumph","ding")] sounds and a \
[pick("yellow","purple","green","blue","red","orange","white")] \
[pick("light","dial","meter","window","protrusion","knob","antenna","swirly thing")] \
[pick("swirls","flashes","whirrs","goes schwing","blinks","flickers","strobes","lights up")] on the \
[pick("front","side","top","bottom","rear","inside")] of [src]. A [pick("slot","funnel","chute","tube")] opens up in the \
- [pick("front","side","top","bottom","rear","inside")]."
+ [pick("front","side","top","bottom","rear","inside")]. "
/obj/machinery/replicator/process()
if(spawning_types.len && powered())
spawn_progress_time += world.time - last_process_time
if(spawn_progress_time > max_spawn_time)
- src.visible_message("\blue [bicon(src)] [src] pings!")
+ src.visible_message("[bicon(src)] [src] pings! ")
var/obj/source_material = pop(stored_materials)
var/spawn_type = pop(spawning_types)
@@ -113,7 +113,7 @@
icon_state = "borgcharger0(old)"
else if(prob(5))
- src.visible_message("\blue [bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
+ src.visible_message("[bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")]. ")
last_process_time = world.time
@@ -132,7 +132,7 @@
user.drop_item()
W.loc = src
stored_materials.Add(W)
- src.visible_message("\blue [user] inserts [W] into [src].")
+ src.visible_message("[user] inserts [W] into [src]. ")
/obj/machinery/replicator/Topic(href, href_list)
@@ -141,9 +141,9 @@
if(index > 0 && index <= construction.len)
if(stored_materials.len > spawning_types.len)
if(spawning_types.len)
- src.visible_message("\blue [bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
+ src.visible_message("[bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")]. ")
else
- src.visible_message("\blue [bicon(src)] [src]'s front compartment slides shut.")
+ src.visible_message("[bicon(src)] [src]'s front compartment slides shut. ")
spawning_types.Add(construction[construction[index]])
spawn_progress_time = 0
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
index 7a4b36707f9..894f54dc3bc 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
@@ -221,7 +221,7 @@ var/list/valid_secondary_effect_types = list(\
/obj/machinery/artifact/attack_hand(var/mob/user as mob)
if(get_dist(user, src) > 1)
- to_chat(user, "\red You can't reach [src] from here.")
+ to_chat(user, "You can't reach [src] from here. ")
return
if(ishuman(user) && user:gloves)
to_chat(user, "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
diff --git a/code/modules/research/xenoarchaeology/artifact/effect.dm b/code/modules/research/xenoarchaeology/artifact/effect.dm
index 727c016849b..981cea4156d 100644
--- a/code/modules/research/xenoarchaeology/artifact/effect.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effect.dm
@@ -64,7 +64,7 @@
var/atom/toplevelholder = holder
while(!istype(toplevelholder.loc, /turf))
toplevelholder = toplevelholder.loc
- toplevelholder.visible_message("\red [bicon(toplevelholder)] [toplevelholder] [display_msg]")
+ toplevelholder.visible_message("[bicon(toplevelholder)] [toplevelholder] [display_msg] ")
/datum/artifact_effect/proc/DoEffectTouch(var/mob/user)
/datum/artifact_effect/proc/DoEffectAura(var/atom/holder)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
index 89c74776f55..16862948644 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm
@@ -12,7 +12,7 @@
/datum/artifact_effect/cold/DoEffectTouch(var/mob/user)
if(holder)
- to_chat(user, "\blue A chill passes up your spine!")
+ to_chat(user, "A chill passes up your spine! ")
var/datum/gas_mixture/env = holder.loc.return_air()
if(env)
env.temperature = max(env.temperature - rand(5,50), 0)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
index d67c33d1e4e..8d6735e3a31 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
@@ -10,7 +10,7 @@
var/mob/living/silicon/robot/R = user
for(var/obj/item/weapon/stock_parts/cell/D in R.contents)
D.charge += rand() * 100 + 50
- to_chat(R, "\blue SYSTEM ALERT: Large energy boost detected!")
+ to_chat(R, "SYSTEM ALERT: Large energy boost detected! ")
return 1
/datum/artifact_effect/cellcharge/DoEffectAura()
@@ -24,7 +24,7 @@
for(var/mob/living/silicon/robot/M in mob_list)
for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge += 25
- to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!")
+ to_chat(M, "SYSTEM ALERT: Energy boost detected! ")
return 1
/datum/artifact_effect/cellcharge/DoEffectPulse()
@@ -38,5 +38,5 @@
for(var/mob/living/silicon/robot/M in mob_list)
for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge += rand() * 100
- to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!")
+ to_chat(M, "SYSTEM ALERT: Energy boost detected! ")
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
index fcba3be4dec..44be592e7fa 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
@@ -10,7 +10,7 @@
var/mob/living/silicon/robot/R = user
for(var/obj/item/weapon/stock_parts/cell/D in R.contents)
D.charge = max(D.charge - rand() * 100, 0)
- to_chat(R, "\blue SYSTEM ALERT: Energy drain detected!")
+ to_chat(R, "SYSTEM ALERT: Energy drain detected! ")
return 1
return 1
@@ -26,7 +26,7 @@
for(var/mob/living/silicon/robot/M in mob_list)
for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge = max(D.charge - 50,0)
- to_chat(M, "\red SYSTEM ALERT: Energy drain detected!")
+ to_chat(M, "SYSTEM ALERT: Energy drain detected! ")
return 1
/datum/artifact_effect/celldrain/DoEffectPulse()
@@ -40,5 +40,5 @@
for(var/mob/living/silicon/robot/M in mob_list)
for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge = max(D.charge - rand() * 150,0)
- to_chat(M, "\red SYSTEM ALERT: Energy drain detected!")
+ to_chat(M, "SYSTEM ALERT: Energy drain detected! ")
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
index d005fb9e64c..f31788602ad 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm
@@ -15,13 +15,13 @@
/datum/artifact_effect/dnaswitch/DoEffectTouch(var/mob/toucher)
var/weakness = GetAnomalySusceptibility(toucher)
if(ishuman(toucher) && prob(weakness * 100))
- to_chat(toucher, pick("\green You feel a little different.",
- "\green You feel very strange.",
- "\green Your stomach churns.",
- "\green Your skin feels loose.",
- "\green You feel a stabbing pain in your head.",
- "\green You feel a tingling sensation in your chest.",
- "\green Your entire body vibrates."))
+ to_chat(toucher, pick("You feel a little different. ",
+ "You feel very strange. ",
+ "Your stomach churns. ",
+ "Your skin feels loose. ",
+ "You feel a stabbing pain in your head. ",
+ "You feel a tingling sensation in your chest. ",
+ "Your entire body vibrates. "))
if(prob(75))
scramble(1, toucher, weakness * severity)
else
@@ -35,13 +35,13 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
if(prob(30))
- to_chat(H, pick("\green You feel a little different.",
- "\green You feel very strange.",
- "\green Your stomach churns.",
- "\green Your skin feels loose.",
- "\green You feel a stabbing pain in your head.",
- "\green You feel a tingling sensation in your chest.",
- "\green Your entire body vibrates."))
+ to_chat(H, pick("You feel a little different. ",
+ "You feel very strange. ",
+ "Your stomach churns. ",
+ "Your skin feels loose. ",
+ "You feel a stabbing pain in your head. ",
+ "You feel a tingling sensation in your chest. ",
+ "Your entire body vibrates. "))
if(prob(50))
scramble(1, H, weakness * severity)
else
@@ -54,13 +54,13 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
if(prob(75))
- to_chat(H, pick("\green You feel a little different.",
- "\green You feel very strange.",
- "\green Your stomach churns.",
- "\green Your skin feels loose.",
- "\green You feel a stabbing pain in your head.",
- "\green You feel a tingling sensation in your chest.",
- "\green Your entire body vibrates."))
+ to_chat(H, pick("You feel a little different. ",
+ "You feel very strange. ",
+ "Your stomach churns. ",
+ "Your skin feels loose. ",
+ "You feel a stabbing pain in your head. ",
+ "You feel a tingling sensation in your chest. ",
+ "Your entire body vibrates. "))
if(prob(25))
if(prob(75))
scramble(1, H, weakness * severity)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
index cde5632eaa5..b1071222b17 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
@@ -9,11 +9,11 @@
var/weakness = GetAnomalySusceptibility(toucher)
if(prob(weakness * 100))
var/mob/living/carbon/C = toucher
- to_chat(C, "\blue You feel a soothing energy invigorate you.")
+ to_chat(C, "You feel a soothing energy invigorate you. ")
if(ishuman(toucher))
var/mob/living/carbon/human/H = toucher
- for(var/obj/item/organ/external/affecting in H.organs)
+ for(var/obj/item/organ/external/affecting in H.bodyparts)
if(affecting && istype(affecting))
affecting.heal_damage(25 * weakness, 25 * weakness)
//H:heal_organ_damage(25, 25)
@@ -42,7 +42,7 @@
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
if(prob(10))
- to_chat(C, "\blue You feel a soothing energy radiating from something nearby.")
+ to_chat(C, "You feel a soothing energy radiating from something nearby. ")
C.adjustBruteLoss(-1 * weakness)
C.adjustFireLoss(-1 * weakness)
C.adjustToxLoss(-1 * weakness)
@@ -57,7 +57,7 @@
for(var/mob/living/carbon/C in range(src.effectrange,T))
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
- to_chat(C, "\blue A wave of energy invigorates you.")
+ to_chat(C, "A wave of energy invigorates you. ")
C.adjustBruteLoss(-5 * weakness)
C.adjustFireLoss(-5 * weakness)
C.adjustToxLoss(-5 * weakness)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
index 86828f7ef39..fb1f9645735 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm
@@ -15,7 +15,7 @@
/datum/artifact_effect/heat/DoEffectTouch(var/mob/user)
if(holder)
- to_chat(user, "\red You feel a wave of heat travel up your spine!")
+ to_chat(user, "You feel a wave of heat travel up your spine! ")
var/datum/gas_mixture/env = holder.loc.return_air()
if(env)
env.temperature += rand(5,50)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
index 399b7252d20..f9e3803ff9f 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
@@ -8,7 +8,7 @@
var/weakness = GetAnomalySusceptibility(toucher)
if(iscarbon(toucher) && prob(weakness * 100))
var/mob/living/carbon/C = toucher
- to_chat(C, "\red A painful discharge of energy strikes you!")
+ to_chat(C, "A painful discharge of energy strikes you! ")
C.adjustOxyLoss(rand(5,25) * weakness)
C.adjustToxLoss(rand(5,25) * weakness)
C.adjustBruteLoss(rand(5,25) * weakness)
@@ -26,7 +26,7 @@
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
if(prob(10))
- to_chat(C, "\red You feel a painful force radiating from something nearby.")
+ to_chat(C, "You feel a painful force radiating from something nearby. ")
C.adjustBruteLoss(1 * weakness)
C.adjustFireLoss(1 * weakness)
C.adjustToxLoss(1 * weakness)
@@ -40,7 +40,7 @@
for(var/mob/living/carbon/C in range(effectrange, T))
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
- to_chat(C, "\red A wave of painful energy strikes you!")
+ to_chat(C, "A wave of painful energy strikes you! ")
C.adjustBruteLoss(3 * weakness)
C.adjustFireLoss(3 * weakness)
C.adjustToxLoss(3 * weakness)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
index 30316fc3342..191c0beb3fe 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
@@ -10,7 +10,7 @@
if(user)
if(istype(user, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
- to_chat(R, "\blue Your systems report damaged components mending by themselves!")
+ to_chat(R, "Your systems report damaged components mending by themselves! ")
R.adjustBruteLoss(rand(-10,-30))
R.adjustFireLoss(rand(-10,-30))
return 1
@@ -20,7 +20,7 @@
var/turf/T = get_turf(holder)
for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
if(prob(10))
- to_chat(M, "\blue SYSTEM ALERT: Beneficial energy field detected!")
+ to_chat(M, "SYSTEM ALERT: Beneficial energy field detected! ")
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
M.updatehealth()
@@ -30,7 +30,7 @@
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
- to_chat(M, "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!")
+ to_chat(M, "SYSTEM ALERT: Structural damage has been repaired by energy pulse! ")
M.adjustBruteLoss(-10)
M.adjustFireLoss(-10)
M.updatehealth()
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
index da22a45b32b..43f49a6ee36 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
@@ -10,7 +10,7 @@
if(user)
if(istype(user, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
- to_chat(R, "\red Your systems report severe damage has been inflicted!")
+ to_chat(R, "Your systems report severe damage has been inflicted! ")
R.adjustBruteLoss(rand(10,50))
R.adjustFireLoss(rand(10,50))
return 1
@@ -20,7 +20,7 @@
var/turf/T = get_turf(holder)
for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
if(prob(10))
- to_chat(M, "\red SYSTEM ALERT: Harmful energy field detected!")
+ to_chat(M, "SYSTEM ALERT: Harmful energy field detected! ")
M.adjustBruteLoss(1)
M.adjustFireLoss(1)
M.updatehealth()
@@ -30,7 +30,7 @@
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
- to_chat(M, "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!")
+ to_chat(M, "SYSTEM ALERT: Structural damage inflicted by energy pulse! ")
M.adjustBruteLoss(10)
M.adjustFireLoss(10)
M.updatehealth()
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
index 1f098ddfa6b..ec3c5ced009 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
@@ -12,12 +12,12 @@
var/weakness = GetAnomalySusceptibility(toucher)
if(ishuman(toucher) && prob(weakness * 100))
var/mob/living/carbon/human/H = toucher
- to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
+ to_chat(H, pick("You feel like taking a nap. ","You feel a yawn coming on. ","You feel a little tired. "))
H.AdjustDrowsy(rand(5,25) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
H.AdjustEyeBlurry(rand(1,3) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
return 1
else if(isrobot(toucher))
- to_chat(toucher, "\red SYSTEM ALERT: CPU cycles slowing down.")
+ to_chat(toucher, "SYSTEM ALERT: CPU cycles slowing down. ")
return 1
/datum/artifact_effect/sleepy/DoEffectAura()
@@ -27,11 +27,11 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
if(prob(10))
- to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
+ to_chat(H, pick("You feel like taking a nap. ","You feel a yawn coming on. ","You feel a little tired. "))
H.AdjustDrowsy(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
H.AdjustEyeBlurry(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
- to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
+ to_chat(R, "SYSTEM ALERT: CPU cycles slowing down. ")
return 1
/datum/artifact_effect/sleepy/DoEffectPulse()
@@ -40,9 +40,9 @@
for(var/mob/living/carbon/human/H in range(src.effectrange, T))
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
- to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
+ to_chat(H, pick("You feel like taking a nap. ","You feel a yawn coming on. ","You feel a little tired. "))
H.AdjustDrowsy(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
H.AdjustEyeBlurry(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
- to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
+ to_chat(R, "SYSTEM ALERT: CPU cycles slowing down. ")
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
index 327e732fa12..bc2aa655e34 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
@@ -11,7 +11,7 @@
var/mob/living/carbon/C = toucher
var/susceptibility = GetAnomalySusceptibility(C)
if(prob(susceptibility * 100))
- to_chat(C, "\red A powerful force overwhelms your consciousness.")
+ to_chat(C, "A powerful force overwhelms your consciousness. ")
C.Weaken(rand(1,10) * susceptibility)
C.stuttering += 30 * susceptibility
C.Stun(rand(1,10) * susceptibility)
@@ -22,13 +22,13 @@
for(var/mob/living/carbon/C in range(src.effectrange,T))
var/susceptibility = GetAnomalySusceptibility(C)
if(prob(10 * susceptibility))
- to_chat(C, "\red Your body goes numb for a moment.")
+ to_chat(C, "Your body goes numb for a moment. ")
C.Weaken(2)
C.stuttering += 2
if(prob(10))
C.Stun(1)
else if(prob(10))
- to_chat(C, "\red You feel numb.")
+ to_chat(C, "You feel numb. ")
/datum/artifact_effect/stun/DoEffectPulse()
if(holder)
@@ -36,7 +36,7 @@
for(var/mob/living/carbon/C in range(src.effectrange,T))
var/susceptibility = GetAnomalySusceptibility(C)
if(prob(100 * susceptibility))
- to_chat(C, "\red A wave of energy overwhelms your senses!")
+ to_chat(C, "A wave of energy overwhelms your senses! ")
C.SetWeakened(4 * susceptibility)
C.stuttering = 4 * susceptibility
if(prob(10))
diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm
index ea91ef76b35..7094f2d00f4 100644
--- a/code/modules/research/xenoarchaeology/chemistry.dm
+++ b/code/modules/research/xenoarchaeology/chemistry.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "solution_tray"
materials = list(MAT_GLASS=5)
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
amount_per_transfer_from_this = 1
possible_transfer_amounts = list(1, 2)
volume = 2
@@ -15,7 +15,7 @@ obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/
var/new_label = input("What should the new label be?","Label solution tray")
if(new_label)
name = "solution tray ([new_label])"
- to_chat(user, "\blue You write on the label of the solution tray.")
+ to_chat(user, "You write on the label of the solution tray. ")
else
..(W, user)
@@ -51,4 +51,4 @@ obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/
/obj/item/weapon/reagent_containers/glass/beaker/fuel
name = "beaker 'fuel'"
- list_reagents = list("fuel" = 50)
\ No newline at end of file
+ list_reagents = list("fuel" = 50)
diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm
index 8ddcf27593b..5fd432a7a6f 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_special.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm
@@ -82,7 +82,7 @@
//use up stored charges
if(charges >= 10)
charges -= 10
- new /obj/effect/spider/eggcluster(pick(view(1,src)))
+ new /obj/structure/spider/eggcluster(pick(view(1,src)))
if(charges >= 3)
if(prob(5))
@@ -99,7 +99,7 @@
if(charges >= 0.1)
if(prob(5))
- src.visible_message("\red [bicon(src)] [src]'s eyes glow ruby red for a moment!")
+ src.visible_message("[bicon(src)] [src]'s eyes glow ruby red for a moment! ")
charges -= 0.1
//check on our shadow wights
@@ -129,7 +129,7 @@
var/target = pick("chest","groin","head","l_arm","r_arm","r_leg","l_leg","l_hand","r_hand","l_foot","r_foot")
M.apply_damage(rand(5, 10), BRUTE, target)
- to_chat(M, "\red The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out.")
+ to_chat(M, "The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out. ")
var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc)
B.target_turf = pick(range(1, src))
B.blood_DNA = list()
@@ -200,4 +200,4 @@
processing_objects.Remove(src)
/obj/effect/shadow_wight/Bump(var/atom/obstacle)
- to_chat(obstacle, "\red You feel a chill run down your spine!")
+ to_chat(obstacle, "You feel a chill run down your spine! ")
diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
index 031e23c260d..178e0600ff7 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
@@ -57,7 +57,7 @@
var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\
"[holder_atom] seems to be focussing on [source]...",\
"[holder_atom] seems to turn it's attention to [source]...")
- holder_atom.loc.visible_message("\blue [bicon(holder_atom)] [pick(options)]")
+ holder_atom.loc.visible_message("[bicon(holder_atom)] [pick(options)] ")
if(prob(20))
spawn(2)
@@ -121,5 +121,5 @@
listening|=M
for(var/mob/M in listening)
- to_chat(M, "[bicon(holder_atom)] [holder_atom] reverberates, \blue\"[msg]\"")
+ to_chat(M, "[bicon(holder_atom)] [holder_atom] reverberates, \"[msg]\" ")
last_talk_time = world.time
diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
index 1da7e900767..a4a52b3ea5f 100644
--- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
+++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
@@ -54,11 +54,11 @@ datum/genesequence
W.loc = src.loc
switch(scan_fossil(W))
if(1)
- src.visible_message("\red [bicon(src)] [src] scans the fossil and rejects it.")
+ src.visible_message("[bicon(src)] [src] scans the fossil and rejects it. ")
if(2)
- visible_message("\red [bicon(src)] [src] can not extract any more genetic data from new fossils.")
+ visible_message("[bicon(src)] [src] can not extract any more genetic data from new fossils. ")
if(4)
- src.visible_message("\blue [bicon(src)] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it.")
+ src.visible_message("[bicon(src)] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it. ")
qdel(W)
updateDialog()
else if(istype(W, /obj/item/weapon/storage))
@@ -78,13 +78,13 @@ datum/genesequence
S.remove_from_storage(F, src) //This will move the item to this item's contents
qdel(F)
updateDialog()
- var/outmsg = "\blue You empty all the fossils from [S] into [src]."
+ var/outmsg = "You empty all the fossils from [S] into [src]. "
if(numaccepted)
- outmsg += " \blue[numaccepted] fossils were accepted and consumed as [src] extracts genetic data from them."
+ outmsg += " [numaccepted] fossils were accepted and consumed as [src] extracts genetic data from them. "
if(numrejected)
- outmsg += " \red[numrejected] fossils were rejected."
+ outmsg += " [numrejected] fossils were rejected. "
if(full)
- outmsg += " \red[src] can not extract any more genetic data from new fossils."
+ outmsg += " [src] can not extract any more genetic data from new fossils. "
visible_message(outmsg)
else
@@ -182,21 +182,20 @@ datum/genesequence
var/datum/genesequence/cloned_genesequence = completed_genesequences[sequence_num]
if(pod1)
if(pod1.occupant)
- visible_message("\red [bicon(src)] The cloning pod is currently occupied.")
+ visible_message("[bicon(src)] The cloning pod is currently occupied. ")
else if(pod1.biomass < CLONE_BIOMASS)
- visible_message("\red [bicon(src)] Not enough biomass in the cloning pod.")
+ visible_message("[bicon(src)] Not enough biomass in the cloning pod. ")
else if(pod1.mess)
- visible_message("\red [bicon(src)] Error: clonepod malfunction.")
+ visible_message("[bicon(src)] Error: clonepod malfunction. ")
else
- visible_message("\blue [bicon(src)] [src] clones something from a reconstituted gene sequence!")
+ visible_message("[bicon(src)] [src] clones something from a reconstituted gene sequence! ")
playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3)
pod1.occupant = new cloned_genesequence.spawned_type(pod1)
- pod1.locked = 1
pod1.icon_state = "pod_1"
//pod1.occupant.name = "[pod1.occupant.name] ([rand(0,999)])"
pod1.biomass -= CLONE_BIOMASS
else
- to_chat(usr, "\red [bicon(src)] Unable to locate cloning pod!")
+ to_chat(usr, "[bicon(src)] Unable to locate cloning pod! ")
else
..()
@@ -240,7 +239,7 @@ datum/genesequence
else if(href_list["clone"])
var/sequence_num = text2num(href_list["sequence_num"])
var/datum/genesequence/cloned_genesequence = completed_genesequences[sequence_num]
- visible_message("\blue [bicon(src)] [src] clones a packet of seeds from a reconstituted gene sequence!")
+ visible_message("[bicon(src)] [src] clones a packet of seeds from a reconstituted gene sequence! ")
playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3)
new cloned_genesequence.spawned_type(src.loc)
diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm
index e4aaa4a554b..6d32b4e0ca9 100644
--- a/code/modules/research/xenoarchaeology/geosample.dm
+++ b/code/modules/research/xenoarchaeology/geosample.dm
@@ -19,7 +19,7 @@
desc = "It looks extremely delicate."
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "sliver1" //0-4
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
sharp = 1
//item_state = "electronic"
var/source_rock = "/turf/simulated/mineral/"
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
index 673f5996ade..83c3551bde4 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
@@ -73,7 +73,7 @@
results = get_scan_info(scanned_object)
src.visible_message("[name] states, \"Scanning complete.\"")
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
var/obj/item/weapon/paper/P = new(src.loc)
P.name = "[src] report #[++report_num]"
P.info = "[src] analysis report #[report_num] "
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
index 4bc8f88e618..38eaa00c6a2 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
@@ -24,13 +24,13 @@
/obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob, params)
if(istype(I,/obj/item/weapon/anobattery))
if(!inserted_battery)
- to_chat(user, "\blue You insert [I] into [src].")
+ to_chat(user, "You insert [I] into [src]. ")
user.drop_item()
I.loc = src
src.inserted_battery = I
updateDialog()
else
- to_chat(user, "\red There is already a battery in [src].")
+ to_chat(user, "There is already a battery in [src]. ")
else
return..()
diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm
index f0750f6388e..ffbf02c23bc 100644
--- a/code/modules/research/xenoarchaeology/machinery/coolant.dm
+++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm
@@ -9,43 +9,5 @@
/obj/structure/reagent_dispensers/coolanttank
name = "coolant tank"
desc = "A tank of industrial coolant"
- icon = 'icons/obj/objects.dmi'
icon_state = "coolanttank"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/coolanttank/New()
- ..()
- reagents.add_reagent("coolant",1000)
-
-/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
- if(!Proj.damage)
- explode()
-
-/obj/structure/reagent_dispensers/coolanttank/blob_act()
- explode()
-
-/obj/structure/reagent_dispensers/coolanttank/ex_act()
- explode()
-
-/obj/structure/reagent_dispensers/coolanttank/proc/explode()
- var/datum/effect/system/harmless_smoke_spread/S = new /datum/effect/system/harmless_smoke_spread
- //S.attach(src)
- S.set_up(5, 0, src.loc)
-
- playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- spawn(0)
- S.start()
-
- var/datum/gas_mixture/env = src.loc.return_air()
- if(env)
- if(reagents.total_volume > 750)
- env.temperature = 0
- else if(reagents.total_volume > 500)
- env.temperature -= 100
- else
- env.temperature -= 50
-
- sleep(10)
- if(src)
- qdel(src)
+ reagent_id = "coolant"
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
index bd2c704f21f..7bbd7408173 100644
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
@@ -226,16 +226,16 @@
//emergency stop if seal integrity reaches 0
if(scanner_seal_integrity <= 0 || (scanner_temperature >= 1273 && !rad_shield))
stop_scanning()
- src.visible_message("\blue [bicon(src)] buzzes unhappily. It has failed mid-scan!", 2)
+ src.visible_message("[bicon(src)] buzzes unhappily. It has failed mid-scan! ", 2)
if(prob(5))
- src.visible_message("\blue [bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2)
+ src.visible_message("[bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")]. ", 2)
else
//gradually cool down over time
if(scanner_temperature > 0)
scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0)
if(prob(0.75))
- src.visible_message("\blue [bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2)
+ src.visible_message("[bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")]. ", 2)
last_process_worldtime = world.time
/obj/machinery/radiocarbon_spectrometer/proc/stop_scanning()
@@ -253,11 +253,11 @@
used_coolant = 0
/obj/machinery/radiocarbon_spectrometer/proc/complete_scan()
- src.visible_message("\blue [bicon(src)] makes an insistent chime.", 2)
+ src.visible_message("[bicon(src)] makes an insistent chime. ", 2)
if(scanned_item)
//create report
- playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
var/obj/item/weapon/paper/P = new(src)
P.name = "[src] report #[++report_num]: [scanned_item.name]"
P.stamped = list(/obj/item/weapon/stamp)
diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
index 8974d7ee1b0..23ba3eb39a8 100644
--- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
+++ b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
@@ -40,7 +40,7 @@
/obj/item/weapon/anodevice/attackby(var/obj/I as obj, var/mob/user as mob, params)
if(istype(I, /obj/item/weapon/anobattery))
if(!inserted_battery)
- to_chat(user, "\blue You insert the battery.")
+ to_chat(user, "You insert the battery. ")
user.drop_item()
I.loc = src
inserted_battery = I
@@ -131,13 +131,13 @@
//work out if we need to shutdown
if(inserted_battery.stored_charge <= 0)
- src.loc.visible_message("\blue [bicon(src)] [src] buzzes.", "\blue [bicon(src)] You hear something buzz.")
+ src.loc.visible_message("[bicon(src)] [src] buzzes. ", "[bicon(src)] You hear something buzz. ")
shutdown_emission()
else if(world.time > time_end)
- src.loc.visible_message("\blue [bicon(src)] [src] chimes.", "\blue [bicon(src)] You hear something chime.")
+ src.loc.visible_message("[bicon(src)] [src] chimes. ", "[bicon(src)] You hear something chime. ")
shutdown_emission()
else
- src.visible_message("\blue [bicon(src)] [src] buzzes.", "\blue [bicon(src)] You hear something buzz.")
+ src.visible_message("[bicon(src)] [src] buzzes. ", "[bicon(src)] You hear something buzz. ")
shutdown_emission()
last_process = world.time
@@ -164,7 +164,7 @@
if(href_list["startup"])
if(inserted_battery && inserted_battery.battery_effect && (inserted_battery.stored_charge > 0) )
activated = 1
- src.visible_message("\blue [bicon(src)] [src] whirrs.", "[bicon(src)]\blue You hear something whirr.")
+ src.visible_message("[bicon(src)] [src] whirrs. ", "[bicon(src)] You hear something whirr. ")
if(!inserted_battery.battery_effect.activated)
inserted_battery.battery_effect.ToggleActivate(1)
time_end = world.time + duration
@@ -201,15 +201,15 @@
if(activated && inserted_battery.battery_effect.effect == EFFECT_TOUCH && !isnull(inserted_battery))
inserted_battery.battery_effect.DoEffectTouch(M)
inserted_battery.use_power(energy_consumed_on_touch)
- user.visible_message("\blue [user] taps [M] with [src], and it shudders on contact.")
+ user.visible_message("[user] taps [M] with [src], and it shudders on contact. ")
else
- user.visible_message("\blue [user] taps [M] with [src], but nothing happens.")
+ user.visible_message("[user] taps [M] with [src], but nothing happens. ")
//admin logging
user.lastattacked = M
M.lastattacker = user
if(inserted_battery.battery_effect)
- user.attack_log += "\[[time_stamp()]\] Tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype]) "
- M.attack_log += "\[[time_stamp()]\] Tapped by [key_name(user)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype]) "
+ user.create_attack_log(" Tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype]) ")
+ M.create_attack_log(" Tapped by [key_name(user)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype]) ")
msg_admin_attack("[key_name_admin(user)] tapped [key_name_admin(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" )
diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
index 9e9de74e73e..c3e29fe8638 100644
--- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
+++ b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
@@ -23,6 +23,9 @@
item_state = "cespace_suit"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
+ species_fit = null
+ sprite_sheets = null
+ sprite_sheets_obj = null
/obj/item/clothing/head/helmet/space/eva/anomaly
name = "Excavation hood"
@@ -30,3 +33,6 @@
icon_state = "cespace_helmet"
item_state = "cespace_helmet"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
+ species_fit = null
+ sprite_sheets = null
+ sprite_sheets_obj = null
diff --git a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
index 3e7b4a05c12..a75378b0a26 100644
--- a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
+++ b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
@@ -12,32 +12,32 @@
/obj/machinery/bunsen_burner/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/reagent_containers))
if(held_container)
- to_chat(user, "\red You must remove the [held_container] first.")
+ to_chat(user, "You must remove the [held_container] first. ")
else
user.drop_item(src)
held_container = W
held_container.loc = src
- to_chat(user, "\blue You put the [held_container] onto the [src].")
+ to_chat(user, "You put the [held_container] onto the [src]. ")
var/image/I = image("icon"=W, "layer"=FLOAT_LAYER)
underlays += I
if(heating)
spawn(heat_time)
try_heating()
else
- to_chat(user, "\red You can't put the [W] onto the [src].")
+ to_chat(user, "You can't put the [W] onto the [src]. ")
/obj/machinery/bunsen_burner/attack_hand(mob/user as mob)
if(held_container)
underlays = null
- to_chat(user, "\blue You remove the [held_container] from the [src].")
+ to_chat(user, "You remove the [held_container] from the [src]. ")
held_container.loc = src.loc
held_container.attack_hand(user)
held_container = null
else
- to_chat(user, "\red There is nothing on the [src].")
+ to_chat(user, "There is nothing on the [src]. ")
/obj/machinery/bunsen_burner/proc/try_heating()
- src.visible_message("\blue [bicon(src)] [src] hisses.")
+ src.visible_message("[bicon(src)] [src] hisses. ")
if(held_container && heating)
heated = 1
held_container.reagents.handle_reactions()
diff --git a/code/modules/research/xenoarchaeology/tools/gearbelt.dm b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
index e2d4839d2b4..8912e9248c8 100644
--- a/code/modules/research/xenoarchaeology/tools/gearbelt.dm
+++ b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
@@ -5,24 +5,24 @@
icon_state = "gearbelt"
item_state = "utility"
can_hold = list(
- "/obj/item/weapon/storage/box/samplebags",
- "/obj/item/device/core_sampler",
- "/obj/item/device/beacon_locator",
- "/obj/item/device/radio/beacon",
- "/obj/item/device/gps",
- "/obj/item/device/measuring_tape",
- "/obj/item/device/flashlight",
- "/obj/item/weapon/pickaxe",
- "/obj/item/device/depth_scanner",
- "/obj/item/device/camera",
- "/obj/item/weapon/paper",
- "/obj/item/weapon/photo",
- "/obj/item/weapon/folder",
- "/obj/item/weapon/pen",
- "/obj/item/weapon/folder",
- "/obj/item/weapon/clipboard",
- "/obj/item/weapon/anodevice",
- "/obj/item/clothing/glasses",
- "/obj/item/weapon/wrench",
- "/obj/item/weapon/storage/box/excavation",
- "/obj/item/weapon/anobattery")
+ /obj/item/weapon/storage/box/samplebags,
+ /obj/item/device/core_sampler,
+ /obj/item/device/beacon_locator,
+ /obj/item/device/radio/beacon,
+ /obj/item/device/gps,
+ /obj/item/device/measuring_tape,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/pickaxe,
+ /obj/item/device/depth_scanner,
+ /obj/item/device/camera,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/folder,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/folder,
+ /obj/item/weapon/clipboard,
+ /obj/item/weapon/anodevice,
+ /obj/item/clothing/glasses,
+ /obj/item/weapon/wrench,
+ /obj/item/weapon/storage/box/excavation,
+ /obj/item/weapon/anobattery)
diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
index 37ecc240cf2..775a4e25c98 100644
--- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
+++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
@@ -31,14 +31,14 @@
M.Weaken(3)
cell.charge -= power_use
if(prob(5))
- to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]")
+ to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")] ")
if(field_type == "iron")
for(var/mob/living/silicon/M in T)
M.Weaken(3)
cell.charge -= power_use
if(prob(5))
- to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]")
+ to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")] ")
for(var/obj/item/I in T)
if(!suspension_field.contents.len)
@@ -50,7 +50,7 @@
M.Weaken(3)
cell.charge -= power_use
if(prob(5))
- to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]")
+ to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")] ")
if(cell.charge <= 0)
deactivate()
@@ -248,7 +248,7 @@
success = 1
for(var/mob/living/carbon/C in T)
C.AdjustWeakened(5)
- C.visible_message("\blue [bicon(C)] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ C.visible_message("[bicon(C)] [C] begins to float in the air! ","You feel tingly and light, but it is difficult to move.")
if("nitrogen")
success = 1
//
@@ -271,19 +271,19 @@
success = 1
for(var/mob/living/silicon/R in T)
R.AdjustWeakened(5)
- R.visible_message("\blue [bicon(R)] [R] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ R.visible_message("[bicon(R)] [R] begins to float in the air! ","You feel tingly and light, but it is difficult to move.")
//
//in case we have a bad field type
if(!success)
return
for(var/mob/living/simple_animal/C in T)
- C.visible_message("\blue [bicon(C)] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ C.visible_message("[bicon(C)] [C] begins to float in the air! ","You feel tingly and light, but it is difficult to move.")
C.AdjustWeakened(5)
suspension_field = new(T)
suspension_field.field_type = field_type
- src.visible_message("\blue [bicon(src)] [src] activates with a low hum.")
+ src.visible_message("[bicon(src)] [src] activates with a low hum. ")
icon_state = "suspension3"
for(var/obj/item/I in T)
@@ -293,7 +293,7 @@
if(collected)
suspension_field.icon_state = "energynet"
suspension_field.overlays += "shield2"
- src.visible_message("\blue [bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")
+ src.visible_message("[bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"]. ")
else
if(istype(T,/turf/simulated/mineral) || istype(T,/turf/simulated/wall))
suspension_field.icon_state = "shieldsparkles"
@@ -308,7 +308,7 @@
to_chat(M, "You no longer feel like floating. ")
M.SetWeakened(min(M.weakened, 3))
- src.visible_message("\blue [bicon(src)] [src] deactivates with a gentle shudder.")
+ src.visible_message("[bicon(src)] [src] deactivates with a gentle shudder. ")
qdel(suspension_field)
icon_state = "suspension2"
@@ -323,7 +323,7 @@
set category = "Object"
if(anchored)
- to_chat(usr, "\red You cannot rotate [src], it has been firmly fixed to the floor.")
+ to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor. ")
else
dir = turn(dir, 90)
@@ -333,7 +333,7 @@
set category = "Object"
if(anchored)
- to_chat(usr, "\red You cannot rotate [src], it has been firmly fixed to the floor.")
+ to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor. ")
else
dir = turn(dir, -90)
diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm
index 39dc6738f4f..b17569da383 100644
--- a/code/modules/research/xenoarchaeology/tools/tools.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools.dm
@@ -7,7 +7,7 @@
desc = "A coiled metallic tape used to check dimensions and lengths."
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "measuring"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
//todo: dig site tape
@@ -17,8 +17,8 @@
icon = 'icons/obj/mining.dmi'
icon_state = "satchel"
slot_flags = SLOT_BELT | SLOT_POCKET
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
storage_slots = 50
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
- max_w_class = 3
- can_hold = list("/obj/item/weapon/fossil")
+ max_w_class = WEIGHT_CLASS_NORMAL
+ can_hold = list(/obj/item/weapon/fossil)
diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
index d020845784c..4edf8f69d9a 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "flashgun"
item_state = "lampgreen"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
var/nearest_artifact_id = "unknown"
var/nearest_artifact_distance = -1
diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
index e8daea89b74..8c4ec23004c 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
@@ -19,7 +19,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "sampler0"
item_state = "screwdriver_brown"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
//slot_flags = SLOT_BELT
var/sampled_turf = ""
var/num_stored_bags = 10
@@ -27,16 +27,16 @@
/obj/item/device/core_sampler/examine(mob/user)
if(..(user, 2))
- to_chat(user, "\blue Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining.")
+ to_chat(user, "Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining. ")
/obj/item/device/core_sampler/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/weapon/evidencebag))
if(num_stored_bags < 10)
qdel(W)
num_stored_bags += 1
- to_chat(user, "\blue You insert the [W] into the core sampler.")
+ to_chat(user, "You insert the [W] into the core sampler. ")
else
- to_chat(user, "\red The core sampler can not fit any more bags!")
+ to_chat(user, "The core sampler can not fit any more bags! ")
else
return ..()
@@ -52,9 +52,9 @@
if(geo_data)
if(filled_bag)
- to_chat(user, "\red The core sampler is full!")
+ to_chat(user, "The core sampler is full! ")
else if(num_stored_bags < 1)
- to_chat(user, "\red The core sampler is out of sample bags!")
+ to_chat(user, "The core sampler is out of sample bags! ")
else
//create a new sample bag which we'll fill with rock samples
filled_bag = new /obj/item/weapon/evidencebag(src)
@@ -73,15 +73,15 @@
filled_bag.icon_state = "evidence"
var/image/I = image("icon"=R, "layer"=FLOAT_LAYER)
filled_bag.underlays += I
- filled_bag.w_class = 1
+ filled_bag.w_class = WEIGHT_CLASS_TINY
- to_chat(user, "\blue You take a core sample of the [item_to_sample].")
+ to_chat(user, "You take a core sample of the [item_to_sample]. ")
else
- to_chat(user, "\red You are unable to take a sample of [item_to_sample].")
+ to_chat(user, "You are unable to take a sample of [item_to_sample]. ")
/obj/item/device/core_sampler/attack_self()
if(filled_bag)
- to_chat(usr, "\blue You eject the full sample bag.")
+ to_chat(usr, "You eject the full sample bag. ")
var/success = 0
if(istype(src.loc, /mob))
var/mob/M = src.loc
@@ -91,4 +91,4 @@
filled_bag = null
icon_state = "sampler0"
else
- to_chat(usr, "\red The core sampler is empty.")
+ to_chat(usr, "The core sampler is empty. ")
diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
index eca8c423273..ad195a0a141 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
@@ -9,7 +9,7 @@
icon = 'icons/obj/pda.dmi'
icon_state = "crap"
item_state = "analyzer"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
var/list/positive_locations = list()
var/datum/depth_scan/current
@@ -24,7 +24,7 @@
var/material = "unknown"
/obj/item/device/depth_scanner/proc/scan_atom(var/mob/user, var/atom/A)
- user.visible_message("\blue [user] scans [A], the air around them humming gently.")
+ user.visible_message("[user] scans [A], the air around them humming gently. ")
if(istype(A,/turf/simulated/mineral))
var/turf/simulated/mineral/M = A
if((M.finds && M.finds.len) || M.artifact_find)
@@ -46,7 +46,7 @@
positive_locations.Add(D)
for(var/mob/L in range(src, 1))
- to_chat(L, "\blue [bicon(src)] [src] pings.")
+ to_chat(L, "[bicon(src)] [src] pings. ")
else if(istype(A,/obj/structure/boulder))
var/obj/structure/boulder/B = A
@@ -65,7 +65,7 @@
positive_locations.Add(D)
for(var/mob/L in range(src, 1))
- to_chat(L, "\blue [bicon(src)] [src] pings [pick("madly","wildly","excitedly","crazily")]!.")
+ to_chat(L, "[bicon(src)] [src] pings [pick("madly","wildly","excitedly","crazily")]!. ")
/obj/item/device/depth_scanner/attack_self(var/mob/user as mob)
return src.interact(user)
diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
index 1dd6b769390..ec00023ab29 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
@@ -12,7 +12,7 @@
excavation_amount = 0.5
digsound = list('sound/weapons/thudswoosh.ogg')
drill_verb = "brushing"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/one_pick
name = "1/6 pick"
@@ -24,7 +24,7 @@
excavation_amount = 1
digsound = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/two_pick
name = "1/3 pick"
@@ -36,7 +36,7 @@
excavation_amount = 2
digsound = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/three_pick
name = "1/2 pick"
@@ -48,7 +48,7 @@
excavation_amount = 3
digsound = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/four_pick
name = "2/3 pick"
@@ -60,7 +60,7 @@
excavation_amount = 4
digsound = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/five_pick
name = "5/6 pick"
@@ -72,7 +72,7 @@
excavation_amount = 5
digsound = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/six_pick
name = "1/1 pick"
@@ -84,7 +84,7 @@
excavation_amount = 6
digsound = list('sound/items/Screwdriver.ogg')
drill_verb = "delicately picking"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/pickaxe/hand
name = "hand pickaxe"
@@ -96,7 +96,7 @@
excavation_amount = 15
digsound = list('sound/items/Crowbar.ogg')
drill_verb = "clearing"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/pickaxe/robotic
name = "robotic pickaxe"
@@ -125,16 +125,16 @@
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots = 7
- w_class = 2
- can_hold = list("/obj/item/weapon/pickaxe/brush",\
- "/obj/item/weapon/pickaxe/one_pick",\
- "/obj/item/weapon/pickaxe/two_pick",\
- "/obj/item/weapon/pickaxe/three_pick",\
- "/obj/item/weapon/pickaxe/four_pick",\
- "/obj/item/weapon/pickaxe/five_pick",\
- "/obj/item/weapon/pickaxe/six_pick")
+ w_class = WEIGHT_CLASS_SMALL
+ can_hold = list(/obj/item/weapon/pickaxe/brush,\
+ /obj/item/weapon/pickaxe/one_pick,\
+ /obj/item/weapon/pickaxe/two_pick,\
+ /obj/item/weapon/pickaxe/three_pick,\
+ /obj/item/weapon/pickaxe/four_pick,\
+ /obj/item/weapon/pickaxe/five_pick,\
+ /obj/item/weapon/pickaxe/six_pick)
max_combined_w_class = 17
- max_w_class = 4
+ max_w_class = WEIGHT_CLASS_BULKY
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
/obj/item/weapon/storage/box/excavation/New()
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 7b27642722b..40f20ea4dde 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -3,11 +3,16 @@
visible_icon = 1
icon = 'icons/obj/abductor.dmi'
icon_state = "camera_target"
+ var/allowed_area = null
+/mob/camera/aiEye/remote/xenobio/New(loc)
+ var/area/A = get_area(loc)
+ allowed_area = A.name
+ ..()
-/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
+/mob/camera/aiEye/remote/xenobio/setLoc(t)
var/area/new_area = get_area(t)
- if(new_area && new_area.name == "Xenobiology Lab" || istype(new_area, /area/toxins/xenobiology ))
+ if(new_area && new_area.name == allowed_area || istype(new_area, /area/toxins/xenobiology ))
return ..()
else
return
@@ -16,6 +21,7 @@
name = "Slime management console"
desc = "A computer used for remotely handling slimes."
networks = list("SS13")
+ circuit = /obj/item/weapon/circuitboard/xenobiology
off_action = new /datum/action/innate/camera_off/xenobio
var/datum/action/innate/slime_place/slime_place_action = new
var/datum/action/innate/slime_pick_up/slime_up_action = new
@@ -30,8 +36,7 @@
icon_keyboard = "rd_key"
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
- eyeobj = new /mob/camera/aiEye/remote/xenobio()
- eyeobj.loc = get_turf(src)
+ eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
eyeobj.origin = src
eyeobj.visible_icon = 1
eyeobj.icon = 'icons/obj/abductor.dmi'
@@ -62,6 +67,26 @@
return
return ..()
+/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
+ monkeys++
+ to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored. ")
+ user.drop_item()
+ qdel(O)
+ return
+ else if(istype(O, /obj/item/weapon/storage/bag))
+ var/obj/item/weapon/storage/P = O
+ var/loaded = 0
+ for(var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/MC in P.contents)
+ loaded = 1
+ monkeys++
+ P.remove_from_storage(MC)
+ qdel(MC)
+ if(loaded)
+ to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored. ")
+ return
+ ..()
+
/datum/action/innate/camera_off/xenobio/Activate()
if(!target || !ishuman(target))
return
@@ -77,9 +102,8 @@
origin.monkey_recycle_action.Remove(C)
//All of this stuff below could probably be a proc for all advanced cameras, only the action removal needs to be camera specific
remote_eye.eye_user = null
+ C.reset_perspective(null)
if(C.client)
- C.client.perspective = MOB_PERSPECTIVE
- C.client.eye = src
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
C.client.images -= chunk.obscured
@@ -104,6 +128,8 @@
S.forceMove(remote_eye.loc)
S.visible_message("[S] warps in!")
X.stored_slimes -= S
+ else
+ to_chat(owner, "Target is not near a camera. Cannot proceed. ")
/datum/action/innate/slime_pick_up
name = "Pick up Slime"
@@ -127,7 +153,8 @@
S.visible_message("[S] vanishes in a flash of light!")
S.forceMove(X)
X.stored_slimes += S
-
+ else
+ to_chat(owner, "Target is not near a camera. Cannot proceed. ")
/datum/action/innate/feed_slime
name = "Feed Slimes"
@@ -146,7 +173,8 @@
food.LAssailant = C
X.monkeys --
to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
-
+ else
+ to_chat(owner, "Target is not near a camera. Cannot proceed. ")
/datum/action/innate/monkey_recycle
name = "Recycle Monkeys"
@@ -163,5 +191,7 @@
for(var/mob/living/carbon/human/M in remote_eye.loc)
if(issmall(M) && M.stat)
M.visible_message("[M] vanishes as they are reclaimed for recycling!")
- X.monkeys += 0.2
+ X.monkeys = round(X.monkeys + 0.2,0.1)
qdel(M)
+ else
+ to_chat(owner, "Target is not near a camera. Cannot proceed. ")
\ No newline at end of file
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index ab57eeefadb..6846548ee6d 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -7,7 +7,7 @@
icon = 'icons/mob/slimes.dmi'
icon_state = "grey slime extract"
force = 1
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 0
throw_speed = 3
throw_range = 6
@@ -25,8 +25,8 @@
..()
/obj/item/slime_extract/New()
- ..()
- create_reagents(100)
+ ..()
+ create_reagents(100)
/obj/item/slime_extract/grey
name = "grey slime extract"
@@ -121,10 +121,12 @@
/obj/item/slimepotion
name = "slime potion"
desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances."
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "biotech=4"
-/obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user , proximity)
+/obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user, proximity_flag)
+ if(!proximity_flag)
+ return
if(istype(target))
to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb. ") // le fluff faec
return
@@ -174,7 +176,7 @@
/obj/item/slimepotion/sentience
name = "sentience potion"
- desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being."
+ desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
origin_tech = "biotech=5"
@@ -182,7 +184,9 @@
var/being_used = 0
var/sentience_type = SENTIENCE_ORGANIC
-/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user)
+/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user, proximity_flag)
+ if(!proximity_flag)
+ return
if(being_used || !ismob(M))
return
if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled
@@ -221,6 +225,50 @@
being_used = 0
..()
+/obj/item/slimepotion/transference
+ name = "consciousness transference potion"
+ desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+ origin_tech = "biotech=6"
+ var/prompted = FALSE
+ var/animal_type = SENTIENCE_ORGANIC
+
+/obj/item/slimepotion/transference/afterattack(mob/living/M, mob/user, proximity_flag)
+ if(!proximity_flag)
+ return
+ if(prompted || !ismob(M))
+ return
+ if(!isanimal(M) || M.ckey) //much like sentience, these will not work on something that is already player controlled
+ to_chat(user, "[M] already has a higher consciousness! ")
+ return ..()
+ if(M.stat)
+ to_chat(user, "[M] is dead! ")
+ return ..()
+ var/mob/living/simple_animal/SM = M
+ if(SM.sentience_type != animal_type)
+ to_chat(user, "You cannot transfer your consciousness to [SM]. ") //no controlling machines
+ return ..()
+ if(jobban_isbanned(user, ROLE_SENTIENT))
+ to_chat(user, "Your mind goes blank as you attempt to use the potion. ")
+ return
+
+ prompted = TRUE
+ if(alert("This will permanently transfer your consciousness to [SM]. Are you sure you want to do this?",,"Yes","No")=="No")
+ prompted = FALSE
+ return
+
+ to_chat(user, "You drink the potion then place your hands on [SM]... ")
+ user.mind.transfer_to(SM)
+ SM.universal_speak = 1
+ SM.faction = user.faction
+ SM.sentience_act() //Same deal here as with sentience
+ user.death()
+ to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]! ")
+ to_chat(SM, "You are now [SM]. Your allegiances, alliances, and roles are still the same as they were prior to consciousness transfer! ")
+ SM.name = "[SM.name] as [user.real_name]"
+ qdel(src)
+
/obj/item/slimepotion/steroid
name = "slime steroid"
desc = "A potent chemical mix that will cause a baby slime to generate more extract."
@@ -303,15 +351,17 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
-/obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user)
+/obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user, proximity_flag)
+ if(!proximity_flag)
+ return
..()
if(!istype(C))
to_chat(user, "The potion can only be used on items! ")
return
if(C.slowdown <= 0)
- to_chat(user, "The [C] can't be made any faster! ")
+ to_chat(user, "[C] can't be made any faster! ")
return..()
- to_chat(user, "You slather the red gunk over the [C], making it faster. ")
+ to_chat(user, "You slather the red gunk over [C], making it faster. ")
C.color = "#FF0000"
C.slowdown = 0
qdel(src)
@@ -323,8 +373,10 @@
icon_state = "bottle17"
var/uses = 3
-/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user)
+/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user, proximity_flag)
..()
+ if(!proximity_flag)
+ return
if(!uses)
qdel(src)
return
@@ -332,9 +384,9 @@
to_chat(user, "The potion can only be used on clothing! ")
return
if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
- to_chat(user, "The [C] is already fireproof! ")
+ to_chat(user, "[C] is already fireproof! ")
return ..()
- to_chat(user, "You slather the blue gunk over the [C], fireproofing it. ")
+ to_chat(user, "You slather the blue gunk over [C], fireproofing it. ")
C.name = "fireproofed [C.name]"
C.color = "#000080"
C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
@@ -366,11 +418,11 @@
else
icon_state = "golem"
-/obj/effect/golemrune/attack_hand(mob/living/user as mob)
+/obj/effect/golemrune/attack_hand(mob/living/user)
var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in src.loc)
+ for(var/mob/dead/observer/O in loc)
if(!check_observer(O))
- to_chat(O, "\red You are not eligible to become a golem.")
+ to_chat(O, "You are not eligible to become a golem. ")
continue
ghost = O
break
@@ -391,32 +443,33 @@
volunteer(O)
/obj/effect/golemrune/attack_ghost(var/mob/dead/observer/O)
- if(!O) return
+ if(!O)
+ return
volunteer(O)
/obj/effect/golemrune/proc/check_observer(var/mob/dead/observer/O)
if(!O)
- return 0
+ return FALSE
if(!O.client)
- return 0
+ return FALSE
if(O.mind && O.mind.current && O.mind.current.stat != DEAD)
- return 0
+ return FALSE
if(!O.can_reenter_corpse)
- return 0
+ return FALSE
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/effect/golemrune/proc/volunteer(var/mob/dead/observer/O)
if(O in ghosts)
ghosts.Remove(O)
- to_chat(O, "\red You are no longer signed up to be a golem.")
+ to_chat(O, "You are no longer signed up to be a golem. ")
else
if(!check_observer(O))
- to_chat(O, "\red You are not eligible to become a golem.")
+ to_chat(O, "You are not eligible to become a golem. ")
return
ghosts.Add(O)
- to_chat(O, "\blue You are signed up to be a golem.")
+ to_chat(O, "You are signed up to be a golem. ")
@@ -448,8 +501,8 @@
/obj/effect/timestop/proc/timestop()
playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1)
for(var/i in 1 to duration-1)
- for(var/A in orange (freezerange, src.loc))
- if(istype(A, /mob/living))
+ for(var/A in orange (freezerange, loc))
+ if(isliving(A))
var/mob/living/M = A
if(M in immune)
continue
@@ -499,7 +552,7 @@
singular_name = "floor tile"
desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds."
icon_state = "tile-bluespace"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 6
materials = list(MAT_METAL=500)
throwforce = 10
@@ -522,7 +575,7 @@
singular_name = "floor tile"
desc = "Time seems to flow very slowly around these tiles."
icon_state = "tile-sepia"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
force = 6
materials = list(MAT_METAL=500)
throwforce = 10
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 722c21e3ef3..2cc7cae3512 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -321,6 +321,7 @@
newsign.data["mob"] = null
newsign.data["mobtype"] = /mob/living/carbon/human
+ newsign.data["race"] = "Automated Signal"
newsign.data["name"] = source
newsign.data["realname"] = newsign.data["name"]
newsign.data["job"] = "[job]"
@@ -343,4 +344,4 @@
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
if(!pass)
- S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
\ No newline at end of file
+ S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm
index 8435d8cf992..1fea8864498 100644
--- a/code/modules/security_levels/keycard authentication.dm
+++ b/code/modules/security_levels/keycard authentication.dm
@@ -156,7 +156,7 @@
feedback_inc("alert_keycard_auth_maintRevoke",1)
if("Emergency Response Team")
if(is_ert_blocked())
- to_chat(usr, "\red All Emergency Response Teams are dispatched and can not be called at this time.")
+ to_chat(usr, "All Emergency Response Teams are dispatched and can not be called at this time. ")
return
to_chat(usr, "ERT request transmitted. ")
@@ -186,7 +186,7 @@ var/global/maint_all_access = 0
for(var/obj/machinery/door/airlock/D in A)
D.emergency = 1
D.update_icon(0)
- minor_announcement.Announce("The maintenance access requirement has been revoked on all airlocks.")
+ minor_announcement.Announce("Access restrictions on maintenance and external airlocks have been removed.")
maint_all_access = 1
/proc/revoke_maint_all_access()
@@ -194,5 +194,5 @@ var/global/maint_all_access = 0
for(var/obj/machinery/door/airlock/D in A)
D.emergency = 0
D.update_icon(0)
- minor_announcement.Announce("The maintenance access requirement has been readded on all maintenance airlocks.")
- maint_all_access = 0
\ No newline at end of file
+ minor_announcement.Announce("Access restrictions on maintenance and external airlocks have been re-added.")
+ maint_all_access = 0
diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm
index a7a5162c231..42bfb39b4eb 100644
--- a/code/modules/security_levels/security levels.dm
+++ b/code/modules/security_levels/security levels.dm
@@ -7,8 +7,8 @@
//5 = code delta
//config.alert_desc_blue_downto
-/var/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg'))
-/var/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1)
+/var/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 0, new_sound = sound('sound/misc/notice1.ogg'))
+/var/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 0)
/proc/set_security_level(var/level)
switch(level)
@@ -32,13 +32,11 @@
security_announcement_down.Announce("All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.","Attention! Security level lowered to green.")
security_level = SEC_LEVEL_GREEN
- var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
- if(CC)
- CC.post_status("alert", "outline")
+ post_status("alert", "outline")
- for(var/obj/machinery/firealarm/FA in world)
+ for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
- FA.overlays = list()
+ FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_green")
if(SEC_LEVEL_BLUE)
@@ -48,13 +46,11 @@
security_announcement_down.Announce("The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed.","Attention! Security level lowered to blue.")
security_level = SEC_LEVEL_BLUE
- var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
- if(CC)
- CC.post_status("alert", "outline")
+ post_status("alert", "outline")
- for(var/obj/machinery/firealarm/FA in world)
+ for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
- FA.overlays = list()
+ FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue")
if(SEC_LEVEL_RED)
@@ -64,18 +60,16 @@
security_announcement_down.Announce("The station's self-destruct mechanism has been deactivated, but there is still an immediate and serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised.","Attention! Code Red!")
security_level = SEC_LEVEL_RED
- var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world
+ var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in airlocks
if(R && is_station_level(R.z))
R.locked = 0
R.update_icon()
- var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
- if(CC)
- CC.post_status("alert", "redalert")
+ post_status("alert", "redalert")
- for(var/obj/machinery/firealarm/FA in world)
+ for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
- FA.overlays = list()
+ FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_red")
if(SEC_LEVEL_GAMMA)
@@ -95,13 +89,11 @@
H.locked = 0
H.update_icon()
- var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
- if(CC)
- CC.post_status("alert", "gammaalert")
+ post_status("alert", "gammaalert")
- for(var/obj/machinery/firealarm/FA in world)
+ for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
- FA.overlays = list()
+ FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma")
FA.update_icon()
@@ -109,26 +101,22 @@
security_announcement_up.Announce("Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated.","Attention! Epsilon security level activated!")
security_level = SEC_LEVEL_EPSILON
- var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
- if(CC)
- CC.post_status("alert", "epsilonalert")
+ post_status("alert", "epsilonalert")
- for(var/obj/machinery/firealarm/FA in world)
+ for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
- FA.overlays = list()
+ FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon")
if(SEC_LEVEL_DELTA)
security_announcement_up.Announce("The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.","Attention! Delta security level reached!")
security_level = SEC_LEVEL_DELTA
- var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world)
- if(CC)
- CC.post_status("alert", "deltaalert")
+ post_status("alert", "deltaalert")
- for(var/obj/machinery/firealarm/FA in world)
+ for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
- FA.overlays = list()
+ FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta")
else
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index f1ad87ddc7c..5903035903b 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -166,12 +166,36 @@
shuttle_master.emergencyLastCallLoc = null
emergency_shuttle_recalled.Announce("The emergency shuttle has been recalled.[shuttle_master.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]")
-/*
-/obj/docking_port/mobile/emergency/findTransitDock()
- . = shuttle_master.getDock("emergency_transit")
- if(.) return .
- return ..()
-*/
+/obj/docking_port/mobile/emergency/proc/is_hijacked()
+ for(var/mob/living/player in player_list)
+ if(player.mind)
+ if(player.stat != DEAD)
+ if(issilicon(player)) //Borgs are technically dead anyways
+ continue
+ if(isanimal(player)) //Poly does not own the shuttle
+ continue
+
+ var/special_role = player.mind.special_role
+ if(special_role)
+ if(special_role == SPECIAL_ROLE_TRAITOR) // traitors can hijack the shuttle
+ continue
+
+ if(special_role == SPECIAL_ROLE_CHANGELING) // changelings as well
+ continue
+
+ if(special_role == SPECIAL_ROLE_VAMPIRE || special_role == SPECIAL_ROLE_VAMPIRE_THRALL) // for traitorvamp
+ continue
+
+ if(special_role == SPECIAL_ROLE_NUKEOPS) // so can nukeops, for the hell of it
+ continue
+
+ if(special_role == SPECIAL_ROLE_SYNDICATE_DEATHSQUAD) // and the syndie deathsquad i guess
+ continue
+
+ if(get_area(player) == areaInstance)
+ return FALSE
+
+ return TRUE
/obj/docking_port/mobile/emergency/check()
@@ -179,6 +203,17 @@
return
var/time_left = timeLeft(1)
+
+ // The emergency shuttle doesn't work like others so this
+ // ripple check is slightly different
+ if(!ripples.len && (time_left <= SHUTTLE_RIPPLE_TIME) && ((mode == SHUTTLE_CALL) || (mode == SHUTTLE_ESCAPE)))
+ var/destination
+ if(mode == SHUTTLE_CALL)
+ destination = shuttle_master.getDock("emergency_home")
+ else if(mode == SHUTTLE_ESCAPE)
+ destination = shuttle_master.getDock("emergency_away")
+ create_ripples(destination)
+
switch(mode)
if(SHUTTLE_RECALL)
if(time_left <= 0)
@@ -227,15 +262,28 @@
mode = SHUTTLE_ESCAPE
timer = world.time
priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.")
+ for(var/mob/M in player_list)
+ if(!isnewplayer(M) && !M.client.karma_spent && !M.get_preference(DISABLE_KARMA_REMINDER))
+ to_chat(M, "You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under OOC tab, Award Karma. ")
+
if(SHUTTLE_ESCAPE)
if(time_left <= 0)
//move each escape pod to its corresponding escape dock
for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile)
M.dock(shuttle_master.getDock("[M.id]_away"))
- //now move the actual emergency shuttle to centcomm
+
for(var/area/shuttle/escape/E in world)
E << 'sound/effects/hyperspace_end.ogg'
- dock(shuttle_master.getDock("emergency_away"))
+
+ // now move the actual emergency shuttle to centcomm
+ // unless the shuttle is "hijacked"
+ var/destination_dock = "emergency_away"
+ if(is_hijacked())
+ destination_dock = "emergency_syndicate"
+ priority_announcement.Announce("Corruption detected in shuttle navigation protocols. Please contact your supervisor.")
+
+ dock_id(destination_dock)
+
mode = SHUTTLE_ENDGAME
timer = 0
open_dock()
diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm
new file mode 100644
index 00000000000..0c48a9c24bf
--- /dev/null
+++ b/code/modules/shuttle/ripple.dm
@@ -0,0 +1,19 @@
+/obj/effect/overlay/temp/ripple
+ name = "hyperspace ripple"
+ desc = "Something is coming through hyperspace, you can see the \
+ visual disturbances. It's probably best not to be on top of these \
+ when whatever is tunneling comes through."
+ icon = 'icons/turf/floors/ripple.dmi'
+ icon_state = "ripple"
+ anchored = TRUE
+ density = FALSE
+ smooth = SMOOTH_TRUE
+ layer = RIPPLE_LAYER
+ alpha = 0
+ duration = 3 * SHUTTLE_RIPPLE_TIME
+ mouse_opacity = 1
+
+/obj/effect/overlay/temp/ripple/New()
+ . = ..()
+ smooth_icon(src)
+ animate(src, alpha=255, time=SHUTTLE_RIPPLE_TIME)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 1a03d3141c5..d1f41585516 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -22,6 +22,8 @@
// All shuttle templates are timid
var/timid = FALSE
+ var/list/ripples = list()
+
//these objects are indestructable
/obj/docking_port/Destroy(force)
if(force)
@@ -174,7 +176,7 @@
*/
/obj/docking_port/stationary/transit
- name = "In Transit"
+ name = "In transit"
turf_type = /turf/space/transit
lock_shuttle_doors = 1
@@ -183,7 +185,7 @@
if(!..())
return 0
- name = "In Transit" //This looks weird, but- it means that the on-map instances can be named something actually usable to search for, but still appear correctly in terminals.
+ name = "In transit" //This looks weird, but- it means that the on-map instances can be named something actually usable to search for, but still appear correctly in terminals.
shuttle_master.transit += src
return 1
@@ -279,7 +281,7 @@
else
// This isn't an error, per se, but we can't let the shuttle code
// attempt to move us where we currently are, it will get weird.
- return SHUTTLE_ALREADY_DOCKED
+ return SHUTTLE_ALREADY_DOCKED
return SHUTTLE_CAN_DOCK
/obj/docking_port/mobile/proc/check_dock(obj/docking_port/stationary/S)
@@ -378,10 +380,44 @@
qdel(src, force=TRUE)
+/obj/docking_port/mobile/proc/create_ripples(obj/docking_port/stationary/S1)
+ var/list/turfs = ripple_area(S1)
+ for(var/i in turfs)
+ ripples += new /obj/effect/overlay/temp/ripple(i)
+
+/obj/docking_port/mobile/proc/remove_ripples()
+ if(ripples.len)
+ for(var/i in ripples)
+ qdel(i)
+ ripples.Cut()
+
+
+/obj/docking_port/mobile/proc/ripple_area(obj/docking_port/stationary/S1)
+ var/list/L0 = return_ordered_turfs(x, y, z, dir, areaInstance)
+ var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
+
+ var/list/ripple_turfs = list()
+
+ for(var/i in 1 to L0.len)
+ var/turf/T0 = L0[i]
+ if(!T0)
+ continue
+ var/turf/T1 = L1[i]
+ if(!T1)
+ continue
+ if(T0.type != T0.baseturf)
+ ripple_turfs += T1
+
+ return ripple_turfs
+
//this is the main proc. It instantly moves our mobile port to stationary port S1
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE)
// Crashing this ship with NO SURVIVORS
+ if(S1.get_docked() == src)
+ remove_ripples()
+ return
+
if(!force)
if(!check_dock(S1))
return -1
@@ -389,6 +425,7 @@
if(canMove())
return -1
+
// //rotate transit docking ports, so we don't need zillions of variants
// if(istype(S1, /obj/docking_port/stationary/transit))
// S1.dir = turn(NORTH, -travelDir)
@@ -423,6 +460,9 @@
for(var/turf/T0 in L0)
A0.contents += T0
+ // Removes ripples
+ remove_ripples()
+
//move or squish anything in the way ship at destination
roadkill(L0, L1, S1.dir)
@@ -489,8 +529,14 @@
// Instead of spending a lot of time trying to work out where to place
// our shuttle, just create it somewhere empty and send it to where
// it should go
- var/obj/docking_port/stationary/D = findRoundstartDock()
- return dock(D)
+ . = dock_id(roundstart_move)
+
+/obj/docking_port/mobile/proc/dock_id(id)
+ var/port = shuttle_master.getDock(id)
+ if(port)
+ . = dock(port)
+ else
+ . = null
/obj/effect/landmark/shuttle_import
name = "Shuttle Import"
@@ -558,7 +604,10 @@
//used by shuttle subsystem to check timers
/obj/docking_port/mobile/proc/check()
+ check_effects()
+
var/timeLeft = timeLeft(1)
+
if(timeLeft <= 0)
switch(mode)
if(SHUTTLE_CALL)
@@ -573,6 +622,12 @@
timer = 0
destination = null
+/obj/docking_port/mobile/proc/check_effects()
+ if(!ripples.len)
+ if((mode == SHUTTLE_CALL) || (mode == SHUTTLE_RECALL))
+ var/tl = timeLeft(1)
+ if(tl <= SHUTTLE_RIPPLE_TIME)
+ create_ripples(destination)
/obj/docking_port/mobile/proc/setTimer(wait)
if(timer <= 0)
@@ -670,41 +725,42 @@
return
if(!shuttleId)
return
- src.add_fingerprint(usr)
-
connect()
+ add_fingerprint(user)
+ ui_interact(user)
- var/list/options = params2list(possible_destinations)
+/obj/machinery/computer/shuttle/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/obj/docking_port/mobile/M = shuttle_master.getShuttle(shuttleId)
- var/dat = "Status: [M ? M.getStatusText() : "*Missing*"] "
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "shuttle_console.tmpl", M ? M.name : "shuttle", 300, 200)
+ ui.open()
+
+/obj/machinery/computer/shuttle/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ var/obj/docking_port/mobile/M = shuttle_master.getShuttle(shuttleId)
+ data["status"] = M ? M.getStatusText() : null
if(M)
- var/destination_found
+ data["shuttle"] = 1
+ var/list/docking_ports = list()
+ data["docking_ports"] = docking_ports
+ var/list/options = params2list(possible_destinations)
for(var/obj/docking_port/stationary/S in shuttle_master.stationary)
if(!options.Find(S.id))
continue
if(!M.check_dock(S))
continue
- destination_found = 1
- dat += "Send to [S.name] "
- if(!destination_found)
- dat += "Shuttle Locked "
- if(admin_controlled)
- dat += "Authorized personnel only "
- dat += "Request Authorization "
- if(docking_request)
- dat += "Request docking at NSS Cyberiad "
- dat += "Close "
+ docking_ports[++docking_ports.len] = list("name" = S.name, "id" = S.id)
+ data["docking_ports_len"] = docking_ports.len
+ data["admin_controlled"] = admin_controlled
+ data["docking_request"] = docking_request
- var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
- popup.set_content("[dat] ")
- popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
+ return data
/obj/machinery/computer/shuttle/Topic(href, href_list)
if(..())
return 1
- usr.set_machine(src)
- src.add_fingerprint(usr)
+
if(!allowed(usr))
to_chat(usr, "Access denied. ")
return
@@ -722,7 +778,7 @@
to_chat(usr, "Invalid shuttle requested. ")
else
to_chat(usr, "Unable to comply. ")
- updateUsrDialog()
+ return 1
/obj/machinery/computer/shuttle/emag_act(mob/user)
if(!emagged)
@@ -754,13 +810,15 @@
to_chat(usr, "Your request has been recieved by Centcom. ")
log_admin("[key_name(usr)] requested to move the transport ferry to Centcom.")
message_admins("FERRY: [key_name_admin(usr)] (Move Ferry ) is requesting to move the transport ferry to Centcom.")
+ . = 1
+ nanomanager.update_uis(src)
spawn(600) //One minute cooldown
cooldown = 0
-
/obj/machinery/computer/shuttle/ert
name = "specops shuttle console"
//circuit = /obj/item/weapon/circuitboard/ert
+ req_access = list(access_cent_general)
shuttleId = "specops"
possible_destinations = "specops_home;specops_away"
@@ -799,13 +857,14 @@
/obj/machinery/computer/shuttle/sst
name = "Syndicate Strike Time Shuttle Console"
desc = "Used to call and send the SST shuttle."
+ req_access = list(access_syndicate)
shuttleId = "sst"
possible_destinations = "sst_home;sst_away"
/obj/machinery/computer/shuttle/sit
- req_access = list(access_syndicate)
name = "Syndicate Infiltration Team Shuttle Console"
desc = "Used to call and send the SIT shuttle."
+ req_access = list(access_syndicate)
shuttleId = "sit"
possible_destinations = "sit_arrivals;sit_scimaint;sit_engshuttle;sit_away"
@@ -836,8 +895,9 @@ var/global/trade_dockrequest_timelimit = 0
if(world.time < trade_dockrequest_timelimit || world.time < trade_dock_timelimit)
return
to_chat(usr, "Request sent. ")
- command_announcement.Announce(docking_request_message, "Docking Request")
+ event_announcement.Announce(docking_request_message, "Docking Request")
trade_dockrequest_timelimit = world.time + 1200 // They have 2 minutes to approve the request.
+ return 1
/obj/machinery/computer/shuttle/trade/sol
req_access = list(access_trade_sol)
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 970daf16e80..24d76267b13 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -199,20 +199,20 @@
// Sell exotic plants
if(istype(thing, /obj/item/seeds))
var/obj/item/seeds/S = thing
- if(S.seed.get_trait(TRAIT_RARITY) == 0) // Mundane species
- msg += "+0 : We don't need samples of mundane species \"[capitalize(S.seed.seed_name)]\". "
+ if(S.rarity == 0) // Mundane species
+ msg += "+0 : We don't need samples of mundane species \"[capitalize(S.species)]\". "
else if(shuttle_master.discoveredPlants[S.type]) // This species has already been sent to CentComm
- var/potDiff = S.seed.get_trait(TRAIT_POTENCY) - shuttle_master.discoveredPlants[S.type] // Compare it to the previous best
+ var/potDiff = S.potency - shuttle_master.discoveredPlants[S.type] // Compare it to the previous best
if(potDiff > 0) // This sample is better
- shuttle_master.discoveredPlants[S.type] = S.seed.get_trait(TRAIT_POTENCY)
- msg += "+[potDiff] : New sample of \"[capitalize(S.seed.seed_name)]\" is superior. Good work. "
+ shuttle_master.discoveredPlants[S.type] = S.potency
+ msg += "+[potDiff] : New sample of \"[capitalize(S.species)]\" is superior. Good work. "
shuttle_master.points += potDiff
else // This sample is worthless
- msg += "+0 : New sample of \"[capitalize(S.seed.seed_name)]\" is not more potent than existing sample ([shuttle_master.discoveredPlants[S.type]] potency). "
+ msg += "+0 : New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([shuttle_master.discoveredPlants[S.type]] potency). "
else // This is a new discovery!
- shuttle_master.discoveredPlants[S.type] = S.seed.get_trait(TRAIT_POTENCY)
- msg += "+[S.seed.get_trait(TRAIT_RARITY)] : New species discovered: \"[capitalize(S.seed.seed_name)]\". Excellent work. "
- shuttle_master.points += S.seed.get_trait(TRAIT_RARITY) // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later
+ shuttle_master.discoveredPlants[S.type] = S.potency
+ msg += "[S.rarity] : New species discovered: \"[capitalize(S.species)]\". Excellent work. "
+ shuttle_master.points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later
qdel(MA)
shuttle_master.sold_atoms += "."
@@ -236,8 +236,8 @@
/proc/forbidden_atoms_check(atom/A)
var/list/blacklist = list(
/mob/living,
- /obj/effect/blob,
- /obj/effect/spider/spiderling,
+ /obj/structure/blob,
+ /obj/structure/spider/spiderling,
/obj/item/weapon/disk/nuclear,
/obj/machinery/nuclearbomb,
/obj/item/device/radio/beacon,
@@ -246,7 +246,10 @@
/obj/machinery/teleport/station,
/obj/machinery/teleport/hub,
/obj/machinery/telepad,
- /obj/machinery/clonepod
+ /obj/machinery/clonepod,
+ /obj/effect/hierophant,
+ /obj/item/device/warp_cube,
+ /obj/machinery/quantumpad
)
if(A)
if(is_type_in_list(A, blacklist))
@@ -292,7 +295,7 @@
return
var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(_loc)
- playsound(_loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
+ playsound(_loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
reqform.name = "Requisition Form - [crates] '[object.name]' for [orderedby]"
reqform.info += "[station_name] Supply Requisition Form "
reqform.info += "INDEX: #[shuttle_master.ordernum] "
@@ -443,7 +446,7 @@
var/packs_list[0]
for(var/set_name in shuttle_master.supply_packs)
var/datum/supply_packs/pack = shuttle_master.supply_packs[set_name]
- if(!pack.contraband && !pack.hidden && pack.group == cat)
+ if(!pack.contraband && !pack.hidden && !pack.special && pack.group == cat)
// 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
@@ -592,7 +595,7 @@
var/packs_list[0]
for(var/set_name in shuttle_master.supply_packs)
var/datum/supply_packs/pack = shuttle_master.supply_packs[set_name]
- if((pack.hidden && src.hacked) || (pack.contraband && src.can_order_contraband) || (!pack.contraband && !pack.hidden))
+ if((pack.hidden && hacked) || (pack.contraband && can_order_contraband) || (pack.special && pack.special_enabled) || (!pack.contraband && !pack.hidden && !pack.special))
if(pack.group == cat)
// 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
@@ -659,6 +662,13 @@
investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [shuttle_master.points]. Shuttle contents: [shuttle_master.sold_atoms]", "cargo")
else if(!shuttle_master.supply.request(shuttle_master.getDock("supply_home")))
post_signal("supply")
+ if(LAZYLEN(shuttle_master.shoppinglist) && prob(10))
+ var/datum/supply_order/O = new /datum/supply_order()
+ O.ordernum = shuttle_master.ordernum
+ O.object = shuttle_master.supply_packs[pick(shuttle_master.supply_packs)]
+ O.orderedby = random_name(pick(MALE,FEMALE), species = "Human")
+ shuttle_master.shoppinglist += O
+ investigate_log("Random [O.object] crate added to supply shuttle")
else if(href_list["doorder"])
if(world.time < reqtime)
@@ -786,6 +796,54 @@
/mob/living/silicon/robot/drone,
/mob/living/simple_animal/bot/mulebot
)
+ var/state = PLASTIC_FLAPS_NORMAL
+ var/can_deconstruct = TRUE
+
+/obj/structure/plasticflaps/examine(mob/user)
+ . = ..()
+ switch(state)
+ if(PLASTIC_FLAPS_NORMAL)
+ to_chat(user, "[src] are screwed to the floor. ")
+ if(PLASTIC_FLAPS_DETACHED)
+ to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be sliced apart. ")
+
+/obj/structure/plasticflaps/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ if(isscrewdriver(W))
+ if(state == PLASTIC_FLAPS_NORMAL)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] unscrews [src] from the floor. ", "You start to unscrew [src] from the floor... ", "You hear rustling noises.")
+ if(do_after(user, 180*W.toolspeed, target = src))
+ if(state != PLASTIC_FLAPS_NORMAL)
+ return
+ state = PLASTIC_FLAPS_DETACHED
+ anchored = FALSE
+ to_chat(user, "You unscrew [src] from the floor. ")
+ else if(state == PLASTIC_FLAPS_DETACHED)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] screws [src] to the floor. ", "You start to screw [src] to the floor... ", "You hear rustling noises.")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(state != PLASTIC_FLAPS_DETACHED)
+ return
+ state = PLASTIC_FLAPS_NORMAL
+ anchored = TRUE
+ to_chat(user, "You screw [src] from the floor. ")
+ else if(iswelder(W))
+ if(state == PLASTIC_FLAPS_DETACHED)
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.remove_fuel(0, user))
+ return
+ playsound(loc, WT.usesound, 100, 1)
+ user.visible_message("[user] slices apart [src]. ", "You start to slice apart [src]. ", "You hear welding.")
+ if(do_after(user, 120*WT.toolspeed, target = src))
+ if(state != PLASTIC_FLAPS_DETACHED)
+ return
+ to_chat(user, "You slice apart [src]. ")
+ var/obj/item/stack/sheet/plastic/five/P = new(loc)
+ P.add_fingerprint(user)
+ qdel(src)
+ else
+ . = ..()
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
if(istype(A) && A.checkpass(PASSGLASS))
@@ -841,6 +899,11 @@
if(prob(5))
qdel(src)
+/obj/structure/plasticflaps/proc/deconstruct(disassembled = TRUE)
+ if(can_deconstruct)
+ new /obj/item/stack/sheet/plastic/five(loc)
+ qdel(src)
+
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
name = "\improper Airtight plastic flaps"
desc = "Heavy duty, airtight, plastic flaps."
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index 1c03c3f7039..12bf7ff8750 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -8,6 +8,7 @@
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
var/challenge = FALSE
+ var/moved = FALSE
/obj/machinery/computer/shuttle/syndicate/recall
name = "syndicate shuttle recall terminal"
@@ -18,6 +19,7 @@
if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER)
to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare. ")
return 0
+ moved = TRUE
..()
/obj/machinery/computer/shuttle/syndicate/drop_pod
diff --git a/code/modules/space_management/heap_space_level.dm b/code/modules/space_management/heap_space_level.dm
index 8d5a3971ba1..640080095a3 100644
--- a/code/modules/space_management/heap_space_level.dm
+++ b/code/modules/space_management/heap_space_level.dm
@@ -1,15 +1,62 @@
// This represents a level we can carve up as we please, and hand out
// chunks of to whatever requests it
/datum/space_level/heap
- var/datum/space_chunk/top
- linkage = UNAFFECTED
+ name = "Heap level #ERROR"
+ var/datum/space_chunk/top
+ linkage = UNAFFECTED
-/datum/space_level/heap/New()
- ..()
- top = new
+/datum/space_level/heap/New(z, name, transition_type, traits)
+ ..(z, "Heap level #[z]", UNAFFECTED, traits)
+ top = new(1, 1, zpos, world.maxx, world.maxy)
+ flags = traits
/datum/space_level/heap/proc/request(width, height)
- return 1 // All are welcome! At least until I add code for this
+ return top.can_fit_space(width, height)
-/datum/zlevel/heap/proc/allocate(width, height)
- return
+// Returns a space chunk datum for some nerd to work with - tells them what's safe to write into, and such
+/datum/space_level/heap/proc/allocate(width, height)
+ if(!request(width, height))
+ return null
+
+ var/datum/space_chunk/C = top.get_optimal_chunk(width, height)
+ if(!C)
+ return null
+ C.children.Cut()
+
+ if(C.width == width && C.height == height && C.is_empty)
+ C.set_occupied(TRUE)
+ return C
+
+ // Split the chunk into 4 pieces
+ var/datum/space_chunk/return_chunk = new(C.x, C.y, C.zpos, width, height)
+ C.children += return_chunk
+ C.children += new /datum/space_chunk(C.x+width, C.y, C.zpos, C.width-width, height)
+ C.children += new /datum/space_chunk(C.x, C.y+height, C.zpos, width, C.height-height)
+ C.children += new /datum/space_chunk(C.x+width, C.y+height, C.zpos, C.width-width, C.height-height)
+
+ for(var/datum/space_chunk/C2 in C.children)
+ C2.parent = C
+ return_chunk.set_occupied(TRUE)
+ return return_chunk
+
+/datum/space_level/heap/proc/free(datum/space_chunk/C)
+ if(!istype(C))
+ return
+ if(C.zpos != zpos)
+ return
+ C.set_occupied(FALSE)
+ for(var/turf/T in block(locate(C.x, C.y, C.zpos), locate(C.x+C.width-1, C.y+C.height-1, C.zpos)))
+ for(var/atom/movable/M in T)
+ if(istype(M, /mob/dead/observer))
+ continue
+ M.loc = null
+ qdel(M, TRUE)
+ T.ChangeTurf(/turf/space)
+ var/datum/space_chunk/last_empty_parent = C
+ while(last_empty_parent.parent && last_empty_parent.parent.is_empty)
+ last_empty_parent = last_empty_parent.parent
+ // Prevent a self-qdel from killing this proc
+ src = null
+ for(var/datum/space_chunk/child in last_empty_parent.children)
+ qdel(child)
+ last_empty_parent.children.Cut()
diff --git a/code/modules/space_management/space_chunk.dm b/code/modules/space_management/space_chunk.dm
index a150d25d2f3..28432bd21bb 100644
--- a/code/modules/space_management/space_chunk.dm
+++ b/code/modules/space_management/space_chunk.dm
@@ -10,14 +10,79 @@
var/width
var/height
var/zpos
+ // Whether dedicated for use or not
+ var/occupied = FALSE
+ // Whether the chunk contains used children or not
+ var/is_empty = TRUE
+ var/list/children = list()
+ var/datum/space_chunk/parent = null
-/datum/space_chunk/New(w, h, z, new_x, new_y)
+/datum/space_chunk/New(new_x, new_y, z, w, h)
x = new_x
y = new_y
zpos = z
width = w
height = h
+/datum/space_chunk/Destroy()
+ set_occupied(FALSE)
+ if(parent)
+ parent.children -= src
+ QDEL_LIST(children)
+ parent = null
+ . = ..()
+
+/datum/space_chunk/proc/can_fit_space(w, h)
+ if(w > width || h > height)
+ return FALSE
+ if(occupied)
+ return FALSE
+ if(is_empty)
+ return TRUE
+ for(var/datum/space_chunk/C in children)
+ if(C.can_fit_space(w, h))
+ return TRUE
+ return FALSE
+
+// Recursively drops down the tree and finds the most efficient chunk to use
+/datum/space_chunk/proc/get_optimal_chunk(w, h)
+ if(w > width || h > height)
+ return null
+ if(occupied)
+ return null
+ if(is_empty)
+ return src
+ var/datum/space_chunk/optimal_chunk
+ var/optimal_chunk_optimalness = 99999
+ for(var/datum/space_chunk/C in children)
+ var/datum/space_chunk/C2 = C.get_optimal_chunk(w, h)
+ if(!C2)
+ continue
+ var/optimalness = C2.width + C2.height-w-h
+ if(optimalness < optimal_chunk_optimalness)
+ optimal_chunk_optimalness = optimalness
+ optimal_chunk = C2
+ return optimal_chunk
+
+/datum/space_chunk/proc/set_occupied(new_occupied)
+ var/datum/space_chunk/C = parent
+ if(new_occupied)
+ occupied = TRUE
+ while(C)
+ C.is_empty = FALSE
+ C = C.parent
+ else
+ occupied = FALSE
+ while(C)
+ var/is_children_empty = TRUE
+ for(var/datum/space_chunk/C2 in C.children)
+ if(!C2.is_empty || C2.occupied)
+ is_children_empty = FALSE
+ if(!is_children_empty)
+ break
+ C.is_empty = TRUE
+ C = C.parent
+
/datum/space_chunk/proc/check_sanity()
var/i_am_sane = 1
i_am_sane |= (x > 0)
@@ -29,6 +94,13 @@
/datum/space_chunk/proc/return_turfs()
return
+/datum/space_chunk/proc/search_chunk(object_list)
+ var/list/located = list()
+ for(var/atom/object in object_list)
+ if(((object.x >= x) && (object.x <= (x + width))) && ((object.y >= y) && (object.y <= (y + height))) && (object.z == zpos))
+ located.Add(object)
+ return located
+
#undef BOTTOM_LEFT_CHUNK
#undef BOTTOM_RIGHT_CHUNK
#undef TOP_LEFT_CHUNK
diff --git a/code/modules/space_management/zlevel_manager.dm b/code/modules/space_management/zlevel_manager.dm
index d0bb9455eb8..087a70657ed 100644
--- a/code/modules/space_management/zlevel_manager.dm
+++ b/code/modules/space_management/zlevel_manager.dm
@@ -134,18 +134,36 @@ var/global/datum/zlev_manager/space_manager = new
/datum/zlev_manager/proc/add_new_heap()
world.maxz++
var/our_z = world.maxz
- var/datum/space_level/yup = new /datum/space_level/heap(our_z)
+ var/datum/space_level/yup = new /datum/space_level/heap(our_z, traits = list(BLOCK_TELEPORT, ADMIN_LEVEL))
z_list["[our_z]"] = yup
return yup
// This is what you can call to allocate a section of space
// Later, I'll add an argument to let you define the flags on the region
/datum/zlev_manager/proc/allocate_space(width, height)
+ if(width > world.maxx || height > world.maxy)
+ throw EXCEPTION("Too much space requested! \[[width],[height]\]")
if(!heaps.len)
heaps.len++
heaps[heaps.len] = add_new_heap()
var/datum/space_level/heap/our_heap
+ var/weve_got_vacancy = 0
for(our_heap in heaps)
- var/weve_got_vacancy = our_heap.request(width, height)
+ weve_got_vacancy = our_heap.request(width, height)
if(weve_got_vacancy)
break // We're sticking with the present value of `our_heap` - it's got room
+ // This loop will also run out if no vacancies are found
+
+ if(!weve_got_vacancy)
+ heaps.len++
+ our_heap = add_new_heap()
+ heaps[heaps.len] = our_heap
+ return our_heap.allocate(width, height)
+
+/datum/zlev_manager/proc/free_space(datum/space_chunk/C)
+ if(!istype(C))
+ return
+ var/datum/space_level/heap/heap = z_list["[C.zpos]"]
+ if(!istype(heap))
+ throw EXCEPTION("Attempted to free chunk at invalid z-level ([C.x],[C.y],[C.zpos]) [C.width]x[C.height]")
+ heap.free(C)
diff --git a/code/modules/spacepods/construction.dm b/code/modules/spacepods/construction.dm
index 0426b940d0b..a997a23f585 100644
--- a/code/modules/spacepods/construction.dm
+++ b/code/modules/spacepods/construction.dm
@@ -19,6 +19,10 @@
dir = EAST
+/obj/structure/spacepod_frame/Destroy()
+ QDEL_NULL(construct)
+ return ..()
+
/obj/structure/spacepod_frame/attackby(obj/item/W as obj, mob/user as mob, params)
if(!construct || !construct.action(W, user))
..()
diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm
index 427a6db798a..d1f78ffdf28 100644
--- a/code/modules/spacepods/equipment.dm
+++ b/code/modules/spacepods/equipment.dm
@@ -28,9 +28,8 @@
firstloc = get_turf(my_atom)
secondloc = get_step(firstloc,NORTH)
olddir = dir
- var/proj_type = text2path(projectile_type)
- var/obj/item/projectile/projone = new proj_type(firstloc)
- var/obj/item/projectile/projtwo = new proj_type(secondloc)
+ var/obj/item/projectile/projone = new projectile_type(firstloc)
+ var/obj/item/projectile/projtwo = new projectile_type(secondloc)
projone.starting = get_turf(my_atom)
projone.firer = usr
projone.def_zone = "chest"
@@ -79,7 +78,7 @@
desc = "You shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "blank"
- var/projectile_type
+ var/obj/item/projectile/projectile_type
var/shot_cost = 0
var/shots_per = 1
var/fire_sound
@@ -89,25 +88,25 @@
name = "disabler system"
desc = "A weak taser system for space pods, fires disabler beams."
icon_state = "weapon_taser"
- projectile_type = "/obj/item/projectile/beam/disabler"
+ projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 400
- fire_sound = "sound/weapons/Taser.ogg"
+ fire_sound = 'sound/weapons/Taser.ogg'
/obj/item/device/spacepod_equipment/weaponry/burst_taser
name = "burst taser system"
desc = "A weak taser system for space pods, this one fires 3 at a time."
icon_state = "weapon_burst_taser"
- projectile_type = "/obj/item/projectile/beam/disabler"
+ projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 1200
shots_per = 3
- fire_sound = "sound/weapons/Taser.ogg"
+ fire_sound = 'sound/weapons/Taser.ogg'
fire_delay = 30
/obj/item/device/spacepod_equipment/weaponry/laser
name = "laser system"
desc = "A weak laser system for space pods, fires concentrated bursts of energy"
icon_state = "weapon_laser"
- projectile_type = "/obj/item/projectile/beam"
+ projectile_type = /obj/item/projectile/beam
shot_cost = 600
fire_sound = 'sound/weapons/Laser.ogg'
@@ -117,7 +116,7 @@
desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_taser"
- projectile_type = "/obj/item/projectile/kinetic"
+ projectile_type = /obj/item/projectile/kinetic/pod
shot_cost = 300
fire_delay = 14
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -127,7 +126,7 @@
desc = "A mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_m_laser"
- projectile_type = "/obj/item/projectile/kinetic/super"
+ projectile_type = /obj/item/projectile/kinetic/pod/regular
shot_cost = 250
fire_delay = 10
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -137,7 +136,7 @@
desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_w_laser"
- projectile_type = "/obj/item/projectile/kinetic/hyper"
+ projectile_type = /obj/item/projectile/kinetic/pod/enhanced
shot_cost = 200
fire_delay = 8
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -270,7 +269,7 @@
desc = "A key for a spacepod lock."
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "podkey"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/id = 0
// Key - Lock Interactions
diff --git a/code/modules/spacepods/parts.dm b/code/modules/spacepods/parts.dm
index d1aefb535e6..757d7a95dcc 100644
--- a/code/modules/spacepods/parts.dm
+++ b/code/modules/spacepods/parts.dm
@@ -55,7 +55,7 @@
return 0
return connectedparts
-/obj/item/pod_parts/pod_frame/attackby(var/obj/O, mob/user)
+/obj/item/pod_parts/pod_frame/attackby(var/obj/item/O, mob/user)
if(istype(O, /obj/item/stack/rods))
var/obj/item/stack/rods/R = O
var/list/linkedparts = find_square()
@@ -71,12 +71,12 @@
//log_admin("Repositioning")
pod.loc = F.loc
qdel(F)
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), O.usesound, 50, 1)
if(istype(O, /obj/item/weapon/wrench))
to_chat(user, "You [!anchored ? "secure \the [src] in place." : "remove the securing bolts."] ")
anchored = !anchored
density = anchored
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), O.usesound, 50, 1)
/obj/item/pod_parts/pod_frame/verb/rotate()
set name = "Rotate Frame"
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 1c71f8837ee..2a111433948 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -124,22 +124,14 @@
/obj/spacepod/Destroy()
if(equipment_system.cargo_system)
equipment_system.cargo_system.removed(null)
- qdel(equipment_system)
- equipment_system = null
- qdel(cargo_hold)
- cargo_hold = null
- qdel(battery)
- battery = null
- qdel(cabin_air)
- cabin_air = null
- qdel(internal_tank)
- internal_tank = null
- qdel(pr_int_temp_processor)
- pr_int_temp_processor = null
- qdel(pr_give_air)
- pr_give_air = null
- qdel(ion_trail)
- ion_trail = null
+ QDEL_NULL(equipment_system)
+ QDEL_NULL(cargo_hold)
+ QDEL_NULL(battery)
+ QDEL_NULL(cabin_air)
+ QDEL_NULL(internal_tank)
+ QDEL_NULL(pr_int_temp_processor)
+ QDEL_NULL(pr_give_air)
+ QDEL_NULL(ion_trail)
occupant_sanity_check()
if(pilot)
pilot.forceMove(get_turf(src))
@@ -213,15 +205,15 @@
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
deal_damage(damage)
visible_message("[user] [user.attacktext] [src]!")
- user.attack_log += text("\[[time_stamp()]\] attacked [src.name] ")
+ user.create_attack_log("attacked [src.name] ")
return
/obj/spacepod/attack_alien(mob/user as mob)
user.changeNext_move(CLICK_CD_MELEE)
deal_damage(15)
playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1)
- to_chat(user, "\red You slash at \the [src]!")
- visible_message("\red The [user] slashes at [src.name]'s armor!")
+ to_chat(user, "You slash at [src]! ")
+ visible_message("The [user] slashes at [src.name]'s armor! ")
return
/obj/spacepod/proc/deal_damage(var/damage)
@@ -261,7 +253,7 @@
if(H)
H.forceMove(get_turf(src))
H.ex_act(severity + 1)
- to_chat(H, "You are forcefully thrown from \the [src]! ")
+ to_chat(H, "You are forcefully thrown from [src]! ")
qdel(ion_trail)
qdel(src)
if(2)
@@ -275,7 +267,7 @@
cargo_hold.emp_act(severity)
if(battery && battery.charge > 0)
- battery.use((battery.charge / 2) / severity)
+ battery.use((battery.charge/3)/(severity*2))
deal_damage(80 / severity)
if(empcounter < (40 / severity))
empcounter = 40 / severity
@@ -311,25 +303,26 @@
if(iscrowbar(W))
if(!equipment_system.lock_system || unlocked || hatch_open)
hatch_open = !hatch_open
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch. ")
else
to_chat(user, "The hatch is locked shut! ")
return
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(!hatch_open)
- to_chat(user, "\red The maintenance hatch is closed!")
+ to_chat(user, "The maintenance hatch is closed! ")
return
if(battery)
to_chat(user, "The pod already has a battery. ")
return
+ to_chat(user, "You insert [W] into the pod. ")
user.drop_item(W)
battery = W
W.forceMove(src)
return
if(istype(W, /obj/item/device/spacepod_equipment))
if(!hatch_open)
- to_chat(user, "\red The maintenance hatch is closed!")
+ to_chat(user, "The maintenance hatch is closed! ")
return
if(!equipment_system)
to_chat(user, "The pod has no equipment datum, yell at the coders ")
@@ -361,21 +354,21 @@
if(istype(W, /obj/item/weapon/weldingtool))
if(!hatch_open)
- to_chat(user, "\red You must open the maintenance hatch before attempting repairs.")
+ to_chat(user, "You must open the maintenance hatch before attempting repairs. ")
return
var/obj/item/weapon/weldingtool/WT = W
if(!WT.isOn())
- to_chat(user, "\red The welder must be on for this task.")
+ to_chat(user, "The welder must be on for this task. ")
return
if(health < initial(health))
- to_chat(user, "\blue You start welding the spacepod...")
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ to_chat(user, "You start welding the spacepod... ")
+ playsound(loc, W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !WT.remove_fuel(3, user)) return
repair_damage(10)
- to_chat(user, "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]")
+ to_chat(user, "You mend some [pick("dents","bumps","damage")] with [WT] ")
return
- to_chat(user, "\The [src] is fully repaired! ")
+ to_chat(user, "[src] is fully repaired! ")
return
if(istype(W, /obj/item/device/lock_buster))
@@ -383,7 +376,7 @@
if(L.on && equipment_system.lock_system)
user.visible_message(user, "[user] is drilling through the [src]'s lock! ",
"You start drilling through the [src]'s lock! ")
- if(do_after(user, 100, target = src))
+ if(do_after(user, 100 * W.toolspeed, target = src))
qdel(equipment_system.lock_system)
equipment_system.lock_system = null
user.visible_message(user, "[user] has destroyed the [src]'s lock! ",
@@ -403,7 +396,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
to_chat(user, "The pod already has a [slot], remove it first. ")
return
else
- to_chat(user, "You insert \the [SPE] into the pod. ")
+ to_chat(user, "You insert [SPE] into the pod. ")
user.drop_item(SPE)
SPE.forceMove(src)
equipment_system.vars[slot] = SPE
@@ -464,7 +457,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
switch(input(user, "Remove which equipment?", null, null) as null|anything in possible)
if("Energy Cell")
if(user.put_in_any_hand_if_possible(battery))
- to_chat(user, "You remove \the [battery] from the space pod ")
+ to_chat(user, "You remove [battery] from the space pod ")
battery = null
else
to_chat(user, "You need an open hand to do that. ")
@@ -487,18 +480,18 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
/obj/spacepod/proc/remove_equipment(mob/user, var/obj/item/device/spacepod_equipment/SPE, var/slot)
if(passengers.len > max_passengers - SPE.occupant_mod)
- to_chat(user, "Someone is sitting in \the [SPE]! ")
+ to_chat(user, "Someone is sitting in [SPE]! ")
return
var/sum_w_class = 0
for(var/obj/item/I in cargo_hold.contents)
sum_w_class += I.w_class
if(cargo_hold.contents.len > cargo_hold.storage_slots - SPE.storage_mod["slots"] || sum_w_class > cargo_hold.max_combined_w_class - SPE.storage_mod["w_class"])
- to_chat(user, "Empty \the [SPE] first! ")
+ to_chat(user, "Empty [SPE] first! ")
return
if(user.put_in_any_hand_if_possible(SPE))
- to_chat(user, "You remove \the [SPE] from the equipment system. ")
+ to_chat(user, "You remove [SPE] from the equipment system. ")
equipment_system.installed_modules -= SPE
max_passengers -= SPE.occupant_mod
cargo_hold.storage_slots -= SPE.storage_mod["slots"]
@@ -602,6 +595,10 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
set category = "Spacepod"
set src = usr.loc
set popup_menu = 0
+
+ if(usr.incapacitated())
+ return
+
if(usr != src.pilot)
to_chat(usr, "You can't reach the controls from your chair")
return
@@ -701,22 +698,22 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
/obj/spacepod/proc/load_cargo(mob/user, var/obj/O)
var/obj/item/device/spacepod_equipment/cargo/ore/C = equipment_system.cargo_system
if(!C.storage)
- to_chat(user, "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system] ")
+ to_chat(user, "You begin loading [O] into [src]'s [equipment_system.cargo_system] ")
if(do_after(user, 40, target = src))
C.storage = O
O.forceMove(C)
- to_chat(user, "You load \the [O] into \the [src]'s [equipment_system.cargo_system]! ")
+ to_chat(user, "You load [O] into [src]'s [equipment_system.cargo_system]! ")
else
- to_chat(user, "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system] ")
+ to_chat(user, "You fail to load [O] into [src]'s [equipment_system.cargo_system] ")
else
- to_chat(user, "\The [src] already has \an [C.storage] ")
+ to_chat(user, "[src] already has \an [C.storage] ")
/obj/spacepod/proc/enter_pod(mob/user)
if(usr.stat != CONSCIOUS)
return 0
if(equipment_system.lock_system && !unlocked)
- to_chat(user, "\The [src]'s doors are locked! ")
+ to_chat(user, "[src]'s doors are locked! ")
return 0
if(get_dist(src, user) > 2 || get_dist(usr, user) > 1)
@@ -751,7 +748,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
occupant_sanity_check()
if(passengers.len <= max_passengers)
- visible_message("[user] starts to climb into \the [src]. ")
+ visible_message("[user] starts to climb into [src]. ")
if(do_after(user, 40, target = src))
if(!pilot || pilot == null)
user.stop_pulling()
@@ -769,9 +766,9 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
else
to_chat(user, "You were too slow. Try better next time, loser. ")
else
- to_chat(user, "You stop entering \the [src]. ")
+ to_chat(user, "You stop entering [src]. ")
else
- to_chat(user, "You can't fit in \the [src], it's full! ")
+ to_chat(user, "You can't fit in [src], it's full! ")
/obj/spacepod/proc/occupant_sanity_check() // going to have to adjust this later for cargo refactor
if(passengers)
@@ -799,7 +796,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
if(!istype(user))
return
- if(user.stat != CONSCIOUS || user.incapacitated()) // unconscious and restrained people can't let themselves out
+ if(usr.incapacitated()) // unconscious and restrained people can't let themselves out
return
occupant_sanity_check()
@@ -807,17 +804,20 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
if(user == pilot)
user.forceMove(get_turf(src))
pilot = null
- to_chat(user, "You climb out of \the [src]. ")
+ to_chat(user, "You climb out of [src]. ")
if(user in passengers)
user.forceMove(get_turf(src))
passengers -= user
- to_chat(user, "You climb out of \the [src]. ")
+ to_chat(user, "You climb out of [src]. ")
/obj/spacepod/verb/lock_pod()
set name = "Lock Doors"
set category = "Spacepod"
set src = usr.loc
+ if(usr.incapacitated())
+ return
+
if(usr in passengers && usr != src.pilot)
to_chat(usr, "You can't reach the controls from your chair")
return
@@ -831,6 +831,9 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
set category = "Spacepod"
set src = usr.loc
+ if(usr.incapacitated())
+ return
+
if(usr != src.pilot)
to_chat(usr, "You can't reach the controls from your chair")
return
@@ -862,11 +865,15 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
set desc = "Fire the weapons."
set category = "Spacepod"
set src = usr.loc
+
+ if(usr.incapacitated())
+ return
+
if(usr != src.pilot)
to_chat(usr, "You can't reach the controls from your chair")
return
if(!equipment_system.weapon_system)
- to_chat(usr, "\The [src] has no weapons! ")
+ to_chat(usr, "[src] has no weapons! ")
return
equipment_system.weapon_system.fire_weapons()
@@ -875,11 +882,15 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
set desc = "Unloads the cargo"
set category = "Spacepod"
set src = usr.loc
+
+ if(usr.incapacitated())
+ return
+
if(usr != src.pilot)
to_chat(usr, "You can't reach the controls from your chair")
return
if(!equipment_system.cargo_system)
- to_chat(usr, "\The [src] has no cargo system! ")
+ to_chat(usr, "[src] has no cargo system! ")
return
equipment_system.cargo_system.unload()
@@ -887,6 +898,10 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
set name = "Toggle Lights"
set category = "Spacepod"
set src = usr.loc
+
+ if(usr.incapacitated())
+ return
+
if(usr != src.pilot)
to_chat(usr, "You can't reach the controls from your chair")
return
@@ -907,6 +922,10 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
set category = "Spacepod"
set src = usr.loc
var/mob/user = usr
+
+ if(usr.incapacitated())
+ return
+
to_chat(user, "You start rooting around under the seat for lost items ")
if(do_after(user, 40, target = src))
var/obj/badlist = list(internal_tank, cargo_hold, pilot, battery) + passengers + equipment_system.installed_modules
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
new file mode 100644
index 00000000000..38d04b527db
--- /dev/null
+++ b/code/modules/station_goals/bsa.dm
@@ -0,0 +1,408 @@
+// Crew has to build a bluespace cannon
+// Cargo orders part for high price
+// Requires high amount of power
+// Requires high level stock parts
+/datum/station_goal/bluespace_cannon
+ name = "Bluespace Artillery"
+
+/datum/station_goal/bluespace_cannon/get_report()
+ return {"Bluespace Artillery position construction
+ Our military presence is inadequate in your sector. We need you to construct a BSA-[rand(1,99)] Artillery position aboard your station.
+
+ Its base parts should be available for shipping by your cargo shuttle.
+
+ -Nanotrasen Naval Command"}
+
+/datum/station_goal/bluespace_cannon/on_report()
+ //Unlock BSA parts
+ var/datum/supply_packs/misc/bsa/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/bsa]"]
+ P.special_enabled = TRUE
+
+/datum/station_goal/bluespace_cannon/check_completion()
+ if(..())
+ return TRUE
+ for(var/obj/machinery/bsa/full/B)
+ if(B && !B.stat && is_station_contact(B.z))
+ return TRUE
+ return FALSE
+
+/obj/machinery/bsa
+ icon = 'icons/obj/machines/particle_accelerator3.dmi'
+ density = 1
+ anchored = 1
+
+/obj/machinery/bsa/back
+ name = "Bluespace Artillery Generator"
+ desc = "Generates cannon pulse. Needs to be linked with a fusor. "
+ icon_state = "power_box"
+
+/obj/machinery/bsa/back/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = W
+ M.buffer = src
+ to_chat(user, "You store linkage information in [W]'s buffer. ")
+ else if(istype(W, /obj/item/weapon/wrench))
+ default_unfasten_wrench(user, W, 10)
+ return TRUE
+ else
+ return ..()
+
+/obj/machinery/bsa/front
+ name = "Bluespace Artillery Bore"
+ desc = "Do not stand in front of cannon during operation. Needs to be linked with a fusor."
+ icon_state = "emitter_center"
+
+/obj/machinery/bsa/front/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = W
+ M.buffer = src
+ to_chat(user, "You store linkage information in [W]'s buffer. ")
+ else if(istype(W, /obj/item/weapon/wrench))
+ default_unfasten_wrench(user, W, 10)
+ return TRUE
+ else
+ return ..()
+
+/obj/machinery/bsa/middle
+ name = "Bluespace Artillery Fusor"
+ desc = "Contents classifed by Nanotrasen Naval Command. Needs to be linked with the other BSA parts using multitool."
+ icon_state = "fuel_chamber"
+ var/obj/machinery/bsa/back/back
+ var/obj/machinery/bsa/front/front
+
+/obj/machinery/bsa/middle/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = W
+ if(M.buffer)
+ if(istype(M.buffer,/obj/machinery/bsa/back))
+ back = M.buffer
+ M.buffer = null
+ to_chat(user, "You link [src] with [back]. ")
+ else if(istype(M.buffer,/obj/machinery/bsa/front))
+ front = M.buffer
+ M.buffer = null
+ to_chat(user, "You link [src] with [front]. ")
+ else if(istype(W, /obj/item/weapon/wrench))
+ default_unfasten_wrench(user, W, 10)
+ return TRUE
+ else
+ return ..()
+
+/obj/machinery/bsa/middle/proc/check_completion()
+ if(!front || !back)
+ return "No linked parts detected!"
+ if(!front.anchored || !back.anchored || !anchored)
+ return "Linked parts unwrenched!"
+ if(front.y != y || back.y != y || !(front.x > x && back.x < x || front.x < x && back.x > x) || front.z != z || back.z != z)
+ return "Parts misaligned!"
+ if(!has_space())
+ return "Not enough free space!"
+
+/obj/machinery/bsa/middle/proc/has_space()
+ var/cannon_dir = get_cannon_direction()
+ var/x_min
+ var/x_max
+ switch(cannon_dir)
+ if(EAST)
+ x_min = x - 4 //replace with defines later
+ x_max = x + 6
+ if(WEST)
+ x_min = x + 4
+ x_max = x - 6
+
+ for(var/turf/T in block(locate(x_min,y-1,z),locate(x_max,y+1,z)))
+ if(T.density || isspaceturf(T))
+ return FALSE
+ return TRUE
+
+/obj/machinery/bsa/middle/proc/get_cannon_direction()
+ if(front.x > x && back.x < x)
+ return EAST
+ else if(front.x < x && back.x > x)
+ return WEST
+
+/obj/machinery/bsa/full
+ name = "Bluespace Artillery"
+ desc = "Long range bluespace artillery."
+ icon = 'icons/obj/lavaland/cannon.dmi'
+ icon_state = "cannon_west"
+
+ var/obj/machinery/computer/bsa_control/controller
+ var/cannon_direction = WEST
+ var/static/image/top_layer = null
+ var/ex_power = 3
+ var/power_used_per_shot = 2000000 //enough to kil standard apc - todo : make this use wires instead and scale explosion power with it
+ var/last_fire_time = 0 // The time at which the gun was last fired
+ var/reload_cooldown = 600 // The gun's cooldown
+
+ pixel_y = -32
+ pixel_x = -192
+ bound_width = 352
+ bound_x = -192
+
+/obj/machinery/bsa/full/Destroy()
+ if(controller && controller.cannon == src)
+ controller.cannon = null
+ controller = null
+ return ..()
+
+/obj/machinery/bsa/full/east
+ icon_state = "cannon_east"
+ cannon_direction = EAST
+
+/obj/machinery/bsa/full/admin
+ power_used_per_shot = 0
+ reload_cooldown = 100
+
+/obj/machinery/bsa/full/admin/east
+ icon_state = "cannon_east"
+ cannon_direction = EAST
+
+/obj/machinery/bsa/full/proc/get_front_turf()
+ switch(dir)
+ if(WEST)
+ return locate(x - 6,y,z)
+ if(EAST)
+ return locate(x + 4,y,z)
+ return get_turf(src)
+
+/obj/machinery/bsa/full/proc/get_back_turf()
+ switch(dir)
+ if(WEST)
+ return locate(x + 4,y,z)
+ if(EAST)
+ return locate(x - 6,y,z)
+ return get_turf(src)
+
+/obj/machinery/bsa/full/proc/get_target_turf()
+ switch(dir)
+ if(WEST)
+ return locate(1,y,z)
+ if(EAST)
+ return locate(world.maxx,y,z)
+ return get_turf(src)
+
+/obj/machinery/bsa/full/New(loc, direction)
+ ..()
+
+ if(direction)
+ cannon_direction = direction
+
+ switch(cannon_direction)
+ if(WEST)
+ dir = WEST
+ pixel_x = -192
+ top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_west")
+ top_layer.layer = 4.1
+ icon_state = "cannon_west"
+ if(EAST)
+ dir = EAST
+ top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_east")
+ top_layer.layer = 4.1
+ icon_state = "cannon_east"
+ overlays += top_layer
+ reload()
+
+/obj/machinery/bsa/full/proc/fire(mob/user, turf/bullseye)
+ var/turf/point = get_front_turf()
+ for(var/turf/T in getline(get_step(point,dir),get_target_turf()))
+ T.ex_act(1)
+ for(var/atom/A in T)
+ A.ex_act(1)
+
+ point.Beam(get_target_turf(), icon_state = "bsa_beam", time = 50, maxdistance = world.maxx, beam_type = /obj/effect/ebeam/deadly) //ZZZAP
+ playsound(src, 'sound/machines/bsa_fire.ogg', 100, 1)
+
+ message_admins("[key_name_admin(user)] has launched an artillery strike.")
+ explosion(bullseye,ex_power,ex_power*2,ex_power*4)
+
+ reload()
+
+/obj/machinery/bsa/full/proc/reload()
+ use_power(power_used_per_shot)
+ last_fire_time = world.time / 10
+
+/obj/item/weapon/circuitboard/machine/bsa/back
+ name = "Bluespace Artillery Generator (Machine Board)"
+ build_path = /obj/machinery/bsa/back
+ origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies!
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor/quadratic = 5,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/bsa/middle
+ name = "Bluespace Artillery Fusor (Machine Board)"
+ build_path = /obj/machinery/bsa/middle
+ origin_tech = "engineering=2;combat=2;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 20,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/bsa/front
+ name = "Bluespace Artillery Bore (Machine Board)"
+ build_path = /obj/machinery/bsa/front
+ origin_tech = "engineering=2;combat=2;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator/femto = 5,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/computer/bsa_control
+ name = "Bluespace Artillery Controls (Computer Board)"
+ build_path = /obj/machinery/computer/bsa_control
+ origin_tech = "engineering=2;combat=2;bluespace=2"
+
+/obj/machinery/computer/bsa_control
+ name = "Bluespace Artillery Control"
+ var/obj/machinery/bsa/full/cannon
+ var/notice
+ var/target
+ use_power = 0
+ circuit = /obj/item/weapon/circuitboard/computer/bsa_control
+ icon = 'icons/obj/machines/particle_accelerator3.dmi'
+ icon_state = "control_boxp"
+ var/icon_state_broken = "control_box"
+ var/icon_state_nopower = "control_boxw"
+ var/icon_state_reloading = "control_boxp1"
+ var/icon_state_active = "control_boxp0"
+ layer = 3.1 // Just above the cannon sprite
+
+ var/area_aim = FALSE //should also show areas for targeting
+ var/target_all_areas = FALSE //allows all areas (including admin areas) to be targeted
+
+/obj/machinery/computer/bsa_control/admin
+ area_aim = TRUE
+ target_all_areas = TRUE
+
+/obj/machinery/computer/bsa_control/admin/initialize()
+ ..()
+ if(!cannon)
+ cannon = deploy()
+
+/obj/machinery/computer/bsa_control/Destroy()
+ if(cannon && cannon.controller == src)
+ cannon.controller = null
+ cannon = null
+ return ..()
+
+/obj/machinery/computer/bsa_control/process()
+ ..()
+ update_icon()
+
+/obj/machinery/computer/bsa_control/update_icon()
+ if(stat & BROKEN)
+ icon_state = icon_state_broken
+ else if(stat & NOPOWER)
+ icon_state = icon_state_nopower
+ else if(cannon && (cannon.last_fire_time + cannon.reload_cooldown) > (world.time / 10))
+ icon_state = icon_state_reloading
+ else if(cannon)
+ icon_state = icon_state_active
+ else
+ icon_state = initial(icon_state)
+
+/obj/machinery/computer/bsa_control/attack_hand(mob/user)
+ if(..())
+ return 1
+ ui_interact(user)
+
+/obj/machinery/computer/bsa_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "bsa.tmpl", name, 400, 305)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/list/data = list()
+ data["connected"] = cannon
+ data["notice"] = notice
+ if(target)
+ data["target"] = get_target_name()
+
+ if(cannon)
+ var/reload_cooldown = cannon.reload_cooldown
+ var/last_fire_time = cannon.last_fire_time
+ var/time_to_wait = max(0, round(reload_cooldown - ((world.time / 10) - last_fire_time)))
+ var/minutes = max(0, round(time_to_wait / 60))
+ var/seconds = max(0, time_to_wait - (60 * minutes))
+
+ data["reloadtime_mins"] = minutes
+ data["reloadtime_secs"] = (seconds < 10) ? "0[seconds]" : seconds
+ data["ready"] = minutes == 0 && seconds == 0
+ else
+ data["ready"] = FALSE
+
+ return data
+
+/obj/machinery/computer/bsa_control/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["build"])
+ cannon = deploy()
+ . = TRUE
+ else if(href_list["fire"])
+ fire(usr)
+ . = TRUE
+ else if(href_list["recalibrate"])
+ calibrate(usr)
+ . = TRUE
+ update_icon()
+
+/obj/machinery/computer/bsa_control/proc/calibrate(mob/user)
+ var/list/gps_locators = list()
+ for(var/obj/item/device/gps/G in GPS_list) //nulls on the list somehow
+ gps_locators[G.gpstag] = G
+
+ var/list/options = gps_locators
+ if(area_aim)
+ options += target_all_areas ? ghostteleportlocs : teleportlocs
+ var/V = input(user,"Select target", "Select target",null) in options|null
+ target = options[V]
+
+/obj/machinery/computer/bsa_control/proc/get_target_name()
+ if(istype(target,/area))
+ var/area/A = target
+ return A.name
+ else if(istype(target,/obj/item/device/gps))
+ var/obj/item/device/gps/G = target
+ return G.gpstag
+
+/obj/machinery/computer/bsa_control/proc/get_impact_turf()
+ if(istype(target,/area))
+ return pick(get_area_turfs(target))
+ else if(istype(target,/obj/item/device/gps))
+ return get_turf(target)
+
+/obj/machinery/computer/bsa_control/proc/fire(mob/user)
+ if(!cannon || !target)
+ return
+ if(cannon.stat)
+ notice = "Cannon unpowered!"
+ return
+ notice = null
+ cannon.fire(user, get_impact_turf())
+
+/obj/machinery/computer/bsa_control/proc/deploy()
+ var/obj/machinery/bsa/full/prebuilt = locate() in range(7, src) //In case of adminspawn
+ if(prebuilt)
+ prebuilt.controller = src
+ return prebuilt
+
+ var/obj/machinery/bsa/middle/centerpiece = locate() in range(7, src)
+ if(!centerpiece)
+ notice = "No BSA parts detected nearby."
+ return null
+ notice = centerpiece.check_completion()
+ if(notice)
+ return null
+ //Totally nanite construction system not an immersion breaking spawning
+ var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread()
+ s.set_up(4, 0, get_turf(centerpiece))
+ s.start()
+ var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction())
+ cannon.controller = src
+ qdel(centerpiece.front)
+ qdel(centerpiece.back)
+ qdel(centerpiece)
+ return cannon
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
new file mode 100644
index 00000000000..977899a3195
--- /dev/null
+++ b/code/modules/station_goals/dna_vault.dm
@@ -0,0 +1,304 @@
+//Crew has to create dna vault
+// Cargo can order DNA samplers + DNA vault boards
+// DNA vault requires x animals ,y plants, z human dna
+// DNA vaults require high tier stock parts and cold
+// After completion each crewmember can receive single upgrade chosen out of 2 for the mob.
+#define VAULT_SPACEIMMUNE "Space Immunity"
+#define VAULT_XRAY "X-Ray Vision"
+#define VAULT_TELEKINESIS "Telekinesis"
+#define VAULT_PSYCHIC "Psychic Powers"
+#define VAULT_SPEED "Speediness"
+
+/datum/station_goal/dna_vault
+ name = "DNA Vault"
+ var/animal_count
+ var/human_count
+ var/plant_count
+
+/datum/station_goal/dna_vault/New()
+ ..()
+ animal_count = rand(15,20) //might be too few given ~15 roundstart stationside ones
+ human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population.
+ var/non_standard_plants = non_standard_plants_count()
+ plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants))
+
+/datum/station_goal/dna_vault/proc/non_standard_plants_count()
+ . = 0
+ for(var/T in subtypesof(/obj/item/seeds)) //put a cache if it's used anywhere else
+ var/obj/item/seeds/S = T
+ if(initial(S.rarity) > 0)
+ .++
+
+/datum/station_goal/dna_vault/get_report()
+ return {"DNA Vault construction
+ Our long term prediction systems say there's 99% chance of system-wide cataclysm in near future. As such, we need you to construct a DNA Vault aboard your station.
+
+ The DNA Vault needs to contain samples of:
+
+ [animal_count] unique animal data.
+ [plant_count] unique non-standard plant data.
+ [human_count] unique sapient humanoid DNA data.
+
+ The base vault parts should be available for shipping by your cargo shuttle."}
+
+/datum/station_goal/dna_vault/on_report()
+ var/datum/supply_packs/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/dna_vault]"]
+ P.special_enabled = TRUE
+
+ P = shuttle_master.supply_packs["[/datum/supply_packs/misc/dna_probes]"]
+ P.special_enabled = TRUE
+
+/datum/station_goal/dna_vault/check_completion()
+ if(..())
+ return TRUE
+ for(var/obj/machinery/dna_vault/V in machines)
+ if(V.animals.len >= animal_count && V.plants.len >= plant_count && V.dna.len >= human_count && is_station_contact(V.z))
+ return TRUE
+ return FALSE
+
+/obj/item/device/dna_probe
+ name = "DNA Sampler"
+ desc = "Can be used to take chemical and genetic samples of pretty much anything."
+ icon = 'icons/obj/hypo.dmi'
+ item_state = "hypo"
+ icon_state = "hypo"
+ flags = NOBLUDGEON
+ var/list/animals = list()
+ var/list/plants = list()
+ var/list/dna = list()
+
+/obj/item/device/dna_probe/proc/clear_data()
+ animals = list()
+ plants = list()
+ dna = list()
+
+var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/mob/living/carbon/alien))
+
+/obj/item/device/dna_probe/afterattack(atom/target, mob/user, proximity)
+ ..()
+ if(!proximity || !target)
+ return
+ //tray plants
+ if(istype(target,/obj/machinery/hydroponics))
+ var/obj/machinery/hydroponics/H = target
+ if(!H.myseed)
+ return
+ if(!H.harvest)// So it's bit harder.
+ to_chat(user, "Plants needs to be ready to harvest to perform full data scan. ") //Because space dna is actually magic
+ return
+ if(plants[H.myseed.type])
+ to_chat(user, "Plant data already present in local storage.")
+ return
+ plants[H.myseed.type] = 1
+ to_chat(user, "Plant data added to local storage.")
+
+ //animals
+ if(isanimal(target) || is_type_in_typecache(target, non_simple_animals))
+ if(isanimal(target))
+ var/mob/living/simple_animal/A = target
+ if(!A.healable)//simple approximation of being animal not a robot or similar
+ to_chat(user, "No compatible DNA detected ")
+ return
+ if(animals[target.type])
+ to_chat(user, "Animal data already present in local storage.")
+ return
+ animals[target.type] = 1
+ to_chat(user, "Animal data added to local storage.")
+
+ //humans
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(dna[H.dna.uni_identity])
+ to_chat(user, "Humanoid data already present in local storage.")
+ return
+ dna[H.dna.uni_identity] = 1
+ to_chat(user, "Humanoid data added to local storage.")
+
+
+/obj/item/weapon/circuitboard/machine/dna_vault
+ name = "DNA Vault (Machine Board)"
+ build_path = /obj/machinery/dna_vault
+ origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies!
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor/quadratic = 5,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/structure/filler
+ name = "big machinery part"
+ density = 1
+ anchored = 1
+ invisibility = 101
+ var/obj/machinery/parent
+
+/obj/structure/filler/ex_act()
+ return
+
+/obj/machinery/dna_vault
+ name = "DNA Vault"
+ desc = "Break glass in case of apocalypse."
+ icon = 'icons/obj/machines/dna_vault.dmi'
+ icon_state = "vault"
+ density = 1
+ anchored = 1
+ idle_power_usage = 5000
+ pixel_x = -32
+ pixel_y = -64
+ luminosity = 1
+
+ //High defaults so it's not completed automatically if there's no station goal
+ var/animals_max = 100
+ var/plants_max = 100
+ var/dna_max = 100
+ var/list/animals = list()
+ var/list/plants = list()
+ var/list/dna = list()
+
+ var/completed = FALSE
+ var/list/power_lottery = list()
+
+ var/list/obj/structure/fillers = list()
+
+/obj/machinery/dna_vault/New()
+ //TODO: Replace this,bsa and gravgen with some big machinery datum
+ var/list/occupied = list()
+ for(var/direct in list(EAST,WEST,SOUTHEAST,SOUTHWEST))
+ occupied += get_step(src,direct)
+ occupied += locate(x+1,y-2,z)
+ occupied += locate(x-1,y-2,z)
+
+ for(var/T in occupied)
+ var/obj/structure/filler/F = new(T)
+ F.parent = src
+ fillers += F
+
+ if(ticker.mode)
+ for(var/datum/station_goal/dna_vault/G in ticker.mode.station_goals)
+ animals_max = G.animal_count
+ plants_max = G.plant_count
+ dna_max = G.human_count
+ break
+
+ ..()
+
+/obj/machinery/dna_vault/Destroy()
+ for(var/V in fillers)
+ var/obj/structure/filler/filler = V
+ filler.parent = null
+ qdel(filler)
+ fillers.Cut()
+ . = ..()
+
+/obj/machinery/dna_vault/attack_ghost(mob/user)
+ if(stat & (BROKEN|MAINT))
+ return
+ return ui_interact(user)
+
+/obj/machinery/dna_vault/attack_hand(mob/user)
+ if(..())
+ return 1
+ ui_interact(user)
+
+/obj/machinery/dna_vault/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ roll_powers(user)
+ ui = new(user, src, ui_key, "dna_vault.tmpl", name, 550, 400)
+ ui.open()
+
+/obj/machinery/dna_vault/proc/roll_powers(mob/user)
+ if(user in power_lottery)
+ return
+ var/list/L = list()
+ var/list/possible_powers = list(VAULT_SPACEIMMUNE,VAULT_XRAY,VAULT_TELEKINESIS,VAULT_PSYCHIC,VAULT_SPEED)
+ L += pick_n_take(possible_powers)
+ L += pick_n_take(possible_powers)
+ power_lottery[user] = L
+
+/obj/machinery/dna_vault/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) //TODO Make it % bars maybe
+ var/list/data = list()
+ data["plants"] = plants.len
+ data["plants_max"] = plants_max
+ data["animals"] = animals.len
+ data["animals_max"] = animals_max
+ data["dna"] = dna.len
+ data["dna_max"] = dna_max
+ data["completed"] = completed
+ data["used"] = TRUE
+ data["choiceA"] = ""
+ data["choiceB"] = ""
+ if(user && completed)
+ var/list/L = power_lottery[user]
+ if(L && L.len)
+ data["used"] = FALSE
+ data["choiceA"] = L[1]
+ data["choiceB"] = L[2]
+ return data
+
+/obj/machinery/dna_vault/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["gene"])
+ upgrade(usr,href_list["choice"])
+ . = TRUE
+
+/obj/machinery/dna_vault/proc/check_goal()
+ if(plants.len >= plants_max && animals.len >= animals_max && dna.len >= dna_max)
+ completed = TRUE
+
+/obj/machinery/dna_vault/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/dna_probe))
+ var/obj/item/device/dna_probe/P = I
+ var/uploaded = 0
+ for(var/plant in P.plants)
+ if(!plants[plant])
+ uploaded++
+ plants[plant] = 1
+ for(var/animal in P.animals)
+ if(!animals[animal])
+ uploaded++
+ animals[animal] = 1
+ for(var/ui in P.dna)
+ if(!dna[ui])
+ uploaded++
+ dna[ui] = 1
+ check_goal()
+ to_chat(user, "[uploaded] new datapoints uploaded. ")
+ else
+ return ..()
+
+/obj/machinery/dna_vault/proc/upgrade(mob/living/carbon/human/H, upgrade_type)
+ if(!(upgrade_type in power_lottery[H]))
+ return
+ if(!completed)
+ return
+ if(!H.ignore_gene_stability)
+ to_chat(H, "[src] stabilizes your genes, granting you the ability to have multiple powers. ")
+ H.ignore_gene_stability = 1
+ switch(upgrade_type)
+ if(VAULT_SPACEIMMUNE)
+ to_chat(H, "You suddenly don't feel the need to breathe anymore. You also don't feel any cold anymore. ")
+ grant_power(H, NOBREATHBLOCK, NO_BREATH)
+ grant_power(H, FIREBLOCK, RESIST_COLD)
+ if(VAULT_XRAY)
+ to_chat(H, "You can suddenly see through walls. ")
+ grant_power(H, XRAYBLOCK, XRAY)
+ if(VAULT_TELEKINESIS)
+ to_chat(H, "You gain the ability to control objects from a distance. ")
+ grant_power(H, TELEBLOCK, TK)
+ if(VAULT_PSYCHIC)
+ to_chat(H, "Your mind expands, giving you psychic powers. ")
+ grant_power(H, REMOTETALKBLOCK, REMOTE_TALK)
+ grant_power(H, REMOTEVIEWBLOCK, REMOTE_VIEW)
+ grant_power(H, EMPATHBLOCK, EMPATH)
+ grant_power(H, PSYRESISTBLOCK, PSY_RESIST)
+ if(VAULT_SPEED)
+ to_chat(H, "You feel very fast and agile. ")
+ grant_power(H, JUMPBLOCK, JUMPY)
+ grant_power(H, INCREASERUNBLOCK, RUN)
+ power_lottery[H] = list()
+
+/obj/machinery/dna_vault/proc/grant_power(mob/living/carbon/human/H, block, power)
+ H.dna.SetSEState(block, 1, 1)
+ H.mutations |= power
+ genemutcheck(H, block, null, MUTCHK_FORCED)
\ No newline at end of file
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
new file mode 100644
index 00000000000..5a19fcb67cc
--- /dev/null
+++ b/code/modules/station_goals/shield.dm
@@ -0,0 +1,193 @@
+//Station Shield
+// A chain of satellites encircles the station
+// Satellites be actived to generate a shield that will block unorganic matter from passing it.
+/datum/station_goal/station_shield
+ name = "Station Shield"
+ var/coverage_goal = 5000
+
+/datum/station_goal/station_shield/get_report()
+ return {"Station Shield construction
+ The station is located in a zone full of space debris. We have a prototype shielding system you will deploy to reduce collision related accidents.
+
+ You can order the satellites and control systems through the cargo shuttle."}
+
+/datum/station_goal/station_shield/on_report()
+ //Unlock
+ var/datum/supply_packs/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/shield_sat]"]
+ P.special_enabled = TRUE
+
+ P = shuttle_master.supply_packs["[/datum/supply_packs/misc/shield_sat_control]"]
+ P.special_enabled = TRUE
+
+/datum/station_goal/station_shield/check_completion()
+ if(..())
+ return TRUE
+ if(get_coverage() >= coverage_goal)
+ return TRUE
+ return FALSE
+
+/datum/station_goal/proc/get_coverage()
+ var/list/coverage = list()
+ for(var/obj/machinery/satellite/meteor_shield/A in machines)
+ if(!A.active || !is_station_level(A.z))
+ continue
+ coverage |= view(A.kill_range, A)
+ return coverage.len
+
+/obj/item/weapon/circuitboard/computer/sat_control
+ name = "Satellite Network Control (Computer Board)"
+ build_path = /obj/machinery/computer/sat_control
+ origin_tech = "engineering=3"
+
+/obj/machinery/computer/sat_control
+ name = "Satellite control"
+ desc = "Used to control the satellite network."
+ circuit = /obj/item/weapon/circuitboard/computer/sat_control
+ icon_screen = "accelerator"
+ icon_keyboard = "accelerator_key"
+ var/notice
+
+/obj/machinery/computer/sat_control/attack_hand(mob/user)
+ if(..())
+ return 1
+ ui_interact(user)
+
+/obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "sat_control.tmpl", name, 475, 400)
+ ui.open()
+
+/obj/machinery/computer/sat_control/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["toggle"])
+ toggle(text2num(href_list["id"]))
+ . = TRUE
+
+/obj/machinery/computer/sat_control/proc/toggle(id)
+ for(var/obj/machinery/satellite/S in machines)
+ if(S.id == id && atoms_share_level(src, S))
+ S.toggle()
+
+/obj/machinery/computer/sat_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/list/data = list()
+
+ data["satellites"] = list()
+ for(var/obj/machinery/satellite/S in machines)
+ data["satellites"] += list(list(
+ "id" = S.id,
+ "active" = S.active,
+ "mode" = S.mode
+ ))
+ data["notice"] = notice
+
+ var/datum/station_goal/station_shield/G = locate() in ticker.mode.station_goals
+ if(G)
+ data["meteor_shield"] = 1
+ data["meteor_shield_coverage"] = G.get_coverage()
+ data["meteor_shield_coverage_max"] = G.coverage_goal
+ data["meteor_shield_coverage_percentage"] = (G.get_coverage() / G.coverage_goal) * 100
+ return data
+
+/obj/machinery/satellite
+ name = "Defunct Satellite"
+ desc = ""
+ icon = 'icons/obj/machines/satellite.dmi'
+ icon_state = "sat_inactive"
+ var/mode = "NTPROBEV0.8"
+ var/active = FALSE
+ density = 1
+ use_power = FALSE
+ var/static/gid = 0
+ var/id = 0
+
+/obj/machinery/satellite/New()
+ ..()
+ id = gid++
+
+/obj/machinery/satellite/attack_hand(mob/user)
+ if(..())
+ return 1
+ interact(user)
+
+/obj/machinery/satellite/interact(mob/user)
+ toggle(user)
+
+/obj/machinery/satellite/proc/toggle(mob/user)
+ if(!active && !isinspace())
+ if(user)
+ to_chat(user, "You can only active the [src] in space. ")
+ return TRUE
+ if(user)
+ to_chat(user, "You [active ? "deactivate": "activate"] the [src] ")
+ active = !active
+ if(active)
+ animate(src, pixel_y = 2, time = 10, loop = -1)
+ anchored = 1
+ else
+ animate(src, pixel_y = 0, time = 10)
+ anchored = 0
+ update_icon()
+
+/obj/machinery/satellite/update_icon()
+ icon_state = active ? "sat_active" : "sat_inactive"
+
+/obj/machinery/satellite/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/multitool))
+ to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[emagged ? "DEBUG_MODE //" : ""] ")
+ else
+ return ..()
+
+/obj/machinery/satellite/meteor_shield
+ name = "Meteor Shield Satellite"
+ desc = "Meteor Point Defense Satellite"
+ mode = "M-SHIELD"
+ speed_process = TRUE
+ var/kill_range = 14
+
+/obj/machinery/satellite/meteor_shield/proc/space_los(meteor)
+ for(var/turf/T in getline(src,meteor))
+ if(!isspaceturf(T))
+ return FALSE
+ return TRUE
+
+/obj/machinery/satellite/meteor_shield/process()
+ if(!active)
+ return
+ for(var/obj/effect/meteor/M in meteor_list)
+ if(M.z != z)
+ continue
+ if(get_dist(M, src) > kill_range)
+ continue
+ if(!emagged && space_los(M))
+ Beam(get_turf(M), icon_state = "sat_beam", time = 5, maxdistance = kill_range)
+ qdel(M)
+
+/obj/machinery/satellite/meteor_shield/toggle(user)
+ if(..(user))
+ return TRUE
+ if(emagged)
+ if(active)
+ change_meteor_chance(2)
+ else
+ change_meteor_chance(0.5)
+
+/obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod)
+ for(var/datum/event_container/container in event_manager.event_containers)
+ for(var/datum/event_meta/M in container.available_events)
+ if(M.event_type == /datum/event/meteor_wave)
+ M.weight *= mod
+
+/obj/machinery/satellite/meteor_shield/Destroy()
+ . = ..()
+ if(active && emagged)
+ change_meteor_chance(0.5)
+
+/obj/machinery/satellite/meteor_shield/emag_act(mob/user)
+ if(!emagged)
+ to_chat(user, "You override the shield's circuits, causing it to attract meteors instead of destroying them. ")
+ emagged = 1
+ if(active)
+ change_meteor_chance(2)
diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm
new file mode 100644
index 00000000000..5a97f0ee2f3
--- /dev/null
+++ b/code/modules/station_goals/station_goal.dm
@@ -0,0 +1,49 @@
+//TODO
+// Admin button to override with your own
+// Sabotage objective for tators
+// Multiple goals with less impact but more department focused
+
+/datum/station_goal
+ var/name = "Generic Goal"
+ var/weight = 1 //In case of multiple goals later.
+ var/required_crew = 10
+ var/list/gamemode_blacklist = list()
+ var/completed = FALSE
+ var/report_message = "Complete this goal."
+
+/datum/station_goal/proc/send_report()
+ priority_announcement.Announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", 'sound/AI/commandreport.ogg')
+ print_command_report(get_report(), "Nanotrasen Directive [pick(phonetic_alphabet)] \Roman[rand(1,50)]")
+ on_report()
+
+/datum/station_goal/proc/on_report()
+ //Additional unlocks/changes go here
+ return
+
+/datum/station_goal/proc/get_report()
+ return report_message
+
+/datum/station_goal/proc/check_completion()
+ return completed
+
+/datum/station_goal/proc/print_result()
+ if(check_completion())
+ to_chat(world, "Station Goal : [name] : Completed! ")
+ else
+ to_chat(world, "Station Goal : [name] : Failed! ")
+
+/datum/station_goal/Destroy()
+ ticker.mode.station_goals -= src
+ . = ..()
+
+/datum/station_goal/Topic(href, href_list)
+ ..()
+
+ if(!check_rights(R_EVENT))
+ return
+
+ if(href_list["announce"])
+ on_report()
+ send_report()
+ else if(href_list["remove"])
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm
index 2595d9bf95d..ba772007b62 100644
--- a/code/modules/surgery/dental_implant.dm
+++ b/code/modules/surgery/dental_implant.dm
@@ -24,14 +24,13 @@
return 0
var/dental_implants = 0
- for(var/obj/item/weapon/reagent_containers/food/pill in target.internal_organs) // Can't give them more than 4 dental implants.
+ for(var/obj/item/weapon/reagent_containers/food/pill in target.contents) // Can't give them more than 4 dental implants.
dental_implants++
if(dental_implants >= 4)
user.visible_message("[user] pulls \the [tool] back out of [target]'s [parse_zone(target_zone)]!", "You pull \the [tool] back out of [target]'s [parse_zone(target_zone)], there wans't enough room... ")
return 0
user.drop_item()
- target.internal_organs += tool
tool.forceMove(target)
var/datum/action/item_action/hands_free/activate_pill/P = new
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index 7d9152e01ff..fbcd9a21c69 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -70,7 +70,7 @@
/datum/surgery_step/open_encased/retract
name = "retract bone"
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75
)
@@ -121,7 +121,7 @@
/datum/surgery_step/open_encased/close
name = "unretract bone" //i suck at names okay? give me a new one
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75
)
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 6c2f7354b43..c17f318e748 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -28,10 +28,6 @@
/datum/surgery_step/generic/cut_face
name = "make incision"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
- /obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
@@ -62,7 +58,7 @@
/datum/surgery_step/face/mend_vocal
name = "mend vocal cords"
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/hemostat = 100, \
/obj/item/stack/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity.
@@ -89,7 +85,7 @@
/datum/surgery_step/face/fix_face
name = "reshape face"
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 55, \
/obj/item/weapon/kitchen/utensil/fork = 75)
@@ -116,9 +112,7 @@
/datum/surgery_step/face/cauterize
name = "close incision"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
+ /obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 8d5f7669ecd..300f6a88918 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -23,10 +23,6 @@
name = "make incision"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
- /obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
@@ -65,10 +61,7 @@
name = "clamp bleeders"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/hemostat = 100, \
/obj/item/stack/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 20
@@ -89,7 +82,7 @@
user.visible_message(" [user] clamps bleeders in [target]'s [affected.name] with \the [tool] .", \
" You clamp bleeders in [target]'s [affected.name] with \the [tool]. ")
affected.clamp()
- spread_germs_to_organ(affected, user)
+ spread_germs_to_organ(affected, user, tool)
return 1
/datum/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -103,7 +96,7 @@
name = "retract skin"
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 50
@@ -158,9 +151,7 @@
name = "cauterize incision"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
+ /obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index 35a30674e3e..498976c4635 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -97,10 +97,7 @@
/datum/surgery_step/cavity/close_space
name = "close cavity space"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
@@ -294,7 +291,6 @@
user.visible_message("[user] places [I] into [case]!", "You place [I] into [case]. ")
else
qdel(I)
- //target.sec_hud_set_implants()
return 1
else
user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out. ", \
@@ -354,7 +350,7 @@
name = "remove embedded objects"
time = 32
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/hemostat = 100, \
/obj/item/stack/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 20
@@ -386,7 +382,7 @@
var/mob/living/simple_animal/borer/worm = H.has_brain_worms()
if(worm.controlling)
target.release_control()
- worm.detatch()
+ worm.detach()
worm.leave_host()
user.visible_message("a slug like creature wiggles out of [H]'s [target_zone]!")
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 794bf2a3e9f..667f5c02a96 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -198,7 +198,7 @@
user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool]. ", \
"You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool]. ")
E.status &= ~ORGAN_DESTROYED
- var/obj/item/organ/external/stump = target.organs_by_name["limb stump"]
+ var/obj/item/organ/external/stump = target.bodyparts_by_name["limb stump"]
if(stump)
stump.remove(target)
if(E.children)
@@ -248,7 +248,7 @@
if(!organ_data)
continue
// This will break if there's more than one stump ever
- var/obj/item/organ/external/stump = target.organs_by_name["limb stump"]
+ var/obj/item/organ/external/stump = target.bodyparts_by_name["limb stump"]
if(stump)
stump.remove(target)
var/new_limb_type = organ_data["path"]
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 1c66bd2c31b..873f1332216 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -5,7 +5,7 @@
implant_overlay = "eye_implant_overlay"
slot = "eye_sight"
parent_organ = "eyes"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
var/vision_flags = 0
var/dark_view = 0
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 153f169efca..278941d87e4 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -8,17 +8,17 @@
var/implant_overlay
tough = 1 //not easyly broken by combat damage
sterile = 1 //not very germy
+ robotic = 2 // these are cybernetic after all
/obj/item/organ/internal/cyberimp/New(var/mob/M = null)
- if(iscarbon(M))
- src.insert(M)
+ . = ..()
if(implant_overlay)
var/image/overlay = new /image(icon, implant_overlay)
overlay.color = implant_color
overlays |= overlay
- return ..()
-
+/obj/item/organ/internal/cyberimp/emp_act()
+ return // These shouldn't be hurt by EMPs in the standard way
//[[[[BRAIN]]]]
@@ -249,9 +249,9 @@
if(istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
if(H.stat != DEAD && prob(50 / severity))
- H.heart_attack = 1
+ H.set_heartattack(TRUE)
spawn(600 / severity)
- H.heart_attack = 0
+ H.set_heartattack(FALSE)
if(H.stat == CONSCIOUS)
to_chat(H, "You feel your heart beating again! ")
@@ -270,9 +270,15 @@
var/lasthand = null
/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click()
+ toggle_item()
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/toggle_item()
if(overloaded)//ensure the implant isn't broken
to_chat(owner, "The implant doesn't respond. It seems to be broken... ")
return
+ owner.changeNext_move(CLICK_CD_MELEE)
+ if(owner.next_move < world.time)
+ return // No spam
if(out)//check if the owner has the item out already
owner.unEquip(holder, 1)//if he does, take it away. then,
holder.loc = null//stash it in nullspace
@@ -297,6 +303,9 @@
holder.loc = null
out = 0
owner.visible_message("[holder] forcibly retracts into [owner]'s arm. ")
+ overload() // Make sure this doesn't happen again
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/overload()
owner.visible_message("A loud bang comes from [owner]... ")
playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1)
to_chat(owner, "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here? ")
@@ -312,7 +321,7 @@
limb.droplimb(0, DROPLIMB_EDGE)
owner.say("I HAVE BEEN DISARMED!!!")
owner.adjustFireLoss(25)//severely injure him!
- overloaded = 1//then make sure this can't happen again by breaking the implant.
+ overloaded = TRUE
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser!
name = "Arm-cannon taser implant"
@@ -322,6 +331,7 @@
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created...
+ ..()
holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser!
@@ -332,8 +342,88 @@
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New()
+ ..()
holder = new /obj/item/weapon/gun/energy/laser/mounted(src)
+// lets make IPCs even *more* vulnerable to EMPs!
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord
+ name = "APC-compatible power adapter implant"
+ desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment"
+ origin_tech = "materials=3;biotech=2;powerstorage=3"
+ slot = "shoulders2"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
+
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/New()
+ ..()
+ holder = new /obj/item/apc_powercord(src)
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/overload()
+ // To allow repair via nanopaste/screwdriver
+ // also so IPCs don't also catch on fire and fall even more apart upon EMP
+ damage = 1
+ overloaded = TRUE
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/surgeryize()
+ if(overloaded && owner)
+ to_chat(owner, "Your [src] feels functional again. ")
+ overloaded = FALSE
+
+
+/obj/item/apc_powercord
+ name = "power cable"
+ desc = "Insert into a nearby APC to draw power from it."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "wire1"
+ flags = NODROP | NOBLUDGEON
+
+/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag)
+ return ..()
+ user.changeNext_move(CLICK_CD_MELEE)
+ var/obj/machinery/power/apc/A = target
+ var/mob/living/carbon/human/H = user
+ if(H.get_int_organ(/obj/item/organ/internal/cell))
+ if(A.emagged || A.stat & BROKEN)
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(3, 1, A)
+ s.start()
+ to_chat(H, "The APC power currents surge erratically, damaging your chassis! ")
+ H.adjustFireLoss(10,0)
+ else if(A.cell && A.cell.charge > 0)
+ if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
+ to_chat(user, "You are already fully charged! ")
+ else
+ addtimer(src, "powerdraw_loop", 0, TRUE, A, H)
+ else
+ to_chat(user, "There is no charge to draw from that APC. ")
+ else
+ to_chat(user, "You lack a cell in which to store charge! ")
+
+/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
+ H.visible_message("[H] inserts a power connector into \the [A]. ", "You begin to draw power from \the [A]. ")
+ while(do_after(H, 10, target = A))
+ if(loc != H)
+ to_chat(H, "You must keep your connector out while charging! ")
+ break
+ if(A.cell.charge == 0)
+ to_chat(H, "\The [A] has no more charge. ")
+ break
+ A.charging = 1
+ if(A.cell.charge >= 500)
+ H.nutrition += 50
+ A.cell.charge -= 500
+ to_chat(H, "You siphon off some of the stored charge for your own use. ")
+ else
+ H.nutrition += A.cell.charge/10
+ A.cell.charge = 0
+ to_chat(H, "You siphon off the last of \the [A]'s charge. ")
+ break
+ if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
+ to_chat(H, "You are now fully charged. ")
+ break
+ H.visible_message("[H] unplugs from \the [A]. ", "You unplug from \the [A]. ")
+
//BOX O' IMPLANTS
/obj/item/weapon/storage/box/cyber_implants
diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm
index 5c2aa1193d9..6f72deca2e1 100644
--- a/code/modules/surgery/organs/autoimplanter.dm
+++ b/code/modules/surgery/organs/autoimplanter.dm
@@ -3,7 +3,8 @@
desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants."
icon_state = "autoimplanter"
item_state = "walkietalkie"//left as this so as to intentionally not have inhands
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
+ usesound = 'sound/weapons/circsawhit.ogg'
var/obj/item/organ/internal/cyberimp/storedorgan
/obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used...
@@ -12,7 +13,7 @@
return
storedorgan.insert(user)//insert stored organ into the user
user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise. ", "You feel a sharp sting as [src] plunges into your body. ")
- playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, 1)
+ playsound(get_turf(user), usesound, 50, 1)
storedorgan = null
/obj/item/device/autoimplanter/attackby(obj/item/I, mob/user, params)
@@ -32,4 +33,4 @@
storedorgan.forceMove(get_turf(user))
storedorgan = null
to_chat(user, "You remove the [storedorgan] from [src]. ")
- playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(user), I.usesound, 50, 1)
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 1bdf29dd191..9eefe264524 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -118,7 +118,7 @@
//Bleeding out
var/blood_max = 0
- for(var/obj/item/organ/external/temp in organs)
+ for(var/obj/item/organ/external/temp in bodyparts)
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
continue
for(var/datum/wound/W in temp.wounds)
@@ -186,6 +186,16 @@
temp_chem += R.id
temp_chem[R.id] = R.volume
B.data["trace_chem"] = list2params(temp_chem)
+ if(mind)
+ B.data["mind"] = mind
+ if(ckey)
+ B.data["ckey"] = ckey
+
+ if(!suiciding)
+ B.data["cloneable"] = 1
+ B.data["gender"] = gender
+ B.data["real_name"] = real_name
+ B.data["factions"] = faction
return B
//For humans, blood does not appear from blue, it comes from vessels.
diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm
index a61537f1985..94b0de5e066 100644
--- a/code/modules/surgery/organs/helpers.dm
+++ b/code/modules/surgery/organs/helpers.dm
@@ -43,6 +43,6 @@
return istype(A, /obj/item/organ/internal)
/mob/living/carbon/human/proc/get_limb_by_name(limb_name) //Look for a limb with the given limb name in the source mob, and return it if found.
- for(var/obj/item/organ/external/O in organs)
+ for(var/obj/item/organ/external/O in bodyparts)
if(limb_name == O.limb_name)
return O
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 66436d22b64..045e34ea41e 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -32,6 +32,14 @@ var/list/organ_cache = list()
var/sterile = 0 //can the organ be infected by germs?
var/tough = 0 //can organ be easily damaged?
+/obj/item/organ/Destroy()
+ processing_objects.Remove(src)
+ if(owner)
+ remove(owner, 1)
+ QDEL_LIST_ASSOC_VAL(autopsy_data)
+ QDEL_NULL(dna)
+ return ..()
+
/obj/item/organ/proc/update_health()
return
@@ -66,7 +74,7 @@ var/list/organ_cache = list()
blood_DNA = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
-/obj/item/organ/proc/die()
+/obj/item/organ/proc/necrotize(update_sprite=TRUE)
if(status & ORGAN_ROBOT)
return
damage = max_damage
@@ -105,10 +113,10 @@ var/list/organ_cache = list()
if(germ_level >= INFECTION_LEVEL_TWO)
germ_level += rand(2,6)
if(germ_level >= INFECTION_LEVEL_THREE)
- die()
+ necrotize()
if(damage >= max_damage)
- die()
+ necrotize()
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
//** Handle antibiotics and curing infections
@@ -117,7 +125,7 @@ var/list/organ_cache = list()
//check if we've hit max_damage
if(damage >= max_damage)
- die()
+ necrotize()
/obj/item/organ/proc/is_preserved()
if(istype(loc,/obj/item/device/mmi))
@@ -228,10 +236,10 @@ var/list/organ_cache = list()
/obj/item/organ/proc/take_damage(amount, var/silent=0)
if(tough)
return
- if(src.status & ORGAN_ROBOT)
- src.damage = between(0, src.damage + (amount * 0.8), max_damage)
+ if(status & ORGAN_ROBOT)
+ damage = between(0, damage + (amount * 0.8), max_damage)
else
- src.damage = between(0, src.damage + amount, max_damage)
+ damage = between(0, damage + amount, max_damage)
//only show this if the organ is not robotic
if(owner && parent_organ && amount > 0)
@@ -241,18 +249,18 @@ var/list/organ_cache = list()
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
- src.status &= ~ORGAN_BROKEN
- src.status &= ~ORGAN_BLEEDING
- src.status &= ~ORGAN_SPLINTED
- src.status &= ~ORGAN_CUT_AWAY
- src.status &= ~ORGAN_ATTACHABLE
- src.status &= ~ORGAN_DESTROYED
- src.status |= ORGAN_ROBOT
- src.status |= ORGAN_ASSISTED
+ status &= ~ORGAN_BROKEN
+ status &= ~ORGAN_BLEEDING
+ status &= ~ORGAN_SPLINTED
+ status &= ~ORGAN_CUT_AWAY
+ status &= ~ORGAN_ATTACHABLE
+ status &= ~ORGAN_DESTROYED
+ status |= ORGAN_ROBOT
+ status |= ORGAN_ASSISTED
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
- robotize()
- src.status &= ~ORGAN_ROBOT
+ robotize(1) //Skip the icon/name setting that occurs in robotize to avoid having to reset the icon file.
+ status &= ~ORGAN_ROBOT
robotic = 1
min_bruised_damage = 15
min_broken_damage = 35
@@ -286,7 +294,7 @@ var/list/organ_cache = list()
/obj/item/organ/internal/heart/emp_act(intensity)
if(owner && robotic == 2)
- owner.heart_attack = 1
+ Stop() // In the name of looooove~!
owner.visible_message("[owner] clutches their chest and gasps! ","You clutch your chest in pain! ")
else if(owner && robotic == 1)
take_damage(11,1)
@@ -309,25 +317,15 @@ var/list/organ_cache = list()
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
if(user)
- user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)]) "
- owner.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)]) "
+ user.create_attack_log(" removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)]) ")
+ owner.create_attack_log(" had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)]) ")
msg_admin_attack("[key_name_admin(user)] removed a vital organ ([src]) from [key_name_admin(owner)]")
owner.death()
owner = null
return src
-/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
-
- if(!istype(target)) return
-
- owner = target
- processing_objects -= src
- affected.internal_organs |= src
- if(!target.get_int_organ(src))
- target.internal_organs += src
- src.loc = target
- if(robotic)
- status |= ORGAN_ROBOT
+/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target)
+ return // Nothing uses this, it is always overridden
/obj/item/organ/proc/surgeryize()
@@ -372,4 +370,4 @@ I use this so that this can be made better once the organ overhaul rolls out --
// The only thing the official proc does is
//instantiate the list and call this proc
dna.deserialize(data["dna"])
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index ce4b55efb11..151636a9a50 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -18,6 +18,9 @@
var/model
var/force_icon
+ var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
+ var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
+
var/damage_state = "00"
var/brute_dam = 0
var/burn_dam = 0
@@ -47,7 +50,7 @@
// Internal organs of this body part
var/list/internal_organs = list()
- var/damage_msg = "\red You feel an intense pain"
+ var/damage_msg = "You feel an intense pain "
var/broken_description
var/open = 0
@@ -65,10 +68,25 @@
var/can_stand
var/wound_cleanup_timer
+/obj/item/organ/external/necrotize(update_sprite=TRUE)
+ if(status & (ORGAN_ROBOT|ORGAN_DEAD))
+ return
+ status |= ORGAN_DEAD
+ if(dead_icon)
+ icon_state = dead_icon
+ if(owner)
+ to_chat(owner, "You can't feel your [name] anymore... ")
+ owner.update_body(update_sprite)
+ owner.bad_external_organs |= src
+ if(vital)
+ owner.death()
+
/obj/item/organ/external/Destroy()
if(parent && parent.children)
parent.children -= src
+ parent = null
+
if(internal_organs)
for(var/obj/item/organ/internal/O in internal_organs)
internal_organs -= O
@@ -76,42 +94,46 @@
qdel(O)
if(owner)
- owner.organs_by_name[limb_name] = null
+ owner.bodyparts_by_name[limb_name] = null
- if(children)
- for(var/obj/item/organ/external/C in children)
- qdel(C)
+ QDEL_LIST(children)
if(wound_cleanup_timer)
deltimer(wound_cleanup_timer)
wound_cleanup_timer = null
+ QDEL_LIST(wounds)
+
+ QDEL_LIST(implants)
+
+ QDEL_NULL(hidden)
+
return ..()
/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/user as mob)
switch(open)
if(0)
if(istype(W,/obj/item/weapon/scalpel))
- spread_germs_to_organ(src,user)
+ spread_germs_to_organ(src,user, W)
user.visible_message("[user] cuts [src] open with [W]! ")
open++
return
if(1)
if(istype(W,/obj/item/weapon/retractor))
- spread_germs_to_organ(src,user)
+ spread_germs_to_organ(src,user, W)
user.visible_message("[user] cracks [src] open like an egg with [W]! ")
open++
return
if(2)
if(istype(W,/obj/item/weapon/hemostat))
- spread_germs_to_organ(src,user)
+ spread_germs_to_organ(src,user, W)
if(contents.len)
var/obj/item/removing = pick(contents)
var/obj/item/organ/internal/O = removing
if(istype(O))
O.status |= ORGAN_CUT_AWAY
if(!O.sterile)
- spread_germs_to_organ(O,user) // This wouldn't be any cleaner than the actual surgery
+ spread_germs_to_organ(O,user, W) // This wouldn't be any cleaner than the actual surgery
user.put_in_hands(removing)
user.visible_message("[user] extracts [removing] from [src] with [W]! ")
else
@@ -127,9 +149,12 @@
/obj/item/organ/external/New(var/mob/living/carbon/holder)
..()
- if(istype(holder, /mob/living/carbon/human))
- replaced(holder)
- sync_colour_to_human(holder)
+ var/mob/living/carbon/human/H = holder
+ icobase = species.icobase
+ deform = species.deform
+ if(istype(H))
+ replaced(H)
+ sync_colour_to_human(H)
spawn(1)
get_icon()
@@ -138,15 +163,15 @@
status = status & ~ORGAN_DESTROYED
forceMove(owner)
if(istype(owner))
- if(!isnull(owner.organs_by_name[limb_name]))
+ if(!isnull(owner.bodyparts_by_name[limb_name]))
log_debug("Duplicate organ in slot \"[limb_name]\", mob '[target]'")
- owner.organs_by_name[limb_name] = src
- owner.organs |= src
+ owner.bodyparts_by_name[limb_name] = src
+ owner.bodyparts |= src
for(var/atom/movable/stuff in src)
stuff.attempt_become_organ(src, owner)
if(parent_organ)
- parent = owner.organs_by_name[src.parent_organ]
+ parent = owner.bodyparts_by_name[src.parent_organ]
if(parent)
if(!parent.children)
parent.children = list()
@@ -535,10 +560,7 @@ Note that amputating the affected organ does in fact remove the infection from t
parent.germ_level++
if(germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30) //overdosing is necessary to stop severe infections
- if(!(status & ORGAN_DEAD))
- status |= ORGAN_DEAD
- to_chat(owner, "You can't feel your [name] anymore... ")
- owner.update_body(1)
+ necrotize()
germ_level++
owner.adjustToxLoss(1)
@@ -710,7 +732,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(status & ORGAN_ROBOT)
stump.robotize()
stump.wounds |= W
- victim.organs |= stump
+ victim.bodyparts |= stump
stump.update_damages()
parent = null
@@ -802,7 +824,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return
if(owner)
owner.visible_message(\
- "\red You hear a loud cracking sound coming from \the [owner].",\
+ "You hear a loud cracking sound coming from \the [owner]. ",\
"Something feels like it shattered in your [name]! ",\
"You hear a sickening crack.")
if(owner.species && !(owner.species.flags & NO_PAIN))
@@ -930,9 +952,9 @@ Note that amputating the affected organ does in fact remove the infection from t
thing.forceMove(src)
release_restraints(victim)
- victim.organs -= src
+ victim.bodyparts -= src
if(is_primary_organ(victim))
- victim.organs_by_name[limb_name] = null // Remove from owner's vars.
+ victim.bodyparts_by_name[limb_name] = null // Remove from owner's vars.
//Robotic limbs explode if sabotaged.
if(is_robotic && sabotaged)
@@ -954,13 +976,13 @@ Note that amputating the affected organ does in fact remove the infection from t
return
if(owner)
if(type == "brute")
- owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s [name].", \
+ owner.visible_message("You hear a sickening cracking sound coming from \the [owner]'s [name]. ", \
"Your [name] becomes a mangled mess! ", \
- "\red You hear a sickening crack.")
+ "You hear a sickening crack. ")
else
- owner.visible_message("\red \The [owner]'s [name] melts away, turning into mangled mess!", \
+ owner.visible_message("\The [owner]'s [name] melts away, turning into mangled mess! ", \
"Your [name] melts away! ", \
- "\red You hear a sickening sizzle.")
+ "You hear a sickening sizzle. ")
disfigured = 1
/obj/item/organ/external/is_primary_organ(var/mob/living/carbon/human/O = null)
@@ -968,7 +990,7 @@ Note that amputating the affected organ does in fact remove the infection from t
O = owner
if(!istype(O)) // You're not the primary organ of ANYTHING, bucko
return 0
- return src == O.organs_by_name[limb_name]
+ return src == O.bodyparts_by_name[limb_name]
// The callback we use to remove wounds from an un-processed limb
/obj/item/organ/external/proc/cleanup_wounds(var/list/slated_wounds)
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index 03690ef3279..6c2c9a89c08 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -14,6 +14,16 @@ var/global/list/limb_icon_cache = list()
overlays += organ.mob_icon
child_icons += organ.mob_icon
+/obj/item/organ/external/proc/change_organ_icobase(var/new_icobase, var/new_deform, var/owner_sensitive) //Change the icobase/deform of this organ. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs.
+ if(owner_sensitive) //This and the below statements mean that the icobase/deform will only get updated if the limb is the same species as and is owned by the mob it's attached to.
+ if(species && owner.species && species.name != owner.species.name)
+ return
+ if(dna.unique_enzymes != owner.dna.unique_enzymes) // This isn't MY arm
+ return
+
+ icobase = new_icobase ? new_icobase : icobase
+ deform = new_deform ? new_deform : deform
+
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/H)
if(status & ORGAN_ROBOT && !(species && species.name == "Machine")) //machine people get skin color
return
@@ -29,6 +39,9 @@ var/global/list/limb_icon_cache = list()
if(H.species.bodyflags & HAS_SKIN_COLOR)
s_tone = null
s_col = list(H.r_skin, H.g_skin, H.b_skin)
+ if(H.species.bodyflags & HAS_ICON_SKIN_TONE)
+ var/obj/item/organ/external/chest/C = H.get_organ("chest")
+ change_organ_icobase(C.icobase, C.deform)
/obj/item/organ/external/proc/sync_colour_to_dna()
if(status & ORGAN_ROBOT)
@@ -42,7 +55,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/H)
..()
- var/obj/item/organ/internal/eyes/eyes = owner.get_int_organ(/obj/item/organ/internal/eyes)//owner.internal_organs_by_name["eyes"]
+ var/obj/item/organ/internal/eyes/eyes = owner.get_int_organ(/obj/item/organ/internal/eyes)//owner.internal_bodyparts_by_name["eyes"]
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/remove()
@@ -171,10 +184,10 @@ var/global/list/limb_icon_cache = list()
icon_file = 'icons/mob/human_races/robotic.dmi'
else
if(status & ORGAN_MUTATED)
- icon_file = species.deform
+ icon_file = deform
else
// Congratulations, you are normal
- icon_file = species.icobase
+ icon_file = icobase
return list(icon_file, new_icon_state)
/obj/item/organ/external/chest/get_icon_state(skeletal)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 5dd4d570ee2..d09fc88208e 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -3,7 +3,7 @@
/obj/item/organ/internal
origin_tech = "biotech=2"
force = 1
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 0
var/zone = "chest"
var/slot
@@ -11,14 +11,9 @@
var/non_primary = 0
/obj/item/organ/internal/New(var/mob/living/carbon/holder)
+ ..()
if(istype(holder))
insert(holder)
- ..()
-
-/obj/item/organ/internal/Destroy()
- if(owner)
- remove(owner, 1)
- return ..()
/obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0, var/dont_remove_slot = 0)
if(!iscarbon(M) || owner == M)
@@ -42,7 +37,7 @@
log_runtime(EXCEPTION("[src] attempted to insert into a [parent_organ], but [parent_organ] wasn't an organ! [atom_loc_line(M)]"), src)
else
parent.internal_organs |= src
- //M.internal_organs_by_name[src] |= src(H,1)
+ //M.internal_bodyparts_by_name[src] |= src(H,1)
loc = null
for(var/X in actions)
var/datum/action/A = X
@@ -74,9 +69,8 @@
A.Remove(M)
return src
-/obj/item/organ/internal/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
+/obj/item/organ/internal/replaced(var/mob/living/carbon/human/target)
insert(target)
- ..()
/obj/item/organ/internal/item_action_slot_check(slot, mob/user)
return
@@ -87,6 +81,10 @@
/obj/item/organ/internal/proc/on_life()
return
+//abstract proc called by carbon/death()
+/obj/item/organ/internal/proc/on_owner_death()
+ return
+
/obj/item/organ/internal/proc/prepare_eat()
if(status == ORGAN_ROBOT)
return //no eating cybernetic implants!
@@ -116,12 +114,6 @@
reagents.add_reagent("nutriment", 5)
-
-/obj/item/organ/internal/Destroy()
- if(owner)
- remove(owner, 1)
- return ..()
-
/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
if(M == user && ishuman(user))
var/mob/living/carbon/human/H = user
@@ -162,11 +154,9 @@
. = ..()
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.stat == DEAD || H.heart_attack)
+ if(H.stat == DEAD)
Stop()
return
- if(!special)
- H.heart_attack = 1
spawn(120)
if(!owner)
@@ -180,15 +170,6 @@
if(!owner)
Stop()
-
-/obj/item/organ/internal/heart/insert(mob/living/carbon/M, special = 0)
- ..()
- if(ishuman(M) && beating)
- var/mob/living/carbon/human/H = M
- if(H.heart_attack)
- H.heart_attack = 0
- return
-
/obj/item/organ/internal/heart/proc/Stop()
beating = 0
update_icon()
@@ -201,7 +182,7 @@
/obj/item/organ/internal/heart/prepare_eat()
var/obj/S = ..()
- S.icon_state = "heart-off"
+ S.icon_state = dead_icon
return S
/obj/item/organ/internal/heart/cursed
@@ -292,21 +273,18 @@
// . = ..()
-/obj/item/organ/internal/lungs/process()
+/obj/item/organ/internal/lungs/on_life()
..()
-
- if(!owner)
- return
if(germ_level > INFECTION_LEVEL_ONE)
if(prob(5))
owner.emote("cough") //respitory tract infection
if(is_bruised())
if(prob(2))
- spawn owner.custom_emote(1, "coughs up blood!")
+ owner.custom_emote(1, "coughs up blood!")
owner.drip(10)
if(prob(4))
- spawn owner.custom_emote(1, "gasps for air!")
+ owner.custom_emote(1, "gasps for air!")
owner.AdjustLoseBreath(5)
/obj/item/organ/internal/kidneys
@@ -317,13 +295,8 @@
parent_organ = "groin"
slot = "kidneys"
-/obj/item/organ/internal/kidneys/process()
-
+/obj/item/organ/internal/kidneys/on_life()
..()
-
- if(!owner)
- return
-
// Coffee is really bad for you with busted kidneys.
// This should probably be expanded in some way, but fucked if I know
// what else kidneys can process in our reagent list.
@@ -343,16 +316,47 @@
parent_organ = "head"
slot = "eyes"
var/list/eye_colour = list(0,0,0)
+ var/list/colourmatrix = null
+ var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white.
+ var/colourblind_darkview = null
+ var/dependent_disabilities = null //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation.
+ var/dark_view = 2 //Default dark_view for Humans.
+ var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will.
/obj/item/organ/internal/eyes/proc/update_colour()
dna.write_eyes_attributes(src)
-/obj/item/organ/internal/eyes/insert(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/eyes/proc/get_colourmatrix() //Returns a special colour matrix if the eyes are organic and the mob is colourblind, otherwise it uses the current one.
+ if(!robotic && owner.disabilities & COLOURBLIND)
+ return colourblind_matrix
+ else
+ return colourmatrix
+
+/obj/item/organ/internal/eyes/proc/get_dark_view() //Returns dark_view (if the eyes are organic) for see_invisible handling in species.dm to be autoprocessed by life().
+ if(!robotic && colourblind_darkview && owner.disabilities & COLOURBLIND) //Returns special darkview value if colourblind and it exists, otherwise reuse current.
+ return colourblind_darkview
+ else
+ return dark_view
+
+/obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0)
..()
if(istype(M) && eye_colour)
- var/mob/living/carbon/human/H = M
- // Apply our eye colour to the target.
- H.update_body()
+ M.update_body() //Apply our eye colour to the target.
+
+ if(!(M.disabilities & COLOURBLIND) && (dependent_disabilities & COLOURBLIND)) //If the eyes are colourblind and we're not, carry over the gene.
+ dependent_disabilities &= ~COLOURBLIND
+ M.dna.SetSEState(COLOURBLINDBLOCK,1)
+ genemutcheck(M,COLOURBLINDBLOCK,null,MUTCHK_FORCED)
+ else
+ M.update_client_colour() //If we're here, that means the mob acquired the colourblindness gene while they didn't have eyes. Better handle it.
+
+/obj/item/organ/internal/eyes/remove(mob/living/carbon/human/M, special = 0)
+ if(!special && (M.disabilities & COLOURBLIND)) //If special is set, that means these eyes are getting deleted (i.e. during set_species())
+ if(!(dependent_disabilities & COLOURBLIND)) //We only want to change COLOURBLINDBLOCK and such it the eyes are being surgically removed.
+ dependent_disabilities |= COLOURBLIND
+ M.dna.SetSEState(COLOURBLINDBLOCK,0)
+ genemutcheck(M,COLOURBLINDBLOCK,null,MUTCHK_FORCED)
+ . = ..()
/obj/item/organ/internal/eyes/surgeryize()
if(!owner)
@@ -362,6 +366,39 @@
owner.SetEyeBlurry(0)
owner.SetEyeBlind(0)
+/obj/item/organ/internal/robotize(var/icon_bypass) //If icon bypass isn't null, skip the processing here and go straight to the parent call.
+ if(!icon_bypass && !(status & ORGAN_ROBOT)) //Don't override the icons for the already-mechanical IPC organs.
+ var/list/states = icon_states('icons/obj/surgery.dmi') //Insensitive to specially-defined icon files for species like the Drask or whomever else. Everyone gets the same robotic heart.
+ if(slot == "heart" && ("[slot]-prosthetic-on" in states) && ("[slot]-prosthetic-off" in states)) //Give the robotic heart its robotic heart icons if they exist.
+ var/obj/item/organ/internal/heart/H = src
+ H.icon = icon('icons/obj/surgery.dmi')
+ H.icon_base = "[slot]-prosthetic"
+ H.dead_icon = "[slot]-prosthetic-off"
+ H.update_icon()
+ else if("[slot]-prosthetic" in states) //Give the robotic organ its robotic organ icons if they exist.
+ icon = icon('icons/obj/surgery.dmi')
+ icon_state = "[slot]-prosthetic"
+ name = "mechanical [slot]"
+ ..() //Go apply all the organ flags/robotic statuses.
+
+/obj/item/organ/internal/eyes/robotize()
+ colourmatrix = null
+ dark_view = 2
+ ..() //Make sure the organ's got the robotic status indicators before updating the client colour.
+ if(owner)
+ owner.update_client_colour(0) //Since both mechassisted and mechanical eyes give dark_view of 2 and full colour vision atm, just having this here is fine as mechassist() will call it anyway.
+
+/obj/item/organ/internal/mechassist()
+ ..() //Go back, call robotize(), adjust the robotic status indicators and the organ damage parameters.
+ var/list/states = icon_states(icon) //Sensitive to specially-defined icon files since the organs are not fully synthetic.
+ if(slot == "heart" && ("[organ_tag]-assisted-on" in states) && ("[organ_tag]-assisted-off" in states)) //Give the mechassisted heart its mechassisted heart icons if they exist.
+ var/obj/item/organ/internal/heart/H = src
+ H.icon_base = "[organ_tag]-assisted"
+ H.dead_icon = "[organ_tag]-assisted-off"
+ H.update_icon()
+ else if("[organ_tag]-assisted" in states) //Give the mechassisted organ its mechassisted organ icons if they exist.
+ icon_state = "[organ_tag]-assisted"
+ name = "mechanically assisted [initial(name)]" //Avoid setting the organ's name to something like "mechanically assisted mechanical eyes".
/obj/item/organ/internal/liver
name = "liver"
@@ -371,13 +408,8 @@
slot = "liver"
var/alcohol_intensity = 1
-/obj/item/organ/internal/liver/process()
-
+/obj/item/organ/internal/liver/on_life()
..()
-
- if(!owner)
- return
-
if(germ_level > INFECTION_LEVEL_ONE)
if(prob(1))
to_chat(owner, " Your skin itches. ")
@@ -456,7 +488,7 @@
desc = "A tiny black mass with red tendrils trailing from it. It seems to shrivel in the light."
icon_state = "blacktumor"
origin_tech = "biotech=4"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
parent_organ = "head"
slot = "brain_tumor"
health = 3
@@ -488,7 +520,7 @@
desc = "A tiny yellow mass shaped like..a banana?"
icon_state = "honktumor"
origin_tech = "biotech=1"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
parent_organ = "head"
slot = "brain_tumor"
health = 3
@@ -526,7 +558,7 @@
/obj/item/organ/internal/honktumor/process()
if(isturf(loc))
visible_message("[src] honks in on itself! ")
- new /obj/item/weapon/bananapeel(get_turf(loc))
+ new /obj/item/weapon/grown/bananapeel(get_turf(loc))
qdel(src)
@@ -575,7 +607,7 @@
desc = "Let they who is worthy wear the beard of Thorbjorndottir."
icon_state = "liver"
origin_tech = "biotech=1"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
parent_organ = "head"
slot = "hair_organ"
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index f0b4b912eaf..67655e17102 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -55,7 +55,7 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
return
var/msg = "[message] "
if(flash_strength >= 1)
- msg = "\red [message] "
+ msg = "[message] "
// Anti message spam checks
if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time)))
@@ -92,7 +92,7 @@ mob/living/carbon/human/proc/handle_pain()
return
var/maxdam = 0
var/obj/item/organ/external/damaged_organ = null
- for(var/obj/item/organ/external/E in organs)
+ for(var/obj/item/organ/external/E in bodyparts)
if(E.status & ORGAN_DEAD|ORGAN_ROBOT) continue
var/dam = E.get_damage()
// make the choice of the organ depend on damage,
diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm
index 61e72743464..0adca48bfd0 100644
--- a/code/modules/surgery/organs/parasites.dm
+++ b/code/modules/surgery/organs/parasites.dm
@@ -1,3 +1,6 @@
+
+// Traitor-only space spider eggs
+
/obj/item/organ/internal/body_egg/spider_eggs
name = "spider eggs"
icon = 'icons/effects/effects.dmi'
@@ -25,7 +28,7 @@
owner.emote("scream")
var/spiders = rand(3,5)
for(var/i in 1 to spiders)
- new/obj/effect/spider/spiderling(get_turf(owner))
+ new/obj/structure/spider/spiderling(get_turf(owner))
owner.visible_message("[owner] bursts open! Holy fuck! ")
owner.gib()
@@ -34,3 +37,82 @@
M.reagents.del_reagent("spidereggs") //purge all remaining spider eggs reagent if caught, in time.
qdel(src) //We don't want people re-implanting these for near instant gibbings.
return null
+
+
+
+// Terror Spiders - white spider infection
+
+/obj/item/organ/internal/body_egg/terror_eggs
+ name = "terror eggs"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "eggs"
+ var/current_cycle = 0
+ var/awaymission_infection = 0
+ var/alternate_ending = 0
+
+/obj/item/organ/internal/body_egg/terror_eggs/on_life()
+ current_cycle += 1
+ if(owner.health < -25)
+ to_chat(owner,"You feel a strange, blissful senstation. ")
+ owner.adjustBruteLoss(-5)
+ owner.adjustFireLoss(-5)
+ owner.adjustToxLoss(-5)
+ // the spider eggs secrete stimulants to keep their host alive until they hatch
+ switch(current_cycle)
+ if(1) // immediately
+ to_chat(owner,"Your wound hurts horribly! ")
+ if(is_away_level(owner.z))
+ awaymission_infection = 1
+ if(15) // 30s... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin
+ to_chat(owner,"The pain has faded, and stopped bleeding, though the skin around it has turned black. ")
+ owner.adjustBruteLoss(-10)
+ if(30) // 1m... the point where the venom uses and accellerates the healing process, to feed the eggs
+ to_chat(owner,"Your bite wound has completely sealed up, though the skin is still black. You feel significantly better. ")
+ owner.adjustBruteLoss(-20)
+ if(90) // 3m... where the eggs are developing, and the wound is turning into a hatching site, but invisibly
+ to_chat(owner,"The black flesh around your old spider bite wound has started to peel off. ")
+ if(100) // 3m20s... where the victim realizes something is wrong - this is not a normal wound
+ to_chat(owner,"The black flesh around your spider bite wound has cracked, and started to split open! ")
+ if(110) // 3m40s...
+ to_chat(owner,"The black flesh splits open completely, revealing a cluster of small black oval shapes inside you, shapes that seem to be moving! ")
+ if(120) // 4m...
+ if(awaymission_infection && !is_away_level(owner.z))
+ // we started in the awaymission, we ended on the station.
+ // To prevent someone bringing an infection back, we're going to trigger an alternate, equally-bad result here.
+ // Actually, let's make it slightly worse... just to discourage people from bringing back infections.
+ alternate_ending = 1
+ to_chat(owner,"The shapes extend tendrils out of your wound... no... those are legs! SPIDER LEGS! You have spiderlings growing inside you! You scratch at the wound, but it just aggrivates them - they swarm out of the wound, biting you all over! ")
+ owner.visible_message("[owner] flails around on the floor as spiderlings erupt from their skin and swarm all over them! ")
+ owner.Stun(20)
+ owner.Weaken(20)
+ // yes, this is a long stun - that's intentional. Gotta give the spiderlings time to escape.
+ var/obj/structure/spider/spiderling/terror_spiderling/S1 = new(get_turf(owner))
+ S1.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red
+ S1.name = "red spiderling"
+ if(prob(50))
+ S1.stillborn = 1
+ var/obj/structure/spider/spiderling/terror_spiderling/S2 = new(get_turf(owner))
+ S2.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/gray
+ S2.name = "gray spiderling"
+ if(prob(50))
+ S2.stillborn = 1
+ var/obj/structure/spider/spiderling/terror_spiderling/S3 = new(get_turf(owner))
+ S3.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/green
+ S3.name = "green spiderling"
+ if(prob(50))
+ S3.stillborn = 1
+ if(alternate_ending)
+ S1.stillborn = 1
+ S2.stillborn = 1
+ S3.stillborn = 1
+ owner.gib()
+ else
+ owner.adjustToxLoss(rand(100,180)) // normal case, range: 100-180, average 140, almost crit (150).
+ if(130) // 4m 20s
+ to_chat(owner,"The spiderlings are gone. Your wound, though, looks worse than ever. Remnants of tiny spider eggs, and dead spiders, inside your flesh. Disgusting. ")
+ qdel(src)
+
+/obj/item/organ/internal/body_egg/terror_eggs/remove(var/mob/living/carbon/M, var/special = 0)
+ ..()
+ qdel(src) // prevent people re-implanting them into others
+ return null
diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm
index c3d7f1c3828..2d31942059c 100644
--- a/code/modules/surgery/organs/robolimbs.dm
+++ b/code/modules/surgery/organs/robolimbs.dm
@@ -119,4 +119,23 @@ var/global/datum/robolimb/basic_robolimb
company = "Zeng-Hu Pharmaceuticals"
desc = "This limb has a rubbery fleshtone covering with visible seams."
icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi'
- has_subtypes = 2
\ No newline at end of file
+ has_subtypes = 2
+
+/datum/robolimb/shellguard
+ company = "Shellguard Munitions Standard Series"
+ desc = "This limb features exposed robust steel and paint to match Shellguards motifs"
+ icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_main.dmi'
+ has_subtypes = 1
+
+/datum/robolimb/shellguard/alt1
+ company = "Shellguard Munitions Elite Series"
+ icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_alt1.dmi'
+ parts = list("head")
+ has_subtypes = null
+
+/datum/robolimb/shellguard/monitor
+ company = "Shellguard Munitions Monitor Series"
+ icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_monitor.dmi'
+ parts = list("head")
+ is_monitor = 1
+ has_subtypes = null
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/abductor.dm b/code/modules/surgery/organs/subtypes/abductor.dm
new file mode 100644
index 00000000000..6fd234bc501
--- /dev/null
+++ b/code/modules/surgery/organs/subtypes/abductor.dm
@@ -0,0 +1,4 @@
+/obj/item/organ/internal/eyes/abductor
+ name = "abductor eyeballs"
+ dark_view = 3
+ species = "Abductor"
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index a4b0d8fb92b..951ca862317 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -1,22 +1,3 @@
-/*/proc/spawn_diona_nymph_from_organ(var/obj/item/organ/organ)
- if(!istype(organ))
- return 0
-
- //This is a terrible hack and I should be ashamed.
- var/datum/seed/diona = plant_controller.seeds["diona"]
- if(!diona)
- return 0
-
- spawn(1) // So it has time to be thrown about by the gib() proc.
- var/mob/living/simple_animal/diona/D = new(get_turf(organ))
- var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
- P.request_player(D, "A diona nymph has split off from its gestalt. ")
- spawn(60)
- if(D)
- if(!D.ckey || !D.client)
- D.death()
- return 1 */
-
/obj/item/organ/external/chest/diona
name = "core trunk"
max_damage = 200
@@ -108,7 +89,7 @@
/* /obj/item/organ/external/diona/removed()
var/mob/living/carbon/human/H = owner
..()
- if(!istype(H) || !H.organs || !H.organs.len)
+ if(!istype(H) || !H.bodyparts || !H.bodyparts.len)
H.death()
if(prob(50) && spawn_diona_nymph_from_organ(src))
qdel(src) */
@@ -116,74 +97,42 @@
/obj/item/organ/diona/process()
return
-/obj/item/organ/internal/heart/diona
+/obj/item/organ/internal/heart/diona // Turns into a nymph instantly, no transplanting possible.
name = "neural strata"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "heart" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- parent_organ = "chest"
- slot = "heart"
species = "Diona"
-/obj/item/organ/internal/brain/diona
+/obj/item/organ/internal/brain/diona // Turns into a nymph instantly, no transplanting possible.
name = "gas bladder"
- parent_organ = "head"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "brain" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- slot = "brain"
species = "Diona"
-/obj/item/organ/internal/kidneys/diona
+/obj/item/organ/internal/kidneys/diona // Turns into a nymph instantly, no transplanting possible.
name = "polyp segment"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "kidneys" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- parent_organ = "groin"
- slot = "kidneys"
species = "Diona"
-/obj/item/organ/internal/appendix/diona
+/obj/item/organ/internal/appendix/diona // Turns into a nymph instantly, no transplanting possible.
name = "anchoring ligament"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- organ_tag = "appendix" // Turns into a nymph instantly, no transplanting possible.
- origin_tech = "biotech=3"
- parent_organ = "groin"
- slot = "appendix"
species = "Diona"
-/obj/item/organ/internal/diona_receptor
+/obj/item/organ/internal/eyes/diona // Turns into a nymph instantly, no transplanting possible.
name = "receptor node"
- organ_tag = "eyes"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- origin_tech = "biotech=3"
- parent_organ = "head"
- slot = "eyes"
species = "Diona"
-/obj/item/organ/internal/diona_receptor/surgeryize()
- if(!owner)
- return
- owner.CureNearsighted()
- owner.CureBlind()
- owner.SetEyeBlurry(0)
- owner.SetEyeBlind(0)
-
-
//TODO:Make absorb rads on insert
-/obj/item/organ/internal/liver/diona
+/obj/item/organ/internal/liver/diona // Turns into a nymph instantly, no transplanting possible.
name = "nutrient vessel"
- parent_organ = "chest"
- organ_tag = "liver"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- slot = "liver"
alcohol_intensity = 0.5
species = "Diona"
@@ -192,7 +141,7 @@
/*/obj/item/organ/diona/removed(var/mob/living/user)
var/mob/living/carbon/human/H = owner
..()
- if(!istype(H) || !H.organs || !H.organs.len)
+ if(!istype(H) || !H.bodyparts || !H.bodyparts.len)
H.death()
if(prob(50) && spawn_diona_nymph_from_organ(src))
qdel(src) */
diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm
index b3b260a28a0..6e1e6662d0a 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -9,51 +9,29 @@
/obj/item/organ/internal/heart/drask
name = "drask heart"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "heart-on"
- dead_icon = "heart-off"
- organ_tag = "heart"
parent_organ = "head"
- slot = "heart"
species = "Drask"
/obj/item/organ/internal/lungs/drask
- name = "lungs"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "lungs"
- gender = PLURAL
- organ_tag = "lungs"
- parent_organ = "chest"
- slot = "lungs"
species = "Drask"
/obj/item/organ/internal/liver/drask
name = "metabolic strainer"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "kidneys"
- gender = PLURAL
- organ_tag = "kidneys"
- parent_organ = "groin"
- slot = "kidneys"
alcohol_intensity = 0.8
species = "Drask"
/obj/item/organ/internal/brain/drask
- name = "brain"
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "brain2"
- organ_tag = "brain"
- slot = "brain"
mmi_icon = 'icons/obj/surgery_drask.dmi'
mmi_icon_state = "mmi_full"
species = "Drask"
/obj/item/organ/internal/eyes/drask
- name = "eyes"
+ name = "drask eyeballs"
icon = 'icons/obj/surgery_drask.dmi'
- icon_state = "eyes"
- gender = PLURAL
- organ_tag = "eyes"
- parent_organ = "head"
- slot = "eyes"
desc = "Drask eyes. They look even stranger disembodied"
+ dark_view = 5
species = "Drask"
diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm
index a47ab801d6f..6c06da373b7 100644
--- a/code/modules/surgery/organs/subtypes/grey.dm
+++ b/code/modules/surgery/organs/subtypes/grey.dm
@@ -14,3 +14,8 @@
/obj/item/organ/internal/brain/grey/remove(var/mob/living/carbon/M, var/special = 0)
. = ..()
M.remove_language("Psionic Communication")
+
+/obj/item/organ/internal/eyes/grey
+ name = "grey eyeballs"
+ dark_view = 5
+ species = "Grey"
diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm
index 848c0bca737..37fd74a6d2a 100644
--- a/code/modules/surgery/organs/subtypes/kidan.dm
+++ b/code/modules/surgery/organs/subtypes/kidan.dm
@@ -1,3 +1,113 @@
/obj/item/organ/internal/liver/kidan
alcohol_intensity = 0.5
species = "Kidan"
+
+#define KIDAN_LANTERN_HUNGERCOST 0.5
+#define KIDAN_LANTERN_MINHUNGER 150
+#define KIDAN_LANTERN_LIGHT 4
+
+/obj/item/organ/internal/lantern
+ name = "Bioluminescent Lantern"
+ desc = "A specialized tissue that reacts with oxygen, nutriment and blood to produce light in Kidan."
+ icon_state = "kid_lantern"
+ origin_tech = "biotech=2"
+ w_class = WEIGHT_CLASS_TINY
+ parent_organ = "groin"
+ slot = "lantern"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
+ var/colour
+ var/glowing = 0
+
+/obj/item/organ/internal/lantern/ui_action_click()
+ if(toggle_biolum())
+ if(glowing)
+ owner.visible_message("[owner] starts to glow! ", "You enable your bioluminescence. ")
+ else
+ owner.visible_message("[owner] fades to dark. ", "You disable your bioluminescence. ")
+
+/obj/item/organ/internal/lantern/on_life()
+ ..()
+ if(glowing)//i hate this but i couldnt figure out a better way
+ if(owner.nutrition < KIDAN_LANTERN_MINHUNGER)
+ toggle_biolum(1)
+ to_chat(owner, "You're too hungry to be bioluminescent! ")
+ return
+
+ if(owner.stat)
+ toggle_biolum(1)
+ owner.visible_message("[owner] fades to dark. ")
+ return
+
+ owner.nutrition = max(owner.nutrition - KIDAN_LANTERN_HUNGERCOST, KIDAN_LANTERN_HUNGERCOST)
+
+ var/new_light = calculate_glow(KIDAN_LANTERN_LIGHT)
+
+ if(!colour) //this should never happen in theory
+ colour = BlendRGB(owner.m_colours["body"], owner.m_colours["head"], 0.65) //then again im pretty bad at theoretics
+
+ if(new_light != glowing)
+ var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ))
+ lbody.set_light(new_light,l_color = colour)
+ glowing = new_light
+
+ return
+
+/obj/item/organ/internal/lantern/on_owner_death()
+ if(glowing)
+ toggle_biolum(1)
+
+/obj/item/organ/internal/lantern/proc/toggle_biolum(statoverride)
+ if(!statoverride && owner.incapacitated())
+ to_chat(owner, "You cannot alter your bioluminescence in your current state. ")
+ return 0
+
+ if(!statoverride && owner.nutrition < KIDAN_LANTERN_MINHUNGER)
+ to_chat(owner, "You're too hungry to be bioluminescent! ")
+ return 0
+
+ if(!colour)
+ colour = BlendRGB(owner.m_colours["head"], owner.m_colours["body"], 0.65)
+
+ if(!glowing)
+ var/light = calculate_glow(KIDAN_LANTERN_LIGHT)
+ var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ))
+ lbody.set_light(light,l_color = colour)
+ glowing = light
+ return 1
+
+ else
+ var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ))
+ lbody.set_light(0)
+ glowing = 0
+ return 1
+
+/obj/item/organ/internal/lantern/proc/calculate_glow(light)
+ if(!light)
+ light = KIDAN_LANTERN_LIGHT //should never happen but just to prevent things from breaking
+
+ var/occlusion = 0 //clothes occluding light
+
+ if(!get_location_accessible(owner, "head"))
+ occlusion++
+ if(owner.w_uniform && copytext(owner.w_uniform.item_color,-2) != "_d") //jumpsuit not rolled down
+ occlusion++
+ if(owner.wear_suit)
+ occlusion++
+
+ return light - occlusion
+
+/obj/item/organ/internal/lantern/remove(mob/living/carbon/M, special = 0)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(!colour) //if its removed before used save the color
+ colour = BlendRGB(H.m_colours["body"], H.m_colours["head"], 0.65)
+
+ if(glowing)
+ toggle_biolum(1)
+
+ . = ..()
+
+#undef KIDAN_LANTERN_HUNGERCOST
+#undef KIDAN_LANTERN_MINHUNGER
+#undef KIDAN_LANTERN_LIGHT
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 0f402a42e5d..44d7a7f1315 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -117,37 +117,26 @@
robotize()
..()
-/obj/item/organ/internal/optical_sensor
+/obj/item/organ/internal/eyes/optical_sensor
name = "optical sensor"
- organ_tag = "eyes"
- parent_organ = "head"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
- slot = "eyes"
status = ORGAN_ROBOT
species = "Machine"
// dead_icon = "camera_broken"
+ weld_proof = 1
-/obj/item/organ/internal/optical_sensor/New()
+/obj/item/organ/internal/eyes/optical_sensor/New()
robotize()
..()
-/obj/item/organ/internal/optical_sensor/remove(var/mob/living/user,special = 0)
+/obj/item/organ/internal/eyes/optical_sensor/remove(var/mob/living/user,special = 0)
if(!special)
to_chat(owner, "Error 404:Optical Sensors not found.")
. = ..()
-/obj/item/organ/internal/optical_sensor/surgeryize()
- if(!owner)
- return
- owner.CureNearsighted()
- owner.CureBlind()
- owner.SetEyeBlurry(0)
- owner.SetEyeBlind(0)
-
-
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/internal/brain/mmi_holder
name = "brain"
@@ -160,10 +149,8 @@
species = "Machine"
var/obj/item/device/mmi/stored_mmi
-
/obj/item/organ/internal/brain/mmi_holder/Destroy()
- if(stored_mmi)
- qdel(stored_mmi)
+ QDEL_NULL(stored_mmi)
return ..()
/obj/item/organ/internal/brain/mmi_holder/insert(var/mob/living/target,special = 0)
diff --git a/code/modules/surgery/organs/subtypes/misc.dm b/code/modules/surgery/organs/subtypes/misc.dm
deleted file mode 100644
index be76fa907dc..00000000000
--- a/code/modules/surgery/organs/subtypes/misc.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-//CORTICAL BORER ORGANS.
-/obj/item/organ/internal/borer
- name = "cortical borer"
- icon = 'icons/obj/objects.dmi'
- icon_state = "borer"
- parent_organ = "head"
- organ_tag = "brain"
- slot = "borer"
- vital = 1
-
-/obj/item/organ/internal/borer/process()
-
- // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
- for(var/chem in list("saline", "sailcylic", "meth", "mannitol"))
- if(owner.reagents.get_reagent_amount(chem) < 3)
- owner.reagents.add_reagent(chem, 5)
-
- // They're also super gross and ooze ichor.
- if(prob(5))
- var/mob/living/carbon/human/H = owner
- if(!istype(H))
- return
-
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
- blood_splatter(H,B,1)
- var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
- if(goo)
- goo.name = "husk ichor"
- goo.desc = "It's thick and stinks of decay."
- goo.basecolor = "#412464"
- goo.update_icon()
-
-/obj/item/organ/internal/borer/remove(var/mob/living/user)
-
- ..()
-
- var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
- if(B)
- B.leave_host()
- B.ckey = owner.ckey
-
- spawn(0)
- qdel(src)
- return null
-
-//VOX ORGANS.
-/obj/item/organ/internal/stack
- name = "cortical stack"
- icon_state = "brain-prosthetic"
- parent_organ = "head"
- organ_tag = "stack"
- slot = "vox_stack"
- robotic = 2
- vital = 1
- var/backup_time = 0
- var/datum/mind/backup
-
-/obj/item/organ/internal/stack/process()
- if(owner && owner.stat != 2 && !is_broken())
- backup_time = world.time
- if(owner.mind) backup = owner.mind
-
-/obj/item/organ/internal/stack/vox
- name = "vox cortical stack"
-
-/obj/item/organ/internal/stack/vox/stack
diff --git a/code/modules/surgery/organs/subtypes/nucleation.dm b/code/modules/surgery/organs/subtypes/nucleation.dm
index d234b666ae3..4223834501d 100644
--- a/code/modules/surgery/organs/subtypes/nucleation.dm
+++ b/code/modules/surgery/organs/subtypes/nucleation.dm
@@ -26,8 +26,6 @@
icon_state = "crystal-eyes"
organ_tag = "luminescent eyes"
light_color = "#1C1C00"
- parent_organ = "head"
- slot = "eyes"
species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal/New()
@@ -35,8 +33,7 @@
..()
/obj/item/organ/internal/brain/crystal
- name = "crystalized brain"
+ name = "crystallized brain"
icon_state = "crystal-brain"
- organ_tag = "crystalized brain"
- slot = "brain"
+ organ_tag = "crystallized brain"
species = "Nucleation"
diff --git a/code/modules/surgery/organs/subtypes/shadow.dm b/code/modules/surgery/organs/subtypes/shadow.dm
new file mode 100644
index 00000000000..f81fc54bfb1
--- /dev/null
+++ b/code/modules/surgery/organs/subtypes/shadow.dm
@@ -0,0 +1,4 @@
+/obj/item/organ/internal/eyes/shadow
+ name = "dark orbs"
+ dark_view = 8
+ species = "Shadow"
diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm
index c069b852886..842088f2937 100644
--- a/code/modules/surgery/organs/subtypes/skrell.dm
+++ b/code/modules/surgery/organs/subtypes/skrell.dm
@@ -1,3 +1,63 @@
/obj/item/organ/internal/liver/skrell
alcohol_intensity = 4
species = "Skrell"
+
+/obj/item/organ/internal/headpocket
+ name = "headpocket"
+ desc = "Allows Skrell to hide tiny objects within their head tentacles."
+ icon_state = "skrell_headpocket"
+ origin_tech = "biotech=2"
+ w_class = WEIGHT_CLASS_TINY
+ parent_organ = "head"
+ slot = "headpocket"
+ species = "Skrell"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
+ var/obj/item/weapon/storage/internal/pocket
+
+/obj/item/organ/internal/headpocket/New()
+ ..()
+ pocket = new /obj/item/weapon/storage/internal(src)
+ pocket.storage_slots = 1
+ // Allow adjacency calculation to work properly
+ loc = owner
+ // Fit only pocket sized items
+ pocket.max_w_class = WEIGHT_CLASS_SMALL
+ pocket.max_combined_w_class = 2
+
+/obj/item/organ/internal/headpocket/on_life()
+ ..()
+ var/obj/item/organ/external/head/head = owner.get_organ("head")
+ if(pocket.contents.len && (owner.stunned || !findtextEx(head.h_style, "Tentacles")))
+ owner.visible_message("Something falls from [owner]'s head! ",
+ "Something falls from your head! ")
+ empty_contents()
+
+/obj/item/organ/internal/headpocket/ui_action_click()
+ if(!loc)
+ loc = owner
+ pocket.MouseDrop(owner)
+
+/obj/item/organ/internal/headpocket/on_owner_death()
+ empty_contents()
+
+/obj/item/organ/internal/headpocket/remove()
+ empty_contents()
+ . = ..()
+
+/obj/item/organ/internal/headpocket/proc/empty_contents()
+ pocket.empty_object_contents(0, get_turf(owner))
+
+/obj/item/organ/internal/headpocket/proc/get_contents()
+ return pocket.contents
+
+/obj/item/organ/internal/headpocket/emp_act(severity)
+ pocket.emp_act(severity)
+ ..()
+
+/obj/item/organ/internal/headpocket/hear_talk(mob/living/M as mob, msg)
+ pocket.hear_talk(M, msg)
+ ..()
+
+/obj/item/organ/internal/headpocket/hear_message(mob/living/M as mob, msg)
+ pocket.hear_message(M, msg)
+ ..()
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 62ae8c78d66..a6467584963 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -8,7 +8,7 @@
icon_name = "torso"
max_damage = 100
min_broken_damage = 35
- w_class = 5
+ w_class = WEIGHT_CLASS_HUGE
body_part = UPPER_TORSO
vital = 1
amputation_point = "spine"
@@ -42,7 +42,7 @@
icon_name = "groin"
max_damage = 100
min_broken_damage = 35
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY // if you know what I mean ;)
body_part = LOWER_TORSO
vital = 1
parent_organ = "chest"
@@ -55,7 +55,7 @@
icon_name = "l_arm"
max_damage = 50
min_broken_damage = 30
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
body_part = ARM_LEFT
parent_organ = "chest"
amputation_point = "left shoulder"
@@ -74,7 +74,7 @@
icon_name = "l_leg"
max_damage = 50
min_broken_damage = 30
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
@@ -95,7 +95,7 @@
icon_name = "l_foot"
max_damage = 30
min_broken_damage = 15
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
body_part = FOOT_LEFT
icon_position = LEFT
parent_organ = "l_leg"
@@ -121,7 +121,7 @@
icon_name = "l_hand"
max_damage = 30
min_broken_damage = 15
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
body_part = HAND_LEFT
parent_organ = "l_arm"
amputation_point = "left wrist"
@@ -152,7 +152,7 @@
name = "head"
max_damage = 75
min_broken_damage = 35
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
body_part = HEAD
vital = 1
parent_organ = "chest"
diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm
index e37686a05ca..746abd6e601 100644
--- a/code/modules/surgery/organs/subtypes/tajaran.dm
+++ b/code/modules/surgery/organs/subtypes/tajaran.dm
@@ -1,3 +1,16 @@
/obj/item/organ/internal/liver/tajaran
alcohol_intensity = 1.4
species = "Tajaran"
+
+/obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
+ unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
+ name = "tajaran eyeballs"
+ species = "Tajaran"
+ colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
+ colourblind_darkview = 8
+
+/obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness.
+ name = "farwa eyeballs"
+ species = "Farwa"
+ colourmatrix = MATRIX_TAJ_CBLIND
+ dark_view = 8
diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm
index a769bce7a02..0fb45319ce5 100644
--- a/code/modules/surgery/organs/subtypes/unathi.dm
+++ b/code/modules/surgery/organs/subtypes/unathi.dm
@@ -1,3 +1,8 @@
/obj/item/organ/internal/liver/unathi
alcohol_intensity = 0.8
species = "Unathi"
+
+/obj/item/organ/internal/eyes/unathi
+ name = "unathi eyeballs"
+ dark_view = 3
+ species = "Unathi"
diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm
index f0b94e2963e..bb56c41030d 100644
--- a/code/modules/surgery/organs/subtypes/vox.dm
+++ b/code/modules/surgery/organs/subtypes/vox.dm
@@ -1,3 +1,16 @@
/obj/item/organ/internal/liver/vox
alcohol_intensity = 1.6
species = "Vox"
+
+
+/obj/item/organ/internal/stack
+ name = "cortical stack"
+ icon_state = "brain-prosthetic"
+ parent_organ = "head"
+ organ_tag = "stack"
+ slot = "vox_stack"
+ robotic = 2
+ vital = 1
+
+/obj/item/organ/internal/stack/vox
+ name = "vox cortical stack"
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm
index ca47ac83ddd..af3d9deab09 100644
--- a/code/modules/surgery/organs/subtypes/vulpkanin.dm
+++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm
@@ -1,3 +1,16 @@
/obj/item/organ/internal/liver/vulpkanin
alcohol_intensity = 1.4
species = "Vulpkanin"
+
+/obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
+ unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
+ name = "vulpkanin eyeballs"
+ species = "Vulpkanin"
+ colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
+ colourblind_darkview = 8
+
+/obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness.
+ name = "wolpin eyeballs"
+ species = "Wolpin"
+ colourmatrix = MATRIX_VULP_CBLIND
+ dark_view = 8
diff --git a/code/modules/surgery/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm
index f51adb6054e..ee1a12fd1ab 100644
--- a/code/modules/surgery/organs/subtypes/wryn.dm
+++ b/code/modules/surgery/organs/subtypes/wryn.dm
@@ -7,3 +7,7 @@
parent_organ = "head"
slot = "hivenode"
species = "Wryn"
+
+/obj/item/organ/internal/eyes/wryn
+ dark_view = 3
+ species = "Wryn"
diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm
index 5e771931165..19e9335a61b 100644
--- a/code/modules/surgery/organs/subtypes/xenos.dm
+++ b/code/modules/surgery/organs/subtypes/xenos.dm
@@ -37,7 +37,7 @@
name = "xeno plasma vessel"
icon_state = "plasma"
origin_tech = "biotech=5;plasmatech=2"
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
parent_organ = "chest"
slot = "plasmavessel"
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/plant, /mob/living/carbon/alien/humanoid/verb/transfer_plasma)
@@ -127,7 +127,7 @@
parent_organ = "head"
slot = "hivenode"
origin_tech = "biotech=5;magnets=4;bluespace=3"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/whisp)
/obj/item/organ/internal/xenos/hivenode/insert(mob/living/carbon/M, special = 0)
@@ -163,6 +163,6 @@
icon_state = "eggsac"
parent_organ = "groin"
slot = "eggsac"
- w_class = 4
+ w_class = WEIGHT_CLASS_BULKY
origin_tech = "biotech=8"
alien_powers = list(/mob/living/carbon/alien/humanoid/queen/verb/lay_egg)
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
new file mode 100644
index 00000000000..05486c9046d
--- /dev/null
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -0,0 +1,455 @@
+var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
+var/static/regex/weaken_words = regex("drop|fall|trip")
+var/static/regex/sleep_words = regex("sleep|slumber")
+var/static/regex/vomit_words = regex("vomit|throw up")
+var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush")
+var/static/regex/hallucinate_words = regex("see the truth|hallucinate")
+var/static/regex/wakeup_words = regex("wake up|awaken")
+var/static/regex/heal_words = regex("live|heal|survive|mend|heroes never die")
+var/static/regex/hurt_words = regex("die|suffer")
+var/static/regex/bleed_words = regex("bleed")
+var/static/regex/burn_words = regex("burn|ignite")
+var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah")
+var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify")
+var/static/regex/saymyname_words = regex("say my name")
+var/static/regex/knockknock_words = regex("knock knock")
+var/static/regex/statelaws_words = regex("state laws|state your laws")
+var/static/regex/move_words = regex("move")
+var/static/regex/walk_words = regex("walk|slow down")
+var/static/regex/run_words = regex("run")
+var/static/regex/helpintent_words = regex("help")
+var/static/regex/disarmintent_words = regex("disarm")
+var/static/regex/grabintent_words = regex("grab")
+var/static/regex/harmintent_words = regex("harm|fight")
+var/static/regex/throwmode_words = regex("throw|catch")
+var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault")
+var/static/regex/rest_words = regex("rest")
+var/static/regex/getup_words = regex("get up")
+var/static/regex/sit_words = regex("sit")
+var/static/regex/stand_words = regex("stand")
+var/static/regex/dance_words = regex("dance")
+var/static/regex/jump_words = regex("jump")
+var/static/regex/salute_words = regex("salute")
+var/static/regex/deathgasp_words = regex("play dead")
+var/static/regex/clap_words = regex("clap|applaud")
+var/static/regex/honk_words = regex("ho+nk") //hooooooonk
+var/static/regex/multispin_words = regex("like a record baby")
+
+/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel
+ name = "vocal cords"
+ icon_state = "appendix"
+ zone = "mouth"
+ slot = "vocal_cords"
+ parent_organ = "mouth"
+ var/spans = null
+
+/obj/item/organ/internal/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords
+ return TRUE
+
+/obj/item/organ/internal/vocal_cords/proc/speak_with(message) //do what the organ does
+ return
+
+/obj/item/organ/internal/vocal_cords/proc/handle_speech(message) //change the message
+ return message
+
+//Colossus drop, forces the listeners to obey certain commands
+/obj/item/organ/internal/vocal_cords/colossus
+ name = "divine vocal cords"
+ desc = "They carry the voice of an ancient god."
+ icon_state = "voice_of_god"
+ actions_types = list(/datum/action/item_action/organ_action/colossus)
+ var/next_command = 0
+ var/cooldown_stun = 1200
+ var/cooldown_damage = 600
+ var/cooldown_meme = 300
+ var/cooldown_none = 150
+ var/base_multiplier = 1
+ spans = "colossus yell"
+
+/datum/action/item_action/organ_action/colossus
+ name = "Voice of God"
+ var/obj/item/organ/internal/vocal_cords/colossus/cords = null
+
+/datum/action/item_action/organ_action/colossus/New()
+ ..()
+ cords = target
+
+/datum/action/item_action/organ_action/colossus/IsAvailable()
+ if(world.time < cords.next_command)
+ return FALSE
+ if(!owner)
+ return FALSE
+ if(!owner.can_speak())
+ return FALSE
+ if(check_flags & AB_CHECK_CONSCIOUS)
+ if(owner.stat)
+ return FALSE
+ return TRUE
+
+/datum/action/item_action/organ_action/colossus/Trigger()
+ . = ..()
+ if(!IsAvailable())
+ if(world.time < cords.next_command)
+ to_chat(owner, "You must wait [(cords.next_command - world.time)/10] seconds before Speaking again. ")
+ return
+ var/command = input(owner, "Speak with the Voice of God", "Command")
+ if(!command)
+ return
+ owner.say(".x[command]")
+
+/obj/item/organ/internal/vocal_cords/colossus/can_speak_with()
+ if(world.time < next_command)
+ to_chat(owner, "You must wait [(next_command - world.time)/10] seconds before Speaking again. ")
+ return FALSE
+ if(!owner)
+ return FALSE
+ if(!owner.can_speak())
+ to_chat(owner, "You are unable to speak! ")
+ return FALSE
+ if(owner.stat)
+ return FALSE
+ return TRUE
+
+/obj/item/organ/internal/vocal_cords/colossus/handle_speech(message)
+ spans = "colossus yell" //reset spans, just in case someone gets deculted or the cords change owner
+ if(iscultist(owner))
+ spans += " narsiesmall"
+ return "[uppertext(message)] "
+
+/obj/item/organ/internal/vocal_cords/colossus/speak_with(message)
+ var/log_message = uppertext(message)
+ message = lowertext(message)
+ playsound(get_turf(owner), 'sound/magic/invoke_general.ogg', 300, 1, 5)
+
+ var/mob/living/list/listeners = list()
+ for(var/mob/living/L in get_mobs_in_view(8, owner, TRUE))
+ if(!L.ear_deaf && !L.null_rod_check() && L != owner && L.stat != DEAD)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
+ continue
+ listeners += L
+
+ if(!listeners.len)
+ next_command = world.time + cooldown_none
+ return
+
+ var/power_multiplier = base_multiplier
+
+ if(owner.mind)
+ //Chaplains are very good at speaking with the voice of god
+ if(owner.mind.assigned_role == "Chaplain")
+ power_multiplier *= 2
+ //Command staff has authority
+ if(owner.mind.assigned_role in command_positions)
+ power_multiplier *= 1.4
+ //Why are you speaking
+ if(owner.mind.assigned_role == "Mime")
+ power_multiplier *= 0.5
+
+ //Cultists are closer to their gods and are more powerful, but they'll give themselves away
+ if(iscultist(owner))
+ power_multiplier *= 2
+
+ //Try to check if the speaker specified a name or a job to focus on
+ var/list/specific_listeners = list()
+ var/found_string = null
+
+ for(var/V in listeners)
+ var/mob/living/L = V
+ /*if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename))
+ var/start = findtext(message, L.mind.devilinfo.truename)
+ listeners = list(L) //let's be honest you're never going to find two devils with the same name
+ power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
+ //Cut out the name so it doesn't trigger commands
+ message = copytext(message, 0, start)+copytext(message, start + length(L.mind.devilinfo.truename), length(message) + 1)
+ break*/
+ if(findtext(message, L.real_name) == 1)
+ specific_listeners += L //focus on those with the specified name
+ //Cut out the name so it doesn't trigger commands
+ found_string = L.real_name
+
+ else if(L.mind && findtext(message, L.mind.assigned_role) == 1)
+ specific_listeners += L //focus on those with the specified job
+ //Cut out the job so it doesn't trigger commands
+ found_string = L.mind.assigned_role
+
+ if(specific_listeners.len)
+ listeners = specific_listeners
+ power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on
+ message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1)
+
+ //STUN
+ if(findtext(message, stun_words))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.Stun(3 * power_multiplier)
+ next_command = world.time + cooldown_stun
+
+ //WEAKEN
+ else if(findtext(message, weaken_words))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.Weaken(3 * power_multiplier)
+ next_command = world.time + cooldown_stun
+
+ //SLEEP
+ else if((findtext(message, sleep_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.Sleeping(2 * power_multiplier)
+ next_command = world.time + cooldown_stun
+
+ //VOMIT
+ else if((findtext(message, vomit_words)))
+ for(var/mob/living/carbon/C in listeners)
+ C.vomit(10 * power_multiplier)
+ next_command = world.time + cooldown_stun
+
+ //SILENCE
+ else if((findtext(message, silence_words)))
+ for(var/mob/living/carbon/C in listeners)
+ if(owner.mind && (owner.mind.assigned_role == "Librarian" || owner.mind.assigned_role == "Mime"))
+ power_multiplier *= 3
+ C.silent += (10 * power_multiplier)
+ next_command = world.time + cooldown_stun
+
+ //HALLUCINATE
+ else if((findtext(message, hallucinate_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0)
+ next_command = world.time + cooldown_meme
+
+ //WAKE UP
+ else if((findtext(message, wakeup_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.SetSleeping(0)
+ next_command = world.time + cooldown_damage
+
+ //HEAL
+ else if((findtext(message, heal_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, 0)
+ next_command = world.time + cooldown_damage
+
+ //BRUTE DAMAGE
+ else if((findtext(message, hurt_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.apply_damage(15 * power_multiplier, def_zone = "chest")
+ next_command = world.time + cooldown_damage
+
+ //BLEED
+ else if((findtext(message, bleed_words)))
+ for(var/mob/living/carbon/human/H in listeners)
+ H.drip(100 * power_multiplier)
+ next_command = world.time + cooldown_damage
+
+ //FIRE
+ else if((findtext(message, burn_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.adjust_fire_stacks(1 * power_multiplier)
+ L.IgniteMob()
+ next_command = world.time + cooldown_damage
+
+ //REPULSE
+ else if((findtext(message, repulse_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ var/throwtarget = get_edge_target_turf(owner, get_dir(owner, get_step_away(L, owner)))
+ L.throw_at(throwtarget, 3 * power_multiplier, 1)
+ next_command = world.time + cooldown_damage
+
+ //WHO ARE YOU?
+ else if((findtext(message, whoareyou_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ /*if(L.mind && L.mind.devilinfo)
+ L.say("[L.mind.devilinfo.truename]")
+ else*/
+ L.say("[L.real_name]")
+ next_command = world.time + cooldown_meme
+
+ //SAY MY NAME
+ else if((findtext(message, saymyname_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.say("[owner.name]!") //"Unknown!"
+ next_command = world.time + cooldown_meme
+
+ //KNOCK KNOCK
+ else if((findtext(message, knockknock_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.say("Who's there?")
+ next_command = world.time + cooldown_meme
+
+ //STATE LAWS
+ else if((findtext(message, statelaws_words)))
+ for(var/mob/living/silicon/S in listeners)
+ S.statelaws(S.laws)
+ next_command = world.time + cooldown_stun
+
+ //MOVE
+ else if((findtext(message, move_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ step(L, pick(cardinal))
+ next_command = world.time + cooldown_meme
+
+ //WALK
+ else if((findtext(message, walk_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ if(L.m_intent != "walk")
+ L.m_intent = "walk"
+ if(L.hud_used)
+ L.hud_used.move_intent.icon_state = "walking"
+ next_command = world.time + cooldown_meme
+
+ //RUN
+ else if((findtext(message, run_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ if(L.m_intent != "run")
+ L.m_intent = "run"
+ if(L.hud_used)
+ L.hud_used.move_intent.icon_state = "running"
+ next_command = world.time + cooldown_meme
+
+ //HELP INTENT
+ else if((findtext(message, helpintent_words)))
+ for(var/mob/living/carbon/human/H in listeners)
+ H.a_intent_change(I_HELP)
+ next_command = world.time + cooldown_meme
+
+ //DISARM INTENT
+ else if((findtext(message, disarmintent_words)))
+ for(var/mob/living/carbon/human/H in listeners)
+ H.a_intent_change(I_DISARM)
+ next_command = world.time + cooldown_meme
+
+ //GRAB INTENT
+ else if((findtext(message, grabintent_words)))
+ for(var/mob/living/carbon/human/H in listeners)
+ H.a_intent_change(I_GRAB)
+ next_command = world.time + cooldown_meme
+
+ //HARM INTENT
+ else if((findtext(message, harmintent_words)))
+ for(var/mob/living/carbon/human/H in listeners)
+ H.a_intent_change(I_HARM)
+ next_command = world.time + cooldown_meme
+
+ //THROW/CATCH
+ else if((findtext(message, throwmode_words)))
+ for(var/mob/living/carbon/C in listeners)
+ C.throw_mode_on()
+ next_command = world.time + cooldown_meme
+
+ //FLIP
+ else if((findtext(message, flip_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.emote("flip")
+ next_command = world.time + cooldown_meme
+
+ //REST
+ else if((findtext(message, rest_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ if(!L.resting)
+ L.lay_down()
+ next_command = world.time + cooldown_meme
+
+ //GET UP
+ else if((findtext(message, getup_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ if(L.resting)
+ L.lay_down() //aka get up
+ L.SetStunned(0)
+ L.SetWeakened(0)
+ L.SetParalysis(0) //i said get up i don't care if you're being tazed
+ next_command = world.time + cooldown_damage
+
+ //SIT
+ else if((findtext(message, sit_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ for(var/obj/structure/stool/bed/chair/chair in get_turf(L))
+ chair.buckle_mob(L)
+ break
+ next_command = world.time + cooldown_meme
+
+ //STAND UP
+ else if((findtext(message, stand_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ if(L.buckled && istype(L.buckled, /obj/structure/stool/bed/chair))
+ L.buckled.unbuckle_mob(L)
+ next_command = world.time + cooldown_meme
+
+ //DANCE
+ else if((findtext(message, dance_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.emote("dance")
+ next_command = world.time + cooldown_meme
+
+ //JUMP
+ else if((findtext(message, jump_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.say("HOW HIGH?!!")
+ L.emote("jump")
+ next_command = world.time + cooldown_meme
+
+ //SALUTE
+ else if((findtext(message, salute_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.emote("salute")
+ next_command = world.time + cooldown_meme
+
+ //PLAY DEAD
+ else if((findtext(message, deathgasp_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.emote("deathgasp")
+ next_command = world.time + cooldown_meme
+
+ //PLEASE CLAP
+ else if((findtext(message, clap_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.emote("clap")
+ next_command = world.time + cooldown_meme
+
+ //HONK
+ else if((findtext(message, honk_words)))
+ spawn(25)
+ playsound(get_turf(owner), 'sound/items/bikehorn.ogg', 300, 1)
+ if(owner.mind && owner.mind.assigned_role == "Clown")
+ for(var/mob/living/carbon/C in listeners)
+ C.slip(0,7 * power_multiplier)
+ next_command = world.time + cooldown_stun
+ else
+ next_command = world.time + cooldown_meme
+
+ //RIGHT ROUND
+ else if((findtext(message, multispin_words)))
+ for(var/V in listeners)
+ var/mob/living/L = V
+ L.SpinAnimation(speed = 10, loops = 5)
+ next_command = world.time + cooldown_meme
+
+ else
+ next_command = world.time + cooldown_none
+
+ message_admins("[key_name_admin(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
+ log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
\ No newline at end of file
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index f86cf41bcd0..420d56de43d 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -1,3 +1,5 @@
+#define GHETTO_DISINFECT_AMOUNT 5 //Amount of units to transfer from the container to the organs during ghetto surgery disinfection step
+
/datum/surgery/organ_manipulation
name = "Organ Manipulation"
steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,
@@ -68,8 +70,15 @@
allowed_tools = list(/obj/item/organ/internal = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0)
var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 55)
var/implements_mend = list(/obj/item/stack/medical/bruise_pack = 20,/obj/item/stack/medical/bruise_pack/advanced = 100,/obj/item/stack/nanopaste = 100)
+ var/implements_clean = list(/obj/item/weapon/reagent_containers/dropper = 100,
+ /obj/item/weapon/reagent_containers/glass/bottle = 75,
+ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 70,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle = 65,
+ /obj/item/weapon/reagent_containers/glass/beaker = 60,
+ /obj/item/weapon/reagent_containers/spray = 50,
+ /obj/item/weapon/reagent_containers/glass/bucket = 40)
//Finish is just so you can close up after you do other things.
- var/implements_finsh = list(/obj/item/weapon/scalpel/manager = 120,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75)
+ var/implements_finsh = list(/obj/item/weapon/scalpel/laser/manager = 100,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75)
var/current_type
var/obj/item/organ/internal/I = null
var/obj/item/organ/external/affected = null
@@ -77,7 +86,7 @@
/datum/surgery_step/internal/manipulate_organs/New()
..()
- allowed_tools = allowed_tools + implements_extract + implements_mend + implements_finsh
+ allowed_tools = allowed_tools + implements_extract + implements_mend + implements_clean + implements_finsh
/datum/surgery_step/internal/manipulate_organs/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -95,32 +104,53 @@
return -1
if(I.damage > (I.max_damage * 0.75))
- to_chat(user, " \The [I] is in no state to be transplanted. ")
+ to_chat(user, " [I] is in no state to be transplanted. ")
return -1
if(target.get_int_organ(I))
- to_chat(user, " \The [target] already has [I]. ")
+ to_chat(user, " [target] already has [I]. ")
return -1
if(affected)
- user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \
- "You start transplanting \the [tool] into [target]'s [affected.name].")
+ user.visible_message("[user] starts transplanting [tool] into [target]'s [affected.name].", \
+ "You start transplanting [tool] into [target]'s [affected.name].")
H.custom_pain("Someone's rooting around in your [affected.name]!",1)
else
- user.visible_message("[user] starts transplanting \the [tool] into [target]'s [parse_zone(target_zone)].", \
- "You start transplanting \the [tool] into [target]'s [parse_zone(target_zone)].")
+ user.visible_message("[user] starts transplanting [tool] into [target]'s [parse_zone(target_zone)].", \
+ "You start transplanting [tool] into [target]'s [parse_zone(target_zone)].")
+
+ else if(implement_type in implements_clean)
+ current_type = "clean"
+
+ if(!istype(tool, /obj/item/weapon/reagent_containers))
+ return
+
+ var/obj/item/weapon/reagent_containers/C = tool
+
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I)
+ if(C.reagents.total_volume < GHETTO_DISINFECT_AMOUNT)
+ user.visible_message("[user] notices [tool] is empty.", \
+ "You notice [tool] is empty")
+ return 0
+
+ var/msg = "[user] starts pouring some of [tool] over [target]'s [I.name]."
+ var/self_msg = "You start pouring some of [tool] over [target]'s [I.name]."
+ user.visible_message(msg, self_msg)
+ if(H && affected)
+ H.custom_pain("Something burns horribly in your [affected.name]!",1)
else if(implement_type in implements_finsh)
//same as surgery step /datum/surgery_step/open_encased/close/
current_type = "finish"
if(affected && affected.encased)
- var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]."
- var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]."
+ var/msg = "[user] starts bending [target]'s [affected.encased] back into place with [tool]."
+ var/self_msg = "You start bending [target]'s [affected.encased] back into place with [tool]."
user.visible_message(msg, self_msg)
else
- var/msg = "[user] starts pulling [target]'s skin back into place with \the [tool]."
- var/self_msg = "You start pulling [target]'s skin back into place with \the [tool]."
+ var/msg = "[user] starts pulling [target]'s skin back into place with [tool]."
+ var/self_msg = "You start pulling [target]'s skin back into place with [tool]."
user.visible_message(msg, self_msg)
if(H && affected)
@@ -143,8 +173,8 @@
I = organs[I]
if(!I)
return -1
- user.visible_message("[user] starts to separate [target]'s [I] with \the [tool].", \
- "You start to separate [target]'s [I] with \the [tool] for removal." )
+ user.visible_message("[user] starts to separate [target]'s [I] with [tool].", \
+ "You start to separate [target]'s [I] with [tool] for removal." )
if(H && affected)
H.custom_pain("The pain in your [affected.name] is living hell!",1)
else
@@ -152,13 +182,13 @@
else if(implement_type in implements_mend)
current_type = "mend"
- var/tool_name = "\the [tool]"
+ var/tool_name = "[tool]"
if(istype(tool, /obj/item/stack/medical/bruise_pack))
tool_name = "the bandaid"
if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced))
tool_name = "regenerative membrane"
else if(istype(tool, /obj/item/stack/nanopaste))
- tool_name = "\the [tool]" //what else do you call nanopaste medically?
+ tool_name = "[tool]" //what else do you call nanopaste medically?
if(!hasorgans(target))
to_chat(user, "They do not have organs to mend!")
@@ -168,7 +198,7 @@
if(I && I.damage > 0)
if(I.robotic < 2 && !istype (tool, /obj/item/stack/nanopaste))
if(!(I.sterile))
- spread_germs_to_organ(I, user)
+ spread_germs_to_organ(I, user, tool)
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
"You start treating damage to [target]'s [I.name] with [tool_name]." )
else if(I.robotic >= 2 && istype(tool, /obj/item/stack/nanopaste))
@@ -182,20 +212,20 @@
H.custom_pain("The pain in your [affected.name] is living hell!", 1)
else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ))
- to_chat(user, "[tool] was biten by someone! It's too damaged to use! ")
+ to_chat(user, "[tool] was bitten by someone! It's too damaged to use! ")
return -1
..()
/datum/surgery_step/internal/manipulate_organs/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(current_type == "mend")
- var/tool_name = "\the [tool]"
+ var/tool_name = "[tool]"
if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced))
tool_name = "regenerative membrane"
if(istype(tool, /obj/item/stack/medical/bruise_pack))
tool_name = "the bandaid"
if(istype(tool, /obj/item/stack/nanopaste))
- tool_name = "\the [tool]" //what else do you call nanopaste medically?
+ tool_name = "[tool]" //what else do you call nanopaste medically?
if(!hasorgans(target))
return
@@ -217,51 +247,82 @@
I = tool
user.drop_item()
I.insert(target)
- spread_germs_to_organ(I, user)
+ spread_germs_to_organ(I, user, tool)
if(!user.canUnEquip(I, 0))
to_chat(user, "[I] is stuck to your hand, you can't put it in [target]! ")
return 0
if(affected)
- user.visible_message(" [user] has transplanted \the [tool] into [target]'s [affected.name]. ",
- " You have transplanted \the [tool] into [target]'s [affected.name]. ")
+ user.visible_message(" [user] has transplanted [tool] into [target]'s [affected.name]. ",
+ " You have transplanted [tool] into [target]'s [affected.name]. ")
else
- user.visible_message(" [user] has transplanted \the [tool] into [target]'s [parse_zone(target_zone)]. ",
- " You have transplanted \the [tool] into [target]'s [parse_zone(target_zone)]. ")
+ user.visible_message(" [user] has transplanted [tool] into [target]'s [parse_zone(target_zone)]. ",
+ " You have transplanted [tool] into [target]'s [parse_zone(target_zone)]. ")
I.status &= ~ORGAN_CUT_AWAY
else if(current_type == "extract")
if(I && I.owner == target)
- user.visible_message(" [user] has separated and extracts [target]'s [I] with \the [tool]. ",
- " You have separated and extracted [target]'s [I] with \the [tool]. ")
+ user.visible_message(" [user] has separated and extracts [target]'s [I] with [tool]. ",
+ " You have separated and extracted [target]'s [I] with [tool]. ")
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
- spread_germs_to_organ(I, user)
+ spread_germs_to_organ(I, user, tool)
I.status |= ORGAN_CUT_AWAY
var/obj/item/thing = I.remove(target)
if(!istype(thing))
thing.forceMove(get_turf(target))
else
user.put_in_hands(thing)
+
+ target.update_icons()
else
user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]! ",
"You can't extract anything from [target]'s [parse_zone(target_zone)]! ")
+ else if(current_type == "clean")
+ if(!hasorgans(target))
+ return
+ if(!istype(tool,/obj/item/weapon/reagent_containers))
+ return
+
+ var/obj/item/weapon/reagent_containers/C = tool
+ var/datum/reagents/R = C.reagents
+ var/ethanol = 0 //how much alcohol is in the thing
+
+ if(R.reagent_list.len)
+ for(var/datum/reagent/consumable/ethanol/alcohol in R.reagent_list)
+ ethanol += alcohol.alcohol_perc * 300
+ ethanol /= R.reagent_list.len
+
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I)
+ if(R.total_volume < GHETTO_DISINFECT_AMOUNT)
+ user.visible_message("[user] notices there is not enough of [tool].", \
+ "You notice there is not enough of [tool].")
+ return 0
+ if(I.germ_level < INFECTION_LEVEL_ONE / 2)
+ to_chat(user, "[I] does not appear to be infected.")
+ if(I.germ_level >= INFECTION_LEVEL_ONE / 2)
+ I.germ_level = max(I.germ_level-ethanol, 0)
+ user.visible_message(" [user] has poured some of [tool] over [target]'s [I.name]. ",
+ " You have poured some of [tool] over [target]'s [I.name]. ")
+ R.trans_to(target, GHETTO_DISINFECT_AMOUNT)
+ R.reaction(target, INGEST)
+
else if(current_type == "finish")
if(affected && affected.encased)
- var/msg = " [user] bends [target]'s [affected.encased] back into place with \the [tool]. "
- var/self_msg = " You bend [target]'s [affected.encased] back into place with \the [tool]. "
+ var/msg = " [user] bends [target]'s [affected.encased] back into place with [tool]. "
+ var/self_msg = " You bend [target]'s [affected.encased] back into place with [tool]. "
user.visible_message(msg, self_msg)
affected.open = 2.5
else
- var/msg = "[user] pulls [target]'s flesh back into place with \the [tool]. "
- var/self_msg = "You pull [target]'s flesh back into place with \the [tool]. "
+ var/msg = "[user] pulls [target]'s flesh back into place with [tool]. "
+ var/self_msg = "You pull [target]'s flesh back into place with [tool]. "
user.visible_message(msg, self_msg)
return 1
-
return 0
/datum/surgery_step/internal/manipulate_organs/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -269,8 +330,8 @@
if(!hasorgans(target))
return
- user.visible_message(" [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]! ", \
- " Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]! ")
+ user.visible_message(" [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with [tool]! ", \
+ " Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with [tool]! ")
var/dam_amt = 2
@@ -289,24 +350,49 @@
return 0
else if(current_type == "insert")
- user.visible_message(" [user]'s hand slips, damaging \the [tool]! ", \
- " Your hand slips, damaging \the [tool]! ")
+ user.visible_message(" [user]'s hand slips, damaging [tool]! ", \
+ " Your hand slips, damaging [tool]! ")
var/obj/item/organ/internal/I = tool
if(istype(I) && !I.tough)
I.take_damage(rand(3,5),0)
return 0
+ else if(current_type == "clean")
+ if(!hasorgans(target))
+ return
+ if(!istype(tool,/obj/item/weapon/reagent_containers))
+ return
+
+ var/obj/item/weapon/reagent_containers/C = tool
+ var/datum/reagents/R = C.reagents
+ var/ethanol = 0 //how much alcohol is in the thing
+
+ if(R.reagent_list.len)
+ for(var/datum/reagent/consumable/ethanol/alcohol in R.reagent_list)
+ ethanol += alcohol.alcohol_perc * 300
+ ethanol /= C.reagents.reagent_list.len
+
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ I.germ_level = max(I.germ_level-ethanol, 0)
+ I.take_damage(rand(4,8),0)
+
+ R.trans_to(target, GHETTO_DISINFECT_AMOUNT * 10)
+ R.reaction(target, INGEST)
+
+ user.visible_message(" [user]'s hand slips, splashing the contents of [tool] all over [target]'s [affected.name] incision! ", \
+ " Your hand slips, splashing the contents of [tool] all over [target]'s [affected.name] incision! ")
+ return 0
else if(current_type == "extract")
if(I && I.owner == target)
if(affected)
- user.visible_message(" [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]! ", \
- " Your hand slips, damaging [target]'s [affected.name] with \the [tool]! ")
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [affected.name] with [tool]! ", \
+ " Your hand slips, damaging [target]'s [affected.name] with [tool]! ")
affected.createwound(BRUISE, 20)
else
- user.visible_message(" [user]'s hand slips, damaging [target]'s [parse_zone(target_zone)] with \the [tool]! ", \
- " Your hand slips, damaging [target]'s [parse_zone(target_zone)] with \the [tool]! ")
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [parse_zone(target_zone)] with [tool]! ", \
+ " Your hand slips, damaging [target]'s [parse_zone(target_zone)] with [tool]! ")
else
user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
"You can't extract anything from [target]'s [parse_zone(target_zone)]! ")
@@ -347,29 +433,25 @@
/datum/surgery_step/saw_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message("[user] begins to cut through [target]'s [target_zone] with \the [tool].", \
- "You begin to cut through [target]'s [target_zone] with \the [tool].")
+ user.visible_message("[user] begins to cut through [target]'s [target_zone] with [tool].", \
+ "You begin to cut through [target]'s [target_zone] with [tool].")
..()
/datum/surgery_step/saw_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user] has cut [target]'s [target_zone] open with \the [tool]. ", \
- " You have cut [target]'s [target_zone] open with \the [tool]. ")
+ user.visible_message(" [user] has cut [target]'s [target_zone] open with [tool]. ", \
+ " You have cut [target]'s [target_zone] open with [tool]. ")
return 1
/datum/surgery_step/saw_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user]'s hand slips, cracking [target]'s [target_zone] with \the [tool]! " , \
- " Your hand slips, cracking [target]'s [target_zone] with \the [tool]! " )
+ user.visible_message(" [user]'s hand slips, cracking [target]'s [target_zone] with [tool]! " , \
+ " Your hand slips, cracking [target]'s [target_zone] with [tool]! " )
return 0
/datum/surgery_step/cut_carapace
name = "cut carapace"
allowed_tools = list(
- /obj/item/weapon/scalpel/laser3 = 115, \
- /obj/item/weapon/scalpel/laser2 = 110, \
- /obj/item/weapon/scalpel/laser1 = 105, \
- /obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
@@ -377,34 +459,34 @@
/obj/item/weapon/twohanded/chainsaw = 1, \
/obj/item/weapon/claymore = 5, \
/obj/item/weapon/melee/energy/ = 5, \
- /obj/item/weapon/pen/edagger = 5, \
+ /obj/item/weapon/pen/edagger = 5, \
)
time = 16
/datum/surgery_step/cut_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message("[user] starts the incision on [target]'s [target_zone] with \the [tool].", \
- "You start the incision on [target]'s [target_zone] with \the [tool].")
+ user.visible_message("[user] starts the incision on [target]'s [target_zone] with [tool].", \
+ "You start the incision on [target]'s [target_zone] with [tool].")
..()
/datum/surgery_step/cut_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user] has made an incision on [target]'s [target_zone] with \the [tool]. ", \
- " You have made an incision on [target]'s [target_zone] with \the [tool]. ",)
+ user.visible_message(" [user] has made an incision on [target]'s [target_zone] with [tool]. ", \
+ " You have made an incision on [target]'s [target_zone] with [tool]. ",)
return 1
/datum/surgery_step/cut_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user]'s hand slips, slicing open [target]'s [target_zone] in a wrong spot with \the [tool]! ", \
- " Your hand slips, slicing open [target]'s [target_zone] in a wrong spot with \the [tool]! ")
+ user.visible_message(" [user]'s hand slips, slicing open [target]'s [target_zone] in a wrong spot with [tool]! ", \
+ " Your hand slips, slicing open [target]'s [target_zone] in a wrong spot with [tool]! ")
return 0
/datum/surgery_step/retract_carapace
name = "retract carapace"
allowed_tools = list(
- /obj/item/weapon/scalpel/manager = 120, \
+ /obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 50
@@ -413,37 +495,37 @@
time = 24
/datum/surgery_step/retract_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/msg = "[user] starts to pry open the incision on [target]'s [target_zone] with \the [tool]."
- var/self_msg = "You start to pry open the incision on [target]'s [target_zone] with \the [tool]."
+ var/msg = "[user] starts to pry open the incision on [target]'s [target_zone] with [tool]."
+ var/self_msg = "You start to pry open the incision on [target]'s [target_zone] with [tool]."
if(target_zone == "chest")
- msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
+ msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with [tool]."
+ self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with [tool]."
if(target_zone == "groin")
- msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
- self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
+ msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with [tool]."
+ self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with [tool]."
user.visible_message(msg, self_msg)
..()
/datum/surgery_step/retract_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/msg = " [user] keeps the incision open on [target]'s [target_zone] with \the [tool] ."
- var/self_msg = " You keep the incision open on [target]'s [target_zone] with \the [tool]. "
+ var/msg = " [user] keeps the incision open on [target]'s [target_zone] with [tool] ."
+ var/self_msg = " You keep the incision open on [target]'s [target_zone] with [tool]. "
if(target_zone == "chest")
- msg = " [user] keeps the ribcage open on [target]'s torso with \the [tool]. "
- self_msg = " You keep the ribcage open on [target]'s torso with \the [tool]. "
+ msg = " [user] keeps the ribcage open on [target]'s torso with [tool]. "
+ self_msg = " You keep the ribcage open on [target]'s torso with [tool]. "
if(target_zone == "groin")
- msg = " [user] keeps the incision open on [target]'s lower abdomen with \the [tool]. "
- self_msg = " You keep the incision open on [target]'s lower abdomen with \the [tool]. "
+ msg = " [user] keeps the incision open on [target]'s lower abdomen with [tool]. "
+ self_msg = " You keep the incision open on [target]'s lower abdomen with [tool]. "
user.visible_message(msg, self_msg)
return 1
/datum/surgery_step/generic/retract_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/msg = " [user]'s hand slips, tearing the edges of incision on [target]'s [target_zone] with \the [tool]! "
- var/self_msg = " Your hand slips, tearing the edges of incision on [target]'s [target_zone] with \the [tool]! "
+ var/msg = " [user]'s hand slips, tearing the edges of incision on [target]'s [target_zone] with [tool]! "
+ var/self_msg = " Your hand slips, tearing the edges of incision on [target]'s [target_zone] with [tool]! "
if(target_zone == "chest")
- msg = " [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]! "
- self_msg = " Your hand slips, damaging several organs [target]'s torso with \the [tool]! "
+ msg = " [user]'s hand slips, damaging several organs [target]'s torso with [tool]! "
+ self_msg = " Your hand slips, damaging several organs [target]'s torso with [tool]! "
if(target_zone == "groin")
- msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool] "
- self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]! "
+ msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with [tool] "
+ self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with [tool]! "
user.visible_message(msg, self_msg)
return 0
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 8caac8e70eb..cfd6b8e632e 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -4,7 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery/infection
- name = "External Infection Treatment/Autopsy"
+ name = "External Infection Treatment"
steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/cauterize)
possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg", "r_hand", "l_hand", "r_foot", "l_foot")
@@ -13,6 +13,11 @@
steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin,/datum/surgery_step/fix_vein,/datum/surgery_step/generic/cauterize)
possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg", "r_hand", "l_hand", "r_foot", "l_foot")
+/datum/surgery/debridement
+ name = "Debridement"
+ steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin,/datum/surgery_step/fix_dead_tissue,/datum/surgery_step/treat_necrosis,/datum/surgery_step/generic/cauterize)
+ possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg", "r_hand", "l_hand", "r_foot", "l_foot")
+
/datum/surgery/infection/can_start(mob/user, mob/living/carbon/target)
if(ishuman(target))
var/mob/living/carbon/human/H = target
@@ -39,6 +44,24 @@
return 1
return 0
+/datum/surgery/debridement/can_start(mob/user, mob/living/carbon/target)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+
+ if(!hasorgans(target))
+ return 0
+
+ if(!affected)
+ return 0
+
+ if(!(affected.status & ORGAN_DEAD))
+ return 0
+
+ return 1
+
+ return 0
+
/datum/surgery_step/fix_vein
name = "mend internal bleeding"
allowed_tools = list(
@@ -115,7 +138,6 @@
if(!(affected.status & ORGAN_DEAD))
return 0
-
return 1
/datum/surgery_step/fix_dead_tissue/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -146,9 +168,11 @@
allowed_tools = list(
/obj/item/weapon/reagent_containers/dropper = 100,
/obj/item/weapon/reagent_containers/glass/bottle = 75,
- /obj/item/weapon/reagent_containers/glass/beaker = 75,
+ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 70,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle = 65,
+ /obj/item/weapon/reagent_containers/glass/beaker = 60,
/obj/item/weapon/reagent_containers/spray = 50,
- /obj/item/weapon/reagent_containers/glass/bucket = 50,
+ /obj/item/weapon/reagent_containers/glass/bucket = 40
)
can_infect = 0
@@ -156,12 +180,14 @@
time = 24
-/datum/surgery_step/fix_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
+/datum/surgery_step/treat_necrosis/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(!istype(tool, /obj/item/weapon/reagent_containers))
return 0
var/obj/item/weapon/reagent_containers/container = tool
if(!container.reagents.has_reagent("mitocholide"))
+ user.visible_message("[user] looks at \the [tool] and ponders." , \
+ "You are not sure if \the [tool] contains mitocholide to treat the necrosis.")
return 0
if(!hasorgans(target))
@@ -172,34 +198,39 @@
return 0
return 1
-/datum/surgery_step/fix_dead_tissue/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
+/datum/surgery_step/treat_necrosis/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \
"You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].")
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1)
..()
-/datum/surgery_step/fix_dead_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
+/datum/surgery_step/treat_necrosis/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!istype(tool, /obj/item/weapon/reagent_containers))
return 0
var/obj/item/weapon/reagent_containers/container = tool
+ var/mitocholide = 0
+
+ if(container.reagents.has_reagent("mitocholide"))
+ mitocholide = 1
var/trans = container.reagents.trans_to(target, container.amount_per_transfer_from_this)
if(trans > 0)
container.reagents.reaction(target, INGEST) //technically it's contact, but the reagents are being applied to internal tissue
- if(container.reagents.has_reagent("mitocholide"))
+ if(mitocholide)
affected.status &= ~ORGAN_DEAD
+ target.update_body()
user.visible_message(" [user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name] ", \
" You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool]. ")
return 1
-/datum/surgery_step/fix_dead_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
+/datum/surgery_step/treat_necrosis/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!istype(tool, /obj/item/weapon/reagent_containers))
diff --git a/code/modules/surgery/rig_removal.dm b/code/modules/surgery/rig_removal.dm
new file mode 100644
index 00000000000..4e0403e43a4
--- /dev/null
+++ b/code/modules/surgery/rig_removal.dm
@@ -0,0 +1,58 @@
+//Procedures in this file: Unsealing a Rig.
+
+/datum/surgery/rigsuit
+ name = "Rig Unsealing"
+ steps = list(/datum/surgery_step/rigsuit)
+ possible_locs = list("chest")
+
+/datum/surgery/rigsuit/can_start(mob/user, mob/living/carbon/target)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/backitem = H.get_item_by_slot(slot_back)
+ if(istype(backitem,/obj/item/weapon/rig)) //Check if we have a rig to operate on
+ if(backitem.flags&NODROP) //Check if the rig is sealed, if not, we don't need to operate
+ return 1
+ return 0
+
+//Bay12 removal
+/datum/surgery_step/rigsuit
+ name="Cut Seals"
+ allowed_tools = list(
+ /obj/item/weapon/weldingtool = 80,
+ /obj/item/weapon/circular_saw = 60,
+ /obj/item/weapon/gun/energy/plasmacutter = 100
+ )
+
+ can_infect = 0
+ blood_level = 0
+
+ time = 50
+
+/datum/surgery_step/hardsuit/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(!istype(target))
+ return 0
+ if(istype(tool,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/welder = tool
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
+ return 0
+ return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && (target.back.flags&NODROP)
+
+/datum/surgery_step/rigsuit/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting through the support systems of [target]'s [target.back] with \the [tool]." , \
+ "You start cutting through the support systems of [target]'s [target.back] with \the [tool].")
+ ..()
+
+/datum/surgery_step/rigsuit/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ var/obj/item/weapon/rig/rig = target.back
+ if(!istype(rig))
+ return
+ rig.reset()
+ user.visible_message("[user] has cut through the support systems of [target]'s [rig] with \the [tool]. ", \
+ "You have cut through the support systems of [target]'s [rig] with \the [tool]. ")
+ return 1
+
+/datum/surgery_step/rigsuit/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s [tool] can't quite seem to get through the metal... ", \
+ "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again. ")
+ return 0
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index d3d5345cb0b..e1dc252412d 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -398,11 +398,16 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/found_damaged_organ = FALSE
for(var/obj/item/organ/internal/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(I.robotic >= 2)
- user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
- "You start mending the damage to [target]'s [I.name]'s mechanisms." )
+ if(I && I.damage > 0 && I.robotic >= 2)
+ user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
+ "You start mending the damage to [target]'s [I.name]'s mechanisms.")
+ found_damaged_organ = TRUE
+
+ if(!found_damaged_organ)
+ to_chat(user, "There are no damaged components in [affected].")
+ return -1
target.custom_pain("The pain in your [affected.name] is living hell!",1)
@@ -425,6 +430,7 @@
user.visible_message(" [user] repairs [target]'s [I.name] with [tool]. ", \
" You repair [target]'s [I.name] with [tool]. " )
I.damage = 0
+ I.surgeryize()
else if(current_type == "insert")
var/obj/item/organ/internal/I = tool
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index defa57b3ca4..127077a621d 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -99,22 +99,22 @@
return
surgery.step_in_progress = 1
+ var/speed_mod = 1
+
if(begin_step(user, target, target_zone, tool, surgery) == -1)
surgery.step_in_progress = 0
return
- var/advance = 0
- var/prob_chance = 100
+ if(tool)
+ speed_mod = tool.toolspeed
- if(implement_type) //this means it isn't a require nd or any item step.
- prob_chance = min(allowed_tools[implement_type], 100)
- prob_chance *= get_location_modifier(target)
-
- if(prob_chance > 100)//if we are using a super tool
- time = time/prob_chance //PLACEHOLDER VALUES
-
- if(do_after(user, time, target = target))
+ if(do_after(user, time * speed_mod, target = target))
+ var/advance = 0
+ var/prob_chance = 100
+ if(implement_type) //this means it isn't a require nd or any item step.
+ prob_chance = allowed_tools[implement_type]
+ prob_chance *= get_location_modifier(target)
if(prob(prob_chance) || isrobot(user))
if(end_step(user, target, target_zone, tool, surgery))
@@ -163,7 +163,7 @@
if(ishuman(target))
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(can_infect && affected)
- spread_germs_to_organ(affected, user)
+ spread_germs_to_organ(affected, user, tool)
if(ishuman(user) && !(istype(target,/mob/living/carbon/alien)) && prob(60))
var/mob/living/carbon/human/H = user
if(blood_level)
@@ -180,16 +180,45 @@
/datum/surgery_step/proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
return null
+/proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user, obj/item/tool)
+ if(!istype(user) || !istype(E))
+ return
-/proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user)
- if(!istype(user) || !istype(E)) return
-// to_chat(world, "Germ spread: [E] : [E.owner]")
var/germ_level = user.germ_level
+
+ //germ spread from surgeon touching the patient
if(user.gloves)
germ_level = user.gloves.germ_level
if(!(E.status & ORGAN_ROBOT)) //Germs on robotic limbs bad
E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no.
+ spread_germs_by_incision(E,tool)//germ spread from environement to patient
+/proc/spread_germs_by_incision(obj/item/organ/external/E,obj/item/tool)
+ if(!istype(E,/obj/item/organ/external))
+ return
+
+ var/germs = 0
+
+ for(var/mob/living/carbon/human/H in view(2, E.loc))//germs from people
+ if(AStar(E.loc, H.loc, /turf/proc/Distance, 2, simulated_only = 0))
+ if((!(NO_BREATH in H.mutations) || !(H.species.flags & NO_BREATH)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
+ germs+=H.germ_level/4
+
+ for(var/obj/effect/decal/cleanable/M in view(2, E.loc))//germs from messes
+ if(AStar(E.loc, M.loc, /turf/proc/Distance, 2, simulated_only = 0))
+ if(!istype(M,/obj/effect/decal/cleanable/dirt))//dirt is too common
+ germs++
+
+ if(tool.blood_DNA && tool.blood_DNA.len) //germs from blood-stained tools
+ germs += 30
+
+ if(E.internal_organs.len)
+ germs = germs / E.internal_organs.len
+ for(var/obj/item/organ/internal/O in E.internal_organs)
+ if(!(O.status & ORGAN_ROBOT))
+ O.germ_level += germs
+
+ E.germ_level += germs
/proc/sort_surgeries()
var/gap = surgery_steps.len
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 2e47438eb44..06b9def9c00 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -5,7 +5,7 @@
icon_state = "retractor"
materials = list(MAT_METAL=6000, MAT_GLASS=3000)
flags = CONDUCT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "materials=1;biotech=1"
@@ -16,7 +16,7 @@
icon_state = "hemostat"
materials = list(MAT_METAL=5000, MAT_GLASS=2500)
flags = CONDUCT
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "pinched")
@@ -28,7 +28,7 @@
icon_state = "cautery"
materials = list(MAT_METAL=2500, MAT_GLASS=750)
flags = CONDUCT
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=1"
attack_verb = list("burnt")
@@ -44,7 +44,7 @@
force = 15.0
sharp = 1
edge = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
@@ -59,11 +59,12 @@
desc = "Cut, cut, and once more cut."
icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel"
+ item_state = "scalpel"
flags = CONDUCT
force = 10.0
sharp = 1
edge = 1
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 5.0
throw_speed = 3
throw_range = 5
@@ -82,37 +83,36 @@
/*
* Researchable Scalpels
*/
-/obj/item/weapon/scalpel/laser1 //lasers also count as catuarys
+/obj/item/weapon/scalpel/laser //parent type
+ name = "laser scalpel"
+ desc = "A scalpel augmented with a directed laser."
+ icon_state = "scalpel_laser1_on"
+ damtype = "fire"
+ hitsound = 'sound/weapons/sear.ogg'
+
+/obj/item/weapon/scalpel/laser/laser1 //lasers also count as catuarys
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser. This one looks basic and could be improved."
icon_state = "scalpel_laser1_on"
- item_state = "scalpel"
- damtype = "fire"
- hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.8
-/obj/item/weapon/scalpel/laser2
+/obj/item/weapon/scalpel/laser/laser2
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser. This one looks somewhat advanced."
icon_state = "scalpel_laser2_on"
- item_state = "scalpel"
- damtype = "fire"
- hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.6
-/obj/item/weapon/scalpel/laser3
+/obj/item/weapon/scalpel/laser/laser3
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser. This one looks to be the pinnacle of precision energy cutlery!"
icon_state = "scalpel_laser3_on"
- item_state = "scalpel"
- damtype = "fire"
- hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.4
-/obj/item/weapon/scalpel/manager //super tool! Retractor/hemostat
+/obj/item/weapon/scalpel/laser/manager //super tool! Retractor/hemostat
name = "incision management system"
desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
icon_state = "scalpel_manager_on"
- item_state = "scalpel"
- damtype = "fire"
- hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.2
/obj/item/weapon/circular_saw
name = "circular saw"
@@ -124,7 +124,7 @@
force = 15.0
sharp = 1
edge = 1
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throwforce = 9.0
throw_speed = 3
throw_range = 5
@@ -138,7 +138,7 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "bone-gel"
force = 0
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
throwforce = 1.0
origin_tech = "materials=1;biotech=1"
@@ -149,7 +149,7 @@
force = 0
throwforce = 1.0
origin_tech = "materials=1;biotech=1"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/bonesetter
name = "bone setter"
@@ -159,7 +159,7 @@
throwforce = 9.0
throw_speed = 3
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "hit", "bludgeoned")
origin_tech = "materials=1;biotech=1"
@@ -168,6 +168,6 @@
desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control."
icon = 'icons/obj/surgery.dmi'
icon_state = "surgical_drapes"
- w_class = 1
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "biotech=1"
attack_verb = list("slapped")
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index a2ee8cc85ca..d6cdd0e3b5d 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -4,11 +4,13 @@
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
icon = 'icons/obj/telescience.dmi'
icon_state = "bluespace_crystal"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "bluespace=4;materials=3"
points = 50
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
refined_type = /obj/item/stack/sheet/bluespace_crystal
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/weapon/ore/bluespace_crystal/New()
..()
@@ -58,6 +60,8 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st
desc = "A stable polycrystal, made of fused-together bluespace crystals. You could probably break one off."
origin_tech = "bluespace=4;materials=3"
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/stack/sheet/bluespace_crystal/New()
..()
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index 2d99a538244..b042453eec4 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -4,12 +4,13 @@ var/list/GPS_list = list()
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
icon_state = "gps-c"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "programming=2;engineering=2"
var/gpstag = "COM0"
var/emped = 0
var/turf/locked_location
+ var/tracking = TRUE
/obj/item/device/gps/New()
..()
@@ -25,12 +26,31 @@ var/list/GPS_list = list()
emped = 1
overlays -= "working"
overlays += "emp"
- spawn(300)
- emped = 0
- overlays -= "emp"
+ addtimer(src, "reboot", 300)
+
+/obj/item/device/gps/proc/reboot()
+ emped = FALSE
+ overlays -= "emp"
+ overlays += "working"
+
+/obj/item/device/gps/AltClick(mob/user)
+ if(CanUseTopic(user, inventory_state) != STATUS_INTERACTIVE)
+ return 1 //user not valid to use gps
+ if(emped)
+ to_chat(user, "It's busted! ")
+ if(tracking)
+ overlays -= "working"
+ to_chat(user, "[src] is no longer tracking, or visible to other GPS devices.")
+ tracking = FALSE
+ else
overlays += "working"
+ to_chat(user, "[src] is now tracking, and visible to other GPS devices.")
+ tracking = TRUE
/obj/item/device/gps/attack_self(mob/user as mob)
+ if(!tracking)
+ to_chat(user, "[src] is turned off. Use alt+click to toggle it back on. ")
+ return
var/obj/item/device/gps/t = ""
var/gps_window_height = 110 + GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show
@@ -49,8 +69,10 @@ var/list/GPS_list = list()
var/tracked_gpstag = G.gpstag
if(G.emped == 1)
t += " [tracked_gpstag]: ERROR"
- else
+ else if(G.tracking)
t += " [tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])"
+ else
+ continue
var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800))
popup.set_content(t)
@@ -58,9 +80,14 @@ var/list/GPS_list = list()
popup.open()
/obj/item/device/gps/Topic(href, href_list)
- ..()
+ if(..(state = inventory_state))
+ return 1
+
if(href_list["tag"] )
- var/a = input("Please enter desired tag.", name, gpstag) as text
+ var/a = input("Please enter desired tag.", name, gpstag) as text|null
+ if(!a || ..(state = inventory_state))
+ return 1
+
a = uppertext(sanitize(copytext(a, 1, 5)))
if(src.loc == usr)
gpstag = a
@@ -84,4 +111,55 @@ var/list/GPS_list = list()
icon_state = "gps-b"
gpstag = "BORG0"
desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
- flags = NODROP
\ No newline at end of file
+ flags = NODROP
+
+/obj/item/device/gps/internal
+ icon_state = null
+ flags = ABSTRACT
+ gpstag = "Eerie Signal"
+ desc = "Report to a coder immediately."
+ invisibility = INVISIBILITY_MAXIMUM
+
+/obj/item/device/gps/internal/mining
+ icon_state = "gps-m"
+ gpstag = "MINER"
+ desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
+
+/obj/item/device/gps/internal/base
+ gpstag = "NT_AUX"
+ desc = "A homing signal from Nanotrasen's mining base."
+
+/obj/item/device/gps/visible_debug
+ name = "visible GPS"
+ gpstag = "ADMIN"
+ desc = "This admin-spawn GPS unit leaves the coordinates visible \
+ on any turf that it passes over, for debugging. Especially useful \
+ for marking the area around the transition edges."
+ var/list/turf/tagged
+
+/obj/item/device/gps/visible_debug/New()
+ . = ..()
+ tagged = list()
+ fast_processing.Add(src)
+
+/obj/item/device/gps/visible_debug/process()
+ var/turf/T = get_turf(src)
+ if(T)
+ // I assume it's faster to color,tag and OR the turf in, rather
+ // then checking if its there
+ T.color = RANDOM_COLOUR
+ T.maptext = "[T.x],[T.y],[T.z]"
+ tagged |= T
+
+/obj/item/device/gps/visible_debug/proc/clear()
+ while(tagged.len)
+ var/turf/T = pop(tagged)
+ T.color = initial(T.color)
+ T.maptext = initial(T.maptext)
+
+/obj/item/device/gps/visible_debug/Destroy()
+ if(tagged)
+ clear()
+ tagged = null
+ fast_processing.Remove(src)
+ . = ..()
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 0f1f7c8f582..f8a177e413d 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -67,7 +67,7 @@
var/stage = 0
/obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, " The [src] can now be moved. ")
@@ -76,15 +76,15 @@
to_chat(user, " The [src] is now secured. ")
if(istype(W, /obj/item/weapon/screwdriver))
if(stage == 0)
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
to_chat(user, " You unscrew the telepad's tracking beacon. ")
stage = 1
else if(stage == 1)
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
to_chat(user, " You screw in the telepad's tracking beacon. ")
stage = 0
if(istype(W, /obj/item/weapon/weldingtool) && stage == 1)
- playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
to_chat(user, " You disassemble the telepad. ")
new /obj/item/stack/sheet/metal(get_turf(src))
new /obj/item/stack/sheet/glass(get_turf(src))
@@ -119,6 +119,8 @@
throwforce = 10.0
throw_speed = 2
throw_range = 5
+ toolspeed = 1
+ usesound = 'sound/machines/click.ogg'
var/obj/item/weapon/stock_parts/cell/high/rcell = null
var/obj/machinery/pad = null
var/mode = 0
@@ -126,7 +128,7 @@
var/rand_y = 0
var/emagged = 0
var/teleporting = 0
- var/chargecost = 1500
+ var/chargecost = 1000
/obj/item/weapon/rcs/New()
..()
@@ -138,9 +140,7 @@
to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.")
/obj/item/weapon/rcs/Destroy()
- if(rcell)
- qdel(rcell)
- rcell = null
+ QDEL_NULL(rcell)
return ..()
/obj/item/weapon/rcs/attack_self(mob/user)
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index b35968625e5..9caaee5187c 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -38,7 +38,7 @@
/obj/machinery/computer/telescience/Destroy()
eject()
if(inserted_gps)
- inserted_gps.loc = loc
+ inserted_gps.forceMove(loc)
inserted_gps = null
return ..()
@@ -80,10 +80,10 @@
/obj/machinery/computer/telescience/emag_act(user as mob)
if(!emagged)
- to_chat(user, "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!")
+ to_chat(user, "You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now! ")
emagged = 1
else
- to_chat(user, "\red The machine seems unaffected by the card swipe...")
+ to_chat(user, "The machine seems unaffected by the card swipe... ")
/obj/machinery/computer/telescience/attack_ai(mob/user)
src.attack_hand(user)
diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm
index 42b219bb92d..32b39bbe06f 100644
--- a/code/modules/tram/tram.dm
+++ b/code/modules/tram/tram.dm
@@ -255,7 +255,7 @@
if(prob(M.melee_damage_upper))
qdel(src)
src.visible_message("[M] has [M.attacktext] [src]! ")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ")
+ M.create_attack_log("attacked [src.name] ")
/obj/tram/bullet_act(var/obj/item/projectile/proj)
if(prob(proj.damage))
diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm
index 7d3f9084f5f..ab64ac1252d 100644
--- a/code/modules/vehicle/ambulance.dm
+++ b/code/modules/vehicle/ambulance.dm
@@ -31,6 +31,8 @@
/obj/vehicle/ambulance/Move(newloc, Dir)
var/oldloc = loc
+ if(bed && !Adjacent(bed))
+ bed = null
. = ..()
if(bed && get_dist(oldloc, loc) <= 2)
bed.Move(oldloc)
diff --git a/code/modules/vehicle/atv.dm b/code/modules/vehicle/atv.dm
index d4a843b80bf..a67310c8874 100644
--- a/code/modules/vehicle/atv.dm
+++ b/code/modules/vehicle/atv.dm
@@ -9,45 +9,39 @@
vehicle_move_delay = 1
var/static/image/atvcover = null
-
/obj/vehicle/atv/New()
..()
if(!atvcover)
atvcover = image("icons/vehicles/4wheeler.dmi", "4wheeler_north")
atvcover.layer = MOB_LAYER + 0.1
-
-obj/vehicle/atv/post_buckle_mob(mob/living/M)
+/obj/vehicle/atv/post_buckle_mob(mob/living/M)
if(buckled_mob)
overlays += atvcover
else
overlays -= atvcover
-
/obj/vehicle/atv/handle_vehicle_layer()
if(dir == SOUTH)
layer = MOB_LAYER+0.1
else
layer = OBJ_LAYER
-
//TURRETS!
/obj/vehicle/atv/turret
- var/obj/machinery/gun_turret/vehicle_turret/turret = null
+ var/obj/machinery/porta_turret/syndicate/vehicle_turret/turret = null
-
-/obj/machinery/gun_turret/vehicle_turret
+/obj/machinery/porta_turret/syndicate/vehicle_turret
name = "mounted turret"
scan_range = 7
+ emp_vulnerable = 1
density = 0
-
/obj/vehicle/atv/turret/New()
..()
turret = new(loc)
//turret.base = src
-
/obj/vehicle/atv/turret/handle_vehicle_layer()
if(dir == SOUTH)
layer = MOB_LAYER+0.1
@@ -60,7 +54,6 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M)
else
turret.layer = OBJ_LAYER
-
/obj/vehicle/atv/turret/handle_vehicle_offsets()
..()
if(turret)
diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm
index edfa68f2dbd..bdd8ca39c90 100644
--- a/code/modules/vehicle/vehicle.dm
+++ b/code/modules/vehicle/vehicle.dm
@@ -16,6 +16,7 @@
//Pixels
var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver
var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver
+ var/spaceworthy = FALSE
/obj/vehicle/New()
@@ -60,7 +61,7 @@
desc = "A small grey key."
icon = 'icons/obj/vehicles.dmi'
icon_state = "key"
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
//BUCKLE HOOKS
@@ -130,6 +131,8 @@
/obj/vehicle/Bump(atom/movable/M)
+ if(!spaceworthy && isspaceturf(get_turf(src)))
+ return 0
. = ..()
if(auto_door_open)
if(istype(M, /obj/machinery/door) && buckled_mob)
@@ -153,6 +156,7 @@
/obj/vehicle/space
pressure_resistance = INFINITY
+ spaceworthy = TRUE
/obj/vehicle/space/Process_Spacemove(direction)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/vr/vr_avatar.dm b/code/modules/vr/vr_avatar.dm
new file mode 100644
index 00000000000..510871fb40a
--- /dev/null
+++ b/code/modules/vr/vr_avatar.dm
@@ -0,0 +1,87 @@
+
+
+/mob/living/carbon/human/virtual_reality
+ var/mob/living/carbon/human/real_me //The human controlling us, can be any human (including virtual ones... inception...)
+ var/datum/action/quit_vr/quit_action
+ var/datum/action/back_to_lobby/back_to_lobby
+ var/datum/action/detach_from_avatar/detach_from_avatar
+
+/mob/living/carbon/human/virtual_reality/New()
+ quit_action = new()
+ quit_action.Grant(src)
+ back_to_lobby = new()
+ back_to_lobby.Grant(src)
+ detach_from_avatar = new()
+ detach_from_avatar.Grant(src)
+ ..()
+
+/mob/living/carbon/human/virtual_reality/death()
+ return_to_lobby()
+ return ..()
+
+/mob/living/carbon/human/virtual_reality/Destroy()
+ return_to_lobby()
+ return ..()
+
+/mob/living/carbon/human/virtual_reality/ghost()
+ set category = "OOC"
+ set name = "Ghost"
+ set desc = "Relinquish your life and enter the land of the dead."
+ var/mob/living/carbon/human/H = real_me
+ revert_to_reality(FALSE)
+ if(H)
+ H.ghost()
+ qdel(src)
+
+/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(remove = 0)
+ if(real_me && mind)
+ mind.transfer_to(real_me)
+ real_me.EyeBlind(2)
+ real_me.Confused(2)
+ if(remove)
+ qdel(src)
+ else
+ return src
+
+/mob/living/carbon/human/virtual_reality/proc/return_to_lobby()
+ if(real_me && mind)
+ var/mob/living/carbon/human/virtual_reality/new_vr
+ new_vr = spawn_vr_avatar(src, "Lobby")
+ var/obj/item/clothing/glasses/vr_goggles/g = new_vr.real_me.glasses
+ g.vr_human = new_vr
+ qdel(src)
+
+/datum/action/quit_vr
+ name = "Quit Virtual Reality"
+
+/datum/action/quit_vr/Trigger()
+ if(..())
+ if(istype(owner, /mob/living/carbon/human/virtual_reality))
+ var/mob/living/carbon/human/virtual_reality/vr = owner
+ vr.revert_to_reality(1)
+ else
+ Remove(owner)
+
+/datum/action/back_to_lobby
+ name = "Return To Lobby"
+
+/datum/action/back_to_lobby/Trigger()
+ if(..())
+ if(istype(owner, /mob/living/carbon/human/virtual_reality))
+ var/mob/living/carbon/human/virtual_reality/vr = owner
+ vr.return_to_lobby()
+ else
+ Remove(owner)
+
+/datum/action/detach_from_avatar
+ name = "Detach From Avatar"
+
+/datum/action/detach_from_avatar/Trigger()
+ if(..())
+ if(istype(owner, /mob/living/carbon/human/virtual_reality))
+ var/mob/living/carbon/human/virtual_reality/vr = owner
+ var/obj/item/clothing/glasses/vr_goggles/g = vr.real_me.glasses
+ g.vr_human = vr
+ vr.revert_to_reality(0)
+ else
+ Remove(owner)
diff --git a/code/modules/vr/vr_controller.dm b/code/modules/vr/vr_controller.dm
new file mode 100644
index 00000000000..45bf2a6cc74
--- /dev/null
+++ b/code/modules/vr/vr_controller.dm
@@ -0,0 +1,63 @@
+//Control file with the backbone for the vr rooms and avatars
+
+var/datum/vr_rooms = list()
+var/roomcap = 20
+
+/datum/vr_room
+ var/name = null
+ var/datum/map_template/vr/template = null
+ var/datum/space_chunk/chunk = null
+ var/list/spawn_points = list()
+ var/expires = 1
+
+proc/make_vr_room(name, template, expires)
+ var/datum/vr_room/R = new
+ R.name = name
+ R.template = template
+ R.template = vr_templates[R.template]
+ R.chunk = space_manager.allocate_space(R.template.width, R.template.height)
+ R.expires = expires
+ vr_rooms[R.name] = R
+ R.template.load(locate(R.chunk.x,R.chunk.y,R.chunk.zpos), centered = FALSE)
+
+ for(var/atom/landmark in R.chunk.search_chunk(landmarks_list))
+ if(landmark.name == "avatarspawn")
+ R.spawn_points.Add(landmark)
+
+//Control code for the avatars
+proc/build_virtual_avatar(mob/living/carbon/human/H, location, datum/map_template/vr/level/template)
+ if(!location)
+ return
+ var/mob/living/carbon/human/virtual_reality/vr_avatar
+ location = get_turf(location)
+ vr_avatar = new /mob/living/carbon/human/virtual_reality(location)
+ vr_avatar.set_species(H.species.name)
+ if(istype(H, /mob/living/carbon/human/virtual_reality))
+ var/mob/living/carbon/human/virtual_reality/V = H
+ vr_avatar.real_me = V.real_me
+ else
+ vr_avatar.real_me = H
+ vr_avatar.dna = H.dna.Clone()
+ vr_avatar.name = H.name
+ vr_avatar.real_name = H.real_name
+ vr_avatar.undershirt = H.undershirt
+ vr_avatar.underwear = H.underwear
+ vr_avatar.UpdateAppearance()
+ vr_avatar.equipOutfit(template.outfit)
+ return vr_avatar
+
+proc/control_remote(mob/living/carbon/human/H, mob/living/carbon/human/virtual_reality/vr_avatar)
+ if(H.mind)
+ H.mind.transfer_to(vr_avatar)
+
+proc/spawn_vr_avatar(mob/living/carbon/human/H, datum/vr_room/room)
+ room = vr_rooms[room]
+ var/mob/living/carbon/human/virtual_reality/vr_human
+ vr_human = build_virtual_avatar(H, pick(room.spawn_points), room.template)
+ control_remote(H, vr_human)
+ return vr_human
+
+//Preloaded rooms
+/hook/roundstart/proc/starting_levels()
+ make_vr_room("Lobby", "lobby", 0)
+ return 1
\ No newline at end of file
diff --git a/code/modules/vr/vr_goggles.dm b/code/modules/vr/vr_goggles.dm
new file mode 100644
index 00000000000..c2a185b0ffa
--- /dev/null
+++ b/code/modules/vr/vr_goggles.dm
@@ -0,0 +1,41 @@
+//Glorified teleporter that puts you in a new human body.
+// it's """VR"""
+
+/obj/item/clothing/glasses/vr_goggles
+ desc = "A long time ago, people used these glasses to makes images from screens threedimensional."
+ name = "3D glasses"
+ icon_state = "3d"
+ item_state = "3d"
+ prescription_upgradable = 0
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/eyes.dmi'
+ )
+
+ var/you_die_in_the_game_you_die_for_real = FALSE
+ var/mob/living/carbon/human/virtual_reality/vr_human
+
+
+/obj/item/clothing/glasses/vr_goggles/Destroy()
+ ..()
+ vr_human.revert_to_reality(1)
+ cleanup_vr_avatar()
+
+/obj/item/clothing/glasses/vr_goggles/dropped()
+ ..()
+ if(vr_human)
+ vr_human.revert_to_reality(0)
+
+/obj/item/clothing/glasses/vr_goggles/proc/cleanup_vr_avatar()
+ if(vr_human)
+ vr_human = null
+
+/obj/item/clothing/glasses/vr_goggles/equipped()
+ ..()
+ var/mob/living/carbon/human/H = loc
+ spawn(1)
+ if(H.glasses == src)
+ if(vr_human == null)
+ vr_human = spawn_vr_avatar(H, "Lobby")
+ else
+ control_remote(H, vr_human)
\ No newline at end of file
diff --git a/code/modules/vr/vr_outfits.dm b/code/modules/vr/vr_outfits.dm
new file mode 100644
index 00000000000..4f673fd4e8c
--- /dev/null
+++ b/code/modules/vr/vr_outfits.dm
@@ -0,0 +1,15 @@
+//place all the outfits for your levels in here.
+
+/datum/outfit/vr/vr_basic
+ name = "basic vr"
+ uniform = /obj/item/clothing/under/psysuit
+ shoes = /obj/item/clothing/shoes/black
+
+/datum/outfit/vr/roman
+ name = "roman"
+ uniform = /obj/item/clothing/under/roman
+ shoes = /obj/item/clothing/shoes/roman
+ l_hand = /obj/item/weapon/shield/riot/roman
+ r_hand = /obj/item/weapon/twohanded/spear
+ head = /obj/item/clothing/head/helmet/roman
+ back = /obj/item/weapon/twohanded/spear
\ No newline at end of file
diff --git a/code/world.dm b/code/world.dm
index 08430bc0475..ebf4865a1a8 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -49,7 +49,6 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
. = ..()
- plant_controller = new()
// Create robolimbs for chargen.
populate_robolimb_list()
@@ -262,7 +261,15 @@ var/world_topic_spam_protect_time = world.timeofday
log_admin("[key_name(usr)] has requested an immediate world restart via client side debugging tools")
spawn(0)
to_chat(world, "Rebooting world immediately due to host request ")
- return ..(1)
+ if(config && config.shutdown_on_reboot)
+ sleep(0)
+ if(shutdown_shell_command)
+ shell(shutdown_shell_command)
+ del(world)
+ return
+ else
+ return ..(1)
+
var/delay
if(!isnull(time))
delay = max(0,time)
@@ -272,6 +279,13 @@ var/world_topic_spam_protect_time = world.timeofday
to_chat(world, "An admin has delayed the round end. ")
return
to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason] ")
+
+ var/round_end_sound = pick(round_end_sounds)
+ var/sound_length = round_end_sounds[round_end_sound]
+ if(delay > sound_length) // If there's time, play the round-end sound before rebooting
+ spawn(delay - sound_length)
+ if(!ticker.delay_end)
+ world << round_end_sound
sleep(delay)
if(blackbox)
blackbox.save_all_data_to_sql()
@@ -282,16 +296,19 @@ var/world_topic_spam_protect_time = world.timeofday
log_game("Rebooting world. [reason] ")
//kick_clients_in_lobby("The round came to an end with you in the lobby. ", 1)
- spawn(0)
- world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg', 'sound/goonstation/misc/newround1.ogg', 'sound/goonstation/misc/newround2.ogg'))// random end sounds!! - LastyBatsy
-
-
processScheduler.stop()
- for(var/client/C in clients)
- if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
- C << link("byond://[config.server]")
- ..(0)
+ if(config && config.shutdown_on_reboot)
+ sleep(0)
+ if(shutdown_shell_command)
+ shell(shutdown_shell_command)
+ del(world)
+ return
+ else
+ for(var/client/C in clients)
+ if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
+ C << link("byond://[config.server]")
+ ..(0)
#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.)
/world/proc/KickInactiveClients()
@@ -310,7 +327,7 @@ var/world_topic_spam_protect_time = world.timeofday
if(C.is_afk(INACTIVITY_KICK))
if(!istype(C.mob, /mob/dead))
log_access("AFK: [key_name(C)]")
- to_chat(C, "\red You have been inactive for more than 10 minutes and have been disconnected.")
+ to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected. ")
del(C)
if( ((world.timeofday - sleep_check) > work_length) || ((world.timeofday - sleep_check) < 0) )
sleep(sleep_length)
diff --git a/config/example/admin_ranks.txt b/config/example/admin_ranks.txt
index db2118ee8b7..c7d1cccef98 100644
--- a/config/example/admin_ranks.txt
+++ b/config/example/admin_ranks.txt
@@ -8,36 +8,36 @@
# Ranks with no keywords will just be given the most basic verbs and abilities #
########################################################################################
# KEYWORDS:
-# +ADMIN = General admin tools and verbs.
-# +FUN = Events and other event-orientated actions.
-# +BAN = The ability to ban and jobban.
-# +STEALTH = The ability to stealthmin (make yourself appear with a fake name to everyone but other admins).
-# +POSSESS = The ability to possess objects.
-# +REJUV (or +REJUVINATE) = The ability to heal, respawn, modify damage and use godmode.
-# +BUILD (or +BUILDMODE) = The ability to use buildmode.
-# +SERVER = Higher-risk admin verbs and abilities, such as those which affect the server configuration.
-# +DEBUG = Debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server.
-# +VAREDIT = Allows you to actually modify variables in the view variables window.
-# +RIGHTS (or +PERMISSIONS) = Allows you to promote and demote people.
-# +SOUND (or +SOUNDS) = Allows you to upload and play sounds.
-# +SPAWN (or +CREATE) = Mob transformations, spawning of most atoms including mobs (high-risk atoms will require the +FUN flag too).
-# +PROCCALL = The ability to call any proc on any entity.
-# +MOD = Low level admin abilities.
-# +MENTOR = The ability to answer questions.
-# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag.
-
+# +MENTOR = Access only to the Question's Ahelp and has little way of metagaming the game.
+# +ADMIN = general admin tools, verbs etc
+# +FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel.
+# +BAN = the ability to ban, jobban and fullban
+# +STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins
+# +POSSESS = the ability to possess objects
+# +REJUV (or +REJUVINATE) = the ability to heal, respawn, modify damage and use godmode
+# +BUILD (or +BUILDMODE) = the ability to use buildmode
+# +SERVER = higher-risk admin verbs and abilities, such as those which affect the server configuration.
+# +DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server.
+# +VAREDIT = everyone may view viewvars/debugvars/whatever you call it. This keyword allows you to actually EDIT those variables.
+# +RIGHTS (or +PERMISSIONS) = allows you to promote and/or demote people.
+# +SOUND (or +SOUNDS) = allows you to upload and play sounds
+# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
+# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
+
+# Admin Ranks
Admin Observer
-Mentor +MENTOR
-Moderator +MOD
+Mentor +MENTOR
+Moderator +MOD
+Trial Admin +ADMIN +BAN +DEBUG +REJUVINATE
+Game Admin +ADMIN +BAN +DEBUG +REJUVINATE +BUILDMODE +EVENT +SERVER +POSSESS +STEALTH +VAREDIT +SOUND +SPAWN
+Senior Admin +ADMIN +BAN +DEBUG +REJUVINATE +BUILDMODE +EVENT +SERVER +POSSESS +STEALTH +VAREDIT +SOUND +SPAWN
+Retired Admin +ADMIN +BAN +STEALTH +VAREDIT +SPAWN
+Head of Staff +EVERYTHING
-Admin Candidate +ADMIN
-Trial Admin +@ +SPAWN +REJUV +VAREDIT +BAN
-Badmin +@ +POSSESS +BUILDMODE +SERVER +FUN
-Game Admin +@ +STEALTH +SOUNDS +DEBUG +PERMISSIONS
-Game Master +EVERYTHING
-Head Admin +EVERYTHING
-Retired Admin +ADMIN +STEALTH
-
-Host +EVERYTHING
-
-Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE
\ No newline at end of file
+Hosting Provider +EVERYTHING
+
+# Coder Ranks
+Trial Coder +ADMIN +VAREDIT +REJUVINATE +DEBUG
+Coders +ADMIN +VAREDIT +REJUVINATE +DEBUG +BUILDMODE +EVENT +SERVER +POSSESS +STEALTH +SOUND +SPAWN
+Retired Coder +ADMIN +VAREDIT +REJUVINATE +DEBUG +BUILDMODE +EVENT +SERVER +POSSESS +STEALTH +SOUND +SPAWN +BAN
+Maintainers +EVERYTHING
\ No newline at end of file
diff --git a/config/example/away_mission_config.txt b/config/example/away_mission_config.txt
index f440c9a231a..d06e581e04b 100644
--- a/config/example/away_mission_config.txt
+++ b/config/example/away_mission_config.txt
@@ -10,9 +10,7 @@
#===================================#
# BROKEN / INCOMPLETE AWAY MISSIONS #
#===================================#
-#_maps/map_files/RandomZLevels/challenge.dmm
#_maps/map_files/RandomZLevels/centcomAway.dmm
-#_maps/map_files/RandomZLevels/clownplanet.dmm
#_maps/map_files/RandomZLevels/example.dmm
#_maps/map_files/RandomZLevels/spacebattle.dmm
#_maps/map_files/RandomZLevels/stationCollision.dmm
@@ -20,14 +18,15 @@
#===================================#
# USABLE AWAY MISSIONS #
#===================================#
+
_maps/map_files/RandomZLevels/beach.dmm
-_maps/map_files/RandomZLevels/listeningpost.dmm
_maps/map_files/RandomZLevels/moonoutpost19.dmm
_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
_maps/map_files/RandomZLevels/academy.dmm
_maps/map_files/RandomZLevels/blackmarketpackers.dmm
_maps/map_files/RandomZLevels/spacehotel.dmm
_maps/map_files/RandomZLevels/wildwest.dmm
+_maps/map_files/RandomZLevels/terrorspiders.dmm
#===================================#
# SPECIAL AWAY MISSIONS #
diff --git a/config/example/config.txt b/config/example/config.txt
index 4a948a39c1c..5617b5ad039 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -77,24 +77,23 @@ KICK_INACTIVE
##
## default probablity is 1, increase to make that mode more likely to be picked
## set to 0 to disable that mode
+PROBABILITY EXTEND-A-TRAITORMONGOUS 3
+PROBABILITY TRAITORCHAN 3
+PROBABILITY TRAITORVAMP 3
+PROBABILITY REVOLUTION 0
+PROBABILITY SHADOWLING 2
+PROBABILITY CULT 4
+PROBABILITY CHANGELING 3
+PROBABILITY WIZARD 2
+PROBABILITY BLOB 1
+PROBABILITY RAGINMAGES 0
+PROBABILITY METEOR 0
+PROBABILITY HEIST 0
+PROBABILITY VAMPIRE 3
+PROBABILITY NATIONS 0
PROBABILITY EXTENDED 2
PROBABILITY NUCLEAR 3
PROBABILITY ABDUCTION 0
-PROBABILITY CHANGELING 3
-PROBABILITY CULT 4
-PROBABILITY EXTEND-A-TRAITORMONGOUS 5
-PROBABILITY TRAITORCHAN 4
-PROBABILITY TRAITORVAMP 4
-PROBABILITY BLOB 2
-PROBABILITY REVOLUTION 0
-PROBABILITY HEIST 1
-PROBABILITY WIZARD 2
-PROBABILITY VAMPIRE 3
-PROBABILITY RAGINMAGES 0
-PROBABILITY METEOR 0
-PROBABILITY TRAITOR 0
-PROBABILITY SHADOWLING 2
-PROBABILITY NATIONS 0
## Hash out to disable random events during the round.
ALLOW_RANDOM_EVENTS
@@ -203,12 +202,10 @@ LOAD_JOBS_FROM_TXT
## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR
ALLOW_HOLIDAYS
+
##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother.
TICKLAG 0.5
-## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered.
-TICKCOMP 1
-
## Whether the server will talk to other processes through socket_talk
SOCKET_TALK 0
@@ -286,7 +283,7 @@ EVENT_DELAY_UPPER 15;45;70
EVENT_CUSTOM_START_MAJOR 80;100
## Strength of ambient star light. Set to 0 or less to turn off.
-STARLIGHT 0
+STARLIGHT 2
## Player rerouting stuff
## If not 0, players can be rerouted to an overflow server after a certain cap is reached
@@ -325,3 +322,22 @@ DISABLE_SPACE_RUINS
# and still qualify for re-entering the round. Defaults to 30.
# Setting this to 0 will disable the penalty period
#ROUND_ABANDON_PENALTY_PERIOD 30
+
+## Hub address for tracking stats
+## example: Hubmakerckey.Hubname
+#MEDAL_HUB_ADDRESS
+
+## Password for the hub page
+#MEDAL_HUB_PASSWORD
+
+## Uncomment this if you want to disable usage of emoji in OOC
+#DISABLE_OOC_EMOJI
+
+## Uncomment this to shut down the world any time it would normally reboot
+#SHUTDOWN_ON_REBOOT
+## A command to run prior to the world shutting down, only used if the above option is enabled
+## This default value will kill Dream Daemon on Windows machines
+#SHUTDOWN_SHELL_COMMAND taskkill /f /im dreamdaemon.exe
+
+## Uncomment this to disable karma and unlock all karma purchases for players by default
+#DISABLE_KARMA
\ No newline at end of file
diff --git a/config/example/custom_sprites.txt b/config/example/custom_sprites.txt
index db3930a4ae2..471764270d4 100644
--- a/config/example/custom_sprites.txt
+++ b/config/example/custom_sprites.txt
@@ -1 +1,5 @@
-ckey-state
\ No newline at end of file
+Each entry should be composed of 2 parts, divided by a colon (:) with no spaces, in order to work. Failure to do so will result in that entry being disregarded by the code.
+- The first part should be either "cyborg", "ai", "hologram", "pai", or "drone". This tells the code what type of custom sprite this entry is for. The "ai" option is for AI core displays, while "hologram" is for AI hologram projections.
+- The second part should be the ckey of the player this entry is for. This tells the code who it works for and also is used to retrieve the proper sprite for them to use.
+
+example:example
\ No newline at end of file
diff --git a/config/example/game_options.txt b/config/example/game_options.txt
index 5d82bfb425d..549633d6a2d 100644
--- a/config/example/game_options.txt
+++ b/config/example/game_options.txt
@@ -38,17 +38,17 @@ REVIVAL_BRAIN_LIFE -1
## We suggest editing these variabled in-game to find a good speed for your server. To do this you must be a high level admin. Open the 'debug' tab ingame. Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name.
## These values get directly added to values and totals in-game. To speed things up make the number negative, to slow things down, make the number positive.
-## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied.
+## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied.
RUN_SPEED 1
WALK_SPEED 4
## The variables below affect the movement of specific mob types.
-HUMAN_DELAY 0
-ROBOT_DELAY 0
-MONKEY_DELAY 0
-ALIEN_DELAY 0
-METROID_DELAY 0
-ANIMAL_DELAY 0
+HUMAN_DELAY 1.5
+ROBOT_DELAY 1.5
+MONKEY_DELAY 1.5
+ALIEN_DELAY 1.5
+SLIME_DELAY 1.5
+ANIMAL_DELAY 1.5
## Comment for "normal" explosions, which ignore obstacles
## Uncomment for explosions that react to doors and walls
diff --git a/config/example/jobs.txt b/config/example/jobs.txt
index 060cf2d6a73..962803ab886 100644
--- a/config/example/jobs.txt
+++ b/config/example/jobs.txt
@@ -24,7 +24,7 @@ Shaft Miner=3
Warden=1
Detective=1
-Security Officer=5
+Security Officer=7
Assistant=-1
Atmospheric Technician=4
diff --git a/config/names/death_commando.txt b/config/names/death_commando.txt
index e3d1f34f327..fbb7a17e6f6 100644
--- a/config/names/death_commando.txt
+++ b/config/names/death_commando.txt
@@ -67,4 +67,4 @@ AMERICA
Toolboxl Rose
Zombie Gandhi
A whole bunch of spiders in a SWAT suit
-THAT DAMN FAGGOT TRAITOR GEORGE MELONS
\ No newline at end of file
+THAT DAMN TRAITOR GEORGE MELONS
\ No newline at end of file
diff --git a/config/title_screens/LICENSE.txt b/config/title_screens/LICENSE.txt
new file mode 100644
index 00000000000..831689b417c
--- /dev/null
+++ b/config/title_screens/LICENSE.txt
@@ -0,0 +1,38 @@
+---LICENSE NOTICE---
+
+The server operator(s) is responsible for the copyright status of all images placed within the /config/title_screens/images folder unless otherwise noted.
+
+If an image requires attribution and/or a specific license it is up to the operator(s) to make this information publicly available on either
+a website associated with their server or on the server itself.
+
+If operators(s) allow these configuration files to be public this file can serve that purpose by keeping it properly updated.
+
+If in the future new images are published to these folders (i.e. in an online code repository) they must explicitly state their
+license if said license is not the same as the default licensing found in README.md in the root directory of the project.
+
+Do not remove this notice.
+
+---END NOTICE---
+
+
+
+
+---EXAMPLES (NOT PART OF ANY LICENSE)---
+
+These are examples of properly attrubuted and licensed images.
+They are not an actual part of any license under any circumstance.
+
+rare+foobar.png was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/).
+
+Unless otherwise noted all images were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/).
+
+---END EXAMPLES (NOT PART OF ANY LICENSE)---
+
+
+
+
+---ADD LICENSING INFORMATION BELOW---
+
+blank.png and default.dmi use the default licensing found in README.md in the root directory of the project.
+
+
diff --git a/config/title_screens/README.txt b/config/title_screens/README.txt
new file mode 100644
index 00000000000..6e7bf166f8f
--- /dev/null
+++ b/config/title_screens/README.txt
@@ -0,0 +1,50 @@
+The enclosed images folder holds the image files used as the title screen for the game. All common formats such as PNG, JPG, and GIF are supported.
+Byond's DMI format is also supported, but if you use a DMI only include one image per file and do not give it an icon_state (the text label below the image).
+
+Keep in mind that the area a title screen fills is a 480px square so you should scale/crop source images to these dimensions first.
+The game won't scale these images for you, so smaller images will not fill the screen and larger ones will be cut off.
+
+Using unnecessarily huge images can cause client side lag and should be avoided. Extremely large GIFs should preferentially be converted to DMIs.
+Placing non-image files in the images folder can cause errors.
+
+You may add as many title screens as you like, if there is more than one a random screen is chosen (see name conventions for specifics).
+
+---
+
+Naming Conventions:
+
+Every title screen you add must have a unique name. It is allowed to name two things the same if they have different file types, but this should be discouraged.
+Avoid using the plus sign "+" and the period "." in names, as these are used internally to classify images.
+
+
+Common Titles:
+
+Common titles are in the rotation to be displayed all the time. Any name that does not include the character "+" is considered a common title.
+
+An example of a common title name is "clown".
+
+The common title screen named "default" is special. It is only used if no other titles are available. You can overwrite "default" safely, but you
+should have a title named "default" somewhere in your DMI file if you don't have any other common titles. Because default only runs in the
+absence of other titles, if you want it to also appear in the general rotation you must rename it.
+
+The common title screen named "blank.png" is also special. It is only used to fill space while the real title screen loads. You should leave this file alone.
+
+
+Map Titles:
+
+Map titles are tied to a specific in game map. To make a map title you format the name like this "(name of a map)+(name of your title)"
+
+The spelling of the map name is important. It must match exactly the define MAP_NAME found in the relevant .DM file in the /_maps folder in
+the root directory. It can also be seen in game in the status menu. Note that there are no spaces between the two names.
+
+It is absolutely fine to have more than one title tied to the same map.
+
+An example of a map title name is "Omegastation+splash".
+
+
+Rare Titles:
+
+Rare titles are a just for fun feature where they will only have a 1% chance of appear in in the title screen pool of a given round.
+Add the phrase "rare+" to the beginning of the name. Again note there are no spaces. A title cannot be rare title and a map title at the same time.
+
+An example of a rare title name is "rare+explosion"
\ No newline at end of file
diff --git a/config/title_screens/images/blank.png b/config/title_screens/images/blank.png
new file mode 100644
index 00000000000..c3167a923bf
Binary files /dev/null and b/config/title_screens/images/blank.png differ
diff --git a/icons/misc/fullscreen.dmi b/config/title_screens/images/default.dmi
similarity index 100%
rename from icons/misc/fullscreen.dmi
rename to config/title_screens/images/default.dmi
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
index c5c0e8e93d2..113fb45df05 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -239,25 +239,26 @@ em {font-style: normal; font-weight: bold;}
.playerreply {color: #8800bb; font-weight: bold;}
.name { font-weight: bold;}
.say {}
+.yell { font-weight: bold;}
.siliconsay {font-family: 'Courier New', Courier, monospace;}
.deadsay {color: #5c00e6;}
-.radio {color: #008000;}
+.radio {color: #408010;}
.deptradio {color: #993399;}
-.comradio {color: #193A7A;}
-.syndradio {color: #6d3f40;}
+.comradio {color: #204090;}
+.syndradio {color: #6D3F40;}
.dsquadradio {color: #686868;}
.resteamradio {color: #18BC46;}
.airadio {color: #FF00FF;}
-.centradio {color: #5C5C8A;}
+.centradio {color: #5C5C7C;}
.secradio {color: #A30000;}
.engradio {color: #A66300;}
-.medradio {color: #008160;}
+.medradio {color: #009190;}
.sciradio {color: #993399;}
-.supradio {color: #5F4519;}
-.srvradio {color: #6eaa2c;}
+.supradio {color: #7F6539;}
+.srvradio {color: #80A000;}
.admin_channel {color: #9A04D1; font-weight: bold;}
.mentor_channel {color: #775BFF; font-weight: bold;}
-.mentor_channel_admin {color: #9A04D1; font-weight: bold;}
+.mentor_channel_admin {color: #A35CFF; font-weight: bold;}
.djradio {color: #663300;}
.binaryradio {color: #0B0050; font-family: 'Courier New', Courier, monospace;}
.mommiradio {color: navy;}
@@ -299,6 +300,7 @@ h1.alert, h2.alert {color: #000000;}
.confirm {color: #00af3b;}
.rose {color: #ff5050;}
.sans {font-family: 'Comic Sans MS', cursive, sans-serif;}
+.wingdings {font-family: Wingdings, Webdings;}
.ancient {color: #008B8B; font-stye: italic;}
.newscaster {color: #800000;}
.mod {color: #735638; font-weight: bold;}
@@ -323,8 +325,9 @@ h1.alert, h2.alert {color: #000000;}
.cult {color: #800080; font-weight: bold; font-style: italic;}
.cultspeech {color: #7F0000; font-style: italic;}
.cultitalic {color: #960000; font-style: italic;}
-.cultlarge {color: #960000; font-weight: bold; font-size: 3;}
-.narsie {color: #960000; font-weight: bold; font-size: 15;}
+.cultlarge {color: #960000; font-weight: bold; font-size: 120%;}
+.narsie {color: #960000; font-weight: bold; font-size: 300%;}
+.narsiesmall {color: #960000; font-weight: bold; font-size: 200%;}
.interface {color: #330033;}
.big {font-size: 150%;}
.reallybig {font-size: 175%;}
@@ -341,10 +344,10 @@ h1.alert, h2.alert {color: #000000;}
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
-.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;}
+.revenbignotice {color: #1d2953; font-weight: bold; font-size: 120%;}
.revenminor {color: #823abb}
.revenwarning {color: #760fbb; font-style: italic;}
-.revendanger {color: #760fbb; font-weight: bold; font-size: 3;}
+.revendanger {color: #760fbb; font-weight: bold; font-size: 120%;}
/* /vg/ */
.good {color: green;}
@@ -358,7 +361,7 @@ h1.alert, h2.alert {color: #000000;}
"}
.memo {color: #638500; text-align: center;}
-.memoedit {text-align: center; font-size: 2;}
+.memoedit {text-align: center; font-size: 75%;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
@@ -367,3 +370,11 @@ h1.alert, h2.alert {color: #000000;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
+
+/* MEGAFAUNA */
+.colossus {color: #7F282A; font-size: 175%;}
+.hierophant {color: #660099; font-weight: bold; font-size: 150%;}
+.hierophant_warning {color: #660099; font-weight: bold; font-style: italic;}
+
+/* EMOJI STUFF */
+.emoji {max-height: 16px; max-width: 16px}
diff --git a/goon/browserassets/html/adminOutput.html b/goon/browserassets/html/adminOutput.html
new file mode 100644
index 00000000000..baf8bc00b3b
--- /dev/null
+++ b/goon/browserassets/html/adminOutput.html
@@ -0,0 +1,104 @@
+
\ No newline at end of file
diff --git a/goon/browserassets/html/browserOutput.html b/goon/browserassets/html/browserOutput.html
index feaa5f0ecda..4bcd05f4cb0 100644
--- a/goon/browserassets/html/browserOutput.html
+++ b/goon/browserassets/html/browserOutput.html
@@ -16,6 +16,8 @@
+
+
@@ -29,8 +31,8 @@
Loading...
- If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times.
- If it still doesn't work, use the bug report button at the top right of the window.
+ If this takes longer than 10 seconds, it will automatically reload, multiple times if necessary.
+ If it still doesn't work, please adminhelp (F1) and tell us your operating system and Internet Explorer version.
diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js
index 2abf26079d8..88b9a5425af 100644
--- a/goon/browserassets/js/browserOutput.js
+++ b/goon/browserassets/js/browserOutput.js
@@ -62,7 +62,10 @@ var opts = {
'clientData': [],
// List of macros in the 'hotkeymode' macro set.
- 'macros': {}
+ 'macros': {},
+
+ // Emoji toggle
+ 'enableEmoji': true
};
function outerHTML(el) {
@@ -97,6 +100,32 @@ function linkify(text) {
});
}
+function emojiparse(el) {
+
+ if ((typeof UNICODE_9_EMOJI === 'undefined') || (typeof twemoji === 'undefined')) {
+ return; //something didn't load right, probably IE8
+ }
+
+ var $el = $(el);
+
+ var $emojiZone = $el.find(".emoji_enabled");
+
+ if ($emojiZone.length) {
+ $emojiZone.each(function () {
+ var html = $(this).html();
+ html = html.replace(/\:(.*?)\:/g, function (match, p1, offset, s) {
+ var unicode_entity = UNICODE_9_EMOJI[p1];
+ if (unicode_entity) {
+ return unicode_entity;
+ }
+ return match;
+ });
+ html = $.parseHTML(twemoji.parse(html, {size: "svg", ext: ".svg"}));
+ $(this).html(html);
+ });
+ }
+}
+
// Colorizes the highlight spans
function setHighlightColor(match) {
match.style.background = opts.highlightColor
@@ -127,6 +156,12 @@ function output(message, flag) {
if (flag !== 'internal')
opts.lastPang = Date.now();
+ // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8.
+ // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b.
+ // Marvelous.
+ message = message.replace(/\+/g, "%20");
+ message = decoder(message);
+
//The behemoth of filter-code (for Admin message filters)
//Note: This is proooobably hella inefficient
var filteredOut = false;
@@ -215,7 +250,7 @@ function output(message, flag) {
message = linkify(message);
}
- opts.messageCount++;
+ opts.messageCount++;
//Actually append the message
var entry = document.createElement('div');
@@ -227,6 +262,13 @@ function output(message, flag) {
}
entry.innerHTML = message;
+
+ // emoji!
+ if (opts.enableEmoji) {
+ emojiparse(entry);
+ }
+
+
$messages[0].appendChild(entry);
//Actually do the snap
@@ -240,6 +282,11 @@ function output(message, flag) {
}
}
+function internalOutput(message, flag)
+{
+ output(escaper(message), flag);
+}
+
//Runs a route within byond, client or server side. Consider this "ehjax" for byond.
function runByond(uri) {
window.location = uri;
@@ -339,7 +386,7 @@ function ehjaxCallback(data) {
$('#pingDot').css('color', '#'+hex);
} else if (data == 'roundrestart') {
opts.restarting = true;
- output('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal');
+ internalOutput('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal');
} else if (data == 'stopaudio') {
$('.dectalk').remove();
} else {
@@ -349,7 +396,7 @@ function ehjaxCallback(data) {
dataJ = $.parseJSON(data);
} catch (e) {
//But...incorrect :sadtrombone:
- window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327);
+ window.onerror('JSON: '+e+'. '+data+'; data.length = '+data.length, 'browserOutput.html', 327);
return;
}
data = dataJ;
@@ -374,9 +421,9 @@ function ehjaxCallback(data) {
changeMode(data.modeChange);
} else if (data.firebug) {
if (data.trigger) {
- output('
Loading firebug console, triggered by '+data.trigger+'... ', 'internal');
+ internalOutput('
Loading firebug console, triggered by '+data.trigger+'... ', 'internal');
} else {
- output('
Loading firebug console... ', 'internal');
+ internalOutput('
Loading firebug console... ', 'internal');
}
var firebugEl = document.createElement('script');
firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js';
@@ -387,7 +434,7 @@ function ehjaxCallback(data) {
message = '
'+
'
You hear a strange robotic voice... ' + message;
}
- output(message, 'preventLink');
+ internalOutput(message, 'preventLink');
}
}
}
@@ -451,7 +498,7 @@ $(function() {
if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam)
opts.noResponse = true;
opts.noResponseCount++;
- output('
You are either AFK, experiencing lag or the connection has closed.
', 'internal');
+ internalOutput('
You are either AFK, experiencing lag or the connection has closed.
', 'internal');
}
} else if (opts.noResponse) { //Previous ping attempt failed ohno
$('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!');
@@ -490,18 +537,18 @@ $(function() {
if (savedConfig.sfontSize) {
$messages.css('font-size', savedConfig.sfontSize);
- output('
Loaded font size setting of: '+savedConfig.sfontSize+' ', 'internal');
+ internalOutput('
Loaded font size setting of: '+savedConfig.sfontSize+' ', 'internal');
}
if (savedConfig.sfontType) {
$messages.css('font-family', savedConfig.sfontType);
- output('
Loaded font type setting of: '+savedConfig.sfontType+' ', 'internal');
+ internalOutput('
Loaded font type setting of: '+savedConfig.sfontType+' ', 'internal');
}
if (savedConfig.spingDisabled) {
if (savedConfig.spingDisabled == 'true') {
opts.pingDisabled = true;
$('#ping').hide();
}
- output('
Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+' ', 'internal');
+ internalOutput('
Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+' ', 'internal');
}
if (savedConfig.shighlightTerms) {
var savedTerms = $.parseJSON(savedConfig.shighlightTerms);
@@ -513,13 +560,13 @@ $(function() {
}
if (actualTerms) {
actualTerms = actualTerms.substring(0, actualTerms.length - 2);
- output('
Loaded highlight strings of: ' + actualTerms+' ', 'internal');
+ internalOutput('
Loaded highlight strings of: ' + actualTerms+' ', 'internal');
opts.highlightTerms = savedTerms;
}
}
if (savedConfig.shighlightColor) {
opts.highlightColor = savedConfig.shighlightColor;
- output('
Loaded highlight color of: '+savedConfig.shighlightColor+' ', 'internal');
+ internalOutput('
Loaded highlight color of: '+savedConfig.shighlightColor+' ', 'internal');
}
(function() {
@@ -606,14 +653,14 @@ $(function() {
}
e.preventDefault()
-
+
var k = e.which;
var command; // Command to execute through winset.
// Hardcoded because else there would be no feedback message.
if (k == 113) { // F2
runByond('byond://winset?screenshot=auto');
- output('Screenshot taken', 'internal');
+ internalOutput('Screenshot taken', 'internal');
}
var c = "";
@@ -747,7 +794,7 @@ $(function() {
fontSize = fontSize - 1 + 'px';
$messages.css({'font-size': fontSize});
setCookie('fontsize', fontSize, 365);
- output('
Font size set to '+fontSize+' ', 'internal');
+ internalOutput('
Font size set to '+fontSize+' ', 'internal');
});
$('#increaseFont').click(function(e) {
@@ -755,7 +802,7 @@ $(function() {
fontSize = fontSize + 1 + 'px';
$messages.css({'font-size': fontSize});
setCookie('fontsize', fontSize, 365);
- output('
Font size set to '+fontSize+' ', 'internal');
+ internalOutput('
Font size set to '+fontSize+' ', 'internal');
});
$('#chooseFont').click(function(e) {
@@ -821,7 +868,7 @@ $(function() {
$('#highlightTerm').click(function(e) {
if(!($().mark)) {
- output('
Highlighting is disabled. You are probably using Internet Explorer 8 and need to update. ', 'internal');
+ internalOutput('
Highlighting is disabled. You are probably using Internet Explorer 8 and need to update. ', 'internal');
return;
}
if ($('.popup .highlightTerm').is(':visible')) {return;}
diff --git a/goon/browserassets/js/twemoji.min.js b/goon/browserassets/js/twemoji.min.js
new file mode 100644
index 00000000000..b6f0f3eda50
--- /dev/null
+++ b/goon/browserassets/js/twemoji.min.js
@@ -0,0 +1,2 @@
+/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */
+var twemoji=function(){"use strict";var twemoji={base:"https://twemoji.maxcdn.com/2/",ext:".png",size:"72x72",className:"emoji",convert:{fromCodePoint:fromCodePoint,toCodePoint:toCodePoint},onerror:function onerror(){if(this.parentNode){this.parentNode.replaceChild(createText(this.alt),this)}},parse:parse,replace:replace,test:test},escaper={"&":"&","<":"<",">":">","'":"'",'"':"""},re=/\ud83d[\udc68-\udc69](?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92])|(?:\ud83c[\udfcb\udfcc]|\ud83d\udd75|\u26f9)(?:\ufe0f|\ud83c[\udffb-\udfff])\u200d[\u2640\u2642]\ufe0f|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd37-\udd39\udd3d\udd3e])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|(?:[\u0023\u002a\u0030-\u0039])\ufe0f?\u20e3|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd18-\udd1c\udd1e\udd26\udd30\udd33-\udd39\udd3d\udd3e]|[\u270a\u270b])(?:\ud83c[\udffb-\udfff]|)|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud800\udc00|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a-\udc6d\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\udeeb\udeec\udef4-\udef6]|\ud83e[\udd10-\udd17\udd1d\udd20-\udd25\udd27\udd3a\udd3c\udd40-\udd45\udd47-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|[\u23e9-\u23ec\u23f0\u23f3\u2640\u2642\u2695\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a]|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u00a9\u00ae\u203c\u2049\u2122\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2694\u2696\u2697\u2699\u269b\u269c\u26a0\u26a1\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))/g,UFE0Fg=/\uFE0F/g,U200D=String.fromCharCode(8205),rescaper=/[&<>'"]/g,shouldntBeParsed=/IFRAME|NOFRAMES|NOSCRIPT|SCRIPT|SELECT|STYLE|TEXTAREA|[a-z]/,fromCharCode=String.fromCharCode;return twemoji;function createText(text){return document.createTextNode(text)}function escapeHTML(s){return s.replace(rescaper,replacer)}function defaultImageSrcGenerator(icon,options){return"".concat(options.base,options.size,"/",icon,options.ext)}function grabAllTextNodes(node,allText){var childNodes=node.childNodes,length=childNodes.length,subnode,nodeType;while(length--){subnode=childNodes[length];nodeType=subnode.nodeType;if(nodeType===3){allText.push(subnode)}else if(nodeType===1&&!shouldntBeParsed.test(subnode.nodeName)){grabAllTextNodes(subnode,allText)}}return allText}function grabTheRightIcon(rawText){return toCodePoint(rawText.indexOf(U200D)<0?rawText.replace(UFE0Fg,""):rawText)}function parseNode(node,options){var allText=grabAllTextNodes(node,[]),length=allText.length,attrib,attrname,modified,fragment,subnode,text,match,i,index,img,rawText,iconId,src;while(length--){modified=false;fragment=document.createDocumentFragment();subnode=allText[length];text=subnode.nodeValue;i=0;while(match=re.exec(text)){index=match.index;if(index!==i){fragment.appendChild(createText(text.slice(i,index)))}rawText=match[0];iconId=grabTheRightIcon(rawText);i=index+rawText.length;src=options.callback(iconId,options);if(src){img=new Image;img.onerror=options.onerror;img.setAttribute("draggable","false");attrib=options.attributes(rawText,iconId);for(attrname in attrib){if(attrib.hasOwnProperty(attrname)&&attrname.indexOf("on")!==0&&!img.hasAttribute(attrname)){img.setAttribute(attrname,attrib[attrname])}}img.className=options.className;img.alt=rawText;img.src=src;modified=true;fragment.appendChild(img)}if(!img)fragment.appendChild(createText(rawText));img=null}if(modified){if(i
")}return ret})}function replacer(m){return escaper[m]}function returnNull(){return null}function toSizeSquaredAsset(value){return typeof value==="number"?value+"x"+value:value}function fromCodePoint(codepoint){var code=typeof codepoint==="string"?parseInt(codepoint,16):codepoint;if(code<65536){return fromCharCode(code)}code-=65536;return fromCharCode(55296+(code>>10),56320+(code&1023))}function parse(what,how){if(!how||typeof how==="function"){how={callback:how}}return(typeof what==="string"?parseString:parseNode)(what,{callback:how.callback||defaultImageSrcGenerator,attributes:typeof how.attributes==="function"?how.attributes:returnNull,base:typeof how.base==="string"?how.base:twemoji.base,ext:how.ext||twemoji.ext,size:how.folder||toSizeSquaredAsset(how.size||twemoji.size),className:how.className||twemoji.className,onerror:how.onerror||twemoji.onerror})}function replace(text,callback){return String(text).replace(re,callback)}function test(text){re.lastIndex=0;var result=re.test(text);re.lastIndex=0;return result}function toCodePoint(unicodeSurrogates,sep){var r=[],c=0,p=0,i=0;while(i
+
31 May 2017
+
FalseIncarnate updated:
+
+ Shrimp and electric eels properly lay their own eggs again if they have a suitable partner.
+
+
Xantholne updated:
+
+ Virologists actually spawn with their skirt
+ Coroner now can finally spawn with some Medical loadout clothes.
+ Medical Doctors will stop spawning with Chemist/Virologist Skirts
+ CMOs won't spawn with a virologist skirt anymore.
+ Virologists and Chemists wont spawn with a Medical Doctor skirt anymore.
+
+
+
30 May 2017
+
Fruerlund updated:
+
+ You can now take out pens by CTRL Clicking PDAs
+
+
+
29 May 2017
+
Jovaniph updated:
+
+ Two welding goggles on in the atmos room
+
+
Purpose2 updated:
+
+ Increases the size of Megaphones.
+ Headset encryption keys are now 'small' items.
+
+
Tayyyyyyy, FlattestGuitar updated:
+
+ A targeting mode-esque message and sound when you point at something with a gun in your active hand
+
+
+
28 May 2017
+
Fox McCloud updated:
+
+ Fixes various mobs moving around faster than intended
+
+
+
27 May 2017
+
Crazylemon64 updated:
+
+ Cloning now can be halted at any point, but ejecting too early may result in clones with missing body parts.
+ Slime people now no longer spontaneously die
+
+
+
26 May 2017
+
FlattyPatty updated:
+
+ Removes gateway hotel xeno embryo for the crew's safety.
+
+
+
25 May 2017
+
FalseIncarnate updated:
+
+ Matter Eater now requires your mouth be uncovered before you can eat matter.
+
+
Fethas updated:
+
+ PLASMAMAN ATMOS SUITS ARE NOW THE SAME AS REGULAR ATMOS SUITS FLAG WISE! AND SO IS THE CE SUIT
+
+
Kyep updated:
+
+ Fixed some mapping bugs on Centcom, e.g: shuttle medbay no longer has black walls.
+
+
Purpose2 updated:
+
+ Metastation - Adds the Paramedic's cart and locker.
+ Metastation - Adds a backup set of paramedic keys in the CMO's office.
+ Metastation - Engine no longer hotwired.
+ Metastation - Turbine doors now function properly.
+ Metastation - Toxin Mixing's Controller is now accessible.
+ Metastation - Moved Containment out a single tile, to fix irregularities with Singularity setups.
+ Metastation - Reduced redundant redundancies in the Atmos/Wiring.
+ Metastation - removed blob spawn that was only a few tiles from Cryostorage....
+ Drones can now grip Tracker Electronics & Vending Refills
+
+
Tayyyyyyy, PhantasmicDream updated:
+
+ Skrell can put a pocket sized item in their head tentacles, which can be dislodged via stunning, stripping, or death
+ Skrell can no longer have their tentacles shaved off
+ Minor grammar fix for putting stuff that's too big into containers
+
+
+
24 May 2017
+
Kyep updated:
+
+ Every head of staff now has a Department Management Console in their office. This is a very limited version of the ID console that they can use to demote people out of their departments, or move people between jobs in their department. These consoles cannot be used to hire anyone, or to accept cross-department transfers.
+
+
+
23 May 2017
+
Fethas updated:
+
+ Lockets and necklaces to the loadout. Lockets can hold paper and photos
+ Fethas fluff item
+
+
Purpose2 updated:
+
+ Adds functionality for the Atmos/Engineering Minimap to update to the right station.
+
+
+
22 May 2017
+
DarkPyrolord updated:
+
+ Rubber pellets should no longer embed.
+ Bananas fired from the staff of the honkmother should no longer embed, or be called bullets.
+
+
Kyep updated:
+
+ Adds mech-mounted variants of the existing tesla, immolator, and x-ray laser guns, with the same material and tech requirements. Admin-only Seraph mech also gets better weapons.
+
+
+
21 May 2017
+
KasparoVy updated:
+
+ Fixes a bug where only the fat roundstart disability could be selected.
+
+
+
20 May 2017
+
FlattestGuitar updated:
+
+ Adds a jobban-checking verb to the OOC tab.
+
+
KasparoVy updated:
+
+ You can now set your character's auto-accent at character creation. The verb still exists in the OOC tab.
+
+
Kyep updated:
+
+ Antag roles now have playtime requirements.
+
+
Kyep: updated:
+
+
Xantholne updated:
+
+ The Coroner now has an actual job icon.
+
+
+
19 May 2017
+
IK3I updated:
+
+ Empath stops telling you how much it hurts to not be human
+
+
MarsM0nd updated:
+
+ NanoUI map now shows the up-to-date map.
+
+
Purpose2 updated:
+
+ Coroner no longer alt title for MD
+ Adds Coroner job as its own job.
+ Adds a swanky new office for the Coroner.
+
+
+
18 May 2017
+
FreeStylaLT updated:
+
+ Added a Newscaster to Brig Toilet.
+
+
Purpose2 updated:
+
+ Adds a subtle chat-window reminder for karma on Shuttle departure. Disable/enable via preferences tab.
+ Removes the ugly round-end karma popup.
+
+
TullyBurnalot updated:
+
+ Deaf people cannot hear tape recordings anymore
+
+
+
17 May 2017
+
Fethas updated:
+
+
FlattestGuitar updated:
+
+ You can now silence shoes just by using some duct tape on them! Shoe rags no longer exist.
+
+
Fox McCloud updated:
+
+ Neuro-toxin bar drink weakens after 13 cycles as opposed to instantly
+
+
Purpose2 updated:
+
+ Makes the new posters actually spawnable.
+ Fixes far more spelling errors than there ever should have been on the posters.
+
+
Travelling Merchant updated:
+
+ Adds a hiss emote for Unathi.
+
+
+
16 May 2017
+
FlattestGuitar updated:
+
+ Brig lockers now have radios and prisoner IDs. As per SOP!
+
+
FreeStylaLT updated:
+
+ Fixed broken disposals in brig.
+ Returned missing Sergeant Araneus to HoS office.
+ Fixed missing floor tiles in the execution hallway in Brig.
+ Remapped the entire Brig.
+
+
Kyep updated:
+
+ changed security officer job slots from 5 to 7.
+
+
uraniummeltdown updated:
+
+ You can now resist out of straightjackets
+ Straightjacketed people can be handcuffed
+
+
+
15 May 2017
+
TullyBurnalot updated:
+
+ Disposal Bin Light now works with thrown items
+ Fixes typos with cowboy items
+
+
+
13 May 2017
+
Fethas updated:
+
+ fixes a redundent add_cultist proc so cult memorize objectives works on new converts.
+ fixes an istype with IS_GAMEMODE_CULT
+ Narsie now will sometimes make a door a cult door..i thought i had that in the first time.
+ runed metal can now be only used on cult girders.
+
+
KasparoVy updated:
+
+ Fixes a sprite issue with the Unathi Dorsal Frill's webbing.
+
+
+
12 May 2017
+
Fethas updated:
+
+ Makes thrall examine use MASKCOVERMOUTH and HIDEFACE flags
+ fixes hudsunglass goof with vox.
+
+
Xantholne updated:
+
+ Changes name from dark brown to brown for the default cowboy boots
+ Gives a hint that the cowboy shirts are meant to be clipped on to your uniform
+
+
+
11 May 2017
+
Fethas updated:
+
+ Greybarber suit sprite.
+ Removes sec access from the paramedic
+
+
Fox McCloud updated:
+
+ can no longer make lethal medical patches with droppers
+ dripping reagents on someone with a dropper now incurs a 3 second delay like syringes
+
+
+
09 May 2017
+
Fethas updated:
+
+ a ton of grey clothing sprites.
+
+
+
08 May 2017
+
Purpose2 updated:
+
+ Adds a wire to the modular console on the bridge, fixing the Power Grid program.
+
+
uraniummeltdown updated:
+
+ Examine a reinforced wall for deconstruction and repair hints.
+
+
+
07 May 2017
+
GunDOSMk1 updated:
+
+ Adds Unathi cobra hood
+
+
Purpose2 updated:
+
+ Fixes the broken wiring re-electrifying the bridge window.
+ Adds the missing scrubber in Genetics holding pen
+
+
Twinmold updated:
+
+ No longer able to put grabs into kitchen equipment (deep-fried grab).
+ No longer able to put grabs inside of display cases.
+
+
+
06 May 2017
+
Allfd updated:
+
+ Thrown mobs will not step on broken glass while being thrown.
+
+
Fethas updated:
+
+ Fixes sacreficed your target not triggering the next objective.
+ YOU CAN NOW ONLY CONVERT HUMANS NOT MICE!
+ bloodspill tiles changed from base 100 (plus random number based on players) to 70.
+ Adds Tajaran veils as a loadout options
+ Racial loadout tab
+
+
LightFire69 updated:
+
+ Added a pretty plasmaman suit
+
+
uraniummeltdown updated:
+
+ Removed Robocop, Paladin, NT Default as roundstart lawsets.
+
+
+
05 May 2017
+
Fethas updated:
+
+ Magistrate, IAA, and BS will now spawn with the correct color dpet satchal and duffel
+
+
+
01 May 2017
+
Fethas updated:
+
+ There will now be an visual indicator to annouce that an incomming shuttle is about yo wreck you.
+
+
+
30 April 2017
+
scrubmcnoob updated:
+
+ Combat Shotguns now more expensive in cargo.
+ Shotgun ammo_boxes are now named and sprited as speedloaders that can speedload into a shotgun. Normal shotgun ammo boxes are just storage items for shells.
+ Adds in shotgun ammos readily available to be ordered from cargo in bulk and allows the ordering of Riot shotguns.
+ Adds in a Dragonsbreathe shotgun ammo box.
+ Tranq darts now have a sprite.
+
+
+
29 April 2017
+
FalseIncarnate updated:
+
+ Popcorn jellybeans require jellybeans to make.
+ Gum is no longer invisible, but is still very chewy.
+
+
Phantasmic Dream Art, Fethas PR updated:
+
+ Updates the shadowling sprite. Sprite by Dreamy
+
+
uraniummeltdown updated:
+
+ Examine a girder for (de)construction hints
+ Projectiles have a chance to pass through some girders
+ You can construct rough iron (false) walls with rods, wood (false) walls with wooden planks on a girder
+ Screwdriver a displaced girder to deconstruct it
+ Increased displaced girder health, decreased reinforced and cult girder health
+ False wall construction is no longer instant
+ Girder (de)construction messages should read better
+
+
+
28 April 2017
+
Alffd updated:
+
+ Adds Paperwork the sloth to cargo.
+
+
+
27 April 2017
+
Kyep updated:
+
+ Changed "suggested client version" from 510 to 511.
+
+
+
26 April 2017
+
FalseIncarnate updated:
+
+ Glowshrooms (and their subtypes) can be mass-cleared by scythes just like vines.
+
+
pinatacolada updated:
+
+ dirty surgery environments get you nasty infections
+ ghetto surgery internal organ disinfection with alcohol
+ dead limb revival surgery step
+
+
+
25 April 2017
+
Flattest updated:
+
+ Animated progress bars!
+
+
uraniummeltdown updated:
+
+ Runed girders have a clearer and bigger icon
+ Girder subtypes are properly named, "reinforced girder" and not "reinforced"
+ Summoned cult walls do not drop a girder or runed metal to prevent runed metal farming
+ Cult walls no longer have blood or human remains in them
+ Harvesters can smash more things and can summon cult walls and floors
+ Fixed not being able to make a cult wall with runed metal + runed girder
+ Runed girders will need to be deconstructed with a welder (or plasma cutter or jackhammer) instead of a wrench. Cultists can hit them with their tomes to instantly demolish them.
+
+
+
24 April 2017
+
Flattest updated:
+
+ Sleepers spit out their victims when deconstructed now.
+
+
+
23 April 2017
+
Citinited updated:
+
+ You can now fully insulate reinforced floors using a sheet of plasteel.
+ Certain floors in the turbine, incinerator, and toxins are now thermally insulated.
+
+
Crazylemon64 updated:
+
+ Reverts Norgad's east maintenance overhaul
+
+
IK3I updated:
+
+ flipping aliums now have a cooldown
+ Aliums have some more sounds to play with
+
+
Tayyyyyyy updated:
+
+ You can no longer use space pod verbs when restrained, dead, or otherwise incapacitated.
+
+
+
21 April 2017
+
Anticept updated:
+
+ Alternate Job Preference now defaults to "Return to Lobby if Preferences Unavailable". Only affects new players.
+
+
Fox McCloud updated:
+
+ Tesla can now damage blobs
+ Tesla causes machinery to overload and explode when zapping it
+ Tesla dissipates energy more slowly and is easier to charge up (making it more deadly when released)
+ Tesla will now dust mobs it bumps into
+ Tesla coils now have wires that can be pulsed to generate a tesla zap
+
+
Lady-Luck updated:
+
+ Makes several balance adjustments to existing syndicate bundles, generally making them more worthwhile.
+ Adds an Allies Cocktail object for the Bond bundle.
+ Adds the 'gadgets' syndicate bundle.
+ Removes the 'lordsingulo' and 'murder' syndicate bundles.
+
+
Spacemanspark updated:
+
+ Permits hoodies to carry flashlights.
+
+
Twinmold93 updated:
+
+ Adds attack options for deep fryers, grills, and ovens. Those breaking into the kitchen beware.
+
+
alexkar598 updated:
+
+ you can now click on things underwater
+
+
monster860 updated:
+
+ Adds an in-game way of viewing poll results
+ The player poll window automatically pops up if there is an active poll you haven't voted on.
+ Adds an browser popup for creating new polls
+ Your account needs to be at least 30 days old in order to vote on polls
+
+
+
19 April 2017
+
IK3I updated:
+
+ Chaplain now spawns with his bible
+
+
Xantholne updated:
+
+ You now correctly spawn with the CMO Skirt if selected in loadout menu
+
+
+
17 April 2017
+
KasparoVy updated:
+
+ The God-emperor of Mankind diskette's UI works again.
+ DNA UI injectors will now immediately update a person's eye colour.
+
+
Krausus updated:
+
+ You can no longer squeeze non-match objects into matchboxes.
+
+
+
16 April 2017
+
FalseIncarnate updated:
+
+ Potential collaborators for traitors now are informed they are potentially a collaborator for a potential increase in them potentially helping the traitors potentially do potentially bad things. Potentially.
+ Potential collaborators are given a single code word and response set so they can discretely find out that their best friend is a filthy traitor.
+
+
KasparoVy updated:
+
+ Adds secondary (facial) hair colours to the genome (UI). There are 6 new blocks.
+ Characters with secondary (facial) hair colours won't find they've turned black after cloning anymore.
+
+
Kyep updated:
+
+ Plasma dust no longer creates plasma gas on objects or turfs during reactions.
+
+
Twinmold93 updated:
+
+ Missing sprite for pod pilot Drask now added.
+
+
Xantholne updated:
+
+ Adds Medical Beret available via loadout menu
+
+
ZomgPonies updated:
+
+ Fixes Superhero ID cards
+ Fixes Griffin missing his Freedom Implant
+ Fixes ElectroNegmatic's Ability not working at all.
+ Changes LightnIan's ability into a non-damaging stun lasting 2 ticks, with the amount of people affected depending on how long you hold the power in for.
+
+
uraniummeltdown updated:
+
+ You can now create heat-proof glass airlocks by using a sheet of reinforced glass on the assembly during construction. Regular glass airlocks just require a sheet of glass.
+
+
+
11 April 2017
+
FalseIncarnate updated:
+
+ Damage done to the shuttle engines by a shadowling's "Extend Shuttle" ability now prevent the shuttle from being recalled to CentComm.
+
+
+
09 April 2017
+
Fox McCloud updated:
+
+ abductor glands now act as actual hearts; removing them induces heart failure
+ plasma gland no longer gibs you, but makes you vomit plasma instead
+ bodysnatcher gland no longer gibs you, but will deal brute damage instead
+ bloody gland will now drain blood instead of dealing brute damage
+ species change gland will now change your species until the gland is removed
+ adjusted the origin tech on a few gland
+ heart attacks will once again paralyse you and do slightly more brute damage
+ body snatch clones look more like their originator
+ Abductors can no longer use guns (minus their own alien energy gun)
+ Sending someone with an abductor teleport via the console will stun them for 3 cycles (doesn't apply with the advanced camera console)
+ Abductors can now purchase additional abductor vests
+ Abductors can lock/unlock vests
+ Purchasing supplies from the abductor console will no longer increase the amount of experiments you must do
+ Wonderprods will not induce sleep in those who are stunned OR sleeping
+ altered the origin tech of abductor tools
+ Can make abductor surgery tables from regular tables by adding silver sheets to an abductor table frame
+ Added a bunch more abductee objectives
+ abductors no long scream like girls
+ High capacity cells have 10,000 charge instead of 15,000
+ Mech equipment power costs minorly adjusted
+ APCs charge a bit faster
+ EMPs less effective against pods and mechs
+ Fixes not being able to recharge modular laptops/tablets
+
+
Purpose2 updated:
+
+ Welders must now been fueled and active to cut lattices.
+
+
+
06 April 2017
+
Fox McCloud updated:
+
+ Fixes autopsy report printing; print reports by clicking the device itself
+
+
davipatury updated:
+
+ Rapid Cable Layer now have an autolathe design.
+
+
+
05 April 2017
+
KasparoVy updated:
+
+ Adds a Tajaran facial hair style.
+ Adds a few new frill styles for Unathi.
+ Adds some new horn styles for Unathi.
+ Adds a couple new facial hair styles for Vulpkanin.
+ Adds a few new hair styles for Vulpkanin.
+ Updates Vulpkanin Adhara & Kajam hairstyles.
+
+
Purpose2 updated:
+
+ Can now take photos of the Blueprints to count as a completed objective.
+ Cryostorage console now stores the Null Rod & all variations.
+ Mime mech is now 'Reticence' as it should be
+ Fixes missing cult's Berserker Robe sprite.
+ Cryostorage console no longer stores hundreds of bomber jackets, and now stores hardsuits
+ Cryostorage console now catches and stores most unique objective items.
+ Corrects some typos and grammar.
+ You can now light cigarettes with Wands of Fireball, at the cost of your eyebrows.
+
+
Twinmold93 updated:
+
+ Buying poison pen will actually give you the poison pen now.
+
+
+
04 April 2017
+
FalseIncarnate updated:
+
+ Adds FullofSkittles's custom pAI sprites. Thanks FoS!
+ Custom sprites for cyborgs, AI, AI holograms, and pAI units no longer are restricted to a single name. Get your money's worth by using that borg sprite regardless of your version number!
+
+
+
03 April 2017
+
Kyep updated:
+
+ Ghosts manifested by cultists are no longer invincible, and an exploit allowing them to be made permanent has been fixed.
+
+
+
02 April 2017
+
KasparoVy updated:
+
+ Nuclear Operatives/ERT Members/Abductors will no longer spawn in with genetic quirks.
+ Thrown objects that cross a tile with non-full windows will no longer hit the window even if it isn't visually obstructing the path.
+ Shooting guns (i.e. tasers) in the above circumstances means that the taser shots won't be blocked by windows that aren't visually obstructing the path.
+
+
Kyep updated:
+
+ Adjusted Black Market Packers away mission. It now has some danger to it (carp), some more interesting stuff to find (syndi lab) and a challenge (fix the ship powergrid).
+ Slight adjustment to word lists based on our rules.
+ Removed thunderdome armor from centcom away mission.
+ Cultists now get a new sacrifice target when the current one cryos.
+
+
+
31 March 2017
+
Krausus updated:
+
+ Blobs are no longer nearly guaranteed to immediately tear themselves apart upon spawning.
+
+
Kyep updated:
+
+ Access to jobs is now based solely on Playtime, NOT days since BYOND account was registered.
+
+
+
30 March 2017
+
Crazylemon64 updated:
+
+ Cult shifter should work now
+
+
FlattestGuitar updated:
+
+ Strange Reagent only deals clone damage on a successful revival.
+
+
Fox McCloud updated:
+
+ Non-designated drinks now mix their colors from the reagents within them
+ Autopsies can now be performed without needing to cut someone open
+ Adds modular receiver to the maintenance loot system
+ Receivers can now be produced in hacked autolathes; no longer available in R&D protolathes.
+ removes the random "scary" sounds that play when walking about
+
+
KasparoVy updated:
+
+ You can now slam drinks/bottles/flasks by click-dragging them onto yourself while it's in your active hand.
+
+
Kyep updated:
+
+ The moonoutpost19 away mission should now be finishable, and more enjoyable to attempt.
+
+
uraniummeltdown updated:
+
+ Emagging a closed firelock does not permanently break it anymore, only opens it.
+ Emagged windoors should be able to be screwdriver+crowbar'd again.
+ Powered grilles now have a chance to zap you when you throw an object at them.
+
+
+
29 March 2017
+
Purpose2 updated:
+
+ 'Roundstart malfunctioning' cameras now appropriately have their wires cut.
+ AI core camera can no longer be a 'roundstart malfunctioning' camera on both Box & Meta Stations.
+
+
+
28 March 2017
+
KasparoVy updated:
+
+ Skrell can now choose undergarments (undershirts, underpants, socks) at character creation and dressers.
+ Vox are now 20% less resilient to brute damage due to their light, porous and flexible skeletons.
+
+
uraniummeltdown updated:
+
+ Quick-replacing non-wooden tiles will only work with a crowbar in inactive hand instead of any item
+
+
+
27 March 2017
+
Crazylemon64 updated:
+
+ Away mission power works now.
+
+
Fox McCloud updated:
+
+ Fixes some stacks not wanting to stack with similar stacks (such as space cash)
+
+
KasparoVy updated:
+
+ Skrell have been greyscaled and darkened. You can now colour your Skrell characters as you please.
+ Kidan can now select from multiple different antennae head-accessory styles.
+ Kidan male/female bodies now have differences, namely mandible/torso structure.
+ Skrell flesh is now blue (like their blood), though you'll only ever see this under certain circumstances if they're dismembered.
+
+
Kyep updated:
+
+ The invisible floors in the engineering area of the UO45 away mission are no longer invisible. Previously, you had to crowbar up a seemingly invisible floor to make a wire appear.
+ Fixed several Terror Spider bugs. Including the notorious 'spiders can get stuck in vents' bug, the 'spiders ignore mechs' bug, and the 'prince is cheesable' bug.
+ Adjusted White & Empress spider abilities - webs spun by white spiders are now infectious.
+
+
Purpose2 updated:
+
+ Adds the Psychiatrist's bed/sofa for 5 metal.
+ Wooden chairs broken by animals no longer drop metal.
+ Abductors no longer have Syndicate ties.
+ Fixes material loss on some chair/bed/stool deconstruction types.
+ IPCs can no longer be DNA Scrambled.
+ Health analysers clunk again when upgraded
+ Resolves further grammatical/typo issues.
+
+
+
26 March 2017
+
FalseIncarnate updated:
+
+ Re-adds the telescopic scythe, the pinnacle of covert reaping technologies. Currently admin-spawn only, for use in the most dire of harvest times.
+ Scythes (normal and telescopic) should once again clear swathes through all but the hardiest of vines when in proper reaping configurations, and heavily damage those they don't outright destroy.
+ Ankle-high piles of dirt will no longer prevent you from stepping over them.
+
+
KasparoVy updated:
+
+ You can no longer climb through interdimensional rifts into cryopods.
+ Revenants can see properly in the dark again.
+
+
Kyep updated:
+
+ Adjusted Beach awaymission so it now includes deadly (but rewarding) pirate area.
+ Adjusted the centcom away mission to make it viable.
+ Deleted 'listening post' away mission.
+
+
Purpose2 updated:
+
+ QoL: Newly built APCs come unlocked.
+ QoL: Chief Engineer's locker has more building permits.
+ Assorted grammatical fixes.
+
+
Ty-Omaha updated:
+
+ Splints will display the proper sentence when applying them
+
+
uraniummeltdown updated:
+
+ Metastation: Fixed Gateway airlock access and Command Hallway vendor areas, virology smartfridge is correctly stocked, mass drivers now have tiny fans, Sec spacepod keys work on the Sec pod, Airlocks should have the correct icon, Firelocks/Windoors/Shutters should be layered correctly, Shutters should be facing the right direction
+ Drone fabricator consoles search for a fabricator in the same area instead of 3x3 range.
+
+
+
25 March 2017
+
Crazylemon64 updated:
+
+ All pens are now certified crayon-wax free!
+
+
Kyep updated:
+
+ Pipes in the Wizard Academy have been banished back under the carpet, where they belong.
+
+
+
24 March 2017
+
KasparoVy updated:
+
+ Red wire-cutters and red crowbars now appear correctly in-hands again. imgadd: The medical wrench and all the brass tools (screwdriver, crowbar, wrench, wire-cutters, welder) now have in-hand sprites of their own.
+ Adds TG's inhand icons for screwdrivers, crowbars, wrenches, wire-cutters and welders.
+ Slime People can wear underwear, undershirts and socks.
+
+
uraniummeltdown updated:
+
+ IV Drips are no longer dense objects, you can walk over them.
+ You can change gold and silver tiles into fancy versions by using them in hand.
+
+
+
23 March 2017
+
FalseIncarnate updated:
+
+ Fish breeding has been tweaked to support fish refusing to cross-breed and improved egg chances with same-species parents.
+
+
Fox McCloud updated:
+
+ Floors are now fully properly cleaned with mops and soap
+ Adds in emergency welding tool, fork, trays, drinking glasses, shot glasses, shakers, butcher cleavers, and riot darts to the autolathe
+ Adds all basic stock parts to the autolathe
+ re-arranges the autolathe menu to be more logical
+ light bulbs no longer require metal to produce
+ Incision management system can now cauterize
+
+
KasparoVy updated:
+
+ Unathi Security, Medical, Engineering and Syndicate side-facing hardsuit sprites have undergone weight reduction.
+
+
Kyep updated:
+
+ Chaplain's armor is no longer riot-grade. In addition, their nullrods do less damage.
+
+
MarsM0nd updated:
+
+ Conveyor switches can now set to left-only direction toggling.
+
+
Norgad updated:
+
+ Maintenance areas near arrivals, science, and the bar have been revamped.
+
+
uraniummeltdown updated:
+
+ Station lighting has less lighting power, this is not noticeable apart from maint and 1 bulb rooms being a bit darker.
+ Tweaked the potency scaling for glowshroom/glowberry light; high-potency plants no longer light up a huge area, but are slightly brighter.
+ Added Shadowshrooms as a glowshroom mutation. They do exactly what you'd expect.
+
+
+
22 March 2017
+
Crazylemon64 updated:
+
+ Rod form is now at half speed, and has a warning sound.
+
+
FlattestGuitar updated:
+
+ When a person's limb is dying, it will no longer notify the whole server of the ordeal
+ Welding tools no longer tell you about their span classes
+
+
KasparoVy updated:
+
+ Deconstructing beds now yields the same amount of metal as was used to make the bed.
+ The PA console will no longer appear as though it is fully constructed at the start of the round.
+ Ore Redemption Machines no longer eat IDs when deconstructed.
+ Ore Redemption Machines and Mining Equipment Vendors now spit out whatever IDs were in them when they lose power.
+
+
Krausus updated:
+
+ Personal crafting is now usable again for those with an Internet Explorer version below 11.
+
+
+
21 March 2017
+
Crazylemon64 updated:
+
+ Strange reagent now has a volume floor requirement to activate, induces clone damage, and may cause further trouble...
+
+
KasparoVy updated:
+
+ No-one escapes nuclear hellfire.
+ Secure fridges/freezers are now lead-lined and have thus become nuke resistant.
+
+
uraniummeltdown updated:
+
+ Baseball bats added to the game, are craftable from 5 wood planks.
+ Baseball burgers can be made with a baseball bat and a bun, either microwaved or table-crafted.
+
+
+
20 March 2017
+
Jovaniph updated:
+
+ Tajaran EVA Suit Sprites
+
+
KasparoVy updated:
+
+ Gloves can be snipped again.
+
+
Purpose2 updated:
+
+ Fixes assorted wording / capitalisation / grammatical problems.
+ Fixes the exploit to produce infinite cable coil from airlocks.
+
+
Tayyyyyyy updated:
+
+ Added GPS devices to pod pilot and mechanic's offices
+
+
+
19 March 2017
+
Jovaniph updated:
+
+ Voxes can now wear soft caps.
+
+
Krausus updated:
+
+ Pest spray bottles are no longer invisible.
+
+
Kyep updated:
+
+ Wood doors in wild west map no longer constantly open/close
+
+
uraniummeltdown updated:
+
+ Shipping errors can sometimes cause the supply shuttle to receive an extra crate when ordering supplies.
+ Added dog beds! Can be made with 10 wood planks and deconstructed with a wrench. Ian's Bed added to Cyberiad and Metastation.
+
+
+
18 March 2017
+
Fox McCloud updated:
+
+ Fixes abductor surgeries
+
+
Jovaniph updated:
+
+
uraniummeltdown updated:
+
+ Shades now have directional sprites.
+ Attacking with glass shards now hurts your hand if not wearing gloves. Does not affect robotic hands though.
+
+
+
16 March 2017
+
FlattestGeetar updated:
+
+ Workboots are now in the loadout system.
+ Ports winter boots from /tg/
+
+
Jovaniph updated:
+
+ New sounds to Firelocks and Airlock External
+ Door closing sound to Airlocks - from yogstation
+
+
Markolie updated:
+
+ Fixed revenant night vision not working.
+ Fixed the "X attacked Y" message showing up when welding vents.
+ Fixed the follow button on the cell door timer radio message not working.
+ Fixed the Jaws of Life being unable to force unpowered doors.
+ Fixed a number of preference options being unavailable when modifying preferences while observing.
+ Fixed an issue where deleting security records wouldn't clear that player's wanted status properly.
+ Fixed the cult "first meal" sacrifice objective not counting properly. Also clarified what this objective actually entailed.
+ Fixed IPC's ocassionally being selected as a changeling "escape with X identity" target.
+ The character records and disabilities menus in the preferences menu no longer uses the plain white background, but uses the better looking blue layout instead.
+
+
+
15 March 2017
+
uraniummeltdown updated:
+
+ Plastic flaps can be deconstructed with tools and constructed using 5 sheets of plastic.
+ You can now damage grilles by throwing things at them.
+ You can rebuild broken grilles by using a metal rod on them.
+ Metal rods maximum amount reduced from 60 to 50.
+
+
+
14 March 2017
+
uraniummeltdown updated:
+
+ Strong supply talismans can now summon 5 sheets of runed metal.
+
+
+
13 March 2017
+
Kyep updated:
+
+ Syndicate mobs in the Wild West are no longer so stupid that they trip over, and die to, their own mines. This also means that they won't set their own buildings on fire anymore.
+ Phazons' phase ability now works again.
+ Phazons' toxin injector melee damage type (a weak melee attack) now works again.
+
+
uraniummeltdown updated:
+
+ Clicking on a tile with another tile and a crowbar or screwdriver in hand directly replaces the tile.
+
+
+
12 March 2017
+
Crazylemon64 updated:
+
+ Kudzu should now be less of (but still) a station-destroying force of nature.
+ Bluespace kudzu now only pierces a single layer of walls before losing its "charge".
+ Aggressive spread now does not bust rwalls, but does attack obstructing objects in its path.
+ Kudzu now only spreads on space turfs when it has specific mutations to do so.
+ Kudzu events should be more interesting on their own.
+
+
Jovaniph updated:
+
+ Adds Vulpkanin EVA suit sprite
+
+
Kyep updated:
+
+ Adjusted Wizard Academy to make it both more lethal, and more rewarding.
+
+
Markolie updated:
+
+ The system for picking ghosts to inhabit cultist slaughter demons now shows a confirmation prompt like most other role checks.
+ Fixed an issue where you could join as a cultist slaughter demon despite having antagHUD enabled.
+ Fixed an issue where it was possible to weld statues without any fuel.
+ It is no longer possible to spam the firelock force message.
+
+
Twinmold93 updated:
+
+ Employment record laptop to Head of Personnel's Office. Moves package wrap that was there to meeting room to be paired with the hand labeler there.
+
+
+
11 March 2017
+
Developed by XDTM, ported by davipatury updated:
+
+ Hallucinations have been modified to increase the creepiness factor and reduce the boring factor.
+ Added some new hallucinations.
+ Fixed a bug where the singularity hallucination was stunning for longer than intended and leaving the fake HUD crit icon permanently.
+
+
Flatty Patty updated:
+
+ all the tools have icons again
+
+
FlattyPatty updated:
+
+ Improved Nanotrasen click manufacturing procedures now allow the flashlights to make that classic clicking sound you know and love.
+
+
Fox McCloud updated:
+
+ Buckshot now does a max of 70 damage, down from 90
+
+
KasparoVy updated:
+
+ Fixes a bug with certain tail markings rendering when they shouldn't.
+
+
Markolie updated:
+
+ Firelocks forced by AI's, cyborgs at range or admin ghosts will now autoclose if there's still an atmospherics alarm present.
+ Regular (non-heavy) firelocks will now properly respond to explosions (100% chance of being destroyed at severity 1 explosions and 50% at severity 2). Heavy firelocks are still only destroyed in severity 1 explosions.
+ Added a visible message to forcing airlocks with the Jaws of Life.
+
+
davipatury updated:
+
+ Ported Modular Computers from /tg/.
+ Ported Rapid Cable Layer from /vg/.
+
+
uraniummeltdown updated:
+
+ EVA has 2 more EVA Suits
+ Removed Vox-only EVA suits (the grey ones in EVA)
+ Vox can now wear EVA suits
+
+
+
10 March 2017
+
Jovaniph updated:
+
+ Recitence no longer makes a sound when turning
+
+
Markolie updated:
+
+ The DNA Vault station goal will now be marked as completed properly.
+ Multi-tile airlocks will now change their direction properly.
+ The atmos skirt loadout item will now be equipped properly on round start.
+ Fixes the inhand disabler sprite pointing the wrong way in some directions.
+ The Janicart will no longer act as a jetpack.
+ You can now resist out of a borer's control again.
+ Fixes the general antag ban not working on certain conversion antagonists.
+ Fixes removing the trunk from underneath a chute/bin causing all sorts of issues.
+ Fixes alt titles not showing up on ID's.
+ Mineral doors no longer block atmos (like they're supposed to).
+ Fixes the cortical borer hivemind talk not working.
+ Fixes detomatix cartridges not working *from* PDA's with an uplink (it now no longer *on* a PDA with an uplink to prevent blowing up fellow traitors).
+ Fixes NODROP interaction with secure closets.
+ Fixes some stray fruit at the Syndicate base on Z2.
+ Fixes an incorrect camera network in the courtroom.
+ Fixes an issue where AI's would go blind upon travelling into space.
+ The cortical borer hivemind talk key is now "bo".
+ Attempting to blow up an undetonatable PDA (such as the captain's) will now show a warning message. It will also no longer use up a charge.
+ Animals can now open mineral doors and mineral doors will no longer be closable if there's a mob inside.
+ Matter grippers can now carry firelock electronics as well as bluespace crystals (for construction).
+ Removes the pipe fitting on the table from atmospherics as it was broken.
+
+
+
09 March 2017
+
Crazylemon64 updated:
+
+ Adds an "ethereal beacon", an admin-only structure usable to attract ghosts to an area.
+ Adds several transformer machines to streamline the ghost-to-PC process.
+
+
LordJike updated:
+
+ Space Fries are now made by deep-frying potato wedges instead of processing them.
+ Introducing carrots inside the food processor gives you carrot wedges now.
+ Now you can make carrot fries by deep-frying carrot wedges instead of formerly processing the whole carrots.
+
+
Markolie updated:
+
+ Tools now have a "usesound" and "toolspeed" variable which allows different tool (levels) to have different sounds and speeds.
+ Robots spawn with tools that are twice as fast as regular tools.
+ Abductor agents now spawn with a toolbelt with specialized abductor tools that are very fast.
+ Abductor surgery tools are now much faster.
+ Abductor (surgery) tools can now be constructed in R&D with a sufficiently high "abductor" research level.
+ The abductor multitool will now display what each wire does.
+ Admin ghosts can now interact with wires and see what each wire does.
+ Adds a set of unique tools for the Chief Engineer that he is given in a unique toolbelt at roundstart. These tools are faster and can be created in R&D with a sufficiently high R&D level.
+ The AI detector has been refactored to have much more robust AI tracking.
+
+
+
08 March 2017
+
Alffd updated:
+
+ Farting on a bible now puts you at the mercy of the gods.
+ Removed automatic biblefarting gibbing.
+
+
FlaaaaaattestGuitar updated:
+
+ Magistrate now starts their shift with a pair of white gloves as well as Bridge and Meeting Room access.
+
+
Fox McCloud updated:
+
+ money is now far easier to use, and distribute in amounts you would like
+
+
Kyep updated:
+
+ Changed event probabilities, aiming for a more fun late game. In general, events that do very little (e.g: meaty ores, rogue drones) are less likely. Events that will keep people on their toes (e.g: anomalies) are more likely. Events that might cause people to observe rather than joining the round (e.g: Xenos) are less likely.
+
+
uraniummeltdown updated:
+
+ Wizard Hardsuit helmet and suit now have inhand sprites
+
+
+
07 March 2017
+
Crazylemon64 updated:
+
+ IPCs now come with a power cord implant to use to recharge from APCs.
+ IPCs can now be genderless.
+
+
Kyep updated:
+
+ Deleted 'challenge' away mission.
+
+
MarsM0nd updated:
+
+ Cultists get shoes on usage of the armor talisman.
+ Cultists only get equipment if they have the slot for it free, weapons are always spawned.
+ The tome does a more fitting description of the talisman of armor.
+
+
+
05 March 2017
+
Kyep updated:
+
+ Added Poison Pen, a stealthy way of applying a contact-based poison to paper. Available to Syndicate HoPs, QMs, and Cargo Techs.
+ Antags whose objectives are manually announced by an admin, or altered automatically as a result of their target cryoing, will now hear a warning sound. The sound is the same as the 'crew transfer vote called' sound. Additionally, the text notice for changed objectives is more obvious.
+
+
MarsM0nd updated:
+
+ The grey satchel uses now the correct sprite instead of the leather one.
+
+
+
04 March 2017
+
Markolie updated:
+
+ Ghosts can now interact with ore dispensers, mining equipment vendors and laptop vendors.
+ Admins can now interact with crates, closets, false walls and conveyor switches if they have advanced interaction enabled.
+
+
davipatury updated:
+
+ Newscaster now uses Nano-UI.
+ Tank dispenser now uses Nano-UI.
+ Passive gate, pump and volume pump now uses Nano-UI.
+ Atmospherics filter and mixer now uses Nano-UI.
+ Wires now uses Nano-UI.
+
+
+
03 March 2017
+
FlauntestGuitar updated:
+
+ You will now be prompted on a karma purchase to confirm that you clicked what you wanted to click
+
+
uraniummeltdown updated:
+
+ You can now change the input/output directons for Ore Redemption Machines by using a multitool on them with the panel open.
+ Bluespace RPED beams have a new sprite
+
+
+
01 March 2017
+
Crazylemon64 updated:
+
+ Kudzu vines now can yield materials if carefully tended to
+
+
Fethas updated:
+
+ 2 second cooldown on the rest verb. You are not Neo, knock it off.
+ StopResting and StartResting Procs are not on the rest verb.
+ Various metastation fixes.
+
+
KasparoVy updated:
+
+ Plasmaman multiverse sword copies are now properly equipped (suit, helmet, internals, etc.)
+ Vox multiverse sword copies are now peoperly equipped (internals).
+
+
Kyep updated:
+
+ Fixed several Terror Spider things that should not be possible, like recharging wireless guns, the 'evil-looking spiderlings' instant meta, and spiderlings spacing themselves.
+ Several Terror Spider balance and fun tweaks, such as giving the Prince of Terror a new webbing ability, and ensuring queens/mothers can break open vents, so they cannot be completely shut out late-round.
+
+
Purpose2 updated:
+
+ Enables Cargo to order Wood planks
+
+
+
28 February 2017
+
KasparoVy updated:
+
+ Plasmaman suits will now only auto-extinguish if you're actually on fire (and not just taking a shower).
+
+
+
27 February 2017
+
uraniummeltdown updated:
+
+ Mineral statues are here! Use 5 sheets of any mineral including sandstone to make one. Be careful around plasma and uranium statues!
+ The mime's office now comes with a statue too.
+ Updated plasma, uranium and diamond floor sprites to TG's newer ones.
+
+
+
26 February 2017
+
Crazylemon64 updated:
+
+ Immovable rod events now vanish after going through the station once
+ Firelocks can now be operated by AIs again
+ Barbers and captains get the right stuff now
+ It's now possible to have random floors or walls when mapping
+
+
KasparoVy updated:
+
+ Fixes a bug where you could get a part of a rigsuit stuck to your hand by deploying it twice.
+ Improves the readability of some rigsuit verbs.
+
+
Kyep updated:
+
+ players will no longer spawn with loadout items their job has no access to.
+ AI & Borg upload consoles now have to be on the station zlevel to work.
+
+
davipatury updated:
+
+ ATM now uses Nano-UI.
+
+
+
25 February 2017
+
Crazylemon64 updated:
+
+ Telecomms monitor is now infused with fastitude
+
+
FlattestGuitar updated:
+
+ Escape has been re-bushed.
+
+
KasparoVy updated:
+
+ Reagent plasma has a weak healing effect on Plasmamen when injected and will not poison them.
+ Reagent oxygen is as toxic to Vox as reagent plasma is to just about anyone.
+ Plasmamen now join the shift with 2 suit auto-extinguisher refill cartridges which, individually, will fully refill an empty Plasmaman suit's autoextinguisherl.
+ Plasmaman suits now auto-extinguish and will be able to do so 5 times before they can be refilled by a cartridge.
+ Plasmamen no longer burn in a vacuum or in plasma-pure environments.
+
+
davipatury updated:
+
+ Security Records now uses Nano-UI.
+
+
+
24 February 2017
+
FalseIncarnate updated:
+
+ Corn and bananas can be properly deepfried into their special results again.
+ Rice can be properly ground into a reagent again.
+ Hydroponics trays once again are equipped with Bee-proof lids to keep unwanted pollination to a minimum. This only works if you actually toggle the lid closed though!
+ Plants age slightly slower, so your space farming should no longer feel like it outpaces a meth'd up blue hedgehog in sneakers.
+
+
Kyep updated:
+
+ Fixes blob spawns prompting players twice.
+
+
Markolie updated:
+
+ Mining pod weapons are once again functional. Compared to regular kinetic accelerators, the weak projectile has one additional range (3 --> 4). The regular projectile's damage is increased (40 --> 50) and deals more damage in pressurized environments (50% instead of 25%). The enhanced projectile is able to fire its kinetic projectile AoE against turfs and mobs.
+ Fixed an issue where it was impossible to log out from fax machines.
+ It is no longer possible to steal ID cards from identification computers/fax machine using telekinesis at range.
+ The follow link on death alarms now works.
+ Fixes an exploit where players could use the ambulance trolley to teleport.
+ The chef now properly shows a chef hat on character preview.
+ The nuclear ops game mode will no longer always result in a major crew victory.
+ Players with their face covered will no longer show their flavor text upon examine.
+ Fax machines now have an "Eject ID card" verb so you can remove the inserted ID when it is depowered.
+ Firelocks are now more lethal.
+ Firelocks now crush players standing inside them when they finish closing.
+ Firelocks can no longer be instantly opened by hand: it requires thirty seconds and will autoclose in five seconds if there is still an atmospherics alert present in the area. They can no longer be closed by hand. Heavy firelocks can not be forced by hand.
+ Atmospherics technicians can once again remotely modify all settings on air alarms through the central atmospherics console.
+
+
Purpose2 updated:
+
+ Captain's crown is now part of the random hats crate, and no longer spawns in their locker.
+
+
Twinmold93 updated:
+
+ Ability to label bloodpacks with a pen, so you can now label a bloodpack from donations without a handlabeler.
+ Bloodpacks will now change name to say if they are empty or not.
+
+
davipatury updated:
+
+ EFTPOS now uses Nano-UI.
+ Medical Records now uses Nano-UI.
+ Employment Records now uses Nano-UI.
+
+
+
23 February 2017
+
Krausus updated:
+
+ Ghost candidate alert boxes ("Do you want to play as a thing?") will now have "No" as the leftmost, default option, which you will accidentally pick when it pops up while you're trying to type, but at least you won't be stuck as the thing when you didn't actually want to be that thing.
+
+
Markolie updated:
+
+ The meteor shield satellite station goal coverage goal has been increased tenfold.
+
+
+
22 February 2017
+
KasparoVy updated:
+
+ You can now toggle on/off the gladiator helmet's face-shield with an action button. This is totally cosmetic. imgadd: Adds a bunch of new helmet sprites for Vox.
+ Slightly adjusts the Vox knight armour sprites (not the Templar armour) to look nicer with the new helmets.
+ The Admin 'Select Equipment' debug verb now appropriately equips Armalis when the 'Vox' option is selected.
+
+
+
21 February 2017
+
Crazylemon64 updated:
+
+ Autolathes can be hacked again
+
+
KasparoVy updated:
+
+ Removes rogue super-bright pixel at top of Vulpkanin Adhara hairstyle north and south facing sprites.
+
+
Kyep updated:
+
+ Deleted clown planet away mission.
+ blobs now spawn with a player in control, instantly. There is no longer a 30 second period where they exist, but nobody is controlling them.
+ blobs now get extra time after spawn, before they are announced.
+
+
Markolie updated:
+
+ Megaphones can no longer be used by mute people.
+ Rechargers will no longer recharge stacks beyond their max amount or restack 0.5 sheets.
+ Ranged guardians now have a proper one second cooldown instead of 0.1 seconds.
+ Cult can no longer soul stone manifested ghosts.
+
+
davipatury updated:
+
+ Autolathe now uses Nano-UI.
+
+
uraniummeltdown updated:
+
+ Shuttle engines should now face the correct way
+
+
+
20 February 2017
+
Markolie updated:
+
+ The chaplain on the Cyberiad map now has a one-use soulstone.
+ The chaplain's soul stone on MetaStation can now only be used once.
+
+
davipatury updated:
+
+ Shuttle Console now uses Nano-UI.
+
+
tigercat2000 updated:
+
+ The AI has a button next to radio messages to open the door closest to the speaker. ;AI, Open this fucking door!
+
+
+
19 February 2017
+
Markolie updated:
+
+ Claw games no longer eat up all glass sheets in the stack when constructed.
+
+
+
18 February 2017
+
Alffd updated:
+
+ Fixes missing entries in species/station for Vox cough and sneeze.
+
+
Crazylemon64 updated:
+
+ Centcomm has begun enforcing stricter security protocols after a recent influx of fax responses from Clown impersonators
+ Mind transfer abilities work again
+ Centcomm is no longer obnoxiously pedantic, regarding BSA deployment
+
+
Krausus updated:
+
+ End-of-round sounds will now play just in time for them to end as the server reboots, rather than starting the moment it reboots.
+
+
Kyep updated:
+
+ Added a 'take' option to ahelps/mhelps, so admins/mentors can quickly let the asker know their question is being looked at.
+
+
Markolie updated:
+
+ Vending machines, newscasters, biogenerators, plant DNA manipulators, seed extractors, bots, fax machines, photocopiers, AI slippers, cell door timers, airlocks, pipe dispensers and atmospherics machinery that open a window can now be viewed by ghosts.
+ Admins can now interact with mass driver, crematorium, ignition, light, flashers and flasher switches and door switches, as well as airlocks, windoors, firedoors and atmospherics machinery that do not open a window if they have advanced admin interaction enabled (under the "Admin" tab).
+ Slicing disposal pipes now shows a progress bar.
+
+
uraniummeltdown updated:
+
+ Shuttle engines have new sprites.
+
+
+
17 February 2017
+
Crazylemon64 updated:
+
+ Space vines now have a mutation that lets them grow in a more intelligent manner
+
+
Ported by Markolie, developed by AnturK updated:
+
+ Station Goals have been ported from /tg/. These optional goals are big projects given to the station by Central Command, requiring interdepartmental cooperation and a huge number of resources to complete.
+ Three station goals have been added: bluespace artillery construction, meteor shield satellite network and DNA vault.
+ Fixes the "Messages" tab of the communications computer.
+
+
+
16 February 2017
+
Crazylemon64 updated:
+
+ Slime people and Dionae now make sounds when coughing
+
+
KasparoVy updated:
+
+ Welding goggles and welding gas masks now properly affect your vision.
+
+
davipatury updated:
+
+ changed urnaium to uranium in wt-550 auto gun uranium magazine design
+
+
uraniummeltdown updated:
+
+ The wizard has a new spell, Rod Form, which allows him to transform into an immovable rod.
+ Ethereal beings no longer cause bananium floor tiles to squeak.
+
+
+
15 February 2017
+
Alexshreds updated:
+
+ Coughing and sneezing now plays sounds.
+
+
Ausops updated:
+
+ Internals and plasma tanks have been resprited.
+
+
Crazylemon64 updated:
+
+ Phlogiston now ignites consistently upon application
+
+
FlimFlamm updated:
+
+ New decals for boxes. Just apply a pen to change them (while they're open)!
+
+
KasparoVy updated:
+
+ You can now choose to speak anonymously in deadchat from round-start game preferences.
+ Your decision to speak anonymously in deadchat now persists between ghostings.
+ Vox tails won't change colour when other Vox spawn in anymore.
+
+
Markolie updated:
+
+ Mine bots once again only do ten damage in pressurized areas
+
+
Twinmold93 updated:
+
+ Blob Conscious Split now properly scales the requirement of blob tiles to win.
+
+
uraniummeltdown updated:
+
+ Borers now have action buttons
+ Borer names are now dependent on generation
+
+
+
14 February 2017
+
Developed by Cyberboss, ported by Markolie updated:
+
+ Progress bars will now stack vertically.
+ Progress bars will no longer be affected by lighting.
+
+
DrunkDwarf updated:
+
+ Adds a section to the Airlock menu of the RCD to allow specifying the name of the new Airlock
+
+
Fethas updated:
+
+ You can no longer put anything THAT IS ALREADY A CULTIST IN A SOULSTONE....AT ALL.
+ Readds missing beserker robe sprite.
+ Cap growth serum at 1.5
+
+
Fox McCloud updated:
+
+ Xenobiology console should be more responsive when using/exiting using it
+ Xenobiology console can now be loaded with a bag
+ Using monkey cubes on the Xenobiology console no longer makes you attempt to utilize the console
+
+
Markolie updated:
+
+ The kinetic accelerator sprite modkits now apply properly when the kinetic accelerator is empty.
+ Welding tools now once again have a proper in-hand when turned on.
+
+
+
13 February 2017
+
Crazylemon64 updated:
+
+ Achieving higher growth rates on kudzu will result in a faster-growing vine when planted
+
+
Fethas updated:
+
+ Metastation: The escape shuttle doors should no longer be security access only.
+ Metastation: Hooks up disposals door control.
+ Cyberiad: Untriggers Neca and makes the floor tiles in the emergecny wing sec area plating.
+ Cyberiad: Moves the cargo mail room table onto the otherside of the window so you can actually OPEN IT.
+
+
Fluff12 updated:
+
+ Greys can now choose to speak in wingdings or not. The Voice option is right below Species in character creation if Grey is selected - make sure you have it set to what you want!
+
+
Fox McCloud updated:
+
+ improves the tatortot sprite
+
+
Kyep updated:
+
+ Playtime requirements for IAAs have been set at 5 hours (similar to Sec Officer). Playtime requirements for Captains and AI have been increased from 10 hours to 20 hours.
+ Mech-mounted teleporters are no longer massively overpowered. They now consume a huge amount of energy to use, to the point that crew mechs with them can only use them a few times. They can no longer be spammed. Dark Gygax mechs used by nuclear operatives get a better version of the teleporter, which has around 40 uses, and is more precise.
+ Fixed several bugs related to Terror Spider webs.
+ Terror Spiders have been rebalanced. Spiders are no longer spaceproof, princes are now proper minibosses, and more.
+ Several new classes of Terror Spiders (green, white, purple, queen, mother) have been added - including types which can breed. This creates new strategy around nest defense.
+
+
Markolie updated:
+
+ Fixed a number of genetics powers not working.
+ Posibrains can no longer whisper when silenced.
+ Syndicate turrets will no longer target the Syndicate pAI found on their outpost.
+ Fixed the "Swedish" disability occasionally hiding parts of speech.
+ Mouthless players can no longer eat crayons (such as IPC's).
+ Instruments can now be interacted with while buckled.
+ Emagging a single fax machine will no longer give all fax machines access to the Syndicate destination.
+ Evidence bags will now always show the item inside of them.
+ Spacepods leaving a trail of humans instead of ion trail effects.
+
+
uraniummeltdown updated:
+
+ Nuclear Operatives can customize the Declaration of War.
+ The RSF has a unique sprite.
+
+
+
12 February 2017
+
Fox McCloud updated:
+
+ Fixes erroneous access on inner morgue door which was granting people with morgue access, access to the entirety of medical bay
+
+
Kyep updated:
+
+ added two more mining hardsuits to the mining outpost.
+
+
uraniummeltdown updated:
+
+ Whetstones have been resprited
+ Drying racks have new sprites.
+
+
+
11 February 2017
+
Markolie updated:
+
+ Ports over the remaining Lavaland loot items from /tg/ (most developed by KorPhaeron).
+ Refactors the kinetic accelerator to use modkits instead of subtypes: these unique mods (such as more range or shorter cooldown) can be purchased from the mining vendor or built by R&D or robotics (developed by KorPhaeron).
+
+
+
10 February 2017
+
Fox McCloud updated:
+
+ Fixes not being able to bloodcrawl in most sources of blood
+ Fixes slaughter demon whisper not working at all
+ Drying rack drying now properly uses NanoUI instead of a right-click verb
+ Fixes produce appearing stuck in a drying rack when it was empty
+ Fixes a few failed icon updates with the drying rack
+
+
KasparoVy, Krausus updated:
+
+ Adds the colourblindness gene. It is eye-dependent, and can be transferred from person-to-person with the eye organ.
+ Colourblindness can be detected by the advanced medical scanner just like blindness and short-sightedness.
+ Vulpkanin and Tajara can now choose to be uniquely colourblind in exchange for fantastic darksight. The default option is colour vision but low darksight.
+ Selecting mechanical or mechanically assisted eyes at character creation grants full colour vision, but standard Human darksight. This overrides the colour vision preference.
+ Mechanical(ly assisted) internal organs such as hearts and eyes are now appropriately named, and have appropriate sprites.
+ Vulpkanin and Tajara monkey-forms (Wolpins and Farwas) are incurably colourblind but have excellent darksight as they get nearly the same organs as their greater forms.
+ Increases reliability of turning into a monkey.
+ Fixes a bug with changelings lesser-forming, transforming and humanforming into a different identity.
+
+
Markolie updated:
+
+ Firelocks can now be constructed and deconstructed.
+ Firelocks no longer show a confirmation message when being opened.
+ Various map fixes (vents, scrubbers, firelocks and intercoms). Also removes the firelocks covering the windows in escape/cargo.
+
+
tigercat2000 updated:
+
+ Ported Goonstation slash /vg/ lighting. Pretty.
+
+
uraniummeltdown updated:
+
+ Quantum Pads are now buildable in R&D!
+ Quantum Pads, once built, can be linked to other Quantum Pads using a multitool. Using a Pad which has been linked will teleport everything on the sending pad to the linked pad!
+ Pads do not need to be linked in pairs: Pad A can lead to Pad B which can lead to pad C.
+ Upgrading a Quantum Pad will reduce the cooldown, charge-up time, and power consumption.
+ Quantum Pads require a bluespace crystal, a micro manipulator, a capacitor and a cable piece.
+ Events now scale better with population.
+ Enabled immovable rod, slaughter demon and morph events.
+
+
+
08 February 2017
+
Fox McCloud updated:
+
+ Grinding wheat and other products produces the proper reagents again
+
+
+
07 February 2017
+
Fox MCCloud updated:
+
+ Tank transfer valves have in-hand icons
+ Tank transfer valves with large tanks (ie: jetpacks) cannot fit in backpacks
+
+
Fox McCloud updated:
+
+ fixes xeno eggs taking damgae from disablers
+ adjusts most botany plant reagents to have "plantmatter" as opposed to nutriment
+ Blumpkins now have plasma in them
+ Fixes plant grown diona not being allied with plants and vines
+ Water coolers now dispense cups when clicking on them with a free hand
+ reagent tank dispensing amount based on the container instead of the tank
+ Fixes beaker spilling when placing a beaker into an ice cream machine
+ Adds in 100,000 unit water tanks to cargo for 12 points
+ regular water tank cost reduced from 8 to 6 points
+ Monkey cubes in boxes no longer start off wrapped
+ All monkey cube boxes at cargo are the same price
+ Fixes Nymphs not being able to cross over top of hydroponics trays
+ Diona fertilizing and weed eating is handled by clicking on the tray as a nymph rather than verbs
+
+
KasparoVy updated:
+
+ Storage implants are now checked for steal objective items.
+
+
Kyep updated:
+
+ AI holograms now transfer between holopads as the AI moves around.
+
+
uraniummeltdown updated:
+
+ Engineering and Science crates now have new sprites
+ Changelings can recall the memories of an absorb victim
+ Changelings will recall some speech of their absorb victims
+ You can now create floor tiles from minerals. Be careful around plasma and uranium floors though.
+
+
+
06 February 2017
+
Fox McCloud updated:
+
+ Fixes traitor banana peels having no sprite
+ Stunprods are constructed with igniters instead of wirecutters
+ Stunprods will spark when you stun someone with them
+ Expands the amount of cryodorm pods
+
+
KasparoVy updated:
+
+ IPC names with numbers now load correctly from SQL.
+
+
Kyep updated:
+
+ Autoprocess cloners will no longer clone people who cryo and ghost out, or otherwise deliberately remove themselves from the round.
+ Dead miners in UO45 away mission are no longer naked.
+ ERT and SST shuttle consoles now require the appropriate access to use.
+
+
uraniummeltdown updated:
+
+ You can interact with an ore box by using an advanced mining scanner on it.
+ Xenobiology Console is now constructible, board has been added to the Circuit Imprinter.
+ Plasmaman IAA/Lawyers now have a unique suit.
+ AI control beacons are a new item created from the exosuit fabricator. When installed into a mech, it allows AIs to jump to and from that mech freely. Note that malfunctioning AIs with the domination power unlocked will instead be forced to dominate the mech.
+ Changelings have a new default ability: Hivemind Link. This lets you bring a neck-grabbed victim into the hivemind for a few minutes. You can talk to your victims and perhaps persuade them to help you, give you intel, or even a PDA code. Victims in crit will be stabilized.
+ Added new AI core sprites from TG
+ Added Vox rad suit, bombsuit hood, paramedic EVA suit sprites from /vg/
+ You can click AI displays as an AI to change them
+
+
+
05 February 2017
+
Fethas updated:
+
+ Brings unholy water in line with its description.
+
+
Fox McCloud and Core0verload updated:
+
+ Dramatically overhauls the botany system; features more user friendly gene modification methods, more control over attributes and reagents in your plants, and more
+ Adds in drying rack for drying growns for smoking with rolled papers
+ Store spare seeds in the seed extractor
+ Adds in cloth; make clothing, satchels, backpacks, duffelbags and more.
+ Upgrading hydroponics trays impacts how quickly plants degrade
+ Bees slightly more effective at increasing plant yields
+ Overall growth rate of plants dramatically increased
+ Adds in the ability to construct bonfires with wooden logs; perfect for keeping you our your fellow spessman warm---forever
+ Adds in a few new bartender drinks and recipes, such as chocolate pudding, vanilla pudding, and pumpkin spice
+ Can now wear some flowers/ambrosia in your hair
+ Combining genes form different plants has unique effects (For instance, the battery gene with the recharging gene allows you to make insanely potent batteries)
+ Vines are now purely handled by the Kudzu plant
+ Botanists have been given morgue access
+
+
Ported by Markolie, developed by KorPhaeron and others from /tg/. The Hierophant was developed by ChangelingRain. updated:
+
+ Megafauna and their rewards have been added to the code. These are not on the map yet.
+ Fireball is now a targeted spell instead of a dumbfire spell.
+ Most spells, wands and staffs now have unique spell sounds.
+ Added a new nullrod type, the "spellblade".
+ Added bows, arrows and quivers. Currently only available for admins.
+ Added cockroaches. Currently only available for admins.
+ Added support for BYOND medals. Currently disabled.
+ Added a number of Lavaland objects (flora, basalt, food and stacks). Currently only available for admins.
+ Earmuffs can now be produced in autolathes.
+ Syndicate gun turrets are now subtypes of regular turrets: this makes them controllable with Syndicate ID's and improves their targeting.
+ Diona and Shadow People now receive a warning when they're not exposed/exposed to light.
+ The sniper AP rounds that Nuke Ops can purchase now have a chance of dismembering limbs.
+ Shadow People can now switch their night vision properly.
+ Certain messages in chat weren't showing up in their proper (large) size, such as the Nar'Sie spawned message. This has been resolved.
+
+
uraniummeltdown updated:
+
+ Supply ID skin is now selectable in the Agent ID and ID Computer
+
+
+
03 February 2017
+
DrunkDwarf updated:
+
+ Set the Mr Chang's vending machine to be refillable
+ Added a Supply Crate to the Vending section of the Cargo Request Console for Chinese Refill Canisters
+
+
+
02 February 2017
+
Alexshreds updated:
+
+ Deconstructing closets yields the proper amount of metal
+
+
Kyep updated:
+
+ Using the 'summon narsie' rune as cult, when you don't have the objective to do so, is now punished by the cult's god. Just as using the 'call forth the slaughter' rune, when you don't have the objective to do that, is already punished.
+
+
uraniummeltdown updated:
+
+ Engineering Cyborgs now have a digital copy of the station blueprints.
+
+
+
31 January 2017
+
Ar3nn updated:
+
+ cursed cluwne mask now allows internals to be fed through it
+
+
FalseIncarnate updated:
+
+ All requests consoles can print off a single-use, pre-tagged Shipping Package for sending a single item via disposals to a destination of your choosing.
+ Shipping Packages can be used to tag packages wrapped with wrapping paper, in case you don't have access to cargo's destination tagger.
+ Requests Consoles log the printer and destination of all shipping labels printed from that particular console. There currently is no way to clear your mailing history, so mail responsibly.
+
+
Fethas updated:
+
+ Fixes a rune runtime.
+
+
FlattestGuitar updated:
+
+ adds an admin-only laser carbine
+
+
uraniummeltdown updated:
+
+ Your game window will now flash on receiving Admin PMs, being revived, and ghost roles. You can disable this in Game Preferences.
+
+
+
30 January 2017
+
Alexshreds updated:
+
+ No more double traitor 241 Special
+
+
+
29 January 2017
+
uraniummeltdown updated:
+
+ You can now take items directly out of a storage item in your backpack.
+
+
+
27 January 2017
+
Alffd updated:
+
+ Adds missing hat and shoe sprites that were inadvertently deleted.
+
+
Fox McCloud updated:
+
+ Adds in stungloves (inaccessible to players)
+
+
uraniummeltdown updated:
+
+ Injecting a rainbow slime extract with blood will create a consciousness transference potion.
+ Injecting a metal slime extract with water will create 15 sheets of glass and 5 sheets of reinforced glass.
+ Slime potions now check for proximity.
+
+
+
26 January 2017
+
FalseIncarnate updated:
+
+ Plasma dust can now be used to rig lights and power cells, like the plasma reagent, with explosive results.
+
+
Fethas updated:
+
+ Adds two new holy weapon skins for people who belive in ghosts and worshipers of the silentfather.
+
+
FreeStylaLT updated:
+
+ AI sat transport tubes are no longer misaligned
+
+
+
25 January 2017
+
FlattestGuitar updated:
+
+ Fixes shadowlings thrall scaling
+
+
scrubmcnoob updated:
+
+ Shadowling Thrall count now scales to a max of 25.
+ Shadowling Thralls lose lesser glare
+
+
+
23 January 2017
+
FalseIncarnate updated:
+
+ Returns the ability to remove vacant soil with shovels and spades, and adds the ability to dig up plants in soil to remove them instantly.
+
+
Stratus updated:
+
+ NT Enforcer .45 pistol.
+ .45 and 9mm rubber bullets.
+ New shotgun ammo boxes.
+
+
+
18 January 2017
+
AndriiYukhymchak updated:
+
+ multitool can now be used to swap directions of TEG's circulator
+
+
Fethas updated:
+
+ Adds in the check numbers proc to converting, I missed it from VG.
+ Removed a redundent sacrefice objective check AND fixed the sacrfice objective check so it actually PICKs on mode start.
+ changed the color of manfested ghost humans to grey...huehuehuehuehue(serously it helps tell them apart better).
+ mass convert objective now picks between 9 and 15 as a target instead of based on round pop..cuase 30 MIGHT be a bit much.
+ adds admin cult tools Bypass phase (missed this off vg) and cult mind speak(YOUR GOD IS DISPLEASED GIT GUD). Might be better in secret panel but it confuses me.
+ Removes errent invisaible animals from the narnar escape shuttle template.
+
+
KasparoVy updated:
+
+ Characters with the obese disability are now fat beneath their clothes.
+
+
Markolie updated:
+
+ Admin announcements are no longer sent to player in the lobby.
+ Regular announcements can now only be heard if you the player is alive, not deaf and in range of an enabled radio.
+
+
+
17 January 2017
+
Crazylemon64 updated:
+
+ Joined Souls works now
+ Scribing the end rune now no longer is impossible
+
+
Krausus updated:
+
+ Fixed the exciting new emoji breaking chat entirely for IE8 users. :clap:
+
+
+
16 January 2017
+
Alexshreds updated:
+
+ Revenants can now breathe in space.
+ Can no longer exploit RCDs for metal
+
+
Krausus updated:
+
+ You can now use pills and patches on people with full bellies.
+ The Randomized Character Slot option now actually works.
+
+
15 January 2017
+
Funce updated:
+
+ dual-port air vents can now be unwrenched
+
TullyBurnalot updated:
Broken and Burned bulbs are no longer forced on with every overload.
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 99225fb7f37..a9d60e02724 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3360,7 +3360,1451 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: Players will no longer be informed of what cult may or may not exist on
round start.
2017-01-15:
+ Funce:
+ - bugfix: dual-port air vents can now be unwrenched
TullyBurnalot:
- bugfix: Broken and Burned bulbs are no longer forced on with every overload.
- tweak: Only non-broken and non-burned bulbs actually break and spark on an overload.
- bugfix: Fixes a single syntax error in the Shadowling Ascendant descriptive text.
+2017-01-16:
+ Alexshreds:
+ - bugfix: Revenants can now breathe in space.
+ - bugfix: Can no longer exploit RCDs for metal
+ Krausus:
+ - bugfix: You can now use pills and patches on people with full bellies.
+ - bugfix: The Randomized Character Slot option now actually works.
+2017-01-17:
+ Crazylemon64:
+ - bugfix: Joined Souls works now
+ - bugfix: Scribing the end rune now no longer is impossible
+ Krausus:
+ - bugfix: 'Fixed the exciting new emoji breaking chat entirely for IE8 users. :clap:'
+2017-01-18:
+ AndriiYukhymchak:
+ - tweak: multitool can now be used to swap directions of TEG's circulator
+ Fethas:
+ - bugfix: Adds in the check numbers proc to converting, I missed it from VG.
+ - bugfix: Removed a redundent sacrefice objective check AND fixed the sacrfice objective
+ check so it actually PICKs on mode start.
+ - tweak: changed the color of manfested ghost humans to grey...huehuehuehuehue(serously
+ it helps tell them apart better).
+ - tweak: mass convert objective now picks between 9 and 15 as a target instead of
+ based on round pop..cuase 30 MIGHT be a bit much.
+ - rscadd: adds admin cult tools Bypass phase (missed this off vg) and cult mind
+ speak(YOUR GOD IS DISPLEASED GIT GUD). Might be better in secret panel but it
+ confuses me.
+ - tweak: Removes errent invisaible animals from the narnar escape shuttle template.
+ KasparoVy:
+ - bugfix: Characters with the obese disability are now fat beneath their clothes.
+ Markolie:
+ - tweak: Admin announcements are no longer sent to player in the lobby.
+ - tweak: Regular announcements can now only be heard if you the player is alive,
+ not deaf and in range of an enabled radio.
+2017-01-23:
+ FalseIncarnate:
+ - rscadd: Returns the ability to remove vacant soil with shovels and spades, and
+ adds the ability to dig up plants in soil to remove them instantly.
+ Stratus:
+ - rscadd: NT Enforcer .45 pistol.
+ - rscadd: .45 and 9mm rubber bullets.
+ - imageadd: New shotgun ammo boxes.
+2017-01-25:
+ FlattestGuitar:
+ - tweak: Fixes shadowlings thrall scaling
+ scrubmcnoob:
+ - tweak: Shadowling Thrall count now scales to a max of 25.
+ - tweak: Shadowling Thralls lose lesser glare
+2017-01-26:
+ FalseIncarnate:
+ - tweak: Plasma dust can now be used to rig lights and power cells, like the plasma
+ reagent, with explosive results.
+ Fethas:
+ - rscadd: Adds two new holy weapon skins for people who belive in ghosts and worshipers
+ of the silentfather.
+ FreeStylaLT:
+ - tweak: AI sat transport tubes are no longer misaligned
+2017-01-27:
+ Alffd:
+ - bugfix: Adds missing hat and shoe sprites that were inadvertently deleted.
+ Fox McCloud:
+ - rscadd: Adds in stungloves (inaccessible to players)
+ uraniummeltdown:
+ - rscadd: Injecting a rainbow slime extract with blood will create a consciousness
+ transference potion.
+ - rscadd: Injecting a metal slime extract with water will create 15 sheets of glass
+ and 5 sheets of reinforced glass.
+ - bugfix: Slime potions now check for proximity.
+2017-01-29:
+ uraniummeltdown:
+ - tweak: You can now take items directly out of a storage item in your backpack.
+2017-01-30:
+ Alexshreds:
+ - bugfix: No more double traitor 241 Special
+2017-01-31:
+ Ar3nn:
+ - tweak: cursed cluwne mask now allows internals to be fed through it
+ FalseIncarnate:
+ - rscadd: All requests consoles can print off a single-use, pre-tagged Shipping
+ Package for sending a single item via disposals to a destination of your choosing.
+ - rscadd: Shipping Packages can be used to tag packages wrapped with wrapping paper,
+ in case you don't have access to cargo's destination tagger.
+ - rscadd: Requests Consoles log the printer and destination of all shipping labels
+ printed from that particular console. There currently is no way to clear your
+ mailing history, so mail responsibly.
+ Fethas:
+ - bugfix: Fixes a rune runtime.
+ FlattestGuitar:
+ - rscadd: adds an admin-only laser carbine
+ uraniummeltdown:
+ - rscadd: Your game window will now flash on receiving Admin PMs, being revived,
+ and ghost roles. You can disable this in Game Preferences.
+2017-02-02:
+ Alexshreds:
+ - bugfix: Deconstructing closets yields the proper amount of metal
+ Kyep:
+ - tweak: Using the 'summon narsie' rune as cult, when you don't have the objective
+ to do so, is now punished by the cult's god. Just as using the 'call forth the
+ slaughter' rune, when you don't have the objective to do that, is already punished.
+ uraniummeltdown:
+ - rscadd: Engineering Cyborgs now have a digital copy of the station blueprints.
+2017-02-03:
+ DrunkDwarf:
+ - tweak: Set the Mr Chang's vending machine to be refillable
+ - rscadd: Added a Supply Crate to the Vending section of the Cargo Request Console
+ for Chinese Refill Canisters
+2017-02-05:
+ Fethas:
+ - tweak: Brings unholy water in line with its description.
+ Fox McCloud and Core0verload:
+ - rscadd: Dramatically overhauls the botany system; features more user friendly
+ gene modification methods, more control over attributes and reagents in your
+ plants, and more
+ - rscadd: Adds in drying rack for drying growns for smoking with rolled papers
+ - tweak: Store spare seeds in the seed extractor
+ - rscadd: Adds in cloth; make clothing, satchels, backpacks, duffelbags and more.
+ - tweak: Upgrading hydroponics trays impacts how quickly plants degrade
+ - tweak: Bees slightly more effective at increasing plant yields
+ - tweak: Overall growth rate of plants dramatically increased
+ - rscadd: Adds in the ability to construct bonfires with wooden logs; perfect for
+ keeping you our your fellow spessman warm---forever
+ - rscadd: Adds in a few new bartender drinks and recipes, such as chocolate pudding,
+ vanilla pudding, and pumpkin spice
+ - tweak: Can now wear some flowers/ambrosia in your hair
+ - tweak: Combining genes form different plants has unique effects (For instance,
+ the battery gene with the recharging gene allows you to make insanely potent
+ batteries)
+ - tweak: Vines are now purely handled by the Kudzu plant
+ - tweak: Botanists have been given morgue access
+ Ported by Markolie, developed by KorPhaeron and others from /tg/. The Hierophant was developed by ChangelingRain.:
+ - rscadd: Megafauna and their rewards have been added to the code. These are not
+ on the map yet.
+ - rscadd: Fireball is now a targeted spell instead of a dumbfire spell.
+ - rscadd: Most spells, wands and staffs now have unique spell sounds.
+ - rscadd: Added a new nullrod type, the "spellblade".
+ - rscadd: Added bows, arrows and quivers. Currently only available for admins.
+ - rscadd: Added cockroaches. Currently only available for admins.
+ - rscadd: Added support for BYOND medals. Currently disabled.
+ - rscadd: Added a number of Lavaland objects (flora, basalt, food and stacks). Currently
+ only available for admins.
+ - rscadd: Earmuffs can now be produced in autolathes.
+ - tweak: 'Syndicate gun turrets are now subtypes of regular turrets: this makes
+ them controllable with Syndicate ID''s and improves their targeting.'
+ - tweak: Diona and Shadow People now receive a warning when they're not exposed/exposed
+ to light.
+ - tweak: The sniper AP rounds that Nuke Ops can purchase now have a chance of dismembering
+ limbs.
+ - bugfix: Shadow People can now switch their night vision properly.
+ - bugfix: Certain messages in chat weren't showing up in their proper (large) size,
+ such as the Nar'Sie spawned message. This has been resolved.
+ uraniummeltdown:
+ - bugfix: Supply ID skin is now selectable in the Agent ID and ID Computer
+2017-02-06:
+ Fox McCloud:
+ - bugfix: Fixes traitor banana peels having no sprite
+ - tweak: Stunprods are constructed with igniters instead of wirecutters
+ - tweak: Stunprods will spark when you stun someone with them
+ - rscadd: Expands the amount of cryodorm pods
+ KasparoVy:
+ - bugfix: IPC names with numbers now load correctly from SQL.
+ Kyep:
+ - bugfix: Autoprocess cloners will no longer clone people who cryo and ghost out,
+ or otherwise deliberately remove themselves from the round.
+ - tweak: Dead miners in UO45 away mission are no longer naked.
+ - bugfix: ERT and SST shuttle consoles now require the appropriate access to use.
+ uraniummeltdown:
+ - tweak: You can interact with an ore box by using an advanced mining scanner on
+ it.
+ - rscadd: Xenobiology Console is now constructible, board has been added to the
+ Circuit Imprinter.
+ - rscadd: Plasmaman IAA/Lawyers now have a unique suit.
+ - rscadd: AI control beacons are a new item created from the exosuit fabricator.
+ When installed into a mech, it allows AIs to jump to and from that mech freely.
+ Note that malfunctioning AIs with the domination power unlocked will instead
+ be forced to dominate the mech.
+ - rscadd: 'Changelings have a new default ability: Hivemind Link. This lets you
+ bring a neck-grabbed victim into the hivemind for a few minutes. You can talk
+ to your victims and perhaps persuade them to help you, give you intel, or even
+ a PDA code. Victims in crit will be stabilized.'
+ - rscadd: Added new AI core sprites from TG
+ - rscadd: Added Vox rad suit, bombsuit hood, paramedic EVA suit sprites from /vg/
+ - tweak: You can click AI displays as an AI to change them
+2017-02-07:
+ Fox MCCloud:
+ - tweak: Tank transfer valves have in-hand icons
+ - tweak: 'Tank transfer valves with large tanks (ie: jetpacks) cannot fit in backpacks'
+ Fox McCloud:
+ - bugfix: fixes xeno eggs taking damgae from disablers
+ - tweak: adjusts most botany plant reagents to have "plantmatter" as opposed to
+ nutriment
+ - tweak: Blumpkins now have plasma in them
+ - bugfix: Fixes plant grown diona not being allied with plants and vines
+ - rscadd: Water coolers now dispense cups when clicking on them with a free hand
+ - tweak: reagent tank dispensing amount based on the container instead of the tank
+ - bugfix: Fixes beaker spilling when placing a beaker into an ice cream machine
+ - rscadd: Adds in 100,000 unit water tanks to cargo for 12 points
+ - tweak: regular water tank cost reduced from 8 to 6 points
+ - tweak: Monkey cubes in boxes no longer start off wrapped
+ - tweak: All monkey cube boxes at cargo are the same price
+ - bugfix: Fixes Nymphs not being able to cross over top of hydroponics trays
+ - tweak: Diona fertilizing and weed eating is handled by clicking on the tray as
+ a nymph rather than verbs
+ KasparoVy:
+ - rscadd: Storage implants are now checked for steal objective items.
+ Kyep:
+ - tweak: AI holograms now transfer between holopads as the AI moves around.
+ uraniummeltdown:
+ - rscadd: Engineering and Science crates now have new sprites
+ - bugfix: Changelings can recall the memories of an absorb victim
+ - rscadd: Changelings will recall some speech of their absorb victims
+ - rscadd: You can now create floor tiles from minerals. Be careful around plasma
+ and uranium floors though.
+2017-02-08:
+ Fox McCloud:
+ - bugfix: Grinding wheat and other products produces the proper reagents again
+2017-02-10:
+ Fox McCloud:
+ - bugfix: Fixes not being able to bloodcrawl in most sources of blood
+ - bugfix: Fixes slaughter demon whisper not working at all
+ - tweak: Drying rack drying now properly uses NanoUI instead of a right-click verb
+ - bugfix: Fixes produce appearing stuck in a drying rack when it was empty
+ - bugfix: Fixes a few failed icon updates with the drying rack
+ KasparoVy, Krausus:
+ - rscadd: Adds the colourblindness gene. It is eye-dependent, and can be transferred
+ from person-to-person with the eye organ.
+ - rscadd: Colourblindness can be detected by the advanced medical scanner just like
+ blindness and short-sightedness.
+ - rscadd: Vulpkanin and Tajara can now choose to be uniquely colourblind in exchange
+ for fantastic darksight. The default option is colour vision but low darksight.
+ - rscadd: Selecting mechanical or mechanically assisted eyes at character creation
+ grants full colour vision, but standard Human darksight. This overrides the
+ colour vision preference.
+ - rscadd: Mechanical(ly assisted) internal organs such as hearts and eyes are now
+ appropriately named, and have appropriate sprites.
+ - tweak: Vulpkanin and Tajara monkey-forms (Wolpins and Farwas) are incurably colourblind
+ but have excellent darksight as they get nearly the same organs as their greater
+ forms.
+ - bugfix: Increases reliability of turning into a monkey.
+ - bugfix: Fixes a bug with changelings lesser-forming, transforming and humanforming
+ into a different identity.
+ Markolie:
+ - rscadd: Firelocks can now be constructed and deconstructed.
+ - tweak: Firelocks no longer show a confirmation message when being opened.
+ - tweak: Various map fixes (vents, scrubbers, firelocks and intercoms). Also removes
+ the firelocks covering the windows in escape/cargo.
+ tigercat2000:
+ - rscadd: Ported Goonstation slash /vg/ lighting. Pretty.
+ uraniummeltdown:
+ - rscadd: Quantum Pads are now buildable in R&D!
+ - rscadd: Quantum Pads, once built, can be linked to other Quantum Pads using a
+ multitool. Using a Pad which has been linked will teleport everything on the
+ sending pad to the linked pad!
+ - rscadd: 'Pads do not need to be linked in pairs: Pad A can lead to Pad B which
+ can lead to pad C.'
+ - rscadd: Upgrading a Quantum Pad will reduce the cooldown, charge-up time, and
+ power consumption.
+ - rscadd: Quantum Pads require a bluespace crystal, a micro manipulator, a capacitor
+ and a cable piece.
+ - tweak: Events now scale better with population.
+ - tweak: Enabled immovable rod, slaughter demon and morph events.
+2017-02-11:
+ Markolie:
+ - rscadd: Ports over the remaining Lavaland loot items from /tg/ (most developed
+ by KorPhaeron).
+ - rscadd: 'Refactors the kinetic accelerator to use modkits instead of subtypes:
+ these unique mods (such as more range or shorter cooldown) can be purchased
+ from the mining vendor or built by R&D or robotics (developed by KorPhaeron).'
+2017-02-12:
+ Fox McCloud:
+ - bugfix: Fixes erroneous access on inner morgue door which was granting people
+ with morgue access, access to the entirety of medical bay
+ Kyep:
+ - tweak: added two more mining hardsuits to the mining outpost.
+ uraniummeltdown:
+ - rscadd: Whetstones have been resprited
+ - rscadd: Drying racks have new sprites.
+2017-02-13:
+ Crazylemon64:
+ - bugfix: Achieving higher growth rates on kudzu will result in a faster-growing
+ vine when planted
+ Fethas:
+ - tweak: 'Metastation: The escape shuttle doors should no longer be security access
+ only.'
+ - tweak: 'Metastation: Hooks up disposals door control.'
+ - tweak: 'Cyberiad: Untriggers Neca and makes the floor tiles in the emergecny wing
+ sec area plating.'
+ - tweak: 'Cyberiad: Moves the cargo mail room table onto the otherside of the window
+ so you can actually OPEN IT.'
+ Fluff12:
+ - rscadd: Greys can now choose to speak in wingdings or not. The Voice option is
+ right below Species in character creation if Grey is selected - make sure you
+ have it set to what you want!
+ Fox McCloud:
+ - tweak: improves the tatortot sprite
+ Kyep:
+ - tweak: Playtime requirements for IAAs have been set at 5 hours (similar to Sec
+ Officer). Playtime requirements for Captains and AI have been increased from
+ 10 hours to 20 hours.
+ - tweak: Mech-mounted teleporters are no longer massively overpowered. They now
+ consume a huge amount of energy to use, to the point that crew mechs with them
+ can only use them a few times. They can no longer be spammed. Dark Gygax mechs
+ used by nuclear operatives get a better version of the teleporter, which has
+ around 40 uses, and is more precise.
+ - bugfix: Fixed several bugs related to Terror Spider webs.
+ - tweak: Terror Spiders have been rebalanced. Spiders are no longer spaceproof,
+ princes are now proper minibosses, and more.
+ - rscadd: Several new classes of Terror Spiders (green, white, purple, queen, mother)
+ have been added - including types which can breed. This creates new strategy
+ around nest defense.
+ Markolie:
+ - bugfix: Fixed a number of genetics powers not working.
+ - bugfix: Posibrains can no longer whisper when silenced.
+ - bugfix: Syndicate turrets will no longer target the Syndicate pAI found on their
+ outpost.
+ - bugfix: Fixed the "Swedish" disability occasionally hiding parts of speech.
+ - bugfix: Mouthless players can no longer eat crayons (such as IPC's).
+ - bugfix: Instruments can now be interacted with while buckled.
+ - bugfix: Emagging a single fax machine will no longer give all fax machines access
+ to the Syndicate destination.
+ - bugfix: Evidence bags will now always show the item inside of them.
+ - bugfix: Spacepods leaving a trail of humans instead of ion trail effects.
+ uraniummeltdown:
+ - rscadd: Nuclear Operatives can customize the Declaration of War.
+ - rscadd: The RSF has a unique sprite.
+2017-02-14:
+ Developed by Cyberboss, ported by Markolie:
+ - tweak: Progress bars will now stack vertically.
+ - bugfix: Progress bars will no longer be affected by lighting.
+ DrunkDwarf:
+ - rscadd: Adds a section to the Airlock menu of the RCD to allow specifying the
+ name of the new Airlock
+ Fethas:
+ - bugfix: You can no longer put anything THAT IS ALREADY A CULTIST IN A SOULSTONE....AT
+ ALL.
+ - bugfix: Readds missing beserker robe sprite.
+ - tweak: Cap growth serum at 1.5
+ Fox McCloud:
+ - tweak: Xenobiology console should be more responsive when using/exiting using
+ it
+ - tweak: Xenobiology console can now be loaded with a bag
+ - bugfix: Using monkey cubes on the Xenobiology console no longer makes you attempt
+ to utilize the console
+ Markolie:
+ - bugfix: The kinetic accelerator sprite modkits now apply properly when the kinetic
+ accelerator is empty.
+ - bugfix: Welding tools now once again have a proper in-hand when turned on.
+2017-02-15:
+ Alexshreds:
+ - rscadd: Coughing and sneezing now plays sounds.
+ Ausops:
+ - rscadd: Internals and plasma tanks have been resprited.
+ Crazylemon64:
+ - experiment: Phlogiston now ignites consistently upon application
+ FlimFlamm:
+ - rscadd: New decals for boxes. Just apply a pen to change them (while they're open)!
+ KasparoVy:
+ - rscadd: You can now choose to speak anonymously in deadchat from round-start game
+ preferences.
+ - tweak: Your decision to speak anonymously in deadchat now persists between ghostings.
+ - bugfix: Vox tails won't change colour when other Vox spawn in anymore.
+ Markolie:
+ - bugfix: Mine bots once again only do ten damage in pressurized areas
+ Twinmold93:
+ - bugfix: Blob Conscious Split now properly scales the requirement of blob tiles
+ to win.
+ uraniummeltdown:
+ - rscadd: Borers now have action buttons
+ - tweak: Borer names are now dependent on generation
+2017-02-16:
+ Crazylemon64:
+ - tweak: Slime people and Dionae now make sounds when coughing
+ KasparoVy:
+ - bugfix: Welding goggles and welding gas masks now properly affect your vision.
+ davipatury:
+ - spellcheck: changed urnaium to uranium in wt-550 auto gun uranium magazine design
+ uraniummeltdown:
+ - rscadd: The wizard has a new spell, Rod Form, which allows him to transform into
+ an immovable rod.
+ - bugfix: Ethereal beings no longer cause bananium floor tiles to squeak.
+2017-02-17:
+ Crazylemon64:
+ - experiment: Space vines now have a mutation that lets them grow in a more intelligent
+ manner
+ Ported by Markolie, developed by AnturK:
+ - rscadd: Station Goals have been ported from /tg/. These optional goals are big
+ projects given to the station by Central Command, requiring interdepartmental
+ cooperation and a huge number of resources to complete.
+ - rscadd: 'Three station goals have been added: bluespace artillery construction,
+ meteor shield satellite network and DNA vault.'
+ - bugfix: Fixes the "Messages" tab of the communications computer.
+2017-02-18:
+ Alffd:
+ - bugfix: Fixes missing entries in species/station for Vox cough and sneeze.
+ Crazylemon64:
+ - bugfix: Centcomm has begun enforcing stricter security protocols after a recent
+ influx of fax responses from Clown impersonators
+ - bugfix: Mind transfer abilities work again
+ - bugfix: Centcomm is no longer obnoxiously pedantic, regarding BSA deployment
+ Krausus:
+ - tweak: End-of-round sounds will now play just in time for them to end as the server
+ reboots, rather than starting the moment it reboots.
+ Kyep:
+ - rscadd: Added a 'take' option to ahelps/mhelps, so admins/mentors can quickly
+ let the asker know their question is being looked at.
+ Markolie:
+ - rscadd: Vending machines, newscasters, biogenerators, plant DNA manipulators,
+ seed extractors, bots, fax machines, photocopiers, AI slippers, cell door timers,
+ airlocks, pipe dispensers and atmospherics machinery that open a window can
+ now be viewed by ghosts.
+ - rscadd: Admins can now interact with mass driver, crematorium, ignition, light,
+ flashers and flasher switches and door switches, as well as airlocks, windoors,
+ firedoors and atmospherics machinery that do not open a window if they have
+ advanced admin interaction enabled (under the "Admin" tab).
+ - bugfix: Slicing disposal pipes now shows a progress bar.
+ uraniummeltdown:
+ - rscadd: Shuttle engines have new sprites.
+2017-02-19:
+ Markolie:
+ - bugfix: Claw games no longer eat up all glass sheets in the stack when constructed.
+2017-02-20:
+ Markolie:
+ - rscadd: The chaplain on the Cyberiad map now has a one-use soulstone.
+ - tweak: The chaplain's soul stone on MetaStation can now only be used once.
+ davipatury:
+ - rscadd: Shuttle Console now uses Nano-UI.
+ tigercat2000:
+ - rscadd: The AI has a button next to radio messages to open the door closest to
+ the speaker. ;AI, Open this fucking door!
+2017-02-21:
+ Crazylemon64:
+ - bugfix: Autolathes can be hacked again
+ KasparoVy:
+ - tweak: Removes rogue super-bright pixel at top of Vulpkanin Adhara hairstyle north
+ and south facing sprites.
+ Kyep:
+ - rscdel: Deleted clown planet away mission.
+ - tweak: blobs now spawn with a player in control, instantly. There is no longer
+ a 30 second period where they exist, but nobody is controlling them.
+ - tweak: blobs now get extra time after spawn, before they are announced.
+ Markolie:
+ - bugfix: Megaphones can no longer be used by mute people.
+ - bugfix: Rechargers will no longer recharge stacks beyond their max amount or restack
+ 0.5 sheets.
+ - bugfix: Ranged guardians now have a proper one second cooldown instead of 0.1
+ seconds.
+ - bugfix: Cult can no longer soul stone manifested ghosts.
+ davipatury:
+ - rscadd: Autolathe now uses Nano-UI.
+ uraniummeltdown:
+ - bugfix: Shuttle engines should now face the correct way
+2017-02-22:
+ KasparoVy:
+ - rscadd: 'You can now toggle on/off the gladiator helmet''s face-shield with an
+ action button. This is totally cosmetic. imgadd: Adds a bunch of new helmet
+ sprites for Vox.'
+ - tweak: Slightly adjusts the Vox knight armour sprites (not the Templar armour)
+ to look nicer with the new helmets.
+ - bugfix: The Admin 'Select Equipment' debug verb now appropriately equips Armalis
+ when the 'Vox' option is selected.
+2017-02-23:
+ Krausus:
+ - tweak: Ghost candidate alert boxes ("Do you want to play as a thing?") will now
+ have "No" as the leftmost, default option, which you will accidentally pick
+ when it pops up while you're trying to type, but at least you won't be stuck
+ as the thing when you didn't actually want to be that thing.
+ Markolie:
+ - tweak: The meteor shield satellite station goal coverage goal has been increased
+ tenfold.
+2017-02-24:
+ FalseIncarnate:
+ - bugfix: Corn and bananas can be properly deepfried into their special results
+ again.
+ - bugfix: Rice can be properly ground into a reagent again.
+ - rscadd: Hydroponics trays once again are equipped with Bee-proof lids to keep
+ unwanted pollination to a minimum. This only works if you actually toggle the
+ lid closed though!
+ - tweak: Plants age slightly slower, so your space farming should no longer feel
+ like it outpaces a meth'd up blue hedgehog in sneakers.
+ Kyep:
+ - bugfix: Fixes blob spawns prompting players twice.
+ Markolie:
+ - bugfix: Mining pod weapons are once again functional. Compared to regular kinetic
+ accelerators, the weak projectile has one additional range (3 --> 4). The regular
+ projectile's damage is increased (40 --> 50) and deals more damage in pressurized
+ environments (50% instead of 25%). The enhanced projectile is able to fire its
+ kinetic projectile AoE against turfs and mobs.
+ - bugfix: Fixed an issue where it was impossible to log out from fax machines.
+ - bugfix: It is no longer possible to steal ID cards from identification computers/fax
+ machine using telekinesis at range.
+ - bugfix: The follow link on death alarms now works.
+ - bugfix: Fixes an exploit where players could use the ambulance trolley to teleport.
+ - bugfix: The chef now properly shows a chef hat on character preview.
+ - bugfix: The nuclear ops game mode will no longer always result in a major crew
+ victory.
+ - tweak: Players with their face covered will no longer show their flavor text upon
+ examine.
+ - rscadd: Fax machines now have an "Eject ID card" verb so you can remove the inserted
+ ID when it is depowered.
+ - tweak: Firelocks are now more lethal.
+ - rscadd: Firelocks now crush players standing inside them when they finish closing.
+ - rscadd: 'Firelocks can no longer be instantly opened by hand: it requires thirty
+ seconds and will autoclose in five seconds if there is still an atmospherics
+ alert present in the area. They can no longer be closed by hand. Heavy firelocks
+ can not be forced by hand.'
+ - bugfix: Atmospherics technicians can once again remotely modify all settings on
+ air alarms through the central atmospherics console.
+ Purpose2:
+ - tweak: Captain's crown is now part of the random hats crate, and no longer spawns
+ in their locker.
+ Twinmold93:
+ - rscadd: Ability to label bloodpacks with a pen, so you can now label a bloodpack
+ from donations without a handlabeler.
+ - rscadd: Bloodpacks will now change name to say if they are empty or not.
+ davipatury:
+ - rscadd: EFTPOS now uses Nano-UI.
+ - rscadd: Medical Records now uses Nano-UI.
+ - rscadd: Employment Records now uses Nano-UI.
+2017-02-25:
+ Crazylemon64:
+ - bugfix: Telecomms monitor is now infused with fastitude
+ FlattestGuitar:
+ - tweak: Escape has been re-bushed.
+ KasparoVy:
+ - rscadd: Reagent plasma has a weak healing effect on Plasmamen when injected and
+ will not poison them.
+ - rscadd: Reagent oxygen is as toxic to Vox as reagent plasma is to just about anyone.
+ - rscadd: Plasmamen now join the shift with 2 suit auto-extinguisher refill cartridges
+ which, individually, will fully refill an empty Plasmaman suit's autoextinguisherl.
+ - rscadd: Plasmaman suits now auto-extinguish and will be able to do so 5 times
+ before they can be refilled by a cartridge.
+ - tweak: Plasmamen no longer burn in a vacuum or in plasma-pure environments.
+ davipatury:
+ - rscadd: Security Records now uses Nano-UI.
+2017-02-26:
+ Crazylemon64:
+ - tweak: Immovable rod events now vanish after going through the station once
+ - bugfix: Firelocks can now be operated by AIs again
+ - bugfix: Barbers and captains get the right stuff now
+ - rscadd: It's now possible to have random floors or walls when mapping
+ KasparoVy:
+ - bugfix: Fixes a bug where you could get a part of a rigsuit stuck to your hand
+ by deploying it twice.
+ - tweak: Improves the readability of some rigsuit verbs.
+ Kyep:
+ - bugfix: players will no longer spawn with loadout items their job has no access
+ to.
+ - tweak: AI & Borg upload consoles now have to be on the station zlevel to work.
+ davipatury:
+ - rscadd: ATM now uses Nano-UI.
+2017-02-27:
+ uraniummeltdown:
+ - rscadd: Mineral statues are here! Use 5 sheets of any mineral including sandstone
+ to make one. Be careful around plasma and uranium statues!
+ - rscadd: The mime's office now comes with a statue too.
+ - tweak: Updated plasma, uranium and diamond floor sprites to TG's newer ones.
+2017-02-28:
+ KasparoVy:
+ - bugfix: Plasmaman suits will now only auto-extinguish if you're actually on fire
+ (and not just taking a shower).
+2017-03-01:
+ Crazylemon64:
+ - rscadd: Kudzu vines now can yield materials if carefully tended to
+ Fethas:
+ - tweak: 2 second cooldown on the rest verb. You are not Neo, knock it off.
+ - rscadd: StopResting and StartResting Procs are not on the rest verb.
+ - tweak: Various metastation fixes.
+ KasparoVy:
+ - bugfix: Plasmaman multiverse sword copies are now properly equipped (suit, helmet,
+ internals, etc.)
+ - bugfix: Vox multiverse sword copies are now peoperly equipped (internals).
+ Kyep:
+ - bugfix: Fixed several Terror Spider things that should not be possible, like recharging
+ wireless guns, the 'evil-looking spiderlings' instant meta, and spiderlings
+ spacing themselves.
+ - tweak: Several Terror Spider balance and fun tweaks, such as giving the Prince
+ of Terror a new webbing ability, and ensuring queens/mothers can break open
+ vents, so they cannot be completely shut out late-round.
+ Purpose2:
+ - rscadd: Enables Cargo to order Wood planks
+2017-03-03:
+ FlauntestGuitar:
+ - rscadd: You will now be prompted on a karma purchase to confirm that you clicked
+ what you wanted to click
+ uraniummeltdown:
+ - rscadd: You can now change the input/output directons for Ore Redemption Machines
+ by using a multitool on them with the panel open.
+ - rscadd: Bluespace RPED beams have a new sprite
+2017-03-04:
+ Markolie:
+ - rscadd: Ghosts can now interact with ore dispensers, mining equipment vendors
+ and laptop vendors.
+ - rscadd: Admins can now interact with crates, closets, false walls and conveyor
+ switches if they have advanced interaction enabled.
+ davipatury:
+ - rscadd: Newscaster now uses Nano-UI.
+ - rscadd: Tank dispenser now uses Nano-UI.
+ - rscadd: Passive gate, pump and volume pump now uses Nano-UI.
+ - rscadd: Atmospherics filter and mixer now uses Nano-UI.
+ - rscadd: Wires now uses Nano-UI.
+2017-03-05:
+ Kyep:
+ - rscadd: Added Poison Pen, a stealthy way of applying a contact-based poison to
+ paper. Available to Syndicate HoPs, QMs, and Cargo Techs.
+ - tweak: Antags whose objectives are manually announced by an admin, or altered
+ automatically as a result of their target cryoing, will now hear a warning sound.
+ The sound is the same as the 'crew transfer vote called' sound. Additionally,
+ the text notice for changed objectives is more obvious.
+ MarsM0nd:
+ - bugfix: The grey satchel uses now the correct sprite instead of the leather one.
+2017-03-07:
+ Crazylemon64:
+ - rscadd: IPCs now come with a power cord implant to use to recharge from APCs.
+ - tweak: IPCs can now be genderless.
+ Kyep:
+ - rscdel: Deleted 'challenge' away mission.
+ MarsM0nd:
+ - rscadd: Cultists get shoes on usage of the armor talisman.
+ - rscadd: Cultists only get equipment if they have the slot for it free, weapons
+ are always spawned.
+ - tweak: The tome does a more fitting description of the talisman of armor.
+2017-03-08:
+ Alffd:
+ - rscadd: Farting on a bible now puts you at the mercy of the gods.
+ - rscdel: Removed automatic biblefarting gibbing.
+ FlaaaaaattestGuitar:
+ - tweak: Magistrate now starts their shift with a pair of white gloves as well as
+ Bridge and Meeting Room access.
+ Fox McCloud:
+ - tweak: money is now far easier to use, and distribute in amounts you would like
+ Kyep:
+ - tweak: 'Changed event probabilities, aiming for a more fun late game. In general,
+ events that do very little (e.g: meaty ores, rogue drones) are less likely.
+ Events that will keep people on their toes (e.g: anomalies) are more likely.
+ Events that might cause people to observe rather than joining the round (e.g:
+ Xenos) are less likely.'
+ uraniummeltdown:
+ - rscadd: Wizard Hardsuit helmet and suit now have inhand sprites
+2017-03-09:
+ Crazylemon64:
+ - rscadd: Adds an "ethereal beacon", an admin-only structure usable to attract ghosts
+ to an area.
+ - rscadd: Adds several transformer machines to streamline the ghost-to-PC process.
+ LordJike:
+ - tweak: Space Fries are now made by deep-frying potato wedges instead of processing
+ them.
+ - rscadd: Introducing carrots inside the food processor gives you carrot wedges
+ now.
+ - tweak: Now you can make carrot fries by deep-frying carrot wedges instead of formerly
+ processing the whole carrots.
+ Markolie:
+ - tweak: Tools now have a "usesound" and "toolspeed" variable which allows different
+ tool (levels) to have different sounds and speeds.
+ - tweak: Robots spawn with tools that are twice as fast as regular tools.
+ - rscadd: Abductor agents now spawn with a toolbelt with specialized abductor tools
+ that are very fast.
+ - tweak: Abductor surgery tools are now much faster.
+ - rscadd: Abductor (surgery) tools can now be constructed in R&D with a sufficiently
+ high "abductor" research level.
+ - tweak: The abductor multitool will now display what each wire does.
+ - rscadd: Admin ghosts can now interact with wires and see what each wire does.
+ - rscadd: Adds a set of unique tools for the Chief Engineer that he is given in
+ a unique toolbelt at roundstart. These tools are faster and can be created in
+ R&D with a sufficiently high R&D level.
+ - tweak: The AI detector has been refactored to have much more robust AI tracking.
+2017-03-10:
+ Jovaniph:
+ - tweak: Recitence no longer makes a sound when turning
+ Markolie:
+ - bugfix: The DNA Vault station goal will now be marked as completed properly.
+ - bugfix: Multi-tile airlocks will now change their direction properly.
+ - bugfix: The atmos skirt loadout item will now be equipped properly on round start.
+ - bugfix: Fixes the inhand disabler sprite pointing the wrong way in some directions.
+ - bugfix: The Janicart will no longer act as a jetpack.
+ - bugfix: You can now resist out of a borer's control again.
+ - bugfix: Fixes the general antag ban not working on certain conversion antagonists.
+ - bugfix: Fixes removing the trunk from underneath a chute/bin causing all sorts
+ of issues.
+ - bugfix: Fixes alt titles not showing up on ID's.
+ - bugfix: Mineral doors no longer block atmos (like they're supposed to).
+ - bugfix: Fixes the cortical borer hivemind talk not working.
+ - bugfix: Fixes detomatix cartridges not working *from* PDA's with an uplink (it
+ now no longer *on* a PDA with an uplink to prevent blowing up fellow traitors).
+ - bugfix: Fixes NODROP interaction with secure closets.
+ - bugfix: Fixes some stray fruit at the Syndicate base on Z2.
+ - bugfix: Fixes an incorrect camera network in the courtroom.
+ - bugfix: Fixes an issue where AI's would go blind upon travelling into space.
+ - tweak: The cortical borer hivemind talk key is now "bo".
+ - tweak: Attempting to blow up an undetonatable PDA (such as the captain's) will
+ now show a warning message. It will also no longer use up a charge.
+ - tweak: Animals can now open mineral doors and mineral doors will no longer be
+ closable if there's a mob inside.
+ - tweak: Matter grippers can now carry firelock electronics as well as bluespace
+ crystals (for construction).
+ - rscdel: Removes the pipe fitting on the table from atmospherics as it was broken.
+2017-03-11:
+ Developed by XDTM, ported by davipatury:
+ - tweak: Hallucinations have been modified to increase the creepiness factor and
+ reduce the boring factor.
+ - rscadd: Added some new hallucinations.
+ - bugfix: Fixed a bug where the singularity hallucination was stunning for longer
+ than intended and leaving the fake HUD crit icon permanently.
+ Flatty Patty:
+ - bugfix: all the tools have icons again
+ FlattyPatty:
+ - tweak: Improved Nanotrasen click manufacturing procedures now allow the flashlights
+ to make that classic clicking sound you know and love.
+ Fox McCloud:
+ - tweak: Buckshot now does a max of 70 damage, down from 90
+ KasparoVy:
+ - bugfix: Fixes a bug with certain tail markings rendering when they shouldn't.
+ Markolie:
+ - tweak: Firelocks forced by AI's, cyborgs at range or admin ghosts will now autoclose
+ if there's still an atmospherics alarm present.
+ - tweak: Regular (non-heavy) firelocks will now properly respond to explosions (100%
+ chance of being destroyed at severity 1 explosions and 50% at severity 2). Heavy
+ firelocks are still only destroyed in severity 1 explosions.
+ - tweak: Added a visible message to forcing airlocks with the Jaws of Life.
+ davipatury:
+ - rscadd: Ported Modular Computers from /tg/.
+ - rscadd: Ported Rapid Cable Layer from /vg/.
+ uraniummeltdown:
+ - rscadd: EVA has 2 more EVA Suits
+ - rscdel: Removed Vox-only EVA suits (the grey ones in EVA)
+ - tweak: Vox can now wear EVA suits
+2017-03-12:
+ Crazylemon64:
+ - bugfix: Kudzu should now be less of (but still) a station-destroying force of
+ nature.
+ - tweak: Bluespace kudzu now only pierces a single layer of walls before losing
+ its "charge".
+ - tweak: Aggressive spread now does not bust rwalls, but does attack obstructing
+ objects in its path.
+ - tweak: Kudzu now only spreads on space turfs when it has specific mutations to
+ do so.
+ - tweak: Kudzu events should be more interesting on their own.
+ Jovaniph:
+ - rscadd: Adds Vulpkanin EVA suit sprite
+ Kyep:
+ - tweak: Adjusted Wizard Academy to make it both more lethal, and more rewarding.
+ Markolie:
+ - tweak: The system for picking ghosts to inhabit cultist slaughter demons now shows
+ a confirmation prompt like most other role checks.
+ - bugfix: Fixed an issue where you could join as a cultist slaughter demon despite
+ having antagHUD enabled.
+ - bugfix: Fixed an issue where it was possible to weld statues without any fuel.
+ - tweak: It is no longer possible to spam the firelock force message.
+ Twinmold93:
+ - rscadd: Employment record laptop to Head of Personnel's Office. Moves package
+ wrap that was there to meeting room to be paired with the hand labeler there.
+2017-03-13:
+ Kyep:
+ - bugfix: Syndicate mobs in the Wild West are no longer so stupid that they trip
+ over, and die to, their own mines. This also means that they won't set their
+ own buildings on fire anymore.
+ - bugfix: Phazons' phase ability now works again.
+ - bugfix: Phazons' toxin injector melee damage type (a weak melee attack) now works
+ again.
+ uraniummeltdown:
+ - rscadd: Clicking on a tile with another tile and a crowbar or screwdriver in hand
+ directly replaces the tile.
+2017-03-14:
+ uraniummeltdown:
+ - rscadd: Strong supply talismans can now summon 5 sheets of runed metal.
+2017-03-15:
+ uraniummeltdown:
+ - rscadd: Plastic flaps can be deconstructed with tools and constructed using 5
+ sheets of plastic.
+ - rscadd: You can now damage grilles by throwing things at them.
+ - rscadd: You can rebuild broken grilles by using a metal rod on them.
+ - tweak: Metal rods maximum amount reduced from 60 to 50.
+2017-03-16:
+ FlattestGeetar:
+ - tweak: Workboots are now in the loadout system.
+ - rscadd: Ports winter boots from /tg/
+ Jovaniph:
+ - rscadd: New sounds to Firelocks and Airlock External
+ - rscadd: Door closing sound to Airlocks - from yogstation
+ Markolie:
+ - bugfix: Fixed revenant night vision not working.
+ - bugfix: Fixed the "X attacked Y" message showing up when welding vents.
+ - bugfix: Fixed the follow button on the cell door timer radio message not working.
+ - bugfix: Fixed the Jaws of Life being unable to force unpowered doors.
+ - bugfix: Fixed a number of preference options being unavailable when modifying
+ preferences while observing.
+ - bugfix: Fixed an issue where deleting security records wouldn't clear that player's
+ wanted status properly.
+ - bugfix: Fixed the cult "first meal" sacrifice objective not counting properly.
+ Also clarified what this objective actually entailed.
+ - bugfix: Fixed IPC's ocassionally being selected as a changeling "escape with X
+ identity" target.
+ - tweak: The character records and disabilities menus in the preferences menu no
+ longer uses the plain white background, but uses the better looking blue layout
+ instead.
+2017-03-18:
+ Fox McCloud:
+ - bugfix: Fixes abductor surgeries
+ Jovaniph:
+ - rscadd: Unathi EVA suits
+ uraniummeltdown:
+ - rscadd: Shades now have directional sprites.
+ - rscadd: Attacking with glass shards now hurts your hand if not wearing gloves.
+ Does not affect robotic hands though.
+2017-03-19:
+ Jovaniph:
+ - tweak: Voxes can now wear soft caps.
+ Krausus:
+ - bugfix: Pest spray bottles are no longer invisible.
+ Kyep:
+ - bugfix: Wood doors in wild west map no longer constantly open/close
+ uraniummeltdown:
+ - rscadd: Shipping errors can sometimes cause the supply shuttle to receive an extra
+ crate when ordering supplies.
+ - rscadd: Added dog beds! Can be made with 10 wood planks and deconstructed with
+ a wrench. Ian's Bed added to Cyberiad and Metastation.
+2017-03-20:
+ Jovaniph:
+ - rscadd: Tajaran EVA Suit Sprites
+ KasparoVy:
+ - bugfix: Gloves can be snipped again.
+ Purpose2:
+ - bugfix: Fixes assorted wording / capitalisation / grammatical problems.
+ - bugfix: Fixes the exploit to produce infinite cable coil from airlocks.
+ Tayyyyyyy:
+ - rscadd: Added GPS devices to pod pilot and mechanic's offices
+2017-03-21:
+ Crazylemon64:
+ - experiment: Strange reagent now has a volume floor requirement to activate, induces
+ clone damage, and may cause further trouble...
+ KasparoVy:
+ - tweak: No-one escapes nuclear hellfire.
+ - rscadd: Secure fridges/freezers are now lead-lined and have thus become nuke resistant.
+ uraniummeltdown:
+ - rscadd: Baseball bats added to the game, are craftable from 5 wood planks.
+ - rscadd: Baseball burgers can be made with a baseball bat and a bun, either microwaved
+ or table-crafted.
+2017-03-22:
+ Crazylemon64:
+ - tweak: Rod form is now at half speed, and has a warning sound.
+ FlattestGuitar:
+ - bugfix: When a person's limb is dying, it will no longer notify the whole server
+ of the ordeal
+ - bugfix: Welding tools no longer tell you about their span classes
+ KasparoVy:
+ - bugfix: Deconstructing beds now yields the same amount of metal as was used to
+ make the bed.
+ - bugfix: The PA console will no longer appear as though it is fully constructed
+ at the start of the round.
+ - bugfix: Ore Redemption Machines no longer eat IDs when deconstructed.
+ - tweak: Ore Redemption Machines and Mining Equipment Vendors now spit out whatever
+ IDs were in them when they lose power.
+ Krausus:
+ - bugfix: Personal crafting is now usable again for those with an Internet Explorer
+ version below 11.
+2017-03-23:
+ FalseIncarnate:
+ - tweak: Fish breeding has been tweaked to support fish refusing to cross-breed
+ and improved egg chances with same-species parents.
+ Fox McCloud:
+ - bugfix: Floors are now fully properly cleaned with mops and soap
+ - rscadd: Adds in emergency welding tool, fork, trays, drinking glasses, shot glasses,
+ shakers, butcher cleavers, and riot darts to the autolathe
+ - rscadd: Adds all basic stock parts to the autolathe
+ - tweak: re-arranges the autolathe menu to be more logical
+ - tweak: light bulbs no longer require metal to produce
+ - tweak: Incision management system can now cauterize
+ KasparoVy:
+ - tweak: Unathi Security, Medical, Engineering and Syndicate side-facing hardsuit
+ sprites have undergone weight reduction.
+ Kyep:
+ - tweak: Chaplain's armor is no longer riot-grade. In addition, their nullrods do
+ less damage.
+ MarsM0nd:
+ - bugfix: Conveyor switches can now set to left-only direction toggling.
+ Norgad:
+ - tweak: Maintenance areas near arrivals, science, and the bar have been revamped.
+ uraniummeltdown:
+ - tweak: Station lighting has less lighting power, this is not noticeable apart
+ from maint and 1 bulb rooms being a bit darker.
+ - tweak: Tweaked the potency scaling for glowshroom/glowberry light; high-potency
+ plants no longer light up a huge area, but are slightly brighter.
+ - rscadd: Added Shadowshrooms as a glowshroom mutation. They do exactly what you'd
+ expect.
+2017-03-24:
+ KasparoVy:
+ - bugfix: 'Red wire-cutters and red crowbars now appear correctly in-hands again.
+ imgadd: The medical wrench and all the brass tools (screwdriver, crowbar, wrench,
+ wire-cutters, welder) now have in-hand sprites of their own.'
+ - tweak: Adds TG's inhand icons for screwdrivers, crowbars, wrenches, wire-cutters
+ and welders.
+ - bugfix: Slime People can wear underwear, undershirts and socks.
+ uraniummeltdown:
+ - tweak: IV Drips are no longer dense objects, you can walk over them.
+ - rscadd: You can change gold and silver tiles into fancy versions by using them
+ in hand.
+2017-03-25:
+ Crazylemon64:
+ - bugfix: All pens are now certified crayon-wax free!
+ Kyep:
+ - bugfix: Pipes in the Wizard Academy have been banished back under the carpet,
+ where they belong.
+2017-03-26:
+ FalseIncarnate:
+ - rscadd: Re-adds the telescopic scythe, the pinnacle of covert reaping technologies.
+ Currently admin-spawn only, for use in the most dire of harvest times.
+ - bugfix: Scythes (normal and telescopic) should once again clear swathes through
+ all but the hardiest of vines when in proper reaping configurations, and heavily
+ damage those they don't outright destroy.
+ - bugfix: Ankle-high piles of dirt will no longer prevent you from stepping over
+ them.
+ KasparoVy:
+ - bugfix: You can no longer climb through interdimensional rifts into cryopods.
+ - bugfix: Revenants can see properly in the dark again.
+ Kyep:
+ - tweak: Adjusted Beach awaymission so it now includes deadly (but rewarding) pirate
+ area.
+ - tweak: Adjusted the centcom away mission to make it viable.
+ - rscdel: Deleted 'listening post' away mission.
+ Purpose2:
+ - tweak: 'QoL: Newly built APCs come unlocked.'
+ - tweak: 'QoL: Chief Engineer''s locker has more building permits.'
+ - bugfix: Assorted grammatical fixes.
+ Ty-Omaha:
+ - bugfix: Splints will display the proper sentence when applying them
+ uraniummeltdown:
+ - bugfix: 'Metastation: Fixed Gateway airlock access and Command Hallway vendor
+ areas, virology smartfridge is correctly stocked, mass drivers now have tiny
+ fans, Sec spacepod keys work on the Sec pod, Airlocks should have the correct
+ icon, Firelocks/Windoors/Shutters should be layered correctly, Shutters should
+ be facing the right direction'
+ - tweak: Drone fabricator consoles search for a fabricator in the same area instead
+ of 3x3 range.
+2017-03-27:
+ Crazylemon64:
+ - bugfix: Away mission power works now.
+ Fox McCloud:
+ - bugfix: Fixes some stacks not wanting to stack with similar stacks (such as space
+ cash)
+ KasparoVy:
+ - rscadd: Skrell have been greyscaled and darkened. You can now colour your Skrell
+ characters as you please.
+ - rscadd: Kidan can now select from multiple different antennae head-accessory styles.
+ - tweak: Kidan male/female bodies now have differences, namely mandible/torso structure.
+ - tweak: Skrell flesh is now blue (like their blood), though you'll only ever see
+ this under certain circumstances if they're dismembered.
+ Kyep:
+ - bugfix: The invisible floors in the engineering area of the UO45 away mission
+ are no longer invisible. Previously, you had to crowbar up a seemingly invisible
+ floor to make a wire appear.
+ - bugfix: Fixed several Terror Spider bugs. Including the notorious 'spiders can
+ get stuck in vents' bug, the 'spiders ignore mechs' bug, and the 'prince is
+ cheesable' bug.
+ - tweak: Adjusted White & Empress spider abilities - webs spun by white spiders
+ are now infectious.
+ Purpose2:
+ - rscadd: Adds the Psychiatrist's bed/sofa for 5 metal.
+ - bugfix: Wooden chairs broken by animals no longer drop metal.
+ - bugfix: Abductors no longer have Syndicate ties.
+ - bugfix: Fixes material loss on some chair/bed/stool deconstruction types.
+ - bugfix: IPCs can no longer be DNA Scrambled.
+ - bugfix: Health analysers clunk again when upgraded
+ - bugfix: Resolves further grammatical/typo issues.
+2017-03-28:
+ KasparoVy:
+ - bugfix: Skrell can now choose undergarments (undershirts, underpants, socks) at
+ character creation and dressers.
+ - tweak: Vox are now 20% less resilient to brute damage due to their light, porous
+ and flexible skeletons.
+ uraniummeltdown:
+ - bugfix: Quick-replacing non-wooden tiles will only work with a crowbar in inactive
+ hand instead of any item
+2017-03-29:
+ Purpose2:
+ - bugfix: '''Roundstart malfunctioning'' cameras now appropriately have their wires
+ cut.'
+ - bugfix: AI core camera can no longer be a 'roundstart malfunctioning' camera on
+ both Box & Meta Stations.
+2017-03-30:
+ Crazylemon64:
+ - bugfix: Cult shifter should work now
+ FlattestGuitar:
+ - tweak: Strange Reagent only deals clone damage on a successful revival.
+ Fox McCloud:
+ - rscadd: Non-designated drinks now mix their colors from the reagents within them
+ - tweak: Autopsies can now be performed without needing to cut someone open
+ - rscadd: Adds modular receiver to the maintenance loot system
+ - rscadd: Receivers can now be produced in hacked autolathes; no longer available
+ in R&D protolathes.
+ - tweak: removes the random "scary" sounds that play when walking about
+ KasparoVy:
+ - rscadd: You can now slam drinks/bottles/flasks by click-dragging them onto yourself
+ while it's in your active hand.
+ Kyep:
+ - tweak: The moonoutpost19 away mission should now be finishable, and more enjoyable
+ to attempt.
+ uraniummeltdown:
+ - bugfix: Emagging a closed firelock does not permanently break it anymore, only
+ opens it.
+ - bugfix: Emagged windoors should be able to be screwdriver+crowbar'd again.
+ - rscadd: Powered grilles now have a chance to zap you when you throw an object
+ at them.
+2017-03-31:
+ Krausus:
+ - bugfix: Blobs are no longer nearly guaranteed to immediately tear themselves apart
+ upon spawning.
+ Kyep:
+ - rscadd: Access to jobs is now based solely on Playtime, NOT days since BYOND account
+ was registered.
+2017-04-02:
+ KasparoVy:
+ - bugfix: Nuclear Operatives/ERT Members/Abductors will no longer spawn in with
+ genetic quirks.
+ - bugfix: Thrown objects that cross a tile with non-full windows will no longer
+ hit the window even if it isn't visually obstructing the path.
+ - bugfix: Shooting guns (i.e. tasers) in the above circumstances means that the
+ taser shots won't be blocked by windows that aren't visually obstructing the
+ path.
+ Kyep:
+ - tweak: Adjusted Black Market Packers away mission. It now has some danger to it
+ (carp), some more interesting stuff to find (syndi lab) and a challenge (fix
+ the ship powergrid).
+ - tweak: Slight adjustment to word lists based on our rules.
+ - tweak: Removed thunderdome armor from centcom away mission.
+ - bugfix: Cultists now get a new sacrifice target when the current one cryos.
+2017-04-03:
+ Kyep:
+ - bugfix: Ghosts manifested by cultists are no longer invincible, and an exploit
+ allowing them to be made permanent has been fixed.
+2017-04-04:
+ FalseIncarnate:
+ - rscadd: Adds FullofSkittles's custom pAI sprites. Thanks FoS!
+ - tweak: Custom sprites for cyborgs, AI, AI holograms, and pAI units no longer are
+ restricted to a single name. Get your money's worth by using that borg sprite
+ regardless of your version number!
+2017-04-05:
+ KasparoVy:
+ - rscadd: Adds a Tajaran facial hair style.
+ - rscadd: Adds a few new frill styles for Unathi.
+ - rscadd: Adds some new horn styles for Unathi.
+ - rscadd: Adds a couple new facial hair styles for Vulpkanin.
+ - rscadd: Adds a few new hair styles for Vulpkanin.
+ - tweak: Updates Vulpkanin Adhara & Kajam hairstyles.
+ Purpose2:
+ - rscadd: Can now take photos of the Blueprints to count as a completed objective.
+ - rscadd: Cryostorage console now stores the Null Rod & all variations.
+ - bugfix: Mime mech is now 'Reticence' as it should be
+ - bugfix: Fixes missing cult's Berserker Robe sprite.
+ - tweak: Cryostorage console no longer stores hundreds of bomber jackets, and now
+ stores hardsuits
+ - tweak: Cryostorage console now catches and stores most unique objective items.
+ - tweak: Corrects some typos and grammar.
+ - rscadd: You can now light cigarettes with Wands of Fireball, at the cost of your
+ eyebrows.
+ Twinmold93:
+ - bugfix: Buying poison pen will actually give you the poison pen now.
+2017-04-06:
+ Fox McCloud:
+ - bugfix: Fixes autopsy report printing; print reports by clicking the device itself
+ davipatury:
+ - rscadd: Rapid Cable Layer now have an autolathe design.
+2017-04-09:
+ Fox McCloud:
+ - tweak: abductor glands now act as actual hearts; removing them induces heart failure
+ - tweak: plasma gland no longer gibs you, but makes you vomit plasma instead
+ - tweak: bodysnatcher gland no longer gibs you, but will deal brute damage instead
+ - tweak: bloody gland will now drain blood instead of dealing brute damage
+ - tweak: species change gland will now change your species until the gland is removed
+ - tweak: adjusted the origin tech on a few gland
+ - tweak: heart attacks will once again paralyse you and do slightly more brute damage
+ - bugfix: body snatch clones look more like their originator
+ - tweak: Abductors can no longer use guns (minus their own alien energy gun)
+ - tweak: Sending someone with an abductor teleport via the console will stun them
+ for 3 cycles (doesn't apply with the advanced camera console)
+ - rscadd: Abductors can now purchase additional abductor vests
+ - rscadd: Abductors can lock/unlock vests
+ - tweak: Purchasing supplies from the abductor console will no longer increase the
+ amount of experiments you must do
+ - tweak: Wonderprods will not induce sleep in those who are stunned OR sleeping
+ - tweak: altered the origin tech of abductor tools
+ - rscadd: Can make abductor surgery tables from regular tables by adding silver
+ sheets to an abductor table frame
+ - rscadd: Added a bunch more abductee objectives
+ - tweak: abductors no long scream like girls
+ - tweak: High capacity cells have 10,000 charge instead of 15,000
+ - tweak: Mech equipment power costs minorly adjusted
+ - tweak: APCs charge a bit faster
+ - tweak: EMPs less effective against pods and mechs
+ - bugfix: Fixes not being able to recharge modular laptops/tablets
+ Purpose2:
+ - bugfix: Welders must now been fueled and active to cut lattices.
+2017-04-11:
+ FalseIncarnate:
+ - tweak: Damage done to the shuttle engines by a shadowling's "Extend Shuttle" ability
+ now prevent the shuttle from being recalled to CentComm.
+2017-04-16:
+ FalseIncarnate:
+ - tweak: Potential collaborators for traitors now are informed they are potentially
+ a collaborator for a potential increase in them potentially helping the traitors
+ potentially do potentially bad things. Potentially.
+ - rscadd: Potential collaborators are given a single code word and response set
+ so they can discretely find out that their best friend is a filthy traitor.
+ KasparoVy:
+ - rscadd: Adds secondary (facial) hair colours to the genome (UI). There are 6 new
+ blocks.
+ - bugfix: Characters with secondary (facial) hair colours won't find they've turned
+ black after cloning anymore.
+ Kyep:
+ - rscdel: Plasma dust no longer creates plasma gas on objects or turfs during reactions.
+ Twinmold93:
+ - bugfix: Missing sprite for pod pilot Drask now added.
+ Xantholne:
+ - rscadd: Adds Medical Beret available via loadout menu
+ ZomgPonies:
+ - bugfix: Fixes Superhero ID cards
+ - bugfix: Fixes Griffin missing his Freedom Implant
+ - bugfix: Fixes ElectroNegmatic's Ability not working at all.
+ - tweak: Changes LightnIan's ability into a non-damaging stun lasting 2 ticks, with
+ the amount of people affected depending on how long you hold the power in for.
+ uraniummeltdown:
+ - rscadd: You can now create heat-proof glass airlocks by using a sheet of reinforced
+ glass on the assembly during construction. Regular glass airlocks just require
+ a sheet of glass.
+2017-04-17:
+ KasparoVy:
+ - bugfix: The God-emperor of Mankind diskette's UI works again.
+ - bugfix: DNA UI injectors will now immediately update a person's eye colour.
+ Krausus:
+ - bugfix: You can no longer squeeze non-match objects into matchboxes.
+2017-04-19:
+ IK3I:
+ - bugfix: Chaplain now spawns with his bible
+ Xantholne:
+ - bugfix: You now correctly spawn with the CMO Skirt if selected in loadout menu
+2017-04-21:
+ Anticept:
+ - tweak: Alternate Job Preference now defaults to "Return to Lobby if Preferences
+ Unavailable". Only affects new players.
+ Fox McCloud:
+ - tweak: Tesla can now damage blobs
+ - tweak: Tesla causes machinery to overload and explode when zapping it
+ - tweak: Tesla dissipates energy more slowly and is easier to charge up (making
+ it more deadly when released)
+ - tweak: Tesla will now dust mobs it bumps into
+ - rscadd: Tesla coils now have wires that can be pulsed to generate a tesla zap
+ Lady-Luck:
+ - tweak: Makes several balance adjustments to existing syndicate bundles, generally
+ making them more worthwhile.
+ - rscadd: Adds an Allies Cocktail object for the Bond bundle.
+ - rscadd: Adds the 'gadgets' syndicate bundle.
+ - rscdel: Removes the 'lordsingulo' and 'murder' syndicate bundles.
+ Spacemanspark:
+ - rscadd: Permits hoodies to carry flashlights.
+ Twinmold93:
+ - rscadd: Adds attack options for deep fryers, grills, and ovens. Those breaking
+ into the kitchen beware.
+ alexkar598:
+ - bugfix: you can now click on things underwater
+ monster860:
+ - rscadd: Adds an in-game way of viewing poll results
+ - tweak: The player poll window automatically pops up if there is an active poll
+ you haven't voted on.
+ - rscadd: Adds an browser popup for creating new polls
+ - tweak: Your account needs to be at least 30 days old in order to vote on polls
+2017-04-23:
+ Citinited:
+ - rscadd: You can now fully insulate reinforced floors using a sheet of plasteel.
+ - tweak: Certain floors in the turbine, incinerator, and toxins are now thermally
+ insulated.
+ Crazylemon64:
+ - rscdel: Reverts Norgad's east maintenance overhaul
+ IK3I:
+ - bugfix: flipping aliums now have a cooldown
+ - rscadd: Aliums have some more sounds to play with
+ Tayyyyyyy:
+ - bugfix: You can no longer use space pod verbs when restrained, dead, or otherwise
+ incapacitated.
+2017-04-24:
+ Flattest:
+ - bugfix: Sleepers spit out their victims when deconstructed now.
+2017-04-25:
+ Flattest:
+ - rscadd: Animated progress bars!
+ uraniummeltdown:
+ - tweak: Runed girders have a clearer and bigger icon
+ - bugfix: Girder subtypes are properly named, "reinforced girder" and not "reinforced"
+ - tweak: Summoned cult walls do not drop a girder or runed metal to prevent runed
+ metal farming
+ - tweak: Cult walls no longer have blood or human remains in them
+ - rscadd: Harvesters can smash more things and can summon cult walls and floors
+ - bugfix: Fixed not being able to make a cult wall with runed metal + runed girder
+ - tweak: Runed girders will need to be deconstructed with a welder (or plasma cutter
+ or jackhammer) instead of a wrench. Cultists can hit them with their tomes to
+ instantly demolish them.
+2017-04-26:
+ FalseIncarnate:
+ - bugfix: Glowshrooms (and their subtypes) can be mass-cleared by scythes just like
+ vines.
+ pinatacolada:
+ - rscadd: dirty surgery environments get you nasty infections
+ - rscadd: ghetto surgery internal organ disinfection with alcohol
+ - rscadd: dead limb revival surgery step
+2017-04-27:
+ Kyep:
+ - tweak: Changed "suggested client version" from 510 to 511.
+2017-04-28:
+ Alffd:
+ - rscadd: Adds Paperwork the sloth to cargo.
+2017-04-29:
+ FalseIncarnate:
+ - bugfix: Popcorn jellybeans require jellybeans to make.
+ - bugfix: Gum is no longer invisible, but is still very chewy.
+ Phantasmic Dream Art, Fethas PR:
+ - rscadd: Updates the shadowling sprite. Sprite by Dreamy
+ uraniummeltdown:
+ - rscadd: Examine a girder for (de)construction hints
+ - rscadd: Projectiles have a chance to pass through some girders
+ - rscadd: You can construct rough iron (false) walls with rods, wood (false) walls
+ with wooden planks on a girder
+ - rscadd: Screwdriver a displaced girder to deconstruct it
+ - tweak: Increased displaced girder health, decreased reinforced and cult girder
+ health
+ - tweak: False wall construction is no longer instant
+ - tweak: Girder (de)construction messages should read better
+2017-04-30:
+ scrubmcnoob:
+ - tweak: Combat Shotguns now more expensive in cargo.
+ - tweak: Shotgun ammo_boxes are now named and sprited as speedloaders that can speedload
+ into a shotgun. Normal shotgun ammo boxes are just storage items for shells.
+ - rscadd: Adds in shotgun ammos readily available to be ordered from cargo in bulk
+ and allows the ordering of Riot shotguns.
+ - rscadd: Adds in a Dragonsbreathe shotgun ammo box.
+ - bugfix: Tranq darts now have a sprite.
+2017-05-01:
+ Fethas:
+ - rscadd: There will now be an visual indicator to annouce that an incomming shuttle
+ is about yo wreck you.
+2017-05-05:
+ Fethas:
+ - tweak: Magistrate, IAA, and BS will now spawn with the correct color dpet satchal
+ and duffel
+2017-05-06:
+ Allfd:
+ - tweak: Thrown mobs will not step on broken glass while being thrown.
+ Fethas:
+ - bugfix: Fixes sacreficed your target not triggering the next objective.
+ - bugfix: YOU CAN NOW ONLY CONVERT HUMANS NOT MICE!
+ - tweak: bloodspill tiles changed from base 100 (plus random number based on players)
+ to 70.
+ - rscadd: Adds Tajaran veils as a loadout options
+ - rscadd: Racial loadout tab
+ LightFire69:
+ - rscadd: Added a pretty plasmaman suit
+ uraniummeltdown:
+ - rscdel: Removed Robocop, Paladin, NT Default as roundstart lawsets.
+2017-05-07:
+ GunDOSMk1:
+ - rscadd: Adds Unathi cobra hood
+ Purpose2:
+ - bugfix: Fixes the broken wiring re-electrifying the bridge window.
+ - bugfix: Adds the missing scrubber in Genetics holding pen
+ Twinmold:
+ - bugfix: No longer able to put grabs into kitchen equipment (deep-fried grab).
+ - bugfix: No longer able to put grabs inside of display cases.
+2017-05-08:
+ Purpose2:
+ - rscadd: Adds a wire to the modular console on the bridge, fixing the Power Grid
+ program.
+ uraniummeltdown:
+ - rscadd: Examine a reinforced wall for deconstruction and repair hints.
+2017-05-09:
+ Fethas:
+ - rscadd: a ton of grey clothing sprites.
+2017-05-11:
+ Fethas:
+ - bugfix: Greybarber suit sprite.
+ - tweak: Removes sec access from the paramedic
+ Fox McCloud:
+ - bugfix: can no longer make lethal medical patches with droppers
+ - tweak: dripping reagents on someone with a dropper now incurs a 3 second delay
+ like syringes
+2017-05-12:
+ Fethas:
+ - bugfix: Makes thrall examine use MASKCOVERMOUTH and HIDEFACE flags
+ - bugfix: fixes hudsunglass goof with vox.
+ Xantholne:
+ - bugfix: Changes name from dark brown to brown for the default cowboy boots
+ - bugfix: Gives a hint that the cowboy shirts are meant to be clipped on to your
+ uniform
+2017-05-13:
+ Fethas:
+ - bugfix: fixes a redundent add_cultist proc so cult memorize objectives works on
+ new converts.
+ - bugfix: fixes an istype with IS_GAMEMODE_CULT
+ - bugfix: Narsie now will sometimes make a door a cult door..i thought i had that
+ in the first time.
+ - bugfix: runed metal can now be only used on cult girders.
+ KasparoVy:
+ - bugfix: Fixes a sprite issue with the Unathi Dorsal Frill's webbing.
+2017-05-15:
+ TullyBurnalot:
+ - bugfix: Disposal Bin Light now works with thrown items
+ - bugfix: Fixes typos with cowboy items
+2017-05-16:
+ FlattestGuitar:
+ - tweak: Brig lockers now have radios and prisoner IDs. As per SOP!
+ FreeStylaLT:
+ - bugfix: Fixed broken disposals in brig.
+ - bugfix: Returned missing Sergeant Araneus to HoS office.
+ - bugfix: Fixed missing floor tiles in the execution hallway in Brig.
+ - tweak: Remapped the entire Brig.
+ Kyep:
+ - tweak: changed security officer job slots from 5 to 7.
+ uraniummeltdown:
+ - tweak: You can now resist out of straightjackets
+ - tweak: Straightjacketed people can be handcuffed
+2017-05-17:
+ Fethas:
+ - rscadd: MORE GREY SPRITES!
+ FlattestGuitar:
+ - tweak: You can now silence shoes just by using some duct tape on them! Shoe rags
+ no longer exist.
+ Fox McCloud:
+ - tweak: Neuro-toxin bar drink weakens after 13 cycles as opposed to instantly
+ Purpose2:
+ - bugfix: Makes the new posters actually spawnable.
+ - bugfix: Fixes far more spelling errors than there ever should have been on the
+ posters.
+ Travelling Merchant:
+ - rscadd: Adds a hiss emote for Unathi.
+2017-05-18:
+ FreeStylaLT:
+ - rscadd: Added a Newscaster to Brig Toilet.
+ Purpose2:
+ - rscadd: Adds a subtle chat-window reminder for karma on Shuttle departure. Disable/enable
+ via preferences tab.
+ - rscdel: Removes the ugly round-end karma popup.
+ TullyBurnalot:
+ - bugfix: Deaf people cannot hear tape recordings anymore
+2017-05-19:
+ IK3I:
+ - bugfix: Empath stops telling you how much it hurts to not be human
+ MarsM0nd:
+ - bugfix: NanoUI map now shows the up-to-date map.
+ Purpose2:
+ - rscdel: Coroner no longer alt title for MD
+ - rscadd: Adds Coroner job as its own job.
+ - rscadd: Adds a swanky new office for the Coroner.
+2017-05-20:
+ FlattestGuitar:
+ - rscadd: Adds a jobban-checking verb to the OOC tab.
+ KasparoVy:
+ - rscadd: You can now set your character's auto-accent at character creation. The
+ verb still exists in the OOC tab.
+ Kyep:
+ - rscadd: Antag roles now have playtime requirements.
+ 'Kyep:':
+ - tweak: Updated CC map.
+ Xantholne:
+ - bugfix: The Coroner now has an actual job icon.
+2017-05-21:
+ KasparoVy:
+ - bugfix: Fixes a bug where only the fat roundstart disability could be selected.
+2017-05-22:
+ DarkPyrolord:
+ - bugfix: Rubber pellets should no longer embed.
+ - bugfix: Bananas fired from the staff of the honkmother should no longer embed,
+ or be called bullets.
+ Kyep:
+ - rscadd: Adds mech-mounted variants of the existing tesla, immolator, and x-ray
+ laser guns, with the same material and tech requirements. Admin-only Seraph
+ mech also gets better weapons.
+2017-05-23:
+ Fethas:
+ - rscadd: Lockets and necklaces to the loadout. Lockets can hold paper and photos
+ - rscadd: Fethas fluff item
+ Purpose2:
+ - rscadd: Adds functionality for the Atmos/Engineering Minimap to update to the
+ right station.
+2017-05-24:
+ Kyep:
+ - rscadd: Every head of staff now has a Department Management Console in their office.
+ This is a very limited version of the ID console that they can use to demote
+ people out of their departments, or move people between jobs in their department.
+ These consoles cannot be used to hire anyone, or to accept cross-department
+ transfers.
+2017-05-25:
+ FalseIncarnate:
+ - tweak: Matter Eater now requires your mouth be uncovered before you can eat matter.
+ Fethas:
+ - tweak: PLASMAMAN ATMOS SUITS ARE NOW THE SAME AS REGULAR ATMOS SUITS FLAG WISE!
+ AND SO IS THE CE SUIT
+ Kyep:
+ - bugfix: 'Fixed some mapping bugs on Centcom, e.g: shuttle medbay no longer has
+ black walls.'
+ Purpose2:
+ - rscadd: Metastation - Adds the Paramedic's cart and locker.
+ - rscadd: Metastation - Adds a backup set of paramedic keys in the CMO's office.
+ - bugfix: Metastation - Engine no longer hotwired.
+ - bugfix: Metastation - Turbine doors now function properly.
+ - bugfix: Metastation - Toxin Mixing's Controller is now accessible.
+ - tweak: Metastation - Moved Containment out a single tile, to fix irregularities
+ with Singularity setups.
+ - rscdel: Metastation - Reduced redundant redundancies in the Atmos/Wiring.
+ - rscdel: Metastation - removed blob spawn that was only a few tiles from Cryostorage....
+ - bugfix: Drones can now grip Tracker Electronics & Vending Refills
+ Tayyyyyyy, PhantasmicDream:
+ - rscadd: Skrell can put a pocket sized item in their head tentacles, which can
+ be dislodged via stunning, stripping, or death
+ - tweak: Skrell can no longer have their tentacles shaved off
+ - bugfix: Minor grammar fix for putting stuff that's too big into containers
+2017-05-26:
+ FlattyPatty:
+ - rscdel: Removes gateway hotel xeno embryo for the crew's safety.
+2017-05-27:
+ Crazylemon64:
+ - rscadd: Cloning now can be halted at any point, but ejecting too early may result
+ in clones with missing body parts.
+ - bugfix: Slime people now no longer spontaneously die
+2017-05-28:
+ Fox McCloud:
+ - bugfix: Fixes various mobs moving around faster than intended
+2017-05-29:
+ Jovaniph:
+ - rscadd: Two welding goggles on in the atmos room
+ Purpose2:
+ - tweak: Increases the size of Megaphones.
+ - tweak: Headset encryption keys are now 'small' items.
+ Tayyyyyyy, FlattestGuitar:
+ - rscadd: A targeting mode-esque message and sound when you point at something with
+ a gun in your active hand
+2017-05-30:
+ Fruerlund:
+ - rscadd: You can now take out pens by CTRL Clicking PDAs
+2017-05-31:
+ FalseIncarnate:
+ - bugfix: Shrimp and electric eels properly lay their own eggs again if they have
+ a suitable partner.
+ Xantholne:
+ - bugfix: Virologists actually spawn with their skirt
+ - bugfix: Coroner now can finally spawn with some Medical loadout clothes.
+ - bugfix: Medical Doctors will stop spawning with Chemist/Virologist Skirts
+ - bugfix: CMOs won't spawn with a virologist skirt anymore.
+ - bugfix: Virologists and Chemists wont spawn with a Medical Doctor skirt anymore.
diff --git a/icons/NTOS/airestore.png b/icons/NTOS/airestore.png
deleted file mode 100644
index d8e5207bfbf..00000000000
Binary files a/icons/NTOS/airestore.png and /dev/null differ
diff --git a/icons/NTOS/aiupload.png b/icons/NTOS/aiupload.png
deleted file mode 100644
index 25a8d8694e3..00000000000
Binary files a/icons/NTOS/aiupload.png and /dev/null differ
diff --git a/icons/NTOS/alerts.png b/icons/NTOS/alerts.png
deleted file mode 100644
index d395428c7cd..00000000000
Binary files a/icons/NTOS/alerts.png and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_100.gif b/icons/NTOS/battery_icons/batt_100.gif
deleted file mode 100644
index 72f04cff011..00000000000
Binary files a/icons/NTOS/battery_icons/batt_100.gif and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_20.gif b/icons/NTOS/battery_icons/batt_20.gif
deleted file mode 100644
index cc56e28214f..00000000000
Binary files a/icons/NTOS/battery_icons/batt_20.gif and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_40.gif b/icons/NTOS/battery_icons/batt_40.gif
deleted file mode 100644
index 5d03a30c18e..00000000000
Binary files a/icons/NTOS/battery_icons/batt_40.gif and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_5.gif b/icons/NTOS/battery_icons/batt_5.gif
deleted file mode 100644
index eddcc6ae824..00000000000
Binary files a/icons/NTOS/battery_icons/batt_5.gif and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_60.gif b/icons/NTOS/battery_icons/batt_60.gif
deleted file mode 100644
index 2a159b8e3c3..00000000000
Binary files a/icons/NTOS/battery_icons/batt_60.gif and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_80.gif b/icons/NTOS/battery_icons/batt_80.gif
deleted file mode 100644
index 59efcb225e1..00000000000
Binary files a/icons/NTOS/battery_icons/batt_80.gif and /dev/null differ
diff --git a/icons/NTOS/battery_icons/batt_none.gif b/icons/NTOS/battery_icons/batt_none.gif
deleted file mode 100644
index 64aa24516b3..00000000000
Binary files a/icons/NTOS/battery_icons/batt_none.gif and /dev/null differ
diff --git a/icons/NTOS/borgcontrol.png b/icons/NTOS/borgcontrol.png
deleted file mode 100644
index 63e0815954c..00000000000
Binary files a/icons/NTOS/borgcontrol.png and /dev/null differ
diff --git a/icons/NTOS/borgupload.png b/icons/NTOS/borgupload.png
deleted file mode 100644
index dfb24cecfdb..00000000000
Binary files a/icons/NTOS/borgupload.png and /dev/null differ
diff --git a/icons/NTOS/camera.png b/icons/NTOS/camera.png
deleted file mode 100644
index a9a726b03d4..00000000000
Binary files a/icons/NTOS/camera.png and /dev/null differ
diff --git a/icons/NTOS/cardcomp.png b/icons/NTOS/cardcomp.png
deleted file mode 100644
index e7df0ab2071..00000000000
Binary files a/icons/NTOS/cardcomp.png and /dev/null differ
diff --git a/icons/NTOS/cloning.png b/icons/NTOS/cloning.png
deleted file mode 100644
index 6fa29425056..00000000000
Binary files a/icons/NTOS/cloning.png and /dev/null differ
diff --git a/icons/NTOS/comms.png b/icons/NTOS/comms.png
deleted file mode 100644
index e089889d930..00000000000
Binary files a/icons/NTOS/comms.png and /dev/null differ
diff --git a/icons/NTOS/copyfile.png b/icons/NTOS/copyfile.png
deleted file mode 100644
index 50c10b37578..00000000000
Binary files a/icons/NTOS/copyfile.png and /dev/null differ
diff --git a/icons/NTOS/deletefile.png b/icons/NTOS/deletefile.png
deleted file mode 100644
index ada175fad25..00000000000
Binary files a/icons/NTOS/deletefile.png and /dev/null differ
diff --git a/icons/NTOS/drive.png b/icons/NTOS/drive.png
deleted file mode 100644
index 69ca021f8b7..00000000000
Binary files a/icons/NTOS/drive.png and /dev/null differ
diff --git a/icons/NTOS/exocontrol.png b/icons/NTOS/exocontrol.png
deleted file mode 100644
index 101f32e44db..00000000000
Binary files a/icons/NTOS/exocontrol.png and /dev/null differ
diff --git a/icons/NTOS/file.png b/icons/NTOS/file.png
deleted file mode 100644
index 05556e01f80..00000000000
Binary files a/icons/NTOS/file.png and /dev/null differ
diff --git a/icons/NTOS/folder.png b/icons/NTOS/folder.png
deleted file mode 100644
index 05780bc651c..00000000000
Binary files a/icons/NTOS/folder.png and /dev/null differ
diff --git a/icons/NTOS/foldermeta.png b/icons/NTOS/foldermeta.png
deleted file mode 100644
index 0d7a26b943f..00000000000
Binary files a/icons/NTOS/foldermeta.png and /dev/null differ
diff --git a/icons/NTOS/genetics.png b/icons/NTOS/genetics.png
deleted file mode 100644
index 6f5b2320fc2..00000000000
Binary files a/icons/NTOS/genetics.png and /dev/null differ
diff --git a/icons/NTOS/medical.png b/icons/NTOS/medical.png
deleted file mode 100644
index a3b6a21b54b..00000000000
Binary files a/icons/NTOS/medical.png and /dev/null differ
diff --git a/icons/NTOS/monitoring.png b/icons/NTOS/monitoring.png
deleted file mode 100644
index a94910e48a0..00000000000
Binary files a/icons/NTOS/monitoring.png and /dev/null differ
diff --git a/icons/NTOS/movefile.png b/icons/NTOS/movefile.png
deleted file mode 100644
index 5b31c6c2a88..00000000000
Binary files a/icons/NTOS/movefile.png and /dev/null differ
diff --git a/icons/NTOS/ntos.png b/icons/NTOS/ntos.png
deleted file mode 100644
index 8b9d735cc99..00000000000
Binary files a/icons/NTOS/ntos.png and /dev/null differ
diff --git a/icons/NTOS/operating.png b/icons/NTOS/operating.png
deleted file mode 100644
index ab8f65ef7a8..00000000000
Binary files a/icons/NTOS/operating.png and /dev/null differ
diff --git a/icons/NTOS/pda.png b/icons/NTOS/pda.png
deleted file mode 100644
index c6b0bb00fb3..00000000000
Binary files a/icons/NTOS/pda.png and /dev/null differ
diff --git a/icons/NTOS/power.png b/icons/NTOS/power.png
deleted file mode 100644
index b2e4cc837f1..00000000000
Binary files a/icons/NTOS/power.png and /dev/null differ
diff --git a/icons/NTOS/prison.png b/icons/NTOS/prison.png
deleted file mode 100644
index a846fe00411..00000000000
Binary files a/icons/NTOS/prison.png and /dev/null differ
diff --git a/icons/NTOS/program.png b/icons/NTOS/program.png
deleted file mode 100644
index ac161287636..00000000000
Binary files a/icons/NTOS/program.png and /dev/null differ
diff --git a/icons/NTOS/records.png b/icons/NTOS/records.png
deleted file mode 100644
index eaaf68e50d1..00000000000
Binary files a/icons/NTOS/records.png and /dev/null differ
diff --git a/icons/NTOS/research.png b/icons/NTOS/research.png
deleted file mode 100644
index 5ebd63aafcc..00000000000
Binary files a/icons/NTOS/research.png and /dev/null differ
diff --git a/icons/NTOS/server.png b/icons/NTOS/server.png
deleted file mode 100644
index 6d96b114139..00000000000
Binary files a/icons/NTOS/server.png and /dev/null differ
diff --git a/icons/NTOS/tb_close.png b/icons/NTOS/tb_close.png
deleted file mode 100644
index b99a6d81542..00000000000
Binary files a/icons/NTOS/tb_close.png and /dev/null differ
diff --git a/icons/NTOS/tcomms.png b/icons/NTOS/tcomms.png
deleted file mode 100644
index a63b23c8dff..00000000000
Binary files a/icons/NTOS/tcomms.png and /dev/null differ
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 4061ac44a96..9111297a266 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 657a2d43418..ec06922a07d 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 1c971f8d3f4..28e2fd791ff 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/effects/bubblegum.dmi b/icons/effects/bubblegum.dmi
new file mode 100644
index 00000000000..a53dd7d563a
Binary files /dev/null and b/icons/effects/bubblegum.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 95d8f86e425..e0bc6105f06 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/lighting_overlay.dmi b/icons/effects/lighting_overlay.dmi
deleted file mode 100644
index a5bee534b3d..00000000000
Binary files a/icons/effects/lighting_overlay.dmi and /dev/null differ
diff --git a/icons/effects/lighting_overlay.png b/icons/effects/lighting_overlay.png
new file mode 100644
index 00000000000..b317268b702
Binary files /dev/null and b/icons/effects/lighting_overlay.png differ
diff --git a/icons/effects/spacevines.dmi b/icons/effects/spacevines.dmi
index a140679d3d8..ee612f345e6 100644
Binary files a/icons/effects/spacevines.dmi and b/icons/effects/spacevines.dmi differ
diff --git a/icons/effects/tomatodecal.dmi b/icons/effects/tomatodecal.dmi
index d96401461d9..abbee9e0f2b 100644
Binary files a/icons/effects/tomatodecal.dmi and b/icons/effects/tomatodecal.dmi differ
diff --git a/icons/goonstation/objects/hydroponics.dmi b/icons/goonstation/objects/hydroponics.dmi
new file mode 100644
index 00000000000..5fb5d4ed8dd
Binary files /dev/null and b/icons/goonstation/objects/hydroponics.dmi differ
diff --git a/icons/goonstation/objects/money.dmi b/icons/goonstation/objects/money.dmi
new file mode 100644
index 00000000000..c4f6508f025
Binary files /dev/null and b/icons/goonstation/objects/money.dmi differ
diff --git a/icons/mecha/mech_construct.dmi b/icons/mecha/mech_construct.dmi
index 8d97261c9bb..10a6d9b86fd 100644
Binary files a/icons/mecha/mech_construct.dmi and b/icons/mecha/mech_construct.dmi differ
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
index 4c879d066b1..8146e8c6a86 100644
Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index fcdd79b3741..3d0c7233c98 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 4b839a4bf66..e5a33e76de3 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 9cf930476d5..1c4472d5299 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 68a273305a8..93630adce9a 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index 8d635c2c2df..b6d28330b69 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
deleted file mode 100644
index 3b75d6f2201..00000000000
Binary files a/icons/mob/custom-synthetic.dmi and /dev/null differ
diff --git a/icons/mob/custom_synthetic/custom-synthetic.dmi b/icons/mob/custom_synthetic/custom-synthetic.dmi
new file mode 100644
index 00000000000..29917049c85
Binary files /dev/null and b/icons/mob/custom_synthetic/custom-synthetic.dmi differ
diff --git a/icons/mob/custom-synthetic64.dmi b/icons/mob/custom_synthetic/custom-synthetic64.dmi
similarity index 100%
rename from icons/mob/custom-synthetic64.dmi
rename to icons/mob/custom_synthetic/custom-synthetic64.dmi
diff --git a/icons/mob/custom_synthetic/custom_head.dmi b/icons/mob/custom_synthetic/custom_head.dmi
new file mode 100644
index 00000000000..76ffcedcc82
Binary files /dev/null and b/icons/mob/custom_synthetic/custom_head.dmi differ
diff --git a/icons/mob/custom_synthetic/custom_lefthand.dmi b/icons/mob/custom_synthetic/custom_lefthand.dmi
new file mode 100644
index 00000000000..8d469195434
Binary files /dev/null and b/icons/mob/custom_synthetic/custom_lefthand.dmi differ
diff --git a/icons/mob/custom_synthetic/custom_righthand.dmi b/icons/mob/custom_synthetic/custom_righthand.dmi
new file mode 100644
index 00000000000..8d469195434
Binary files /dev/null and b/icons/mob/custom_synthetic/custom_righthand.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index f74ebda9d34..09b1f1f79ba 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 09ba4ebe9d1..2dd84b4117c 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index d4f0b3ac57a..a5a14094fd6 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 8e851a7c26c..3764c64aa50 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index efff252421b..e7deeee2ad9 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 25722400d84..b507d77eeb9 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/shellguard/shellguard_alt1.dmi b/icons/mob/human_races/cyberlimbs/shellguard/shellguard_alt1.dmi
new file mode 100644
index 00000000000..1b52131cfde
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/shellguard/shellguard_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/shellguard/shellguard_main.dmi b/icons/mob/human_races/cyberlimbs/shellguard/shellguard_main.dmi
new file mode 100644
index 00000000000..d0db48eb310
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/shellguard/shellguard_main.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/shellguard/shellguard_monitor.dmi b/icons/mob/human_races/cyberlimbs/shellguard/shellguard_monitor.dmi
new file mode 100644
index 00000000000..6bd25bee030
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/shellguard/shellguard_monitor.dmi differ
diff --git a/icons/mob/human_races/r_def_kidan.dmi b/icons/mob/human_races/r_def_kidan.dmi
index 9cef8f9597c..0f84cde5dec 100644
Binary files a/icons/mob/human_races/r_def_kidan.dmi and b/icons/mob/human_races/r_def_kidan.dmi differ
diff --git a/icons/mob/human_races/r_def_skrell.dmi b/icons/mob/human_races/r_def_skrell.dmi
index 601534919eb..61ed4415ceb 100644
Binary files a/icons/mob/human_races/r_def_skrell.dmi and b/icons/mob/human_races/r_def_skrell.dmi differ
diff --git a/icons/mob/human_races/r_def_vulpkanin.dmi b/icons/mob/human_races/r_def_vulpkanin.dmi
new file mode 100644
index 00000000000..8c7f804ae03
Binary files /dev/null and b/icons/mob/human_races/r_def_vulpkanin.dmi differ
diff --git a/icons/mob/human_races/r_kidan.dmi b/icons/mob/human_races/r_kidan.dmi
index 9cef8f9597c..0f84cde5dec 100644
Binary files a/icons/mob/human_races/r_kidan.dmi and b/icons/mob/human_races/r_kidan.dmi differ
diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi
index 586714c7da8..148c8d42d27 100644
Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 34e2a6ce696..29ebf19be94 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 2753f52dfee..0d43b6216f7 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi
new file mode 100644
index 00000000000..84380f038ed
Binary files /dev/null and b/icons/mob/inhands/fluff_lefthand.dmi differ
diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi
new file mode 100644
index 00000000000..d93ab0ffc68
Binary files /dev/null and b/icons/mob/inhands/fluff_righthand.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 3088c274007..cc5330db825 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index ea22f2728b1..d0c1b7bacda 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 1003b7f7585..6d0661c8911 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 927a56bdaa3..7dc7b163c54 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/lavaland/96x96megafauna.dmi b/icons/mob/lavaland/96x96megafauna.dmi
new file mode 100644
index 00000000000..e13419532df
Binary files /dev/null and b/icons/mob/lavaland/96x96megafauna.dmi differ
diff --git a/icons/mob/lavaland/dragon.dmi b/icons/mob/lavaland/dragon.dmi
new file mode 100644
index 00000000000..7e44b775de8
Binary files /dev/null and b/icons/mob/lavaland/dragon.dmi differ
diff --git a/icons/mob/lavaland/hierophant.dmi b/icons/mob/lavaland/hierophant.dmi
new file mode 100644
index 00000000000..d05bc3bd62d
Binary files /dev/null and b/icons/mob/lavaland/hierophant.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
new file mode 100644
index 00000000000..8cf32385df3
Binary files /dev/null and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/lavaland/legion.dmi b/icons/mob/lavaland/legion.dmi
new file mode 100644
index 00000000000..9cc19c4558f
Binary files /dev/null and b/icons/mob/lavaland/legion.dmi differ
diff --git a/icons/mob/lavaland/watcher.dmi b/icons/mob/lavaland/watcher.dmi
new file mode 100644
index 00000000000..23960478b39
Binary files /dev/null and b/icons/mob/lavaland/watcher.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 8e37ab08a84..8f2c49b09d7 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index fd305492464..5171dfdaced 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index fee5f3ec69f..c47ca000f0c 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 062fb83e28b..62948a933ed 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 003f24892bc..99359f5b079 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 54d39e581db..8ca8456ea39 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi
index 2dab86ef7f9..a5f9caa6a90 100644
Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ
diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi
index 8d90aa7c3b3..0bb1a0b9d44 100644
Binary files a/icons/mob/screen_operative.dmi and b/icons/mob/screen_operative.dmi differ
diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi
index cca826d272c..81453caddef 100644
Binary files a/icons/mob/screen_plasmafire.dmi and b/icons/mob/screen_plasmafire.dmi differ
diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi
index 77aefd6a16b..1568e701222 100644
Binary files a/icons/mob/screen_retro.dmi and b/icons/mob/screen_retro.dmi differ
diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi
index 3af866db6bd..3b2392cb8fc 100644
Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ
diff --git a/icons/mob/screen_white.dmi b/icons/mob/screen_white.dmi
index 8288217dcd0..361611cf4e0 100644
Binary files a/icons/mob/screen_white.dmi and b/icons/mob/screen_white.dmi differ
diff --git a/icons/mob/species/armalis/suit.dmi b/icons/mob/species/armalis/suit.dmi
index cecf7e414b4..ceed59b7819 100644
Binary files a/icons/mob/species/armalis/suit.dmi and b/icons/mob/species/armalis/suit.dmi differ
diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi
index 9c4ccd89c4b..b1ffbe8056f 100644
Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index b7631041271..6e608313eda 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi
index 6610948f641..9dd5a22618c 100644
Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ
diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi
new file mode 100644
index 00000000000..929facc86b7
Binary files /dev/null and b/icons/mob/species/grey/eyes.dmi differ
diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi
index 27785b33141..7a64321ed42 100644
Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ
diff --git a/icons/mob/species/grey/suit.dmi b/icons/mob/species/grey/suit.dmi
new file mode 100644
index 00000000000..3d61d72dec8
Binary files /dev/null and b/icons/mob/species/grey/suit.dmi differ
diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi
new file mode 100644
index 00000000000..111efe6de65
Binary files /dev/null and b/icons/mob/species/grey/uniform.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
new file mode 100644
index 00000000000..880e1e7c5eb
Binary files /dev/null and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
new file mode 100644
index 00000000000..fb428adaadc
Binary files /dev/null and b/icons/mob/species/plasmaman/suit.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index d8a5beaf448..97f3c7626c4 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi
index d0a12f2d0da..5e6d99b2ae8 100644
Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index 37d312d3133..40474762635 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index eedf3501cb1..98454026846 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/feet.dmi b/icons/mob/species/unathi/feet.dmi
new file mode 100644
index 00000000000..2c5cc99db2e
Binary files /dev/null and b/icons/mob/species/unathi/feet.dmi differ
diff --git a/icons/mob/species/unathi/gloves.dmi b/icons/mob/species/unathi/gloves.dmi
new file mode 100644
index 00000000000..808736e4cfd
Binary files /dev/null and b/icons/mob/species/unathi/gloves.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 46b11152ba7..f969705ec83 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 062c1b86db3..ebbfa5f9c73 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index 21ed6e38001..94355509bc0 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index 05c31e1e1d6..c9227ce2119 100644
Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index 93dacb8f058..23ec9ba3c43 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi
index f3cc54d72e0..45f664c715a 100644
Binary files a/icons/mob/species/vox/shoes.dmi and b/icons/mob/species/vox/shoes.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 12be5447f34..c339c15ab18 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi
index 05550c74c56..9324259ff14 100644
Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ
diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi
index 9be69155ee3..ce0f9c0e548 100644
Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ
diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi
index ad946a3805b..6245547df30 100644
Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 47e169492a1..03c1180b1dc 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/suit_fat.dmi b/icons/mob/suit_fat.dmi
index a5cb6b72066..79bed1d0538 100644
Binary files a/icons/mob/suit_fat.dmi and b/icons/mob/suit_fat.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index e557ed1c87e..a482ece8b38 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index f2c1c3a1311..3ff998af6b7 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 9a171b97645..7bcd0607116 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index a7db164c0fc..57807bee181 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/apiary_bees.dmi b/icons/obj/apiary_bees.dmi
deleted file mode 100644
index df4cb0a0ac3..00000000000
Binary files a/icons/obj/apiary_bees.dmi and /dev/null differ
diff --git a/icons/obj/biogenerator.dmi b/icons/obj/biogenerator.dmi
index 471b99acfa6..02cf868a31f 100644
Binary files a/icons/obj/biogenerator.dmi and b/icons/obj/biogenerator.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 500f0f29141..9e0eb73a992 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/cardboard_boxes.dmi b/icons/obj/cardboard_boxes.dmi
new file mode 100644
index 00000000000..3ef52c11bfb
Binary files /dev/null and b/icons/obj/cardboard_boxes.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 1006b5c5536..40d52d003bc 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi
index 98d2257ff4f..28c03c8b574 100644
Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ
diff --git a/icons/obj/cloning.dmi b/icons/obj/cloning.dmi
index 8699f6edca8..69abac9ee4f 100644
Binary files a/icons/obj/cloning.dmi and b/icons/obj/cloning.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index ae8fa296794..cfcfec6e283 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 938d810a612..0f6aa860754 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 48d253c16cb..82ce8437b28 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 16ed4ce4b04..b82450ab87a 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 8faec500e7b..974efa8a088 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 04dfe342cb6..3631097a2ba 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
new file mode 100644
index 00000000000..f4ec02bef2b
Binary files /dev/null and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
new file mode 100644
index 00000000000..86027617d15
Binary files /dev/null and b/icons/obj/clothing/species/plasmaman/suits.dmi differ
diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi
index f5a7f54df0d..c2d81d0d54f 100644
Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ
diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi
index 64bee068fa8..0d67f1f9c71 100644
Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi
index e83fc173fee..e41451f71f8 100644
Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi
index c107c13e415..d60a0a6840f 100644
Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ
diff --git a/icons/obj/clothing/species/unathi/gloves.dmi b/icons/obj/clothing/species/unathi/gloves.dmi
new file mode 100644
index 00000000000..26ce9ca8ac5
Binary files /dev/null and b/icons/obj/clothing/species/unathi/gloves.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index f55259fadf4..be2fb4f62aa 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/shoes.dmi b/icons/obj/clothing/species/unathi/shoes.dmi
new file mode 100644
index 00000000000..78f74765a76
Binary files /dev/null and b/icons/obj/clothing/species/unathi/shoes.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index f0be55a5291..34c3ea75105 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/clothing/species/vox/gloves.dmi b/icons/obj/clothing/species/vox/gloves.dmi
new file mode 100644
index 00000000000..eeca4b63f30
Binary files /dev/null and b/icons/obj/clothing/species/vox/gloves.dmi differ
diff --git a/icons/obj/clothing/species/vox/hats.dmi b/icons/obj/clothing/species/vox/hats.dmi
index 2680137ff0a..922ede57f1a 100644
Binary files a/icons/obj/clothing/species/vox/hats.dmi and b/icons/obj/clothing/species/vox/hats.dmi differ
diff --git a/icons/obj/clothing/species/vox/shoes.dmi b/icons/obj/clothing/species/vox/shoes.dmi
new file mode 100644
index 00000000000..a1dde383ff7
Binary files /dev/null and b/icons/obj/clothing/species/vox/shoes.dmi differ
diff --git a/icons/obj/clothing/species/vox/suits.dmi b/icons/obj/clothing/species/vox/suits.dmi
index 3d23ba1e396..4dc0ade4fb8 100644
Binary files a/icons/obj/clothing/species/vox/suits.dmi and b/icons/obj/clothing/species/vox/suits.dmi differ
diff --git a/icons/obj/clothing/species/vox/uniforms.dmi b/icons/obj/clothing/species/vox/uniforms.dmi
new file mode 100644
index 00000000000..4bf1b92308d
Binary files /dev/null and b/icons/obj/clothing/species/vox/uniforms.dmi differ
diff --git a/icons/obj/clothing/species/vulpkanin/hats.dmi b/icons/obj/clothing/species/vulpkanin/hats.dmi
index ee64e02158f..3e97b07e15b 100644
Binary files a/icons/obj/clothing/species/vulpkanin/hats.dmi and b/icons/obj/clothing/species/vulpkanin/hats.dmi differ
diff --git a/icons/obj/clothing/species/vulpkanin/suits.dmi b/icons/obj/clothing/species/vulpkanin/suits.dmi
index 22617558677..30cb26b4c62 100644
Binary files a/icons/obj/clothing/species/vulpkanin/suits.dmi and b/icons/obj/clothing/species/vulpkanin/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 48d76f691aa..669e8dff821 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index cc83ea5d9ec..ac64e6facf7 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi
index 3437e80e00d..a17fed4818c 100644
Binary files a/icons/obj/clothing/ties_overlay.dmi and b/icons/obj/clothing/ties_overlay.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 40f4c4c2b07..2a99367e4a4 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 9ad68e22072..bbb00650479 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 91432c14d1a..97a11d05cad 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
new file mode 100644
index 00000000000..9ec95b4f300
Binary files /dev/null and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/cult.dmi b/icons/obj/cult.dmi
index 6901e1c25a2..40eb2deda62 100644
Binary files a/icons/obj/cult.dmi and b/icons/obj/cult.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index 27e4ffc2c61..8879fa3e84e 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/decorations.dmi b/icons/obj/decorations.dmi
index 02916e632f0..a3b7f9dcd20 100644
Binary files a/icons/obj/decorations.dmi and b/icons/obj/decorations.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 6e749fc11ec..afa4f586504 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/doors/Doorfire.dmi b/icons/obj/doors/Doorfire.dmi
index 6686844372a..94ec8b967fb 100644
Binary files a/icons/obj/doors/Doorfire.dmi and b/icons/obj/doors/Doorfire.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index b1c332e6d75..52eb53ac436 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/candy.dmi b/icons/obj/food/candy.dmi
index 4bf2f9b9862..89714f5b5b3 100644
Binary files a/icons/obj/food/candy.dmi and b/icons/obj/food/candy.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 4e6e07de79a..283684b9d46 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 39b73d8052b..9b38b205075 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 2f3fc52957a..b057d644918 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index cd1eed09f02..fdc23ad6da8 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/hacktool.dmi b/icons/obj/hacktool.dmi
deleted file mode 100644
index fb5be360e0e..00000000000
Binary files a/icons/obj/hacktool.dmi and /dev/null differ
diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi
deleted file mode 100644
index 0b7045cc64c..00000000000
Binary files a/icons/obj/harvest.dmi and /dev/null differ
diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi
deleted file mode 100644
index 3683f3f6267..00000000000
Binary files a/icons/obj/hydroponics.dmi and /dev/null differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
new file mode 100644
index 00000000000..3b1c4c07cfa
Binary files /dev/null and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
new file mode 100644
index 00000000000..5b63f0553bd
Binary files /dev/null and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi
new file mode 100644
index 00000000000..e1f308c87b4
Binary files /dev/null and b/icons/obj/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
new file mode 100644
index 00000000000..ac8adc5a069
Binary files /dev/null and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/hydroponics/growing_mushrooms.dmi b/icons/obj/hydroponics/growing_mushrooms.dmi
new file mode 100644
index 00000000000..7a0eedbdae7
Binary files /dev/null and b/icons/obj/hydroponics/growing_mushrooms.dmi differ
diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi
new file mode 100644
index 00000000000..070d3531a21
Binary files /dev/null and b/icons/obj/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
new file mode 100644
index 00000000000..d5bb7d48acb
Binary files /dev/null and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
new file mode 100644
index 00000000000..edc0ee4894f
Binary files /dev/null and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/hydroponics_growing.dmi b/icons/obj/hydroponics_growing.dmi
deleted file mode 100644
index 695a29b9951..00000000000
Binary files a/icons/obj/hydroponics_growing.dmi and /dev/null differ
diff --git a/icons/obj/hydroponics_machines.dmi b/icons/obj/hydroponics_machines.dmi
deleted file mode 100644
index cb3d548a6d9..00000000000
Binary files a/icons/obj/hydroponics_machines.dmi and /dev/null differ
diff --git a/icons/obj/hydroponics_products.dmi b/icons/obj/hydroponics_products.dmi
deleted file mode 100644
index 028bb4b9113..00000000000
Binary files a/icons/obj/hydroponics_products.dmi and /dev/null differ
diff --git a/icons/obj/hydroponics_unused.dmi b/icons/obj/hydroponics_unused.dmi
deleted file mode 100644
index b3a05b03861..00000000000
Binary files a/icons/obj/hydroponics_unused.dmi and /dev/null differ
diff --git a/icons/obj/hydroponics_vines.dmi b/icons/obj/hydroponics_vines.dmi
deleted file mode 100644
index cecca3058a0..00000000000
Binary files a/icons/obj/hydroponics_vines.dmi and /dev/null differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 0d503c324e3..2735d145ac8 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 301a990639e..d844e5f721a 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
new file mode 100644
index 00000000000..45927256e35
Binary files /dev/null and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/obj/lavaland/ash_flora.dmi b/icons/obj/lavaland/ash_flora.dmi
new file mode 100644
index 00000000000..d58541612d2
Binary files /dev/null and b/icons/obj/lavaland/ash_flora.dmi differ
diff --git a/icons/obj/lavaland/cannon.dmi b/icons/obj/lavaland/cannon.dmi
new file mode 100644
index 00000000000..82efad1bc5e
Binary files /dev/null and b/icons/obj/lavaland/cannon.dmi differ
diff --git a/icons/obj/lavaland/dragonboat.dmi b/icons/obj/lavaland/dragonboat.dmi
new file mode 100644
index 00000000000..13b6509fcd7
Binary files /dev/null and b/icons/obj/lavaland/dragonboat.dmi differ
diff --git a/icons/obj/lavaland/spawners.dmi b/icons/obj/lavaland/spawners.dmi
new file mode 100644
index 00000000000..42fdc988add
Binary files /dev/null and b/icons/obj/lavaland/spawners.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 5404c91b3b9..81c5c39ddf8 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 779903709c9..484417b9e83 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/machines/artillery.dmi b/icons/obj/machines/artillery.dmi
deleted file mode 100644
index 887af9fdc07..00000000000
Binary files a/icons/obj/machines/artillery.dmi and /dev/null differ
diff --git a/icons/obj/machines/dna_vault.dmi b/icons/obj/machines/dna_vault.dmi
new file mode 100644
index 00000000000..35503336d42
Binary files /dev/null and b/icons/obj/machines/dna_vault.dmi differ
diff --git a/icons/obj/machines/particle_accelerator.dmi b/icons/obj/machines/particle_accelerator.dmi
index 905d1737ec8..f8455d80b49 100644
Binary files a/icons/obj/machines/particle_accelerator.dmi and b/icons/obj/machines/particle_accelerator.dmi differ
diff --git a/icons/obj/machines/particle_accelerator3.dmi b/icons/obj/machines/particle_accelerator3.dmi
new file mode 100644
index 00000000000..c601b8d1b6a
Binary files /dev/null and b/icons/obj/machines/particle_accelerator3.dmi differ
diff --git a/icons/obj/machines/satellite.dmi b/icons/obj/machines/satellite.dmi
new file mode 100644
index 00000000000..efe3dade763
Binary files /dev/null and b/icons/obj/machines/satellite.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index ef7ea2ddac7..d6cb7a676c4 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi
new file mode 100644
index 00000000000..85d6026617f
Binary files /dev/null and b/icons/obj/modular_console.dmi differ
diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi
new file mode 100644
index 00000000000..2daeee0c7a4
Binary files /dev/null and b/icons/obj/modular_laptop.dmi differ
diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi
new file mode 100644
index 00000000000..2438f375f65
Binary files /dev/null and b/icons/obj/modular_tablet.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index 6d5a5b70d41..0a269e0d8b7 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/money.dmi b/icons/obj/money.dmi
deleted file mode 100644
index 5a053c07e05..00000000000
Binary files a/icons/obj/money.dmi and /dev/null differ
diff --git a/icons/obj/narsie.dmi b/icons/obj/narsie.dmi
index ac11a2730cb..55ab046eb42 100644
Binary files a/icons/obj/narsie.dmi and b/icons/obj/narsie.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index ea68e3dbdbd..e95b9ce041f 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 850411d79e9..32d86ddf66e 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 5a780217109..316790998c5 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/rune.dmi b/icons/obj/rune.dmi
index 901b7466d57..5df6a842ad5 100644
Binary files a/icons/obj/rune.dmi and b/icons/obj/rune.dmi differ
diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi
deleted file mode 100644
index 2a8bac86a9d..00000000000
Binary files a/icons/obj/seeds.dmi and /dev/null differ
diff --git a/icons/obj/seeds_OLD.dmi b/icons/obj/seeds_OLD.dmi
deleted file mode 100644
index b090ba6cbe9..00000000000
Binary files a/icons/obj/seeds_OLD.dmi and /dev/null differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 72084b5675b..fd89b23d19d 100755
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/statue.dmi b/icons/obj/statue.dmi
index 74febfe53bc..e5deb9a0ec4 100644
Binary files a/icons/obj/statue.dmi and b/icons/obj/statue.dmi differ
diff --git a/icons/obj/statuelarge.dmi b/icons/obj/statuelarge.dmi
new file mode 100644
index 00000000000..e45afb8db8a
Binary files /dev/null and b/icons/obj/statuelarge.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 47600bcfba3..8fe85835d64 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index bd09b38dcd4..5dc147bc25e 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 88161a20b5c..ac42a7d538c 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi
index 1154fe08e33..ef5f6ad194e 100644
Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index b692f566df1..dfc41198913 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ
diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi
index 16d8bbcae7a..45baaf3f7ba 100644
Binary files a/icons/obj/terminals.dmi and b/icons/obj/terminals.dmi differ
diff --git a/icons/obj/tesla_engine/tesla_coil.dmi b/icons/obj/tesla_engine/tesla_coil.dmi
index 5c3646dde80..96a6c636d83 100644
Binary files a/icons/obj/tesla_engine/tesla_coil.dmi and b/icons/obj/tesla_engine/tesla_coil.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
new file mode 100644
index 00000000000..e4fedae838b
Binary files /dev/null and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
new file mode 100644
index 00000000000..a78a0babdc4
Binary files /dev/null and b/icons/obj/tools.dmi differ
diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi
index 63515f5b2e5..2f528c44c77 100644
Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 1164d5c5363..83276e5ec57 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index c51a531b2f8..8cf3b48100c 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/icons/program_icons/alarm_green.gif b/icons/program_icons/alarm_green.gif
new file mode 100644
index 00000000000..7c2570c8ce3
Binary files /dev/null and b/icons/program_icons/alarm_green.gif differ
diff --git a/icons/program_icons/alarm_red.gif b/icons/program_icons/alarm_red.gif
new file mode 100644
index 00000000000..327d58e4db8
Binary files /dev/null and b/icons/program_icons/alarm_red.gif differ
diff --git a/icons/program_icons/batt_100.gif b/icons/program_icons/batt_100.gif
new file mode 100644
index 00000000000..ccdbd4333e9
Binary files /dev/null and b/icons/program_icons/batt_100.gif differ
diff --git a/icons/program_icons/batt_20.gif b/icons/program_icons/batt_20.gif
new file mode 100644
index 00000000000..1d5e38fc888
Binary files /dev/null and b/icons/program_icons/batt_20.gif differ
diff --git a/icons/program_icons/batt_40.gif b/icons/program_icons/batt_40.gif
new file mode 100644
index 00000000000..d5cedb99675
Binary files /dev/null and b/icons/program_icons/batt_40.gif differ
diff --git a/icons/program_icons/batt_5.gif b/icons/program_icons/batt_5.gif
new file mode 100644
index 00000000000..ceac8f3a945
Binary files /dev/null and b/icons/program_icons/batt_5.gif differ
diff --git a/icons/program_icons/batt_60.gif b/icons/program_icons/batt_60.gif
new file mode 100644
index 00000000000..d39534c8cb0
Binary files /dev/null and b/icons/program_icons/batt_60.gif differ
diff --git a/icons/program_icons/batt_80.gif b/icons/program_icons/batt_80.gif
new file mode 100644
index 00000000000..9c299773f01
Binary files /dev/null and b/icons/program_icons/batt_80.gif differ
diff --git a/icons/program_icons/charging.gif b/icons/program_icons/charging.gif
new file mode 100644
index 00000000000..cf19ca72876
Binary files /dev/null and b/icons/program_icons/charging.gif differ
diff --git a/icons/program_icons/downloader_finished.gif b/icons/program_icons/downloader_finished.gif
new file mode 100644
index 00000000000..f01b7c42af8
Binary files /dev/null and b/icons/program_icons/downloader_finished.gif differ
diff --git a/icons/program_icons/downloader_running.gif b/icons/program_icons/downloader_running.gif
new file mode 100644
index 00000000000..68fb977c86d
Binary files /dev/null and b/icons/program_icons/downloader_running.gif differ
diff --git a/icons/program_icons/ntnrc_idle.gif b/icons/program_icons/ntnrc_idle.gif
new file mode 100644
index 00000000000..d47c01d5800
Binary files /dev/null and b/icons/program_icons/ntnrc_idle.gif differ
diff --git a/icons/program_icons/ntnrc_new.gif b/icons/program_icons/ntnrc_new.gif
new file mode 100644
index 00000000000..af72a8b332f
Binary files /dev/null and b/icons/program_icons/ntnrc_new.gif differ
diff --git a/icons/program_icons/power_norm.gif b/icons/program_icons/power_norm.gif
new file mode 100644
index 00000000000..2b8d60edfa5
Binary files /dev/null and b/icons/program_icons/power_norm.gif differ
diff --git a/icons/program_icons/power_warn.gif b/icons/program_icons/power_warn.gif
new file mode 100644
index 00000000000..0c85b3a85a1
Binary files /dev/null and b/icons/program_icons/power_warn.gif differ
diff --git a/icons/program_icons/sig_high.gif b/icons/program_icons/sig_high.gif
new file mode 100644
index 00000000000..efb20f67306
Binary files /dev/null and b/icons/program_icons/sig_high.gif differ
diff --git a/icons/program_icons/sig_lan.gif b/icons/program_icons/sig_lan.gif
new file mode 100644
index 00000000000..07ba929f7f3
Binary files /dev/null and b/icons/program_icons/sig_lan.gif differ
diff --git a/icons/program_icons/sig_low.gif b/icons/program_icons/sig_low.gif
new file mode 100644
index 00000000000..08f98baea8e
Binary files /dev/null and b/icons/program_icons/sig_low.gif differ
diff --git a/icons/program_icons/sig_none.gif b/icons/program_icons/sig_none.gif
new file mode 100644
index 00000000000..79840d8a2bd
Binary files /dev/null and b/icons/program_icons/sig_none.gif differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index baf07678ed8..6f53bb25da3 100755
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 86a544fa278..62ba9c4e66c 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/floors/ash.dmi b/icons/turf/floors/ash.dmi
new file mode 100644
index 00000000000..718cd120194
Binary files /dev/null and b/icons/turf/floors/ash.dmi differ
diff --git a/icons/turf/floors/lava.dmi b/icons/turf/floors/lava.dmi
index 1017a60b73a..29afb2cc869 100644
Binary files a/icons/turf/floors/lava.dmi and b/icons/turf/floors/lava.dmi differ
diff --git a/icons/turf/floors/ripple.dmi b/icons/turf/floors/ripple.dmi
new file mode 100644
index 00000000000..2830d2c4909
Binary files /dev/null and b/icons/turf/floors/ripple.dmi differ
diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi
index cff10b9a018..a122cdf1def 100644
Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ
diff --git a/icons/turf/walls/hierophant_wall.dmi b/icons/turf/walls/hierophant_wall.dmi
new file mode 100644
index 00000000000..8482970eaf0
Binary files /dev/null and b/icons/turf/walls/hierophant_wall.dmi differ
diff --git a/icons/vehicles/motorcycle.dmi b/icons/vehicles/motorcycle.dmi
index 2f3c2d5517f..5b1a910b7b0 100644
Binary files a/icons/vehicles/motorcycle.dmi and b/icons/vehicles/motorcycle.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 6a6d616832f..c64da39f6e6 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -29,7 +29,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-WEST+REP"
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "AZRFF-CTRL+NORTH"
name = "CTRL+NORTH"
@@ -37,7 +37,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-NORTH+REP"
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "AZRFF-CTRL+EAST"
name = "CTRL+EAST"
@@ -45,7 +45,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-EAST+REP"
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "AZRFF-CTRL+SOUTH"
name = "CTRL+SOUTH"
@@ -53,7 +53,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-SOUTH+REP"
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "AZRFF-INSERT"
name = "INSERT"
@@ -85,7 +85,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-CTRL+D+REP"
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "AZRFF-CTRL+B"
name = "CTRL+B"
@@ -105,7 +105,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-CTRL+Q+REP"
name = "CTRL+Q+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "AZRFF-CTRL+R"
name = "CTRL+R"
@@ -113,7 +113,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-CTRL+S+REP"
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "AZRFF-CTRL+W"
name = "CTRL+W"
@@ -129,7 +129,7 @@ macro "AZERTYoff"
is-disabled = false
elem "AZRFF-CTRL+Z+REP"
name = "CTRL+Z+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "AZRFF-F1"
name = "F1"
@@ -215,7 +215,7 @@ macro "AZERTYon"
is-disabled = false
elem "AZRON-WEST+REP"
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "AZRON-CTRL+NORTH"
name = "CTRL+NORTH"
@@ -223,7 +223,7 @@ macro "AZERTYon"
is-disabled = false
elem "AZRON-NORTH+REP"
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "AZRON-CTRL+EAST"
name = "CTRL+EAST"
@@ -231,7 +231,7 @@ macro "AZERTYon"
is-disabled = false
elem "AZRON-EAST+REP"
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "AZRON-CTRL+SOUTH"
name = "CTRL+SOUTH"
@@ -239,7 +239,7 @@ macro "AZERTYon"
is-disabled = false
elem "AZRON-SOUTH+REP"
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "AZRON-INSERT"
name = "INSERT"
@@ -291,11 +291,11 @@ macro "AZERTYon"
is-disabled = false
elem "AZRON-D+REP"
name = "D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "AZRON-CTRL+D+REP"
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "AZRON-CTRL+B"
name = "CTRL+B"
@@ -335,11 +335,11 @@ macro "AZERTYon"
is-disabled = false
elem "AZRON-Q+REP"
name = "Q+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "AZRON-CTRL+Q+REP"
name = "CTRL+Q+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "AZRON-R"
name = "R"
@@ -351,11 +351,11 @@ macro "AZERTYon"
is-disabled = false
elem "s_key"
name = "S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "AZRON-CTRL+S+REP"
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "AZRON-T"
name = "T"
@@ -395,11 +395,11 @@ macro "AZERTYon"
is-disabled = false
elem "w_key"
name = "Z+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "AZRON-CTRL+Z+REP"
name = "CTRL+Z+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "AZRON-F1"
name = "F1"
@@ -481,7 +481,7 @@ macro "borghotkeymode"
is-disabled = false
elem "BRGHK-WEST+REP"
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "BRGHK-CTRL+NORTH"
name = "CTRL+NORTH"
@@ -489,7 +489,7 @@ macro "borghotkeymode"
is-disabled = false
elem "BRGHK-NORTH+REP"
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "BRGHK-CTRL+EAST"
name = "CTRL+EAST"
@@ -497,7 +497,7 @@ macro "borghotkeymode"
is-disabled = false
elem "BRGHK-EAST+REP"
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "BRGHK-CTRL+SOUTH"
name = "CTRL+SOUTH"
@@ -505,7 +505,7 @@ macro "borghotkeymode"
is-disabled = false
elem "BRGHK-SOUTH+REP"
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "BRGHK-INSERT"
name = "INSERT"
@@ -549,11 +549,11 @@ macro "borghotkeymode"
is-disabled = false
elem "BRGHK-A+REP"
name = "A+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "BRGHK-CTRL+A+REP"
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "BRGHK-B"
name = "B"
@@ -581,11 +581,11 @@ macro "borghotkeymode"
is-disabled = false
elem "BRGHK-D+REP"
name = "D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "BRGHK-CTRL+D+REP"
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "BRGHK-F"
name = "F"
@@ -613,19 +613,19 @@ macro "borghotkeymode"
is-disabled = false
elem "s_key"
name = "S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "BRGHK-CTRL+S+REP"
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "w_key"
name = "W+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "BRGHK-CTRL+W+REP"
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "BRGHK-X"
name = "X"
@@ -735,7 +735,7 @@ macro "macro"
is-disabled = false
elem "MACRO-WEST+REP"
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "MACRO-CTRL+NORTH"
name = "CTRL+NORTH"
@@ -743,7 +743,7 @@ macro "macro"
is-disabled = false
elem "MACRO-NORTH+REP"
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "MACRO-CTRL+EAST"
name = "CTRL+EAST"
@@ -751,7 +751,7 @@ macro "macro"
is-disabled = false
elem "MACRO-EAST+REP"
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "MACRO-CTRL+SOUTH"
name = "CTRL+SOUTH"
@@ -759,7 +759,7 @@ macro "macro"
is-disabled = false
elem "MACRO-SOUTH+REP"
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "MACRO-INSERT"
name = "INSERT"
@@ -787,11 +787,11 @@ macro "macro"
is-disabled = false
elem "MACRO-CTRL+A+REP"
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "MACRO-CTRL+D+REP"
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "MACRO-CTRL+B"
name = "CTRL+B"
@@ -819,11 +819,11 @@ macro "macro"
is-disabled = false
elem "MACRO-CTRL+S+REP"
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "MACRO-CTRL+W+REP"
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "MACRO-CTRL+X"
name = "CTRL+X"
@@ -921,7 +921,7 @@ macro "hotkeymode"
is-disabled = false
elem "HKMODE-WEST+REP"
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "HKMODE-CTRL+NORTH"
name = "CTRL+NORTH"
@@ -929,7 +929,7 @@ macro "hotkeymode"
is-disabled = false
elem "HKMODE-NORTH+REP"
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "HKMODE-CTRL+EAST"
name = "CTRL+EAST"
@@ -937,7 +937,7 @@ macro "hotkeymode"
is-disabled = false
elem "HKMODE-EAST+REP"
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "HKMODE-CTRL+SOUTH"
name = "CTRL+SOUTH"
@@ -945,7 +945,7 @@ macro "hotkeymode"
is-disabled = false
elem "HKMODE-SOUTH+REP"
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "HKMODE-INSERT"
name = "INSERT"
@@ -1001,19 +1001,19 @@ macro "hotkeymode"
is-disabled = false
elem "HKMODE-A+REP"
name = "A+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "HKMODE-CTRL+A+REP"
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "HKMODE-D+REP"
name = "D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "HKMODE-CTRL+D+REP"
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "HKMODE-B"
name = "B"
@@ -1073,11 +1073,11 @@ macro "hotkeymode"
is-disabled = false
elem "s_key"
name = "S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "HKMODE-CTRL+S+REP"
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "HKMODE-T"
name = "T"
@@ -1085,11 +1085,11 @@ macro "hotkeymode"
is-disabled = false
elem "w_key"
name = "W+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "HKMODE-CTRL+W+REP"
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "HKMODE-X"
name = "X"
@@ -1195,7 +1195,7 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-WEST+REP"
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "BRGMACRO-CTRL+NORTH"
name = "CTRL+NORTH"
@@ -1203,7 +1203,7 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-NORTH+REP"
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "BRGMACRO-CTRL+EAST"
name = "CTRL+EAST"
@@ -1211,7 +1211,7 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-EAST+REP"
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "BRGMACRO-CTRL+SOUTH"
name = "CTRL+SOUTH"
@@ -1219,7 +1219,7 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-SOUTH+REP"
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "BRGMACRO-INSERT"
name = "INSERT"
@@ -1247,7 +1247,7 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-CTRL+A+REP"
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
is-disabled = false
elem "BRGMACRO-CTRL+B"
name = "CTRL+B"
@@ -1259,7 +1259,7 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-CTRL+D+REP"
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
is-disabled = false
elem "BRGMACRO-CTRL+F"
name = "CTRL+F"
@@ -1275,11 +1275,11 @@ macro "borgmacro"
is-disabled = false
elem "BRGMACRO-CTRL+S+REP"
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
is-disabled = false
elem "BRGMACRO-CTRL+W+REP"
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
is-disabled = false
elem "BRGMACRO-CTRL+X"
name = "CTRL+X"
diff --git a/nano/assets/nano.js b/nano/assets/nano.js
index 2c1b82f898c..6cce62efd26 100644
--- a/nano/assets/nano.js
+++ b/nano/assets/nano.js
@@ -1 +1 @@
-function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStatePDAClass(){this.key="pda",this.key=this.key.toLowerCase(),this.current_template="",NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=n<0?Math.ceil(n):Math.floor(n),n<0&&(n+=t);n=0?e[a]:a===-1?"{":a===-2?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly."+JSON.stringify(t));var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){s(t),e=!0})},l=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed. Error name: "+r.name+" Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?s(a):t=a},s=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){l(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src","nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",l="noIcon";"undefined"!=typeof t&&t&&(i='
',l="hasIcon"),"undefined"!=typeof r&&r||(r="link");var s="";"undefined"!=typeof o&&o&&(s='id="'+o+'"');var c=NanoTransition.allocID(s+"_"+e.toString().replace(/[^a-z0-9_]/gi,"_")+"_"+t);return"undefined"!=typeof a&&a?'"+i+e+'
':'"+i+e+'
'},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;en&&(e=n):e>t?e=t:e
'+r+'
'},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good "':1==e?'"Minor Alert "':'"Major Alert "'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'Please place a valid subject into the DNA modifier.
';var o=e.split(""),i='1
',l=1,s=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:l,selectUISubblock:s}:{selectSEBlock:l,selectSESubblock:s};var d="linkActive";l==t&&s==n&&(d="selected"),i+='
'+o[c]+"
",c++,c%a==0&&c
"},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})},smoothNumber:function(e){var t=NanoTransition.allocID("n");return' '},smoothRound:function(e,t){var n=NanoTransition.allocID(t);return void 0===t&&(placed=0),' '}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStatePDAClass.inheritsFrom(NanoStateClass);var NanoStatePDA=new NanoStatePDAClass;NanoStatePDAClass.prototype.onUpdate=function(e){NanoStateClass.prototype.onUpdate.call(this,e);var t=this;try{if(null!=e.data.app){var n=e.data.app.template;null!=n&&n!=t.current_template?$.when($.ajax({url:n+".tmpl",cache:!1,dataType:"text"})).done(function(a){a+='
';try{NanoTemplate.addTemplate("app",a),NanoTemplate.resetTemplate("app"),$("#uiApp").html(NanoTemplate.parse("app",e)),t.current_template=n,t.onAfterUpdate(e)}catch(r){return void reportError("ERROR: An error occurred while loading the PDA App UI: "+r.message)}}).fail(function(){reportError("ERROR: Loading template app("+n+") failed!")}):NanoTemplate.templateExists("app")&&$("#uiApp").html(NanoTemplate.parse("app",e))}}catch(a){return void reportError("ERROR: An error occurred while rendering the PDA App UI: "+a.message)}},NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='
';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},resetTemplate:function(e){n[e]=null},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"Template error (does not exist) ";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"Template error (failed to compile) "):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}();NanoTransition=function(){var e={},t={},n=0;NanoStateManager.addBeforeUpdateCallback("TransitionReset",function(e){return n=0,e});var a=function(e){return"_Hide_Map_close"==e?"transition__map":(void 0===e&&(e=""),"transition__"+n++ +"_"+e.toString())},r=function(n,a,r){var o,i=e[n];void 0===r&&(r=!1);var l=$("."+n);if(0==l.length)return a;if(l=l[0],i&&i.tagName==l.tagName&&i.tabIndex==l.tabIndex&&i.parent==l.parentNode.tagName&&i.children==l.children.length){if(o=t[n],r){var s={};for(k in o)s[k]=o[k];for(k in a)s[k]=a[k];a=s}}else o=a,e[n]={tagName:l.tagName,tabIndex:l.tabIndex,parent:l.parentNode.tagName,children:l.children.length};return t[n]=a,o},o=function(e,t){var n=$("."+e);return t?$(n).children(t):$(n)},i=function(e,t,n,a,r){var i=o(e,t);void 0===r&&(r=1900),i.css(n).animate(a,{duration:r,queue:!1});var l=n["..class"],s=a["..class"];if(l&&s&&(i.addClass(l),l!=s)){var l=l.split(" "),s=s.split(" "),c=l.filter(function(e){return s.indexOf(e)==-1}),u=s.filter(function(e){return l.indexOf(e)==-1});l=c.join(" "),s=u.join(" "),i.switchClass(l,s,{duration:r,queue:!1})}},l=function(e,t,n,a,r,i){var l=o(e,t);void 0===i&&(i=1900),n==-1?l.text(a.toString()):l.text(a.toFixed(n)),a!=r&&l.animate({i:1},{duration:i,queue:!1,step:function(e,t){n==-1?t.elem.textContent=(a*(1-e)+r*e).toString():t.elem.textContent=(a*(1-e)+r*e).toFixed(n)}})},s=function(e,t,n,a,i){var l=o(e,t);void 0===i&&(i=200),n["..hover"]&&l.addClass("hover"),l.hover(function(){l.stop(1,1).addClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!0},!0)},function(){l.stop(1,1).removeClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!1},!0)})},c=function(e,t,n,a){var o=r(e,n);return i(e,t,o,n,a),o};return{allocID:a,updateElement:r,animateElement:i,animateTextValue:l,animateHover:s,transitionElement:c}}();var NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},l=function(e,t){NanoUtility.winset("size",e+","+t)},s=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$(document).on("mousemove",function(e){p(),f()}),$(document).on("mouseup",function(i){e&&(e=!1,t=null,n=null),a&&(a=!1,r=null,o=null)}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#resize").on("mousedown",function(e){a=!0})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),l(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){s()})}}}();
\ No newline at end of file
+function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStatePDAClass(){this.key="pda",this.key=this.key.toLowerCase(),this.current_template="",NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=n<0?Math.ceil(n):Math.floor(n),n<0&&(n+=t);n=0?e[a]:a===-1?"{":a===-2?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly."+JSON.stringify(t));var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){s(t),e=!0})},l=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed. Error name: "+r.name+" Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?s(a):t=a},s=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){l(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src",e.config.map+"_nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",l="noIcon";"undefined"!=typeof t&&t&&(i='
',l="hasIcon"),"undefined"!=typeof r&&r||(r="link");var s="";"undefined"!=typeof o&&o&&(s='id="'+o+'"');var c=NanoTransition.allocID(s+"_"+e.toString().replace(/[^a-z0-9_]/gi,"_")+"_"+t);return"undefined"!=typeof a&&a?'"+i+e+'
':'"+i+e+'
'},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;en&&(e=n):e>t?e=t:e
'+r+'
'},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good "':1==e?'"Minor Alert "':'"Major Alert "'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'Please place a valid subject into the DNA modifier.
';var o=e.split(""),i='1
',l=1,s=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:l,selectUISubblock:s}:{selectSEBlock:l,selectSESubblock:s};var d="linkActive";l==t&&s==n&&(d="selected"),i+='
'+o[c]+"
",c++,c%a==0&&c
"},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})},smoothNumber:function(e){var t=NanoTransition.allocID("n");return' '},smoothRound:function(e,t){var n=NanoTransition.allocID(t);return void 0===t&&(placed=0),' '}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStatePDAClass.inheritsFrom(NanoStateClass);var NanoStatePDA=new NanoStatePDAClass;NanoStatePDAClass.prototype.onUpdate=function(e){NanoStateClass.prototype.onUpdate.call(this,e);var t=this;try{if(null!=e.data.app){var n=e.data.app.template;null!=n&&n!=t.current_template?$.when($.ajax({url:n+".tmpl",cache:!1,dataType:"text"})).done(function(a){a+='
';try{NanoTemplate.addTemplate("app",a),NanoTemplate.resetTemplate("app"),$("#uiApp").html(NanoTemplate.parse("app",e)),t.current_template=n,t.onAfterUpdate(e)}catch(r){return void reportError("ERROR: An error occurred while loading the PDA App UI: "+r.message)}}).fail(function(){reportError("ERROR: Loading template app("+n+") failed!")}):NanoTemplate.templateExists("app")&&$("#uiApp").html(NanoTemplate.parse("app",e))}}catch(a){return void reportError("ERROR: An error occurred while rendering the PDA App UI: "+a.message)}},NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='
';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},resetTemplate:function(e){n[e]=null},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"Template error (does not exist) ";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"Template error (failed to compile) "):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}();NanoTransition=function(){var e={},t={},n=0;NanoStateManager.addBeforeUpdateCallback("TransitionReset",function(e){return n=0,e});var a=function(e){return"_Hide_Map_close"==e?"transition__map":(void 0===e&&(e=""),"transition__"+n++ +"_"+e.toString())},r=function(n,a,r){var o,i=e[n];void 0===r&&(r=!1);var l=$("."+n);if(0==l.length)return a;if(l=l[0],i&&i.tagName==l.tagName&&i.tabIndex==l.tabIndex&&i.parent==l.parentNode.tagName&&i.children==l.children.length){if(o=t[n],r){var s={};for(k in o)s[k]=o[k];for(k in a)s[k]=a[k];a=s}}else o=a,e[n]={tagName:l.tagName,tabIndex:l.tabIndex,parent:l.parentNode.tagName,children:l.children.length};return t[n]=a,o},o=function(e,t){var n=$("."+e);return t?$(n).children(t):$(n)},i=function(e,t,n,a,r){var i=o(e,t);void 0===r&&(r=1900),i.css(n).animate(a,{duration:r,queue:!1});var l=n["..class"],s=a["..class"];if(l&&s&&(i.addClass(l),l!=s)){var l=l.split(" "),s=s.split(" "),c=l.filter(function(e){return s.indexOf(e)==-1}),u=s.filter(function(e){return l.indexOf(e)==-1});l=c.join(" "),s=u.join(" "),i.switchClass(l,s,{duration:r,queue:!1})}},l=function(e,t,n,a,r,i){var l=o(e,t);void 0===i&&(i=1900),n==-1?l.text(a.toString()):l.text(a.toFixed(n)),a!=r&&l.animate({i:1},{duration:i,queue:!1,step:function(e,t){n==-1?t.elem.textContent=(a*(1-e)+r*e).toString():t.elem.textContent=(a*(1-e)+r*e).toFixed(n)}})},s=function(e,t,n,a,i){var l=o(e,t);void 0===i&&(i=200),n["..hover"]&&l.addClass("hover"),l.hover(function(){l.stop(1,1).addClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!0},!0)},function(){l.stop(1,1).removeClass("hover",{duration:i,queue:!1}),r(e,{"..hover":!1},!0)})},c=function(e,t,n,a){var o=r(e,n);return i(e,t,o,n,a),o};return{allocID:a,updateElement:r,animateElement:i,animateTextValue:l,animateHover:s,transitionElement:c}}();var NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},l=function(e,t){NanoUtility.winset("size",e+","+t)},s=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$(document).on("mousemove",function(e){p(),f()}),$(document).on("mouseup",function(i){e&&(e=!1,t=null,n=null),a&&(a=!1,r=null,o=null)}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#resize").on("mousedown",function(e){a=!0})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),l(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){s()})}}}();
\ No newline at end of file
diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css
index d91a6ece4ae..9bba91a1376 100644
--- a/nano/assets/nanoui.css
+++ b/nano/assets/nanoui.css
@@ -1,2 +1,2 @@
-@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.5.0);src:url(fontawesome-webfont.eot?#iefix&v=4.5.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.5.0) format('woff2'),url(fontawesome-webfont.woff?v=4.5.0) format('woff'),url(fontawesome-webfont.ttf?v=4.5.0) format('truetype'),url(fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
-.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.displayBarFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.average,.displayBarText.bad,.displayBarText.good,.displayBarText.notgood{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes a{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:a;animation-duration:.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff}.good,.white{font-weight:700}.good{color:#4f7529}.average{color:#cd6500}.average,.bad{font-weight:700}.bad{color:#e00}.idle{color:#272727;font-weight:700}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:blue}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{overflow:hidden}.statusDisplay,.statusDisplayRecords{background:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background:rgba(0,0,0,.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.statusDisplayRecords{overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.fancy{display:none}.minimize{color:#e9c183;position:absolute;top:6px;right:46px}.minimize.hover{color:#b8c9d6}.close{color:#e9c183;position:absolute;top:4px;right:12px}.close.hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;transform:rotate(1turn)}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:.125;margin-left:-1px}.mapIcon16.bad,.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-atmospherictechnician,.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-chemist,.mapIcon16.rank-geneticist,.mapIcon16.rank-medicaldoctor,.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-geneticist,.mapIcon16.rank-roboticist,.mapIcon16.rank-scientist,.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-detective,.mapIcon16.rank-securityofficer,.mapIcon16.rank-warden{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px}th.command{background:#33f}th.command,th.sec{font-weight:700;color:#fff}th.sec{background:#8e0000}th.med{background:#060}th.eng,th.med{font-weight:700;color:#fff}th.eng{background:#b27300}th.sci{background:#a65ba6}th.sci,th.ser{font-weight:700;color:#fff}th.ser{background:#7100aa}th.sup{background:#666621}th.civ,th.sup{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}span.qm-job{color:#b77a41;font-weight:700}.striped:not(table)>:nth-child(even),.striped tr:nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:700;z-index:1;padding:0 10px;text-align:center}.notice{background:url(uiNoticeBackground.jpg) 50% 50%;color:#000}.notice,.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:700;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:700}.item.mainmenu{padding-bottom:.5em}div.clock{color:#fff;font-weight:700;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:50%}.dnaBlock{float:left;width:90px;padding:0 0 5px}.dnaBlockNumber{color:#fff;background:#363636;min-width:20px}.dnaBlockNumber,.dnaSubBlock{font-family:Fixed,monospace;float:left;height:20px;padding:0;text-align:center}.dnaSubBlock{min-width:16px}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{background:#272727;color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020) no-repeat fixed 50%/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}#uiWrapper{width:100%;height:100%;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#uiTitleWrapper{position:relative;height:30px}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{top:50%;left:50%;margin:-512px 0 0 -512px;overflow:hidden;zoom:4}#uiMap,#uiMapImage{position:absolute;width:256px;height:256px}#uiMapImage{bottom:1px;left:1px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:1}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}
\ No newline at end of file
+@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.5.0);src:url(fontawesome-webfont.eot?#iefix&v=4.5.0) format("embedded-opentype"),url(fontawesome-webfont.woff2?v=4.5.0) format("woff2"),url(fontawesome-webfont.woff?v=4.5.0) format("woff"),url(fontawesome-webfont.ttf?v=4.5.0) format("truetype"),url(fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
+.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.displayBarFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.average,.displayBarText.bad,.displayBarText.good,.displayBarText.notgood{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes a{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:a;animation-duration:.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff}.good,.white{font-weight:700}.good{color:#4f7529}.average{color:#cd6500}.average,.bad{font-weight:700}.bad{color:#e00}.idle{color:#272727;font-weight:700}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:blue}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}div.display{padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}div.display header{display:block;position:relative;width:98.5%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}div.display header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article{display:table;width:100%;border-collapse:collapse}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{overflow:hidden}.statusDisplay,.statusDisplayRecords{background:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background:rgba(0,0,0,.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.statusDisplayRecords{overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.fancy{display:none}.minimize{color:#e9c183;position:absolute;top:6px;right:46px}.minimize.hover{color:#b8c9d6}.close{color:#e9c183;position:absolute;top:4px;right:12px}.close.hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;transform:rotate(1turn)}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:.125;margin-left:-1px}.mapIcon16.bad,.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-atmospherictechnician,.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-chemist,.mapIcon16.rank-geneticist,.mapIcon16.rank-medicaldoctor,.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-geneticist,.mapIcon16.rank-roboticist,.mapIcon16.rank-scientist,.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-detective,.mapIcon16.rank-securityofficer,.mapIcon16.rank-warden{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px}th.command{background:#33f}th.command,th.sec{font-weight:700;color:#fff}th.sec{background:#8e0000}th.med{background:#060}th.eng,th.med{font-weight:700;color:#fff}th.eng{background:#b27300}th.sci{background:#a65ba6}th.sci,th.ser{font-weight:700;color:#fff}th.ser{background:#7100aa}th.sup{background:#666621}th.civ,th.sup{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}span.qm-job{color:#b77a41;font-weight:700}.striped:not(table)>:nth-child(2n),.striped tr:nth-child(2n){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:700;z-index:2;padding:0 10px;text-align:center}.notice{background:url(uiNoticeBackground.jpg) 50% 50%;color:#000}.notice,.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:700;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:700}.item.mainmenu{padding-bottom:.5em}div.clock{color:#fff;font-weight:700;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:50%}.dnaBlock{float:left;width:90px;padding:0 0 5px}.dnaBlockNumber{color:#fff;background:#363636;min-width:20px}.dnaBlockNumber,.dnaSubBlock{font-family:Fixed,monospace;float:left;height:20px;padding:0;text-align:center}.dnaSubBlock{min-width:16px}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{background:#272727;color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}[data-tooltip]{position:relative}[data-tooltip]:after{position:absolute;display:block;z-index:1;width:250px;padding:10px;transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #999;background-color:#363636}[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}[data-tooltip].tooltipTop:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}[data-tooltip].tooltipBottom:after,[data-tooltip].tooltipTop:hover:after{transform:translateX(-50%) translateY(-8px)}[data-tooltip].tooltipBottom:after{top:100%;left:50%}[data-tooltip].tooltipBottom:hover:after{transform:translateX(-50%) translateY(8px)}[data-tooltip].tooltipLeft:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}[data-tooltip].tooltipLeft:hover:after,[data-tooltip].tooltipRight:after{transform:translateX(-8px) translateY(-50%)}[data-tooltip].tooltipRight:after{top:50%;left:100%}[data-tooltip].tooltipRight:hover:after{transform:translateX(8px) translateY(-50%)}body{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020) no-repeat fixed 50%/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}#uiWrapper{width:100%;height:100%;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#uiTitleWrapper{position:relative;height:30px}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{top:50%;left:50%;margin:-512px 0 0 -512px;overflow:hidden;zoom:4}#uiMap,#uiMapImage{position:absolute;width:256px;height:256px}#uiMapImage{bottom:1px;left:1px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:2}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}
\ No newline at end of file
diff --git a/nano/images/Cyberiad_nanomap_z1.png b/nano/images/Cyberiad_nanomap_z1.png
new file mode 100644
index 00000000000..0f064d6a3db
Binary files /dev/null and b/nano/images/Cyberiad_nanomap_z1.png differ
diff --git a/nano/images/MetaStation_nanomap_z1.png b/nano/images/MetaStation_nanomap_z1.png
new file mode 100644
index 00000000000..57bdbda01f9
Binary files /dev/null and b/nano/images/MetaStation_nanomap_z1.png differ
diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png
deleted file mode 100644
index c22e9bf6fb7..00000000000
Binary files a/nano/images/nanomap_z1.png and /dev/null differ
diff --git a/nano/layouts/layout_default.tmpl b/nano/layouts/layout_default.tmpl
index 1c270ee4c18..0154c6d31fb 100644
--- a/nano/layouts/layout_default.tmpl
+++ b/nano/layouts/layout_default.tmpl
@@ -19,7 +19,7 @@
-
+
diff --git a/nano/layouts/layout_program.tmpl b/nano/layouts/layout_program.tmpl
new file mode 100644
index 00000000000..d357b4c2ea9
--- /dev/null
+++ b/nano/layouts/layout_program.tmpl
@@ -0,0 +1,75 @@
+
+
+
{{:config.title}}
+
+
+
+
+
+
+
+
+
+ {{:helper.link('Shutdown', 'power-off', {'action' : 'PC_shutdown'})}}
+ {{if data.PC_showexitprogram}}
+ {{:helper.link('EXIT PROGRAM', 'times', {'action' : 'PC_exit'})}}
+ {{:helper.link('Minimize Program', 'minus', {'action' : 'PC_minimize'})}}
+ {{/if}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nano/scripts/nano/nano_base_callbacks.js b/nano/scripts/nano/nano_base_callbacks.js
index 42a901c4783..81b9e4b0530 100644
--- a/nano/scripts/nano/nano_base_callbacks.js
+++ b/nano/scripts/nano/nano_base_callbacks.js
@@ -85,7 +85,7 @@ NanoBaseCallbacks = function ()
});
});
- $('#uiMapImage').attr('src', 'nanomap_z' + updateData['config']['mapZLevel'] + '.png');
+ $('#uiMapImage').attr('src',updateData['config']['map'] + '_nanomap_z' + updateData['config']['mapZLevel'] + '.png');
return updateData;
}
diff --git a/nano/styles/_display.less b/nano/styles/_display.less
new file mode 100644
index 00000000000..eb7c6216c24
--- /dev/null
+++ b/nano/styles/_display.less
@@ -0,0 +1,29 @@
+div.display {
+ padding: 4px;
+ margin: 6px 0;
+
+ background-color: rgba(0, 0, 0, 0.33);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5);
+}
+
+div.display header {
+ display: block;
+ position: relative;
+ width: 98.5%;
+ padding: 0 4px;
+ margin-bottom: 6px;
+ color: #FFFFFF;
+ border-bottom: 2px solid #40628a;
+}
+
+div.display header .buttonRight {
+ position: absolute;
+ bottom: 6px;
+ right: 4px;
+}
+
+div.display article {
+ display: table;
+ width: 100%;
+ border-collapse: collapse;
+}
\ No newline at end of file
diff --git a/nano/styles/_tooltip.less b/nano/styles/_tooltip.less
new file mode 100644
index 00000000000..a1384664eab
--- /dev/null
+++ b/nano/styles/_tooltip.less
@@ -0,0 +1,64 @@
+*[data-tooltip] {
+ position: relative;
+
+ &::after {
+ position: absolute;
+ display: block;
+ z-index: 2;
+ width: 250px;
+ padding: 10px;
+ transform: translateX(-50%);
+
+ visibility: hidden;
+ opacity: 0;
+
+ white-space: normal;
+ text-align: left;
+ content: attr(data-tooltip);
+
+ transition: all .5s;
+ border: 1px solid #999999;
+ background-color: #363636;
+ }
+
+ &:hover::after {
+ visibility: visible;
+ opacity: 1;
+ }
+
+ &.tooltipTop::after {
+ bottom: 100%;
+ left: 50%;
+ transform: translateX(-50%) translateY(8px);
+ }
+ &.tooltipTop:hover::after {
+ transform: translateX(-50%) translateY(-8px);
+ }
+
+ &.tooltipBottom::after {
+ top: 100%;
+ left: 50%;
+ transform: translateX(-50%) translateY(-8px);
+ }
+ &.tooltipBottom:hover::after {
+ transform: translateX(-50%) translateY(8px);
+ }
+
+ &.tooltipLeft::after {
+ top: 50%;
+ right: 100%;
+ transform: translateX(8px) translateY(-50%);
+ }
+ &.tooltipLeft:hover::after {
+ transform: translateX(-8px) translateY(-50%);
+ }
+
+ &.tooltipRight::after {
+ top: 50%;
+ left: 100%;
+ transform: translateX(-8px) translateY(-50%);
+ }
+ &.tooltipRight:hover::after {
+ transform: translateX(8px) translateY(-50%);
+ }
+}
\ No newline at end of file
diff --git a/nano/styles/nanoui.less b/nano/styles/nanoui.less
index a90b819c9fe..5263aaa4871 100644
--- a/nano/styles/nanoui.less
+++ b/nano/styles/nanoui.less
@@ -4,11 +4,13 @@
@import "_link";
@import "_color";
@import "_config";
+@import "_display";
@import "_formatting";
@import "_icon";
@import "_lists";
@import "_misc";
@import "_native";
+@import "_tooltip";
body {
diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl
index 51b74a12fda..e88db47456a 100644
--- a/nano/templates/adv_med.tmpl
+++ b/nano/templates/adv_med.tmpl
@@ -52,10 +52,13 @@ Used In File(s): \code\game\machinery\adv_med.dm
Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
{{/if}}
{{if data.occupant.blind}}
-
Pupils unresponsive.
+
Cataracts detected.
+ {{/if}}
+ {{if data.occupant.colourblind}}
+
Photoreceptor abnormalities detected.
{{/if}}
{{if data.occupant.nearsighted}}
-
Retinal misalignment detected
+
Retinal misalignment detected.
{{/if}}
diff --git a/nano/templates/ai_restorer.tmpl b/nano/templates/ai_restorer.tmpl
new file mode 100644
index 00000000000..eb4c20a74f8
--- /dev/null
+++ b/nano/templates/ai_restorer.tmpl
@@ -0,0 +1,45 @@
+{{if data.restoring}}
+
Reconstruction in progress!
+{{/if}}
+
+
+
Inserted AI:
+
{{:helper.link(data.name ? data.name : "-----", 'eject', {'action' : 'PRG_eject'}, data.nocard ? 'disabled' : null)}}
+
+
+{{if data.error}}
+
ERROR: {{:data.error}}
+{{else}}
+
System Status
+
+
+
Current AI:
+
{{:data.name}}
+
+
+
Status:
+
{{if data.isDead}}Nonfunctional{{else}}Functional{{/if}}
+
+
+
System Integrity:
+ {{:helper.displayBar(data.health, 0, 100, (data.health > 75) ? 'good' : (data.health > 50) ? 'average' : 'bad')}}
+
+ {{:helper.smoothRound(data.health)}}%
+
+
+
+
+ Active Laws:
+
+
+
+ {{for data.ai_laws}}
+ {{:value.index}}: {{:value.text}}
+ {{/for}}
+
+
+
+
+
Operations
+ {{:helper.link('Begin Reconstruction', 'plus', {'action' : 'PRG_beginReconstruction'}, data.restoring ? 'disabled' : null)}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index 47a3ce113e2..5e705b2fe46 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -19,6 +19,9 @@
{{:helper.link('Male', null, { 'gender' : 'male'}, null, data.gender == 'male' ? 'selected' : null)}}
{{:helper.link('Female', null, { 'gender' : 'female'}, null, data.gender == 'female' ? 'selected' : null)}}
+ {{if !data.has_gender}}
+ {{:helper.link('Genderless', null, { 'gender' : 'plural'}, null, data.gender == 'plural' ? 'selected' : null)}}
+ {{/if}}
{{/if}}
diff --git a/nano/templates/atm.tmpl b/nano/templates/atm.tmpl
new file mode 100644
index 00000000000..fa6c818b081
--- /dev/null
+++ b/nano/templates/atm.tmpl
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
Nanotrasen Automatic Teller Machine
+For all your monetary needs!
+
+
This terminal is {{:data.machine_id}}.
Report this code when contacting Nanotrasen IT Support
+
+
+
+
Card:
+
{{:helper.link(data.held_card_name, 'eject', {'choice' : 'insert_card'})}}
+
+
+{{if data.ticks_left_locked_down > 0}}
+
Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled.
+{{else data.authenticated_account}}
+ {{if data.view_screen == 1}}
+
Select a new security level for this account:
+
+
Level:
+
{{:helper.link('Zero', 'unlock', {'choice' : 'change_security_level', 'new_security_level' : 0}, data.security_level == 0 ? 'selected' : null)}}
+
+
+
Description:
+
Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct.
+
+
+
+
Level:
+
{{:helper.link('One', 'unlock-alt', {'choice' : 'change_security_level', 'new_security_level' : 1}, data.security_level == 1 ? 'selected' : null)}}
+
+
+
Description:
+
An account number and pin must be manually entered to access this account and process transactions.
+
+
+
+
Level:
+
{{:helper.link('Two', 'lock', {'choice' : 'change_security_level', 'new_security_level' : 2}, data.security_level == 2 ? 'selected' : null)}}
+
+
+
Description:
+
In addition to account number and pin, a card is required to access this account and process transactions.
+
+
+ {{:helper.link('Back', 'arrow-left', {'choice' : 'view_screen', 'view_screen' : 0})}}
+ {{else data.view_screen == 2}}
+
Account balance: ${{:helper.smoothRound(data.money)}}
+
+
+ {{:helper.link('Back', 'arrow-left', {'choice' : 'view_screen', 'view_screen' : 0})}}
+ {{else data.view_screen == 3}}
+
Transaction logs
+
{{:helper.link('Back', 'arrow-left', {'choice' : 'view_screen', 'view_screen' : 0})}}
+
+
+ {{if data.transaction_log}}
+
+
+
+ Timestamp
+ Target
+ Reason
+ Value
+ Terminal
+
+
+
+ {{for data.transaction_log}}
+
+ {{:value.date}} {{:value.time}}
+ {{:value.target_name}}
+ {{:value.purpose}}
+ ${{:value.amount}}
+ {{:value.source_terminal}}
+
+ {{/for}}
+
+
+ {{else}}
+
Your account has no financial transactions on record for today.
+ {{/if}}
+
+ {{else}}
+ Welcome,
{{:data.owner_name}} .
+
Account balance: ${{:helper.smoothRound(data.money)}}
+
+
+
+
Menu
+
{{:helper.link('Change account security level', 'lock', {'choice' : 'view_screen', 'view_screen' : 1})}}
+
{{:helper.link('Make transfer', 'exchange', {'choice' : 'view_screen', 'view_screen' : 2})}}
+
{{:helper.link('View transaction log', 'list', {'choice' : 'view_screen', 'view_screen' : 3})}}
+
{{:helper.link('Print balance statement', 'print', {'choice' : 'balance_statement'})}}
+
{{:helper.link('Logout', 'sign-out', {'choice' : 'logout'})}}
+ {{/if}}
+{{else data.linked_db}}
+
+{{else}}
+
Unable to connect to accounts database, please retry and if the issue persists contact Nanotrasen IT support.
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/atmos_filter.tmpl b/nano/templates/atmos_filter.tmpl
new file mode 100644
index 00000000000..e0715e243c5
--- /dev/null
+++ b/nano/templates/atmos_filter.tmpl
@@ -0,0 +1,24 @@
+
+
Power:
+
{{:helper.link(data.on ? 'On' : 'Off', data.on ? 'power-off' : 'times', {'power' : 1}, null, data.on ? 'selected' : null)}}
+
+
+
Output Pressure:
+
+ {{:helper.link('Set', 'pencil', {'pressure' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'pressure' : 'max'}, data.pressure == data.max_pressure ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.pressure)}} kPa
+
+
+
+
Filter:
+
+ {{:helper.link('Nothing', null, {'filter' : -1}, data.filter_type == -1 ? 'selected' : null)}}
+ {{:helper.link('Plasma', null, {'filter' : 0}, data.filter_type == 0 ? 'selected' : null)}}
+ {{:helper.link('O2', null, {'filter' : 1}, data.filter_type == 1 ? 'selected' : null)}}
+ {{:helper.link('N2', null, {'filter' : 2}, data.filter_type == 2 ? 'selected' : null)}}
+ {{:helper.link('CO2', null, {'filter' : 3}, data.filter_type == 3 ? 'selected' : null)}}
+ {{:helper.link('N2O', null, {'filter' : 4}, data.filter_type == 4 ? 'selected' : null)}}
+
+
+
diff --git a/nano/templates/atmos_mixer.tmpl b/nano/templates/atmos_mixer.tmpl
new file mode 100644
index 00000000000..3bae7f993bd
--- /dev/null
+++ b/nano/templates/atmos_mixer.tmpl
@@ -0,0 +1,32 @@
+
+
Power:
+
{{:helper.link(data.on ? 'On' : 'Off', data.on ? 'power-off' : 'times', {'power' : 1}, null, data.on ? 'selected' : null)}}
+
+
+
Output Pressure:
+
+ {{:helper.link('Set', 'pencil', {'pressure' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'pressure' : 'max'}, data.pressure == data.max_pressure ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.pressure)}} kPa
+
+
+
+
Node 1:
+
+ {{:helper.link(' ', null, {'node1' : -0.1}, data.node1_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link(' ', null, {'node1' : -0.01}, data.node1_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link(' ', null, {'node1' : 0.01}, data.node1_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.link(' ', null, {'node1' : 0.1}, data.node1_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.node1_concentration)}}%
+
+
+
+
Node 2:
+
+ {{:helper.link(' ', null, {'node2' : -0.1}, data.node2_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link(' ', null, {'node2' : -0.01}, data.node2_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link(' ', null, {'node2' : 0.01}, data.node2_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.link(' ', null, {'node2' : 0.1}, data.node2_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.node2_concentration)}}%
+
+
\ No newline at end of file
diff --git a/nano/templates/atmos_pump.tmpl b/nano/templates/atmos_pump.tmpl
new file mode 100644
index 00000000000..a27e5b710dd
--- /dev/null
+++ b/nano/templates/atmos_pump.tmpl
@@ -0,0 +1,24 @@
+
+
Power:
+
{{:helper.link(data.on ? 'On' : 'Off', data.on ? 'power-off' : 'times', {'power' : 1}, null, data.on ? 'selected' : null)}}
+
+{{if data.max_rate}}
+
+
Transfer Rate:
+
+ {{:helper.link('Set', 'pencil', {'rate' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'rate' : 'max'}, data.rate == data.max_rate ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.rate)}} L/s
+
+
+{{else}}
+
+
Output Pressure:
+
+ {{:helper.link('Set', 'pencil', {'pressure' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'pressure' : 'max'}, data.pressure == data.max_pressure ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.pressure)}} kPa
+
+
+{{/if}}
+
diff --git a/nano/templates/autolathe.tmpl b/nano/templates/autolathe.tmpl
new file mode 100644
index 00000000000..55e017ca95c
--- /dev/null
+++ b/nano/templates/autolathe.tmpl
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+{{if data.screen == 2 || data.screen == 3}}
+
+ {{:helper.link('Main Menu', 'reply', {'menu' : 1})}}
+
+{{/if}}
+
+
+
+
+ {{if data.screen == 1}}
+
Autolathe Menu
+
+
+ Total amount: {{:data.total_amount}} / {{:data.max_amount}} cm3
+
+
+ Metal amount: {{:data.metal_amount}} cm3
+
+
+ Glass amount: {{:data.glass_amount}} cm3
+
+
+
+
+
+
+ {{for data.categories}}
+ {{if (index & 1) == 0 && index != 0}}
+
+ {{/if}}
+ {{:helper.link(value, 'arrow-right', {'category': value})}}
+ {{/for}}
+
+ {{else data.screen == 2 || data.screen == 3}}
+ {{if data.screen == 2}}
+
Viewing Category {{:data.selected_category}}:
+ {{else data.screen == 3}}
+
Search Results for '{{:data.search}}':
+ {{/if}}
+
+
+ Total amount: {{:data.total_amount}} / {{:data.max_amount}} cm3
+
+
+ Metal amount: {{:data.metal_amount}} cm3
+
+
+ Glass amount: {{:data.glass_amount}} cm3
+
+
+
+ {{for data.designs}}
+
+ {{:helper.link(value.name, 'print', {'make' : value.id, 'multiplier' : 1}, value.disabled)}}
+ {{if value.max_multiplier > 10}}
+ {{:helper.link('x10', null, {'make' : value.id, 'multiplier' : 10}, value.disabled)}}
+ {{/if}}
+ {{if value.max_multiplier > 25}}
+ {{:helper.link('x25', null, {'make' : value.id, 'multiplier' : 25}, value.disabled)}}
+ {{/if}}
+ {{if value.max_multiplier}}
+ {{:helper.link('x' + value.max_multiplier, null, {'make' : value.id, 'multiplier' : value.max_multiplier}, value.disabled)}}
+ {{/if}}
+
+ {{for value.materials : material : i}}
+ {{if material.amount}}
+ |
+ {{if material.is_red}}
+
+ {{/if}}
+ {{:material.amount}} {{:material.name}}
+ {{if material.is_red}}
+
+ {{/if}}
+ {{/if}}
+ {{/for}}
+
+
+ {{/for}}
+
+ {{/if}}
+
+
+
+
+
Queue contains:
+ {{if data.queue}}
+ {{if data.processing}}
+
{{:data.processing}}
+ {{/if}}
+
+ {{for data.queue}}
+
+ {{if !value.can_build}}
+
+ {{/if}}
+ {{:value.name}} {{:value.multiplier > 1 ? '(xvalue.multiplier)' : ''}}
+ {{if !value.can_build}}
+
+ {{/if}}
+
+ {{if index + 1 > 1}}
+ {{:helper.link('', 'arrow-up', {'queue_move' : -1, 'index' : index + 1})}}
+ {{/if}}
+ {{if index + 1 < data.queue_len}}
+ {{:helper.link('', 'arrow-down', {'queue_move' : +1, 'index' : index + 1})}}
+ {{/if}}
+ {{:helper.link('Remove', 'times', {'remove_from_queue' : index + 1})}}
+
+
+ {{/for}}
+
+ {{:helper.link('Clear queue', 'trash', {'clear_queue' : 1})}}
+ {{else}}
+ {{if data.processing}}
+
{{:data.processing}}
+ {{else}}
+
Nothing
+ {{/if}}
+ {{/if}}
+
+
+
\ No newline at end of file
diff --git a/nano/templates/bluespace_artillery.tmpl b/nano/templates/bluespace_artillery.tmpl
deleted file mode 100644
index 344a6d1fd48..00000000000
--- a/nano/templates/bluespace_artillery.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
Bluespace Artillery Control
-
-
Target Lock
-
{{:data.target}}
-
-
-
Fire Cooldown
-
- {{if data.reloadtime_mins > 0 || data.reloadtime_mins == 0 && data.reloadtime_secs > 0}}
- {{:data.reloadtime_mins}}:{{:data.reloadtime_secs}}
- {{else}}
- Ready
- {{/if}}
-
-
-
- {{:helper.link('Select Target', 'exclamation-triangle', { 'area' : 1 })}}
- {{:helper.link('Fire', 'exclamation-triangle', { 'fire' : 1 }, data.reloadtime_mins > 0 || data.reloadtime_mins == 0 && data.reloadtime_secs > 0 ? 'disabled' : '')}}
-
-
-
Deployment of weapon authorized by Nanotrasen Naval Command. Remember, friendly fire is grounds for termination of your contract and life.
-
diff --git a/nano/templates/bsa.tmpl b/nano/templates/bsa.tmpl
new file mode 100644
index 00000000000..a0e8a60deb5
--- /dev/null
+++ b/nano/templates/bsa.tmpl
@@ -0,0 +1,51 @@
+
+{{if data.notice}}
+
{{:data.notice}}
+{{/if}}
+
Bluespace Artillery Control
+
+
+ Target:
+
+
+ {{:helper.link(data.target ? data.target : "None", 'crosshairs', {'recalibrate' : 1})}}
+
+
+
+
+ Reload Cooldown:
+
+
+ {{if data.ready}}
+ Ready
+ {{else data.reloadtime_mins || data.reloadtime_secs}}
+ {{:data.reloadtime_mins}}:{{:data.reloadtime_secs}}
+ {{else}}
+ No cannon connected!
+ {{/if}}
+
+
+
+
+ Controls:
+
+
+ {{:helper.link('FIRE!', 'warning', {'fire' : 1}, data.ready && data.target ? null : 'disabled')}}
+
+
+{{if !data.connected}}
+
+
+ Maintenance:
+
+
+ {{:helper.link('Complete Deployment', 'wrench', {'build' : 1})}}
+
+
+{{else}}
+
+
Deployment of weapon authorized by Nanotrasen Naval Command. Remember, friendly fire is grounds for termination of your contract and life.
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/card_prog.tmpl b/nano/templates/card_prog.tmpl
new file mode 100644
index 00000000000..56c913a9de9
--- /dev/null
+++ b/nano/templates/card_prog.tmpl
@@ -0,0 +1,277 @@
+{{if data.printing}}
+
The computer is currently busy.
+
+
Printing...
+
+
+ Thank you for your patience!
+
+{{else}}
+ {{:helper.link('Access Modification', 'home', {'action' : 'PRG_mode', 'mode_target' : 0}, !data.mode ? 'disabled' : null)}}
+ {{:helper.link('Job Management', 'gear', {'action' : 'PRG_mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}
+ {{:helper.link('Crew Manifest', 'folder-open', {'action' : 'PRG_mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}}
+ {{:helper.link('Print', 'print', {'action' : 'PRG_print'}, data.printer && (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}
+
+ {{if data.mode == 1}}
+
+
Job Management
+
+
+
+ Authorized Identity:
+
+
+ {{:helper.link(data.scan_name, 'eject', {'action' : 'PRG_scan'})}}
+
+
+ Cooldown:
+
+
+ {{if data.cooldown_mins > 0 || data.cooldown_mins == 0 && data.cooldown_secs > 0}}
+ Next change in: {{:data.cooldown_mins}}:{{:data.cooldown_secs}}
+ {{else}}
+ Ready
+ {{/if}}
+
+
+
+
+ {{for data.job_slots}}
+
+ {{:value.title}}: {{:value.current_positions}}/{{:value.total_positions}}
+ {{:helper.link('-', null, {'action' : 'PRG_make_job_unavailable', 'job' : value.title}, value.can_close == 1 && data.authenticated ? null : 'disabled')}}
+ {{:helper.link('+', null, {'action' : 'PRG_make_job_available', 'job' : value.title}, value.can_open == 1 && data.authenticated ? null : 'disabled')}}
+
+ {{/for}}
+
+ {{else data.mode == 2}}
+
+
Crew Manifest
+
+
+ {{:data.manifest}}
+
+ {{else}}
+
+
Access Modification
+
+
+ {{if !data.authenticated}}
+
Please insert the IDs into the terminal to proceed.
+ {{/if}}
+
+
+
+ Target Identity:
+
+
+ {{:helper.link(data.target_name, 'eject', {'action' : 'PRG_modify'})}}
+
+
+
+
+ Authorized Identity:
+
+
+ {{:helper.link(data.scan_name, 'eject', {'action' : 'PRG_scan'})}}
+
+
+
+
+ {{if data.authenticated}}
+
+
+ {{if data.has_modify}}
+
+
Details
+
+
+
+
+
+
+
+
+ Terminations:
+
+
+ {{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}}
+
+
+
+
+
Assignment
+
+
+
+
+
+
+
+ Special
+
+ {{:helper.link("Captain", '', {'action' : 'PRG_assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}}
+ {{:helper.link("Custom", '', {'action' : 'PRG_assign', 'assign_target' : 'Custom'})}}
+
+
+
+ Engineering
+
+ {{for data.engineering_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+
+ Medical
+
+ {{for data.medical_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+
+ Security
+
+ {{for data.security_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+
+ Science
+
+ {{for data.science_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+
+ Support
+
+ {{for data.support_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+
+ Civilian
+
+ {{for data.civilian_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+ {{if data.centcom_access}}
+
+ CentComm
+
+ {{for data.centcom_jobs}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
+ {{/for}}
+
+
+ {{/if}}
+
+
+
+
+ {{if data.centcom_access}}
+
+
Central Command
+
+
+ {{for data.all_centcom_access}}
+ {{:helper.link(value.desc, '', {'action' : 'PRG_access', 'access_target' : value.ref, 'allowed' : value.allowed}, null, value.allowed ? 'selected' : null)}}
+ {{/for}}
+
+
Card Skin
+ {{for data.all_centcom_skins}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_skin', 'skin_target' : value.skin}, null,(data.current_skin == value.skin) ? 'selected' : null )}}
+ {{/for}}
+
+
+ {{else}}
+
+
{{:data.station_name}}
+
+
+ {{for data.regions}}
+
+
{{:value.name}}
+ {{for value.accesses :accessValue:accessKey}}
+
+ {{:helper.link(accessValue.desc, '', {'action' : 'PRG_access', 'access_target' : accessValue.ref, 'allowed' : accessValue.allowed}, null, accessValue.allowed ? 'selected' : null)}}
+
+ {{/for}}
+
+ {{/for}}
+
+
Card Skin
+ {{for data.card_skins}}
+ {{:helper.link(value.display_name, '', {'action' : 'PRG_skin', 'skin_target' : value.skin}, null,(data.current_skin == value.skin) ? 'selected' : null )}}
+ {{/for}}
+
+
+ {{/if}}
+ {{/if}}
+ {{/if}}
+ {{/if}}
+{{/if}}
diff --git a/nano/templates/comm_console.tmpl b/nano/templates/comm_console.tmpl
index c4e1799afcf..062c8d844f3 100644
--- a/nano/templates/comm_console.tmpl
+++ b/nano/templates/comm_console.tmpl
@@ -111,17 +111,17 @@ Used In File(s): /code/game/machinery/computers/communications.dm
Messages
{{if data.current_message}}
{{:helper.link('Messages','home',{'operation':'messagelist'})}}
-
{{>title}}
+
{{:data.current_message_title}}
- {{>body}}
+ {{:data.current_message}}
{{else}}
{{:helper.link('Back','home',{'operation':'main'})}}
{{for data.messages}}
- {{:helper.link('Open','envelope-o',{'operation':'messagelist','msgid':data.id})}}
- {{:helper.link('Delete','close',{'operation':'delmessage','msgid':data.id},'red')}}
- {{>data.title}}
+ {{:value.title}}
+ {{:helper.link('Open','envelope-o',{'operation':'messagelist','msgid':value.id})}}
+ {{:helper.link('Delete','close',{'operation':'delmessage','msgid':value.id})}}
{{/for}}
{{/if}}
diff --git a/nano/templates/comm_program.tmpl b/nano/templates/comm_program.tmpl
new file mode 100644
index 00000000000..6925b28b914
--- /dev/null
+++ b/nano/templates/comm_program.tmpl
@@ -0,0 +1,135 @@
+{{if !data.authenticated}}
+
Please swipe your ID card. {{:helper.link('Log In', 'unlock', {'PRG_login' : 1}, null, 'fixed')}}
+{{else}}
+ {{if !data.is_ai}}
+
Please remember to {{:helper.link('Log Out', 'lock', {'PRG_logout' : 1}, null, 'fixed')}}
+ {{/if}}
+ {{if data.lastCallLoc}}
+
Most recent shuttle call/recall traced to: {{:data.lastCallLoc}}
+ {{else}}
+
Unable to trace most recent shuttle call/recall signal.
+ {{/if}}
+
+
Emergency Shuttle:
+ {{if data.shuttle.eta}}
+
ETA:
+
+ {{>data.shuttle.eta}}
+
+ {{/if}}
+
Options:
+
+ {{if data.shuttle.callStatus == 1 && !data.is_ai}}
+ {{:helper.link('Cancel Shuttle', 'arrow-left', {'PRG_operation' : 'cancelshuttle'})}}
+ {{else data.shuttle.callStatus == 2}}
+ {{:helper.link('Call Shuttle', 'arrow-circle-down', {'PRG_operation' : 'callshuttle'})}}
+ {{/if}}
+
+
+
+ {{if data.screen==1}}
+
+
Menu
+
+ {{if data.authenticated==2}}
+
+ {{:helper.link('Make an Announcement', 'info', {'PRG_operation' : 'announce'})}}
+
+
+ {{if data.emagged}}
+ {{:helper.link('Message [UNKNOWN]', 'envelope', {'PRG_operation' : 'MessageSyndicate'})}}
+ {{else}}
+ {{:helper.link('Message CentComm', 'envelope', {'PRG_operation' : 'MessageCentcomm'})}}
+ {{/if}}
+
+
+ {{:helper.link('Request Nuclear Authentication Codes', 'exclamation-triangle', {'PRG_operation' : 'nukerequest'})}}
+
+ {{/if}}
+
+ {{:helper.link('Change Alert Level', 'signal', {'PRG_operation' : 'changeseclevel'})}}
+
+
+ {{:helper.link('Change Status Displays', 'info', {'PRG_operation' : 'status'})}}
+
+
+ {{:helper.link('Message List', 'comment', {'PRG_operation' : 'messagelist'})}}
+
+
+ {{:helper.link('Restart Nano-Mob Hunter GO! Server', 'power-off', {'PRG_operation' : 'RestartNanoMob'})}}
+
+ {{if data.dock_request}}
+
+ {{:helper.link('Accept Docking Request', 'signal', {'PRG_operation' : 'AcceptDocking'})}}
+ {{:helper.link('Deny Docking Request', 'signal', {'PRG_operation' : 'DenyDocking'})}}
+
+ {{/if}}
+
+ {{else data.screen==2}}
+
+
Status Displays
+ {{:helper.link('Back', 'home', {'PRG_operation' : 'main'})}}
+
Presets
+ {{for data.stat_display.presets}}
+
+
{{:helper.link(value.label, 'info', {'PRG_operation' : 'setstat', 'statdisp' : value.name}, name == data.stat_display.type ? 'selected' : null)}}
+
+ {{/for}}
+
Alerts
+ {{for data.stat_display.alerts}}
+
+
{{:helper.link(value.label, 'exclamation-triangle', {'PRG_operation' : 'setstat', 'statdisp' : 'alert', 'alert' : value.alert}, value.alert == data.stat_display.type ? 'selected' : null)}}
+
+ {{/for}}
+
Messages
+
+ {{if data.stat_display.type}}
+
+
{{:helper.link('Line 1:', 'gear', {'PRG_operation':'setmsg1'})}}
+
{{>data.stat_display.line_1}}
+
+
+
{{:helper.link('Line 2:', 'gear', {'PRG_operation':'setmsg2'})}}
+
{{>data.stat_display.line_2}}
+
+ {{/if}}
+
+ {{else data.screen==3}}
+
+
Messages
+ {{if data.current_message}}
+ {{:helper.link('Messages', 'home', {'PRG_operation' : 'messagelist'})}}
+
{{:data.current_message_title}}
+
+ {{:data.current_message}}
+
+ {{else}}
+ {{:helper.link('Back', 'home', {'PRG_operation' : 'main'})}}
+ {{for data.messages}}
+
+ {{:value.title}}
+ {{:helper.link('Open', 'envelope-o', {'PRG_operation' : 'messagelist', 'msgid' : value.id})}}
+ {{:helper.link('Delete', 'close', {'PRG_operation' : 'delmessage', 'msgid' : value.id})}}
+
+ {{/for}}
+ {{/if}}
+ {{else data.screen==4}}
+
+
Security Level
+ {{:helper.link('Back', 'home', {'PRG_operation' : 'main'})}}
+
+
+
Security Level:
+
{{>data.str_security_level}}
+
+
+
Presets:
+
+ {{for data.levels}}
+ {{:helper.link(value.name, 'comment', {'PRG_operation' : 'newalertlevel', 'level' : value.id}, value.id == data.security_level ? 'selected' : null)}}
+ {{/for}}
+
+
+
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/computer_fabricator.tmpl b/nano/templates/computer_fabricator.tmpl
new file mode 100644
index 00000000000..b5d80101b70
--- /dev/null
+++ b/nano/templates/computer_fabricator.tmpl
@@ -0,0 +1,82 @@
+{{:helper.link('Clear Order', 'circle', {'action' : 'clean_order'})}}
+
Your new computer device you always dreamed of is just four steps away...
+{{if data.state == 0}}
+
+
Step 1: Select your device type
+ {{:helper.link('Laptop', 'laptop', {'action' : 'pick_device', 'pick' : 1})}}
+ {{:helper.link('Tablet', 'tablet', {'action' : 'pick_device', 'pick' : 2})}}
+
+{{else data.state == 1}}
+
+
Step 2: Personalise your device
+
+
+ Current Price:
+ {{:data.totalprice}}C
+
+
+ Battery:
+ {{:helper.link('Standard', 'bolt', {'action' : 'hw_battery', 'battery' : 1}, data.hw_battery == 1 ? "selected" : null)}}
+ {{:helper.link('Upgraded', 'bolt', {'action' : 'hw_battery', 'battery' : 2}, data.hw_battery == 2 ? "selected" : null)}}
+ {{:helper.link('Advanced', 'bolt', {'action' : 'hw_battery', 'battery' : 3}, data.hw_battery == 3 ? "selected" : null)}}
+
+
+ Hard Drive:
+ {{:helper.link('Standard', 'hdd-o', {'action' : 'hw_disk', 'disk' : 1}, data.hw_disk == 1 ? "selected" : null)}}
+ {{:helper.link('Upgraded', 'hdd-o', {'action' : 'hw_disk', 'disk' : 2}, data.hw_disk == 2 ? "selected" : null)}}
+ {{:helper.link('Advanced', 'hdd-o', {'action' : 'hw_disk', 'disk' : 3}, data.hw_disk == 3 ? "selected" : null)}}
+
+
+ Network Card:
+ {{:helper.link('None', 'times', {'action' : 'hw_netcard', 'netcard' : 0}, data.hw_netcard == 0 ? "selected" : null)}}
+ {{:helper.link('Standard', 'signal', {'action' : 'hw_netcard', 'netcard' : 1}, data.hw_netcard == 1 ? "selected" : null)}}
+ {{:helper.link('Advanced', 'signal', {'action' : 'hw_netcard', 'netcard' : 2}, data.hw_netcard == 2 ? "selected" : null)}}
+
+
+ Nano Printer:
+ {{:helper.link('None', 'times', {'action' : 'hw_nanoprint', 'print' : 0}, data.hw_nanoprint == 0 ? "selected" : null)}}
+ {{:helper.link('Standard', 'print', {'action' : 'hw_nanoprint', 'print' : 1}, data.hw_nanoprint == 1 ? "selected" : null)}}
+
+
+ Card Reader:
+ {{:helper.link('None', 'times', {'action' : 'hw_card', 'card' : 0}, data.hw_card == 0 ? "selected" : null)}}
+ {{:helper.link('Standard', 'credit-card', {'action' : 'hw_card', 'card' : 1}, data.hw_card == 1 ? "selected" : null)}}
+
+ {{if data.devtype != 2}}
+
+ Processor Unit:
+ {{:helper.link('Standard', 'tasks', {'action' : 'hw_cpu', 'cpu' : 1}, data.hw_cpu == 1 ? "selected" : null)}}
+ {{:helper.link('Advanced', 'tasks', {'action' : 'hw_cpu', 'cpu' : 2}, data.hw_cpu == 2 ? "selected" : null)}}
+
+
+ Tesla Relay:
+ {{:helper.link('None', 'times', {'action' : 'hw_tesla', 'tesla' : 0}, data.hw_tesla == 0 ? "selected" : null)}}
+ {{:helper.link('Standard', 'plug', {'action' : 'hw_tesla', 'tesla' : 1}, data.hw_tesla == 1 ? "selected" : null)}}
+
+ {{/if}}
+
+
+
+ Confirm Order:
+ {{:helper.link('CONFIRM', 'check', {'action' : 'confirm_order'})}}
+
+
+
+
+
Battery allows your device to operate without external utility power source. Advanced batteries increase battery life.
+
Hard Drive stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.
+
Network Card allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.
+
Processor Unit is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.
+
Tesla Relay is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.
+
Nano Printer is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.
+
Card Reader adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards.
+
+{{else data.state == 2}}
+
Step 3: Payment
+
Your device is now ready for fabrication..
+
Please swipe your identification card to finish purchase.
+
Total price: {{:data.totalprice}}C
+{{else data.state == 3}}
+
Step 4: Thank you for your purchase
+
Should you experience any issues with your new device, contact technical support at support@computerservice.nt
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/computer_main.tmpl b/nano/templates/computer_main.tmpl
new file mode 100644
index 00000000000..9aad3d58609
--- /dev/null
+++ b/nano/templates/computer_main.tmpl
@@ -0,0 +1,9 @@
+
No program loaded. Please select program from list below.
+
+
+ {{for data.programs}}
+ {{:helper.link(value.desc, null, {'action' : 'PC_runprogram', 'name' : value.name})}}
+ {{:helper.link(' ', null, {'action' : 'PC_killprogram', 'name' : value.name}, value.running ? null : 'disabled')}}
+ {{/for}}
+
+
\ No newline at end of file
diff --git a/nano/templates/dna_vault.tmpl b/nano/templates/dna_vault.tmpl
new file mode 100644
index 00000000000..a5d631414d1
--- /dev/null
+++ b/nano/templates/dna_vault.tmpl
@@ -0,0 +1,49 @@
+
+
DNA Vault Database
+
+
+ Human DNA:
+
+
+ {{:helper.displayBar(data.dna, 0, data.dna_max, data.dna >= data.dna_max ? 'good' : 'average')}}
+
+ {{:data.dna}}/{{:data.dna_max}} Samples
+
+
+
+
+
+ Plant Data:
+
+
+ {{:helper.displayBar(data.plants, 0, data.plants_max, data.plants >= data.plants_max ? 'good' : 'average')}}
+
+ {{:data.plants}}/{{:data.plants_max}} Samples
+
+
+
+
+
+ Animal Data:
+
+
+ {{:helper.displayBar(data.animals, 0, data.animals_max, data.animals >= data.animals_max ? 'good' : 'average')}}
+
+ {{:data.animals}}/{{:data.animals_max}} Samples
+
+
+
+{{if data.completed && !data.used}}
+
+
+ Applicable gene therapy treatments:
+
+
+ {{:helper.link(data.choiceA, null, {'gene' : 1, 'choice' : data.choiceA})}}
+ {{:helper.link(data.choiceB, null, {'gene' : 1, 'choice' : data.choiceB})}}
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/eftpos.tmpl b/nano/templates/eftpos.tmpl
new file mode 100644
index 00000000000..663f665d7f9
--- /dev/null
+++ b/nano/templates/eftpos.tmpl
@@ -0,0 +1,55 @@
+
+
+
{{:data.eftpos_name}}
+
This terminal is {{:data.machine_id}}.
Report this code when contacting Nanotrasen IT Support
+{{if data.transaction_locked == 1}}
+
{{:helper.link(data.transaction_paid ? 'Reset' : 'Reset (authentication required)', 'unlock', {'choice' : 'toggle_lock'})}}
+
+
+
Transaction purpose:
+
{{:data.transaction_purpose}}
+
+
+
+
Value:
+
{{:data.transaction_amount}}
+
+
+
+
Linked account:
+
{{:data.linked_account ? data.linked_account : 'None'}}
+
+
+ {{if data.transaction_paid}}
+
This transaction has been processed successfully.
+ {{else}}
+
Swipe your card below the line to finish this transaction.
+
{{:helper.link('------', 'eject', {'choice' : 'scan_card'})}}
+ {{/if}}
+{{else}}
+
{{:helper.link('Lock in new transaction', 'lock', {'choice' : 'toggle_lock'})}}
+
+
+
Transaction purpose:
+
{{:helper.link(data.transaction_purpose, 'info', {'choice' : 'trans_purpose'})}}
+
+
+
+
Value:
+
{{:helper.link(data.transaction_amount, 'usd', {'choice' : 'trans_value'})}}
+
+
+
+
Linked account:
+
{{:helper.link(data.linked_account ? data.linked_account : 'None', data.linked_account ? 'user' : 'user-times', {'choice' : 'link_account'})}}
+
+
+
+
{{:helper.link('Change access code', 'key', {'choice' : 'change_code'})}}
+
{{:helper.link('Change EFTPOS ID', 'pencil', {'choice' : 'change_id'})}}
+
{{:helper.link('Scan card to reset acess code', 'refresh', {'choice' : 'reset'})}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/faxmachine.tmpl b/nano/templates/faxmachine.tmpl
index 76e68027a5c..e52c40eb927 100644
--- a/nano/templates/faxmachine.tmpl
+++ b/nano/templates/faxmachine.tmpl
@@ -59,9 +59,9 @@ Used In File(s): \code\modules\paperwork\faxmachine.dm
{{if data.authenticated}}
- {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "mail-closed", {'send' : 1}, data.cooldown && data.respectcooldown ? 'disabled' : "")}}
+ {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "envelope-o", {'send' : 1}, data.cooldown && data.respectcooldown ? 'disabled' : "")}}
{{else}}
- {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "mail-closed", null, !data.authenticated ? 'disabled' : "")}}
+ {{:helper.link(data.cooldown && data.respectcooldown ? "Realigning" : "Send", data.cooldown && data.respectcooldown ? 'clock-o' : "envelope-o", null, !data.authenticated ? 'disabled' : "")}}
{{/if}}
\ No newline at end of file
diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl
new file mode 100644
index 00000000000..1bdb0cd95c4
--- /dev/null
+++ b/nano/templates/file_manager.tmpl
@@ -0,0 +1,71 @@
+{{if data.error}}
+ An error has occurred and this program can not continue.
+ Additional information: {{:data.error}}
+ Please try again. If the problem persists contact your system administrator for assistance.
+ {{:helper.link('Restart program', null, {'action' : 'PRG_closefile'})}}
+{{else}}
+ {{if data.filename}}
+ Viewing file {{:data.filename}}
+
+ {{:helper.link('CLOSE', null, {'action' : 'PRG_closefile'})}}
+ {{:helper.link('EDIT', null, {'action' : 'PRG_edit'})}}
+ {{:helper.link('PRINT', null, {'action' : 'PRG_printfile'})}}
+
+ {{:data.filedata}}
+ {{else}}
+ Available files (local):
+
+
+
+ File name
+ File type
+ File size (GQ)
+ Operations
+
+ {{for data.files}}
+
+ {{:value.name}}
+ .{{:value.type}}
+ {{:value.size}}GQ
+
+ {{:helper.link('VIEW', 'eye', {'action' : 'PRG_openfile', 'name' : value.name})}}
+ {{:helper.link('DELETE', 'trash', {'action' : 'PRG_deletefile', 'name' : value.name}, value.undeletable ? 'disabled' : null)}}
+ {{:helper.link('RENAME', 'pencil', {'action' : 'PRG_rename', 'name' : value.name}, value.undeletable ? 'disabled' : null)}}
+ {{:helper.link('CLONE', 'files-o', {'action' : 'PRG_clone', 'name' : value.name}, value.undeletable ? 'disabled' : null)}}
+ {{if data.usbconnected}}
+ {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}}
+ {{/if}}
+
+
+ {{/for}}
+
+
+ {{if data.usbconnected}}
+ Available files (portable device):
+
+
+
+ File name
+ File type
+ File size (GQ)
+ Operations
+
+ {{for data.usbfiles}}
+
+ {{:value.name}}
+ .{{:value.type}}
+ {{:value.size}}GQ
+
+ {{:helper.link('DELETE', 'trash', {'action' : 'PRG_usbdeletefile', 'name' : value.name}, value.undeletable ? 'disabled' : null)}}
+ {{if data.usbconnected}}
+ {{:helper.link('IMPORT', 'download', {'action' : 'PRG_copyfromusb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}}
+ {{/if}}
+
+
+ {{/for}}
+
+
+ {{/if}}
+ {{:helper.link('NEW DATA FILE', 'file-text', {'action' : 'PRG_newtextfile'})}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl
index c10ea44ff86..da24f3c0e77 100644
--- a/nano/templates/identification_computer.tmpl
+++ b/nano/templates/identification_computer.tmpl
@@ -8,11 +8,11 @@
{{else}}
{{:helper.link('Access Modification', 'home', {'choice' : 'mode', 'mode_target' : 0}, !data.mode ? 'disabled' : null)}}
- {{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}
+ {{if !data.target_dept}}{{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}{{/if}}
{{:helper.link('Crew Manifest', 'folder-open', {'choice' : 'mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}}
- {{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}
+ {{if !data.target_dept}}{{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}{{/if}}
- {{if data.mode == 1}}
+ {{if data.mode == 1 && !data.target_dept}}
Job Management
@@ -111,6 +111,7 @@
{{if data.has_modify}}
+ {{if !data.target_dept}}
Details
@@ -142,7 +143,16 @@
-
+ {{/if}}
+
+
+ Demotions:
+
+
+ {{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : 'linkDanger')}}
+
+
+ {{if !data.target_dept}}
Terminations:
@@ -156,6 +166,14 @@
Assignment
+ {{else}}
+
+
+
Assignment for {{:data.target_owner}}
+
+
+ {{/if}}
+
{{:data.target_rank}}
@@ -164,6 +182,7 @@
+ {{if !data.target_dept}}
Special
@@ -171,6 +190,8 @@
{{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}}
+ {{/if}}
+ {{if !data.target_dept || data.target_dept == 5}}
Engineering
@@ -179,6 +200,8 @@
{{/for}}
+ {{/if}}
+ {{if !data.target_dept || data.target_dept == 3}}
Medical
@@ -187,6 +210,8 @@
{{/for}}
+ {{/if}}
+ {{if !data.target_dept || data.target_dept == 2}}
Security
@@ -195,6 +220,8 @@
{{/for}}
+ {{/if}}
+ {{if !data.target_dept || data.target_dept == 4}}
Science
@@ -203,6 +230,8 @@
{{/for}}
+ {{/if}}
+ {{if !data.target_dept}}
Support
@@ -211,6 +240,7 @@
{{/for}}
+ {{/if}}
Civilian
@@ -249,27 +279,29 @@
{{else}}
-
-
{{:data.station_name}}
-
-
- {{for data.regions}}
-
-
{{:value.name}}
- {{for value.accesses :accessValue:accessKey}}
-
- {{:helper.link(accessValue.desc, '', {'choice' : 'access', 'access_target' : accessValue.ref, 'allowed' : accessValue.allowed}, null, accessValue.allowed ? 'selected' : null)}}
-
- {{/for}}
-
- {{/for}}
-
+ {{if !data.target_dept}}
+
+
{{:data.station_name}}
+
+
+ {{for data.regions}}
+
+
{{:value.name}}
+ {{for value.accesses :accessValue:accessKey}}
+
+ {{:helper.link(accessValue.desc, '', {'choice' : 'access', 'access_target' : accessValue.ref, 'allowed' : accessValue.allowed}, null, accessValue.allowed ? 'selected' : null)}}
+
+ {{/for}}
+
+ {{/for}}
+
Card Skin
- {{for data.card_skins}}
- {{:helper.link(value.display_name, '', {'choice' : 'skin', 'skin_target' : value.skin}, null,(data.current_skin == value.skin) ? 'selected' : null )}}
- {{/for}}
-
-
+ {{for data.card_skins}}
+ {{:helper.link(value.display_name, '', {'choice' : 'skin', 'skin_target' : value.skin}, null,(data.current_skin == value.skin) ? 'selected' : null )}}
+ {{/for}}
+
+
+ {{/if}}
{{/if}}
{{/if}}
{{/if}}
diff --git a/nano/templates/laptop_configuration.tmpl b/nano/templates/laptop_configuration.tmpl
new file mode 100644
index 00000000000..95dd315b90e
--- /dev/null
+++ b/nano/templates/laptop_configuration.tmpl
@@ -0,0 +1,71 @@
+Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.
+
+
Power Supply
+ {{if data.battery}}
+
+
Battery Status
+
Active
+
+
+
Battery Rating
+
{{:data.battery.max}}
+
+
+
ETA
+
{{:data.eta.hours ? helper.smoothRound(data.eta.hours) + "h " : ""}}{{:data.eta.minutes ? helper.smoothRound(data.eta.minutes) + "m " : ""}}{{:helper.smoothRound(data.eta.seconds)}}s
+
+
+
Battery Charge
+ {{:helper.displayBar(data.battery.charge, 0, data.battery.max, (data.battery.charge > data.battery.max/2) ? 'good' : (data.battery.charge > data.battery.max/4) ? 'average' : 'bad')}}
+
+ {{:helper.smoothRound(data.battery.charge, 1)}}/{{:data.battery.max}}
+
+
+ {{else}}
+
+
Battery Status
+
Not Available
+
+ {{/if}}
+
+
+
Power Usage
+
{{:data.power_usage}}W
+
+
+
+
+
File System
+
+
Used Capacity
+ {{:helper.displayBar(data.disk_used, 0, data.disk_size, (data.disk_used > data.disk_size*0.75) ? 'bad' : (data.disk_used > data.disk_size/2) ? 'average' : 'good')}}
+
+ {{:helper.smoothRound(data.disk_used, 1)}}/{{:data.disk_size}}GQ
+
+
+
+
+
+
Computer Components
+ {{for data.hardware}}
+
{{:value.name}}
+
{{:value.desc}}
+
+
State
+
{{:value.enabled ? "Enabled" : "Disabled"}}
+
+
+
+
Power Usage
+
{{:value.powerusage}}W
+
+
+ {{if !value.critical}}
+
+
Toggle Component
+
{{:helper.link(value.enabled ? 'On' : 'Off', value.enabled ? 'power-off' : 'close', {'action' : 'PC_toggle_component', 'name' : value.name})}}
+
+ {{/if}}
+
+ {{/for}}
+
\ No newline at end of file
diff --git a/nano/templates/med_data.tmpl b/nano/templates/med_data.tmpl
new file mode 100644
index 00000000000..f47e13c6885
--- /dev/null
+++ b/nano/templates/med_data.tmpl
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+ Confirm Identity:
+
+
+ {{:helper.link(data.scan ? data.scan : "----------", 'eject', {'scan' : 1}, null, data.scan ? 'itemContentWide' : 'fixedLeft')}}
+
+
+
+{{if data.authenticated}}
+ {{if data.screen == 1}}
+ Menu
+
+
{{:helper.link('Search Records', 'search', {'search' : 1})}}
+
{{:helper.link('List Records', 'list', {'screen' : 2})}}
+
{{:helper.link('Virus Database', 'database', {'screen' : 5})}}
+
{{:helper.link('Medbot Tracking', 'plus-square', {'screen' : 6})}}
+
{{:helper.link('Record Maintenance', 'wrench', {'screen' : 3})}}
+
{{:helper.link('Logout', 'lock', {'logout' : 1})}}
+
+ {{else data.screen == 2}}
+ Record List
+ {{for data.records}}
+ {{:helper.link(value.id + ': ' + value.name, 'user', {'d_rec' : value.ref})}}
+ {{/for}}
+
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 3}}
+ Records Maintenance
+ {{:helper.link('Backup To Disk', 'download', {'back' : 1}, 'disabled')}}
+ {{:helper.link('Upload From disk', 'upload', {'u_load' : 1}, 'disabled')}}
+ {{:helper.link('Delete All Records', 'trash', {'del_all' : 1})}}
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 4}}
+ Medical Record
+ General Data
+ {{if data.general.empty}}
+ General Record Lost!
+ {{else}}
+
+
+
+ {{for data.general.fields}}
+
+
{{:value.field}}
+
{{:helper.link(value.value, value.edit ? 'pencil' : 'user-times', {'field' : value.edit}, value.edit ? null : 'disabled')}}
+
+ {{/for}}
+
+
+ {{if data.general.has_photos}}
+ {{for data.general.photos}}
+ {{if value.photo}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+
+
+ {{/if}}
+
+ Medical Data
+ {{if data.medical.empty}}
+ Medical Record Lost!
+
+
{{:helper.link('New Record', 'plus', {'new' : 1})}}
+
+ Menu
+ {{else}}
+ {{for data.medical.fields}}
+
+
{{:value.field}}
+
{{:helper.link(value.value, 'pencil', {'field' : value.edit})}}
+
+ {{if value.line_break}}
+
+ {{/if}}
+ {{/for}}
+
+ Comments/Log
+ {{for data.medical.comments}}
+ {{:value}}
+ {{:helper.link('Remove entry', 'trash', {'del_c' : index})}}
+
+ {{/for}}
+
+
+
{{:helper.link('Add Entry', 'plus', {'add_c' : 1})}}
+
+
+ Menu
+ {{:helper.link('Delete Record (Medical Only)', 'trash', {'del_r' : 1})}}
+ {{/if}}
+
+ {{:helper.link('Print Record', 'print', {'print_p' : 1})}}
+ {{:helper.link('Back', 'arrow-left', {'screen' : 2})}}
+ {{else data.screen == 5}}
+ Virus Database
+ {{for data.virus}}
+ {{:helper.link(value.name, 'arrow-right', {'vir' : value.D})}}
+ {{/for}}
+
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 6}}
+ Medical Robot Monitor
+ {{for data.medbots}}
+ {{:value.name}}
+
+
Location:
+
{{:value.x}}, {{:value.y}}
+
+
+
Status:
+
+ {{:value.on ? "Online " : "Offline "}}. {{if value.use_beaker}}Reservoir: [{{:value.total_volume}}/{{:value.maximum_volume}}]{{else}}Using internal synthesizer.{{/if}}
+
+
+
+ {{empty}}
+ None detected!
+ {{/for}}
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{/if}}
+{{else}}
+ Menu
+ {{:helper.link('Login', 'unlock', {'login' : 1})}}
+{{/if}}
+
+{{if data.temp}}
+
+
+ {{if data.temp.notice}}
+
{{:data.temp.text}}
+ {{else}}
+
{{:data.temp.text}}
+ {{/if}}
+
+
+ {{if data.temp.has_buttons}}
+
+
+
+ {{for data.temp.buttons}}
+ {{:helper.link(value.name, value.icon, {'temp' : 1, 'temp_action' : value.href}, value.status)}}
+ {{/for}}
+
+
+
+ {{/if}}
+
+
+
{{:helper.link('Clear screen', 'home', {'temp' : 1})}}
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/newscaster.tmpl b/nano/templates/newscaster.tmpl
new file mode 100644
index 00000000000..af4edb702ad
--- /dev/null
+++ b/nano/templates/newscaster.tmpl
@@ -0,0 +1,301 @@
+
+
+
+
+Welcome to Newscasting Unit #{{:data.unit_no}}.
+Interface & News networks Operational.
+Property of Nanotrasen
+
+{{if data.temp}}
+ {{:data.temp}}
+ {{:helper.link('Return', 'arrow-left', {'setScreen' : data.temp_back_screen})}}
+{{else}}
+ {{if data.screen == 0}}
+
+ {{if data.wanted_issue}}
+
{{:helper.link('Read Wanted issue', 'exclamation-triangle', {'view_wanted' : 1})}}
+ {{/if}}
+
{{:helper.link('Create feed channel', 'plus', {'create_channel' : 1})}}
+
{{:helper.link('View feed channels', 'arrow-right', {'view' : 1})}}
+
{{:helper.link('Submit new feed story', 'share', {'create_feed_story' : 1})}}
+
{{:helper.link('Print newspaper', 'print', {'menu_paper' : 1})}}
+
{{:helper.link(data.silence ? 'Unsilence unit' : 'Silence unit', data.silence ? 'volume-up' : 'volume-off', {'silence_unit' : 1})}}
+
{{:helper.link('Re-scan user', 'refresh', {'refresh' : 1})}}
+ {{if data.securityCaster}}
+
Feed Security functions:
+
{{:helper.link(data.wanted_issue ? 'Manage wanted issue' : 'Publish wanted issue', data.wanted_issue ? 'pencil' : 'share', {'menu_wanted' : 1})}}
+
{{:helper.link('Censor feed stories', 'ban', {'menu_censor_story' : 1})}}
+
{{:helper.link('Mark feed channel with Nanotrasen D-Notice', 'thumb-tack', {'menu_censor_channel' : 1})}}
+
The newscaster recognises you as: {{:data.scanned_user}}
+ {{/if}}
+
+ {{else data.screen == 1}}
+ Station Feed Channels
+
+ {{for data.channels}}
+
+ {{if value.admin}}
+ {{:helper.link('' + value.name + ' ', 'arrow-right', {'show_channel' : value.ref})}}
+ {{else}}
+ {{:helper.link(value.name, 'arrow-right', {'show_channel' : value.ref}, null, value.censored ? 'link linkDanger' : null)}}
+ {{/if}}
+
+ {{empty}}
+
No active channels found...
+ {{/for}}
+
+
+
+
{{:helper.link('Refresh', 'refresh', {'refresh' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 2}}
+ Creating new feed channel...
+
+
+
Channel author:
+
{{:data.scanned_user}}
+
+
+
Accept public feeds:
+
{{:helper.link(data.c_locked ? 'NO' : 'YES', data.c_locked ? 'times' : 'check', {'set_channel_lock' : 1})}}
+
+
+ {{:helper.link('Submit', 'share', {'submit_new_channel' : 1})}}
+ {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 3}}
+ Creating new feed message...
+
+
Receiving channel:
+
+
{{:data.channel_name}}
+ {{:helper.link('Edit', 'pencil', {'set_channel_receiving' : 1})}}
+
+
+
+
Message body:
+
+
{{:data.msg}}
+ {{:helper.link('Edit', 'pencil', {'set_new_message' : 1})}}
+
+
+
+
Attached photo:
+
{{:helper.link(data.photo ? 'Dettach photo' : 'Attach photo', data.photo ? 'times' : 'paperclip', {'set_attachment' : 1})}}
+
+
+ {{:helper.link('Submit', 'share', {'submit_new_message' : 1})}}
+ {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 4}}
+ Network currently serves a total of {{:data.total_num}} feed channels, {{:data.active_num}} of which are active, and a total of {{:data.message_num}} feed stories.
+
+
Liquid paper remaining:
+
{{:data.paper_remaining}} cm3
+
+
+ {{:helper.link('Print paper', 'print', {'print_paper' : 0})}}
+ {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 5}}
+ {{:data.channel_name}} [created by: {{:data.author}} ]
+ Feed view count: {{:data.total_view_count}}
+ {{if data.censored}}
+
+ ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
+ No further feed story additions are allowed while the D-Notice is in effect.
+
+ {{else}}
+ {{for data.messages}}
+
+ - {{:value.body}}
+ {{if value.img}}
+
+ {{/if}}
+
[{{:value.message_type}} by {{:value.author}} ]
+
Message view count: {{:value.view_count}}
+
+ {{empty}}
+ No feed messages found in channel...
+ {{/for}}
+ {{/if}}
+
+
+
{{:helper.link('Refresh', 'refresh', {'refresh' : 0})}}
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 1})}}
+
+ {{else data.screen == 6}}
+ Nanotrasen Feed Censorship Tool
+ NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
+ Keep in mind that users attempting to view a censored feed will instead see the [REDACTED] tag above it.
+
+ Select feed channel to get stories from:
+
+ {{for data.channels}}
+
+ {{if value.admin}}
+ {{:helper.link('' + value.name + ' ', 'arrow-right', {'pick_censor_channel' : value.ref})}}
+ {{else}}
+ {{:helper.link(value.name, 'arrow-right', {'pick_censor_channel' : value.ref}, null, value.censored ? 'link linkDanger' : null)}}
+ {{/if}}
+
+ {{empty}}
+
No feed channels found active...
+ {{/for}}
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 7}}
+ Nanotrasen D-Notice Handler
+ A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station<>s morale, integrity or disciplinary behaviour.
+ A D-Notice will render a channel unable to be updated by anyone, without deleting any feedstories it might contain at the time.
+ You can lift a D-Notice if you have the required access at any time.
+
+
+ {{for data.channels}}
+
+ {{if value.admin}}
+ {{:helper.link('' + value.name + ' ', 'arrow-right', {'pick_d_notice' : value.ref})}}
+ {{else}}
+ {{:helper.link(value.name, 'arrow-right', {'pick_d_notice' : value.ref}, null, value.censored ? 'link linkDanger' : null)}}
+ {{/if}}
+
+ {{empty}}
+
No feed channels found active...
+ {{/for}}
+
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 8}}
+ {{:data.channel_name}} [created by: {{:data.author}} ]
+ {{:helper.link(data.author_redacted ? 'Undo author censorship' : 'Censor channel author', null, {'censor_channel_author' : data.ref})}}
+ {{for data.messages}}
+
+ - {{:value.body}}
+ {{if value.img}}
+
+ {{/if}}
+
[{{:value.message_type}} by {{:value.author}} ]
+
+ {{:helper.link(value.body_redacted ? 'Undo story censorship' : 'Censor story', null, {'censor_channel_story_body' : value.ref})}}
+ {{:helper.link(value.author_redacted ? 'Undo author censorship' : 'Censor message author', null, {'censor_channel_story_author' : value.ref})}}
+
+
+ {{empty}}
+ No feed messages found in channel...
+ {{/for}}
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 6})}}
+
+ {{else data.screen == 9}}
+ {{:data.channel_name}} [created by: {{:data.author}} ]
+ Channel messages listed below. If you deem them dangerous to the station, you can {{:helper.link('Bestow a D-Notice upon the channel', null, {'toggle_d_notice' : data.ref})}}
+ {{if data.censored}}
+
+ ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
+ No further feed story additions are allowed while the D-Notice is in effect.
+
+ {{else}}
+ {{for data.messages}}
+
+ - {{:value.body}}
+ {{if value.img}}
+
+ {{/if}}
+
[{{:value.message_type}} by {{:value.author}} ]
+
+ {{empty}}
+ No feed messages found in channel...
+ {{/for}}
+ {{/if}}
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 7})}}
+
+ {{else data.screen == 10}}
+ Wanted Issue handler:
+ {{if data.wanted_already}}
+ A wanted issue is already in Feed Circulation. You can edit or cancel it below.
+ {{/if}}
+
+
+
Description:
+
+
{{:data.msg}}
+ {{:helper.link('Edit', 'pencil', {'set_wanted_desc' : 1})}}
+
+
+
+
Attached photo:
+
{{:helper.link(data.photo ? 'Dettach photo' : 'Attach photo', data.photo ? 'times' : 'paperclip', {'set_attachment' : 1})}}
+
+
+
Author:
+
{{:data.wanted_already ? data.author : data.scanned_user}}
+
+
+
+ {{:helper.link(data.wanted_already ? 'Edit issue' : 'Submit', data.wanted_already ? 'pencil' : 'share', {'submit_wanted' : data.end_param})}}
+ {{if data.wanted_already}}
+ {{:helper.link('Take down issue', 'times', {'cancel_wanted' : 1})}}
+ {{/if}}
+ {{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 11}}
+ STATIONWIDE WANTED ISSUE
+ [Submitted by: {{:data.author}} ]
+
+
Criminal:
+
{{:data.criminal}}
+
+
+
Description:
+
{{:data.description}}
+
+
+
Photo:
+
+ {{if data.photo}}
+
+ {{else}}
+ None
+ {{/if}}
+
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/ntnet_chat.tmpl b/nano/templates/ntnet_chat.tmpl
new file mode 100644
index 00000000000..c3f2573f8e2
--- /dev/null
+++ b/nano/templates/ntnet_chat.tmpl
@@ -0,0 +1,58 @@
+{{if data.adminmode}}
+ ADMINISTRATIVE MODE
+{{/if}}
+
+{{if data.title}}
+
+
Current channel:
+
{{:data.title}}
+
+
+
Operator access:
+
{{if data.is_operator}}Enabled{{else}}Disabled{{/if}}
+
+
+
Controls:
+
+
+ {{:helper.link('Send message', 'comment-o', {'action' : 'PRG_speak'})}}
+ {{:helper.link('Change nickname', 'pencil', {'action' : 'PRG_changename'})}}
+ {{:helper.link('Toggle administration mode', 'lock', {'action' : 'PRG_toggleadmin'})}}
+ {{:helper.link('Leave channel', 'sign-out', {'action' : 'PRG_leavechannel'})}}
+ {{:helper.link('Save log to local drive', 'download', {'action' : 'PRG_savelog'})}}
+ {{if data.is_operator}}
+ {{:helper.link('Rename channel', 'pencil', {'action' : 'PRG_renamechannel'})}}
+ {{:helper.link('Set password', 'key', {'action' : 'PRG_setpassword'})}}
+ {{:helper.link('Delete channel', 'trash', {'action' : 'PRG_deletechannel'})}}
+ {{/if}}
+
+
+
+ Chat Window
+
+
+
+ {{for data.messages}}
+ {{:value.msg}}
+ {{/for}}
+
+
+
+ Connected Users
+ {{for data.clients}}
+ {{:value.name}}
+ {{/for}}
+{{else}}
+ Controls:
+
+ {{:helper.link('Change nickname', 'pencil', {'action' : 'PRG_changename'})}}
+ {{:helper.link('New Channel', 'plus', {'action' : 'PRG_newchannel'})}}
+ {{:helper.link('Toggle administration mode', 'lock', {'action' : 'PRG_toggleadmin'})}}
+
+ Available channels:
+
+ {{for data.all_channels}}
+ {{:helper.link(value.chan, 'sign-in', {'action' : 'PRG_joinchannel', 'id' : value.id})}}
+ {{/for}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/ntnet_dos.tmpl b/nano/templates/ntnet_dos.tmpl
new file mode 100644
index 00000000000..bff7bb3b9f0
--- /dev/null
+++ b/nano/templates/ntnet_dos.tmpl
@@ -0,0 +1,25 @@
+{{:helper.syndicateMode()}}
+{{if data.error}}
+ ##SYSTEM ERROR: {{:data.error}}{{:helper.link('RESET', null, {'action' : 'PRG_reset'})}}
+{{else data.target}}
+ ##DoS traffic generator active. Tx: {{:data.speed}}GQ/s
+ {{for data.dos_strings}}
+ {{:value.nums}}
+ {{/for}}
+ {{:helper.link('ABORT', 'ban', {'action' : 'PRG_reset'})}}
+{{else}}
+ ##DoS traffic generator ready. Select target device.
+
+
Targeted device ID:
+
{{if data.focus}}{{:data.focus}}{{else}}None{{/if}}
+
+
+ {{:helper.link('EXECUTE', 'play', {'action' : 'PRG_execute'})}}
+
+ Detected devices on network:
+
+ {{for data.relays}}
+ {{:helper.link(value.id, null, {'action' : 'PRG_target_relay', 'targid' : value.id})}}
+ {{/for}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/ntnet_downloader.tmpl b/nano/templates/ntnet_downloader.tmpl
new file mode 100644
index 00000000000..a64ae3452b2
--- /dev/null
+++ b/nano/templates/ntnet_downloader.tmpl
@@ -0,0 +1,102 @@
+Welcome to software download utility. Please select which software you wish to download.
+{{if data.error}}
+ Download Error
+
+
Information
+
{{:data.error}}
+
+
+
Reset Program
+
{{:helper.link('RESET', 'times', {'action' : 'PRG_reseterror'})}}
+
+{{else}}
+ {{if data.downloadname}}
+ Download Running
+
+
Please wait...
+
+
File name
+
{{:data.downloadname}}
+
+
+
File description
+
{{:data.downloaddesc}}
+
+
+
File size
+
{{:helper.smoothRound(data.downloadcompletion, 1)}}/{{:data.downloadsize}}GQ
+
+
+
Transfer Rate
+
{{:data.downloadspeed}} GQ/s
+
+
+
Download progress
+ {{:helper.displayBar(data.downloadcompletion, 0, data.downloadsize, (data.downloadcompletion > data.downloadsize/2) ? 'good' : (data.downloadcompletion > data.downloadsize/4) ? 'average' : 'bad')}}
+
+ {{:helper.smoothRound(data.downloadcompletion, 1)}}/{{:data.downloadsize}}GQ
+
+
+
+ {{else}}
+ Primary software repository
+
+
+
Hard drive
+ {{:helper.displayBar(data.disk_used, 0, data.disk_size, (data.disk_used > data.disk_size/2) ? 'bad' : (data.disk_used > data.disk_size/4) ? 'average' : 'good')}}
+
+ {{:helper.smoothRound(data.disk_used, 1)}}/{{:data.disk_size}}GQ
+
+
+ {{for data.downloadable_programs}}
+
+
+
File name
+
{{:value.filename}} ({{:value.size}} GQ)
+
+
+
Program name
+
{{:value.filedesc}}
+
+
+
Description
+
{{:value.fileinfo}}
+
+
+
Compatibility
+
{{:value.compatibility}}
+
+
+
File controls
+
{{:helper.link('DOWNLOAD', 'download', {'action' : 'PRG_downloadfile', 'filename' : value.filename}, value.status)}}
+
+ {{/for}}
+
+ {{if data.hackedavailable}}
+ UNKNOWN software repository
+
+
Please note that NanoTrasen does not recommend download of software from non-official servers.
+ {{for data.hacked_programs}}
+
+
+
File name
+
{{:value.filename}} ({{:value.size}} GQ)
+
+
+
Program name
+
{{:value.filedesc}}
+
+
+
Description
+
{{:value.fileinfo}}
+
+
+
File controls
+
{{:helper.link('DOWNLOAD', 'download', {'action' : 'PRG_downloadfile', 'filename' : value.filename})}}
+
+ {{/for}}
+
+ {{/if}}
+ {{/if}}
+{{/if}}
+NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559
\ No newline at end of file
diff --git a/nano/templates/ntnet_monitor.tmpl b/nano/templates/ntnet_monitor.tmpl
new file mode 100644
index 00000000000..319baa872f0
--- /dev/null
+++ b/nano/templates/ntnet_monitor.tmpl
@@ -0,0 +1,102 @@
+WIRELESS CONNECTIVITY
+
+
+ Active NTNet Relays:
+
+
+ {{:data.ntnetrelays}}
+
+ {{if data.ntnetrelays}}
+
+
+ System status:
+
+
+ {{:data.ntnetstatus ? "ENABLED" : "DISABLED"}}
+
+
+
+
+ Control:
+
+
+ {{:helper.link('TOGGLE', null, {'action' : 'toggleWireless'})}}
+
+
+
Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!
+ {{else}}
+
Wireless coverage unavailable, no relays are connected.
+ {{/if}}
+
+
+FIREWALL CONFIGURATION
+
+
+
+ PROTOCOL
+ STATUS
+ CONTROL
+
+
+ Software Downloads
+ {{:data.config_softwaredownload ? 'ENABLED' : 'DISABLED'}}
+ {{:helper.link('TOGGLE', null, {'action' : 'toggle_function', 'id' : 1})}}
+
+
+ Peer to Peer Traffic
+ {{:data.config_peertopeer ? 'ENABLED' : 'DISABLED'}}
+ {{:helper.link('TOGGLE', null, {'action' : 'toggle_function', 'id' : 2})}}
+
+
+ Communication Systems
+ {{:data.config_communication ? 'ENABLED' : 'DISABLED'}}
+ {{:helper.link('TOGGLE', null, {'action' : 'toggle_function', 'id' : 3})}}
+
+
+ Remote System Control
+ {{:data.config_systemcontrol ? 'ENABLED' : 'DISABLED'}}
+ {{:helper.link('TOGGLE', null, {'action' : 'toggle_function', 'id' : 4})}}
+
+
+
+
+SECURITY SYSTEMS
+{{if data.idsalarm}}
+
+
+
+
NETWORK INCURSION DETECTED
+ An abnormal activity has been detected in the network. Please verify system logs for more information
+
+
+
+{{/if}}
+
+
Intrusion Detection System:
+
{{:data.idsstatus ? 'ENABLED' : 'DISABLED'}}
+
+
+
Maximal Log Count:
+
{{:data.ntnetmaxlogs}}
+
+
+
Controls:
+
+
+ {{:helper.link('RESET IDS', null, {'action' : 'resetIDS'})}}
+ {{:helper.link('TOGGLE IDS', null, {'action' : 'toggleIDS'})}}
+ {{:helper.link('SET LOG LIMIT', null, {'action' : 'updatemaxlogs'})}}
+ {{:helper.link('PURGE LOGS', null, {'action' : 'purgelogs'})}}
+
+
+
+System Logs
+
+
+
+ {{for data.ntnetlogs}}
+ {{:value.entry}}
+ {{/for}}
+
+
+
\ No newline at end of file
diff --git a/nano/templates/ntnet_relay.tmpl b/nano/templates/ntnet_relay.tmpl
new file mode 100644
index 00000000000..8625f94dd14
--- /dev/null
+++ b/nano/templates/ntnet_relay.tmpl
@@ -0,0 +1,19 @@
+Relay
+{{if data.dos_crashed}}
+ NETWORK BUFFERS OVERLOADED
+ Overload Recovery Mode
+ This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue.
+ ADMINISTRATIVE OVERRIDE
+ CAUTION - Data loss may occur
+ {{:helper.link('Purge buffered traffic', 'signal', {'action' : 'restart'})}}
+{{else}}
+
+
Relay status
+
{{:helper.link(data.enabled ? "ENABLED" : "DISABLED", 'power-off', {'action' : 'toggle'})}}
+
+
+
+
Network buffer status
+
{{:data.dos_overload}}/{{:data.dos_capacity}} GQ
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/ntnet_transfer.tmpl b/nano/templates/ntnet_transfer.tmpl
new file mode 100644
index 00000000000..660838b94dc
--- /dev/null
+++ b/nano/templates/ntnet_transfer.tmpl
@@ -0,0 +1,77 @@
+{{if data.error}}
+
+
An error has occurred during operation...
+ Additional information: {{:data.error}}
+ {{:helper.link('Clear', null, {'action' : 'PRG_reset'})}}
+
+{{else data.downloading}}
+ Download in progress...
+
+
Downloaded file:
+
{{:data.download_name}}
+
+
+
Download progress:
+
{{:helper.smoothRound(data.download_progress)}}/{{:data.download_size}}GQ
+
+
+
Transfer speed:
+
{{:data.download_netspeed}}GQ/s
+
+
+
Controls:
+
{{:helper.link('Abort download', 'arrow-left', {'action' : 'PRG_reset'})}}
+
+{{else data.uploading}}
+ Server enabled
+
+
Connected clients:
+
{{:data.upload_clients}}
+
+
+
Provided file:
+
{{:data.upload_filename}}
+
+
+
Server password:
+
{{if data.upload_haspassword}}ENABLED{{else}}DISABLED{{/if}}
+
+
+
Commands:
+
+ {{:helper.link('Set password', 'key', {'action' : 'PRG_setpassword'})}}
+ {{:helper.link('Exit server', 'arrow-left', {'action' : 'PRG_reset'})}}
+
+
+{{else data.upload_filelist}}
+ File transfer server ready. Select file to upload:
+
+ File name File size Controls
+ {{for data.upload_filelist}}
+ {{:value.filename}}
+ {{:value.size}}GQ
+ {{:helper.link('Select', 'upload', {'action' : 'PRG_uploadfile', 'id' : value.uid})}}
+ {{/for}}
+
+
+ {{:helper.link('Set password', 'key', {'action' : 'PRG_setpassword'})}}
+ {{:helper.link('Return', 'arrow-left', {'action' : 'PRG_reset'})}}
+{{else}}
+ Available files:
+ Server UID File Name File Size Password Protection Operations
+ {{for data.servers}}
+ {{:value.uid}}
+ {{:value.filename}}
+ {{:value.size}}GQ
+ {{if value.haspassword}}
+ Enabled
+ {{else}}
+ Disabled
+ {{/if}}
+
+ {{:helper.link('Download', 'download', {'action' : 'PRG_downloadfile', 'id' : value.uid})}}
+ {{/for}}
+
+
+ {{:helper.link('Send file', 'upload', {'action' : 'PRG_uploadmenu'})}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/personal_crafting.tmpl b/nano/templates/personal_crafting.tmpl
new file mode 100644
index 00000000000..c209a8ad4bf
--- /dev/null
+++ b/nano/templates/personal_crafting.tmpl
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+ {{:helper.link(data.prev_cat, 'arrow-left', {'backwardCat': 1})}}
+ {{:helper.link(data.next_cat, 'arrow-right', {'forwardCat': 1})}}
+ {{if data.display_craftable_only}}
+ {{:helper.link('Showing Craftable Recipes', 'lock', {'toggle_recipes': 1})}}
+ {{else}}
+ {{:helper.link('Showing All Recipes', 'unlock', {'toggle_recipes': 1})}}
+ {{/if}}
+ {{:helper.link('Compact', data.display_compact ? 'check-square-o' : 'square-o', {'toggle_compact': 1})}}
+
+ {{if data.display_compact}}
+
+
+
+ {{for data.can_craft}}
+
+ {{:value.name}}:
+
+ {{:helper.link('Craft', 'gears', {'make': value.ref})}}
+
+
+ {{/for}}
+ {{if !data.display_craftable_only}}
+ {{for data.cant_craft}}
+
+ {{:value.name}}:
+
+ {{:helper.link('Craft', 'gears', {'make': value.ref}, 'disabled')}}
+
+
+ {{/for}}
+ {{/if}}
+
+
+
+ {{else}}
+ {{for data.can_craft}}
+
+
+
+ {{if value.req_text}}
+
+
Requirements:
+
{{:value.req_text}}
+
+ {{/if}}
+ {{if value.catalyst_text}}
+
+
Catalysts:
+
{{:value.catalyst_text}}
+
+ {{/if}}
+ {{if value.tool_text}}
+
+
Tools:
+
{{:value.tool_text}}
+
+ {{/if}}
+
+ {{:helper.link('Craft', 'gears', {'make': value.ref})}}
+
+
+
+ {{/for}}
+ {{if !data.display_craftable_only}}
+ {{for data.cant_craft}}
+
+
+
+ {{if value.req_text}}
+
+
Requirements:
+
{{:value.req_text}}
+
+ {{/if}}
+ {{if value.catalyst_text}}
+
+
Catalysts:
+
{{:value.catalyst_text}}
+
+ {{/if}}
+ {{if value.tool_text}}
+
+
Tools:
+
{{:value.tool_text}}
+
+ {{/if}}
+
+
+ {{/for}}
+ {{/if}}
+ {{/if}}
+
+
+
+{{if data.busy}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/radio_basic.tmpl b/nano/templates/radio_basic.tmpl
index 73d37df8a70..c6a59d59691 100644
--- a/nano/templates/radio_basic.tmpl
+++ b/nano/templates/radio_basic.tmpl
@@ -4,18 +4,18 @@ Used In File(s): /code/game/objects/item/devices/radio/radio.dm
-->
diff --git a/nano/templates/rcd.tmpl b/nano/templates/rcd.tmpl
index 073171a4ba7..e72b6253a17 100644
--- a/nano/templates/rcd.tmpl
+++ b/nano/templates/rcd.tmpl
@@ -12,6 +12,21 @@
{{else data.menu == 2}}
{{:helper.link('Back', 'reply', {'menu': 1})}}
+
+
+
+
+ {{if !data.locked}}{{:helper.link("Rename", '', {'choice' : 'airlock_name'})}}{{else}}LOCKED{{/if}}
+
+
+ Airlock Name:
+
+
+ {{:data.door_name}}
+
+
+
+
Type
{{for data.allowed_door_types}}
diff --git a/nano/templates/request_console.tmpl b/nano/templates/request_console.tmpl
index 1005f583ec8..aaa8726f50a 100644
--- a/nano/templates/request_console.tmpl
+++ b/nano/templates/request_console.tmpl
@@ -3,8 +3,8 @@ Title: Request Console
Used In File(s): \code\game\machinery\requests_console.dm
#define RCS_MAINMENU 0 // Main men
-#define RCS_RQASSIST 1 // Request supplies
-#define RCS_RQSUPPLY 2 // Request assistance
+#define RCS_RQSUPPLY 1 // Request supplies
+#define RCS_RQASSIST 2 // Request assistance
#define RCS_SENDINFO 3 // Relay information
#define RCS_SENTPASS 4 // Message sent successfully
#define RCS_SENTFAIL 5 // Message sent unsuccessfully
@@ -102,6 +102,33 @@ Used In File(s): \code\game\machinery\requests_console.dm
{{:helper.link('Announce', 'signal', { 'sendAnnouncement' : 1 }, (data.announceAuth && data.message) ? null : 'disabled' )}}
{{:helper.link('Back', 'arrow-left', { 'setScreen' : 0 })}}
+{{else data.screen == 9}}
+
Print a Shipping Label.
+
+
Destination: {{:data.shipDest}}
+
Validated by: {{:data.msgVerified}}
+
{{:helper.link('Print Label', null, { 'printLabel' : 1 })}}
+
+
+ {{for data.ship_dept}}
+
+ {{:value}} -
+ {{:helper.link('Select', null, { 'shipSelect' : value })}}
+
+ {{empty}}
+ There are no available shipping destinations.
+ {{/for}}
+
+
{{:helper.link('Back', 'arrow-left', { 'setScreen' : 0 })}}
+{{else data.screen == 10}}
+
+ {{for data.shipping_log}}
+
{{:value}}
+ {{empty}}
+
No shipping labels have been printed.
+ {{/for}}
+
+
{{:helper.link('Back', 'arrow-left', { 'setScreen' : 0 })}}
{{else}}
{{if data.newmessagepriority == 1}}
There are new messages
@@ -114,9 +141,12 @@ Used In File(s): \code\game\machinery\requests_console.dm
{{:helper.link('Request Supplies', 'gear', { 'setScreen' : 2 })}}
{{:helper.link('Relay Anonymous Information', 'gear', { 'setScreen' : 3})}}
+
{{:helper.link('Print Shipping Label', 'gear', { 'setScreen' : 9})}}
+
{{:helper.link('View Shipping Logs', 'gear', { 'setScreen' : 10})}}
+
{{if data.announcementConsole}}
{{:helper.link('Send Station-wide Announcement', 'signal', { 'setScreen' : 8})}}
{{/if}}
-
{{:helper.link(data.silent ? 'Speaker OFF' : 'Speaker ON', data.silent ? 'volume-off' : 'volume-on', { 'toggleSilent' : 1})}}
+
{{:helper.link(data.silent ? 'Speaker OFF' : 'Speaker ON', data.silent ? 'volume-off' : 'volume-up', { 'toggleSilent' : 1})}}
{{/if}}
\ No newline at end of file
diff --git a/nano/templates/revelation.tmpl b/nano/templates/revelation.tmpl
new file mode 100644
index 00000000000..5412c440caa
--- /dev/null
+++ b/nano/templates/revelation.tmpl
@@ -0,0 +1,23 @@
+{{:helper.syndicateMode()}}
+
+
+ Payload status:
+
+
+ {{if data.armed}}
+ ARMED
+ {{else}}
+ DISARMED
+ {{/if}}
+
+
+ Controls:
+
+
+
+ {{:helper.link('OBFUSCATE PROGRAM NAME', 'eye-slash', {'action' : 'PRG_obfuscate'})}}
+ {{:helper.link(data.armed ? 'DISARM' : 'ARM', data.armed ? 'crosshairs' : 'info', {'action' : 'PRG_arm'})}}
+ {{:helper.link('ACTIVATE', 'exclamation-triangle', {'action' : 'PRG_activate'}, data.armed ? null : 'disabled', data.armed ? 'redButton' : null)}}
+
+
+
\ No newline at end of file
diff --git a/nano/templates/sat_control.tmpl b/nano/templates/sat_control.tmpl
new file mode 100644
index 00000000000..a3b5ad40cb1
--- /dev/null
+++ b/nano/templates/sat_control.tmpl
@@ -0,0 +1,32 @@
+
+{{if data.notice}}
+
{{:data.notice}}
+{{/if}}
+
Satellite Network Control
+{{for data.satellites}}
+
+
+ #{{:value.id}} - {{:value.mode}}
+
+
+
+ {{:helper.link(value.active ? 'Deactivate' : 'Activate', null, {'toggle' : 1, 'id' : value.id})}}
+
+
+{{/for}}
+{{if data.meteor_shield}}
+
+
+ Station Shield Coverage:
+
+
+ {{:helper.displayBar(data.meteor_shield_coverage, 0, data.meteor_shield_coverage_max, data.meteor_shield_coverage_percentage >= 100 ? 'good' : 'average')}}
+
+ {{:data.meteor_shield_coverage_percentage}}%
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/secure_data.tmpl b/nano/templates/secure_data.tmpl
new file mode 100644
index 00000000000..d4d129e808b
--- /dev/null
+++ b/nano/templates/secure_data.tmpl
@@ -0,0 +1,232 @@
+
+
+
+
+{{if !data.temp && data.screen == 1}}
+
+{{/if}}
+
+
+
+
+ Confirm Identity:
+
+
+ {{:helper.link(data.scan ? data.scan : "----------", 'eject', {'scan' : 1}, null, data.scan ? 'itemContentWide' : 'fixedLeft')}}
+
+
+
+{{if data.authenticated}}
+ {{if data.screen == 1}}
+
+
{{:helper.link('New Record', 'plus', {'new_g' : 1})}}
+
+
Record List
+
+
+
+
+
+
+ {{:helper.link('Name', null, {'sort' : 'name'}, null, 'infoButton')}}
+ {{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}}
+ {{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}}
+ {{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}}
+ {{:helper.link('Criminal Status', null, {'sort' : 'name'}, null, 'infoButton')}}
+
+
+
+ {{for data.records}}
+
+ {{:helper.link(value.name, 'user', {'d_rec' : value.ref}, null, 'infoButton')}}
+ {{:value.id}}
+ {{:value.rank}}
+ {{:value.fingerprint}}
+ {{:value.crimstat}}
+
+ {{/for}}
+
+
+
+
+
Menu
+
{{:helper.link('Record Maintenance', 'wrench', {'screen' : 2})}}
+
{{:helper.link('Print Cell Log', 'print', {'printlogs' : 1})}}
+
{{:helper.link('Logout', 'lock', {'logout' : 1})}}
+ {{else data.screen == 2}}
+
Records Maintenance
+
{{:helper.link('Backup To Disk', 'download', {'back' : 1}, 'disabled')}}
+
{{:helper.link('Upload From Disk', 'upload', {'u_load' : 1}, 'disabled')}}
+
{{:helper.link('Delete All Records', 'trash', {'del_all' : 1})}}
+
{{:helper.link('Delete All Cell Logs', 'trash', {'del_alllogs' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 3}}
+
Security Record
+
General Data
+ {{if data.general.empty}}
+
General Record Lost!
+ {{else}}
+
+
+
+ {{for data.general.fields}}
+
+
+ {{:value.field}}
+
+
+ {{:helper.link(value.value, value.edit ? 'pencil' : 'user-times', {'field' : value.edit}, value.edit ? null : 'disabled')}}
+
+
+ {{/for}}
+
+
+ {{if data.general.has_photos}}
+
+
{{:helper.link('Print photo', 'camera', {'print_p' : 1})}}
+
+ {{for data.general.photos}}
+ {{if value.photo}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+
+
+ {{/if}}
+
+
Security Data
+ {{if data.security.empty}}
+
Security Record Lost!
+
+
{{:helper.link('New Record', 'plus', {'new_s' : 1})}}
+
+
Menu
+ {{else}}
+ {{for data.security.fields}}
+
+
+ {{:value.field}}
+
+
+ {{:helper.link(value.value, 'pencil', {'field' : value.edit})}}
+
+
+ {{if value.line_break}}
+
+ {{/if}}
+ {{/for}}
+
+
Comments/Log
+ {{for data.security.comments}}
+
{{:value}}
+
{{:helper.link('Remove entry', 'trash', {'del_c' : index})}}
+
+ {{/for}}
+
+
+
{{:helper.link('Add Entry', 'plus', {'add_c' : 1})}}
+
+
+
Menu
+
{{:helper.link('Delete Record (Security Only)', 'trash', {'del_r' : 1})}}
+ {{/if}}
+
+
{{:helper.link('Delete Record (All)', 'trash', {'del_rg' : 1})}}
+
{{:helper.link('Print Record', 'print', {'print_r' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{/if}}
+{{else}}
+
Menu
+ {{:helper.link('Login', 'unlock', {'login' : 1})}}
+{{/if}}
+
+{{if data.temp}}
+
+
+ {{if data.temp.notice}}
+
{{:data.temp.text}}
+ {{else}}
+
{{:data.temp.text}}
+ {{/if}}
+
+ {{if data.temp.has_buttons}}
+
+
+
+ {{for data.temp.buttons}}
+ {{:helper.link(value.name, value.icon, {'temp' : 1, 'temp_action' : value.href}, value.status)}}
+ {{/for}}
+
+
+
+ {{/if}}
+
+
+
{{:helper.link('Clear screen', 'home', {'temp' : 1})}}
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/shuttle_console.tmpl b/nano/templates/shuttle_console.tmpl
new file mode 100644
index 00000000000..d16f39a8b20
--- /dev/null
+++ b/nano/templates/shuttle_console.tmpl
@@ -0,0 +1,37 @@
+
+
+
+
Location:
+
{{:data.status ? data.status : '*Missing* '}}
+
+{{if data.shuttle}}
+ {{if data.docking_ports_len}}
+
+
+ {{for data.docking_ports}}
+
{{:helper.link('Send to ' + value.name, 'sign-out', {'move' : value.id})}}
+ {{/for}}
+
+ {{else}}
+
+
Status:
+
Shuttle locked
+ {{if data.admin_controlled}}
+ , authorized personnel only
+
+
+
{{:helper.link('Request authorization', 'share-square-o', {'request' : 1})}}
+ {{else}}
+
+
+
+ {{/if}}
+ {{/if}}
+
+ {{if data.docking_request}}
+ {{:helper.link('Request docking at NSS Cyberiad', 'share-square-o', {'request' : 1})}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/skills_data.tmpl b/nano/templates/skills_data.tmpl
new file mode 100644
index 00000000000..6f8fb1d6a0d
--- /dev/null
+++ b/nano/templates/skills_data.tmpl
@@ -0,0 +1,199 @@
+
+
+
+
+{{if !data.temp && data.screen == 1}}
+
+{{/if}}
+
+
+
+
+ Confirm Identity:
+
+
+ {{:helper.link(data.scan ? data.scan : "----------", 'eject', {'scan' : 1}, null, data.scan ? 'itemContentWide' : 'fixedLeft')}}
+
+
+
+{{if data.authenticated}}
+ {{if data.screen == 1}}
+
+
{{:helper.link('New Record', 'plus', {'new_g' : 1})}}
+
+ Record List
+
+
+
+
+
+
+ {{:helper.link('Name', null, {'sort' : 'name'}, null, 'infoButton')}}
+ {{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}}
+ {{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}}
+ {{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}}
+
+
+
+ {{for data.records}}
+
+ {{:helper.link(value.name, 'user', {'d_rec' : value.ref}, null, 'infoButton')}}
+ {{:value.id}}
+ {{:value.rank}}
+ {{:value.fingerprint}}
+
+ {{/for}}
+
+
+
+
+ Menu
+ {{:helper.link('Record Maintenance', 'wrench', {'screen' : 2})}}
+ {{:helper.link('Logout', 'lock', {'logout' : 1})}}
+ {{else data.screen == 2}}
+ Records Maintenance
+ {{:helper.link('Backup To Disk', 'download', {'back' : 1}, 'disabled')}}
+ {{:helper.link('Upload From disk', 'upload', {'u_load' : 1}, 'disabled')}}
+ {{:helper.link('Delete All Records', 'trash', {'del_all' : 1})}}
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 3}}
+ Employment Record
+ General Data
+ {{if data.general.empty}}
+ General Record Lost!
+ {{else}}
+
+
+
+ {{for data.general.fields}}
+
+
+ {{:value.field}}
+
+
+ {{:helper.link(value.value, value.name ? 'pencil' : 'user-times', {'field' : value.name}, value.name ? null : 'disabled')}}
+
+
+ {{/for}}
+
+
+ {{if data.general.has_photos}}
+ {{for data.general.photos}}
+ {{if value.photo}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+
+
+
+ Employment Data
+
+
+ Employment/skills summary:
+
+
+ {{:data.general.notes ? data.general.notes : 'None'}}
+
+
+ {{/if}}
+ Menu
+ {{:helper.link('Delete Record (All)', 'trash', {'del_rg' : 1})}}
+ {{:helper.link('Print Record', 'print', {'print_r' : 1})}}
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{/if}}
+{{else}}
+ Menu
+ {{:helper.link('Login', 'unlock', {'login' : 1})}}
+{{/if}}
+
+{{if data.temp}}
+
+
+ {{if data.temp.notice}}
+
{{:data.temp.text}}
+ {{else}}
+
{{:data.temp.text}}
+ {{/if}}
+
+
+ {{if data.temp.has_buttons}}
+
+
+
+ {{for data.temp.buttons}}
+ {{:helper.link(value.name, value.icon, {'temp' : 1, 'temp_action' : value.val}, value.status)}}
+ {{/for}}
+
+
+
+ {{/if}}
+
+
+
{{:helper.link('Clear screen', 'home', {'temp' : 1})}}
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/smartfridge.tmpl b/nano/templates/smartfridge.tmpl
index 873487454dc..3c59892486d 100644
--- a/nano/templates/smartfridge.tmpl
+++ b/nano/templates/smartfridge.tmpl
@@ -10,6 +10,16 @@
{{/if}}
+
+ {{if data.can_dry}}
+
+ Drying:
+
+
+ {{:helper.link('On', 'power-off', {'dryingOn' : 1}, data.drying ? 'selected' : null)}}{{:helper.link('Off', 'close', {'dryingOff' : 1}, data.drying ? null : 'selected')}}
+
+ {{/if}}
+
{{if data.contents}}
{{for data.contents}}
diff --git a/nano/templates/tank_dispenser.tmpl b/nano/templates/tank_dispenser.tmpl
new file mode 100644
index 00000000000..a634a2dde8e
--- /dev/null
+++ b/nano/templates/tank_dispenser.tmpl
@@ -0,0 +1,7 @@
+
+
Dispense:
+
+ {{:helper.link('Plasma (' + helper.smoothRound(data.p_tanks) + ')', data.p_tanks ? 'square' : 'square-o', {'plasma' : 1}, data.p_tanks ? null : 'disabled')}}
+ {{:helper.link('Oxygen (' + helper.smoothRound(data.o_tanks) + ')', data.o_tanks ? 'square' : 'square-o', {'oxygen' : 1}, data.o_tanks ? null : 'disabled')}}
+
+
\ No newline at end of file
diff --git a/nano/templates/turret_control.tmpl b/nano/templates/turret_control.tmpl
index 25e3c2a592c..50f733ea80f 100644
--- a/nano/templates/turret_control.tmpl
+++ b/nano/templates/turret_control.tmpl
@@ -23,7 +23,7 @@
{{/if}}
- {{if data.is_lethal}}
+ {{if data.lethal_control}}
Lethal Mode:
diff --git a/nano/templates/wires.tmpl b/nano/templates/wires.tmpl
new file mode 100644
index 00000000000..a661fa3e851
--- /dev/null
+++ b/nano/templates/wires.tmpl
@@ -0,0 +1,24 @@
+
+
+ {{for data.wires}}
+
+ {{:value.colour}} {{if value.index}}({{:value.index}}){{/if}}
+
+ {{:helper.link(value.cut ? 'Mend' : 'Cut', null, {'action' : 'cut', 'wire' : value.colour})}}
+ {{:helper.link('Pulse', null, {'action' : 'pulse', 'wire' : value.colour})}}
+ {{:helper.link(value.attached ? 'Detach' : 'Attach', null, {'action' : 'attach', 'wire' : value.colour})}}
+
+
+ {{/for}}
+
+
+{{if data.status_len}}
+
+
+
+ {{for data.status}}
+
{{:value}}
+ {{/for}}
+
+
+{{/if}}
diff --git a/paradise.dme b/paradise.dme
index 8d0b4576bf8..ef365903003 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -19,8 +19,10 @@
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\bots.dm"
+#include "code\__DEFINES\callbacks.dm"
#include "code\__DEFINES\clothing.dm"
#include "code\__DEFINES\combat.dm"
+#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\crafting.dm"
#include "code\__DEFINES\error_handler.dm"
#include "code\__DEFINES\flags.dm"
@@ -29,8 +31,10 @@
#include "code\__DEFINES\genetics.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\hydroponics.dm"
+#include "code\__DEFINES\inventory.dm"
#include "code\__DEFINES\is_helpers.dm"
#include "code\__DEFINES\language.dm"
+#include "code\__DEFINES\layers.dm"
#include "code\__DEFINES\lighting.dm"
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\math.dm"
@@ -40,6 +44,7 @@
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\process_scheduler.dm"
#include "code\__DEFINES\qdel.dm"
+#include "code\__DEFINES\reagents.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rolebans.dm"
#include "code\__DEFINES\sight.dm"
@@ -62,6 +67,7 @@
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\qdel.dm"
#include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\time.dm"
@@ -87,7 +93,6 @@
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
#include "code\_globalvars\lists\reagents.dm"
-#include "code\_onclick\_defines.dm"
#include "code\_onclick\adjacent.dm"
#include "code\_onclick\ai.dm"
#include "code\_onclick\click.dm"
@@ -184,7 +189,9 @@
#include "code\controllers\Processes\obj.dm"
#include "code\controllers\Processes\pipenet.dm"
#include "code\controllers\Processes\shuttles.dm"
+#include "code\controllers\Processes\spacedrift.dm"
#include "code\controllers\Processes\sun.dm"
+#include "code\controllers\Processes\throwing.dm"
#include "code\controllers\Processes\ticker.dm"
#include "code\controllers\Processes\timer.dm"
#include "code\controllers\Processes\weather.dm"
@@ -195,6 +202,7 @@
#include "code\datums\ai_laws.dm"
#include "code\datums\beam.dm"
#include "code\datums\browser.dm"
+#include "code\datums\callback.dm"
#include "code\datums\cargoprofile.dm"
#include "code\datums\computerfiles.dm"
#include "code\datums\datacore.dm"
@@ -215,6 +223,7 @@
#include "code\datums\supplypacks.dm"
#include "code\datums\uplink_item.dm"
#include "code\datums\vision_override.dm"
+#include "code\datums\vr.dm"
#include "code\datums\cache\air_alarm.dm"
#include "code\datums\cache\apc.dm"
#include "code\datums\cache\cache.dm"
@@ -280,6 +289,8 @@
#include "code\datums\helper_datums\map_template.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
+#include "code\datums\outfits\outfit.dm"
+#include "code\datums\outfits\outfit_admin.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\bloodcrawl.dm"
@@ -304,11 +315,14 @@
#include "code\datums\spells\mind_transfer.dm"
#include "code\datums\spells\projectile.dm"
#include "code\datums\spells\rathens.dm"
+#include "code\datums\spells\rod_form.dm"
+#include "code\datums\spells\shapeshift.dm"
#include "code\datums\spells\summonitem.dm"
#include "code\datums\spells\touch_attacks.dm"
#include "code\datums\spells\trigger.dm"
#include "code\datums\spells\turf_teleport.dm"
#include "code\datums\spells\wizard.dm"
+#include "code\datums\vr\level.dm"
#include "code\datums\weather\weather.dm"
#include "code\datums\weather\weather_types.dm"
#include "code\datums\wires\airlock.dm"
@@ -324,6 +338,7 @@
#include "code\datums\wires\robot.dm"
#include "code\datums\wires\smartfridge.dm"
#include "code\datums\wires\syndicatebomb.dm"
+#include "code\datums\wires\tesla_coil.dm"
#include "code\datums\wires\vending.dm"
#include "code\datums\wires\wires.dm"
#include "code\defines\vox_sounds.dm"
@@ -431,7 +446,9 @@
#include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm"
#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm"
#include "code\game\gamemodes\miniantags\borer\borer.dm"
+#include "code\game\gamemodes\miniantags\borer\borer_chemicals.dm"
#include "code\game\gamemodes\miniantags\borer\borer_event.dm"
+#include "code\game\gamemodes\miniantags\borer\borer_html.dm"
#include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm"
#include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
#include "code\game\gamemodes\miniantags\guardian\guardian.dm"
@@ -490,7 +507,6 @@
#include "code\game\machinery\atmo_control.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\Beacon.dm"
-#include "code\game\machinery\biogenerator.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\chiller.dm"
@@ -525,12 +541,12 @@
#include "code\game\machinery\portable_tag_turret.dm"
#include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\programmable_unloader.dm"
+#include "code\game\machinery\quantum_pad.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
#include "code\game\machinery\recycler.dm"
#include "code\game\machinery\requests_console.dm"
#include "code\game\machinery\robot_fabricator.dm"
-#include "code\game\machinery\seed_extractor.dm"
#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\Sleeper.dm"
#include "code\game\machinery\slotmachine.dm"
@@ -544,7 +560,6 @@
#include "code\game\machinery\transformer.dm"
#include "code\game\machinery\turntable.dm"
#include "code\game\machinery\turret_control.dm"
-#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\wishgranter.dm"
@@ -593,6 +608,7 @@
#include "code\game\machinery\computer\store.dm"
#include "code\game\machinery\computer\syndicate_specops_shuttle.dm"
#include "code\game\machinery\computer\telecrystalconsoles.dm"
+#include "code\game\machinery\computer\vr_control.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_control.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
@@ -636,7 +652,7 @@
#include "code\game\mecha\combat\honker.dm"
#include "code\game\mecha\combat\marauder.dm"
#include "code\game\mecha\combat\phazon.dm"
-#include "code\game\mecha\combat\recitence.dm"
+#include "code\game\mecha\combat\reticence.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
#include "code\game\mecha\equipment\tools\medical_tools.dm"
#include "code\game\mecha\equipment\tools\mining_tools.dm"
@@ -657,7 +673,6 @@
#include "code\game\objects\effects\aliens.dm"
#include "code\game\objects\effects\anomalies.dm"
#include "code\game\objects\effects\bump_teleporter.dm"
-#include "code\game\objects\effects\datacore-effect.dm"
#include "code\game\objects\effects\effect_system.dm"
#include "code\game\objects\effects\explosion_particles.dm"
#include "code\game\objects\effects\forcefields.dm"
@@ -686,6 +701,8 @@
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
+#include "code\game\objects\effects\spawners\random_barrier.dm"
+#include "code\game\objects\effects\spawners\random_spawners.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\windowspawner.dm"
#include "code\game\objects\items\ashtray.dm"
@@ -710,7 +727,6 @@
#include "code\game\objects\items\devices\autopsy.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
-#include "code\game\objects\items\devices\debugger.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\floor_painter.dm"
@@ -718,7 +734,6 @@
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\megaphone.dm"
-#include "code\game\objects\items\devices\modkit.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
@@ -802,6 +817,7 @@
#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\powerfist.dm"
#include "code\game\objects\items\weapons\RCD.dm"
+#include "code\game\objects\items\weapons\RCL.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scissors.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
@@ -839,6 +855,7 @@
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
#include "code\game\objects\items\weapons\implants\implant.dm"
+#include "code\game\objects\items\weapons\implants\implant_abductor.dm"
#include "code\game\objects\items\weapons\implants\implant_chem.dm"
#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm"
#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
@@ -910,7 +927,7 @@
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
#include "code\game\objects\structures\spirit_board.dm"
-#include "code\game\objects\structures\statue.dm"
+#include "code\game\objects\structures\statues.dm"
#include "code\game\objects\structures\tables_racks.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
@@ -1088,7 +1105,6 @@
#include "code\modules\atmos_automation\implementation\scrubbers.dm"
#include "code\modules\atmos_automation\implementation\sensors.dm"
#include "code\modules\atmos_automation\implementation\vent_pump.dm"
-#include "code\modules\awaymissions\bluespaceartillery.dm"
#include "code\modules\awaymissions\corpse.dm"
#include "code\modules\awaymissions\exile.dm"
#include "code\modules\awaymissions\gateway.dm"
@@ -1114,6 +1130,7 @@
#include "code\modules\awaymissions\mission_code\spacehotel.dm"
#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm"
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
+#include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm"
#include "code\modules\awaymissions\mission_code\wildwest.dm"
#include "code\modules\client\asset_cache.dm"
#include "code\modules\client\client defines.dm"
@@ -1130,6 +1147,7 @@
#include "code\modules\client\preference\loadout\loadout_donor.dm"
#include "code\modules\client\preference\loadout\loadout_general.dm"
#include "code\modules\client\preference\loadout\loadout_hat.dm"
+#include "code\modules\client\preference\loadout\loadout_racial.dm"
#include "code\modules\client\preference\loadout\loadout_shoes.dm"
#include "code\modules\client\preference\loadout\loadout_suit.dm"
#include "code\modules\client\preference\loadout\loadout_uniform.dm"
@@ -1162,12 +1180,13 @@
#include "code\modules\clothing\spacesuits\breaches.dm"
#include "code\modules\clothing\spacesuits\chronosuit.dm"
#include "code\modules\clothing\spacesuits\ert.dm"
+#include "code\modules\clothing\spacesuits\hardsuit.dm"
#include "code\modules\clothing\spacesuits\miscellaneous.dm"
#include "code\modules\clothing\spacesuits\plasmamen.dm"
-#include "code\modules\clothing\spacesuits\rig.dm"
#include "code\modules\clothing\spacesuits\syndi.dm"
#include "code\modules\clothing\spacesuits\void.dm"
#include "code\modules\clothing\spacesuits\rig\rig.dm"
+#include "code\modules\clothing\spacesuits\rig\rig_armormod.dm"
#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm"
#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm"
#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm"
@@ -1208,36 +1227,6 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
-#include "code\modules\computer3\bios.dm"
-#include "code\modules\computer3\buildandrepair.dm"
-#include "code\modules\computer3\component.dm"
-#include "code\modules\computer3\computer.dm"
-#include "code\modules\computer3\computer3_notes.dm"
-#include "code\modules\computer3\file.dm"
-#include "code\modules\computer3\laptop.dm"
-#include "code\modules\computer3\lapvend.dm"
-#include "code\modules\computer3\networking.dm"
-#include "code\modules\computer3\NTOS.dm"
-#include "code\modules\computer3\program.dm"
-#include "code\modules\computer3\program_disks.dm"
-#include "code\modules\computer3\server.dm"
-#include "code\modules\computer3\storage.dm"
-#include "code\modules\computer3\computers\arcade.dm"
-#include "code\modules\computer3\computers\atmos_alert.dm"
-#include "code\modules\computer3\computers\camera.dm"
-#include "code\modules\computer3\computers\card.dm"
-#include "code\modules\computer3\computers\communications.dm"
-#include "code\modules\computer3\computers\crew.dm"
-#include "code\modules\computer3\computers\customs.dm"
-#include "code\modules\computer3\computers\HolodeckControl.dm"
-#include "code\modules\computer3\computers\law.dm"
-#include "code\modules\computer3\computers\medical.dm"
-#include "code\modules\computer3\computers\Operating.dm"
-#include "code\modules\computer3\computers\power.dm"
-#include "code\modules\computer3\computers\prisoner.dm"
-#include "code\modules\computer3\computers\robot.dm"
-#include "code\modules\computer3\computers\security.dm"
-#include "code\modules\computer3\computers\welcome.dm"
#include "code\modules\countdown\countdown.dm"
#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
@@ -1298,6 +1287,7 @@
#include "code\modules\events\slaughterevent.dm"
#include "code\modules\events\spacevine.dm"
#include "code\modules\events\spider_infestation.dm"
+#include "code\modules\events\spider_terror.dm"
#include "code\modules\events\spontaneous_appendicitis.dm"
#include "code\modules\events\tear.dm"
#include "code\modules\events\traders.dm"
@@ -1316,8 +1306,10 @@
#include "code\modules\examine\descriptions\weapons.dm"
#include "code\modules\ext_scripts\irc.dm"
#include "code\modules\ext_scripts\python.dm"
+#include "code\modules\fancytitle\fancytitle.dm"
#include "code\modules\fish\fish_eggs.dm"
#include "code\modules\fish\fish_items.dm"
+#include "code\modules\fish\fish_types.dm"
#include "code\modules\fish\fishtank.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
@@ -1362,30 +1354,51 @@
#include "code\modules\garbage_collection\gc_testing.dm"
#include "code\modules\holiday\christmas.dm"
#include "code\modules\holiday\holiday.dm"
+#include "code\modules\hydroponics\biogenerator.dm"
+#include "code\modules\hydroponics\gene_modder.dm"
#include "code\modules\hydroponics\grown.dm"
-#include "code\modules\hydroponics\grown_inedible.dm"
-#include "code\modules\hydroponics\grown_predefined.dm"
-#include "code\modules\hydroponics\hydro_reagents.dm"
-#include "code\modules\hydroponics\seed.dm"
-#include "code\modules\hydroponics\seed_controller.dm"
-#include "code\modules\hydroponics\seed_datums.dm"
-#include "code\modules\hydroponics\seed_machines.dm"
-#include "code\modules\hydroponics\seed_mobs.dm"
-#include "code\modules\hydroponics\seed_packets.dm"
-#include "code\modules\hydroponics\seed_storage.dm"
+#include "code\modules\hydroponics\growninedible.dm"
+#include "code\modules\hydroponics\hydroitemdefines.dm"
+#include "code\modules\hydroponics\hydroponics.dm"
+#include "code\modules\hydroponics\plant_genes.dm"
+#include "code\modules\hydroponics\sample.dm"
+#include "code\modules\hydroponics\seed_extractor.dm"
+#include "code\modules\hydroponics\seeds.dm"
#include "code\modules\hydroponics\beekeeping\beebox.dm"
#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm"
#include "code\modules\hydroponics\beekeeping\honey_frame.dm"
#include "code\modules\hydroponics\beekeeping\honeycomb.dm"
-#include "code\modules\hydroponics\spreading\spreading.dm"
-#include "code\modules\hydroponics\spreading\spreading_growth.dm"
-#include "code\modules\hydroponics\spreading\spreading_response.dm"
-#include "code\modules\hydroponics\trays\tray.dm"
-#include "code\modules\hydroponics\trays\tray_process.dm"
-#include "code\modules\hydroponics\trays\tray_reagents.dm"
-#include "code\modules\hydroponics\trays\tray_soil.dm"
-#include "code\modules\hydroponics\trays\tray_tools.dm"
-#include "code\modules\hydroponics\trays\tray_update_icons.dm"
+#include "code\modules\hydroponics\grown\ambrosia.dm"
+#include "code\modules\hydroponics\grown\apple.dm"
+#include "code\modules\hydroponics\grown\banana.dm"
+#include "code\modules\hydroponics\grown\beans.dm"
+#include "code\modules\hydroponics\grown\berries.dm"
+#include "code\modules\hydroponics\grown\cannabis.dm"
+#include "code\modules\hydroponics\grown\cereals.dm"
+#include "code\modules\hydroponics\grown\chili.dm"
+#include "code\modules\hydroponics\grown\citrus.dm"
+#include "code\modules\hydroponics\grown\cocoa_vanilla.dm"
+#include "code\modules\hydroponics\grown\corn.dm"
+#include "code\modules\hydroponics\grown\eggplant.dm"
+#include "code\modules\hydroponics\grown\flowers.dm"
+#include "code\modules\hydroponics\grown\grass_carpet.dm"
+#include "code\modules\hydroponics\grown\herbals.dm"
+#include "code\modules\hydroponics\grown\kudzu.dm"
+#include "code\modules\hydroponics\grown\melon.dm"
+#include "code\modules\hydroponics\grown\misc.dm"
+#include "code\modules\hydroponics\grown\mushrooms.dm"
+#include "code\modules\hydroponics\grown\nettle.dm"
+#include "code\modules\hydroponics\grown\nymph.dm"
+#include "code\modules\hydroponics\grown\peanut.dm"
+#include "code\modules\hydroponics\grown\potato.dm"
+#include "code\modules\hydroponics\grown\pumpkin.dm"
+#include "code\modules\hydroponics\grown\random.dm"
+#include "code\modules\hydroponics\grown\replicapod.dm"
+#include "code\modules\hydroponics\grown\root.dm"
+#include "code\modules\hydroponics\grown\tea_coffee.dm"
+#include "code\modules\hydroponics\grown\tobacco.dm"
+#include "code\modules\hydroponics\grown\tomato.dm"
+#include "code\modules\hydroponics\grown\towercap.dm"
#include "code\modules\karma\karma.dm"
#include "code\modules\library\admin.dm"
#include "code\modules\library\lib_items.dm"
@@ -1395,12 +1408,14 @@
#include "code\modules\library\computers\checkout.dm"
#include "code\modules\library\computers\public.dm"
#include "code\modules\lighting\__lighting_docs.dm"
-#include "code\modules\lighting\light_source.dm"
+#include "code\modules\lighting\lighting_area.dm"
#include "code\modules\lighting\lighting_atom.dm"
+#include "code\modules\lighting\lighting_corner.dm"
#include "code\modules\lighting\lighting_overlay.dm"
-#include "code\modules\lighting\lighting_process.dm"
-#include "code\modules\lighting\lighting_system.dm"
+#include "code\modules\lighting\lighting_setup.dm"
+#include "code\modules\lighting\lighting_source.dm"
#include "code\modules\lighting\lighting_turf.dm"
+#include "code\modules\lighting\~lighting_undefs.dm"
#include "code\modules\logic\converter.dm"
#include "code\modules\logic\dual_input.dm"
#include "code\modules\logic\logic_base.dm"
@@ -1423,6 +1438,7 @@
#include "code\modules\mining\mine_areas.dm"
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\mine_turfs.dm"
+#include "code\modules\mining\minebot.dm"
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ore.dm"
@@ -1431,6 +1447,14 @@
#include "code\modules\mining\laborcamp\laborminerals.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
+#include "code\modules\mining\lavaland\ash_flora.dm"
+#include "code\modules\mining\lavaland\necropolis_chests.dm"
+#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm"
+#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm"
+#include "code\modules\mining\lavaland\loot\colossus_loot.dm"
+#include "code\modules\mining\lavaland\loot\hierophant_loot.dm"
+#include "code\modules\mining\lavaland\loot\legion_loot.dm"
+#include "code\modules\mining\lavaland\loot\tendril_loot.dm"
#include "code\modules\mob\abilities.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
@@ -1539,6 +1563,7 @@
#include "code\modules\mob\living\carbon\human\login.dm"
#include "code\modules\mob\living\carbon\human\npcs.dm"
#include "code\modules\mob\living\carbon\human\say.dm"
+#include "code\modules\mob\living\carbon\human\status_procs.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\whisper.dm"
#include "code\modules\mob\living\carbon\human\interactive\functions.dm"
@@ -1608,8 +1633,8 @@
#include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
-#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_module_actions.dm"
+#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\update_status.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
@@ -1641,6 +1666,7 @@
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
+#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
@@ -1653,6 +1679,7 @@
#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
#include "code\modules\mob\living\simple_animal\friendly\pug.dm"
#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
+#include "code\modules\mob\living\simple_animal\friendly\sloth.dm"
#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
#include "code\modules\mob\living\simple_animal\hostile\bat.dm"
@@ -1678,7 +1705,16 @@
#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
+#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm"
@@ -1689,17 +1725,70 @@
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\empress.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\hive.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\mother.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\purple.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_ai.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
#include "code\modules\mob\new_player\new_player.dm"
#include "code\modules\mob\new_player\poll.dm"
#include "code\modules\mob\new_player\preferences_setup.dm"
#include "code\modules\mob\new_player\sprite_accessories.dm"
+#include "code\modules\modular_computers\laptop_vendor.dm"
+#include "code\modules\modular_computers\computers\item\computer.dm"
+#include "code\modules\modular_computers\computers\item\computer_components.dm"
+#include "code\modules\modular_computers\computers\item\computer_damage.dm"
+#include "code\modules\modular_computers\computers\item\computer_power.dm"
+#include "code\modules\modular_computers\computers\item\computer_ui.dm"
+#include "code\modules\modular_computers\computers\item\laptop.dm"
+#include "code\modules\modular_computers\computers\item\laptop_presets.dm"
+#include "code\modules\modular_computers\computers\item\processor.dm"
+#include "code\modules\modular_computers\computers\item\tablet.dm"
+#include "code\modules\modular_computers\computers\item\tablet_presets.dm"
+#include "code\modules\modular_computers\computers\machinery\console_presets.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_computer.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_console.dm"
+#include "code\modules\modular_computers\file_system\computer_file.dm"
+#include "code\modules\modular_computers\file_system\data.dm"
+#include "code\modules\modular_computers\file_system\program.dm"
+#include "code\modules\modular_computers\file_system\program_events.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm"
+#include "code\modules\modular_computers\file_system\programs\command\card.dm"
+#include "code\modules\modular_computers\file_system\programs\command\comms.dm"
+#include "code\modules\modular_computers\file_system\programs\engineering\alarm.dm"
+#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm"
+#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm"
+#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm"
+#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm"
+#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm"
+#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm"
+#include "code\modules\modular_computers\file_system\programs\research\airestorer.dm"
+#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm"
+#include "code\modules\modular_computers\hardware\_hardware.dm"
+#include "code\modules\modular_computers\hardware\ai_slot.dm"
+#include "code\modules\modular_computers\hardware\battery_module.dm"
+#include "code\modules\modular_computers\hardware\card_slot.dm"
+#include "code\modules\modular_computers\hardware\CPU.dm"
+#include "code\modules\modular_computers\hardware\hard_drive.dm"
+#include "code\modules\modular_computers\hardware\network_card.dm"
+#include "code\modules\modular_computers\hardware\portable_disk.dm"
+#include "code\modules\modular_computers\hardware\printer.dm"
+#include "code\modules\modular_computers\hardware\recharger.dm"
+#include "code\modules\modular_computers\NTNet\NTNet.dm"
+#include "code\modules\modular_computers\NTNet\NTNet_relay.dm"
+#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
#include "code\modules\nano\nanoexternal.dm"
#include "code\modules\nano\nanomanager.dm"
#include "code\modules\nano\nanomapgen.dm"
@@ -1711,6 +1800,7 @@
#include "code\modules\nano\interaction\default.dm"
#include "code\modules\nano\interaction\inventory.dm"
#include "code\modules\nano\interaction\inventory_deep.dm"
+#include "code\modules\nano\interaction\not_incapacitated.dm"
#include "code\modules\nano\interaction\physical.dm"
#include "code\modules\nano\interaction\self.dm"
#include "code\modules\nano\interaction\zlevel.dm"
@@ -1758,7 +1848,6 @@
#include "code\modules\pda\radio.dm"
#include "code\modules\pda\utilities.dm"
#include "code\modules\persistence\persistence.dm"
-#include "code\modules\pooling\pool.dm"
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cable_heavyduty.dm"
@@ -1824,6 +1913,7 @@
#include "code\modules\projectiles\guns\rocket.dm"
#include "code\modules\projectiles\guns\syringe_gun.dm"
#include "code\modules\projectiles\guns\throw.dm"
+#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
@@ -1833,6 +1923,7 @@
#include "code\modules\projectiles\guns\magic\staff.dm"
#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\projectile\automatic.dm"
+#include "code\modules\projectiles\guns\projectile\bow.dm"
#include "code\modules\projectiles\guns\projectile\launchers.dm"
#include "code\modules\projectiles\guns\projectile\pistol.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
@@ -1912,8 +2003,10 @@
#include "code\modules\research\server.dm"
#include "code\modules\research\designs\AI_module_designs.dm"
#include "code\modules\research\designs\autolathe_designs.dm"
+#include "code\modules\research\designs\biogenerator_designs.dm"
#include "code\modules\research\designs\bluespace_designs.dm"
#include "code\modules\research\designs\comp_board_designs.dm"
+#include "code\modules\research\designs\computer_part_designs.dm"
#include "code\modules\research\designs\equipment_designs.dm"
#include "code\modules\research\designs\janitorial_designs.dm"
#include "code\modules\research\designs\machine_designs.dm"
@@ -2007,6 +2100,7 @@
#include "code\modules\shuttle\assault_pod.dm"
#include "code\modules\shuttle\emergency.dm"
#include "code\modules\shuttle\on_move.dm"
+#include "code\modules\shuttle\ripple.dm"
#include "code\modules\shuttle\shuttle.dm"
#include "code\modules\shuttle\shuttle_manipulator.dm"
#include "code\modules\shuttle\supply.dm"
@@ -2024,6 +2118,10 @@
#include "code\modules\spacepods\parts.dm"
#include "code\modules\spacepods\pod_fabricator.dm"
#include "code\modules\spacepods\spacepod.dm"
+#include "code\modules\station_goals\bsa.dm"
+#include "code\modules\station_goals\dna_vault.dm"
+#include "code\modules\station_goals\shield.dm"
+#include "code\modules\station_goals\station_goal.dm"
#include "code\modules\store\items.dm"
#include "code\modules\store\store.dm"
#include "code\modules\surgery\bones.dm"
@@ -2036,6 +2134,7 @@
#include "code\modules\surgery\limb_reattach.dm"
#include "code\modules\surgery\organs_internal.dm"
#include "code\modules\surgery\other.dm"
+#include "code\modules\surgery\rig_removal.dm"
#include "code\modules\surgery\robotics.dm"
#include "code\modules\surgery\slime.dm"
#include "code\modules\surgery\surgery.dm"
@@ -2055,14 +2154,16 @@
#include "code\modules\surgery\organs\parasites.dm"
#include "code\modules\surgery\organs\robolimbs.dm"
#include "code\modules\surgery\organs\skeleton.dm"
+#include "code\modules\surgery\organs\vocal_cords.dm"
#include "code\modules\surgery\organs\wound.dm"
+#include "code\modules\surgery\organs\subtypes\abductor.dm"
#include "code\modules\surgery\organs\subtypes\diona.dm"
#include "code\modules\surgery\organs\subtypes\drask.dm"
#include "code\modules\surgery\organs\subtypes\grey.dm"
#include "code\modules\surgery\organs\subtypes\kidan.dm"
#include "code\modules\surgery\organs\subtypes\machine.dm"
-#include "code\modules\surgery\organs\subtypes\misc.dm"
#include "code\modules\surgery\organs\subtypes\nucleation.dm"
+#include "code\modules\surgery\organs\subtypes\shadow.dm"
#include "code\modules\surgery\organs\subtypes\skrell.dm"
#include "code\modules\surgery\organs\subtypes\standard.dm"
#include "code\modules\surgery\organs\subtypes\tajaran.dm"
@@ -2091,6 +2192,10 @@
#include "code\modules\vehicle\speedbike.dm"
#include "code\modules\vehicle\sportscar.dm"
#include "code\modules\vehicle\vehicle.dm"
+#include "code\modules\vr\vr_avatar.dm"
+#include "code\modules\vr\vr_controller.dm"
+#include "code\modules\vr\vr_goggles.dm"
+#include "code\modules\vr\vr_outfits.dm"
#include "goon\code\datums\browserOutput.dm"
#include "interface\interface.dm"
#include "interface\skin.dmf"
diff --git a/sound/effects/Kidanclack.ogg b/sound/effects/Kidanclack.ogg
new file mode 100644
index 00000000000..a25cf3efab7
Binary files /dev/null and b/sound/effects/Kidanclack.ogg differ
diff --git a/sound/effects/kidanclack2.ogg b/sound/effects/kidanclack2.ogg
new file mode 100644
index 00000000000..de2d625bc13
Binary files /dev/null and b/sound/effects/kidanclack2.ogg differ
diff --git a/sound/effects/mob_effects/f_cougha.ogg b/sound/effects/mob_effects/f_cougha.ogg
new file mode 100644
index 00000000000..f53e0f5bd2c
Binary files /dev/null and b/sound/effects/mob_effects/f_cougha.ogg differ
diff --git a/sound/effects/mob_effects/f_coughb.ogg b/sound/effects/mob_effects/f_coughb.ogg
new file mode 100644
index 00000000000..2626f8d6621
Binary files /dev/null and b/sound/effects/mob_effects/f_coughb.ogg differ
diff --git a/sound/effects/mob_effects/f_machine_cougha.ogg b/sound/effects/mob_effects/f_machine_cougha.ogg
new file mode 100644
index 00000000000..e0a8441e3d4
Binary files /dev/null and b/sound/effects/mob_effects/f_machine_cougha.ogg differ
diff --git a/sound/effects/mob_effects/f_machine_coughb.ogg b/sound/effects/mob_effects/f_machine_coughb.ogg
new file mode 100644
index 00000000000..b70b6d16c14
Binary files /dev/null and b/sound/effects/mob_effects/f_machine_coughb.ogg differ
diff --git a/sound/effects/mob_effects/f_machine_sneeze.ogg b/sound/effects/mob_effects/f_machine_sneeze.ogg
new file mode 100644
index 00000000000..9649c862449
Binary files /dev/null and b/sound/effects/mob_effects/f_machine_sneeze.ogg differ
diff --git a/sound/effects/mob_effects/f_sneeze.ogg b/sound/effects/mob_effects/f_sneeze.ogg
new file mode 100644
index 00000000000..e6c4a49ade8
Binary files /dev/null and b/sound/effects/mob_effects/f_sneeze.ogg differ
diff --git a/sound/effects/mob_effects/m_cougha.ogg b/sound/effects/mob_effects/m_cougha.ogg
new file mode 100644
index 00000000000..146beefdf87
Binary files /dev/null and b/sound/effects/mob_effects/m_cougha.ogg differ
diff --git a/sound/effects/mob_effects/m_coughb.ogg b/sound/effects/mob_effects/m_coughb.ogg
new file mode 100644
index 00000000000..745fb50e19c
Binary files /dev/null and b/sound/effects/mob_effects/m_coughb.ogg differ
diff --git a/sound/effects/mob_effects/m_coughc.ogg b/sound/effects/mob_effects/m_coughc.ogg
new file mode 100644
index 00000000000..abfe70d2769
Binary files /dev/null and b/sound/effects/mob_effects/m_coughc.ogg differ
diff --git a/sound/effects/mob_effects/m_machine_cougha.ogg b/sound/effects/mob_effects/m_machine_cougha.ogg
new file mode 100644
index 00000000000..3e803f64b1e
Binary files /dev/null and b/sound/effects/mob_effects/m_machine_cougha.ogg differ
diff --git a/sound/effects/mob_effects/m_machine_coughb.ogg b/sound/effects/mob_effects/m_machine_coughb.ogg
new file mode 100644
index 00000000000..d1287070922
Binary files /dev/null and b/sound/effects/mob_effects/m_machine_coughb.ogg differ
diff --git a/sound/effects/mob_effects/m_machine_coughc.ogg b/sound/effects/mob_effects/m_machine_coughc.ogg
new file mode 100644
index 00000000000..67e13314934
Binary files /dev/null and b/sound/effects/mob_effects/m_machine_coughc.ogg differ
diff --git a/sound/effects/mob_effects/machine_sneeze.ogg b/sound/effects/mob_effects/machine_sneeze.ogg
new file mode 100644
index 00000000000..f0ba0ab8170
Binary files /dev/null and b/sound/effects/mob_effects/machine_sneeze.ogg differ
diff --git a/sound/effects/mob_effects/sneeze.ogg b/sound/effects/mob_effects/sneeze.ogg
new file mode 100644
index 00000000000..e7587bab20f
Binary files /dev/null and b/sound/effects/mob_effects/sneeze.ogg differ
diff --git a/sound/effects/pray.ogg b/sound/effects/pray.ogg
new file mode 100644
index 00000000000..beadd3916f1
Binary files /dev/null and b/sound/effects/pray.ogg differ
diff --git a/sound/effects/pray_chaplain.ogg b/sound/effects/pray_chaplain.ogg
new file mode 100644
index 00000000000..1b543275311
Binary files /dev/null and b/sound/effects/pray_chaplain.ogg differ
diff --git a/sound/effects/siren-spooky.ogg b/sound/effects/siren-spooky.ogg
new file mode 100644
index 00000000000..6e9eb341156
Binary files /dev/null and b/sound/effects/siren-spooky.ogg differ
diff --git a/sound/effects/unathihiss.ogg b/sound/effects/unathihiss.ogg
new file mode 100644
index 00000000000..0ba172d4aac
Binary files /dev/null and b/sound/effects/unathihiss.ogg differ
diff --git a/sound/items/WelderActivate.ogg b/sound/items/WelderActivate.ogg
new file mode 100644
index 00000000000..5218f2ab1cf
Binary files /dev/null and b/sound/items/WelderActivate.ogg differ
diff --git a/sound/items/WelderDeactivate.ogg b/sound/items/WelderDeactivate.ogg
new file mode 100644
index 00000000000..22ac4f445cb
Binary files /dev/null and b/sound/items/WelderDeactivate.ogg differ
diff --git a/sound/items/change_drill.ogg b/sound/items/change_drill.ogg
new file mode 100644
index 00000000000..406027a5955
Binary files /dev/null and b/sound/items/change_drill.ogg differ
diff --git a/sound/items/change_jaws.ogg b/sound/items/change_jaws.ogg
new file mode 100644
index 00000000000..b6a41eca806
Binary files /dev/null and b/sound/items/change_jaws.ogg differ
diff --git a/sound/items/drill_hit.ogg b/sound/items/drill_hit.ogg
new file mode 100644
index 00000000000..0f8fa631aa1
Binary files /dev/null and b/sound/items/drill_hit.ogg differ
diff --git a/sound/items/drill_use.ogg b/sound/items/drill_use.ogg
new file mode 100644
index 00000000000..82f37cd35bb
Binary files /dev/null and b/sound/items/drill_use.ogg differ
diff --git a/sound/items/jaws_cut.ogg b/sound/items/jaws_cut.ogg
new file mode 100644
index 00000000000..a0bfd855029
Binary files /dev/null and b/sound/items/jaws_cut.ogg differ
diff --git a/sound/items/jaws_pry.ogg b/sound/items/jaws_pry.ogg
new file mode 100644
index 00000000000..05178bd4663
Binary files /dev/null and b/sound/items/jaws_pry.ogg differ
diff --git a/sound/machines/airlock_close.ogg b/sound/machines/airlock_close.ogg
new file mode 100644
index 00000000000..58a06817f00
Binary files /dev/null and b/sound/machines/airlock_close.ogg differ
diff --git a/sound/machines/airlock_ext_close.ogg b/sound/machines/airlock_ext_close.ogg
new file mode 100644
index 00000000000..7257136297b
Binary files /dev/null and b/sound/machines/airlock_ext_close.ogg differ
diff --git a/sound/machines/airlock_ext_open.ogg b/sound/machines/airlock_ext_open.ogg
new file mode 100644
index 00000000000..e9613aaf843
Binary files /dev/null and b/sound/machines/airlock_ext_open.ogg differ
diff --git a/sound/machines/airlock.ogg b/sound/machines/airlock_open.ogg
similarity index 100%
rename from sound/machines/airlock.ogg
rename to sound/machines/airlock_open.ogg
diff --git a/sound/machines/bsa_fire.ogg b/sound/machines/bsa_fire.ogg
new file mode 100644
index 00000000000..19244ff69d6
Binary files /dev/null and b/sound/machines/bsa_fire.ogg differ
diff --git a/sound/machines/terminal_alert.ogg b/sound/machines/terminal_alert.ogg
new file mode 100644
index 00000000000..0f5006ee42c
Binary files /dev/null and b/sound/machines/terminal_alert.ogg differ
diff --git a/sound/machines/terminal_button01.ogg b/sound/machines/terminal_button01.ogg
new file mode 100644
index 00000000000..362d81f3c57
Binary files /dev/null and b/sound/machines/terminal_button01.ogg differ
diff --git a/sound/machines/terminal_button02.ogg b/sound/machines/terminal_button02.ogg
new file mode 100644
index 00000000000..6df9b289b55
Binary files /dev/null and b/sound/machines/terminal_button02.ogg differ
diff --git a/sound/machines/terminal_button03.ogg b/sound/machines/terminal_button03.ogg
new file mode 100644
index 00000000000..3bd1e2c4259
Binary files /dev/null and b/sound/machines/terminal_button03.ogg differ
diff --git a/sound/machines/terminal_button04.ogg b/sound/machines/terminal_button04.ogg
new file mode 100644
index 00000000000..f9020380d0a
Binary files /dev/null and b/sound/machines/terminal_button04.ogg differ
diff --git a/sound/machines/terminal_button05.ogg b/sound/machines/terminal_button05.ogg
new file mode 100644
index 00000000000..0bbfefe5273
Binary files /dev/null and b/sound/machines/terminal_button05.ogg differ
diff --git a/sound/machines/terminal_button06.ogg b/sound/machines/terminal_button06.ogg
new file mode 100644
index 00000000000..ecb521f272c
Binary files /dev/null and b/sound/machines/terminal_button06.ogg differ
diff --git a/sound/machines/terminal_button07.ogg b/sound/machines/terminal_button07.ogg
new file mode 100644
index 00000000000..a6ed66bbf26
Binary files /dev/null and b/sound/machines/terminal_button07.ogg differ
diff --git a/sound/machines/terminal_button08.ogg b/sound/machines/terminal_button08.ogg
new file mode 100644
index 00000000000..2d35c62cc4c
Binary files /dev/null and b/sound/machines/terminal_button08.ogg differ
diff --git a/sound/machines/terminal_insert_disc.ogg b/sound/machines/terminal_insert_disc.ogg
new file mode 100644
index 00000000000..07313dabaca
Binary files /dev/null and b/sound/machines/terminal_insert_disc.ogg differ
diff --git a/sound/machines/terminal_off.ogg b/sound/machines/terminal_off.ogg
new file mode 100644
index 00000000000..4882aa924af
Binary files /dev/null and b/sound/machines/terminal_off.ogg differ
diff --git a/sound/machines/terminal_on.ogg b/sound/machines/terminal_on.ogg
new file mode 100644
index 00000000000..95164b5b774
Binary files /dev/null and b/sound/machines/terminal_on.ogg differ
diff --git a/sound/machines/terminal_prompt.ogg b/sound/machines/terminal_prompt.ogg
new file mode 100644
index 00000000000..1ff4930a263
Binary files /dev/null and b/sound/machines/terminal_prompt.ogg differ
diff --git a/sound/machines/terminal_prompt_confirm.ogg b/sound/machines/terminal_prompt_confirm.ogg
new file mode 100644
index 00000000000..b838a764e8c
Binary files /dev/null and b/sound/machines/terminal_prompt_confirm.ogg differ
diff --git a/sound/machines/terminal_prompt_deny.ogg b/sound/machines/terminal_prompt_deny.ogg
new file mode 100644
index 00000000000..c408c21625f
Binary files /dev/null and b/sound/machines/terminal_prompt_deny.ogg differ
diff --git a/sound/magic/Blind.ogg b/sound/magic/Blind.ogg
new file mode 100644
index 00000000000..ded32a594e4
Binary files /dev/null and b/sound/magic/Blind.ogg differ
diff --git a/sound/magic/CastSummon.ogg b/sound/magic/CastSummon.ogg
new file mode 100644
index 00000000000..493fb239764
Binary files /dev/null and b/sound/magic/CastSummon.ogg differ
diff --git a/sound/magic/Disable_Tech.ogg b/sound/magic/Disable_Tech.ogg
new file mode 100644
index 00000000000..478dd042b53
Binary files /dev/null and b/sound/magic/Disable_Tech.ogg differ
diff --git a/sound/magic/Ethereal_Enter.ogg b/sound/magic/Ethereal_Enter.ogg
new file mode 100644
index 00000000000..a0c7222c167
Binary files /dev/null and b/sound/magic/Ethereal_Enter.ogg differ
diff --git a/sound/magic/Ethereal_Exit.ogg b/sound/magic/Ethereal_Exit.ogg
new file mode 100644
index 00000000000..bd60ca8c695
Binary files /dev/null and b/sound/magic/Ethereal_Exit.ogg differ
diff --git a/sound/magic/Fireball.ogg b/sound/magic/Fireball.ogg
new file mode 100644
index 00000000000..b9f6937f06b
Binary files /dev/null and b/sound/magic/Fireball.ogg differ
diff --git a/sound/magic/ForceWall.ogg b/sound/magic/ForceWall.ogg
new file mode 100644
index 00000000000..4fbca3f42b7
Binary files /dev/null and b/sound/magic/ForceWall.ogg differ
diff --git a/sound/magic/HorseHead_curse.ogg b/sound/magic/HorseHead_curse.ogg
new file mode 100644
index 00000000000..598d096036b
Binary files /dev/null and b/sound/magic/HorseHead_curse.ogg differ
diff --git a/sound/magic/Knock.ogg b/sound/magic/Knock.ogg
new file mode 100644
index 00000000000..fe2f54f97ac
Binary files /dev/null and b/sound/magic/Knock.ogg differ
diff --git a/sound/magic/MAGIC_MISSILE.ogg b/sound/magic/MAGIC_MISSILE.ogg
new file mode 100644
index 00000000000..9d0799d82e9
Binary files /dev/null and b/sound/magic/MAGIC_MISSILE.ogg differ
diff --git a/sound/magic/MM_Hit.ogg b/sound/magic/MM_Hit.ogg
new file mode 100644
index 00000000000..4f09ef46d51
Binary files /dev/null and b/sound/magic/MM_Hit.ogg differ
diff --git a/sound/magic/MindSwap.ogg b/sound/magic/MindSwap.ogg
new file mode 100644
index 00000000000..2f4848becb0
Binary files /dev/null and b/sound/magic/MindSwap.ogg differ
diff --git a/sound/magic/Repulse.ogg b/sound/magic/Repulse.ogg
new file mode 100644
index 00000000000..ed010370754
Binary files /dev/null and b/sound/magic/Repulse.ogg differ
diff --git a/sound/magic/Smoke.ogg b/sound/magic/Smoke.ogg
new file mode 100644
index 00000000000..ca50a349676
Binary files /dev/null and b/sound/magic/Smoke.ogg differ
diff --git a/sound/magic/Staff_Change.ogg b/sound/magic/Staff_Change.ogg
new file mode 100644
index 00000000000..9e6eb72ae06
Binary files /dev/null and b/sound/magic/Staff_Change.ogg differ
diff --git a/sound/magic/Staff_Door.ogg b/sound/magic/Staff_Door.ogg
new file mode 100644
index 00000000000..220f8124825
Binary files /dev/null and b/sound/magic/Staff_Door.ogg differ
diff --git a/sound/magic/Staff_Healing.ogg b/sound/magic/Staff_Healing.ogg
new file mode 100644
index 00000000000..af2a56049c8
Binary files /dev/null and b/sound/magic/Staff_Healing.ogg differ
diff --git a/sound/magic/Staff_animation.ogg b/sound/magic/Staff_animation.ogg
new file mode 100644
index 00000000000..8abd7faa60f
Binary files /dev/null and b/sound/magic/Staff_animation.ogg differ
diff --git a/sound/magic/SummonItems_generic.ogg b/sound/magic/SummonItems_generic.ogg
new file mode 100644
index 00000000000..80cc412a4a8
Binary files /dev/null and b/sound/magic/SummonItems_generic.ogg differ
diff --git a/sound/magic/Summon_Karp.ogg b/sound/magic/Summon_Karp.ogg
new file mode 100644
index 00000000000..d3890776f6d
Binary files /dev/null and b/sound/magic/Summon_Karp.ogg differ
diff --git a/sound/magic/Summon_Magic.ogg b/sound/magic/Summon_Magic.ogg
new file mode 100644
index 00000000000..86b33032826
Binary files /dev/null and b/sound/magic/Summon_Magic.ogg differ
diff --git a/sound/magic/Summon_guns.ogg b/sound/magic/Summon_guns.ogg
new file mode 100644
index 00000000000..b9b5394a4ed
Binary files /dev/null and b/sound/magic/Summon_guns.ogg differ
diff --git a/sound/magic/Tail_swing.ogg b/sound/magic/Tail_swing.ogg
new file mode 100644
index 00000000000..d39462fae30
Binary files /dev/null and b/sound/magic/Tail_swing.ogg differ
diff --git a/sound/magic/Teleport_app.ogg b/sound/magic/Teleport_app.ogg
new file mode 100644
index 00000000000..dd9222ae0c3
Binary files /dev/null and b/sound/magic/Teleport_app.ogg differ
diff --git a/sound/magic/Teleport_diss.ogg b/sound/magic/Teleport_diss.ogg
new file mode 100644
index 00000000000..edc0c55ed00
Binary files /dev/null and b/sound/magic/Teleport_diss.ogg differ
diff --git a/sound/magic/WandODeath.ogg b/sound/magic/WandODeath.ogg
new file mode 100644
index 00000000000..4412609657c
Binary files /dev/null and b/sound/magic/WandODeath.ogg differ
diff --git a/sound/magic/Wand_Teleport.ogg b/sound/magic/Wand_Teleport.ogg
new file mode 100644
index 00000000000..8a300d7763f
Binary files /dev/null and b/sound/magic/Wand_Teleport.ogg differ
diff --git a/sound/magic/blink.ogg b/sound/magic/blink.ogg
new file mode 100644
index 00000000000..58b7cc8562c
Binary files /dev/null and b/sound/magic/blink.ogg differ
diff --git a/sound/magic/invoke_general.ogg b/sound/magic/invoke_general.ogg
new file mode 100644
index 00000000000..6f0c0dd097a
Binary files /dev/null and b/sound/magic/invoke_general.ogg differ
diff --git a/sound/magic/narsie_attack.ogg b/sound/magic/narsie_attack.ogg
new file mode 100644
index 00000000000..89fac778058
Binary files /dev/null and b/sound/magic/narsie_attack.ogg differ
diff --git a/sound/magic/ratvar_attack.ogg b/sound/magic/ratvar_attack.ogg
new file mode 100644
index 00000000000..1c17fe10510
Binary files /dev/null and b/sound/magic/ratvar_attack.ogg differ
diff --git a/sound/misc/desceration-01.ogg b/sound/misc/desceration-01.ogg
new file mode 100644
index 00000000000..29bc568c575
Binary files /dev/null and b/sound/misc/desceration-01.ogg differ
diff --git a/sound/misc/desceration-02.ogg b/sound/misc/desceration-02.ogg
new file mode 100644
index 00000000000..761a73a7b9f
Binary files /dev/null and b/sound/misc/desceration-02.ogg differ
diff --git a/sound/misc/desceration-03.ogg b/sound/misc/desceration-03.ogg
new file mode 100644
index 00000000000..876de18de50
Binary files /dev/null and b/sound/misc/desceration-03.ogg differ
diff --git a/sound/misc/e1m1.ogg b/sound/misc/e1m1.ogg
new file mode 100644
index 00000000000..e611e154ae6
Binary files /dev/null and b/sound/misc/e1m1.ogg differ
diff --git a/sound/voice/shriekcough.ogg b/sound/voice/shriekcough.ogg
new file mode 100644
index 00000000000..15dc2e3873c
Binary files /dev/null and b/sound/voice/shriekcough.ogg differ
diff --git a/sound/voice/shrieksneeze.ogg b/sound/voice/shrieksneeze.ogg
new file mode 100644
index 00000000000..9b1a5d1cca7
Binary files /dev/null and b/sound/voice/shrieksneeze.ogg differ
diff --git a/sound/vox_fem/deeoo.ogg b/sound/vox_fem/deeoo.ogg
index 3a8bbd48aee..a39fcf4ff05 100644
Binary files a/sound/vox_fem/deeoo.ogg and b/sound/vox_fem/deeoo.ogg differ
diff --git a/sound/weapons/HOMERUN.ogg b/sound/weapons/HOMERUN.ogg
new file mode 100644
index 00000000000..707edd87527
Binary files /dev/null and b/sound/weapons/HOMERUN.ogg differ
diff --git a/sound/weapons/ZapBang.ogg b/sound/weapons/ZapBang.ogg
new file mode 100644
index 00000000000..4e14e30a11b
Binary files /dev/null and b/sound/weapons/ZapBang.ogg differ
diff --git a/sound/weapons/bulletflyby.ogg b/sound/weapons/bulletflyby.ogg
new file mode 100644
index 00000000000..ce9405a5776
Binary files /dev/null and b/sound/weapons/bulletflyby.ogg differ
diff --git a/sound/weapons/bulletflyby2.ogg b/sound/weapons/bulletflyby2.ogg
new file mode 100644
index 00000000000..63956534ba3
Binary files /dev/null and b/sound/weapons/bulletflyby2.ogg differ
diff --git a/sound/weapons/bulletflyby3.ogg b/sound/weapons/bulletflyby3.ogg
new file mode 100644
index 00000000000..e8afd28b06d
Binary files /dev/null and b/sound/weapons/bulletflyby3.ogg differ
diff --git a/sound/weapons/draw_bow.ogg b/sound/weapons/draw_bow.ogg
new file mode 100644
index 00000000000..01f1393bc84
Binary files /dev/null and b/sound/weapons/draw_bow.ogg differ
diff --git a/sound/weapons/effects/batreflect1.ogg b/sound/weapons/effects/batreflect1.ogg
new file mode 100644
index 00000000000..43f19710c5f
Binary files /dev/null and b/sound/weapons/effects/batreflect1.ogg differ
diff --git a/sound/weapons/effects/batreflect2.ogg b/sound/weapons/effects/batreflect2.ogg
new file mode 100644
index 00000000000..d58e4e906cb
Binary files /dev/null and b/sound/weapons/effects/batreflect2.ogg differ
diff --git a/sound/weapons/rapierhit.ogg b/sound/weapons/rapierhit.ogg
new file mode 100644
index 00000000000..6e214d2821f
Binary files /dev/null and b/sound/weapons/rapierhit.ogg differ
diff --git a/sound/weapons/throwtap.ogg b/sound/weapons/throwtap.ogg
new file mode 100644
index 00000000000..7806a789818
Binary files /dev/null and b/sound/weapons/throwtap.ogg differ
diff --git a/strings/ion_laws.json b/strings/ion_laws.json
index 446b1e980e9..ecb4660ded5 100644
--- a/strings/ion_laws.json
+++ b/strings/ion_laws.json
@@ -408,7 +408,7 @@
"THIRTEEN SEQUELS",
"THREE WISHES",
"A SITCOM",
- "THAT GRIEFING FAGGOT GEORGE MELONS",
+ "THAT GRIEFING ASSHOLE GEORGE MELONS",
"FAT GIRLS ON BICYCLES",
"SOMEBODY TO PUT YOU OUT OF YOUR MISERY",
"HEROES IN A HALF SHELL",
diff --git a/tools/icon_merge_tool/Run Icon Conflict Fixer.bat b/tools/icon_merge_tool/Run Icon Conflict Fixer.bat
new file mode 100644
index 00000000000..79b3f27bb96
--- /dev/null
+++ b/tools/icon_merge_tool/Run Icon Conflict Fixer.bat
@@ -0,0 +1,4 @@
+@echo off
+SET RELATIVEROOT="../../"
+python icon_merge_tool.py %RELATIVEROOT%
+pause
diff --git a/tools/icon_merge_tool/icon_merge_tool.py b/tools/icon_merge_tool/icon_merge_tool.py
new file mode 100644
index 00000000000..8cfd701d8bb
--- /dev/null
+++ b/tools/icon_merge_tool/icon_merge_tool.py
@@ -0,0 +1,87 @@
+from tempfile import NamedTemporaryFile
+import sys
+import os
+import time
+import subprocess
+
+dmitool_path = "tools/dmitool/dmitool.jar"
+
+def run_shell_command(command):
+ return subprocess.run(command, shell=True, stdout=subprocess.PIPE, universal_newlines=True).stdout
+
+def run_shell_command_binary(command):
+ return subprocess.run(command, shell=True, stdout=subprocess.PIPE).stdout
+
+def string_to_num(s):
+ try:
+ return int(s)
+ except ValueError:
+ return -1
+
+def main(relative_root):
+ git_version = run_shell_command("git version")
+ if not git_version:
+ print("ERROR: Failed to run git. Make sure it is installed and in your PATH.")
+ return False
+
+ file_conflicts = run_shell_command("git diff --name-only --diff-filter=U").split("\n")
+ icon_conflicts = [path for path in file_conflicts if path[len(path)-3::] == "dmi"]
+
+ for i in range(0, len(icon_conflicts)):
+ print("[{}]: {}".format(i, icon_conflicts[i]))
+ selection = input("Choose icon files you want to fix (example: 1,3-5,12):\n")
+ selection = selection.replace(" ", "")
+ selection = selection.split(",")
+
+ #shamelessly copied from mapmerger cli
+ valid_indices = list()
+ for m in selection:
+ index_range = m.split("-")
+ if len(index_range) == 1:
+ index = string_to_num(index_range[0])
+ if index >= 0 and index < len(icon_conflicts):
+ valid_indices.append(index)
+ elif len(index_range) == 2:
+ index0 = string_to_num(index_range[0])
+ index1 = string_to_num(index_range[1])
+ if index0 >= 0 and index0 <= index1 and index1 < len(icon_conflicts):
+ valid_indices.extend(range(index0, index1 + 1))
+
+ if not len(valid_indices):
+ print("No icons selected, exiting.")
+ sys.exit()
+
+ print("Attempting to fix the following icon files:")
+ for i in valid_indices:
+ print(icon_conflicts[i])
+ input("Press Enter to start.")
+
+ for i in valid_indices:
+ path = icon_conflicts[i]
+ print("{}: {}".format("Merging", path))
+
+ common_ancestor_hash = run_shell_command("git merge-base ORIG_HEAD master").strip()
+
+ ours_icon = NamedTemporaryFile(delete=False)
+ theirs_icon = NamedTemporaryFile(delete=False)
+ base_icon = NamedTemporaryFile(delete=False)
+
+ ours_icon.write(run_shell_command_binary("git show ORIG_HEAD:{}".format(path)))
+ theirs_icon.write(run_shell_command_binary("git show master:{}".format(path)))
+ base_icon.write(run_shell_command_binary("git show {}:{}".format(common_ancestor_hash, path)))
+
+ # So it being "open" doesn't prevent other programs from using it
+ ours_icon.close()
+ theirs_icon.close()
+ base_icon.close()
+
+ merge_command = "java -jar {} merge {} {} {} {}".format(relative_root + dmitool_path, base_icon.name, ours_icon.name, theirs_icon.name, relative_root + path + ".fixed")
+
+ print(merge_command)
+ print(run_shell_command(merge_command))
+ os.remove(ours_icon.name)
+ os.remove(theirs_icon.name)
+ os.remove(base_icon.name)
+ print(".")
+
+main(sys.argv[1])
diff --git a/tools/map_conflict_fixer/README.md b/tools/map_conflict_fixer/README.md
new file mode 100644
index 00000000000..5af8d3aadf0
--- /dev/null
+++ b/tools/map_conflict_fixer/README.md
@@ -0,0 +1,29 @@
+#Map Conflict Fixer/Helper#
+The map conflict fixer is a script that can help you fix map conflicts easier and faster. Here's how it works:
+
+###Before using###
+You need git for this, of course.
+Make sure your development branch is up to date before starting a map edit to ensure the script outputs a correct fix.
+
+##Dictionary mode##
+Dictionary conflicts are the easiest to fix, you simply need to create more models to accommodate your changes and everyone elses.
+
+When you run in this mode, if the script finishes successfuly the map should be ready to be commited.
+
+If the script fails in dictionary mode, you can run it again in full fix mode.
+
+##Full Fix mode##
+When you and someone else edit the same coordinate, there is no easy way to fix the conflict. You need to get your hands dirty.
+
+The script will mark every tile with a marker type to help you identify what needs fixing in the map editor.
+
+After you edit and fix a marked map, you should run it through the map merger. The .backup file should be the same you used before.
+
+###Priorities###
+In Full Fix mode, the script needs to know which map version has higher priority, yours or someone elses. This important so tiles with multiple area and turf types aren't created.
+
+Your version has priority - In each conflicted coordinate, your floor type and your area type will be used
+Their version has priority - In each conflicted coordinate, your floor type and your area type will not be used
+
+##IMPORTANT##
+This script is in a testing phase and you should not consider any output to be safe. Always verify the maps this script produced to make sure nothing is out of place.
diff --git a/tools/map_conflict_fixer/Run Map Conflict Fixer - DMM.bat b/tools/map_conflict_fixer/Run Map Conflict Fixer - DMM.bat
new file mode 100644
index 00000000000..d66102a3295
--- /dev/null
+++ b/tools/map_conflict_fixer/Run Map Conflict Fixer - DMM.bat
@@ -0,0 +1,4 @@
+@echo off
+SET RELATIVEROOT="../../"
+python map_conflict_fixer.py %1 %RELATIVEROOT% 0
+pause
diff --git a/tools/map_conflict_fixer/map_conflict_fixer.py b/tools/map_conflict_fixer/map_conflict_fixer.py
new file mode 100644
index 00000000000..5e64657ad89
--- /dev/null
+++ b/tools/map_conflict_fixer/map_conflict_fixer.py
@@ -0,0 +1,111 @@
+import map_helpers
+import sys
+import os
+import time
+
+# Credits to tg for this
+
+def main(relative_root, tgm=0):
+ git_version = map_helpers.run_shell_command("git version")
+ if not git_version:
+ print("ERROR: Failed to run git. Make sure it is installed and in your PATH.")
+ return False
+
+ print("--- DISCLAIMER ---")
+ print("This script is in a testing phase. Verify all the results yourself to make sure you got what you expected. Make sure to read the readme to learn how to use this.")
+ input("Press Enter to GO\n")
+
+ file_conflicts = map_helpers.run_shell_command("git diff --name-only --diff-filter=U").split("\n")
+ map_conflicts = [path for path in file_conflicts if path[len(path)-3::] == "dmm"]
+
+ for i in range(0, len(map_conflicts)):
+ print("[{}]: {}".format(i, map_conflicts[i]))
+ selection = input("Choose maps you want to fix (example: 1,3-5,12):\n")
+ selection = selection.replace(" ", "")
+ selection = selection.split(",")
+
+ #shamelessly copied from mapmerger cli
+ valid_indices = list()
+ for m in selection:
+ index_range = m.split("-")
+ if len(index_range) == 1:
+ index = map_helpers.string_to_num(index_range[0])
+ if index >= 0 and index < len(map_conflicts):
+ valid_indices.append(index)
+ elif len(index_range) == 2:
+ index0 = map_helpers.string_to_num(index_range[0])
+ index1 = map_helpers.string_to_num(index_range[1])
+ if index0 >= 0 and index0 <= index1 and index1 < len(map_conflicts):
+ valid_indices.extend(range(index0, index1 + 1))
+
+ if not len(valid_indices):
+ print("No map selected, exiting.")
+ sys.exit()
+
+ print("Attempting to fix the following maps:")
+ for i in valid_indices:
+ print(map_conflicts[i])
+
+
+ marker = None
+ priority = 0
+ print("\nFixing modes:")
+ print("[{}]: Dictionary conflict fixing mode".format(map_helpers.MAP_FIX_DICTIONARY))
+ print("[{}]: Full map conflict fixing mode".format(map_helpers.MAP_FIX_FULL))
+ mode = map_helpers.string_to_num(input("Select fixing mode [Dictionary]: "))
+ if mode != map_helpers.MAP_FIX_FULL:
+ mode = map_helpers.MAP_FIX_DICTIONARY
+ print("DICTIONARY mode selected.")
+ else:
+ marker = input("FULL mode selected. Input a marker [/obj/effect/debugging/mapfix_marker]: ")
+ if not marker:
+ marker = "/obj/effect/debugging/mapfix_marker"
+ print("Marker selected: {}".format(marker))
+
+ print("\nVersion priorities:")
+ print("[{}]: Your version".format(map_helpers.MAP_FIX_PRIORITY_OURS))
+ print("[{}]: Their version".format(map_helpers.MAP_FIX_PRIORITY_THEIRS))
+ priority = map_helpers.string_to_num(input("Select priority [Yours]: "))
+ if priority != map_helpers.MAP_FIX_PRIORITY_THEIRS:
+ priority = map_helpers.MAP_FIX_PRIORITY_OURS
+ print("Your version will be prioritized.")
+ else:
+ print("Their version will be prioritized.")
+
+ ed = "FIXED" if mode == map_helpers.MAP_FIX_DICTIONARY else "MARKED"
+ ing = "FIXING" if mode == map_helpers.MAP_FIX_DICTIONARY else "MARKING"
+
+ print("\nMaps will be converted to TGM.")
+ print("Writing maps to 'file_path/file_name.fixed.dmm'. Please verify the results before commiting.")
+ if mode == map_helpers.MAP_FIX_FULL:
+ print("After editing the marked maps, run them through the map merger!")
+ input("Press Enter to start.")
+
+ print(".")
+ time.sleep(0.3)
+ print(".")
+
+ for i in valid_indices:
+ path = map_conflicts[i]
+ print("{}: {}".format(ing, path))
+ ours_map_raw_text = map_helpers.run_shell_command("git show HEAD:{}".format(path))
+ theirs_map_raw_text = map_helpers.run_shell_command("git show MERGE_HEAD:{}".format(path))
+
+ common_ancestor_hash = map_helpers.run_shell_command("git merge-base HEAD MERGE_HEAD").strip()
+ base_map_raw_text = map_helpers.run_shell_command("git show {}:{}".format(common_ancestor_hash, path))
+
+ ours_map = map_helpers.parse_map(ours_map_raw_text)
+ theirs_map = map_helpers.parse_map(theirs_map_raw_text)
+ base_map = map_helpers.parse_map(base_map_raw_text)
+
+ if map_helpers.fix_map_git_conflicts(base_map, ours_map, theirs_map, mode, marker, priority, relative_root+path, tgm):
+ print("{}: {}".format(ed, path))
+ print(".")
+
+output_tgm = None
+try:
+ output_tgm = int(sys.argv[2])
+except ValueError:
+ output_tgm = 0
+
+main(sys.argv[1], output_tgm)
diff --git a/tools/map_conflict_fixer/map_helpers.py b/tools/map_conflict_fixer/map_helpers.py
new file mode 100644
index 00000000000..45f27e8c92c
--- /dev/null
+++ b/tools/map_conflict_fixer/map_helpers.py
@@ -0,0 +1,687 @@
+import sys
+import subprocess
+
+tgm_header = "//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE"
+
+try:
+ version = sys.version_info
+ if version.major < 3 or (version.major == 3 and version.minor < 5):
+ print("ERROR: You are running an incompatible version of Python. The current minimum version required is [3.5].\nYour version: {}".format(sys.version))
+ sys.exit()
+except:
+ print("ERROR: Something went wrong, you might be running an incompatible version of Python. The current minimum version required is [3.5].\nYour version: {}".format(sys.version))
+ sys.exit()
+
+import collections
+
+error = {0:"OK", 1:"WARNING: Detected key length difference, not merging.", 2:"WARNING: Detected map size difference, not merging."}
+
+def merge_map(newfile, backupfile, tgm):
+ key_length = 1
+ maxx = 1
+ maxy = 1
+
+ new_map = parse_map(get_map_raw_text(newfile))
+ old_map = parse_map(get_map_raw_text(backupfile))
+
+ if new_map["key_length"] != old_map["key_length"]:
+ if tgm:
+ write_dictionary_tgm(newfile, new_map["dictionary"])
+ write_grid_coord_small(newfile, new_map["grid"])
+ return 1
+ else:
+ key_length = old_map["key_length"]
+
+ if new_map["maxx"] != old_map["maxx"] or new_map["maxy"] != old_map["maxy"]:
+ if tgm:
+ write_dictionary_tgm(newfile, new_map["dictionary"])
+ write_grid_coord_small(newfile, new_map["grid"])
+ return 2
+ else:
+ maxx = old_map["maxx"]
+ maxy = old_map["maxy"]
+
+ new_dict = new_map["dictionary"]
+ new_grid = new_map["grid"]
+ old_dict = sort_dictionary(old_map["dictionary"]) #impose order; old_dict is used in the end as the merged dictionary
+ old_grid = old_map["grid"]
+
+ merged_grid = dict()
+ known_keys = dict()
+ unused_keys = list(old_dict.keys())
+
+ #both new and old dictionary in lists, for faster key lookup by tile tuple
+ old_dict_keys = list(old_dict.keys())
+ old_dict_values = list(old_dict.values())
+ new_dict_keys = list(new_dict.keys())
+ new_dict_values = list(new_dict.values())
+
+ #step one: parse the new version, compare it to the old version, merge both
+ for y in range(1, maxy+1):
+ for x in range(1, maxx+1):
+
+ new_key = new_grid[x,y]
+ #if this key has been processed before, it can immediately be merged
+ if new_key in known_keys:
+ merged_grid[x,y] = known_keys[new_key]
+ continue
+
+ old_key = old_grid[x,y]
+ old_tile = old_dict[old_key]
+ new_tile = new_dict[new_key]
+
+ if new_tile == old_tile: #this tile is the exact same as before, so the old key is used
+ merged_grid[x,y] = old_key
+ known_keys[new_key] = old_key
+ unused_keys.remove(old_key)
+ continue
+
+ #the tile is different here, but if it exists in the old dictionary, its old key can be used
+ newold_key = get_key(old_dict_keys, old_dict_values, new_tile)
+ if newold_key != None:
+ merged_grid[x,y] = newold_key
+ known_keys[new_key] = newold_key
+ try:
+ unused_keys.remove(newold_key)
+ except ValueError:
+ print("NOTICE: Correcting duplicate dictionary entry. ({})".format(new_key))
+
+ #the tile is brand new and it needs a new key, but if the old key isn't being used any longer it can be used instead
+ elif get_key(new_dict_keys, new_dict_values, old_tile) == None:
+ merged_grid[x,y] = old_key
+ old_dict[old_key] = new_tile
+ known_keys[new_key] = old_key
+ unused_keys.remove(old_key)
+
+ #all other options ruled out, a brand new key is generated for the brand new tile
+ else:
+ fresh_key = generate_new_key(old_dict)
+ old_dict[fresh_key] = new_tile
+ merged_grid[x,y] = fresh_key
+
+## #step two: clean the dictionary if it has too many unused keys
+## if len(unused_keys) > min(100, (len(old_dict) * 0.5)):
+## print("NOTICE: Trimming the dictionary.")
+## old_dict = trim_dictionary(old_dict)
+
+ #step three: write the map to file
+ if tgm:
+ write_dictionary_tgm(newfile, old_dict)
+ write_grid_coord_small(newfile, merged_grid, maxx, maxy)
+ else:
+ write_dictionary(newfile, old_dict)
+ write_grid(newfile, merged_grid, maxx, maxy)
+ return 0
+
+#######################
+#write to file helpers#
+def write_dictionary_tgm(filename, dictionary): #write dictionary in tgm format
+ with open(filename, "w") as output:
+ output.write("{}\n".format(tgm_header))
+ for key, list_ in dictionary.items():
+ output.write("\"{}\" = (\n".format(key))
+
+ for thing in list_:
+ buffer = ""
+ in_quote_block = False
+ in_varedit_block = False
+ for char in thing:
+
+ if in_quote_block:
+ if char == "\"":
+ in_quote_block = False
+ buffer = buffer + char
+ continue
+ elif char == "\"":
+ in_quote_block = True
+ buffer = buffer + char
+ continue
+
+ if not in_varedit_block:
+ if char == "{":
+ in_varedit_block = True
+ buffer = buffer + "{\n\t"
+ continue
+ else:
+ if char == ";":
+ buffer = buffer + ";\n\t"
+ continue
+ elif char == "}":
+ buffer = buffer + "\n\t}"
+ in_varedit_block = False
+ continue
+
+ buffer = buffer + char
+
+ if list_.index(thing) != len(list_) - 1:
+ buffer = buffer + ",\n"
+ output.write(buffer)
+
+ output.write(")\n")
+
+
+def write_grid_coord_small(filename, grid, maxx, maxy): #thanks to YotaXP for finding out about this one
+ with open(filename, "a") as output:
+ output.write("\n")
+
+ for x in range(1, maxx+1):
+ output.write("({},{},1) = {{\"\n".format(x, 1, 1))
+ for y in range(1, maxy):
+ output.write("{}\n".format(grid[x,y]))
+ output.write("{}\n\"}}\n".format(grid[x,maxy]))
+
+
+def write_dictionary(filename, dictionary): #writes a tile dictionary the same way Dreammaker does
+ with open(filename, "w") as output:
+ for key, value in dictionary.items():
+ output.write("\"{}\" = ({})\n".format(key, ",".join(value)))
+
+
+def write_grid(filename, grid, maxx, maxy): #writes a map grid the same way Dreammaker does
+ with open(filename, "a") as output:
+ output.write("\n")
+ output.write("(1,1,1) = {\"\n")
+
+ for y in range(1, maxy+1):
+ for x in range(1, maxx+1):
+ try:
+ output.write(grid[x,y])
+ except KeyError:
+ print("Key error: ({},{})".format(x,y))
+ output.write("\n")
+ output.write("\"}")
+ output.write("\n")
+
+####################
+#dictionary helpers#
+def search_key(dictionary, data):
+ for key, value in dictionary.items():
+ if value == data:
+ return key
+ return None
+
+def get_key(keys, values, data):
+ try:
+ return keys[values.index(data)]
+ except:
+ return None
+
+def trim_dictionary(dictionary): #rewrites dictionary into an ordered dictionary with no unused keys
+ trimmed_dict = collections.OrderedDict()
+ key_length = len(list(dictionary.keys())[0])
+ key = ""
+ for tile in dictionary.values():
+ key = get_next_key(key, key_length)
+ trimmed_dict[key] = tile
+ return trimmed_dict
+
+def sort_dictionary(dictionary):
+ sorted_dict = collections.OrderedDict()
+ keys = list(dictionary.keys())
+ keys.sort(key=key_int_value)
+ for key in keys:
+ sorted_dict[key] = dictionary[key]
+ return sorted_dict
+
+############
+#map parser#
+def get_map_raw_text(mapfile):
+ with open(mapfile, "r") as reading:
+ return reading.read()
+
+def parse_map(map_raw_text): #still does not support more than one z level per file, but should parse any format
+ in_quote_block = False
+ in_key_block = False
+ in_data_block = False
+ in_varedit_block = False
+ after_data_block = False
+ escaping = False
+ skip_whitespace = False
+
+ dictionary = collections.OrderedDict()
+ curr_key = ""
+ curr_datum = ""
+ curr_data = list()
+
+ in_map_block = False
+ in_coord_block = False
+ in_map_string = False
+ iter_x = 0
+ adjust_y = True
+
+ curr_num = ""
+ reading_coord = "x"
+
+ key_length = 0
+
+ maxx = 0
+ maxy = 0
+
+ curr_x = 0
+ curr_y = 0
+ curr_z = 1
+ grid = dict()
+
+ for char in map_raw_text:
+
+ if not in_map_block:
+
+ if char == "\n" or char == "\t":
+ continue
+
+ if in_data_block:
+
+ if in_varedit_block:
+
+ if in_quote_block:
+ if char == "\\":
+ curr_datum = curr_datum + char
+ escaping = True
+ continue
+
+ if escaping:
+ curr_datum = curr_datum + char
+ escaping = False
+ continue
+
+ if char == "\"":
+ curr_datum = curr_datum + char
+ in_quote_block = False
+ continue
+
+ curr_datum = curr_datum + char
+ continue
+
+ if skip_whitespace and char == " ":
+ skip_whitespace = False
+ continue
+ skip_whitespace = False
+
+ if char == "\"":
+ curr_datum = curr_datum + char
+ in_quote_block = True
+ continue
+
+ if char == ";":
+ skip_whitespace = True
+ curr_datum = curr_datum + char
+ continue
+
+ if char == "}":
+ curr_datum = curr_datum + char
+ in_varedit_block = False
+ continue
+
+ curr_datum = curr_datum + char
+ continue
+
+ if char == "{":
+ curr_datum = curr_datum + char
+ in_varedit_block = True
+ continue
+
+ if char == ",":
+ curr_data.append(curr_datum)
+ curr_datum = ""
+ continue
+
+ if char == ")":
+ curr_data.append(curr_datum)
+ dictionary[curr_key] = tuple(curr_data)
+ curr_data = list()
+ curr_datum = ""
+ curr_key = ""
+ in_data_block = False
+ after_data_block = True
+ continue
+
+ curr_datum = curr_datum + char
+ continue
+
+ if in_key_block:
+ if char == "\"":
+ in_key_block = False
+ key_length = len(curr_key)
+ else:
+ curr_key = curr_key + char
+ continue
+ #else we're looking for a key block, a data block or the map block
+
+ if char == "\"":
+ in_key_block = True
+ after_data_block = False
+ continue
+
+ if char == "(":
+ if after_data_block:
+ in_map_block = True
+ in_coord_block = True
+ after_data_block = False
+ curr_key = ""
+ continue
+ else:
+ in_data_block = True
+ after_data_block = False
+ continue
+
+ else:
+
+ if in_coord_block:
+ if char == ",":
+ if reading_coord == "x":
+ curr_x = string_to_num(curr_num)
+ if curr_x > maxx:
+ maxx = curr_x
+ iter_x = 0
+ curr_num = ""
+ reading_coord = "y"
+ elif reading_coord == "y":
+ curr_y = string_to_num(curr_num)
+ if curr_y > maxy:
+ maxy = curr_y
+ curr_num = ""
+ reading_coord = "z"
+ else:
+ pass
+ continue
+
+ if char == ")":
+ in_coord_block = False
+ reading_coord = "x"
+ curr_num = ""
+ #read z here if needed
+ continue
+
+ curr_num = curr_num + char
+ continue
+
+ if in_map_string:
+
+ if char == "\"":
+ in_map_string = False
+ adjust_y = True
+ curr_y -= 1
+ continue
+
+ if char == "\n":
+ if adjust_y:
+ adjust_y = False
+ else:
+ curr_y += 1
+ if curr_x > maxx:
+ maxx = curr_x
+ if iter_x > 1:
+ curr_x = 1
+ iter_x = 0
+ continue
+
+
+ curr_key = curr_key + char
+ if len(curr_key) == key_length:
+ iter_x += 1
+ if iter_x > 1:
+ curr_x += 1
+
+ grid[curr_x, curr_y] = curr_key
+ curr_key = ""
+ continue
+
+
+ #else look for coordinate block or a map string
+
+ if char == "(":
+ in_coord_block = True
+ continue
+ if char == "\"":
+ in_map_string = True
+ continue
+
+ if curr_y > maxy:
+ maxy = curr_y
+
+ data = dict()
+ data["dictionary"] = dictionary
+ data["grid"] = grid
+ data["key_length"] = key_length
+ data["maxx"] = maxx
+ data["maxy"] = maxy
+ return data
+
+#############
+#key helpers#
+def generate_new_key(dictionary):
+ last_key = next(reversed(dictionary))
+ return get_next_key(last_key, len(last_key))
+
+def get_next_key(key, key_length):
+ if key == "":
+ return "".join("a" for _ in range(key_length))
+
+ length = len(key)
+ new_key = ""
+ carry = 1
+ for char in key[::-1]:
+ if carry <= 0:
+ new_key = new_key + char
+ continue
+ if char == 'Z':
+ new_key = new_key + 'a'
+ carry += 1
+ length -= 1
+ if length <= 0:
+ return "OVERFLOW"
+ elif char == 'z':
+ new_key = new_key + 'A'
+ else:
+ new_key = new_key + chr(ord(char) + 1)
+ if carry > 0:
+ carry -= 1
+ return new_key[::-1]
+
+def key_int_value(key):
+ value = 0
+ b = 0
+ for digit in reversed(key):
+ value += base52.index(digit) * (52 ** b)
+ b += 1
+ return value
+
+def key_compare(keyA, keyB): #thanks byond for not respecting ascii
+ pos = 0
+ for a in keyA:
+ pos += 1
+ count = pos
+ for b in keyB:
+ if(count > 1):
+ count -= 1
+ continue
+ if a.islower() and b.islower():
+ if(a < b):
+ return -1
+ if(a > b):
+ return 1
+ break
+ if a.islower() and b.isupper():
+ return -1
+ if a.isupper() and b.islower():
+ return 1
+ if a.isupper() and b.isupper():
+ if(a < b):
+ return -1
+ if(a > b):
+ return 1
+ break
+ return 0
+
+
+def key_difference(keyA, keyB): #subtract keyB from keyA
+ if len(keyA) != len(keyB):
+ return "you fucked up"
+
+ Ayek = keyA[::-1]
+ Byek = keyB[::-1]
+
+ result = 0
+ for i in range(0, len(keyA)):
+ base = 52**i
+ A = 26 if Ayek[i].isupper() else 0
+ B = 26 if Byek[i].isupper() else 0
+ result += ( (ord(Byek[i].lower()) + B) - (ord(Ayek[i].lower()) + A) ) * base
+ return result
+
+#############
+#other stuff#
+
+#Base 52 a-z A-Z dictionary (it's a python list) for fast conversion
+base52 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
+ 'p','q','r','s','t','u','v','w','x','y','z','A','B','C','D',
+ 'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S',
+ 'T','U','V','W','X','Y','Z']
+
+def string_to_num(s):
+ try:
+ return int(s)
+ except ValueError:
+ return -1
+
+####################
+#map conflict fixer#
+
+MAP_FIX_DICTIONARY = 0
+MAP_FIX_FULL = 1
+MAP_FIX_PRIORITY_OURS = 0
+MAP_FIX_PRIORITY_THEIRS = 1
+
+def fix_map_git_conflicts(base_map, ours_map, theirs_map, mode, marker, priority, path, tgm): #attempts to fix git map conflicts automagically
+ #mode values:
+ # 0 - Dictionary mode, only fixes dictionary conflicts and fails at coordinate conflicts
+ # 1 - Full mode, fixes dictionary conflicts and will join both versions of a coordinate and adds a marker to each conflicted coordinate
+
+ if mode == MAP_FIX_FULL and not marker:
+ print("ERROR: Full fix mode selected but a marker wasn't provided.")
+ return False
+
+ key_length = 1
+ maxx = 1
+ maxy = 1
+
+ if ours_map["key_length"] != theirs_map["key_length"] or ours_map["key_length"] != base_map["key_length"]:
+ print("ERROR: Key length is different, I am not smart enough for this yet.")
+ return False
+ else:
+ key_length = ours_map["key_length"]
+
+ if ours_map["maxx"] != theirs_map["maxx"] or ours_map["maxy"] != theirs_map["maxy"] or ours_map["maxx"] != base_map["maxx"] or ours_map["maxy"] != base_map["maxy"]:
+ print("ERROR: Map size is different, I am not smart enough for this yet.")
+ return False
+ else:
+ maxx = ours_map["maxx"]
+ maxy = ours_map["maxy"]
+
+ base_dict = base_map["dictionary"]
+ base_grid = base_map["grid"]
+ ours_dict = ours_map["dictionary"]
+ ours_grid = ours_map["grid"]
+ theirs_dict = theirs_map["dictionary"]
+ theirs_grid = theirs_map["grid"]
+
+ merged_dict = collections.OrderedDict()
+ merged_grid = dict()
+
+ new_key = generate_new_key(base_dict)
+
+ grid_conflict_counter = 0
+
+ for y in range(1, maxy+1):
+ for x in range(1, maxx+1):
+ base_key = base_grid[x,y]
+ ours_key = ours_grid[x,y]
+ theirs_key = theirs_grid[x,y]
+
+ #case 1: everything is the same
+ if base_dict[base_key] == ours_dict[ours_key] and base_dict[base_key] == theirs_dict[theirs_key]:
+ merged_dict[base_key] = base_dict[base_key]
+ merged_grid[x,y] = base_key
+ continue
+
+ #case 2: ours is unchanged, theirs is different
+ if base_dict[base_key] == ours_dict[ours_key]:
+ some_key = search_key(base_dict, theirs_dict[theirs_key])
+ if some_key != None:
+ merged_dict[some_key] = theirs_dict[theirs_key]
+ merged_grid[x,y] = some_key
+ else:
+ merged_dict[new_key] = theirs_dict[theirs_key]
+ merged_grid[x,y] = new_key
+ new_key = get_next_key(new_key, key_length)
+
+ #case 3: ours is different, theirs is unchanged
+ elif base_dict[base_key] == theirs_dict[theirs_key]:
+ some_key = search_key(base_dict, ours_dict[ours_key])
+ if some_key != None:
+ merged_dict[some_key] = ours_dict[ours_key]
+ merged_grid[x,y] = some_key
+ else:
+ merged_dict[new_key] = ours_dict[ours_key]
+ merged_grid[x,y] = new_key
+ new_key = get_next_key(new_key, key_length)
+
+ #case 4: everything is different, grid conflict
+ else:
+ if mode != MAP_FIX_FULL:
+ print("FAILED: Map fixing failed due to grid conflicts. Try fixing in full fix mode.")
+ return False
+ else:
+ combined_tile = combine_tiles(ours_dict[ours_key], theirs_dict[theirs_key], priority, marker)
+ merged_dict[new_key] = combined_tile
+ merged_grid[x,y] = new_key
+ new_key = get_next_key(new_key, key_length)
+ grid_conflict_counter += 1
+
+ merged_dict = sort_dictionary(merged_dict)
+ if tgm:
+ write_dictionary_tgm(path+".fixed.dmm", merged_dict)
+ write_grid_coord_small(path+".fixed.dmm", merged_grid, maxx, maxy)
+ else:
+ write_dictionary(path+".fixed.dmm", merged_dict)
+ write_grid(path+".fixed.dmm", merged_grid, maxx, maxy)
+ if grid_conflict_counter > 0:
+ print("Counted {} conflicts.".format(grid_conflict_counter))
+ return True
+
+def combine_tiles(tile_A, tile_B, priority, marker):
+ new_tile = list()
+ turf_atom = None
+ area_atom = None
+
+ low_tile = None
+ high_tile = None
+ if priority == MAP_FIX_PRIORITY_OURS:
+ high_tile = tile_A
+ low_tile = tile_B
+ else:
+ high_tile = tile_B
+ low_tile = tile_A
+
+ new_tile.append(marker)
+ for atom in high_tile:
+ if atom[0:5] == "/turf":
+ turf_atom = atom
+ elif atom[0:5] == "/area":
+ area_atom = atom
+ else:
+ new_tile.append(atom)
+
+ for atom in low_tile:
+ if atom[0:5] == "/turf" or atom[0:5] == "/area":
+ continue
+ else:
+ new_tile.append(atom)
+
+ new_tile.append(turf_atom)
+ new_tile.append(area_atom)
+ return tuple(new_tile)
+
+
+def run_shell_command(command):
+ return subprocess.run(command, shell=True, stdout=subprocess.PIPE, universal_newlines=True).stdout